summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Schweer <ws.seh.de>2006-05-03 12:42:25 +0000
committerWerner Schweer <ws.seh.de>2006-05-03 12:42:25 +0000
commitb125dd455e563bf098d8d59d20202985b76103a9 (patch)
tree6cb0785cba4966ed46a3a6a8891ce5098a7e151a
initial import
-rw-r--r--muse/.files,977
-rw-r--r--muse/.mops,9
-rw-r--r--muse/.qped30
-rw-r--r--muse/AUTHORS0
-rw-r--r--muse/CMakeLists.txt165
-rw-r--r--muse/COPYING340
-rw-r--r--muse/ChangeLog2405
-rw-r--r--muse/Doxyfile150
-rw-r--r--muse/Doxyfile.in150
-rw-r--r--muse/NEWS40
-rw-r--r--muse/README76
-rw-r--r--muse/Reference59
-rw-r--r--muse/SECURITY244
-rw-r--r--muse/TODO73
-rw-r--r--muse/al/CMakeLists.txt14
-rw-r--r--muse/al/al.cpp28
-rw-r--r--muse/al/al.h33
-rw-r--r--muse/al/marker.cpp86
-rw-r--r--muse/al/marker.h67
-rw-r--r--muse/al/pos.cpp581
-rw-r--r--muse/al/pos.h128
-rw-r--r--muse/al/sig.cpp407
-rw-r--r--muse/al/sig.h103
-rw-r--r--muse/al/tempo.cpp393
-rw-r--r--muse/al/tempo.h100
-rw-r--r--muse/al/xml.cpp344
-rw-r--r--muse/al/xml.h62
-rw-r--r--muse/all.h115
-rw-r--r--muse/awl/CMakeLists.txt57
-rw-r--r--muse/awl/aslider.cpp198
-rw-r--r--muse/awl/aslider.h126
-rw-r--r--muse/awl/awl.cpp27
-rw-r--r--muse/awl/awl.h30
-rw-r--r--muse/awl/awlplugin.cpp121
-rw-r--r--muse/awl/awlplugin.h259
-rw-r--r--muse/awl/checkbox.cpp36
-rw-r--r--muse/awl/checkbox.h55
-rw-r--r--muse/awl/clock.xpm24
-rw-r--r--muse/awl/combobox.cpp36
-rw-r--r--muse/awl/combobox.h55
-rw-r--r--muse/awl/fastlog.h39
-rw-r--r--muse/awl/floatentry.cpp317
-rw-r--r--muse/awl/floatentry.h112
-rw-r--r--muse/awl/knob.cpp281
-rw-r--r--muse/awl/knob.h85
-rw-r--r--muse/awl/metronom.xpm24
-rw-r--r--muse/awl/midimeter.cpp139
-rw-r--r--muse/awl/midimeter.h56
-rw-r--r--muse/awl/midimslider.cpp139
-rw-r--r--muse/awl/midimslider.h56
-rw-r--r--muse/awl/midipanentry.cpp47
-rw-r--r--muse/awl/midipanentry.h48
-rw-r--r--muse/awl/midipanknob.cpp37
-rw-r--r--muse/awl/midipanknob.h55
-rw-r--r--muse/awl/midivolentry.cpp50
-rw-r--r--muse/awl/midivolentry.h47
-rw-r--r--muse/awl/mslider.cpp220
-rw-r--r--muse/awl/mslider.h66
-rw-r--r--muse/awl/panentry.cpp35
-rw-r--r--muse/awl/panentry.h40
-rw-r--r--muse/awl/panknob.cpp38
-rw-r--r--muse/awl/panknob.h46
-rw-r--r--muse/awl/pitchedit.cpp89
-rw-r--r--muse/awl/pitchedit.h50
-rw-r--r--muse/awl/pitchlabel.cpp106
-rw-r--r--muse/awl/pitchlabel.h51
-rw-r--r--muse/awl/posedit.cpp440
-rw-r--r--muse/awl/posedit.h72
-rw-r--r--muse/awl/poslabel.cpp100
-rw-r--r--muse/awl/poslabel.h56
-rw-r--r--muse/awl/sigedit.cpp223
-rw-r--r--muse/awl/sigedit.h66
-rw-r--r--muse/awl/slider.cpp248
-rw-r--r--muse/awl/slider.h80
-rw-r--r--muse/awl/tcanvas.cpp1799
-rw-r--r--muse/awl/tcanvas.h253
-rw-r--r--muse/awl/tempoedit.cpp88
-rw-r--r--muse/awl/tempoedit.h55
-rw-r--r--muse/awl/tempolabel.cpp72
-rw-r--r--muse/awl/tempolabel.h48
-rw-r--r--muse/awl/utils.cpp48
-rw-r--r--muse/awl/utils.h29
-rw-r--r--muse/awl/volentry.cpp37
-rw-r--r--muse/awl/volentry.h41
-rw-r--r--muse/awl/volknob.cpp39
-rw-r--r--muse/awl/volknob.h46
-rw-r--r--muse/awl/volslider.cpp54
-rw-r--r--muse/awl/volslider.h52
-rw-r--r--muse/cmake/UsePkgConfig1.cmake45
-rw-r--r--muse/config.h22
-rw-r--r--muse/config.h.in22
-rw-r--r--muse/doc/README.CVS3
-rw-r--r--muse/doc/README.de69
-rw-r--r--muse/doc/README.instruments108
-rw-r--r--muse/doc/README.ladspaguis63
-rw-r--r--muse/doc/README.realtime37
-rw-r--r--muse/doc/README.shortcuts159
-rw-r--r--muse/doc/README.softsynth86
-rw-r--r--muse/doc/README.translate62
-rw-r--r--muse/doc/dimpl/dimpl.pdfbin0 -> 166457 bytes
-rw-r--r--muse/doc/dimpl/dimpl.tex773
-rw-r--r--muse/doc/man/de/man-de.tex173
-rw-r--r--muse/doc/man/en/man-en.tex302
-rw-r--r--muse/doc/man/fdl.tex510
-rw-r--r--muse/doc/man/gpl.tex318
-rw-r--r--muse/doc/man/titlelogo.jpgbin0 -> 15896 bytes
-rw-r--r--muse/files907
-rwxr-xr-xmuse/gen17
-rw-r--r--muse/grepmidi/CMakeLists.txt24
-rwxr-xr-xmuse/grepmidi/grepmidibin0 -> 17418 bytes
-rw-r--r--muse/grepmidi/grepmidi.cpp348
-rw-r--r--muse/midiplugins/filter/ctrlcombo.cpp56
-rw-r--r--muse/midiplugins/filter/ctrlcombo.h24
-rw-r--r--muse/midiplugins/filter/filter.cpp167
-rw-r--r--muse/midiplugins/filter/filter.h51
-rw-r--r--muse/midiplugins/filter/filterbase.ui269
-rw-r--r--muse/midiplugins/filter/filtergui.cpp187
-rw-r--r--muse/midiplugins/filter/filtergui.h57
-rw-r--r--muse/midiplugins/libmidiplugin/evdata.h64
-rw-r--r--muse/midiplugins/libmidiplugin/mempi.cpp81
-rw-r--r--muse/midiplugins/libmidiplugin/mempi.h97
-rw-r--r--muse/midiplugins/libmidiplugin/mpevent.cpp21
-rw-r--r--muse/midiplugins/libmidiplugin/mpevent.h104
-rw-r--r--muse/midiplugins/metronom/metronom.cpp167
-rw-r--r--muse/midiplugins/metronom/metronom.h53
-rw-r--r--muse/midiplugins/metronom/metronomgui.cpp75
-rw-r--r--muse/midiplugins/metronom/metronomgui.h36
-rw-r--r--muse/midiplugins/metronom/metronomgui.ui150
-rw-r--r--muse/midiplugins/transform/transform.cpp904
-rw-r--r--muse/midiplugins/transform/transform.h126
-rw-r--r--muse/midiplugins/transform/transform.ui616
-rw-r--r--muse/mops6
-rwxr-xr-xmuse/muse/.muse.bin.bakbin0 -> 60813719 bytes
-rw-r--r--muse/muse/CMakeLists.txt129
-rw-r--r--muse/muse/DOC59
-rw-r--r--muse/muse/aboutbox.ui413
-rw-r--r--muse/muse/appearance.cpp647
-rw-r--r--muse/muse/appearance.h73
-rw-r--r--muse/muse/appearance.ui1182
-rw-r--r--muse/muse/arranger/arranger.cpp1315
-rw-r--r--muse/muse/arranger/arranger.h149
-rw-r--r--muse/muse/arranger/canvas.cpp1045
-rw-r--r--muse/muse/arranger/canvas.h101
-rw-r--r--muse/muse/arranger/configtrack.cpp255
-rw-r--r--muse/muse/arranger/configtrack.h49
-rw-r--r--muse/muse/arranger/configtrack.ui313
-rw-r--r--muse/muse/arranger/miditrackinfo.h34
-rw-r--r--muse/muse/arranger/partdrag.cpp142
-rw-r--r--muse/muse/arranger/partdrag.h59
-rw-r--r--muse/muse/arranger/selectfilter.h39
-rw-r--r--muse/muse/arranger/tllineedit.cpp58
-rw-r--r--muse/muse/arranger/tllineedit.h36
-rw-r--r--muse/muse/arranger/tlswidget.cpp376
-rw-r--r--muse/muse/arranger/tlswidget.h77
-rw-r--r--muse/muse/arranger/tlwidget.cpp621
-rw-r--r--muse/muse/arranger/tlwidget.h93
-rw-r--r--muse/muse/arranger/tlwlayout.cpp123
-rw-r--r--muse/muse/arranger/tlwlayout.h39
-rw-r--r--muse/muse/arranger/trackdrag.cpp49
-rw-r--r--muse/muse/arranger/trackdrag.h30
-rw-r--r--muse/muse/arranger/trackinfo.cpp717
-rw-r--r--muse/muse/arranger/trackinfo.h214
-rw-r--r--muse/muse/arranger/trelement.h52
-rw-r--r--muse/muse/audio.cpp735
-rw-r--r--muse/muse/audio.h289
-rw-r--r--muse/muse/audioaux.cpp115
-rw-r--r--muse/muse/audioaux.h50
-rw-r--r--muse/muse/audiogroup.cpp47
-rw-r--r--muse/muse/audiogroup.h46
-rw-r--r--muse/muse/audioinput.cpp188
-rw-r--r--muse/muse/audioinput.h59
-rw-r--r--muse/muse/audiooutput.cpp222
-rw-r--r--muse/muse/audiooutput.h68
-rw-r--r--muse/muse/audioprefetch.cpp201
-rw-r--r--muse/muse/audioprefetch.h54
-rw-r--r--muse/muse/audiotrack.cpp565
-rw-r--r--muse/muse/audiotrack.h94
-rw-r--r--muse/muse/audiowriteback.cpp98
-rw-r--r--muse/muse/audiowriteback.h44
-rw-r--r--muse/muse/bench4
-rw-r--r--muse/muse/cliplist/cliplist.cpp251
-rw-r--r--muse/muse/cliplist/cliplist.h47
-rw-r--r--muse/muse/cobject.cpp55
-rw-r--r--muse/muse/cobject.h46
-rw-r--r--muse/muse/conf.cpp716
-rw-r--r--muse/muse/conf.h46
-rw-r--r--muse/muse/configmidifile.ui153
-rw-r--r--muse/muse/ctrl.cpp399
-rw-r--r--muse/muse/ctrl.h221
-rw-r--r--muse/muse/ctrl/CMakeLists.txt35
-rw-r--r--muse/muse/ctrl/configmidictrl.cpp183
-rw-r--r--muse/muse/ctrl/configmidictrl.h38
-rw-r--r--muse/muse/ctrl/configmidictrl.ui228
-rw-r--r--muse/muse/ctrl/ctrleditor.cpp412
-rw-r--r--muse/muse/ctrl/ctrleditor.h52
-rw-r--r--muse/muse/debug.h44
-rw-r--r--muse/muse/default_click.h1213
-rw-r--r--muse/muse/device.h56
-rw-r--r--muse/muse/driver/CMakeLists.txt15
-rw-r--r--muse/muse/driver/alsamidi.cpp698
-rw-r--r--muse/muse/driver/alsamidi.h62
-rw-r--r--muse/muse/driver/alsatimer.cpp188
-rw-r--r--muse/muse/driver/alsatimer.h46
-rw-r--r--muse/muse/driver/audiodev.h42
-rw-r--r--muse/muse/driver/driver.h47
-rw-r--r--muse/muse/driver/dummyaudio.cpp269
-rw-r--r--muse/muse/driver/jack.cpp754
-rw-r--r--muse/muse/driver/jackaudio.h70
-rw-r--r--muse/muse/driver/posixtimer.cpp179
-rw-r--r--muse/muse/driver/posixtimer.h39
-rw-r--r--muse/muse/driver/rtctimer.cpp190
-rw-r--r--muse/muse/driver/rtctimer.h39
-rw-r--r--muse/muse/driver/timerdev.h39
-rw-r--r--muse/muse/dssihost.cpp863
-rw-r--r--muse/muse/dssihost.h129
-rw-r--r--muse/muse/editor.cpp38
-rw-r--r--muse/muse/editor.h44
-rw-r--r--muse/muse/esettings.cpp773
-rw-r--r--muse/muse/esettings.h361
-rw-r--r--muse/muse/evdata.h76
-rw-r--r--muse/muse/event.cpp198
-rw-r--r--muse/muse/event.h146
-rw-r--r--muse/muse/eventbase.h94
-rw-r--r--muse/muse/eventlist.cpp93
-rw-r--r--muse/muse/exportmidi.cpp379
-rw-r--r--muse/muse/exportmidi.h41
-rw-r--r--muse/muse/exportmididialog.ui176
-rw-r--r--muse/muse/extmidieditor.cpp422
-rw-r--r--muse/muse/extmidieditor.h120
-rw-r--r--muse/muse/fastlog.h38
-rw-r--r--muse/muse/fifo.cpp223
-rw-r--r--muse/muse/fifo.h93
-rw-r--r--muse/muse/gconfig.cpp139
-rw-r--r--muse/muse/gconfig.h127
-rw-r--r--muse/muse/genset.cpp475
-rw-r--r--muse/muse/genset.h56
-rw-r--r--muse/muse/genset.ui1320
-rw-r--r--muse/muse/globaldefs.h39
-rw-r--r--muse/muse/globals.cpp147
-rw-r--r--muse/muse/globals.h101
-rw-r--r--muse/muse/gui.h49
-rw-r--r--muse/muse/help.cpp112
-rw-r--r--muse/muse/help.h38
-rw-r--r--muse/muse/helper.cpp47
-rw-r--r--muse/muse/helper.h27
-rw-r--r--muse/muse/icons.cpp555
-rw-r--r--muse/muse/icons.h204
-rw-r--r--muse/muse/importmidi.cpp437
-rw-r--r--muse/muse/instruments/CMakeLists.txt46
-rw-r--r--muse/muse/instruments/editinstrument.cpp119
-rw-r--r--muse/muse/instruments/editinstrument.h35
-rw-r--r--muse/muse/instruments/editinstrument.ui756
-rw-r--r--muse/muse/instruments/midictrledit.cpp407
-rw-r--r--muse/muse/instruments/midictrledit.h46
-rw-r--r--muse/muse/instruments/minstrument.cpp482
-rw-r--r--muse/muse/instruments/minstrument.h125
-rw-r--r--muse/muse/ladspa.h599
-rw-r--r--muse/muse/liste/CMakeLists.txt46
-rw-r--r--muse/muse/liste/editctrlbase.ui288
-rw-r--r--muse/muse/liste/editevent.cpp544
-rw-r--r--muse/muse/liste/editevent.h152
-rw-r--r--muse/muse/liste/editnotedialog.ui150
-rw-r--r--muse/muse/liste/listedit.cpp1315
-rw-r--r--muse/muse/liste/listedit.h214
-rw-r--r--muse/muse/marker/CMakeLists.txt45
-rw-r--r--muse/muse/marker/markerview.cpp391
-rw-r--r--muse/muse/marker/markerview.h84
-rw-r--r--muse/muse/master/CMakeLists.txt37
-rw-r--r--muse/muse/master/master.cpp220
-rw-r--r--muse/muse/master/master.h50
-rw-r--r--muse/muse/master/masteredit.cpp287
-rw-r--r--muse/muse/master/masteredit.h94
-rw-r--r--muse/muse/midi.cpp779
-rw-r--r--muse/muse/midi.h60
-rw-r--r--muse/muse/midictrl.cpp323
-rw-r--r--muse/muse/midictrl.h160
-rw-r--r--muse/muse/midiedit/.Ped-tkbin0 -> 1444 bytes
-rw-r--r--muse/muse/midiedit/citem.cpp69
-rw-r--r--muse/muse/midiedit/citem.h56
-rw-r--r--muse/muse/midiedit/cmd.h19
-rw-r--r--muse/muse/midiedit/ctrledit.cpp142
-rw-r--r--muse/muse/midiedit/ctrledit.h64
-rw-r--r--muse/muse/midiedit/dcanvas.cpp718
-rw-r--r--muse/muse/midiedit/dcanvas.h71
-rw-r--r--muse/muse/midiedit/drumedit.cpp496
-rw-r--r--muse/muse/midiedit/drumedit.h84
-rw-r--r--muse/muse/midiedit/drummap.cpp194
-rw-r--r--muse/muse/midiedit/drummap.h68
-rw-r--r--muse/muse/midiedit/ecanvas.cpp1546
-rw-r--r--muse/muse/midiedit/ecanvas.h157
-rw-r--r--muse/muse/midiedit/midieditor.cpp439
-rw-r--r--muse/muse/midiedit/midieditor.h133
-rw-r--r--muse/muse/midiedit/pianoroll.cpp644
-rw-r--r--muse/muse/midiedit/pianoroll.h120
-rw-r--r--muse/muse/midiedit/prcanvas.cpp841
-rw-r--r--muse/muse/midiedit/prcanvas.h72
-rw-r--r--muse/muse/midiedit/quantconfig.cpp56
-rw-r--r--muse/muse/midiedit/quantconfig.h30
-rw-r--r--muse/muse/midiedit/quantconfig.ui151
-rw-r--r--muse/muse/midievent.cpp163
-rw-r--r--muse/muse/midievent.h73
-rw-r--r--muse/muse/midififo.cpp61
-rw-r--r--muse/muse/midififo.h47
-rw-r--r--muse/muse/midifile.cpp678
-rw-r--r--muse/muse/midifile.h121
-rw-r--r--muse/muse/midiplugin.cpp628
-rw-r--r--muse/muse/midiplugin.h170
-rw-r--r--muse/muse/midiport.cpp815
-rw-r--r--muse/muse/midiport.h25
-rw-r--r--muse/muse/midirc.cpp180
-rw-r--r--muse/muse/midirc.h65
-rw-r--r--muse/muse/midiseq.cpp549
-rw-r--r--muse/muse/midiseq.h98
-rw-r--r--muse/muse/midisynti.cpp237
-rw-r--r--muse/muse/midisynti.h61
-rw-r--r--muse/muse/miditrack.cpp615
-rw-r--r--muse/muse/miditrack.h95
-rw-r--r--muse/muse/miditransform.cpp1534
-rw-r--r--muse/muse/miditransform.h113
-rw-r--r--muse/muse/mixer/astrip.cpp1036
-rw-r--r--muse/muse/mixer/astrip.h98
-rw-r--r--muse/muse/mixer/midirack.cpp194
-rw-r--r--muse/muse/mixer/midirack.h34
-rw-r--r--muse/muse/mixer/mixer.cpp425
-rw-r--r--muse/muse/mixer/mixer.h86
-rw-r--r--muse/muse/mixer/mstrip.cpp1700
-rw-r--r--muse/muse/mixer/mstrip.h204
-rw-r--r--muse/muse/mixer/rack.cpp404
-rw-r--r--muse/muse/mixer/rack.h49
-rw-r--r--muse/muse/mixer/routedialog.cpp184
-rw-r--r--muse/muse/mixer/routedialog.h41
-rw-r--r--muse/muse/mixer/routedialog.ui170
-rw-r--r--muse/muse/mixer/strip.cpp119
-rw-r--r--muse/muse/mixer/strip.h57
-rw-r--r--muse/muse/mpevent.cpp122
-rw-r--r--muse/muse/mpevent.h118
-rw-r--r--muse/muse/mtc.cpp131
-rw-r--r--muse/muse/mtc.h68
-rw-r--r--muse/muse/muse.cpp3048
-rw-r--r--muse/muse/muse.h308
-rw-r--r--muse/muse/muse.qrc19
-rw-r--r--muse/muse/muse.ui87
-rw-r--r--muse/muse/part.cpp551
-rw-r--r--muse/muse/part.h147
-rw-r--r--muse/muse/plugin.cpp875
-rw-r--r--muse/muse/plugin.h341
-rw-r--r--muse/muse/plugingui.cpp767
-rw-r--r--muse/muse/plugingui.h122
-rw-r--r--muse/muse/qrc_muse.cxx3836
-rw-r--r--muse/muse/route.cpp504
-rw-r--r--muse/muse/route.h77
-rwxr-xr-xmuse/muse/runmuse3
-rw-r--r--muse/muse/seqmsg.cpp684
-rw-r--r--muse/muse/shortcuts.cpp461
-rw-r--r--muse/muse/shortcuts.h308
-rw-r--r--muse/muse/song.cpp2355
-rw-r--r--muse/muse/song.h399
-rw-r--r--muse/muse/songfile.cpp427
-rw-r--r--muse/muse/sync.cpp488
-rw-r--r--muse/muse/sync.h41
-rw-r--r--muse/muse/synth.cpp548
-rw-r--r--muse/muse/synth.h217
-rw-r--r--muse/muse/thread.cpp349
-rw-r--r--muse/muse/thread.h109
-rw-r--r--muse/muse/ticksynth.cpp181
-rw-r--r--muse/muse/ticksynth.h29
-rw-r--r--muse/muse/track.cpp971
-rw-r--r--muse/muse/track.h604
-rw-r--r--muse/muse/transport.cpp411
-rw-r--r--muse/muse/transport.h74
-rw-r--r--muse/muse/transport.ui856
-rw-r--r--muse/muse/transpose.cpp92
-rw-r--r--muse/muse/transpose.h40
-rw-r--r--muse/muse/transpose.ui193
-rw-r--r--muse/muse/undo.cpp550
-rw-r--r--muse/muse/undo.h108
-rw-r--r--muse/muse/value.cpp73
-rwxr-xr-xmuse/muse/vg4
-rw-r--r--muse/muse/vst.cpp1057
-rw-r--r--muse/muse/vst.h172
-rw-r--r--muse/muse/wave.cpp869
-rw-r--r--muse/muse/wave.h160
-rw-r--r--muse/muse/waveedit/waveedit.cpp213
-rw-r--r--muse/muse/waveedit/waveedit.h65
-rw-r--r--muse/muse/waveedit/waveview.cpp799
-rw-r--r--muse/muse/waveedit/waveview.h89
-rw-r--r--muse/muse/waveevent.cpp133
-rw-r--r--muse/muse/waveevent.h59
-rw-r--r--muse/muse/wavetrack.cpp414
-rw-r--r--muse/muse/wavetrack.h84
-rw-r--r--muse/muse/widgets/.Ped-tkbin0 -> 4000 bytes
-rw-r--r--muse/muse/widgets/CMakeLists.txt85
-rw-r--r--muse/muse/widgets/action.h29
-rw-r--r--muse/muse/widgets/bigtime.cpp247
-rw-r--r--muse/muse/widgets/bigtime.h44
-rw-r--r--muse/muse/widgets/cliplisteditorbase.h138
-rw-r--r--muse/muse/widgets/cliplisteditorbase.ui146
-rw-r--r--muse/muse/widgets/comboQuant.cpp56
-rw-r--r--muse/muse/widgets/comboQuant.h30
-rw-r--r--muse/muse/widgets/combobox.cpp68
-rw-r--r--muse/muse/widgets/combobox.h44
-rw-r--r--muse/muse/widgets/comment.cpp78
-rw-r--r--muse/muse/widgets/comment.h56
-rw-r--r--muse/muse/widgets/comment.ui97
-rw-r--r--muse/muse/widgets/ctrlcombo.cpp56
-rw-r--r--muse/muse/widgets/ctrlcombo.h20
-rw-r--r--muse/muse/widgets/dentry.cpp195
-rw-r--r--muse/muse/widgets/dentry.h66
-rw-r--r--muse/muse/widgets/doublelabel.cpp131
-rw-r--r--muse/muse/widgets/doublelabel.h55
-rw-r--r--muse/muse/widgets/editmetadialogbase.cpp110
-rw-r--r--muse/muse/widgets/editmetadialogbase.ui137
-rw-r--r--muse/muse/widgets/editsysexdialogbase.h203
-rw-r--r--muse/muse/widgets/editsysexdialogbase.ui236
-rw-r--r--muse/muse/widgets/fdialogbuttons.ui167
-rw-r--r--muse/muse/widgets/fdialogbuttons1.h0
-rw-r--r--muse/muse/widgets/filedialog.cpp180
-rw-r--r--muse/muse/widgets/filedialog.h52
-rw-r--r--muse/muse/widgets/floatlabel.cpp131
-rw-r--r--muse/muse/widgets/floatlabel.h55
-rw-r--r--muse/muse/widgets/fontsel.cpp125
-rw-r--r--muse/muse/widgets/fontsel.h44
-rw-r--r--muse/muse/widgets/gatetime.cpp52
-rw-r--r--muse/muse/widgets/gatetime.h37
-rw-r--r--muse/muse/widgets/gatetime.ui210
-rw-r--r--muse/muse/widgets/greendotbutton.h25
-rw-r--r--muse/muse/widgets/intlabel.h43
-rw-r--r--muse/muse/widgets/menutitle.cpp38
-rw-r--r--muse/muse/widgets/menutitle.h29
-rw-r--r--muse/muse/widgets/midisync.cpp116
-rw-r--r--muse/muse/widgets/midisync.h37
-rw-r--r--muse/muse/widgets/midisync.ui711
-rw-r--r--muse/muse/widgets/mittransposebase.h111
-rw-r--r--muse/muse/widgets/mittransposebase.ui112
-rw-r--r--muse/muse/widgets/mixdowndialog.cpp107
-rw-r--r--muse/muse/widgets/mixdowndialog.h35
-rw-r--r--muse/muse/widgets/mixdowndialog.ui214
-rw-r--r--muse/muse/widgets/mtrackinfobase.ui661
-rw-r--r--muse/muse/widgets/noteinfo.cpp194
-rw-r--r--muse/muse/widgets/noteinfo.h55
-rw-r--r--muse/muse/widgets/outportcombo.cpp39
-rw-r--r--muse/muse/widgets/outportcombo.h26
-rw-r--r--muse/muse/widgets/quantcombo.cpp67
-rw-r--r--muse/muse/widgets/quantcombo.h33
-rw-r--r--muse/muse/widgets/rastercombo.cpp69
-rw-r--r--muse/muse/widgets/rastercombo.h33
-rw-r--r--muse/muse/widgets/recordbutton.h25
-rw-r--r--muse/muse/widgets/shortcutcapturedialog.cpp88
-rw-r--r--muse/muse/widgets/shortcutcapturedialog.h33
-rw-r--r--muse/muse/widgets/shortcutcapturedialog.ui125
-rw-r--r--muse/muse/widgets/shortcutconfig.cpp118
-rw-r--r--muse/muse/widgets/shortcutconfig.h49
-rw-r--r--muse/muse/widgets/shortcutconfig.ui202
-rw-r--r--muse/muse/widgets/siglabel.cpp152
-rw-r--r--muse/muse/widgets/siglabel.h37
-rw-r--r--muse/muse/widgets/simplebutton.cpp37
-rw-r--r--muse/muse/widgets/simplebutton.h28
-rw-r--r--muse/muse/widgets/splitter.cpp94
-rw-r--r--muse/muse/widgets/splitter.h49
-rw-r--r--muse/muse/widgets/stutk9Nz0
-rw-r--r--muse/muse/widgets/synthwizardbase.h58
-rw-r--r--muse/muse/widgets/tb1.cpp167
-rw-r--r--muse/muse/widgets/tb1.h58
-rw-r--r--muse/muse/widgets/tools.cpp119
-rw-r--r--muse/muse/widgets/tools.h49
-rw-r--r--muse/muse/widgets/transformbase.ui993
-rw-r--r--muse/muse/widgets/utils.cpp384
-rw-r--r--muse/muse/widgets/utils.h42
-rw-r--r--muse/muse/widgets/velocity.cpp52
-rw-r--r--muse/muse/widgets/velocity.h37
-rw-r--r--muse/muse/widgets/velocity.ui211
-rw-r--r--muse/muse/widgets/wtrackinfobase.ui166
-rw-r--r--muse/muse/xpm/addtrack_addmiditrack.xpm26
-rw-r--r--muse/muse/xpm/addtrack_audiogroup.xpm35
-rw-r--r--muse/muse/xpm/addtrack_audioinput.xpm33
-rw-r--r--muse/muse/xpm/addtrack_audiooutput.xpm44
-rw-r--r--muse/muse/xpm/addtrack_auxsend.xpm28
-rw-r--r--muse/muse/xpm/addtrack_drumtrack.xpm41
-rw-r--r--muse/muse/xpm/addtrack_wavetrack.xpm36
-rw-r--r--muse/muse/xpm/audio_bounce_to_file.xpm24
-rw-r--r--muse/muse/xpm/audio_bounce_to_track.xpm27
-rw-r--r--muse/muse/xpm/audio_restartaudio.xpm69
-rw-r--r--muse/muse/xpm/automation_clear_data.xpm22
-rw-r--r--muse/muse/xpm/automation_mixer.xpm35
-rw-r--r--muse/muse/xpm/automation_take_snapshot.xpm144
-rw-r--r--muse/muse/xpm/back.xpm27
-rw-r--r--muse/muse/xpm/bluedot.xpm34
-rw-r--r--muse/muse/xpm/bold.xpm16
-rw-r--r--muse/muse/xpm/bouncetofile.xpm25
-rw-r--r--muse/muse/xpm/buttondown.xpm27
-rw-r--r--muse/muse/xpm/cafter.xpm29
-rw-r--r--muse/muse/xpm/cliplistS.xpm28
-rw-r--r--muse/muse/xpm/cmark.xpm23
-rw-r--r--muse/muse/xpm/config.xpm36
-rw-r--r--muse/muse/xpm/configure.xpm36
-rw-r--r--muse/muse/xpm/context_help.xpm32
-rw-r--r--muse/muse/xpm/ctrl.xpm27
-rw-r--r--muse/muse/xpm/cut.xpm29
-rw-r--r--muse/muse/xpm/darkgreendot.xpm19
-rw-r--r--muse/muse/xpm/darkreddot.xpm17
-rw-r--r--muse/muse/xpm/delete.xpm27
-rw-r--r--muse/muse/xpm/dot.xpm22
-rw-r--r--muse/muse/xpm/dot1.xpm22
-rw-r--r--muse/muse/xpm/doth.xpm22
-rw-r--r--muse/muse/xpm/down.xpm15
-rw-r--r--muse/muse/xpm/draw.xpm25
-rw-r--r--muse/muse/xpm/drumS.xpm30
-rw-r--r--muse/muse/xpm/edit_drumms.xpm45
-rw-r--r--muse/muse/xpm/edit_list.xpm31
-rw-r--r--muse/muse/xpm/edit_mastertrack.xpm38
-rw-r--r--muse/muse/xpm/edit_midi.xpm26
-rw-r--r--muse/muse/xpm/edit_pianoroll.xpm28
-rw-r--r--muse/muse/xpm/edit_score.xpm24
-rw-r--r--muse/muse/xpm/edit_track_add.xpm24
-rw-r--r--muse/muse/xpm/edit_track_del.xpm25
-rw-r--r--muse/muse/xpm/editcopy.xpm102
-rw-r--r--muse/muse/xpm/editcopyS.xpm26
-rw-r--r--muse/muse/xpm/editcut.xpm33
-rw-r--r--muse/muse/xpm/editcutS.xpm24
-rw-r--r--muse/muse/xpm/editmute.xpm33
-rw-r--r--muse/muse/xpm/editmuteS.xpm63
-rw-r--r--muse/muse/xpm/editpaste.xpm210
-rw-r--r--muse/muse/xpm/editpasteS.xpm27
-rw-r--r--muse/muse/xpm/exit.xpm29
-rw-r--r--muse/muse/xpm/exit1.xpm29
-rw-r--r--muse/muse/xpm/exitS.xpm25
-rw-r--r--muse/muse/xpm/fforward.xpm17
-rw-r--r--muse/muse/xpm/filenew.pngbin0 -> 575 bytes
-rw-r--r--muse/muse/xpm/filenewS.xpm29
-rw-r--r--muse/muse/xpm/fileopen.pngbin0 -> 887 bytes
-rw-r--r--muse/muse/xpm/fileopenS.xpm26
-rw-r--r--muse/muse/xpm/fileprint.xpm102
-rw-r--r--muse/muse/xpm/fileprintS.xpm26
-rw-r--r--muse/muse/xpm/filesave.pngbin0 -> 762 bytes
-rw-r--r--muse/muse/xpm/filesaveS.xpm28
-rw-r--r--muse/muse/xpm/filesaveasS.xpm27
-rw-r--r--muse/muse/xpm/find.xpm28
-rw-r--r--muse/muse/xpm/flag.xpm28
-rw-r--r--muse/muse/xpm/flagS.xpm19
-rw-r--r--muse/muse/xpm/forward.xpm28
-rw-r--r--muse/muse/xpm/frewind.xpm17
-rw-r--r--muse/muse/xpm/glue.xpm49
-rw-r--r--muse/muse/xpm/graydot.xpm21
-rw-r--r--muse/muse/xpm/greendot.xpm18
-rw-r--r--muse/muse/xpm/gv.xpm23
-rw-r--r--muse/muse/xpm/home.xpm27
-rw-r--r--muse/muse/xpm/idea.xpm35
-rw-r--r--muse/muse/xpm/iiwusynth.xpm1372
-rw-r--r--muse/muse/xpm/initS.xpm23
-rw-r--r--muse/muse/xpm/inputpluginS.xpm22
-rw-r--r--muse/muse/xpm/italic.xpm16
-rw-r--r--muse/muse/xpm/listS.xpm26
-rw-r--r--muse/muse/xpm/lmark.xpm23
-rw-r--r--muse/muse/xpm/localoffS.xpm22
-rw-r--r--muse/muse/xpm/lock.xpm86
-rw-r--r--muse/muse/xpm/loop.xpm23
-rw-r--r--muse/muse/xpm/loop1.xpm39
-rw-r--r--muse/muse/xpm/master.xpm15
-rw-r--r--muse/muse/xpm/mastertrackS.xpm25
-rw-r--r--muse/muse/xpm/mastertrack_graphic.xpm28
-rw-r--r--muse/muse/xpm/mastertrack_list.xpm27
-rw-r--r--muse/muse/xpm/meta.xpm27
-rw-r--r--muse/muse/xpm/midi_edit_instrument.xpm27
-rw-r--r--muse/muse/xpm/midi_init_instr.xpm28
-rw-r--r--muse/muse/xpm/midi_inputplugins.xpm33
-rw-r--r--muse/muse/xpm/midi_inputplugins_midi_input_filter.xpm98
-rw-r--r--muse/muse/xpm/midi_inputplugins_midi_input_transform.xpm31
-rw-r--r--muse/muse/xpm/midi_inputplugins_random_rhythm_generator.xpm67
-rw-r--r--muse/muse/xpm/midi_inputplugins_remote_control.xpm64
-rw-r--r--muse/muse/xpm/midi_inputplugins_transpose.xpm30
-rw-r--r--muse/muse/xpm/midi_local_off.xpm105
-rw-r--r--muse/muse/xpm/midi_plugS.xpm22
-rw-r--r--muse/muse/xpm/midi_reset_instr.xpm55
-rw-r--r--muse/muse/xpm/midi_transform.xpm30
-rw-r--r--muse/muse/xpm/midi_transpose.xpm31
-rw-r--r--muse/muse/xpm/midiin.xpm23
-rw-r--r--muse/muse/xpm/miditransformS.xpm22
-rw-r--r--muse/muse/xpm/miditransposeS.xpm25
-rw-r--r--muse/muse/xpm/minus.xpm24
-rw-r--r--muse/muse/xpm/mixerS.xpm21
-rw-r--r--muse/muse/xpm/mixeraudioS.xpm22
-rw-r--r--muse/muse/xpm/mono.xpm16
-rw-r--r--muse/muse/xpm/muse_icon.xpm411
-rw-r--r--muse/muse/xpm/muse_icon_64x64.pngbin0 -> 7493 bytes
-rw-r--r--muse/muse/xpm/mustangS.xpm23
-rw-r--r--muse/muse/xpm/mute.xpm18
-rw-r--r--muse/muse/xpm/mutebutton_off.xpm165
-rw-r--r--muse/muse/xpm/mutebutton_on.xpm352
-rw-r--r--muse/muse/xpm/newmutebutton.xpm69
-rw-r--r--muse/muse/xpm/note.xpm23
-rw-r--r--muse/muse/xpm/note1.xpm28
-rw-r--r--muse/muse/xpm/off.xpm25
-rw-r--r--muse/muse/xpm/pafter.xpm29
-rw-r--r--muse/muse/xpm/panic.xpm50
-rw-r--r--muse/muse/xpm/pencil.xpm27
-rw-r--r--muse/muse/xpm/piano.xpm170
-rw-r--r--muse/muse/xpm/pianoS.xpm24
-rw-r--r--muse/muse/xpm/pitch.xpm28
-rw-r--r--muse/muse/xpm/play.xpm17
-rw-r--r--muse/muse/xpm/plus.xpm21
-rw-r--r--muse/muse/xpm/pointer.xpm28
-rw-r--r--muse/muse/xpm/punchin.xpm27
-rw-r--r--muse/muse/xpm/punchin1.xpm18
-rw-r--r--muse/muse/xpm/punchout.xpm24
-rw-r--r--muse/muse/xpm/punchout1.xpm18
-rw-r--r--muse/muse/xpm/quant.xpm28
-rw-r--r--muse/muse/xpm/record.xpm160
-rw-r--r--muse/muse/xpm/record1.xpm21
-rw-r--r--muse/muse/xpm/record_off.xpm150
-rw-r--r--muse/muse/xpm/record_on.xpm160
-rw-r--r--muse/muse/xpm/reddot.xpm17
-rw-r--r--muse/muse/xpm/redo.xpm92
-rw-r--r--muse/muse/xpm/redoS.xpm25
-rw-r--r--muse/muse/xpm/resetS.xpm22
-rw-r--r--muse/muse/xpm/rmark.xpm23
-rw-r--r--muse/muse/xpm/score.xpm170
-rw-r--r--muse/muse/xpm/scoreS.xpm23
-rw-r--r--muse/muse/xpm/select.xpm21
-rw-r--r--muse/muse/xpm/select_all.xpm21
-rw-r--r--muse/muse/xpm/select_all_parts_on_track.xpm39
-rw-r--r--muse/muse/xpm/select_deselect_all.xpm22
-rw-r--r--muse/muse/xpm/select_inside_loop.xpm21
-rw-r--r--muse/muse/xpm/select_invert_selection.xpm21
-rw-r--r--muse/muse/xpm/select_outside_loop.xpm21
-rw-r--r--muse/muse/xpm/settings_appearance_settings.xpm66
-rw-r--r--muse/muse/xpm/settings_configureshortcuts.xpm36
-rw-r--r--muse/muse/xpm/settings_follow_song.xpm30
-rw-r--r--muse/muse/xpm/settings_globalsettings.xpm89
-rw-r--r--muse/muse/xpm/settings_metronome.xpm99
-rw-r--r--muse/muse/xpm/settings_midifileexport.xpm30
-rw-r--r--muse/muse/xpm/settings_midiport_softsynths.xpm29
-rw-r--r--muse/muse/xpm/settings_midisync.xpm53
-rw-r--r--muse/muse/xpm/solobutton.xpm39
-rw-r--r--muse/muse/xpm/solobutton_off.xpm146
-rw-r--r--muse/muse/xpm/solobutton_on.xpm300
-rw-r--r--muse/muse/xpm/speaker.xpm23
-rw-r--r--muse/muse/xpm/splash.pngbin0 -> 45374 bytes
-rw-r--r--muse/muse/xpm/start.xpm17
-rw-r--r--muse/muse/xpm/steprec.xpm24
-rw-r--r--muse/muse/xpm/stereo.xpm14
-rw-r--r--muse/muse/xpm/stick.xpm33
-rw-r--r--muse/muse/xpm/stop.xpm17
-rw-r--r--muse/muse/xpm/sysex.xpm27
-rw-r--r--muse/muse/xpm/toc.xpm27
-rw-r--r--muse/muse/xpm/track_add.xpm23
-rw-r--r--muse/muse/xpm/track_delete.xpm23
-rw-r--r--muse/muse/xpm/underlined.xpm16
-rw-r--r--muse/muse/xpm/undo.xpm93
-rw-r--r--muse/muse/xpm/undoS.xpm25
-rw-r--r--muse/muse/xpm/up.xpm15
-rw-r--r--muse/muse/xpm/view_bigtime_window.xpm22
-rw-r--r--muse/muse/xpm/view_cliplist.xpm32
-rw-r--r--muse/muse/xpm/view_marker.xpm37
-rw-r--r--muse/muse/xpm/view_mixer.xpm26
-rw-r--r--muse/muse/xpm/view_transport_window.xpm24
-rw-r--r--muse/muse/xpm/wave.xpm33
-rw-r--r--muse/packaging/muse_icon.pngbin0 -> 7493 bytes
-rwxr-xr-xmuse/packaging/muse_mdk.spec274
-rw-r--r--muse/plugins/CMakeLists.txt22
-rw-r--r--muse/plugins/freeverb/CMakeLists.txt32
-rw-r--r--muse/plugins/freeverb/allpass.h50
-rw-r--r--muse/plugins/freeverb/comb.h66
-rw-r--r--muse/plugins/freeverb/denormals.h28
-rw-r--r--muse/plugins/freeverb/freeverb.cpp166
-rw-r--r--muse/plugins/freeverb/readme.txt147
-rw-r--r--muse/plugins/freeverb/revmodel.cpp232
-rw-r--r--muse/plugins/freeverb/revmodel.h79
-rw-r--r--muse/plugins/freeverb/tuning.h60
-rw-r--r--muse/share/CMakeLists.txt22
-rw-r--r--muse/share/html/CMakeLists.txt24
-rw-r--r--muse/share/html/COPYING.html353
-rw-r--r--muse/share/html/button_bar.jpgbin0 -> 13115 bytes
-rw-r--r--muse/share/html/getting_started.html89
-rw-r--r--muse/share/html/index.html62
-rw-r--r--muse/share/html/installation.html64
-rw-r--r--muse/share/html/invocation.html54
-rw-r--r--muse/share/html/left_pane.jpgbin0 -> 24599 bytes
-rw-r--r--muse/share/html/main_window.jpgbin0 -> 75510 bytes
-rw-r--r--muse/share/html/main_window_track_info.jpgbin0 -> 84636 bytes
-rw-r--r--muse/share/html/right_pane.jpgbin0 -> 34158 bytes
-rw-r--r--muse/share/html/styles.css85
-rw-r--r--muse/share/html/toc_.txt13
-rw-r--r--muse/share/html/track_info.jpgbin0 -> 14003 bytes
-rw-r--r--muse/share/html/window_ref.html180
-rw-r--r--muse/share/instruments/Access_Virus.idf1045
-rw-r--r--muse/share/instruments/Alesis-Ion.idf731
-rw-r--r--muse/share/instruments/Alesis-QS-78R.idf700
-rw-r--r--muse/share/instruments/AlesisQS6.idf658
-rw-r--r--muse/share/instruments/CMakeLists.txt22
-rw-r--r--muse/share/instruments/Hammond_XB-1.idf88
-rw-r--r--muse/share/instruments/MC303.idf528
-rw-r--r--muse/share/instruments/MC505.idf560
-rw-r--r--muse/share/instruments/Quasimidi-Sirius.idf735
-rw-r--r--muse/share/instruments/Roland-E28.idf320
-rw-r--r--muse/share/instruments/Roland-SCD70.idf1513
-rw-r--r--muse/share/instruments/Roland-XP30.idf1592
-rw-r--r--muse/share/instruments/Roland_FantomXR.idf1419
-rw-r--r--muse/share/instruments/Roland_SRX-02.idf66
-rw-r--r--muse/share/instruments/Roland_SRX-09.idf454
-rw-r--r--muse/share/instruments/Waldorf_Microwave-I.idf141
-rw-r--r--muse/share/instruments/Yamaha-P50m.idf75
-rw-r--r--muse/share/instruments/Yamaha-P80.idf71
-rw-r--r--muse/share/instruments/Yamaha-PSR275.idf585
-rw-r--r--muse/share/instruments/Yamaha-PSR530.idf759
-rw-r--r--muse/share/instruments/Yamaha-S90.idf4304
-rw-r--r--muse/share/instruments/ZynAdd-1_4.idf22
-rw-r--r--muse/share/instruments/emuproteus2000.idf1088
-rw-r--r--muse/share/instruments/gm.idf209
-rw-r--r--muse/share/instruments/gs.idf236
-rw-r--r--muse/share/instruments/ns5r.idf568
-rw-r--r--muse/share/instruments/xg.idf623
-rw-r--r--muse/share/locale/CMakeLists.txt22
-rw-r--r--muse/share/locale/muse_de.qmbin0 -> 3455 bytes
-rw-r--r--muse/share/locale/muse_de.ts5290
-rw-r--r--muse/share/locale/muse_es.qmbin0 -> 29832 bytes
-rw-r--r--muse/share/locale/muse_es.ts8803
-rw-r--r--muse/share/locale/muse_fr.qmbin0 -> 25507 bytes
-rw-r--r--muse/share/locale/muse_fr.ts7700
-rw-r--r--muse/share/locale/muse_ru.qmbin0 -> 38168 bytes
-rw-r--r--muse/share/locale/muse_ru.ts5819
-rw-r--r--muse/share/locale/muse_sv_SE.qmbin0 -> 42686 bytes
-rw-r--r--muse/share/locale/muse_sv_SE.ts8484
-rw-r--r--muse/share/plugins/1050.ui297
-rw-r--r--muse/share/plugins/1436.ui1090
-rw-r--r--muse/share/plugins/2142.ui525
-rw-r--r--muse/share/plugins/CMakeLists.txt22
-rw-r--r--muse/share/templates/CMakeLists.txt22
-rw-r--r--muse/share/templates/audio.med329
-rw-r--r--muse/share/templates/default.med132
-rw-r--r--muse/share/templates/midiGM.med409
-rw-r--r--muse/share/templates/monorecord.med430
-rw-r--r--muse/share/templates/synti.med806
-rw-r--r--muse/share/wallpapers/CMakeLists.txt22
-rw-r--r--muse/share/wallpapers/gray.gifbin0 -> 6699 bytes
-rw-r--r--muse/share/wallpapers/gray_rock.gifbin0 -> 23780 bytes
-rw-r--r--muse/share/wallpapers/gray_stucco.gifbin0 -> 20903 bytes
-rw-r--r--muse/share/wallpapers/paper1.jpgbin0 -> 1662 bytes
-rw-r--r--muse/share/wallpapers/stone1.gifbin0 -> 1252 bytes
-rw-r--r--muse/synti/CMakeLists.txt32
-rw-r--r--muse/synti/deicsonze/ARCH_ALIN24945
-rw-r--r--muse/synti/deicsonze/CMakeLists.txt43
-rw-r--r--muse/synti/deicsonze/README20
-rw-r--r--muse/synti/deicsonze/SutulaBank.dei0
-rw-r--r--muse/synti/deicsonze/TODO15
-rw-r--r--muse/synti/deicsonze/deicsonze.cpp2794
-rw-r--r--muse/synti/deicsonze/deicsonze.h351
-rw-r--r--muse/synti/deicsonze/deicsonzegui.cpp3601
-rw-r--r--muse/synti/deicsonze/deicsonzegui.h453
-rw-r--r--muse/synti/deicsonze/deicsonzegui.ui7752
-rw-r--r--muse/synti/deicsonze/deicsonzepreset.cpp1171
-rw-r--r--muse/synti/deicsonze/deicsonzepreset.h555
-rw-r--r--muse/synti/deicsonze/pics/SHold.fig12
-rw-r--r--muse/synti/deicsonze/pics/SHold.pngbin0 -> 394 bytes
-rw-r--r--muse/synti/deicsonze/pics/algo1.fig31
-rw-r--r--muse/synti/deicsonze/pics/algo1.pngbin0 -> 1010 bytes
-rw-r--r--muse/synti/deicsonze/pics/algo2.fig29
-rw-r--r--muse/synti/deicsonze/pics/algo2.pngbin0 -> 1840 bytes
-rw-r--r--muse/synti/deicsonze/pics/algo3.fig29
-rw-r--r--muse/synti/deicsonze/pics/algo3.pngbin0 -> 1841 bytes
-rw-r--r--muse/synti/deicsonze/pics/algo4.fig29
-rw-r--r--muse/synti/deicsonze/pics/algo4.pngbin0 -> 1952 bytes
-rw-r--r--muse/synti/deicsonze/pics/algo5.fig34
-rw-r--r--muse/synti/deicsonze/pics/algo5.pngbin0 -> 1542 bytes
-rw-r--r--muse/synti/deicsonze/pics/algo6.fig37
-rw-r--r--muse/synti/deicsonze/pics/algo6.pngbin0 -> 1672 bytes
-rw-r--r--muse/synti/deicsonze/pics/algo7.fig35
-rw-r--r--muse/synti/deicsonze/pics/algo7.pngbin0 -> 1623 bytes
-rw-r--r--muse/synti/deicsonze/pics/algo8.fig34
-rw-r--r--muse/synti/deicsonze/pics/algo8.pngbin0 -> 1631 bytes
-rw-r--r--muse/synti/deicsonze/pics/sawUp.fig13
-rw-r--r--muse/synti/deicsonze/pics/sawUp.pngbin0 -> 416 bytes
-rw-r--r--muse/synti/deicsonze/pics/square.fig14
-rw-r--r--muse/synti/deicsonze/pics/square.pngbin0 -> 354 bytes
-rw-r--r--muse/synti/deicsonze/pics/triangl.fig13
-rw-r--r--muse/synti/deicsonze/pics/triangl.pngbin0 -> 435 bytes
-rw-r--r--muse/synti/deicsonze/pics/wave1.fig29
-rw-r--r--muse/synti/deicsonze/pics/wave1.gnuplot2
-rw-r--r--muse/synti/deicsonze/pics/wave1.pngbin0 -> 569 bytes
-rw-r--r--muse/synti/deicsonze/pics/wave2.fig31
-rw-r--r--muse/synti/deicsonze/pics/wave2.gnuplot2
-rw-r--r--muse/synti/deicsonze/pics/wave2.pngbin0 -> 543 bytes
-rw-r--r--muse/synti/deicsonze/pics/wave3.fig29
-rw-r--r--muse/synti/deicsonze/pics/wave3.gnuplot2
-rw-r--r--muse/synti/deicsonze/pics/wave3.pngbin0 -> 539 bytes
-rw-r--r--muse/synti/deicsonze/pics/wave4.fig29
-rw-r--r--muse/synti/deicsonze/pics/wave4.gnuplot2
-rw-r--r--muse/synti/deicsonze/pics/wave4.pngbin0 -> 532 bytes
-rw-r--r--muse/synti/deicsonze/pics/wave5.fig29
-rw-r--r--muse/synti/deicsonze/pics/wave5.gnuplot2
-rw-r--r--muse/synti/deicsonze/pics/wave5.pngbin0 -> 576 bytes
-rw-r--r--muse/synti/deicsonze/pics/wave6.fig29
-rw-r--r--muse/synti/deicsonze/pics/wave6.gnuplot2
-rw-r--r--muse/synti/deicsonze/pics/wave6.pngbin0 -> 550 bytes
-rw-r--r--muse/synti/deicsonze/pics/wave7.fig29
-rw-r--r--muse/synti/deicsonze/pics/wave7.gnuplot2
-rw-r--r--muse/synti/deicsonze/pics/wave7.pngbin0 -> 596 bytes
-rw-r--r--muse/synti/deicsonze/pics/wave8.fig29
-rw-r--r--muse/synti/deicsonze/pics/wave8.gnuplot2
-rw-r--r--muse/synti/deicsonze/pics/wave8.pngbin0 -> 591 bytes
-rw-r--r--muse/synti/fluid/CMakeLists.txt42
-rw-r--r--muse/synti/fluid/fluid.cpp520
-rw-r--r--muse/synti/fluid/fluid.h80
-rw-r--r--muse/synti/fluid/fluidgui.cpp68
-rw-r--r--muse/synti/fluid/fluidgui.h31
-rw-r--r--muse/synti/fluid/fluidgui.ui115
-rw-r--r--muse/synti/fluidsynth/CMakeLists.txt42
-rw-r--r--muse/synti/fluidsynth/README.txt45
-rw-r--r--muse/synti/fluidsynth/TODO13
-rw-r--r--muse/synti/fluidsynth/fluidsynthgui.cpp596
-rw-r--r--muse/synti/fluidsynth/fluidsynthgui.h136
-rw-r--r--muse/synti/fluidsynth/fluidsynthgui.ui641
-rw-r--r--muse/synti/fluidsynth/fluidsynti.cpp1174
-rw-r--r--muse/synti/fluidsynth/fluidsynti.h142
-rw-r--r--muse/synti/libsynti/CMakeLists.txt10
-rw-r--r--muse/synti/libsynti/evdata.h66
-rw-r--r--muse/synti/libsynti/gui.cpp130
-rw-r--r--muse/synti/libsynti/gui.h72
-rw-r--r--muse/synti/libsynti/mess.cpp122
-rw-r--r--muse/synti/libsynti/mess.h97
-rw-r--r--muse/synti/libsynti/mono.cpp47
-rw-r--r--muse/synti/libsynti/mono.h47
-rw-r--r--muse/synti/libsynti/mpevent.cpp21
-rw-r--r--muse/synti/libsynti/mpevent.h55
-rw-r--r--muse/synti/libsynti/poly.cpp35
-rw-r--r--muse/synti/libsynti/poly.h39
-rw-r--r--muse/synti/organ/CMakeLists.txt42
-rw-r--r--muse/synti/organ/organ.cpp648
-rw-r--r--muse/synti/organ/organ.h197
-rw-r--r--muse/synti/organ/organgui.cpp123
-rw-r--r--muse/synti/organ/organgui.h42
-rw-r--r--muse/synti/organ/organgui.ui882
-rw-r--r--muse/synti/s1/CMakeLists.txt27
-rw-r--r--muse/synti/s1/s1.cpp158
-rw-r--r--muse/synti/simpledrums/COPYING3
-rw-r--r--muse/synti/simpledrums/README43
-rw-r--r--muse/synti/simpledrums/ReleaseNotes.txt18
-rw-r--r--muse/synti/simpledrums/common.h109
-rw-r--r--muse/synti/simpledrums/simpledrums.cpp1650
-rw-r--r--muse/synti/simpledrums/simpledrums.h171
-rw-r--r--muse/synti/simpledrums/simpledrumsgui.cpp763
-rw-r--r--muse/synti/simpledrums/simpledrumsgui.h199
-rw-r--r--muse/synti/simpledrums/simpledrumsguibase.ui23
-rw-r--r--muse/synti/simpledrums/ssplugin.cpp455
-rw-r--r--muse/synti/simpledrums/ssplugin.h171
-rw-r--r--muse/synti/simpledrums/sspluginchooserbase.ui106
-rw-r--r--muse/synti/simpledrums/ssplugingui.cpp517
-rw-r--r--muse/synti/simpledrums/ssplugingui.h198
-rw-r--r--muse/synti/vam/CMakeLists.txt42
-rw-r--r--muse/synti/vam/COPYING340
-rw-r--r--muse/synti/vam/ChangeLog16
-rw-r--r--muse/synti/vam/README42
-rw-r--r--muse/synti/vam/TODO3
-rw-r--r--muse/synti/vam/vam.cpp803
-rw-r--r--muse/synti/vam/vam.h37
-rw-r--r--muse/synti/vam/vamgui.cpp618
-rw-r--r--muse/synti/vam/vamgui.h77
-rw-r--r--muse/synti/vam/vamgui.ui1535
857 files changed, 236014 insertions, 0 deletions
diff --git a/muse/.files, b/muse/.files,
new file mode 100644
index 00000000..b51557cb
--- /dev/null
+++ b/muse/.files,
@@ -0,0 +1,977 @@
+.
+./al
+./al/al.h
+./al/Makefile
+./al/xml.cpp
+./al/marker.cpp
+./al/pos.h
+./al/sig.h
+./al/xml.h
+./al/libal.a
+./al/sig.cpp
+./al/CMakeLists.txt
+./al/tempo.h
+./al/al.cpp
+./al/marker.h
+./al/pos.cpp
+./al/tempo.cpp
+./awl
+./awl/mslider.cpp
+./awl/midipanknob.h
+./awl/tcanvas.h
+./awl/Makefile
+./awl/metronom.xpm
+./awl/pitchedit.cpp
+./awl/knob.cpp
+./awl/tempolabel.cpp
+./awl/awl.h
+./awl/mslider.h
+./awl/floatentry.h
+./awl/pitchedit.h
+./awl/aslider.cpp
+./awl/panentry.cpp
+./awl/volslider.cpp
+./awl/volknob.cpp
+./awl/pitchlabel.cpp
+./awl/midimeter.h
+./awl/poslabel.cpp
+./awl/tcanvas.cpp
+./awl/CMakeLists.txt
+./awl/aslider.h
+./awl/combobox.h
+./awl/panknob.cpp
+./awl/panknob.h
+./awl/midimeter.cpp
+./awl/awlplugin.cpp
+./awl/posedit.h
+./awl/slider.cpp
+./awl/midipanentry.cpp
+./awl/midimslider.cpp
+./awl/fastlog.h
+./awl/midipanentry.h
+./awl/pitchlabel.h
+./awl/clock.xpm
+./awl/sigedit.cpp
+./awl/knob.h
+./awl/combobox.cpp
+./awl/poslabel.h
+./awl/checkbox.cpp
+./awl/slider.h
+./awl/checkbox.h
+./awl/volentry.cpp
+./awl/volslider.h
+./awl/panentry.h
+./awl/utils.h
+./awl/midivolentry.h
+./awl/posedit.cpp
+./awl/midimslider.h
+./awl/sigedit.h
+./awl/awlplugin.h
+./awl/libawl.a
+./awl/awl.cpp
+./awl/tempolabel.h
+./awl/volknob.h
+./awl/midipanknob.cpp
+./awl/tempoedit.h
+./awl/floatentry.cpp
+./awl/tempoedit.cpp
+./awl/volentry.h
+./awl/midivolentry.cpp
+./awl/utils.cpp
+./awl/libawlplugin.so
+./doc
+./doc/man
+./doc/man/de
+./doc/man/de/man-de.tex
+./doc/man/en
+./doc/man/en/man-en.tex
+./doc/man/fdl.tex
+./doc/man/titlelogo.jpg
+./doc/man/gpl.tex
+./doc/dimpl
+./doc/dimpl/dimpl.pdf
+./doc/dimpl/dimpl.tex
+./doc/README.de
+./doc/doxygen
+./doc/README.translate
+./doc/README.instruments
+./doc/README.realtime
+./doc/README.ladspaguis
+./doc/README.softsynth
+./doc/README.CVS
+./doc/README.shortcuts
+./gen
+./NEWS
+./TODO
+./mops
+./muse
+./muse/vg
+./muse/DOC
+./muse/xpm
+./muse/xpm/pafter.xpm
+./muse/xpm/plus.xpm
+./muse/xpm/inputpluginS.xpm
+./muse/xpm/select_all_parts_on_track.xpm
+./muse/xpm/newmutebutton.xpm
+./muse/xpm/bluedot.xpm
+./muse/xpm/master.xpm
+./muse/xpm/undo.xpm
+./muse/xpm/view_cliplist.xpm
+./muse/xpm/meta.xpm
+./muse/xpm/edit_pianoroll.xpm
+./muse/xpm/edit_list.xpm
+./muse/xpm/midi_init_instr.xpm
+./muse/xpm/dot1.xpm
+./muse/xpm/settings_metronome.xpm
+./muse/xpm/addtrack_auxsend.xpm
+./muse/xpm/buttondown.xpm
+./muse/xpm/settings_configureshortcuts.xpm
+./muse/xpm/note.xpm
+./muse/xpm/mustangS.xpm
+./muse/xpm/cut.xpm
+./muse/xpm/mastertrackS.xpm
+./muse/xpm/muse_icon.xpm
+./muse/xpm/punchout1.xpm
+./muse/xpm/doth.xpm
+./muse/xpm/view_transport_window.xpm
+./muse/xpm/quant.xpm
+./muse/xpm/dot.xpm
+./muse/xpm/down.xpm
+./muse/xpm/track_add.xpm
+./muse/xpm/sysex.xpm
+./muse/xpm/midi_inputplugins_random_rhythm_generator.xpm
+./muse/xpm/iiwusynth.xpm
+./muse/xpm/exit1.xpm
+./muse/xpm/midi_transform.xpm
+./muse/xpm/flagS.xpm
+./muse/xpm/midi_reset_instr.xpm
+./muse/xpm/record_on.xpm
+./muse/xpm/exitS.xpm
+./muse/xpm/context_help.xpm
+./muse/xpm/note1.xpm
+./muse/xpm/ctrl.xpm
+./muse/xpm/midi_local_off.xpm
+./muse/xpm/fileopenS.xpm
+./muse/xpm/solobutton_off.xpm
+./muse/xpm/edit_track_del.xpm
+./muse/xpm/cmark.xpm
+./muse/xpm/editcopyS.xpm
+./muse/xpm/midi_transpose.xpm
+./muse/xpm/automation_take_snapshot.xpm
+./muse/xpm/midi_inputplugins_midi_input_transform.xpm
+./muse/xpm/settings_follow_song.xpm
+./muse/xpm/editcut.xpm
+./muse/xpm/idea.xpm
+./muse/xpm/select_invert_selection.xpm
+./muse/xpm/punchin1.xpm
+./muse/xpm/solobutton.xpm
+./muse/xpm/piano.xpm
+./muse/xpm/muse_icon_64x64.png
+./muse/xpm/filenew.png
+./muse/xpm/view_mixer.xpm
+./muse/xpm/filesave.png
+./muse/xpm/splash.png
+./muse/xpm/draw.xpm
+./muse/xpm/fileprintS.xpm
+./muse/xpm/midi_inputplugins_transpose.xpm
+./muse/xpm/panic.xpm
+./muse/xpm/punchout.xpm
+./muse/xpm/reddot.xpm
+./muse/xpm/track_delete.xpm
+./muse/xpm/find.xpm
+./muse/xpm/darkgreendot.xpm
+./muse/xpm/select.xpm
+./muse/xpm/mute.xpm
+./muse/xpm/record.xpm
+./muse/xpm/lmark.xpm
+./muse/xpm/record1.xpm
+./muse/xpm/config.xpm
+./muse/xpm/mastertrack_graphic.xpm
+./muse/xpm/home.xpm
+./muse/xpm/underlined.xpm
+./muse/xpm/mono.xpm
+./muse/xpm/view_marker.xpm
+./muse/xpm/mutebutton_on.xpm
+./muse/xpm/edit_midi.xpm
+./muse/xpm/forward.xpm
+./muse/xpm/localoffS.xpm
+./muse/xpm/initS.xpm
+./muse/xpm/configure.xpm
+./muse/xpm/miditransposeS.xpm
+./muse/xpm/settings_globalsettings.xpm
+./muse/xpm/greendot.xpm
+./muse/xpm/addtrack_addmiditrack.xpm
+./muse/xpm/toc.xpm
+./muse/xpm/redoS.xpm
+./muse/xpm/automation_clear_data.xpm
+./muse/xpm/gv.xpm
+./muse/xpm/glue.xpm
+./muse/xpm/mixerS.xpm
+./muse/xpm/addtrack_audiooutput.xpm
+./muse/xpm/minus.xpm
+./muse/xpm/score.xpm
+./muse/xpm/loop1.xpm
+./muse/xpm/audio_bounce_to_file.xpm
+./muse/xpm/addtrack_wavetrack.xpm
+./muse/xpm/addtrack_drumtrack.xpm
+./muse/xpm/midi_edit_instrument.xpm
+./muse/xpm/settings_midifileexport.xpm
+./muse/xpm/automation_mixer.xpm
+./muse/xpm/addtrack_audioinput.xpm
+./muse/xpm/bouncetofile.xpm
+./muse/xpm/select_outside_loop.xpm
+./muse/xpm/undoS.xpm
+./muse/xpm/wave.xpm
+./muse/xpm/audio_restartaudio.xpm
+./muse/xpm/select_all.xpm
+./muse/xpm/select_deselect_all.xpm
+./muse/xpm/resetS.xpm
+./muse/xpm/cliplistS.xpm
+./muse/xpm/pointer.xpm
+./muse/xpm/pencil.xpm
+./muse/xpm/edit_drumms.xpm
+./muse/xpm/editmute.xpm
+./muse/xpm/editcutS.xpm
+./muse/xpm/listS.xpm
+./muse/xpm/off.xpm
+./muse/xpm/flag.xpm
+./muse/xpm/miditransformS.xpm
+./muse/xpm/cafter.xpm
+./muse/xpm/up.xpm
+./muse/xpm/back.xpm
+./muse/xpm/edit_score.xpm
+./muse/xpm/lock.xpm
+./muse/xpm/fforward.xpm
+./muse/xpm/select_inside_loop.xpm
+./muse/xpm/midi_plugS.xpm
+./muse/xpm/stick.xpm
+./muse/xpm/settings_appearance_settings.xpm
+./muse/xpm/filesaveasS.xpm
+./muse/xpm/settings_midiport_softsynths.xpm
+./muse/xpm/play.xpm
+./muse/xpm/midi_inputplugins_remote_control.xpm
+./muse/xpm/stereo.xpm
+./muse/xpm/editcopy.xpm
+./muse/xpm/addtrack_audiogroup.xpm
+./muse/xpm/solobutton_on.xpm
+./muse/xpm/fileprint.xpm
+./muse/xpm/punchin.xpm
+./muse/xpm/drumS.xpm
+./muse/xpm/start.xpm
+./muse/xpm/pianoS.xpm
+./muse/xpm/record_off.xpm
+./muse/xpm/delete.xpm
+./muse/xpm/edit_mastertrack.xpm
+./muse/xpm/speaker.xpm
+./muse/xpm/editpaste.xpm
+./muse/xpm/edit_track_add.xpm
+./muse/xpm/mastertrack_list.xpm
+./muse/xpm/fileopen.png
+./muse/xpm/bold.xpm
+./muse/xpm/filenewS.xpm
+./muse/xpm/midi_inputplugins_midi_input_filter.xpm
+./muse/xpm/steprec.xpm
+./muse/xpm/loop.xpm
+./muse/xpm/view_bigtime_window.xpm
+./muse/xpm/graydot.xpm
+./muse/xpm/stop.xpm
+./muse/xpm/frewind.xpm
+./muse/xpm/rmark.xpm
+./muse/xpm/audio_bounce_to_track.xpm
+./muse/xpm/exit.xpm
+./muse/xpm/scoreS.xpm
+./muse/xpm/settings_midisync.xpm
+./muse/xpm/mutebutton_off.xpm
+./muse/xpm/midi_inputplugins.xpm
+./muse/xpm/mixeraudioS.xpm
+./muse/xpm/filesaveS.xpm
+./muse/xpm/redo.xpm
+./muse/xpm/italic.xpm
+./muse/xpm/pitch.xpm
+./muse/xpm/editpasteS.xpm
+./muse/xpm/midiin.xpm
+./muse/xpm/editmuteS.xpm
+./muse/xpm/darkreddot.xpm
+./muse/audiotrack.h
+./muse/TODO
+./muse/ctrl
+./muse/ctrl/ctrleditor.cpp
+./muse/ctrl/ui_configmidictrl.h
+./muse/ctrl/Makefile
+./muse/ctrl/CMakeLists.txt
+./muse/ctrl/ctrleditor.h
+./muse/ctrl/configmidictrl.cpp
+./muse/ctrl/configmidictrl.ui
+./muse/ctrl/configmidictrl.h
+./muse/ctrl/libctrl.a
+./muse/muse
+./muse/editor.h
+./muse/route.cpp
+./muse/ui_appearance.h
+./muse/debug.h
+./muse/undo.cpp
+./muse/midievent.cpp
+./muse/Makefile
+./muse/ui_quantconfig.h
+./muse/midiport.h
+./muse/ui_configmidifile.h
+./muse/midirc.cpp
+./muse/configmidifile.ui
+./muse/midiseq.cpp
+./muse/aboutbox.ui
+./muse/plugingui.h
+./muse/song.cpp
+./muse/default_click.h
+./muse/audiogroup.h
+./muse/bench
+./muse/gui.h
+./muse/eventbase.h
+./muse/liste
+./muse/liste/Makefile
+./muse/liste/editnotedialog.ui
+./muse/liste/editctrlbase.ui
+./muse/liste/listedit.cpp
+./muse/liste/CMakeLists.txt
+./muse/liste/listedit.h
+./muse/liste/ui_editnotedialog.h
+./muse/liste/editevent.h
+./muse/liste/libliste.a
+./muse/liste/editevent.cpp
+./muse/mixer
+./muse/mixer/midirack.h
+./muse/mixer/strip.cpp
+./muse/mixer/routedialog.ui
+./muse/mixer/mstrip.h
+./muse/mixer/rack.cpp
+./muse/mixer/routedialog.cpp
+./muse/mixer/mixer.h
+./muse/mixer/strip.h
+./muse/mixer/midirack.cpp
+./muse/mixer/rack.h
+./muse/mixer/routedialog.h
+./muse/mixer/mstrip.cpp
+./muse/mixer/astrip.cpp
+./muse/mixer/mixer.cpp
+./muse/mixer/astrip.h
+./muse/mtc.h
+./muse/vst.h
+./muse/transpose.cpp
+./muse/eventlist.cpp
+./muse/transport.cpp
+./muse/wavetrack.cpp
+./muse/esettings.cpp
+./muse/esettings.h
+./muse/audioprefetch.cpp
+./muse/miditransform.h
+./muse/helper.cpp
+./muse/.muse.bin.bak
+./muse/audiowriteback.h
+./muse/midiplugin.cpp
+./muse/audiowriteback.cpp
+./muse/midiplugin.h
+./muse/miditransform.cpp
+./muse/route.h
+./muse/globaldefs.h
+./muse/appearance.h
+./muse/midievent.h
+./muse/ctrl.cpp
+./muse/midisynti.cpp
+./muse/fifo.cpp
+./muse/audioaux.cpp
+./muse/CMakeLists.txt
+./muse/runmuse
+./muse/ui_routedialog.h
+./muse/shortcuts.cpp
+./muse/midisynti.h
+./muse/audio.cpp
+./muse/audioinput.h
+./muse/part.cpp
+./muse/transpose.ui
+./muse/transport.ui
+./muse/audioinput.cpp
+./muse/miditrack.h
+./muse/muse.cpp
+./muse/muse.qrc
+./muse/appearance.cpp
+./muse/mpevent.cpp
+./muse/audioprefetch.h
+./muse/event.h
+./muse/genset.h
+./muse/waveevent.h
+./muse/midi.cpp
+./muse/event.cpp
+./muse/midiedit
+./muse/midiedit/DOC
+./muse/midiedit/pianoroll.h
+./muse/midiedit/cmd.h
+./muse/midiedit/midieditor.h
+./muse/midiedit/drumedit.cpp
+./muse/midiedit/prcanvas.h
+./muse/midiedit/ecanvas.cpp
+./muse/midiedit/ctrledit.cpp
+./muse/midiedit/quantconfig.cpp
+./muse/midiedit/quantconfig.ui
+./muse/midiedit/quantconfig.h
+./muse/midiedit/ecanvas.h
+./muse/midiedit/pianoroll.cpp
+./muse/midiedit/citem.cpp
+./muse/midiedit/midieditor.cpp
+./muse/midiedit/dcanvas.cpp
+./muse/midiedit/prcanvas.cpp
+./muse/midiedit/ctrledit.h
+./muse/midiedit/drumedit.h
+./muse/midiedit/drummap.h
+./muse/midiedit/dcanvas.h
+./muse/midiedit/.Ped-tk
+./muse/midiedit/drummap.cpp
+./muse/midiedit/citem.h
+./muse/midirc.h
+./muse/conf.h
+./muse/plugin.cpp
+./muse/ctrl.h
+./muse/conf.cpp
+./muse/driver
+./muse/driver/alsatimer.h
+./muse/driver/posixtimer.h
+./muse/driver/Makefile
+./muse/driver/jackaudio.h
+./muse/driver/posixtimer.cpp
+./muse/driver/alsatimer.cpp
+./muse/driver/libdriver.a
+./muse/driver/CMakeLists.txt
+./muse/driver/driver.h
+./muse/driver/jack.cpp
+./muse/driver/alsamidi.h
+./muse/driver/rtctimer.h
+./muse/driver/timerdev.h
+./muse/driver/alsamidi.cpp
+./muse/driver/dummyaudio.cpp
+./muse/driver/audiodev.h
+./muse/driver/rtctimer.cpp
+./muse/fifo.h
+./muse/fastlog.h
+./muse/mpevent.h
+./muse/midictrl.cpp
+./muse/songfile.cpp
+./muse/synth.h
+./muse/help.h
+./muse/audiooutput.cpp
+./muse/cobject.h
+./muse/midififo.cpp
+./muse/gconfig.cpp
+./muse/mtc.cpp
+./muse/track.h
+./muse/miditrack.cpp
+./muse/evdata.h
+./muse/dssihost.h
+./muse/wavetrack.h
+./muse/marker
+./muse/marker/Makefile
+./muse/marker/libmarker.a
+./muse/marker/markerview.h
+./muse/marker/markerview.cpp
+./muse/marker/CMakeLists.txt
+./muse/audiogroup.cpp
+./muse/master
+./muse/master/master.cpp
+./muse/master/Makefile
+./muse/master/libmaster.a
+./muse/master/CMakeLists.txt
+./muse/master/masteredit.h
+./muse/master/master.h
+./muse/master/masteredit.cpp
+./muse/gconfig.h
+./muse/sync.cpp
+./muse/muse.ui
+./muse/midi.h
+./muse/wave.cpp
+./muse/waveedit
+./muse/waveedit/waveview.cpp
+./muse/waveedit/waveedit.h
+./muse/waveedit/waveedit.cpp
+./muse/waveedit/waveview.h
+./muse/genset.cpp
+./muse/cobject.cpp
+./muse/muse.h
+./muse/midifile.cpp
+./muse/extmidieditor.cpp
+./muse/part.h
+./muse/midiport.cpp
+./muse/exportmidi.cpp
+./muse/value.cpp
+./muse/synth.cpp
+./muse/ticksynth.cpp
+./muse/song.h
+./muse/waveevent.cpp
+./muse/extmidieditor.h
+./muse/sync.h
+./muse/genset.ui
+./muse/audiooutput.h
+./muse/undo.h
+./muse/ladspa.h
+./muse/plugingui.cpp
+./muse/wave.h
+./muse/icons.cpp
+./muse/device.h
+./muse/instruments
+./muse/instruments/Makefile
+./muse/instruments/minstrument.cpp
+./muse/instruments/CMakeLists.txt
+./muse/instruments/editinstrument.cpp
+./muse/instruments/midictrledit.h
+./muse/instruments/minstrument.h
+./muse/instruments/midictrledit.cpp
+./muse/instruments/editinstrument.h
+./muse/instruments/libinstruments.a
+./muse/instruments/ui_editinstrument.h
+./muse/instruments/editinstrument.ui
+./muse/ui_transpose.h
+./muse/ui_transport.h
+./muse/icons.h
+./muse/thread.h
+./muse/appearance.ui
+./muse/arranger
+./muse/arranger/DOC
+./muse/arranger/trackinfo.h
+./muse/arranger/selectfilter.h
+./muse/arranger/tlswidget.cpp
+./muse/arranger/configtrack.cpp
+./muse/arranger/tllineedit.h
+./muse/arranger/arranger.cpp
+./muse/arranger/tlwlayout.h
+./muse/arranger/trackinfo.cpp
+./muse/arranger/tllineedit.cpp
+./muse/arranger/partdrag.h
+./muse/arranger/tlwidget.cpp
+./muse/arranger/configtrack.h
+./muse/arranger/partdrag.cpp
+./muse/arranger/tlswidget.h
+./muse/arranger/canvas.h
+./muse/arranger/configtrack.ui
+./muse/arranger/miditrackinfo.h
+./muse/arranger/arranger.h
+./muse/arranger/canvas.cpp
+./muse/arranger/tlwlayout.cpp
+./muse/arranger/trackdrag.cpp
+./muse/arranger/trelement.h
+./muse/arranger/tlwidget.h
+./muse/arranger/trackdrag.h
+./muse/exportmididialog.ui
+./muse/audiotrack.cpp
+./muse/globals.h
+./muse/ui_genset.h
+./muse/dssihost.cpp
+./muse/editor.cpp
+./muse/ui_aboutbox.h
+./muse/audio.h
+./muse/seqmsg.cpp
+./muse/transpose.h
+./muse/transport.h
+./muse/widgets
+./muse/widgets/rastercombo.cpp
+./muse/widgets/libwidgets.a
+./muse/widgets/Makefile
+./muse/widgets/mixdowndialog.h
+./muse/widgets/siglabel.cpp
+./muse/widgets/ui_mixdowndialog.h
+./muse/widgets/fontsel.h
+./muse/widgets/midisync.h
+./muse/widgets/tb1.h
+./muse/widgets/gatetime.h
+./muse/widgets/comboQuant.h
+./muse/widgets/ctrlcombo.h
+./muse/widgets/comment.h
+./muse/widgets/dentry.cpp
+./muse/widgets/ui_comment.h
+./muse/widgets/filedialog.h
+./muse/widgets/quantcombo.cpp
+./muse/widgets/tools.cpp
+./muse/widgets/fdialogbuttons1.h
+./muse/widgets/fdialogbuttons.ui
+./muse/widgets/simplebutton.h
+./muse/widgets/menutitle.h
+./muse/widgets/bigtime.h
+./muse/widgets/tb1.cpp
+./muse/widgets/ui_shortcutcapturedialog.h
+./muse/widgets/gatetime.cpp
+./muse/widgets/mtrackinfobase.ui
+./muse/widgets/greendotbutton.h
+./muse/widgets/CMakeLists.txt
+./muse/widgets/floatlabel.cpp
+./muse/widgets/editmetadialogbase.ui
+./muse/widgets/combobox.h
+./muse/widgets/cliplisteditorbase.h
+./muse/widgets/editsysexdialogbase.ui
+./muse/widgets/wtrackinfobase.ui
+./muse/widgets/midisync.ui
+./muse/widgets/rastercombo.h
+./muse/widgets/noteinfo.cpp
+./muse/widgets/velocity.ui
+./muse/widgets/shortcutconfig.ui
+./muse/widgets/editmetadialogbase.cpp
+./muse/widgets/shortcutcapturedialog.h
+./muse/widgets/doublelabel.cpp
+./muse/widgets/ui_midisync.h
+./muse/widgets/shortcutconfig.h
+./muse/widgets/ui_gatetime.h
+./muse/widgets/tools.h
+./muse/widgets/splitter.h
+./muse/widgets/cliplisteditorbase.ui
+./muse/widgets/simplebutton.cpp
+./muse/widgets/ui_shortcutconfig.h
+./muse/widgets/combobox.cpp
+./muse/widgets/outportcombo.cpp
+./muse/widgets/velocity.h
+./muse/widgets/comboQuant.cpp
+./muse/widgets/action.h
+./muse/widgets/dentry.h
+./muse/widgets/mittransposebase.ui
+./muse/widgets/transformbase.ui
+./muse/widgets/siglabel.h
+./muse/widgets/gatetime.ui
+./muse/widgets/editsysexdialogbase.h
+./muse/widgets/noteinfo.h
+./muse/widgets/doublelabel.h
+./muse/widgets/splitter.cpp
+./muse/widgets/utils.h
+./muse/widgets/fontsel.cpp
+./muse/widgets/recordbutton.h
+./muse/widgets/mixdowndialog.cpp
+./muse/widgets/ctrlcombo.cpp
+./muse/widgets/comment.cpp
+./muse/widgets/intlabel.h
+./muse/widgets/comment.ui
+./muse/widgets/midisync.cpp
+./muse/widgets/synthwizardbase.h
+./muse/widgets/velocity.cpp
+./muse/widgets/shortcutconfig.cpp
+./muse/widgets/mittransposebase.h
+./muse/widgets/.Ped-tk
+./muse/widgets/shortcutcapturedialog.ui
+./muse/widgets/shortcutcapturedialog.cpp
+./muse/widgets/ui_velocity.h
+./muse/widgets/menutitle.cpp
+./muse/widgets/quantcombo.h
+./muse/widgets/floatlabel.h
+./muse/widgets/outportcombo.h
+./muse/widgets/bigtime.cpp
+./muse/widgets/stutk9Nz
+./muse/widgets/mixdowndialog.ui
+./muse/widgets/filedialog.cpp
+./muse/widgets/utils.cpp
+./muse/vst.cpp
+./muse/ui_muse.h
+./muse/midictrl.h
+./muse/midiseq.h
+./muse/midififo.h
+./muse/midifile.h
+./muse/track.cpp
+./muse/globals.cpp
+./muse/ui_exportmididialog.h
+./muse/audioaux.h
+./muse/shortcuts.h
+./muse/importmidi.cpp
+./muse/exportmidi.h
+./muse/thread.cpp
+./muse/ui_configtrack.h
+./muse/cliplist
+./muse/cliplist/cliplist.h
+./muse/cliplist/cliplist.cpp
+./muse/help.cpp
+./muse/qrc_muse.cxx
+./muse/helper.h
+./muse/plugin.h
+./muse/ticksynth.h
+./Makefile
+./SECURITY
+./all.h
+./cmake
+./cmake/UsePkgConfig1.cmake
+./files
+./share
+./share/html
+./share/html/right_pane.jpg
+./share/html/main_window_track_info.jpg
+./share/html/installation.html
+./share/html/CMakeLists.txt
+./share/html/window_ref.html
+./share/html/index.html
+./share/html/getting_started.html
+./share/html/track_info.jpg
+./share/html/toc_.txt
+./share/html/main_window.jpg
+./share/html/COPYING.html
+./share/html/button_bar.jpg
+./share/html/styles.css
+./share/html/left_pane.jpg
+./share/html/invocation.html
+./share/wallpapers
+./share/wallpapers/stone1.gif
+./share/wallpapers/gray_stucco.gif
+./share/wallpapers/gray.gif
+./share/wallpapers/gray_rock.gif
+./share/wallpapers/CMakeLists.txt
+./share/wallpapers/paper1.jpg
+./share/CMakeLists.txt
+./share/locale
+./share/locale/muse_de.qm
+./share/locale/muse_de.ts
+./share/locale/muse_es.qm
+./share/locale/muse_es.ts
+./share/locale/muse_fr.qm
+./share/locale/muse_fr.ts
+./share/locale/muse_ru.qm
+./share/locale/muse_ru.ts
+./share/locale/CMakeLists.txt
+./share/locale/muse_sv_SE.qm
+./share/locale/muse_sv_SE.ts
+./share/instruments
+./share/instruments/AlesisQS6.idf
+./share/instruments/Roland_FantomXR.idf
+./share/instruments/Yamaha-PSR530.idf
+./share/instruments/Roland_SRX-02.idf
+./share/instruments/Roland_SRX-09.idf
+./share/instruments/Yamaha-S90.idf
+./share/instruments/CMakeLists.txt
+./share/instruments/emuproteus2000.idf
+./share/instruments/gm.idf
+./share/instruments/gs.idf
+./share/instruments/Roland-E28.idf
+./share/instruments/Alesis-Ion.idf
+./share/instruments/Roland-SCD70.idf
+./share/instruments/Access_Virus.idf
+./share/instruments/Quasimidi-Sirius.idf
+./share/instruments/MC303.idf
+./share/instruments/Hammond_XB-1.idf
+./share/instruments/xg.idf
+./share/instruments/Waldorf_Microwave-I.idf
+./share/instruments/Roland-XP30.idf
+./share/instruments/Yamaha-PSR275.idf
+./share/instruments/Yamaha-P80.idf
+./share/instruments/ns5r.idf
+./share/instruments/Yamaha-P50m.idf
+./share/instruments/ZynAdd-1_4.idf
+./share/instruments/MC505.idf
+./share/instruments/Alesis-QS-78R.idf
+./share/plugins
+./share/plugins/2142.ui
+./share/plugins/CMakeLists.txt
+./share/plugins/1050.ui
+./share/plugins/1436.ui
+./share/templates
+./share/templates/default.med
+./share/templates/monorecord.med
+./share/templates/CMakeLists.txt
+./share/templates/audio.med
+./share/templates/midiGM.med
+./share/templates/synti.med
+./synti
+./synti/s1
+./synti/s1/Makefile
+./synti/s1/s1.so
+./synti/s1/CMakeLists.txt
+./synti/s1/s1.cpp
+./synti/vam
+./synti/vam/TODO
+./synti/vam/Makefile
+./synti/vam/vam.h
+./synti/vam/README
+./synti/vam/ui_vamgui.h
+./synti/vam/CMakeLists.txt
+./synti/vam/vam.cpp
+./synti/vam/vamgui.ui
+./synti/vam/vam.so
+./synti/vam/vamgui.h
+./synti/vam/ChangeLog
+./synti/vam/COPYING
+./synti/vam/vamgui.cpp
+./synti/deicsonze
+./synti/deicsonze/TODO
+./synti/deicsonze/pics
+./synti/deicsonze/pics/wave7.gnuplot
+./synti/deicsonze/pics/sawUp.fig
+./synti/deicsonze/pics/sawUp.png
+./synti/deicsonze/pics/wave2.gnuplot
+./synti/deicsonze/pics/algo1.fig
+./synti/deicsonze/pics/algo1.png
+./synti/deicsonze/pics/algo2.fig
+./synti/deicsonze/pics/algo2.png
+./synti/deicsonze/pics/algo3.fig
+./synti/deicsonze/pics/algo3.png
+./synti/deicsonze/pics/algo4.fig
+./synti/deicsonze/pics/algo4.png
+./synti/deicsonze/pics/algo5.fig
+./synti/deicsonze/pics/algo5.png
+./synti/deicsonze/pics/algo6.fig
+./synti/deicsonze/pics/algo6.png
+./synti/deicsonze/pics/algo7.fig
+./synti/deicsonze/pics/algo7.png
+./synti/deicsonze/pics/algo8.fig
+./synti/deicsonze/pics/algo8.png
+./synti/deicsonze/pics/wave4.gnuplot
+./synti/deicsonze/pics/square.fig
+./synti/deicsonze/pics/square.png
+./synti/deicsonze/pics/wave1.fig
+./synti/deicsonze/pics/wave1.png
+./synti/deicsonze/pics/wave2.fig
+./synti/deicsonze/pics/wave2.png
+./synti/deicsonze/pics/wave3.fig
+./synti/deicsonze/pics/wave3.png
+./synti/deicsonze/pics/wave4.fig
+./synti/deicsonze/pics/wave4.png
+./synti/deicsonze/pics/wave5.fig
+./synti/deicsonze/pics/wave5.png
+./synti/deicsonze/pics/wave6.fig
+./synti/deicsonze/pics/wave6.png
+./synti/deicsonze/pics/wave7.fig
+./synti/deicsonze/pics/wave7.png
+./synti/deicsonze/pics/wave8.fig
+./synti/deicsonze/pics/wave8.png
+./synti/deicsonze/pics/wave6.gnuplot
+./synti/deicsonze/pics/wave8.gnuplot
+./synti/deicsonze/pics/wave1.gnuplot
+./synti/deicsonze/pics/SHold.fig
+./synti/deicsonze/pics/SHold.png
+./synti/deicsonze/pics/triangl.fig
+./synti/deicsonze/pics/triangl.png
+./synti/deicsonze/pics/wave3.gnuplot
+./synti/deicsonze/pics/wave5.gnuplot
+./synti/deicsonze/Makefile
+./synti/deicsonze/SutulaBank.dei
+./synti/deicsonze/README
+./synti/deicsonze/deicsonze.so
+./synti/deicsonze/CMakeLists.txt
+./synti/deicsonze/deicsonzegui.ui
+./synti/deicsonze/deicsonzegui.h
+./synti/deicsonze/ARCH_ALIN
+./synti/deicsonze/deicsonzegui.cpp
+./synti/deicsonze/deicsonzepreset.h
+./synti/deicsonze/deicsonze.cpp
+./synti/deicsonze/deicsonze.h
+./synti/deicsonze/deicsonzepreset.cpp
+./synti/deicsonze/ui_deicsonzegui.h
+./synti/Makefile
+./synti/fluidsynth
+./synti/fluidsynth/TODO
+./synti/fluidsynth/Makefile
+./synti/fluidsynth/fluidsynthgui.ui
+./synti/fluidsynth/fluidsynthgui.cpp
+./synti/fluidsynth/CMakeLists.txt
+./synti/fluidsynth/fluidsynth.so
+./synti/fluidsynth/README.txt
+./synti/fluidsynth/fluidsynti.cpp
+./synti/fluidsynth/fluidsynti.h
+./synti/fluidsynth/fluidsynthgui.h
+./synti/fluidsynth/ui_fluidsynthgui.h
+./synti/fluid
+./synti/fluid/Makefile
+./synti/fluid/fluidgui.h
+./synti/fluid/fluid.cpp
+./synti/fluid/fluidgui.ui
+./synti/fluid/CMakeLists.txt
+./synti/fluid/fluid.h
+./synti/fluid/ui_fluidgui.h
+./synti/fluid/fluid.so
+./synti/fluid/fluidgui.cpp
+./synti/organ
+./synti/organ/Makefile
+./synti/organ/organgui.ui
+./synti/organ/organgui.cpp
+./synti/organ/CMakeLists.txt
+./synti/organ/organgui.h
+./synti/organ/ui_organgui.h
+./synti/organ/organ.h
+./synti/organ/organ.cpp
+./synti/organ/organ.so
+./synti/CMakeLists.txt
+./synti/simpledrums
+./synti/simpledrums/Makefile
+./synti/simpledrums/simpledrumsgui.cpp
+./synti/simpledrums/ssplugin.h
+./synti/simpledrums/README
+./synti/simpledrums/ssplugingui.h
+./synti/simpledrums/ssplugingui.cpp
+./synti/simpledrums/simpledrumsguibase.ui
+./synti/simpledrums/ssplugin.cpp
+./synti/simpledrums/sspluginchooserbase.ui
+./synti/simpledrums/common.h
+./synti/simpledrums/simpledrums.h
+./synti/simpledrums/simpledrums.cpp
+./synti/simpledrums/COPYING
+./synti/simpledrums/ReleaseNotes.txt
+./synti/simpledrums/simpledrumsgui.h
+./synti/libsynti
+./synti/libsynti/Makefile
+./synti/libsynti/mess.cpp
+./synti/libsynti/gui.h
+./synti/libsynti/libsynti.a
+./synti/libsynti/CMakeLists.txt
+./synti/libsynti/poly.cpp
+./synti/libsynti/mpevent.cpp
+./synti/libsynti/mono.cpp
+./synti/libsynti/mpevent.h
+./synti/libsynti/evdata.h
+./synti/libsynti/mess.h
+./synti/libsynti/mono.h
+./synti/libsynti/poly.h
+./synti/libsynti/gui.cpp
+./README
+./grepmidi
+./grepmidi/Makefile
+./grepmidi/grepmidi
+./grepmidi/CMakeLists.txt
+./grepmidi/grepmidi.cpp
+./CMakeLists.txt
+./Reference
+./config.h
+./config.h.in
+./AUTHORS
+./midiplugins
+./midiplugins/Makefile
+./midiplugins/metronom
+./midiplugins/metronom/metronom.cpp
+./midiplugins/metronom/metronomgui.cpp
+./midiplugins/metronom/metronom.h
+./midiplugins/metronom/metronomgui.h
+./midiplugins/metronom/metronomgui.ui
+./midiplugins/transform
+./midiplugins/transform/transform.cpp
+./midiplugins/transform/transform.h
+./midiplugins/transform/transform.ui
+./midiplugins/libmidiplugin
+./midiplugins/libmidiplugin/mempi.h
+./midiplugins/libmidiplugin/mpevent.cpp
+./midiplugins/libmidiplugin/mpevent.h
+./midiplugins/libmidiplugin/evdata.h
+./midiplugins/libmidiplugin/mempi.cpp
+./midiplugins/filter
+./midiplugins/filter/filtergui.cpp
+./midiplugins/filter/filterbase.ui
+./midiplugins/filter/ctrlcombo.h
+./midiplugins/filter/filtergui.h
+./midiplugins/filter/filter.h
+./midiplugins/filter/filter.cpp
+./midiplugins/filter/ctrlcombo.cpp
+./.mops,
+./packaging
+./packaging/muse_icon.png
+./packaging/muse_mdk.spec
+./ChangeLog
+./Doxyfile.in
+./plugins
+./plugins/Makefile
+./plugins/CMakeLists.txt
+./plugins/freeverb
+./plugins/freeverb/revmodel.cpp
+./plugins/freeverb/Makefile
+./plugins/freeverb/allpass.h
+./plugins/freeverb/CMakeLists.txt
+./plugins/freeverb/freeverb.cpp
+./plugins/freeverb/comb.h
+./plugins/freeverb/revmodel.h
+./plugins/freeverb/readme.txt
+./plugins/freeverb/tuning.h
+./plugins/freeverb/denormals.h
+./plugins/freeverb/freeverb.so
+./COPYING
+./Doxyfile
diff --git a/muse/.mops, b/muse/.mops,
new file mode 100644
index 00000000..2275080f
--- /dev/null
+++ b/muse/.mops,
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+rm `find . -name "ui_*.h"`
+rm `find . -name "*.a"`
+rm `find . -name "*.so"`
+
+
+find . > files
+
diff --git a/muse/.qped b/muse/.qped
new file mode 100644
index 00000000..47cd32d1
--- /dev/null
+++ b/muse/.qped
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<Ped version="1.0">
+ <Status>
+ <geometry x="0" y="0" w="800" h="990" />
+ <Editor1>
+ <KontextList>
+ <Kontext>
+ <path>/home/ws/projects/muse/svn/trunk/muse/files</path>
+ <column>0</column>
+ <line>78</line>
+ <xoff>0</xoff>
+ <yoff>1</yoff>
+ </Kontext>
+ <cur>1</cur>
+ </KontextList>
+ <KontextList>
+ <Kontext>
+ <path>/home/ws/projects/muse/svn/trunk/muse/mops</path>
+ <column>26</column>
+ <line>2</line>
+ <xoff>0</xoff>
+ <yoff>2</yoff>
+ </Kontext>
+ </KontextList>
+ </Editor1>
+ <search>Make</search>
+ <colorify>0</colorify>
+ <brackets>1</brackets>
+ </Status>
+ </Ped>
diff --git a/muse/AUTHORS b/muse/AUTHORS
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/muse/AUTHORS
diff --git a/muse/CMakeLists.txt b/muse/CMakeLists.txt
new file mode 100644
index 00000000..0457b9dd
--- /dev/null
+++ b/muse/CMakeLists.txt
@@ -0,0 +1,165 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+project(muse)
+
+include ( ${PROJECT_SOURCE_DIR}/cmake/UsePkgConfig1.cmake )
+
+option ( ENABLE_DSSI "enable Disposable Soft Synth Interface" ON)
+option ( ENABLE_VST "enable VST/win support" OFF)
+option ( ENABLE_FLUID "enable fluidsynth softsynth plugins" ON)
+
+set(CMAKE_VERBOSE_MAKEFILE ON)
+set(QT_USE_QTXML TRUE)
+set(QT_USE_QTDESIGNER TRUE)
+
+find_package(Qt4)
+include(${QT_USE_FILE})
+
+##
+## find doxygen
+## TODO
+
+##
+## alsa >= 0.9.0
+##
+
+PKGCONFIG (alsa 0.9.0 ALSA_INCDIR ALSA_LIBDIR ALSA_LIB ALSA_CPP )
+if (NOT ALSA_INCDIR)
+ message(FATAL_ERROR "Fatal error: ALSA >= 1.0.0 required")
+endif (NOT ALSA_INCDIR)
+
+##
+## find sndfile >= 1.0.0
+##
+
+PKGCONFIG (sndfile 1.0.0 SNDFILE_INCDIR SNDFILE_LIBDIR SNDFILE_LIB SNDFILE_CPP )
+if (NOT SNDFILE_INCDIR)
+ message(FATAL_ERROR "Fatal error: libsndfile >= 1.0.0 required")
+endif (NOT SNDFILE_INCDIR)
+
+##
+## find libsamplerate >= 0.1.0
+##
+
+PKGCONFIG (samplerate 0.1.0 SAMPLERATE_INCDIR SAMPLERATE_LIBDIR SAMPLERATE_LIB SAMPLERATE_CPP )
+if (NOT SAMPLERATE_INCDIR)
+ message(FATAL_ERROR "Fatal error: libsamplerate >= 0.1.0 required")
+endif (NOT SAMPLERATE_INCDIR)
+
+##
+## find jack >= 0.98.0
+##
+
+PKGCONFIG (jack 0.98.0 JACK_INCDIR JACK_LIBDIR JACK_LIB JACK_CPP )
+if (NOT JACK_INCDIR)
+ message(FATAL_ERROR "Fatal error: JACK >= 0.98.0 required")
+endif (NOT JACK_INCDIR)
+
+##
+## check for dssi
+##
+
+if ( ENABLE_DSSI )
+ PKGCONFIG (dssi 0.9.0 DSSI_INCDIR DSSI_LIBDIR DSSI_LIB DSSI_CPP )
+ if (NOT DSSI_INCDIR)
+ message("Error: dssi >= 0.9.0 not found, disabling feature")
+ set ( ENABLE_DSSI OFF )
+ endif (NOT DSSI_INCDIR)
+endif ( ENABLE_DSSI )
+
+##
+## vst
+##
+## TODO
+##
+
+##
+## check for fluidsynth
+##
+
+if ( ENABLE_FLUID )
+ PKGCONFIG (fluidsynth 1.0.0 FLUID_INCDIR FLUID_LIBDIR FLUID_LIB FLUID_CPP )
+ if (NOT FLUID_INCDIR)
+ message("Error: fluidsynth >= 0.9.0 not found, disabling feature")
+ set ( ENABLE_FLUID OFF )
+ endif (NOT FLUID_INCDIR)
+endif ( ENABLE_FLUID )
+
+#
+# produce config.h file
+#
+configure_file (
+ ${PROJECT_SOURCE_DIR}/config.h.in
+ ${PROJECT_BINARY_DIR}/config.h
+ )
+
+add_custom_target(all-pic.h
+ ALL
+ cp ${PROJECT_SOURCE_DIR}/all.h ${PROJECT_BINARY_DIR}/all-pic.h
+ DEPENDS ${PROJECT_SOURCE_DIR}/all.h
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ )
+
+add_custom_target(all.h.pch
+ ALL
+ ${CMAKE_CXX_COMPILER}
+ -g -Wextra -fno-exceptions -fno-rtti -Wall
+ -I/usr/qt4/include
+ -I/usr/qt4/include/QtCore
+ -I/usr/qt4/include/QtGui
+ -o ${PROJECT_BINARY_DIR}/all.h.pch
+ ${PROJECT_SOURCE_DIR}/all.h
+ DEPENDS ${PROJECT_SOURCE_DIR}/all.h
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ )
+
+add_custom_target(all-pic.h.pch
+ ALL
+ ${CMAKE_CXX_COMPILER}
+ -fPIC
+ -g -Wextra -fno-exceptions -fno-rtti -Wall
+ -I/usr/qt4/include
+ -I/usr/qt4/include/QtCore
+ -I/usr/qt4/include/QtGui
+ -o ${PROJECT_BINARY_DIR}/all-pic.h.pch
+ ${PROJECT_BINARY_DIR}/all-pic.h
+ DEPENDS ${PROJECT_BINARY_DIR}/all-pic.h
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ )
+# add_dependencies(all-pic.h.pch all-pic.h)
+
+set(CMAKE_CXX_FLAGS
+ "-g -Wall -Wextra -Winvalid-pch -fno-exceptions -fno-rtti"
+ )
+
+subdirs(al awl grepmidi plugins midiplugins synti muse)
+
+include_directories(
+ .
+ ${CMAKE_CURRENT_BINARY}
+ ${PROJECT_SOURCE_DIR}
+ ${PROJECT_SOURCE_DIR}/muse
+ ${PROJECT_SOURCE_DIR}/muse/widgets
+ ${ALSA_INCDIR}
+ ${JACK_INCDIR}
+ ${SNDFILE_INCDIR}
+ ${SAMPLERATE_INCDIR}
+ )
diff --git a/muse/COPYING b/muse/COPYING
new file mode 100644
index 00000000..d60c31a9
--- /dev/null
+++ b/muse/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) 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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. 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.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+ 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
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This 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 Library General
+Public License instead of this License.
diff --git a/muse/ChangeLog b/muse/ChangeLog
new file mode 100644
index 00000000..6fe21161
--- /dev/null
+++ b/muse/ChangeLog
@@ -0,0 +1,2405 @@
+23.4 (ws)
+ * fix obscure "off by one" bug in arranger ruler bar numbering
+22.4 (ws)
+ * fixed software synthesizer regressions
+ * return zeroed buffer if audio input strip is "off"
+ * mixer strips in arranger: dont show vertical space used
+ for horizontal alignment in mixer view
+21.4 (ws)
+ * fix "aux send" audio strips
+ * fixed performance problem when redrawing canvas in play
+ mode (using QRegion instead of QRect results in 100% cpu load)
+20.4 (ws)
+ * remove StatusBar widget from musebase.ui
+24.3 (aw)
+ * velocity of a pressed key on the virtual keyboard depends on x
+12.1 (ws)
+ * dont allow movement of events in midi editors beyond left part
+ margin
+ * small fixes to midi editors: ctrl-click, ctrl+shift drag etc.
+ * restrict event moves in midi editors to positions >= 0 to avoid
+ crashes
+6.2 (ws)
+ * added man files
+5.2 (ws)
+ * new: "auto fill" parts
+3.2 (ws)
+ * fix mute instrument in drum editor
+ * fix eraser tool in midi editors
+ * left/right buttons in arranger didn't work
+ * fix Del shortcut in arranger
+ * fix: shift click in time ruler added two marker
+1.2 (ws)
+ * fix tempo entry in transport window
+ * add TempoEdit and TempoLabel to Qt designer widget lib
+ * misc fixes and updates to master editor
+ * corner widget for arranger
+ * various small painting fixes in controller editor
+ (aw) DeicsOnze
+ * add quick attack, release and modulation control
+ * add choose number of voices 1 to 64
+ * add choose input channel number
+ * add save, save as default and load configuration
+ * fix note off bug (but maybe not completly)
+ * add initial load set path in configTab
+ * replace ARCH_ALIN by SutulaBank.dei
+ * delete redundant presets (2000 presets -> 1457 presets)
+28.1 (ws)
+ * make tool selection in midi editors persistent
+ * add "draw tool" to arranger available tools
+ * add "draw tool" to drum editor available tools
+ * implement "draw tool" for controller editor
+27.1 (ws)
+ * implement "single pitch velocity controller" for drum editor
+ * misc gui updates for pianoroll and drum editor
+26.1 (ws)
+ * track "clone" function for wave tracks
+ * cut&past of event lists for drum editor and pianoroll editor
+ * add "delta mode" changes for drum editor
+ * fix selection mechanism in drum editor
+ * reclaim JACK time master; qjackctrl now shows bar/beat/tick and
+ tempo
+ * snap locator positioning to raster
+25.1 (ws)
+ * replace FILE with QFile
+ * Xml class is now based on QTextStream
+ * fix functions in drumedit
+ * fix shortcuts in pianoroll and drumedit
+24.1 (ws)
+ * lots of small usability fixes
+ * use Qt property system to organize save/restore of toplevel
+ properties
+23.1 (ws)
+ * extend Part with editor properties
+ * make initial values of editors configurable
+ * removed GraphMidiEditor and ExtMidiEditor, replaced with MidiEditor
+ * removed MidiPart and WavePart, replaced with Part
+ * midi editor: events can only be created inside of current part
+22.1 (ws)
+ * highlight area of current part in midi editors
+21.1 (ws)
+ * remove unconnected wave files on exit
+19.1 (ws)
+ * implement remove part with eraser tool in arranger
+ * implement local double buffering for TimeCanvas, which is
+ for unknown reason still faster than the Qt provided
+18.1 (ws)
+ * much faster drawing with Qt::WA_PaintOnScreen widget flag
+ * New implementation of audioprefetch fifo, hopefully more
+ robust. Old implementation could not deal well with
+ fifo underflows.
+17.1 (ws)
+ * make trackinfo and mixerstrip in arranger persistent
+ * fix display of cursor mark in ruler
+ * fix buffer management for audio input strips
+16.1 (ws)
+ * overhaul audio routing & processing; this hopefully fixes
+ several routing problems
+14.1 (ws)
+ * treat a midi recording as on undoable event
+ * compute the right realtime priorities for the midi thread
+ and the watchdog thread depending on JACK priority. Unfortunately
+ a lot of code had to be changed for this mainly because you can
+ get the JACK realtime priority only if the JACK client thread is
+ already running (e.g. on the first jack callback).
+ (rj)
+ * Added support for drag&drop of plugins in plugin-rack
+13.1 (ws)
+ * implement mute buttons for drum editor instruments
+ * small gui alignments in arranger
+ * fix rubber tool in pianoroll editor and drum editor
+ * fix: arranger scissor tool
+ (rj)
+ * handle jack disconnection
+ * minor timer changes
+12.1 (ws)
+ * fix filtering of MidiInput strips in Mixer
+ * a lot of small fixes and cleanups
+11.1 (ws)
+ * more code for miditrack track info
+ * implement mixer strip and track info as dockable widgets
+ * fix background image for arranger canvas
+10.1 (ws)
+ * grab focus when dragging in arranger ruler
+ * fix: attempt to draw part on empty arranger canvas
+ * implemented the Qt resource system; moved *.png files to
+ resource file (muse icon & splash screen)
+ * added two top level files:
+ - TODO
+ - Reference, should countain a list of implemented
+ features
+9.1 (ws)
+ * fix qt4 detection in m4/qt.m4
+8.1 (ws)
+ * fix midi recording: added missing timestamps for event types other
+ than note on/off
+ * install libawlplugin.so at $(pkglibdir)/designer; let MusE look at
+ that path; to use QT Designer to generate new ladspa guis,
+ libawlplugin.so and libawlplugin_debug.so must be copied manually to
+ $QTDIR/plugins/designer
+ * drumeditor: highlight current instrument
+ * fix crash in drumeditor when opening controller panel
+ * treat double click on drumeditor instrument name as mouse click
+ (rj)
+ * Added plugin gui 1436, and changed plugin gui for 1050 and 2142
+ * Added ability for gui-factory to iterate child objects for
+ frames
+7.1 (ws)
+ * several fixes for drum editor
+ * when clicking on instrument name in drumeditor, play note similar
+ to pianoroll editor
+ * implement mouse wheel for tracklist in arranger and in TimeCanvas
+6.1 (ws)
+ * compile awl lib with -fPIC. This allows linking with dll's (as the
+ deicsonze synth plugin) on 64 bit systems
+ (rj)
+ * fix for automation-data in song, now stored without using locale
+4.1 (ws)
+ * more robust handling of audioprefetch for seeking while play
+4.1 (aw)
+ * Qt4 port for DeicsOnze load presets
+ * add brightness controler in DeicsOnze
+3.1 (rj)
+ * fixed search box in plugin dialog
+2.1 (ws)
+ * fix recording of note off events when part does not start at zero
+31.12 (ws)
+ * fixes for audio prefetch thread
+30.12 (ws)
+ * automatic peak reset in mixer meter display; new config parameter
+ "peak hold time"
+ (aw)
+ * DeicsOnze Qt4 port completed
+29.12 (ws)
+ * fix save/restore of track mute flag
+ * more drawing properties for Awl::Knob
+ * more widgets for libawlplugin.so: PanKnob, MidiPanKnob
+ * fix Awl::Knob drawing
+ (aw)
+ * DeicsOnze Qt4 popup menu port
+27.12 (aw)
+ * Qt4 port for DeicsOnze in progress
+26.12 (ws)
+ * add debug version libawlplugin_debug.so
+ * return of the libawlplugin.so for qt designer
+21.12 (ws)
+ * pianpercu.deioroll: fixes for event editing
+20.12 (ws)
+ * make dssi compilable again
+ * draw tick marks in meter slider
+19.12 (ws)
+ * implement smooth nonlinear xmag for time canvas
+ * software synthesizer are playable again with pianoroll keyboard
+ * fix drawing of pianoroll events, when time axis is frames instead of
+ ticks
+ * fix drawing of clock ruler
+ * fix drawing of pianoroll event when using pencil tool
+ * remove obsolete givertcap and suid install options
+18.12 (ws)
+ * fix reading sysex for eventList, this enables synti state restore
+ * changed recordFlag semantic for wave tracks: if recordFlag is on,
+ the channel meter shows the input signal
+ * allow record toggle only when in stop state
+17.12 (ws)
+ * align recorded parts to arranger snap values
+ * fix wave display in arranger parts
+ * reorganized and simplified audio record flag handling, fixing some
+ audio recording bugs
+ * audio fifo: changed write fifo handling
+ * added "atomic" counter for x86_64 architecture; removing generic
+ mutex version which is not suitable for realtime operation
+16.12 (ws)
+ * added new thread "audiowriteback" which is exclusive responsible for
+ writing all recorded audio data
+ * make all syntis compilable & loadable
+15.12 (ws)
+ * fixed bug in audio write fifo handling: sometimes audio blocks were
+ not written to disk
+12.12 (ws)
+ * removed obsolete "Toplevel" class
+10.12 (ws)
+ * port master track (tempo track) editor to qt4
+7.12 (ws)
+ * fix "config midi file export"
+ * port "configure shortcut dialog" to qt4
+ * arranger canvas background color and pixmap are configurable again
+6.12 (ws)
+ * fix start help browser
+ * fix "about" box
+ * fix song loading: midi channel track sometimes appears twice
+ in arranger track list
+5.12 (ws)
+ * midi sync: interpret mmc messages in slave mode
+ * move undo/redo processing to midi sequencer context to prevent
+ seg fault on "redo delete midi input"
+ * fix undo/redo delete track
+ * fix for dragging tracks in arranger track list
+ * fix for midi input: out routing
+ * second attempt to fix seg fault when removing midi input track
+4.12 (ws)
+ * continue playing a track if record button for track is switched on
+ * do not reset track record buttons on stop
+ * fix seg fault when removing midi input track
+2.12 (ws)
+ * start the watchdog thread with realTimePriority+1 to be more
+ set_rtlimit friendly
+ * changed default realTimePriority to 70
+ * fix: controller subtracks for midi channel got lost on song load
+29.11 (ws)
+ * make midi channel controller editable in midi track context
+ * port arranger part colors
+ * fix configuration of tracklist colors
+28.11 (ws)
+ * proper align top labels in mixer strip
+ * with the help of trolltech, setting the label background does
+ work again
+ * more fiddling with geometry management in arranger mixer view
+25.11 (ws)
+ * ia64 fix for fastlog.h
+ * misc changes to make valgrind happy
+ * some ia64 compilation fixes
+24.11 (ws)
+ * found out how to create menu titles in qt4, added to mixer routing
+ menus
+23.11 (ws)
+ * unify creating controller list in ctrl/ctrleditor.c
+ * enable tempo and timesig editing in transport
+ * new class TimeSignature in AL
+21.11 (ws)
+ * ported "fluid" synth to qt4
+ * cosmetic changes in arranger track list
+ * small fixes in drawing slider handle
+20.11 (ws)
+ * fix: dont create two audio parts per recording
+18.11 (ws)
+ * remember only path of last imported wave file in lastWavePath
+ * fixes for audio routing to jack
+17.11 (ws)
+ * port midi input filter to qt4
+ * extended info in midi channel info: show midi port values
+ * added template for missing midisynth trackinfo
+ * implement midi master volume (port volume)
+ * more easy slider dragging: you dont have to hit the slider knob
+ * when creating a new midi track, show also midi channel of default
+ route
+ * when creating a new midi track, add default routes to all midi
+ inputs
+ * in function "copy track": dont add default route to new midi track
+16.11 (ws)
+ * reanimate midi metronom plugin
+ * if imported midifile is type GM/GS or XG, this overrides the
+ configured preferred instrument
+ * fix for arranger tracklist layout manager
+ * fix buildsystem for non debug build
+ * make routing more robust; dont crash if configured route does
+ not exist
+15.11 (ws)
+ * fix Route()== operator
+ * fix: insert new tracks at right position
+ * new Function "copy track" in arranger tracklist context menu
+ * new config values for global settings to set preferences
+ for midi input and output. This preferences should allow to play
+ midi files without editing:
+ - create midi input strip when loading a midi file
+ - connect all input devices to created midi input strip
+ - connect all midi tracks to created input strip
+ - default midi input port
+ - default midi output port
+14.11 (ws)
+ * arranger file list: switch back to normal state after drag & drop
+ operation
+ * fix crash when removing selected track in arranger
+ * added (non working) code for posix timer (exploring the
+ hi resolution timer patch). It looks that the timer code interferes
+ with QT-timers.
+12.11 (ws)
+ * fix: sequencer running far too fast before first seek
+ * fix crash on song load: properly stop sequencer before loading
+ * controller view: show "current value line" (shown when automation
+ mode READ is off) even if there are no controller events
+ * fix: remove controller events with right button mouse click
+ * new: update wave parts while recording
+11.11 (ws)
+ * removed obsolete cmdAddRecordedEvents()
+ * make controller track height in arranger persistent
+10.11 (ws)
+ * Yamaha-S90.idf fix
+ * misc fixes to controller editing
+ * optimize event drawing in pianoroll editor
+ * first build muse/ctrl then muse/arranger
+ * pianoroll editor: while dragging an event, repaint of all following
+ events was missing
+9.11 (ws)
+ * controller painting is now done in new class CtrlEditor
+ * ported midiplugin "metronom" to qt4
+8.11 (ml)
+ * fixed drawing of events in pianoroll - not all fishes in the pond yet however
+8.11 (ws)
+ * start to merge controller handling in arranger and midieditor
+ * removed more widgets from TLWidget and TLSWidget simplifying the
+ widget tree;
+7.11 (ws)
+ * removed obsolete files cswidget.h cswidget.cpp
+ * removed SFrame() class from arranger (sframe.cpp, sframe.h)
+6.11 (ws)
+ * when reading arranger splitter sizes from *.med file, assure that
+ splitter size for mixer strip and info panel are not zero to avoid
+ weird geometry manager behaviour
+ * fix midi input filter
+ * fix midi plugin dialog
+ * fix a typo in part drag
+5.11 (ws)
+ * fix: make sure to send all note offs at loop end
+ * fix on/off switch in track list
+ * fix initial state of mute buttons in mixer
+ * make controller number in arranger subtrack persistent
+ * fixed handling of patch groups in populatePatchPopup()
+ * fix problem with instrument patch name in TrackInfo
+ * make Splitter sizes in Arranger persistent
+ * do not send *.idf configured instrument initialization for every
+ channel, send only once for every midi port
+ * make midi channel controller available to midi track
+ * fix controller selection in arranger
+ * added "auto repeat" to forward and rewind buttons
+ * fix: update track list widget geometry after config change
+ * fix: "follow" function can also move canvas backwarts
+ * fix: also move slider when "follow" function decides to move canvas
+ * ConfigTrackList: connect OK and Cancel buttons
+4.11 (ws)
+ * stage2 of qt4 port effort: all qt3 compatibility flags/libs are now
+ removed; a lot of functionality is commented out and will be
+ activated again in further updates
+3.11 (ws)
+ * fix "bounce to track" (record button in audio out mixer strip)
+ * fix BigTime display
+2.11 (ws)
+ * new: drag wave files to arranger canvas (into wave tracks)
+ * fix moving parts between tracks
+ * fix right mouse click context menu in arranger track list
+ * start track drag in arranger track list after QApplication::startDragDistance()
+ mouse move or QApplication::startDragTime() is elapsed
+ * added hack to get arbitrary background colors for QLabel widgets
+ * fix: disable ymag in arranger
+ * make follow mode actions checkable
+ * save followMode enum in global configuration file
+ * implemented follow mode in TimeCanvas()
+ * moved followMode flag from Song() to TimeCanvas()
+ * dont create MidiChannel tracks during song load
+ * replaced configtrackbase.ui3 by configtrackbase.ui
+1.11 (ws)
+ * fix display of active key in pianoroll keyboard
+ * adjust song len at end of recording
+ * fixed geometry management of arranger track list
+ * fixed reading of midi parts in songfile
+ * fixed transport states handling
+ * fixed midi recording: save note velicity and controller position
+31.10 (ws)
+ * new: update midi parts and events while recording
+
+12.10 (ws)
+ * many changes all over the code:
+ - eleminated old View->Canvas classes and replaced with
+ TimeCanvas
+ - TimeCanvas now has a button to switch between "metronom view"
+ (measure/beat/tick) and "clock view" (min/sec)
+ - update arranger and drum editor for metronom/clock view
+24.09 (ws)
+ * fixes for pianoroll editor and drum editor
+23.09 (ws)
+ * rename all *.ui files to *.ui3 to prepare for porting to native
+ qt4
+ * some arranger fixes (PartCanvas/TimeCanvas)
+22.9 (ws)
+ * new widget hierarchy for arranger
+ * the big port to qt4 (chunk 1)
+12.9
+ * moved muse.pro to top directory (ws)
+21.9
+ * added continuous update of _nextPlayEvent in order to not delete
+ events that should be played in future process-calls (ml)
+18.9
+ * plugin gui now updated in automation read mode (ml)
+7.8
+ * ported waveeditor fixes from 0.7 to head (ml)
+6.8.
+ * fixed midioutput process erase event bug, added midiport output routing (ml)
+29.7.
+ * Fixed autoconf bug, unable to build without fluidsynth.h (rj)
+ * Added raise() for several configuration dialogs that only open
+ one instance. (rj)
+17.7. (ws)
+ * implemented direct routing from midi input port to synti
+ * implemented input routing button for synti mixer strip
+ * when creating software synti add default route from
+ first midi port output to synti midi input
+ * remove all routes when deleting software synthesizer
+16.7. (ws)
+ * fixed bug in midi pipeline (loosing midi events)
+ * fixed routing to software synthesizer
+ * implemented meter display for MidiChannel and MidiPort
+ * fix MidiInPort initialization
+ * audio routing fix
+ * make functions in MempiHost virtual, so they can be acessed by midi
+ plugin with MempiHost class pointer
+ * remove awl dependency pitch2string() from midi plugin "transform"
+ * fixed initial _offset in CanvasWidget
+14.7
+ * Updated DeicsOnze to version 0.3 (aw)
+ - added change color config
+ - fixed bug load bank and prog number conflict
+ - added amplitude and pitch envelope graph
+ - fixed wrong oscWave in algo7-8 noticed by Dave Beanie
+ - fixed bug delete
+ - fixed bug selection when more than 20 presets
+ - added pics in the combo boxes for algorithm, OSC and LFO wave
+ - added save & load in the MusE project
+13.7
+ * Added patches from Daniel Kobras to correct error in listeditor and
+ erros in old html docs. (rj)
+ * Added uppercase filters to midi import (rj)
+12.7
+ * Added quick search to LADSPA plugin dialog (rj)
+04.7.
+ * Added Idf files by Steve D for Roland FantomXR, SRX-02 and SRX-09 (rj)
+
+21.06.
+ - do not link plugins against libaw and libawl (ws)
+14.6.
+ - increase EVENT_FIFO_SIZE from 32 to 128
+ - default to not show midi tracks in mixer
+ - implement missing "showMidiSyntiPorts" tag when reading *.med files
+ - after loading a midi file (*.mid), dont overwrite with *.med xml file
+ when pressing "save", instead call "save as"
+ - implement midi metronom as "midi synthesizer" plugin
+ - midi synthesizer plugin interface
+26.5.
+ * *.idf files now allow definition of drum maps for patches
+ overriding the default GM drum map (ws)
+24.5.
+ * added Roland E-28 idf file from Jonathan Woithe (rj)
+23.5.
+ * converted "midi input transform" into midi plugin (ws)
+16.5.
+ * handle identical alsa midi port names (ws)
+ * Updated ladspa-gui for newer version of tap-reverb (rj)
+12.5.
+ * new midi plugin infrastructure ("MEMPI") (ws)
+6.5
+ * added a second configurable mixer (ws)
+4.5
+ * removed non functional LADCCA support (ws)
+3.5
+ * removed settings->midiPorts dialog (ws)
+ * more updates to midi routing (ws)
+1.5
+ * simpledrums: fixed issue with clearing of sampledata, I hope (ml)
+30.4
+ * fluidsynth: bankno is saved to project, switched to hbank from lbank (ml)
+29.4
+ * major update: (ws)
+ * new midi routing code
+ * new track types for midi input and output
+ * Added Yamaha-PSR275 instrument file by Petr Mazanec (rj)
+27.4
+ * fixed patch-info issue in Fluidsynth (bug 1191214) (ml)
+26.4
+ * added framework for design&implementation manual (ws)
+25.4
+ * update mixer, when midi channel changes (ws)
+18.4
+ * removed file ltmain.sh; this file is now created by "libtoolize"
+ command in autogen.sh (ws)
+17.4
+ * Re-added handling of different ports than normal when using drumtracks (ml)
+16.4
+ * Fixed bug 1152441, filename can now have several dots (ml)
+ * Fixed bug 1183980: fluidsynth pitch controller wasn't given to MusE from the synth (ml)
+28.3
+ * Temporary fix for raster in the arranger, would be better to have unified handling for raster-values (ml)
+ * Fixed internationalization for shortcuts + misc shortcut work (ml)
+ * Added fix from 0.7-branch for midi import problem w overflow (ml)
+27.3
+ * Bugfix for mapping of drumtrack record data (ml)
+ * Fixed softsynth crackle bug, removed things that appears to be unused in MessSynthIF::getData (ml)
+26.3
+ * More controller-pane fixes + fixes for the editor settings (ml)
+25.3
+ * Some updates on the controller-pane (when used in the pianoroll) (ml)
+12.3
+ * Midi clock slave-sync improvements added from 0.7-branch (ml)
+27.2
+ * fix midi recording regression (wrong timestamp()) (ws)
+ * add hack to fst to enable newer wine libraries (ws)
+26.2
+ * Added Roland-SCD70.idf from Emiliano Grilli (rj)
+12.2
+ * DeicsOnze : numerous and names following the internal changes
+ * DeicsOnze : communication deicsonze<->deicsonzegui with midi events
+ * DeicsOnze : Communication with MusE for automation
+09.2
+ * fixed bug with sending start play w/ midi-clock (rj)
+26.1
+ * new cmd line option "-m MIDI only mode"; renamed options:
+ "-i trace midi input", "-o trace midi output" (ws)
+21.1
+ * DSSI synth plugin framework (ws)
+20.1
+ * fixed LADSPA default value calculation for ranges dependend
+ on LADSPA_HINT_SAMPLERATE (ws)
+19.1
+ * added automation for plugins (ws)
+18.1
+ * fixed track renaming in arranger (ws)
+ * some L&F changes in arranger window (ws)
+ * fixes in midi controller handling (ws)
+17.1
+ * DeicsOnze : category, subcategory, preset organized following
+ hbank, lbank, prog (aw)
+ * DeicsOnze : add popup menu to new, delete, load and save (aw)
+ * DeicsOnze : add load method for preset and subcategory (aw)
+14.1
+ * enable/disable controller objects in ChannelInfo and Mixer
+ according to automation status (ws)
+ * change name of config file to contain release version; this
+ allows for different MusE versions installed parallel (ws)
+ * added OK/Cancel to Midi Input Filter dialog (ws)
+ * remove DRUM track type. Drum tracks are now ordinary midi tracks
+ with toggle "useDrumTrack" switched on (ws)
+ * new "Monitor" button which resembles old "midiTrough" functionality.
+ Midi Input to a track is echoed to the track output device, if
+ "Monitor" is switched on. This is independent of the track record
+ status.
+ * patch from Erwin Scheuch-Heilig to allow for libtool >= 1.4 (ws)
+13.1
+ * removed defunct clip list editor (ws)
+ * removed redundant master list editor (ws)
+ * removed obsolet key.c key.h (ws)
+ * new libray al as base lib for awl (ws)
+ * renamed awl include files (ws)
+12.1
+ * added hex/dec switch to list editor (ws)
+ * added named SysEx strings to midi instrument definition file (idf)
+ for use with list editor (ws)
+ * removed midi "song type" (ws)
+11.1
+ * added updated muse.pro and muse_ru.ts from Alexandre Prokoudine (ws)
+10.1
+ * ZynAdd instrument def file added (ml)
+7.1
+ * add icons for selection operations in pianoroll editor (ws)
+ * update song len after manipulating part in arranger (ws)
+ * initialize horizontal magnification in arranger for new song (ws)
+ * use snap value when drawing new part in arranger (ws)
+ * more code for list editor (ws)
+5.1
+ * Changes to the list editor (ws)
+2.1
+ * Drumeditor static default init settings added for width, height, quant + raster (ml)
+ * Missing kbd shortcut initialization for undo+redo added to listedit (ml)
+ * Pianoroll static default init settings added for width, height, quant + raster (ml)
+ * Mastertrack listeditor updates ported from REL07 (ml)
+25.12
+ * shortcuts in arranger on their way back (ml)
+23.12.
+ * fixed: controller panes in pianoroll editor are not resizable
+ after MusE restart anymore (ws)
+22.12.
+ * unify controller editing in arranger and pianoroll window (ws)
+18.12.
+ * changed backup logic: 1. write temp file
+ 2. rename name to backup name 3. rename temp file to name
+ Step 2 i only performed once per session/songfile.
+ * changed install path for from $prefix/share/muse/ to
+ $prefix/share/muse-0.8/ and from $prefix/lib/muse to
+ $prefix/lib/muse-0.8 to allow for parallel installation
+ of old and new MusE versions
+17.12.
+ * added slider for vertical magnification to arranger track list (ws)
+ * added "off" button to arranger track list (ws)
+15.12.
+ * fixed bug #1085738: synth name problems (ws)
+14.12.
+ * horizontal position in arranger is now persistent (ws)
+ * Disable of fluidsynth works (rj)
+ * Added test for libsamplerate (rj)
+ * Reenabled --enable-suid-install (rj)
+ * Added alsa timer (not enabled yet) (rj)
+12.12.
+ * sync again audio prefetch when changing loop markers (ws)
+9.12
+ * Now autogen.sh requires libtool = 1.4, 1.5 does not generate
+ softsynths correctly (rj)
+4.12
+ * Added another IDF from Christoph Eckert for Alesis QSR,QS7 and QS8 (rj)
+1.12
+ * fix import of type 0 midi files (ws)
+ * horizontal magnification in arranger is now persistent (ws)
+30.11
+ * fix midi controller handling (ws)
+ * Added IDF files from Christoph Eckert for Access Virus,
+ Hammond XB and Waldorf Microwave (rj)
+24.11
+ * deicsonze, updates from a-lin
+ * simpledrums, ladspa support and fx-handling added, channel on/off added - no gui
+ for loading effects yet though... (ml)
+18.11
+ * simpledrums, updates & fixes (ml)
+14.11
+ * simpledrums - init data and reinitialization of synth state
+ added (ml)
+09.11
+ * simpledrums resampling of samples added w libsamplerate (ml)
+08.11
+ * Added simpledrums synth (ml)
+01.11
+ * Added Alin Weiller's DeicsOnze synthesizer (ws)
+26.10
+ * loading soundfonts manually adds them to first available
+ channel (ml)
+ * added new shortcuts for proll + drumedit: ctrl+left/rightarrow
+ moves selected events along the timeline by rasterval (ml)
+25.10
+ * changed shortcut texts to use static const array values
+ to make it possible to translate them with Qt linguist (ml)
+ * readded saving of settings on open editors (ml)
+23.10
+ * updates and fixes on settings (ml)
+21.10
+ * added the new CVS splash screen! *muha*
+11.10
+ * changed awl lib for using c++ namespace (ws)
+ * misc updates for automation (ws)
+27.9
+ * new dialog to add/remove midi controller for
+ automation (ws)
+25.9
+ * added metronome volume to "Metronome Config" (ws)
+18.9
+ * Added Alesis-Ion.idf from Sebastian Gutsfeld (rj)
+ * unified midi & audio controller (ws)
+15.9
+ * applied patch from Sebastian Gutsfeld to enable midi NRPN14 and
+ RPN14 type controller (ws)
+ * simplified xml write interface (removed "level") (ws)
+14.9 (ws)
+ * replaced xml reader by Qt dom functions
+ * complete redesign of arranger
+07.09
+ * added Quasimidi-Sirius.idf from Nicolas Jouanne
+ * added icon adapted by Emiliano Grilli ;-)
+31.08
+ * double click on empty effect slot popups "New Plugin" dialog (ws)
+ * updated README.ladspaguis
+ * fixed instrument patch name update in channel info (ws)
+ * added "F" button to configure "follow song" for every pianoroll
+ editor (ws)
+30.08
+ * remove input routing button from synthesizer mixer strip (ws)
+ * add configure options to show only certain track types in
+ mixer (ws)
+ * add "Add Soft Synth" to "CreateTrack" menu in arranger, mixer
+ and tracklist popup (ws)
+ * fixed "prefetch(): invalid write position" bug (ws)
+28.08 (ws)
+ * set caption of main window when importing midi
+ * add midi file types to "load file" file dialog
+ * default for configure ladcca is now "no"
+ * default for configure suid install is now "no"
+ * use awl lib for customized plugin guis (Freeverb 1050.ui and
+ Tap Reverberator 2142.ui)
+ * create designer plugin for awl library
+ * extend awl lib for use with customized plugin guis: new
+ widgets AwlCheckBox and AwlComboBox
+25.08
+ * fixes for ladspa plugin logarithmic sliders (ws)
+ * midi track info is now synchronous with mixer; patch names
+ are working again (ws)
+ * calling jack process() once before starting jack prevents
+ zombification on startup (warming up caches?) (ws)
+24.08
+ * config settings saved for open editors reimplemented (ml)
+ * automatically assign a free midi port to every new
+ created software synthesizer (ws)
+ * midi port configuration can now be reached by right clicking
+ in port column of arranger tracklist (ws)
+ * toggling soft synthesizer gui in arranger tracklist moved to the
+ track name context menu (right click) (ws)
+ * fixed crash on undo "delete vsti track" (ws)
+23.08
+ * doubleclick on volume slider sets value to "off" (ws)
+ * implement toggle behaviour for marker list (ws)
+ * fix crash in list editor - create new controller (ws)
+ * fix crash when vsti synti has more outputs than mixer strip has
+ channels (ws)
+ * increase required JACK version to 0.98.0 (ws)
+21.08
+ * native GUIs for VST plugins (ws)
+20.08
+ * VST plugins (ws)
+19.08
+ * new infrastructure for VST plugins (ws)
+16.08
+ * fix midi import: tick values of tempo/signature
+ and marker events are now properly converted to internal
+ resolution (ws)
+ * fix record flag in midi mixer (ws)
+ * fix awl setEnabled(); disable some more widgets in audio
+ strip in "off" state (ws)
+ * fixed solo & mute for midi in mixer (ws)
+ * fixed midi activity display in mixer (ws)
+ * new awl widgets: AwlMeterSlider(), AwlMidiMeterSlider() (ws)
+ * in automation mode "AutoOff" recorded midi controller volume, pan,
+ reverb send, chorus send and aux send are not send to midi
+ output. (ws)
+14.08
+ * fixes to midi mixer (ws)
+ * fixed project path in file dialogs when MusE has just been started (rj)
+13.08
+ * new configuration flag "useJackFreewheel" Settings->globalSettings
+ (ws)
+ * fix bounce operation (ws)
+12.08
+ * fix stereo/mono switching in audio mixer (ws)
+ * fixed "prefetch: NO BUFFER" warning during recording (ws)
+ * midi mixer + awl library fixes (ws)
+09.08
+ * Added automatic rec-enabling of selected tracks in a hopefully
+ intelligent way (rj)
+02.08
+ * stored editorsettings now saved (ml)
+31.07
+ * more updates on midieditor settings (ml)
+30.07
+ * added default route to output track (ws)
+28.07
+ * optimized mixer gui handling (ws)
+ * added new audio widget library awl, new look for mixer (ws)
+ * fixed core on creating new aux track; bug caused by introduction
+ of new audio metronome (ws)
+27.07
+ * first step against new handling of settings for midieditors w respect to parts (ml)
+21.07
+ * new feature: audio metronome (ws)
+ * reorganized Synth & SynthI classes (ws)
+20.07
+ * updated muse/muse.pro and share/locale files (ws)
+ * Added missing include to vst.cpp (rj)
+18.07
+ ========================================
+ * 0.7.0 tagged ! (rj)
+ ========================================
+ * output fifo warning only if cmd line "-D" switch is set (ws)
+17.07
+ * fixed separate handling of recorded events vs played events (ml)
+15.07.
+ * do not start the disk helper thread in realtime mode (ws)
+ * check for JACK thread really running in SCHED_FIFO mode, if not
+ (as on my system with kernel 2.6.7 and nptl) try to set it. (ws)
+ * removed some exit() and abort() calls to react somewhat more gracefully to
+ to internal errors (ws)
+14.07.
+ * fixed -V (no vst instruments) option (ws)
+ * do not save midi controller information in ~/.MusE file (ws)
+ * another try to fix midi loop handling: Loop len now should be
+ sample accurat. The loop is shifted left at most one audio
+ cycle to meet the requirement of loop end matching audio cycle
+ end. When JACK transport is in "JackTransportStarting" mode,
+ MusE internally continues rolling, so there are no repeated
+ cycles anymore (ws)
+ * Added message boxes when alsa and jack fails to initialize (rj)
+ * Disabled solobuttons in mixer (rj)
+13.07.
+ * added new icons for the mixer solo/mute (js)
+ * added refresh for the solo/mute icons (rj)
+ * added icons for drum-/listeditor in the arranger on rightclick (js)
+12.07.
+ * fixed typo in loop handling (ws)
+ * added patch from Daniel Schmidt to be able to configure
+ MusE without X being available (rj)
+ * Removed geometry data etc from templates (rj)
+11.07.
+ * disabled midi mtc sync as its not implemented; disabled
+ midi sync slave modes as they are currently not working (ws)
+ * enabled sending midi clock (ws)
+28.06.
+ * splitted removeTrack()/insertTrack() into three phases: pre realtime
+ actions - realtime actions - post realtime actions; this allows
+ to move memory allocations out of realtime task (ws)
+ * changed undo/redo of tracks: synti instances are now really deleted on
+ delete track (ws)
+ * jack connection changes with qjackctrl are now recognized by MusE (ws)
+27.06.
+ * applied patch from John Check to add a panic button to pianoroll
+ editor (ws)
+28.06.
+ ========================================
+ * 0.7.0pre4 tagged - one more (rj)
+ ========================================
+26.06.
+ * Some packaging additions, icon, spec files.
+ (only mdk at the moment) (rj)
+25.06.
+ * fixed midi timing bug (ws)
+19.06.
+ * don't catch SIGCHLD, this interferes with vstInit() (ws)
+ * "givertcap" was not found when not in current directory (ws)
+ * impl. "all notes off" for organ synti (ws)
+18.06.
+ * disabled buttons for not implemented functions (ws)
+ * added muse/wave/solo button in the trackinfo ;-) (js)
+15.06.
+ * enabled some midi sync code (ws)
+14.09.
+ * dialogs for change of drummap when converting miditrack to drumtrack
+ or changing port. redirection of keyevents from tlist to canvas (ml)
+13.09.
+ * save/restore parameter for VST synthesizer (ws)
+ * automatic trackchange in tracklist when selecting parts in arranger (ml)
+ * added modify velocity to drumeditor + bugfix for modify velocity (ml)
+ * save/restore parameter for VST synthesizer (ws)
+12.09.
+ * fixed backup command when filename contains spaces (ws)
+ * fixed midi step recording (ws)
+ * fixed bug in arranger: pressing enter after renaming part started
+ editor (ws)
+09.06.
+ * added support for VST/windows software synthesizer (ws)
+ * delayed loading for software synthesizer: syntis are loaded, when
+ they are instantiated the first time (ws)
+08.06.
+ * fixed --enable-rtcap configuration option (ws)
+07.06.
+ * increased "dimension" in memory.h to make MusE work on 64 bit
+ architectures as requested from Simone Piunno (ws)
+ * added aux send for syntis (ws)
+ * added info box which explains why when MusE gets kicked by Jack (rj)
+06.06
+ * added instrument definition for roland MC-505 from Wim VW (ws)
+05.06
+ * Added backup creating save patch from Levi D.Burton (rj)
+01.06
+ * transpose + grid patch added (alin weiller)
+ * fixed moving events in drum editor (ws)
+ * added new config option: disable splash screen (ws)
+31.05
+ * fixed crash in pianoroll when using shortcuts for selecting
+ quant values when quant was set to 1 (no quant) (ws)
+ * fixed a crash when moving an event to tick positions < 0 (ws)
+ * fixed: selecting a note in pianoroll editor and changing a value
+ with note-info toolbar crashed MusE (ws)
+ * bugfix arranger: fix for selecting part -> ignore global accelerators (ml)
+ * bugfix for arranger selection of part above/below when using keyboard (ml)
+ * added pianoroll velocity variation patch (alin weiller)
+30.05
+ * hopefully a fix for drum in & outmap-issues in midi.cpp (ml)
+25.05.
+ * shortcuts for "arrowing around" in arranger added (ml)
+ * 0.7.0pre3 tagged - the last!!! I hope (rj)
+24.05.
+ * fixed a crash on new -> load template (ws)
+ * FluidSynth: added support for drumpatches (equiv to midichan 10 patches) (ml)
+23.05.
+ * exit if rtc open() fails (ws)
+ * changed default start behaviour to open default.med template (rj)
+18.05.
+ * added many new/redone icons (js)
+ * changed aboutbox.ui for qt 3.2 compatibility
+ * changed app.cpp (added the icons)
+17.07.
+ * added stereo/mono icons to mixer (ws)
+ * added a first version of an icon for muse and adapted aboutbox to the same.
+ (graphics by Joachim Schiele) (rj)
+ * Improved handling of browser for help system (rj)
+16.07.
+ * Added FluidSynth fix for ignoring preset selection of soundfonts that don't exist (ml)
+ * fix midi import of pitch bend events (ws)
+ * fix pitch bend handling (ws)
+ * enlarge PitchLabel width so that 14 bit controller values can be
+ displayed without clipping (ws)
+15.07.
+ * removed some debug messages (ws)
+12.07.
+ * show one more measure in pianoroll and drum editor (ws)
+ * renamed controller name "Hold1" to "Sustain" in *idf files (ws)
+11.07.
+ * New try at fixing help browser on all systems (rj)
+10.07.
+ * updated muse.pro and translation sources (share/locacle/*.ts) (ws)
+ * list editor: implemented input mode for program change messages (ws)
+09.07.
+ * fixed "edit - delete track" hangs MusE - bug (ws)
+07.07.
+ * fixed routing for stereo LADSPA plugins used in mono strips (ws)
+ * midi import: first resolve note on/of then transform ticks to internal
+ resolution (ws)
+06.06.
+ * set global automation default to "true", set midi track automation to
+ "read" (ws)
+ * enable auxSend chorusSend and reverbSend in midi mixer strip if
+ corresponding controllers are added (ws)
+ * init automationType for midi tracks (ws)
+ * fixed gm.idf instrument definition file (ws)
+ * implemented "Add New Controller" in list editor / edit controller (ws)
+ * save current midi controller values in *.med file (ws)
+05.05.
+ * updated roland-XP30.idf instrument definition (Sverre H. Huseby)
+04.05.
+ * 0.7.0pre2 tagged (rj)
+03.05.
+ * fixed a cut/glue bug probably introduced at 24.04 (ws)
+ * fixed compilation of musewidgetsplugin.so (ws)
+ * changed splash screen handling, used QTimer instead of background thread (ws)
+02.05.
+ * Added first version of splash screen (rj)
+01.05.
+ * Updated LADCCA support to (almost) usable condition (rj)
+30.04.
+ * Added zoom scaling in drum editor, same as piano roll (rj)
+29.04.
+ * Disabled Random Rhythm Generator (rj)
+ * Took a stab at fixing up shortcuts (rj)
+ * Fixed crash bug when clicking Channel Info and there was no info (rj)
+28.04.
+ * Added single key shortcuts for edit tools (rj)
+ * added shortcut for Marker editor (rj)
+ * and fixed some shortcut inconsistencies (rj)
+27.04.
+ * update marker list on tempo change (ws)
+ * allow adding markers from the ruler with shift-click (rj)
+26.04.
+ * added missing header file(s) (ws)
+25.04.
+ * fixed aux processing: stereo -> mono aux (ws)
+ * metronom now sends proper note off events (ws)
+24.04.
+ * deactivated clip list editor. (ws)
+ * after loading of template, treat current project as "untitled" (ws)
+ * removed data structure "Clip". All information are now in WaveEvent;
+ this simplifies the structure a lot and makes reference counting more
+ reliable. Unfortunatly this also means a new incompatible *.med file
+ version. (ws)
+ * changed reference counting of Event class; simplified and more reliable (ws)
+21.04.
+ * fixed some synchronisation issues between mixer and trackinfo window (ws)
+ * fix update of mixer after removal of aux strip (ws)
+20.04.
+ * Added shortcuts to bug reporting tool, homepage,
+ and updated AboutBox (rj)
+19.04.
+ * fixed QT version check in m4/qt.m4 (ws)
+18.04.
+ * add samplerate initialization to fluidsynth (ws)
+ * compilation fix: added missing include in fluid.cpp (ws)
+17.04.
+ * File->New crashed when current project had selected audio track (ws)
+
+15.04.
+ * 0.7.0pre1 * tagged for prerelease (rj)
+ * arranger: fast repeated pastes now works more reliable (no more stacked
+ parts) (ws)
+ * Thread(): crashed, when poll() returned more than one ready file descriptor
+ and the corresponding callback routine manipulates the list
+ of file descriptors. This happened timing dependend and only in real time
+ mode. (ws)
+ * fixed Fifo() get() (ws)
+ * small extension in soft synth interface (Mess()): added return values
+ for processEvent()
+14.4.
+ * fixed pan range for midi mixer strips
+ * renaming soft synth instances + save/restore should now work
+ * fixed fluid "gui"
+ * changed CTRL_VAL_UNKNONW as it conflicts with valid
+ values for CTRL_PROGRAM (ws)
+13.4.
+ * dont crash on missing LADSPA plugin (ws)
+ * set metronome precount default to "false". Precount is not
+ implemented. (ws)
+ * fixed crash when toggling stereo or pre buttons in mixer (ws)
+ * synchronize channel number in mixer/arranger-tracklist (ws)
+ * changed all float printf("%f") to equivalent qt-string
+ routines; dont localize decimal point so that the
+ strings can be properly parsed; this should fix some
+ save/restore problems in localized MusE versions (ws)
+12.4
+ - arranger/portinfo: fix update of instrument names (ws)
+ - fluid synth: enable drumsets (ws)
+ - fixed crash on inserting meta/ctrl/aftertouch in list
+ editor (ws)
+ - fixed crash in arranger when moving mouse+Alt after
+ removing a track (ws)
+11.4 - fixed initialization of Pan after load of new song (ws)
+ - fixed graphical master track editor (ws)
+ - fixed Qt-Version check (ws)
+ - small qt3.2 compatibility changes (string->toInt() conversion) (ws)
+10.4 - made plugin selector remember the previous selection type (rj)
+4.4 - drag & drop import of wave files (rj)
+ - drag & drop import of mid files (rj)
+3.4 - reactivated vam synthesizer
+ - fixed initialization bug in s1 synthesizer demo code (ws)
+ - added another vertical line in drum editor
+2.4 - integrated new icons (ws)
+ - increased required QT-Version to 3.2 in configure.ac (ws)
+1.4 - added vertikal line in track list as suggested by Joachim Schiele
+ - fixed synchronisation issue between mixer and tracklist (changing midi channel can
+ add/remove mixer strip) (ws)
+ - Changed pan range to -1 +1 (rj)
+ - added new icons from Joachim Schiele (not integrated) (ws)
+ - Support for showing only selected plugins in plugin dialog (rj)
+31.3 - Added various compile fixes needed by debian (rj)
+29.3 - Updated mc303 instrument file from Conrad Berh�ster (rj)
+25.3 - bugfix for pos increase/decrease shortcut (ml)
+24.3 - bugfix for mtscale redraw area when window is scrolled left
+ - bugfix for arranger shortcuts (ml)
+23.3 - added position seek to drumeditor + arranger.
+ - increase/decrease pitch of selected notes in drumeditor with ctrl+up/down
+ - added quantize shortcut keys (1-8) in drumeditor (ml)
+21.3 - added shortcut for pitch increase and decrease of sel notes, in pianoroll (Ctrl+Up/Down)
+ - moved shortcut handling for pianoroll + drumeditor to EventCanvas
+ - leftmost note selected when opening proll/drumeditor (ml)
+16.3 - added shortcut for iterative quantize in p-roll. added shortcuts for
+ selection of notes in p-roll and drumeditor: left/right arrows moves
+ selection, holding down shift adds to current selection (ml)
+ - bugfix, moved blocking of signals on startup to exclude loading of project since
+ a bunch of widgets didn't get updated (ml)
+12.3 - bugfix for menu initialization of "add track"-menu shortcuts (ml)
+ - added some regular 7-bit controllers to Fluidsynth (ml)
+6.3 - Fluidsynti chorus operational again, controlled by NRPNs and
+ automatic gui-update here too. (ml)
+ - Fluidsynti reverb restored. Reverb is now controlled by NRPNs.
+ Automatic updates of gui when controller-changes occur. Unloading
+ of soundfonts restored. (ml)
+4.3 - Fluidsynti playback restored. Gain restored. (ml)
+3.3 - Fluidsynti major rewrite, not fully functioning though (ml)
+ - fixed crash on reload song with open mixer
+ - fixed crash on saving *.med: dont save aux values for channels
+ which have no aux send (like aux strips)
+ - remove empty record wav files on MusE exit
+ - fixed crash on undo controller editing (ws)
+28.2 - more icons from Joachim Schiele (ws)
+ - fixed crash with mouse wheel events in arranger track list
+ - fixed some routing related crashes
+25.2 - show mixer strip in trackinfo window for audio tracks (ws)
+24.2 - compatibility patch to read midi tracks from old 1.0 *.med
+ files (ws)
+ - implemented quick input routing from jack (ws)
+ - added some new icons form Joachim Schiele (ws)
+23.2 - implemented quick output routing to jack; some routing
+ fixes (ws)
+22.2 - added instrument map for yamaha PSR 530 keyboard from
+ Lalit Chhabra (ml)
+ - misc compilation fixes from Joost Yervante (ws)
+21.2 - added drum map for Yamaha DX200 from Joost Yervante Damad (ws)
+ - "quick routing" buttons in mixer (ws)
+17.2 - install musewidgetsplugin.so in PREFIX/lib/muse/qtplugins/designer
+ and add this path to qt library path in application (ws)
+16.2 - trackinfo geometry management changes (ws)
+14.2 - added volume controller to organ, so that the organ
+ synthesizer volume can be controlled in the mixer midi strip (ws)
+13.2
+ - optimized "organ" software synthesizer: precomputed frequency
+ tables, integer envelope generator based on bresenham algorithm;
+ added "velocity" switch; (ws)
+ - changed VAM synthesizer for new interface (ws)
+
+12.2 - controller movements in software synthesizer gui's are now
+ send as midi events to MusE and can be recorded/replayed/edited
+ (currently only working for "organ" synti) (ws)
+ - changed software synth interface (again) (ws)
+
+11.2 - expanded trackInfo by default (rj)
+ - added some graphics to trackInfo :) (rj)
+ - changed "White" to "Default" (still white though) (rj)
+ - fixed trackInfo updating for tracks without their own trackInfo (rj)
+ - added lousy fix to update trackInfo when a track is deleted.
+ it's lousy because it's updating the trackInfo even though the
+ removed track wasn't highlighted, can place you in a tight spot
+ at times. I added it anyway because it removes a crash problem.
+ a better fix would be preferable. (rj)
+ - fixed mouse wheel functionality on knobs and sliders in mixer. (rj)
+
+8.2 - propagate track name changes to mixer (ws)
+ - enforce unique track name when user renames tracks (ws)
+ - implement one to many audio routing (ws)
+ - fixed bug in route dialog refresh after inserting new strip (ws)
+ - fixed aux send volume (ws)
+
+4.2 - added missing activate() to LADSPA plugin initialisation.
+ This fixes crashes with some plugins (plugins who use activate()
+ to allocate memory) (ws)
+ -fixed user definable LADSPA guis using QT-designer; added another
+ example *.ui file for "Toms'Audio Plugins" TAP-Reverberator (ws)
+1.2
+ - logarithmic values were initially wrong for spin boxes in
+ LADSPA guis (ws)
+ - On-the-fly-change of shortcuts in Listeditor, Drumeditor. Added selection
+ shortcuts to Drumeditor (ML)
+ - Added on-the-fly-change for shortcuts in pianoroll (connected to
+ configChanged-signal) (ML)
+
+30.1 save geometry of LADSPA plugin guis;
+ fixed missing mixer refresh after adding an auxSend strip (ws)
+29.1 mixer strip automation types OFF, READ, WRITE and TOUCH
+ implemented; automated controller so far: volume, pan (ws)
+27.1 more code for automation;
+ better reference counting for audio Clip; Clips with zero
+ reference are not saved in *.med file anymore (ws)
+26.1 - removed obsolete driver/midirawin* (ws)
+25.1 - removed obsolete raw midi devices & serial midi; all devices
+ are now handled by ALSA (ws)
+24.1 - changed "Configure" to "Settings"; changed "Display" to "View"
+ for better standard compliance (ws)
+23.1 - enabled controller editing in midi list editor (ws)
+19.1 - added new dir/lib libsynti to collect common code
+ for all software synthesizer (ws)
+18.1 - ported VAM software synthesizer to new MESS interface
+ (not complete) (ws)
+ - events send from synth gui are not echoed back anymore
+17.1 - drumedit: changed "keyFilter" to "drumInstrument"; use
+ it to handle drum instrument specific NRPN controllers (as defined
+ in XG standard (ws)
+ - move drum instrument select status from drumMap to drum editor.
+ This allows for independent selections in different drum
+ editors. (ws)
+ - extend midi controller definitions in *.idf files for
+ drum instrument specific NRPN controllers (controller number
+ contains pitch value) (ws)
+
+16.1 - Added small fix to editctrlbase.ui to make it compile (RJ)
+ - Updated various revision info in README (RJ)
+
+15.1 - Corrected appearance of buttons in Metronome window (FN)
+
+9.1
+ - "record" button in midi ChannelInfo; pressing this button
+ inserts changes in hbank/lbank/program/pan/volume as
+ controller events into song
+ - pianoroll editor: new "multi select mode": If more than one
+ event is selected, the event info spinboxes are set to zero.
+ Entered Values are interpreted as offsets and added to all
+ selected events.
+ - some fixes and performance enhancements to "MidiTransformator" (ws)
+ - fixed saving of drum tracks (ws)
+8.1
+ - changed arranger shortcuts + shortcut-configurator to use configChanged; all arranger menu shortcuts
+ redefinable on-the-fly. most menu options configurable (ML)
+ - now possible to toggle mixer window (ML)
+ - changed Ctrl+A in arranger to be used for select all instead of "Save As" for the sake of uniformity (ML)
+5.1
+ - new config (Config->GlobalSettings) option:
+ - start with empty song
+ - start with last song
+ - start with configured init song
+2.1
+ - smf type 0 export (ws)
+31.12
+ - midi export; fixes to midi controller handling (ws)
+30.12
+ - added dynamic shortcuts for all menu options in the arranger (will hopefully
+ work fine when config is loaded before menus are built) (ML)
+ - added check and prevention of conflicting shortcut sequences inside
+ respective categories, global shortcuts and misc "reserved"
+ shortcuts (ML)
+ - capture dialog grabs/releases keyboard (ML)
+26.12
+ - faster update of mixer (ws)
+22.12
+ - added dummy audio driver; this permits running MusE
+ without suid root and without RT priority when started
+ with "-d" option; this is for debugging & to get
+ normal core dumps (ws)
+20.12
+ - Reverb + chorus grayout-problem in fluidsynthgui removed. Some QT-designer files changed to 3.2 (ML)
+ - More shortcut updates: Added a dialog for capturing shortcuts (ML)
+18.12 (ws)
+ - "declicked" s1 demo synthesizer
+ - make organ controller values persistent
+ - fixed integer overflow in organ synti controller values
+17.12 (ws)
+ - new: mouse wheel events for track list values
+ - track colors in tracklist configurable in "appearance settings"
+ - more configuration options in "appearance settings"
+ part colors are now configurable
+ - ~/.MusE now contains only configuration data; this
+ settings are not replicated in *.med files any more
+10.12
+ - more shortcut stuff in the dummy shortcut config window (ML)
+ - new "load song" option: load all/load song data only (omit config data) (ws)
+ - new "File" function: load template; this function initializes current
+ song with another song (template)
+ - new option while importing a midi file: replace/add to project
+9.12
+ - More shurtcut stuff + dummy config dialog (ML)
+2.12
+ - Bugfixes in pianoroll for insert at current location and seek before
+ beginning of song (ML)
+ - fixed crash on "New" or loading new project
+(ws) - "bounce to track" now works "faster than realtime" with JACK
+ freewheel mode (JACK 0.91.0 cvs required)
+ - mixer automation for gain & pan; some basic functions
+ - preparation for adding imported midifile to current project
+1.12
+ - More shortcut preparations (ML)
+27.11
+ - Added mouse wheel handling for knobs and sliders
+ shift modifier available for extreme slow motion. (RJ)
+25.11
+ - drummapping for recorded events (not heard on record playback echo yet) (ML)
+ - misc updates& fixes for track handling (ws)
+ - removed activity column in tracklist; will be replaced by
+ mixer meter display (ws)
+ - midi record flag can be set again, enabling midi recording
+24.11
+ - Added first steps for uniform handling of shortcuts (ML)
+23.11
+ - some mixer updates(ws)
+22.11
+ - fixed software synth handling; looping is only possible
+ on segment boundaries (ws)
+20.11
+ - Bugfix for drummaps and keyfilter in drumeditor (ML)
+ - apply drum map when importing midi (ws)
+ - retain track ordering across save/load (ws)
+ - wave files in the project directory are stored with
+ relative path, all others now with absolute path (ws)
+16.11
+ - Map outputted drumnotes according to drumMap index (Mathias Lundgren)
+
+14.11. (ws)
+ - JACK transport interface implemented
+ - finally removed ALSA driver; JACK now required;
+ - default to RT-mode on start (-R option is removed); -d (debug)
+ starts without RT
+
+12.11. (ws):
+ - removed midi mixer; first code to integrate midi mixer
+ into audio mixer; mixer moved to pulldown menu "Display"
+ - mixer strips are handled like tracks in arranger (prepare
+ for automation)
+ - track type cannot changed anymore in arranger track list;
+ also removed double click creation of tracks which makes
+ no sense anymore
+ - integrated "atomic" patches from Daniel Kobras
+09.11. - audio routing fixes; mono/stereo switching for input/output
+ strips should now work; audio recording to tracks (ws)
+08.11. - aux send audio mixer strips (ws)
+ - Arrowing up and down update in arranger (Mathias Lundgren)
+07.11. - Fluidsynth compile problem w. Debian/qt/stl/gcc fixed (Mathias Lundgren)
+ - "Double undo"-bug fixed in Pianoroll (Mathias Lundgren)
+04.11. - many changes to audio mixer and audio routing; implement
+ framework for new audio features (ws)
+31.10.
+ - museProject set correctly when loading song on startup (RJ)
+ - save dialog added when adding first wave track (RJ)
+ - load/save of wave files handled with relative paths (to project) (RJ)
+ - Updated swedish translation (Robert Jonsson)
+ - Merged softsynth and midiconfig dialogs as in old tree(Robert Jonsson)
+ - Some museProject issues(Robert Jonsson)
+ - updated new midi controller implementation (ws)
+
+29.10. (ws)
+ - update soft synthesizer organ/fluid/fluidsynth; extent MESS
+ interface
+ - update from 0.6.2 (Mathias Lundgren):
+ - Various drumeditor-related updates including: Horizontal splitter
+ offset stored. Fixed length command added (Alt+L). Bugfix for selection
+ of events inside/outside locators. Initialization of drummap doesn't overwrite
+ entries loaded from project file.
+ - Alt+P sets locators to selected notes in PianoRoll and DrumEditor
+ - CTRL+Leftclick on an item in the Arranger, PianoRoll or DrumEditor selects all
+ parts/notes on the same track/same pitch
+ - Pressing Enter in the Arranger now opens the appropriate editor for the
+ part (Mathias Lundgren)
+ - The midithread now maps keys on a drumtrack according to the drummap.
+ - Cursor up/down (Mathias Lundgren)
+ - currently selected drum (Mathias Lundgren)
+ - fixed compilation error in givertcap.c (andrew)
+ - removed iiwu soft synth temporarily from compilation until
+ ported to new "mess" interface
+ - added missing file ltmain.sh
+ - create new cvs at sourceforge.net
+-------------
+ - removed obsolete score editor
+ - changed midi controller handling
+ - new process structure
+ - redesign of "mess" software synthesizer; removed alsa
+ - new midifile import/export
+ - fork from cvs; new file structure
+0.6.2(omuse):
+ - added first version of (incomplete) french translation from
+ - removed stk based soft synthesizer + share/rawwaves
+ - removed sound font
+ - fixed bug in midi recording when recording starts with a note off;
+ also the recorded part len was miscomputed when the recording ends with
+ a pressed key (missing note off event)
+ - added new allocator for SEventList and MPEventList (memory.cpp, memory.h)
+ to make sure the midi RT-thread does not call malloc/new/free/delete
+ - added misc build patches from Daniel Kobras
+ - make selection of alsa audio device an command line argument
+ (-A xxx default: hw:0)
+ - fixed "edit->select->allInLoop"
+ - fixed track height after renaming track
+0.6.1:
+ - fixed "Cakewalk Style" display in arranger
+ - added russian translation from Alexandre Prokoudinek
+ - arranger: tracks are now independent vertical resizable
+ - arranger: implement part rename from popup menu
+ - arranger: show part name in parts in addition to events
+ - audio mixer: interpret min slider position as "off"
+ - audio mixer: added value entry for pan (Robert Jonsson)
+ - audio: some routing fixes
+ - audio mixer: enable data entry for slider label
+ - ladspa plugin gui: replaced value label with data entry
+ to allow numerical entry of parameter values
+ - pianoroll: added undo/redo to edit menu + accel. keys
+ - ctrl editor: implemented changing (painting) of pitch
+ events
+ - added macros for big endian machines in midi.h
+ - added spain translation (Albert Gonzales)
+0.6.0:
+ - added swedish translations (Robert Jonsson)
+ - fixed editing of pitch events in list editor
+ - fixed crash in score editor
+ - check tempo entry values; dont allow invalid values which could
+ crash MusE
+ - fixed not functioning "Abort" button in MidiTransform dialog
+ - fixed Ctrl-editing in drum editor
+ - fixed "Group" audio routing
+ - fixed editing of pitch values in parts not beginning at tick zero
+ - fixed "unexpected EOF" after dragging of events in midieditor
+ - fixed cut&paste in midieditor
+ - implemented deleting multiple selected parts in arranger with Del key
+ - fixed audio pan pots in mono->stereo conversion
+ - changed iiwu to fluidsynth (thanks to Helio Chissini de Castro)
+ - new popupmenu: click with right button in empty tracklist
+ - LADSPA plugin guis are generated at runtime from qt-designer *.ui
+ (xml-)files; testfile is "freeverb.ui" for freeverb plugin;
+ - added "Slider"+"DoubleLabel" to musewidgetsplugin to make widgets
+ available in QT-Designer
+ - renamed poseditplugin.so to musewidgetsplugin.so
+ - fixed midi ctrl editor
+ - sparate sync device into txSyncDevice and rxSyncDevice. RxSyncDevice
+ can be configured to "all".
+ - use <asm/atomic.h> macros for atomically inc/dec count in lockfree
+ Fifo implementation
+0.6.0pre8:
+ - prepared for internationalization:
+ - created muse.pro
+ - removed all implicit type conversions char* -> QString
+ - added several missing translations tr()
+ - Part text is now colored depending on background (FN)
+ - fixed "bounce to file" fifo handling
+ - disable transport buttons in slave mode
+ - calculate correct size for new part after midi recording
+ - fixed crash when reloading song while audio mixer is open
+ - implemented "bypass" function for LADSPA plugin gui's
+ - changed obsolete qt header file names
+ - implemented external midi instrument definition files (*.idf)
+ (examples are in */share/muse/instruments)
+ - implemented moving plugins up/down in effect rack
+ - fixed: renaming wave track switched track to mono
+ - implemented LADSPA "LOGARYTHMIC" and "INT" hints
+ - disable record button for tracks with no input routed to
+ - implemented LADSPA "TOGGLED" port as QCheckBox in plugin gui
+ - changed algorithm for zeroing denormalized floats in freeverb
+ plugin; now it works again for gcc3.x and optimization flags
+ turned on
+0.6.0pre7:
+ - prevent creation of empty wave files when switching the
+ record button in audio mixer on/off; wave files are only
+ preserved when you actually record something into it
+ - made plugin guis persistent
+ - fixed scissor operation on wave parts
+ - added missing code for "bounce to file"
+ - fixed "bounce to track"
+ - removed/changed obsolete qt code
+ - update for current iiwu cvs
+ - fixed initialisation bug in wave editor
+ - dont link iiwu libs static
+ - (bh) added ladcca support
+ - fixed midifile export
+ - arranger, pianoroll editor, drum editor: tool popup menu
+ with right mouse button click
+ - update iiwu to current cvs version
+ - implement trackinfo patch names for iiwu
+ - fixed "appearance settings"
+ - added keyboard shortcut "Del" to delete events in pianoroll
+ and drum editor
+ - "Asterisk" key in keypad now toggles record mode
+0.6.0pre6:
+ - fixed len of new created event in pianoroll editor
+ - extend font selection in "apearance settings"
+ - Added shortcuts for "Select All", "Unselect All" and "Invert
+ Selection" in PianoRoll editor (FN)
+ - Fixed Event coloring and shortcut ("e") key (FN)
+0.6.0pre5:
+ - fixed midi seek & tempo map
+ - implemented global tempo change
+0.6.0pre4:
+ - fixed tempo handling
+ - pianoroll editor/drum editor: fixed changing of note position
+ - transport: some geometry/font changes; time signature can now
+ be changed by mouse wheel
+ - fixed glue/scissor tool
+ - catch sigchld signal again so we know when a softsynth gui exits
+
+0.6.0pre3
+ - fixed drawing of drum parts in drum editor
+ - on reading *.med files reject events which dont't fit into part (more robust
+ handling of defective med files)
+ - remove also synth gui when removing synth
+ - implemented some of Frank Neumann's usability suggestions:
+ - a "Copy Part" sets the current location marker after the marked part
+ - "Del" removes part if a part is selected instead of whole track
+ - new Keyboard Accelerator "C" toggles metronome click
+ - removed channel info for selected notes in pianoroll editor and
+ drum editor
+ - navigate between parts with left/right buttons in arranger window
+ - implemented changing note position for selected note in "note info" toolbar
+ - fixed: changing "loop" flag in transport window does not change "loop" flag in
+ other windows
+ - call pcm_wait() in alsa driver with sane values
+ - fixed: after load song seq did not run with rtc
+ - filenames for audio recording to tracks are now generated
+ automatically; every recording goes into separate file
+ - (bh) updated build system to use automake 1.7
+ - fixe Midi->DefineController "Cancel"
+ - new function: Midi->DefineController load+replace and load+merge
+ - fixed MFile write: close() was missing; this fixes a.o. saving of
+ midi controller sets
+ - make organ synth aware of project directory for saving presets
+ - fixed load/restore presets for LADSPA plugins
+ - changed organ default values for envelope generator
+ - more fixes for alsa driver (less xrun errors)
+ - lokal allokator for soft syth midi events implemented
+ - enable sample rates != 44100 for iiwu (JACK has 48000 default)
+ - cleanup soft synth instantiation: call alsaScanMidiPorts only one time
+ - small audio buffer handling optimizations
+ - some thread cleanups
+ - fixed audio mixer geometry handling
+ - another fix for RT thread handling in iiwu
+ - fixed recording of pitch events (not tested)
+ - load iiwu sound fonts in a background helper thread to
+ avoid being thrown out by JACK
+ - fixed RT thread handling; now muse+iiwu+jack works
+ - honour LADSPA default hints for controller ports
+ - removed some restrictions for LADSPA plugins
+ - fixed tempo entry in transport window
+ - added high priority watchdog process to avoid system freezes
+ - updated "iiwu" synth to use peter hanappes libiiwusynth
+ iiwu now remembers last used sound font
+ - fixed cut&paste for midi parts
+ - fixed cut function for midi parts
+0.6.0pre2:
+ - audio mixer: reset meter on mute
+ - changed input routing to allow monitoring while recording
+ - removed superfluous second init() call for soft syntis
+ - fixes for mono/stereo conversion
+ - ensure all wave files are properly closed on exit
+ - fixed segfault on second cliplist open
+ - fixed wave part split function
+ - fixed ALSA/JACK configuration bug
+ - event time positions are again stored as absolute time positions
+ to enhance compatibility with older "*.med" files
+ - changed panic button: instead of sending lots of note off
+ events only "all sound off" controller events are send for all
+ ports/channels
+ - fixed error on importing midi files when there are more
+ than one track assigned to a midi channel
+ - found another memory corruption bug in sysex handling
+ - fixed precount in metronome
+ - space key again stops play/record
+ - fixed stop/play in transport window
+ - prohibit change of mono/stereo for input strip
+ - convert mono/stereo on the fly for wave parts
+ - fixed crash when pressing play in empty song
+ - audio loop fixed
+ - _midiThruFlag not always initialized
+
+0.6.0pre1:
+ - attached midi mixer again
+ - fixed metronome: loop mode, measure/beat configurable
+ - moved part colorisation into part popup menu
+ - added global midi pitch shifter in addition to track pitch shift; this
+ allows for simple pitch transforming the whole song. Drum tracks are not
+ pitch shifted.
+ - fixed fatal error in soft synth handling resulting in sporadic
+ core dumps
+ - removed sf directory (sound file stuff) and replaced
+ it with the real thing: libsndfile 1.0.0
+ - removed bogus kde stuff: kde.h onlyqt.h desk.h
+ - JACK Audio support
+ - AUDIO & ALSA now required
+ - fixed memory corruption with sysex events
+ - simplified organ soft synth parameter handling
+ - removed illegal controller message optimizations
+ - implementation of "panic" button
+ - first instantiated synti did'nt show up in port list
+ - size of resized drum and pianoroll editor windows are now remembered
+ - fixed crash when configuring null audio device
+ - removing soft synth instance did not stop midi thread; alsa client
+ was not removed
+ - (bh) lots of buid system changes and general cleanups
+ - (bh) removed the use of the UICBASES make variable; .ui files can
+ now be added straight into _SOURCES make variables with the new
+ SUFFIXES support in automake 1.6
+ - (bh) upped minimum automake version to 1.6
+ - (bh) removed the use of the MOCBASES make variable; header files that
+ need to be run through moc are now detected automatically
+ - (bh) new iiwusynth softsynth
+ - (bh) removed support for oss and alsa 0.5
+ - clone parts implemented (also called "alias parts" or "ghost parts")
+ (dragging part with Alt-Key pressed in opposit to Shift Key which
+ produces a normal copy);
+ needed many internal changes; hope not to much is broken
+ - mastertrack: new spin widget for changing midi signature
+ - fixed midi thread initialization after loading new file
+ - stopped sequencer before loading new file; this should fix occational
+ core dumps on New/Load/ImportMidi
+ - some cleanups with file load/save operations
+ - Config->MidiPorts->otherRaw (device name pulldown): enabled OpenFile
+ Button for DevicePath field: At least current Qt can now handle devices.
+ - implemented:
+ - structure pulldown menu:
+ - global split
+ - global cut (mastertrack cut not implem.)
+ - global insert (without m.t.)
+ - implemented part mute
+ - added pitch transposition to pianoroll widget keyboard (Tim Westbrock)
+ - Save(As) behavior patch from Tim Westbrock
+0.5.3:
+ - updated stk library to version 4.0; adapted stk synthesizer
+ - added SECURITY advice from J�n Nettingsmeier
+ - several compilation & portability fixes from Takashi Iwai
+ - fixed keyboard entry in pianoroll editor
+ - midi now runs synchronous with audio
+ - midi record time stamps now again synchronous to play position
+ - fixed trackinfo geometry (hopefully)
+ - pianoroll: fixed endless loop if record was pressed
+ without any mididevices configured (reported by Ola Andersson)
+ - default to english help if help for $LANG not available
+ (Ola Andersson)
+ - detect misconfigured ALSA system (Ola Andersson)
+ - updated demo app "rasen.med" to current xml format
+0.5.2:
+ - fixed: rtc clock resolution settings in Config->GlobalSettings
+ - fixed: crash on second start of Edit->Marker
+ - more consequent implementation of -a (no audio) command
+ line parameter: no softsynth and LADSPA plugin loading;
+ disable audio menu
+ - fixed sending spurious midi controller settings on startup
+ when track info is active
+ - first code for "random rhythm generator" port from JAZZ++
+ - fixed start offset of midi recording
+ - pianoroll editor: fixed selection update
+ - appearance setting "font size" now persistent
+ - does not crash anymore if no ALSA system found. (ALSA is still
+ needed to compile MusE)
+ - fixed: multiple recordings: clear events form first recording
+ in record buffer
+ - fixed: crash when removing last track with open
+ trackinfo
+ - (bh) added beginnings of alsa midi patchbay
+ - changed suid handling: now MusE runs with normal user uid
+ and switches only to root uid for some special operations
+ - fixed mixdown file output
+ - fixed lock on startup when wave file was missing
+ - arranger: open tracktype pulldown with left mouse click
+ (was opened on right click)
+ - arranger: don't scale pixmap symbols
+ - added share/rawwaves to cvs repository (needed by stk synthi)
+ - changed software synthesizer interface "mess": moved more
+ common synth functionality to "mess.c"; changed synti's to new
+ interface
+ - removed obsolete "short name" in controller type dialog
+ - CtrlCanvas: always draw location marker on top of grid
+ - fixed: TrackInfo: velocity
+ - fixed: alsa midi: "pitch change" interpreted as "channel aftertouch"
+ - fixed some midi controller bugs
+ - implemented new parameter save/restore interface for soft
+ synthesizer (applied to "organ")
+ - (ws) fixed lost controller events on midi import
+ - (ws) fixed crash when removing soft synth in use
+ - (ws) appearanceSettings: changing font size now works better
+ - (Bob) files now include "config.h" instead of relying on -DALSA,
+ -DALSACVS, -DINSTDIR and -DAUDIO
+ - (Bob) Added 'delete preset' button to vam's gui and made it
+ remember what preset file it loaded
+ - Mess: added new class MessMono() which implements some
+ monophone synthesizer features. This is used in the
+ simple demo synthi s1
+ - if you try to exit MusE and abort this process, MusE was
+ left in an unusable state
+ - loop end was not calculated correct; event at loop end
+ was played
+ - muse now again stops at end of song in play mode
+0.5.1:
+ - fixed crash: SaveConfig after Config->SoftSynth->AddSoftSynth
+ - changed default audioSegmentSize from 256 to 512
+ - eliminated message: "input type 66 not handled"
+ - SoftSynth gui was startet with uid root
+ - save project: warn if file open fails
+ - removed trace message "unrecognized event 42" (Sensing Midi Event
+ from external keyboard). Anyway MusE does not handle midi sensing
+ events.
+ - changed geometry for trackInfo panel
+ - more code for 14 bit controller events
+ - install "rawwaves" for stk synti into right place preventing
+ crash on start
+ - fixed another crash when load soft synth configuration
+ - fixed Midi Position Label (was -1 beat/measure off)
+ - fixed problem with lost note off events
+ - generate "note on" events with velocity zero instead of
+ "note off" events
+0.5.0:
+ - pianoroll editor: caption is changed when current part
+ changes
+ - new software synthesizer adapted from:
+ STK: A ToolKit of Audio Synthesis Classes and Instruments in C++
+ Version 3.2
+ By Perry R. Cook, 1995-2000
+ and Gary P. Scavone, 1997-2000.
+ http://www-ccrma.stanford.edu/software/stk/
+ - added presets to "Organ" software synthesizer
+ - changed midi routing for software synthesizer:
+ - controller changes from gui can be recorded
+ - new midi thread implementation
+ - speaker button in pianoroll editor implemented:
+ if on events are played if clicked
+ - new Menu: Midi->InputPlugins
+ - demo plugin "Transpose"
+ - moved Config->MidiRemote to Midi->InputPlugins
+ - moved Config->MidiInputFilter to Midi->InputPlugins
+ - moved Config->MidiInputTransform to Midi->InputPlugins
+ - as usual some bug fixes of old and new bugs
+ - master editor: fixed: locator bars sometimes invisible
+ - master editor: new tempo spin box to change tempo at current
+ position
+0.4.16:
+ - new software synthesizer adapted:
+ "Organ - Additive Organ Synthesizer Voice" from David A. Bartold
+ - new simple demo Synthesizer S1
+ - remove the hardcoded qt path "/usr/qt3" (0.4.15)
+ - fixed many bugs
+ - new: implemented line draw tool in controller editor
+0.4.15:
+ - qt3.0 now required
+ - many gui/widget changes
+ - fixed segfault when pasting wave parts
+ - changed (again) default magnification in wave-view
+ - implemented prefetch thread for playing audio files
+ - fixed: iiwu did not play with ALSA 0.6
+ - fixed: handle audio underruns for ALSA 0.6
+0.4.14:
+ - some makefile and compilation changes
+ - audio play: noise between audioparts during playback
+ - dont stop at end of song when "loop" is active
+ - default magnification in wave-view set to 1
+ - fixed a audio route initialization bug
+ - new metronome configuration: precount configuration added
+0.4.13:
+ - avoid "disconnect error" on startup
+ - wave view: y magnification now persistent
+ - small gui enhancements to reduce flicker
+ - make install: now creates gui dir
+ - implemented 8 bit wave input format
+ - fixed another source of audio crashes
+0.4.12:
+ - audio play: mixing buffer was only partly cleared resulting
+ in random noise
+ - fixed: core after removing soft synth instance
+ - set default master volume to 1
+ - fixed some audio routing bugs
+ - drumedit: added missing display update after drum map loading
+ - drumedit: fixed: when loading external drum map, velocity values
+ got zero
+ - drumedit: fixed: core some time after loading external drum map
+0.4.11:
+ - iiwu: in GM-mode dontt allow drum channel program changes;
+ also ignore bank select messages
+ - set GM-Mode resets synth
+ - some changes in drum channel handling
+ - substantial changes in audio implementation
+ - reimplemented audio configuration
+ - miditransform: val2 transforms fixed
+0.4.10:
+ - iiwu: implemented sustain, ctrl:expression
+ - iiwu: changed sync audio/midi; this fixes some timing issues
+ - iiwu: fixed: core when loading new sound font while playing
+ - split RT thread into separate midi & audio thread
+ - fixed some bugs: crash on midi recording
+ - some new functions in pianoroll editor
+ - added/integrated Tommi Ilmonens "givertcap"
+ - iiwu: some fixes for ALSA 0.9beta
+ - arranger: voice name popup in channel info works again
+0.4.9:
+ - fixed some memory leaks
+ - before loading a new song all synthesizer instances are
+ now removed
+ - reorganized installation:
+ - there is a toplevel installation directory
+ (default /usr/muse); the environment variable MUSE
+ points to this directory
+ - architecture dependent files go into
+ $(MUSE)/lib, architecture independent files
+ into $(MUSE)/share
+ - MidiSync: MC ticks are now also send in stop mode
+ (if configured)
+ - after "Start" is send, sequencer starts on next
+ midi clock tick
+ - iiwu: fixed core dump on save if no soundfont loaded
+ - iiwu: high resolution buffer size independent midi event
+ processing
+0.4.8:
+ - faster display updates
+ - some changes for better compatibility with different
+ environments (compiler, lib)
+ - fixes for ALSA 0.5.11
+ - fixed core dump while removing soft synth instance
+ - fixed some bugs with iiwu+gui
+ - fixed: TransportWindow: tempochanges while masterflag is off
+ - fixed: all tempochanges are now saved in songfile
+0.4.7:
+ - ALSA 0.5.11 compiles again
+ - MESSS gui interface, first try:
+ -every midi instrument can have an associated
+ GUI (currently only impl. for MESSS soft synths).
+ The GUI is startet as a separate process connected
+ to the midi instrument. The gui sends midi commands
+ (sysex) to stdout. This midi data stream is connected
+ to the midi instrument port.
+ - test implem. can load sound fonts into iiwu synthi
+ - fixed a bug in loading big sound fonts
+ - waveedit: waveform display works again
+ - some iiwu changes
+0.4.6:
+ - completed midi input architecture: every midi track has now
+ assigned input port+channel. Channel can be 1-16 or "all".
+ This allows for routing of different midi channels to
+ different tracks while recording.
+ - changed max number of midi ports from 8 to 16
+ - fixed serveral bugs iiwu software synthesizer
+ - fixed compilation problems with some ALSA versions
+ - fixed: changing track name changed record flag
+ - fixed: remove midi editor if associated track is removed
+ - fixed: initial state of solo button in arranger
+ - fixed: hard to reproduce core while deleting track
+ - new command line option to set real time priority
+ - max number of midi ports is now 16
+ - audio recording from master to file now works:
+ - configure Audio->MixdownFile (only wave/16bit)
+ - switch on record button in audio mixer master strip
+ - play
+ - fixed: graphic master editor: missing display refresh
+ after signature change
+ - changed midiThruFlag: removed from Config->MidiPorts;
+ "midi thru" now is associated with a track, if set all input
+ to that track is echoet to track port/channel
+
+0.4.5:
+ MESSS: (MusE Experimental Software Synthesizer interface Spec):
+ A software synthesizer is implemented as a dynamic
+ loadable library (*.so file) with two interfaces to the
+ outside world:
+
+ - a LADSPA interface for audio output
+ - a midi sequencer interface registered to ALSA
+
+ MusE searches all available synths and presents a list
+ in Config->SoftSynthesizer. To use a synthesizer you have
+ to create an instance. Several instances of an synt can be
+ created and used. Every instance creates
+
+ a) an alsa midi sequencer port (look at Config->MidiPorts)
+ b) a new strip in the audio mixer
+
+ As a demo i ported a stripped down version of the iiwu
+ software synthesizer (http://www.iiwu.org) to MusE.
+ Setup info is in README.softsynth
+
+0.4.4:
+ - fixed cakewalk style event display in arranger
+ - track comments are handled as 0xf text meta events in
+ midi files
+ - fixed: follow song in pianoroll/drumedit (daniel mack)
+ - fixed: refresh in list editor
+ - implemented 14 Bit controller in list editor
+ - new patch form Takashi Iwai enables MusE to compile
+ with ALSA 0.9.0beta5 and current cvs version
+
+0.4.3:
+ - new: Config->MidiInputTransform
+ - new: comments for tracks: click with right button on track
+ name in arrange window
+ - fixed: score editor sometimes eats up all memory on start;
+ machine was unusable for some minutes until muse crashes
+ - fixed some other smaller bugs
+ - patch from Takashi Iwai for latest (cvs-) ALSA
+ - fixed: score postscript generation (printer & preview output)
+
+0.4.2:
+ - added few missing display updates (bugs introduced
+ with 0.4.1 drawing optimizations)
+ - pianoroll editor:
+ - fixed: edit->DeleteEvents
+ - drum editor:
+ - implemented: edit->DeleteEvents
+ - use different cursor shapes while using
+ Glue- Cut- and Rubber tools
+0.4.1:
+ - some small Changes for compiling MusE with gcc 3.0
+ - track info values (transposition, velocity etc)
+ are now applied when exporting to midi file
+ - better geometry management for ctrl panel
+ - pianoroll editor / drum editor now allow for more than
+ one ctrl panel
+ - new: load/save midi controller sets
+ - automatic creation of midi controller sets on
+ midi import
+ - new: active(used) midi controllers for current
+ parts in editor window are now marked in controller list
+ - fixed: parts in open editors are not restored correctly
+ - many drawing optimizations; scrolling is now much
+ faster/smoother
+0.4.0:
+ - input configurable for every track
+ (you can record from more than one midi input device
+ to different tracks)
+ - you have to switch on the "record enable" flag for
+ every track you want to record to
+ - Note "h" is now called "b" unless you set
+ the environment variable "LANGUAGE" to "de"
+ - Changes from Daniel Mack:
+ - bigtime window now shows hour:minute:sec:frame
+ - configurable snap grid for arranger
+ - configurable font size
+ - again "tick underflow"
+
+0.3.20:
+ - "bigtime" widget from Daniel Mack
+ - fixed global accelerator keys f11/f12 (toggle transport &
+ bigtime window)
+ - fixed: score editor: try placing notes in the right margin of the
+ last row gave core dump
+ - score editor: different cursor shapes
+ - new try on missing midi sync ticks (producing "tick underflow"
+ trace messages)
+ - score editor: some small enhancements
+0.3.19:
+ - several small bugfixes from Daniel Mack
+ - fixed "make install"
+ - if you have trouble compiling ALSA audio:
+ change "AUDIO = yes" to "AUDIO = no" in make.inc
+ - some fixes/enhancements from Brian K:
+ - fixed: score editor: no more "EVENT not found" during subsequent
+ edits of a selected note
+ - scrubbing with rubber tool in score editor
+ - new part appearance option
+0.3.18:
+ - fixed: Export Midifile
+0.3.17:
+ - simple audio recording
+ - midi sync slave: received "start" did not reset pos to tick 0
+ - fixed several bugs in screen update and synchronisation between
+ different midi editors
+ - new: Configure->Appearance dialog from Daniel Mack
+0.3.16:
+ - "follow song" now works in both directions
+ - MidiTransformator: implemented missing "Copy" and "Extract" functions
+ - fixed: reset sustain at stop only for channels which really had sustain
+ set
+ - fixed several bugs in midi sync code; needs more testing
+ - received "set song position" from alsa midi driver now
+ handled in sync slave mode
+ - transport buttons are now disabled in "external midi
+ sync" mode
+ - fixed: do not send midi "start" "stop" "continue" etc. as sync slave
+ - fixed: several small bugs i cannot remember
+0.3.15:
+ - fixed: some typos in "MidiTransformator"
+ - fixed: core at end of midi recording from external
+ sequencer as sync slave
+ - replaced midi "continue" message with "start"
+ when running as midi sync master
+ known bug: midi clock output only if seq plays,
+ should be send always even if seq stops
+ not implemented: cannot change tempo as sync slave
+
+0.3.14:
+ - fixed: core: typo in "undo add track"
+ - fixed: core: "undo remove event"
+ - selection of events is now a global attribute: if you select
+ an event in an editor, the same event is selected in all
+ open editors
+ - new: Midi Transformator (look at edit->MidiTransform)
+ (not all operators and operations are implemented yet)
+0.3.13:
+ - fixed: TimeScale was wrong when using signature changes
+ - fixed: enforce left marker <= right marker
+ - new: mono wave tracks
+ - more usable LADSPA plugins to play with
+ - several small changes/bug fixes
+0.3.12:
+ - fixed: synchronisation of tempo/signature changes with sequencer rt-thread
+ - fixed: track parameter were added again and again in loop mode
+ - new: tempo/signature changes undo/redo
+ - new: midi "transpose" function from Daniel Mack
+ (Arranger: edit->midi->transpose)
+0.3.11:
+ - fixed: fixed serious bug in wave file handling
+ - simple audio play with ALSA 0.9.x
+ - fixed: editing events -> core (introduced in 0.3.10)
+0.3.10:
+ - fixed: core while deleting controller events
+ - new: extended configuration of raw (serial) midi interfaces
+ - fixed: some memory leaks
+ - changed for ALSA 0.9.0 beta2
+0.3.9:
+ - some smaller fixes
+ - fixed: core: missing MidiController() Initialization
+ - fixed: pressing another mouse button while "drawing" an event
+ in a canvas with left mouse button pressed gives core
+0.3.8:
+ - fixed: correct update of midi port table on song change
+ - CtrlEditor: controllers can(must) now be configured
+ - List Editor: corrected handling of meta/sysex strings
+ - changed: combined pitch high/low to single value ranging
+ from -8192 +8191; editable with controller editor
+ - ALSA 0.9.0beta1 works for midi; as far as i tested it, this
+ alsa version has no more problems with OSS raw midi emulation
+ - new: colored activity display in arranger (Daniel Mack)
+ - new: context sensitive extensions to "right mouse click
+ pulldown menues" for arranger parts (Daniel Mack)
+ - new: gui prototypes for extendend configuration of raw midi
+ devices and audio mixdown file selection
+ - fixed: quirks with OSS midi devices configuration
+0.3.7:
+ - start porting to ALSA 0.6.0 cvs version
+ - fixed: option -M produces midi output trace for alsa midi
+ - fixed: pianoroll and drum editor now accept input focus
+ and then honour some keyboard shortcuts
+ - fixed: score editor: core when inserting small rests
+ - new: "ruler" for pianoroll, drum editor and part editor
+ - fixed: midi recording: event len always 1 tick (bug introduced
+ in 0.3.6)
+ - midi port config: show only available raw midi devices
+ - fixed: tempomap/tempo save/restore
+ - fixed: initialize master button to saved value
+ - some smaller changes:
+ - midi recording: new parts begin at record start instead
+ of first event
+ - missing note offs are insertet virtually at record end
+ - recording takes place on selected track - selected part
+ and not on selected part if on different track
+0.3.6:
+ - fixed: markerList: click in list -> core
+ - fixed: stop at end of song only if not recording
+ - fixed: events of zero length crash the sequencer
+ - fixed: missing note off events for metronome
+ - fixed: gui: changing port/channel in trackinfo updates tracklist
+ - new: midi recording & loop
+0.3.5:
+ - fixed: midi recording with alsa was broken
+ - fixed: mastertrack: -> core
+ - fixed: rename track -> rename part -> core
+ - fixed: help browser: back function
+ - fixed: score: entered lyrics are saved again
+ - fixed: score->staffSettings: tracklist
+ - fixed: score->enterNotes wrong snap position
+0.3.4:
+ - fixed: some bugs & quirks
+ - new: implemented pianoroll->edit->deleteEvents
+
+0.3.3:
+ - new: MusE now stops at end of song if in PLAY mode
+ - fixed: core if muse was started without song name and
+ there was no ".musePrj" file in current directory
+ - new: on popular request: "RewindToStart" button
+ - fixed: changing devices while playing
+ - fixed: arranger: could not scroll to the end of song
+ - fixed: song lenght on midi import
+ - fixed: fatal error in handling "note off" events
+ - new: "sustain" is reset on stop
+
+0.3.2:
+ - fixed: part editing: endo delete, glue etc.
+ - fixed: option -m (trace midi input) works again
+ - fixed: midi input filter: could not toggle channel 1 button
+ - fixed: midi mixer
+ - fixed: midi recording into part: part length adjusted if events
+ recorded past end of part
+ - fixed: MusE initialisation failed if there is no ".musePrj"
+ file in current directory!
+
+0.3.1:
+ - step 2 of internal reorganization
+ - fixed: score: lyrics are now saved again
+ - fixed: some quirks with lost track markers
+ - new: Option -L locks sequencer memory
+ - fixed: recording from serial midi (raw oss & korg tohost)
+ - fixed: several smaller bugs & quirks
+
+0.3.0:
+ - fixed: pianoroll editor: entering new events -> core
+ - new: drum editor click on instrument name "plays"
+ instrument
+ - fixed: changing the channel of a track now changes also
+ the channel of all events in that track
+ - massive changes for audio/wave integration:
+ - start of audio mixer
+ - audio routing
+
+0.2.12:
+ - fixed: wave files/tracks/parts: calculation of tick<->time;
+ it should be possible again to import/play simple waves
+ - fixed: funny things happend when muting all audio tracks
+ - fixed: core if no active record track
+ - new: Rob Naccarato started with documentation; press
+ <F1> in MusE and have a look
+
+0.2.11:
+ - fixed: metronome
+ - fixed: initial state of "click" transport button
+ - fixed: midi thru:
+ if midi thru is switched on, all received events are
+ echoed to the port/channel associated to the currently
+ selected track, regardless of the input port/channel.
+ Track parameters as pitch shift, velocity compression etc.
+ are applied before echoing the event.
+ - _not_ fixed: alsa midi driver: strange sysex behaviour
+0.2.10:
+ - fixed: parameter change in midi trackinfo
+ - fixed: some errors in *.med file handling
+ - fixed: midi export
+ - fixed: midi events are now played according to priority:
+ - channel priority: 10,1,2,3,4,5,6,7,8,9,11,12,13,14,15,16
+ - note off before note on
+0.2.9:
+ - fixed: typo in seq.c destroyed timing of 0.2.8
+ - fixed: importing audio files
+ - fixed: writing *med files
+ - fixed: wave form display in arranger
+ - fixed: core on click in arranger "no track area " with pencil tool
+0.2.8:
+ - fixed: oss midi devices now work agin
+ - reorganized midi event dispatcher
+ - fixed: pitchbend for midialsa (Xavier)
+0.2.7:
+ - midi driver reorganization in preparation
+ for better ALSA sequencer integration; soundcard synth
+ work again
+ - some fixes
+0.2.6:
+ DrumEditor overhaul:
+ - fixed: reading drum maps
+ - changed: exporting drum maps now writes the whole map
+ - fixed: device popup: ...invalid menu item
+ - new: instruments can now be moved
+ - fixed: changing A-Note/E-Note did not show effect
+ - changed: small x-offset in event canvas allows better placement of
+ events at pos 1.1.0
+ - new: instrument names can be edited (double click instrument name)
+ - new: some drum maps
+ - fixed: update() missing after selection change in canvas
+ - fixed: len of new inserted drum events was quant-value, should be
+ default len from drum map
+ Alsa Midi Driver:
+ - changed (soundcard synth does not work :-( )
+0.2.5:
+ - fixed: session management for list editor
+ - new: list editor: hex entry in meta event dialog
+ - fixed: Midi: "GS Reset" button aktually did a "GM Reset"
+ - fixed: Midi: "GS Reset" on Song Start was always combined with "GM Reset"
+ - fixed: Arranger: copy/paste produced core
+ - fixed: Arranger: removed some (not working) key accelerators
+ - new: Drag file from KDE fm and Drop on arranger partlist
+ - removed bogus midi archiv
+ - some major code reorganizations in preparation for audio integration
+ resulting in new errors and *.med file incompatibilities;
+ - fixed: "cannot delete busy part" even if part is not busy
+ - fixed: arranger/progname.c: bad instrument name table caused segfault
+ (Tim Mann)
+ - fixed: score/layout.c: could not enter A# (Gilles Fillipini)
+0.2.4:
+ - fixed: removed silly warning: Cannot find translation...
+ (translations are not (yet) enabled)
+ - fixed: trackMarker->destroy TrackMarker->create track -> core
+ - new: integration of track markers in arranger
+ - export/import SMF-Marker as Meta Type 6
+ - changed: src/makefiles new arranged
+ - fixed: score editor: too many rests
+ - fixed: core if you try to insert note outside of staves
+0.2.3:
+ - MidiSyncConfig: extSync synchronized with button in transport
+ window
+ - audio: try oss audio device /dev/dsp in addition to /dev/sound/dsp
+ - changed: column expand logic in arranger tracklist
+ - new: KDE2.2: define HAVE_KDE in make.inc to compile a
+ KDE version of MusE (experimental)
+ - new: realtime recording of Midi SysEx Events
+ - changed: better LADSPA plugin handling
+ - fixed: Pianoroll: Color Events: RGB parameter out of range
+ - changed: canvas: moving objects
+ - fixed: AudioMasterMixer produced core after second invocation
+ - new: track markers
+0.2.2:
+ - switched to QT2.2
+ - fixed: Transport: "Master" button initialization
+ - fixed: session management for partlist in midi editors;
+ (new *.med xml files are probably incompatible
+ - fixed: cut&paste now works for parts on drum tracks
+ - fixed: cannot delete busy Parts any more
+ - fixed: honour LADSPA_PATH environment variable
+ - fixed: TransportWindow stays on top and is manageable
+ (testet with KDE2 beta4)
+ - fixed: arranger: column order is now recorded in
+ .med file
+ - fixed: sometimes under obscure circumstances MusE crashed
+ while opening an midi editor
+ - fixed: several typos/errors in *.med file reading/writing
+ - new: list editor: insert midi events (incl. sysex & meta)
+ double click on list entry to open editor to modify
+ values
+ - new: MTC/MMC Slave:
+ Configured as slave you can synchronize MusE
+ from external devices using Midi Time Code.
+ Midi Clock Master:
+ Configured as master MusE can control external
+ sequencers
+ Hooks for MTC/MMC Master and MidiClock slave.
+ - fixed: score: ScoreConfig::setTracklist() missing "clear"
+ - new: score: odd rest values implemented
+0.2.1:
+ - new: Arranger: move (midi) parts between applications:
+ - cut/copy part(s) to global clipboard
+ - paste part(s) from global clipboard to arranger
+ - drag parts with middle mouse button (experimental)
+ - new: Pianoroll: move events between applications:
+ - cut/copy events to global clipboard
+ - paste events from global clipboard to arranger
+ - drag events with middle mouse button
+ - fixed: only write audio if there are audio tracks
+ - fixed: PianorollEditor: moving multiple selected events
+ (thanks to Chris Wakelin)
+ - fixed: commented out unused/missing "color.xpm"
+ - fixed: partlist changed to multimap<>
+0.2.0:
+ - fixed: another error in OSS midi driver which results in
+ "bad file descriptor" aborts
+ - fixed: MidiFilter - RecordFilter/ThruFilter
+ - new: Master Part of Audio Mixer:
+ - Audio Level Meter
+ - LADSPA Host with
+ - automatic generated user interface
+ - presets store/load
+ - new: LADSPA "Freeverb" plugin for audio master
+ - new: Drum Editor
+ - load/save drum maps
+ - drawing reorganized
+ - new: Pianoroll Editor Functions:
+ - configurable event colors (none/pitch/velocity)
+ - configurable function ranges (apply functions to
+ all/loop/marked events)
+ - selection functions (all/none/loop/invert)
+ - switch between different parts in editor ("ghost events")
+ - PencilTool: Control+LeftMouseButton prevents
+ accidental creation of events
+ - PointerTool: Control+LeftMouseButton restricts
+ to horizontal or vertical move
+0.1.10:
+ - new: MidiExport: some configurable Parameter for exported
+ Standard Midi File (SMF)
+ - new: configurable Midi Record/Thru Filter for midi
+ realtime recording
+ - fixed: time signature changes in score editor
+ - fixed: "midi bar scale" is updated on time signature
+ changes
+ - fixed: event sorting in "list mastertrack editor"
+0.1.9:
+ - fixed: tempo changes during play
+ - fixed: "follow event" in graphical mastertrack editor
+ - fixed: mastertrack list: dynamic content update if song changed
+ - fixed: OSS midi serial output was broken
+0.1.8:
+ - bug: scaling in graphical mastertrack editor
+ - bug: reduce value of MAX_TICK to prevent overflow in scaling
+ - bug: pianoroll editor: length quantization
+ - bug: midi import: timing broken; bug introduced in 0.1.6
+ - feature: editing of time signature in graphical mastertrack
+0.1.7:
+ - bug: typo for 't'-kb accelerator in pianoroll-editor
+ - bug: quant values < 1/64 are not supported-> assertion bug
+ for keyboard accelerator >=8 in pianoroll editor
+ - pianoroll: new feature: step recording - midi input:
+ - press "shift"+ midiKey to enter chords
+ (if you enter same note again, it's deleted)
+ - press "ctrl" + midiKey to continue last note
+ - pianoroll: new menu function: quantize pos+len
+ - quantize configuration dialog: added flag for default len quantization
+ "whats this" help text
+0.1.6:
+ - bug: exported midifiles had random "division" timing parameter
+ - bug: core dump on midi record start
+ - feature: keyboard accelerators in pianoroll editor:
+ '1'-'9' '.' and 't' set quant & snap values
+
+0.1.5:
+ - MusE now works again without RTC (Real Time Clock) Device
+ (but much reduced timing accuracy)
+ - new Debug Options -m -M: MidiDump for input and output
+ - global keyboard accelerators:
+ spacebar: while play/record: STOP
+ while stop: Goto left mark
+ while on left mark: Goto Pos 0
+ Enter: start play
+ Insert: Stop
+ "/": Cycle on/off
+ "*": Record on
+ - Midi Step Recording: implemented external midi keyboard as
+ recording source (new "midi input" toggle button in pianoroll editor)
+0.1.4:
+ Audio
+ ==============
+ - simple audio play (ALSA & OSS)
+ - stubs for cliplist Editor, audio recording
+ - AudioMixer master volume
+ - bug fixes for wave viewer
+
+ Synthesizer
+ ==============
+ - first part of framework for realtime software synthesizer
+ driver/synthis, s1/*;
+
+0.1.3:
+ Score Editor:
+ ==============
+ - print preview button (gv)
+ - postscript default resolution is 72dpi and not 75dpi
+ - configurable overall scale for printer output
+ - simple beams
+
+ Misc:
+ ==============
+ - bug: path handling for project file: project files are now
+ saved in the correct directory
+ - bug: canvas initial scaling
+ - bug: core if configured device didnt exists
+ - bug: ctrl editor produced values > 127
+ - feature: Arranger: Parts are now displayed with a horizontal offset
+ - feature: Arranger: added save/restore for some configuration values
+ - feature: Midi Recording: track parameter like Transposition are now
+ applied before loop through
+ - feature: "Thru" flag in Configure->MidiDevices now implemented
+ - feature: Midi Remote Control: control sequencer stop/play/record/rewind
+ with configurable note events
+ - bug: typo in score/layout.c:split() caused core
+
+0.1.2:
+ - Score:
+ - add lyrics entry
+ - changed note head for 4/4
+ - changed positioning of 2/4 and 4/4 notes
+ - ties can now span systems
+ - tie connected notes are selected as one note
+ - page settings, margins handling corrected
+ - configurable fonts for score editor page layout
+0.1.1:
+ - master: scale changed
+ - no more core when selecting the score editor without a selected
+ part to edit
+ - time signature scale in master track
+ - master track: function tempo edit
+ - new popup menu in arranger / part canvas
+ - makefile: "make depend" target
+ - new: alsa raw midi interface
+ - improved score editor:
+ - split system (piano left&right hand)
+ - multi stave systems
+ - symbols
+ - lasso selection
+ - dynamics symbol palette
+ - window position of all toplevel windows is now remembered
+ correctly
+ - bug fixes & code cleanups
+
+0.0.10:
+ - removed obsolete file.c file.h
+ - separated midi archive
+ - removed unused widgets/wtscale.*
+ - removed unused widgets/dial.*
+ - midis with Meta Event Type 6 produced core
+ - removed '\n' chars from windows caption
+ - new setBg(QColor) method for class View
+ - broken Ctrl-Editor fixed
+ - Pencil Cursor now shown for Pencil Tool in Ctrl-Editor
+ - Mute Indicator changed to red dot
+ - added CtrlEditor to DrumEditor
+ - process session info in xml songfile
+ - more work on mastertrack
+ - start ScoreEditor and moving the mouse on canvas (producing
+ mouseMoveEvents) before exposure of QLineEdit (time & pitch
+ in toolbar) produced core on QLineEdit->setText(xx)
+ - in continuous scroll mode position marker updated correctly
+0.0.9:
+ - xml like configuration and song file
+ - new midi mixer, shows only active midi channels
+ - bug: metronom configuration: channel&port numbers
+ - bug fixes
+0.0.8:
+ - new: quantize function
+ - new: wave tracks: new classes: WaveFile Clip;
+ load wave file; expand song file structure
+ first try on wave editor;
+ - logarithmic magnify
+ - rework of View & Canvas Classes, resulting in much
+ faster scrolling
+0.0.7:
+ - fatal error: use of uninitialized device
+0.0.6:
+ - more diagnostics in file functions
+ - new: can load and save *.gz and *.bz2 files
+ - new function: send local off to instruments
+ - bug fixes in pianoroll step recording
+ - bug fix: "follow song" save and restore
+ - bug fix: in importing midi files: calculating parts
+ - bug fix: metronome -> core
+ - new configuration options for parts
+
+0.0.5:
+ - new: midi activity display in tracklist
+ - new: patch selector in channel info; shows midi instrument
+ categories
+ - new: insert & delete Controller Values in Ctrl-Editor
+ - some minor bugs corrected
+ - nasty bug in Song::nextEvents(), which prevents simple
+ midi songs played correctly
+
+0.0.4:
+ - implemented: forward & rewind buttons
+ - implemented: drum edit: change values in info bar
+ - error: arranger->tracklist: resize failed if columns are swapped
+ - enhanced file selector for background image selection
+ - more WhatsThis and ToolTip Help
+ - Backport to QT202: Filedialog: Filterlists dont work
+ - Midi Config: changed signal click() to rightButtonClick()
+ - missing initialisation in song constructor
+ - new subdirectory for controller editor
+ - controller editor for some values
+0.0.3:
+ - new transport design
+ - redesign of TrackInfo and ChannelInfo
+ - some changes reg. fonts and geometry management
+ - misc toolbars changed to read qt toolbars
+0.0.2:
+ - changed color for cpos to red
+ - dont play metronome clicks with time < current
+ - doubleclick on arranger trackname: entrywidget now gets
+ input focus
+ - midi device configuration: reworked
+ - removed endless loop in Song::nextEvents()
+ - ported to qt-2.1.0-snapshot-20000113
+ - changed QPushButton to QToolButton
+ - some cosmetic changes in transport window
+
+0.0.1
+ - first release
+
diff --git a/muse/Doxyfile b/muse/Doxyfile
new file mode 100644
index 00000000..38e2dff4
--- /dev/null
+++ b/muse/Doxyfile
@@ -0,0 +1,150 @@
+# Doxygen configuration generated by Doxywizard version 0.1
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = MusE
+PROJECT_NUMBER = 1.0pre1
+OUTPUT_DIRECTORY = doc
+OUTPUT_LANGUAGE = English
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ALWAYS_DETAILED_SEC = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+INTERNAL_DOCS = YES
+CLASS_DIAGRAMS = YES
+SOURCE_BROWSER = YES
+INLINE_SOURCES = YES
+STRIP_CODE_COMMENTS = YES
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+VERBATIM_HEADERS = YES
+SHOW_INCLUDE_FILES = YES
+JAVADOC_AUTOBRIEF = NO
+INHERIT_DOCS = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+ENABLED_SECTIONS =
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+ALIASES =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = .
+FILE_PATTERNS = *.cpp \
+ *.h
+RECURSIVE = YES
+EXCLUDE =
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_SOURCE_FILES = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = doxygen
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = YES
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = YES
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = YES
+PERL_PATH = /bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+HAVE_DOT = YES
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+GRAPHICAL_HIERARCHY = YES
+DOT_PATH = /usr/bin
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
+GENERATE_LEGEND = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
+CGI_NAME = search.cgi
+CGI_URL =
+DOC_URL =
+DOC_ABSPATH =
+BIN_ABSPATH = /usr/bin/
+EXT_DOC_PATHS =
diff --git a/muse/Doxyfile.in b/muse/Doxyfile.in
new file mode 100644
index 00000000..576874e1
--- /dev/null
+++ b/muse/Doxyfile.in
@@ -0,0 +1,150 @@
+# Doxygen configuration generated by Doxywizard version 0.1
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = MusE
+PROJECT_NUMBER = @VERSION@
+OUTPUT_DIRECTORY = doc
+OUTPUT_LANGUAGE = English
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ALWAYS_DETAILED_SEC = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+INTERNAL_DOCS = YES
+CLASS_DIAGRAMS = YES
+SOURCE_BROWSER = YES
+INLINE_SOURCES = YES
+STRIP_CODE_COMMENTS = YES
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+VERBATIM_HEADERS = YES
+SHOW_INCLUDE_FILES = YES
+JAVADOC_AUTOBRIEF = NO
+INHERIT_DOCS = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+ENABLED_SECTIONS =
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+ALIASES =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = .
+FILE_PATTERNS = *.cpp \
+ *.h
+RECURSIVE = YES
+EXCLUDE =
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_SOURCE_FILES = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = doxygen
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = YES
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = @DOXYGEN_TREEVIEW@
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = YES
+PERL_PATH = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+HAVE_DOT = @HAVEDOT@
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+GRAPHICAL_HIERARCHY = YES
+DOT_PATH = @DOTPATH@
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
+GENERATE_LEGEND = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
+CGI_NAME = search.cgi
+CGI_URL =
+DOC_URL =
+DOC_ABSPATH =
+BIN_ABSPATH = /usr/bin/
+EXT_DOC_PATHS =
diff --git a/muse/NEWS b/muse/NEWS
new file mode 100644
index 00000000..a97689c7
--- /dev/null
+++ b/muse/NEWS
@@ -0,0 +1,40 @@
+MusE 1.0:
+ New features:
+ - "auto fill" parts
+ - DSSI support
+ - controller automation in arranger
+ - audio metronome
+ - support for VST plugins
+ - new midi routing code
+ - midi plugins
+ - parts and events are updated in realtime during recording
+
+MusE 0.7:
+ New features:
+
+ - MusE now depends on JACK; midi event timing is coupled
+ to JACK timing i.e
+ - simpler integration of internal software synthesizer;
+ midi events are now delivered directly to synthesizer without
+ ALSA. This eleminates the need of an extra realtime thread
+ for every synthesizer instance.
+ - instrument definition files "*.idf" files now describe
+ available midi controller for instrument
+ - software synthesizer show available midi controller
+ with name in controller editor pulldown
+ - 14 bit midi controllers (RPN'n NRPN's) can be handled in
+ graphical controller editor
+ - imported midi can be added to current song
+ - "New" now shows a selection of template songs to start with
+ - Keyboard shortcuts editor: most (all?) shortcuts can now be changed at
+ runtime.
+ - Redesigned audio-mixer with much improved routing capabilities
+ towards JACK.
+ - Track types extended, input, output, group, aux, wavetrack,
+ softsynth, miditrack, drumtrack
+ - The beginings of automation, only volume/pan at the moment.
+ - Improved RT performance, xruns should be a thing of the past. :)
+ - JACK transport integration
+ - support of JACK "freewheel" mode
+ - extended configuration - configurable shortcuts
+
diff --git a/muse/README b/muse/README
new file mode 100644
index 00000000..df7d908a
--- /dev/null
+++ b/muse/README
@@ -0,0 +1,76 @@
+====================================================================
+ MusE --- Linux (Midi) Music Editor
+====================================================================
+
+Welcome to MusE, the open source MIDI/Audio sequencer.
+
+MusE is distributed under the GNU General Public License (GPL).
+Please check out the file COPYING in this directory for more
+details.
+
+,-----------------------------------------------------------------.
+| NOTICE |
+|-----------------------------------------------------------------|
+| Some parts of MusE code are EXPERIMENTAL, and may well result |
+| in a CRASH, and who knows what other ill effects. |
+| RUN THIS SOFTWARE AT YOUR OWN RISK. |
+`-----------------------------------------------------------------'
+
+ =============================
+ Requirements
+ =============================
+
+ - QT: Qt 4.1.0 or above
+ ftp://ftp.trolltech.com/qt/source
+ MusE does _not_ compile with older versions
+ MAKE SURE YOU SET YOUR 'QTDIR' ENVIRONMENT VARIABLE
+
+ - ALSA 1.0 or newer
+ http://www.alsa-project.org/
+
+ - gcc 3.4.x
+ NOTE: you should compile MusE with the same compiler
+ you used to compile QT
+
+ - libsndfile >= 1.0.1
+ http://www.zip.com.au/~erikd/libsndfile/
+
+ - JACK
+ http://jackit.sourceforge.net/download/
+
+ - fluidsynth-1.0.3 (formerly known as iiwusynth) from
+ http://savannah.nongnu.org/download/fluid
+
+ - (if you compile from cvs:) automake 1.7 and autoconf 2.54
+
+ =============================
+ Compiling:
+ =============================
+
+ - download source from http://lmuse.sourceforge.net/
+ - uncompress source:
+ bunzip2 muse-x.x.x.tar.bz2
+ - untar source:
+ tar xvof muse-x.x.x.tar </code>
+ or if you have a recent tar, you can combine both steps:
+ tar xvofj muse-x.x.x.tar.bz2
+
+ - enter dirctory muse-x.x.x:
+ MAKE SURE YOU SET YOUR 'QTDIR' ENVIRONMENT VARIABLE
+ run configure
+ run make all
+
+ - as root run:
+ make install
+ to install MusE
+
+ =============================
+ some known bugs
+ =============================
+
+ - many
+
+====================================================================
+Let me know whether MusE works for you !!!
+Have a look at the webpage http://lmuse.sourceforge.net/ for details.
+
diff --git a/muse/Reference b/muse/Reference
new file mode 100644
index 00000000..9aed268d
--- /dev/null
+++ b/muse/Reference
@@ -0,0 +1,59 @@
+MusE Function Reference
+
+Ruler
+ - left button press:
+ set location marker
+ - mid button press:
+ set left location marker
+ - right button press:
+ set right location marker
+ - shift + left button click:
+ set marker
+ - shift + right button click:
+ remove left marker
+
+Slider
+ - you dont have to hit the slider button to start dragging
+ - mouse wheel moves slider
+
+VolumeSlider
+ - left button double click sets slider to zero (-inf)
+ - right button double click sets volume to 0dB
+
+Meter Bar
+ - peak marker reset after configurable time
+
+Transport
+ - forward button
+ - rewind button
+ - "rewind to zero" button
+ - play button
+ - stop button
+ - record button
+ - rewind button moves horizontal canvas slider to position zero in
+ all "follow" modes
+ - forward and rewind buttons have auto repeat functionality
+ - transport stops at end of song if not recording
+
+Midi Editors
+ - left mouse click on event selects event
+ - shift + left mouse click toggles selection of event
+ - ctrl + left mouse click selects all events of same pitch
+ - mouse drag: move selected events
+ - shift + mouse drag: copy event
+ - shift + ctrl + mouse drag: restrict drag in x or y direction whatever
+ motion comes first
+ - If one event is selected, the info line shows the event properties.
+ If more than one event is selected, the info line initially shows zero
+ values, If changed, the displayed value is added to all marked events.
+
+ Drum Editor
+
+ Pianoroll Editor
+
+Wave Editor
+ - not implemented
+
+List Editor
+ - not implemented
+
diff --git a/muse/SECURITY b/muse/SECURITY
new file mode 100644
index 00000000..d09e03d9
--- /dev/null
+++ b/muse/SECURITY
@@ -0,0 +1,244 @@
+MusE Security Information
+=========================
+
+In order to operate reliably at low latencies, MusE needs root privileges.
+For a stand-alone computer in a home environment, this is not a problem.
+However, on networked machines with multi-user access, there are some security
+issues to be aware of.
+
+
+Why does MusE require root privileges ?
+---------------------------------------
+
+1.
+MusE must set the real time clock (/dev/rtc/) to a higher rate in order to get
+a more precise timing source than the standard setting would allow.
+For this task, it is *not* sufficient to alter the permissions or group of
+/dev/rtc. You need root access.
+
+2.
+The MusE audio threads must acquire real-time scheduling to perform with low
+latency and free of dropouts. Since this could be misused for a local
+denial-of-service attack (you can hog 100% cpu with a real-time task, thus
+effectively making the system unusable), only root is allowed to do that.
+
+
+Do I need to be root to run MusE ?
+----------------------------------
+
+No. You should not do normal work as root. Use the root login exclusively for
+administrative tasks. You can run MusE as a normal user, provided you have set
+the *suid bit*.
+This is done automatically when you build and install MusE.
+
+
+How does this "suid bit" thing work ?
+--------------------------------------
+
+Normally, when a program is started, it gets the user and group id of the user
+who started it, and thus has the same permissions as the user. It can read and
+write the same files and use the same devices.
+
+Some applications need higher privileges to perform certain tasks, but must be
+available to normal users. To accomplish this, UNIX-like systems have the
+concept of the "effective user id".
+
+That means you can start a process, but the effective user id will be someone
+else's, most likely that of the root user. You can recognize such programs by
+the suid (for set-user-id) bit in their permissions.
+
+For example, when you do
+
+ #ls -l /bin/ping
+
+you will see something like
+
+ -rwsr-xr-x 1 root root 20908 Feb 27 2001 /bin/ping .
+
+This tells you it's a normal file (the first dash), it is readable and writable
+by the owner (root) and has the owner's suid bit set (the letter "s").
+You may invoke it as a normal user, but the program will have root permissions
+while it runs.
+
+(Btw, there is also an sgid (set-group-id) bit, which allows a program to be run
+with the permissions of the group it is owned by. This can be used for
+finer-grained access control to some programs but is rarely used in practice.)
+
+(Btw2, the letter "s" actually means both "executable" AND "set-{user,group}-id".
+A capital "S" stands for "set-uid" without the execution privilege, which also
+very rarely seen on real systems.)
+
+
+What is the problem with suid programs ?
+----------------------------------------
+
+suid programs are safe as long as you can be sure they do only the job they were
+written to do. For instance, you certainly want users to be able to do a ping,
+but you wouldn't want them to wipe out the system disk while doing it.
+
+Unfortunately, there is a very common vulnerability in many programs called a
+buffer overflow, which allows an attacker to spawn a shell from within a suid
+program that inherits the permissions, giving him or her root access to the
+entire system.
+This exploit is fairly easy for an experienced attacker. All that's needed is
+the compiled equivalent of the C expression execve("/bin/sh"), which can be
+inserted into the running program whenever it does not check the length of user
+input properly, by overflowing a buffer and thus overwriting a part of
+the program code with the shell exploit code.
+
+The more complex a program becomes, the more likely buffer overflow
+vulnerabilities slip in.
+
+If you are interested in details of such attacks, I recommend AlephOne's paper
+"Smashing the stack for fun and profit", to be found in Issue 49 of Phrack
+Magazine (http://www.phrack.com/show.php?p=49&a=14).
+
+
+Does MusE have buffer-overflow vulnerabilities ?
+------------------------------------------------
+
+It may. But even if it had not, it is good practice to assume it does.
+As soon as you are in a security-critical environment, you should treat all suid
+programs with extra care unless they are proven to be secure.
+
+This is a gruesome and boring task, and we all want Werner to concentrate on
+cool new features rather than digging through the code to fix loopholes that
+aren't even a problem for 99% of the MusE users.
+MusE does not need to be as secure as server daemons. It is intended for home
+use in a trusted environment.
+If you run MusE on your company's primary DNS server, it's your fault.
+
+But even home machines can become targets for intruders the moment they connect
+to the internet. Since almost all of the machines than run MusE are occasionally
+used to surf the web, it might be worth taking a few precautions.
+
+
+What can I do to minimize the risk of a suid program ?
+------------------------------------------------------
+
+By default, Werner drops the root privileges in MusE's GUI thread - only the
+audio threads keep it. This rules out many possible exploits, since GUI code is
+usually the hardest to make secure.
+
+
+As a further very simple yet effective security precaution, you can create a
+group of trusted users, and give only this group access to critical suid
+programs. For example, you might create a group called musers, of which you and
+your best friend are members. Then you can set the muse binary as follows:
+
+ #chown root:musers muse
+ #chmod 4750 muse
+ #ls -l muse
+ -rwsr-x--- 1 root musers 20930049 Aug 28 19:34 muse
+
+Now only members of the group musers can use MusE, Joe Random Hacker can not.
+(However, if your account is hacked, MusE can then be exploited to gain root,
+but hey...)
+
+Additionally, you can use "givertcap" as described in the next section.
+
+
+What is givertcap and how do I use it ?
+---------------------------------------
+
+"givertcap" (give real-time capabilites) is a small wrapper written by Tommi
+Ilmonen.
+When enabled, it is executed by MusE and gives to it just the capabilities
+needed to set the timer and get real-time scheduling, but not the full set of
+root privileges. This greatly reduces the amount of damage that can be done.
+
+However, it is not used by default, since it requires a kernel modification.
+
+To enable givertcap, simply call ./configure --enable-rtcap before compiling.
+(The givertcap code is part of the MusE distribution.)
+
+With current kernels, you need to apply a little patch to the kernel headers:
+Go to /usr/src/linux/include/linux (or wherever you have your kernel sources)
+and in the file capability.h change the line
+
+ #define CAP_INIT_EFF_SET to_cap_t(~0&~CAP_TO_MASK(CAP_SETPCAP))
+to
+ #define CAP_INIT_EFF_SET to_cap_t( ~0 )
+
+and the line
+
+ #define CAP_INIT_INH_SET to_cap_t(0)
+to
+ #define CAP_INIT_INH_SET to_cap_t( ~0 )
+.
+
+You must then recompile your kernel.
+
+In this setup, givertcap must be set suid root, but MusE can be run with normal
+privileges.
+Now all possible suid exploits described above apply to givertcap, but since it
+is such a tiny program, it can be checked for exploits far more easily and can
+be considered reasonably secure.
+
+Unfortunately, givertcap can be used to grant real-time privileges to *any*
+program, so it's an easy way to have the machine clogged up by a malicious user
+who might run bogus tasks at 100% system usage.
+Therefore, you *must* create an extra group for it (called "musers" in this
+example):
+ # chown root:musers givertcap
+ # chmod 4750 givertcap
+Do not forget to remove the suid bit on muse afterwards by doing
+ # chmod 755 muse
+.
+
+For more information about givertcap and kernel capabilites, see
+http://www.tml.hut.fi/~tilmonen/givertcap/
+and
+http://ftp.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.4/capfaq-0.2.
+txt.
+
+
+
+Further reading:
+================
+
+General Linux system security:
+http://linuxdoc.org/HOWTO/Security-Quickstart-HOWTO/
+http://linuxdoc.org/HOWTO/Security-HOWTO.html
+
+Secure Linux programming:
+http://linuxdoc.org/HOWTO/Secure-Programs-HOWTO/
+
+Permissions:
+man chmod
+man chattr
+
+givertcap:
+http://www.tml.hut.fi/~tilmonen/givertcap/
+
+An alternative approach, using a kernel module:
+http://arctrix.com/nas/linux/capwrap.tar.gz
+
+Kernel capabilites:
+http://ftp.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.4/capfaq-0.2.
+txt
+
+Adding capability flags to ELF files:
+http://atrey.karlin.mff.cuni.cz/~pavel/elfcap.html
+
+
+Buffer Overflow attacks:
+"Smashing the stack for fun and profit" by AlephOne 1996, published in
+Phrack magazine, issue 49
+http://www.phrack.com/show.php?p=49&a=14
+
+In the MusE source, app.cpp contains the invocation of givertcap and the
+dropping of the suid privileges: grep for "getCapabilities" and "setuid" to see
+how it's done.
+
+________________________________________________________________________________
+
+
+This document was written by Jörn Nettingsmeier
+<nettings@folkwang-hochschule.de>
+Corrections and improvements welcome.
+
+Thanks to Werner Schweer and Tommi Ilmonen for answering my questions.
+
+Last updated 02/22/2002.
+
diff --git a/muse/TODO b/muse/TODO
new file mode 100644
index 00000000..a62e6cef
--- /dev/null
+++ b/muse/TODO
@@ -0,0 +1,73 @@
+ convert make system to cmake
+ - change *.ui names (remove *base*)
+ - rearrange code if necessary
+
+ move to subversion
+
+-----------------------------TODO-------------------------------------------
+(1.2.2006)
+
+BUGS
+ - updating the gui during midi recording is too slow;
+ a new, faster implementation is needed
+
+ - dont allow midi editing during recording. Treat recording
+ as one undoable action.
+
+ - Do not allow switch track recording on/off during recording
+
+FEATURES
+ - wave editor is completely broken
+
+ - list editor
+
+ - missing time signature ruler in master editor
+
+ - If events recorded outside part ask after recording what to do:
+ delete events / expand part
+
+ - what to do with events, which start in a part and end outside
+ a part (too long to fit entirely in part)
+ - on recording
+ - on cut part (split?)
+
+ - recording: punch in/out
+
+ - system info page: show internal statistics about
+ - buffer usage (fifo usage)
+ - overruns/underruns etc.
+ - actual thread state and priorities
+ - actual used timer resource
+
+ - export midi
+
+ - Import MusE 0.7 song files
+
+ - NEW function with templates
+
+ - manage project subdirectories (better organize wave files)
+
+
+CLEANUPS
+ - Cleanup the icon/pixmap handling using Qt resource file:
+ - rename xpm directory to resources/images
+ - remove all unreferenced files
+ - transform *.xpm into *.pnm or *.jpg files and move into
+ resource file
+ - redirect all *xpm program references to resource file
+ - remove icon.cpp icon.h
+
+ - implement main widget with qt designer
+
+Wishlist
+ - it should be possible to show controller events in the
+ tracklist for tracktypes which cannot contain
+ Parts to make better use of screen real estate.
+ GUI-wise a "Add Controller" button is needed.
+
+ - the controller selector in "Add Controller" should be
+ implemented as a modal dialog. This allows for
+ presenting the list of controller in a structured
+ way.
+
+
diff --git a/muse/al/CMakeLists.txt b/muse/al/CMakeLists.txt
new file mode 100644
index 00000000..15f83580
--- /dev/null
+++ b/muse/al/CMakeLists.txt
@@ -0,0 +1,14 @@
+#
+#
+#
+#
+
+add_library(al STATIC
+ al.cpp marker.cpp pos.cpp sig.cpp tempo.cpp xml.cpp
+ )
+set_target_properties( al
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_SOURCE_DIR}/all.h"
+ )
+
+add_dependencies(al ${PROJECT_SOURCE_DIR}/all.h.pch)
+
diff --git a/muse/al/al.cpp b/muse/al/al.cpp
new file mode 100644
index 00000000..af141170
--- /dev/null
+++ b/muse/al/al.cpp
@@ -0,0 +1,28 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al.h"
+
+namespace AL {
+ int sampleRate = 44100;
+ int mtcType = 0;
+ int division = 384;
+ };
+
diff --git a/muse/al/al.h b/muse/al/al.h
new file mode 100644
index 00000000..4f4e71a4
--- /dev/null
+++ b/muse/al/al.h
@@ -0,0 +1,33 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AL_H__
+#define __AL_H__
+
+namespace AL {
+
+ extern int sampleRate;
+ extern int mtcType;
+ extern int division;
+
+ }
+
+#endif
+
diff --git a/muse/al/marker.cpp b/muse/al/marker.cpp
new file mode 100644
index 00000000..2a0a4a0a
--- /dev/null
+++ b/muse/al/marker.cpp
@@ -0,0 +1,86 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "marker.h"
+#include "xml.h"
+
+namespace AL {
+
+//---------------------------------------------------------
+// add
+//---------------------------------------------------------
+
+Marker* MarkerList::add(const Marker& marker)
+ {
+ iMarker i = insert(std::pair<const int, Marker> (marker.tick(), Marker(marker)));
+ return &i->second;
+ }
+
+Marker* MarkerList::add(const QString& s, const Pos& pos)
+ {
+ Marker marker(pos);
+ marker.setName(s);
+ iMarker i = insert(std::pair<const int, Marker> (pos.tick(), marker));
+ return &i->second;
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void Marker::read(QDomNode node)
+ {
+ Pos::read(node);
+ QDomElement e = node.toElement();
+ _name = e.attribute("name");
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void MarkerList::write(Xml& xml) const
+ {
+ for (ciMarker i = begin(); i != end(); ++i) {
+ const Marker& m = i->second;
+ if (m.type() == TICKS)
+ xml.tagE("marker tick=\"%d\" name=\"%s\"", m.tick(), m.name().toLatin1().data());
+ else
+ xml.tagE("marker sample=\"%d\" name=\"%s\"", m.frame(), m.name().toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// remove
+//---------------------------------------------------------
+
+void MarkerList::remove(Marker* m)
+ {
+ for (iMarker i = begin(); i != end(); ++i) {
+ Marker* mm = &i->second;
+ if (mm == m) {
+ erase(i);
+ return;
+ }
+ }
+ printf("MarkerList::remove(): marker not found\n");
+ }
+}
+
diff --git a/muse/al/marker.h b/muse/al/marker.h
new file mode 100644
index 00000000..7c77f72e
--- /dev/null
+++ b/muse/al/marker.h
@@ -0,0 +1,67 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MARKER_H__
+#define __MARKER_H__
+
+#include "pos.h"
+
+namespace AL {
+ class Xml;
+
+//---------------------------------------------------------
+// Marker
+//---------------------------------------------------------
+
+class Marker : public Pos {
+ QString _name;
+ bool _current;
+
+ public:
+ Marker() : _current(false) {}
+ Marker(const Pos& m) : Pos(m), _current(false) {}
+ Marker(const QString& s, bool cur = false)
+ : _name(s), _current(cur) {}
+ void read(QDomNode);
+ const QString name() const { return _name; }
+ void setName(const QString& s) { _name = s; }
+ bool current() const { return _current; }
+ void setCurrent(bool f) { _current = f; }
+ };
+
+//---------------------------------------------------------
+// MarkerList
+//---------------------------------------------------------
+
+class MarkerList : public std::multimap<unsigned, Marker, std::less<unsigned> > {
+ public:
+ Marker* add(const Marker& m);
+ Marker* add(const QString& s, const Pos&);
+ void write(Xml&) const;
+ void remove(Marker*);
+ };
+
+typedef std::multimap<unsigned, Marker, std::less<unsigned> >::iterator iMarker;
+typedef std::multimap<unsigned, Marker, std::less<unsigned> >::const_iterator ciMarker;
+
+} // end namespace AL
+
+#endif
+
diff --git a/muse/al/pos.cpp b/muse/al/pos.cpp
new file mode 100644
index 00000000..7c6e6c8e
--- /dev/null
+++ b/muse/al/pos.cpp
@@ -0,0 +1,581 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al.h"
+#include "pos.h"
+#include "xml.h"
+#include "tempo.h"
+#include "sig.h"
+
+namespace AL {
+
+//---------------------------------------------------------
+// Pos
+//---------------------------------------------------------
+
+Pos::Pos()
+ {
+ _type = TICKS;
+ _tick = 0;
+ _frame = 0;
+ sn = -1;
+ }
+
+Pos::Pos(const Pos& p)
+ {
+ _type = p._type;
+ sn = p.sn;
+ _tick = p._tick;
+ _frame = p._frame;
+ }
+
+Pos::Pos(unsigned t, TType timeType)
+ {
+ _type = timeType;
+ if (_type == TICKS)
+ _tick = t;
+ else
+ _frame = t;
+ sn = -1;
+ }
+
+Pos::Pos(const QString& s)
+ {
+ int m, b, t;
+ sscanf(s.toLatin1().data(), "%04d.%02d.%03d", &m, &b, &t);
+ _tick = sigmap.bar2tick(m, b, t);
+ _type = TICKS;
+ sn = -1;
+ }
+
+Pos::Pos(int measure, int beat, int tick)
+ {
+ _tick = sigmap.bar2tick(measure, beat, tick);
+ _type = TICKS;
+ sn = -1;
+ }
+
+Pos::Pos(int min, int sec, int frame, int subframe)
+ {
+ double time = min * 60.0 + sec;
+
+ double f = frame + subframe/100.0;
+ switch (AL::mtcType) {
+ case 0: // 24 frames sec
+ time += f * 1.0/24.0;
+ break;
+ case 1: // 25
+ time += f * 1.0/25.0;
+ break;
+ case 2: // 30 drop frame
+ time += f * 1.0/30.0;
+ break;
+ case 3: // 30 non drop frame
+ time += f * 1.0/30.0;
+ break;
+ }
+ _type = FRAMES;
+ _frame = lrint(time * AL::sampleRate);
+ sn = -1;
+ }
+
+//---------------------------------------------------------
+// setType
+//---------------------------------------------------------
+
+void Pos::setType(TType t)
+ {
+ if (t == _type)
+ return;
+
+ if (_type == TICKS) {
+ // convert from ticks to frames
+ _frame = tempomap.tick2frame(_tick, _frame, &sn);
+ }
+ else {
+ // convert from frames to ticks
+ _tick = tempomap.frame2tick(_frame, _tick, &sn);
+ }
+ _type = t;
+ }
+
+//---------------------------------------------------------
+// operator+=
+//---------------------------------------------------------
+
+Pos& Pos::operator+=(const Pos& a)
+ {
+ if (_type == FRAMES)
+ _frame += a.frame();
+ else
+ _tick += a.tick();
+ sn = -1; // invalidate cached values
+ return *this;
+ }
+
+//---------------------------------------------------------
+// operator-=
+//---------------------------------------------------------
+
+Pos& Pos::operator-=(const Pos& a)
+ {
+ if (_type == FRAMES)
+ _frame -= a.frame();
+ else
+ _tick -= a.tick();
+ sn = -1; // invalidate cached values
+ return *this;
+ }
+
+//---------------------------------------------------------
+// operator+=
+//---------------------------------------------------------
+
+Pos& Pos::operator+=(int a)
+ {
+ if (_type == FRAMES)
+ _frame += a;
+ else
+ _tick += a;
+ sn = -1; // invalidate cached values
+ return *this;
+ }
+
+//---------------------------------------------------------
+// operator-=
+//---------------------------------------------------------
+
+Pos& Pos::operator-=(int a)
+ {
+ if (_type == FRAMES)
+ _frame -= a;
+ else
+ _tick -= a;
+ sn = -1; // invalidate cached values
+ return *this;
+ }
+
+Pos operator+(const Pos& a, int b)
+ {
+ Pos c(a);
+ return c += b;
+ }
+
+Pos operator-(const Pos& a, int b)
+ {
+ Pos c(a);
+ return c -= b;
+ }
+
+Pos operator+(const Pos& a, const Pos& b)
+ {
+ Pos c(a);
+ return c += b;
+ }
+
+Pos operator-(const Pos& a, const Pos& b)
+ {
+ Pos c(a);
+ return c -= b;
+ }
+
+bool Pos::operator>=(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame >= s.frame();
+ else
+ return _tick >= s.tick();
+ }
+
+bool Pos::operator>(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame > s.frame();
+ else
+ return _tick > s.tick();
+ }
+
+bool Pos::operator<(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame < s.frame();
+ else
+ return _tick < s.tick();
+ }
+
+bool Pos::operator<=(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame <= s.frame();
+ else
+ return _tick <= s.tick();
+ }
+
+bool Pos::operator==(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame == s.frame();
+ else
+ return _tick == s.tick();
+ }
+
+bool Pos::operator!=(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame != s.frame();
+ else
+ return _tick != s.tick();
+ }
+
+//---------------------------------------------------------
+// tick
+//---------------------------------------------------------
+
+unsigned Pos::tick() const
+ {
+ if (_type == FRAMES)
+ _tick = tempomap.frame2tick(_frame, _tick, &sn);
+ return _tick;
+ }
+
+//---------------------------------------------------------
+// frame
+//---------------------------------------------------------
+
+unsigned Pos::frame() const
+ {
+ if (_type == TICKS)
+ _frame = tempomap.tick2frame(_tick, _frame, &sn);
+ return _frame;
+ }
+
+//---------------------------------------------------------
+// setTick
+//---------------------------------------------------------
+
+void Pos::setTick(unsigned pos)
+ {
+ _tick = pos;
+ sn = -1;
+ if (_type == FRAMES)
+ _frame = tempomap.tick2frame(pos, &sn);
+ }
+
+//---------------------------------------------------------
+// setFrame
+//---------------------------------------------------------
+
+void Pos::setFrame(unsigned pos)
+ {
+ _frame = pos;
+ sn = -1;
+ if (_type == TICKS)
+ _tick = tempomap.frame2tick(pos, &sn);
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void Pos::write(Xml& xml, const char* name) const
+ {
+ if (_type == TICKS)
+ xml.tagE("%s tick=\"%d\"", name, _tick);
+ else
+ xml.tagE("%s frame=\"%d\"", name, _frame);
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void Pos::read(QDomNode node)
+ {
+ sn = -1;
+
+ QDomElement e = node.toElement();
+ QString s;
+ s = e.attribute("tick");
+ if (!s.isEmpty()) {
+ _tick = s.toInt();
+ _type = TICKS;
+ }
+ s = e.attribute("frame");
+ if (!s.isEmpty()) {
+ _frame = s.toInt();
+ _type = FRAMES;
+ }
+ }
+
+//---------------------------------------------------------
+// PosLen
+//---------------------------------------------------------
+
+PosLen::PosLen()
+ {
+ _lenTick = 0;
+ _lenFrame = 0;
+ sn = -1;
+ }
+
+PosLen::PosLen(const PosLen& p)
+ : Pos(p)
+ {
+ _lenTick = p._lenTick;
+ _lenFrame = p._lenFrame;
+ sn = -1;
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void PosLen::dump(int n) const
+ {
+ Pos::dump(n);
+ printf(" Len(");
+ switch(type()) {
+ case FRAMES:
+ printf("samples=%d)\n", _lenFrame);
+ break;
+ case TICKS:
+ printf("ticks=%d)\n", _lenTick);
+ break;
+ }
+ }
+
+void Pos::dump(int /*n*/) const
+ {
+ printf("Pos(%s, sn=%d, ", type() == FRAMES ? "Frames" : "Ticks", sn);
+ switch(type()) {
+ case FRAMES:
+ printf("samples=%d)", _frame);
+ break;
+ case TICKS:
+ printf("ticks=%d)", _tick);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void PosLen::write(Xml& xml, const char* name) const
+ {
+ if (type() == TICKS)
+ xml.tagE("%s tick=\"%d\" len=\"%d\"", name, tick(), _lenTick);
+ else
+ xml.tagE("%s sample=\"%d\" len=\"%d\"", name, frame(), _lenFrame);
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void PosLen::read(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ QString s;
+ s = e.attribute("tick");
+ if (!s.isEmpty()) {
+ setType(TICKS);
+ setTick(s.toInt());
+ }
+ s = e.attribute("sample");
+ if (!s.isEmpty()) {
+ setType(FRAMES);
+ setFrame(s.toInt());
+ }
+ s = e.attribute("len");
+ if (!s.isEmpty()) {
+ int n = s.toInt();
+ if (type() == TICKS)
+ setLenTick(n);
+ else
+ setLenFrame(n);
+ }
+ }
+
+//---------------------------------------------------------
+// setLenTick
+//---------------------------------------------------------
+
+void PosLen::setLenTick(unsigned len)
+ {
+ _lenTick = len;
+ sn = -1;
+// if (type() == FRAMES)
+ _lenFrame = tempomap.tick2frame(len, &sn);
+ }
+
+//---------------------------------------------------------
+// setLenFrame
+//---------------------------------------------------------
+
+void PosLen::setLenFrame(unsigned len)
+ {
+ _lenFrame = len;
+ sn = -1;
+// if (type() == TICKS)
+ _lenTick = tempomap.frame2tick(len, &sn);
+ }
+
+//---------------------------------------------------------
+// lenTick
+//---------------------------------------------------------
+
+unsigned PosLen::lenTick() const
+ {
+ if (type() == FRAMES)
+ _lenTick = tempomap.frame2tick(_lenFrame, _lenTick, &sn);
+ return _lenTick;
+ }
+
+//---------------------------------------------------------
+// lenFrame
+//---------------------------------------------------------
+
+unsigned PosLen::lenFrame() const
+ {
+ if (type() == TICKS)
+ _lenFrame = tempomap.tick2frame(_lenTick, _lenFrame, &sn);
+ return _lenFrame;
+ }
+
+//---------------------------------------------------------
+// end
+//---------------------------------------------------------
+
+Pos PosLen::end() const
+ {
+ Pos pos(*this);
+ pos.invalidSn();
+ switch(type()) {
+ case FRAMES:
+ pos.setFrame(pos.frame() + _lenFrame);
+ break;
+ case TICKS:
+ pos.setTick(pos.tick() + _lenTick);
+ break;
+ }
+ return pos;
+ }
+
+//---------------------------------------------------------
+// setPos
+//---------------------------------------------------------
+
+void PosLen::setPos(const Pos& pos)
+ {
+ switch(pos.type()) {
+ case FRAMES:
+ setFrame(pos.frame());
+ break;
+ case TICKS:
+ setTick(pos.tick());
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// mbt
+//---------------------------------------------------------
+
+void Pos::mbt(int* bar, int* beat, int* tk) const
+ {
+ sigmap.tickValues(tick(), bar, beat, (unsigned*)tk);
+ }
+
+//---------------------------------------------------------
+// msf
+//---------------------------------------------------------
+
+void Pos::msf(int* min, int* sec, int* fr, int* subFrame) const
+ {
+ double time = double(frame()) / double(AL::sampleRate);
+ *min = int(time) / 60;
+ *sec = int(time) % 60;
+ double rest = time - (*min * 60 + *sec);
+ switch(AL::mtcType) {
+ case 0: // 24 frames sec
+ rest *= 24;
+ break;
+ case 1: // 25
+ rest *= 25;
+ break;
+ case 2: // 30 drop frame
+ rest *= 30;
+ break;
+ case 3: // 30 non drop frame
+ rest *= 30;
+ break;
+ }
+ *fr = int(rest);
+ *subFrame = int((rest- *fr)*100);
+ }
+
+//---------------------------------------------------------
+// timesig
+//---------------------------------------------------------
+
+TimeSignature Pos::timesig() const
+ {
+ return sigmap.timesig(tick());
+ }
+
+//---------------------------------------------------------
+// snap
+// raster = 1 no snap
+// raster = 0 snap to measure
+// all other raster values snap to raster tick
+//---------------------------------------------------------
+
+void Pos::snap(int raster)
+ {
+ setTick(sigmap.raster(tick(), raster));
+ }
+
+void Pos::upSnap(int raster)
+ {
+ setTick(sigmap.raster2(tick(), raster));
+ }
+
+void Pos::downSnap(int raster)
+ {
+ setTick(sigmap.raster1(tick(), raster));
+ }
+
+Pos Pos::snaped(int raster) const
+ {
+ return Pos(sigmap.raster(tick(), raster));
+ }
+
+Pos Pos::upSnaped(int raster) const
+ {
+ return Pos(sigmap.raster2(tick(), raster));
+ }
+
+Pos Pos::downSnaped(int raster) const
+ {
+ return Pos(sigmap.raster1(tick(), raster));
+ }
+}
+
diff --git a/muse/al/pos.h b/muse/al/pos.h
new file mode 100644
index 00000000..a771fc4b
--- /dev/null
+++ b/muse/al/pos.h
@@ -0,0 +1,128 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __POS_H__
+#define __POS_H__
+
+#include "sig.h"
+
+namespace AL {
+
+class Xml;
+
+enum TType { TICKS, FRAMES };
+
+//---------------------------------------------------------
+// Pos
+// depending on type _tick or _frame is a cached
+// value. When the tempomap changes, all cached values
+// are invalid. Sn is used to check for tempomap
+// changes.
+//---------------------------------------------------------
+
+class Pos {
+ public:
+
+ private:
+ TType _type;
+ mutable int sn;
+ mutable unsigned _tick;
+ mutable unsigned _frame;
+
+ public:
+ Pos();
+ Pos(const Pos&);
+ Pos(int measure, int beat, int tick);
+ Pos(int minute, int sec, int frame, int subframe);
+ Pos(unsigned, TType type = TICKS);
+ Pos(const QString&);
+ void dump(int n = 0) const;
+
+ unsigned time(TType t) const { return t == TICKS ? tick() : frame(); }
+ void mbt(int* measure, int* beat, int* tick) const;
+ void msf(int* minute, int* sec, int* frame, int* subframe) const;
+ TimeSignature timesig() const;
+ void snap(int);
+ void upSnap(int);
+ void downSnap(int);
+ Pos snaped(int) const;
+ Pos upSnaped(int) const;
+ Pos downSnaped(int) const;
+
+ void invalidSn() { sn = -1; }
+
+ TType type() const { return _type; }
+ void setType(TType t);
+
+ Pos& operator+=(const Pos& a);
+ Pos& operator+=(int a);
+ Pos& operator-=(const Pos& a);
+ Pos& operator-=(int a);
+
+ bool operator>=(const Pos& s) const;
+ bool operator>(const Pos& s) const;
+ bool operator<(const Pos& s) const;
+ bool operator<=(const Pos& s) const;
+ bool operator==(const Pos& s) const;
+ bool operator!=(const Pos& s) const;
+
+ friend Pos operator+(const Pos& a, const Pos& b);
+ friend Pos operator-(const Pos& a, const Pos& b);
+ friend Pos operator+(const Pos& a, int b);
+ friend Pos operator-(const Pos& a, int b);
+
+ unsigned tick() const;
+ unsigned frame() const;
+ void setTick(unsigned);
+ void setFrame(unsigned);
+
+ void write(Xml&, const char*) const;
+ void read(QDomNode);
+ bool isValid() const { return true; }
+ };
+
+//---------------------------------------------------------
+// PosLen
+//---------------------------------------------------------
+
+class PosLen : public Pos {
+ mutable unsigned _lenTick;
+ mutable unsigned _lenFrame;
+ mutable int sn;
+
+ public:
+ PosLen();
+ PosLen(const PosLen&);
+ void dump(int n = 0) const;
+
+ void write(Xml&, const char*) const;
+ void read(QDomNode);
+ void setLenTick(unsigned);
+ void setLenFrame(unsigned);
+ unsigned lenTick() const;
+ unsigned lenFrame() const;
+ Pos end() const;
+ unsigned endTick() const { return end().tick(); }
+ unsigned endFrame() const { return end().frame(); }
+ void setPos(const Pos&);
+ };
+}
+
+#endif
diff --git a/muse/al/sig.cpp b/muse/al/sig.cpp
new file mode 100644
index 00000000..345cd43e
--- /dev/null
+++ b/muse/al/sig.cpp
@@ -0,0 +1,407 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al.h"
+#include "sig.h"
+#include "xml.h"
+
+namespace AL {
+
+SigList sigmap;
+
+//---------------------------------------------------------
+// SigList
+//---------------------------------------------------------
+
+SigList::SigList()
+ {
+ insert(std::pair<const unsigned, SigEvent*> (MAX_TICK, new SigEvent(TimeSignature(4, 4), 0)));
+ }
+
+//---------------------------------------------------------
+// add
+// signatures are only allowed at the beginning of
+// a bar
+//---------------------------------------------------------
+
+void SigList::add(unsigned tick, const TimeSignature& s)
+ {
+ if (s.z == 0 || s.n == 0) {
+ printf("illegal signature %d/%d\n", s.z, s.n);
+ }
+ tick = raster1(tick, 0);
+ iSigEvent e = upper_bound(tick);
+
+ if (tick == e->second->tick) {
+ e->second->sig = s;
+ }
+ else {
+ SigEvent* ne = e->second;
+ SigEvent* ev = new SigEvent(ne->sig, ne->tick);
+ ne->sig = s;
+ ne->tick = tick;
+ insert(std::pair<const unsigned, SigEvent*> (tick, ev));
+ }
+ normalize();
+ }
+
+//---------------------------------------------------------
+// del
+//---------------------------------------------------------
+
+void SigList::del(unsigned tick)
+ {
+// printf("SigList::del(%d)\n", tick);
+ iSigEvent e = find(tick);
+ if (e == end()) {
+ printf("SigList::del(%d): not found\n", tick);
+ return;
+ }
+ iSigEvent ne = e;
+ ++ne;
+ if (ne == end()) {
+ printf("SigList::del() HALLO\n");
+ return;
+ }
+ ne->second->sig = e->second->sig;
+ ne->second->tick = e->second->tick;
+ erase(e);
+ normalize();
+ }
+
+//---------------------------------------------------------
+// SigList::normalize
+//---------------------------------------------------------
+
+void SigList::normalize()
+ {
+ TimeSignature sig(0, 0);
+ unsigned tick = 0;
+ iSigEvent ee;
+
+ for (iSigEvent e = begin(); e != end();) {
+ if (sig.z == e->second->sig.z && sig.n == e->second->sig.n) {
+ e->second->tick = tick;
+ erase(ee);
+ }
+ sig = e->second->sig;
+ ee = e;
+ tick = e->second->tick;
+ ++e;
+ }
+
+ int bar = 0;
+ for (iSigEvent e = begin(); e != end();) {
+ e->second->bar = bar;
+ int delta = e->first - e->second->tick;
+ int ticksB = ticks_beat(e->second->sig.n);
+ int ticksM = ticksB * e->second->sig.z;
+ bar += delta / ticksM;
+ if (delta % ticksM) // Teil eines Taktes
+ ++bar;
+ ++e;
+ }
+ }
+
+//---------------------------------------------------------
+// SigList::dump
+//---------------------------------------------------------
+
+void SigList::dump() const
+ {
+ printf("\nSigList:\n");
+ for (ciSigEvent i = begin(); i != end(); ++i) {
+ printf("%6d %06d Bar %3d %02d/%d\n",
+ i->first, i->second->tick,
+ i->second->bar, i->second->sig.z, i->second->sig.n);
+ }
+ }
+
+void SigList::clear()
+ {
+ for (iSigEvent i = begin(); i != end(); ++i)
+ delete i->second;
+ SIGLIST::clear();
+ insert(std::pair<const unsigned, SigEvent*> (MAX_TICK, new SigEvent(TimeSignature(4, 4), 0)));
+ }
+
+//---------------------------------------------------------
+// ticksMeasure
+//---------------------------------------------------------
+
+int SigList::ticksMeasure(const TimeSignature& sig) const
+ {
+ return ticks_beat(sig.n) * sig.z;
+ }
+
+int SigList::ticksMeasure(unsigned tick) const
+ {
+ ciSigEvent i = upper_bound(tick);
+ if (i == end()) {
+ printf("ticksMeasure: not found %d\n", tick);
+ // abort();
+ return 0;
+ }
+ return ticksMeasure(i->second->sig);
+ }
+
+//---------------------------------------------------------
+// ticksBeat
+//---------------------------------------------------------
+
+int SigList::ticksBeat(unsigned tick) const
+ {
+ ciSigEvent i = upper_bound(tick);
+ return ticks_beat(i->second->sig.n);
+ }
+
+int SigList::ticks_beat(int n) const
+ {
+ int m = AL::division;
+ switch (n) {
+ case 1: m <<= 2; break; // 1536
+ case 2: m <<= 1; break; // 768
+ case 3: m += m >> 1; break; // 384+192
+ case 4: break; // 384
+ case 8: m >>= 1; break; // 192
+ case 16: m >>= 2; break; // 96
+ case 32: m >>= 3; break; // 48
+ case 64: m >>= 4; break; // 24
+ case 128: m >>= 5; break; // 12
+ default: break;
+ }
+ return m;
+ }
+
+//---------------------------------------------------------
+// timesig
+//---------------------------------------------------------
+
+TimeSignature SigList::timesig(unsigned tick) const
+ {
+ ciSigEvent i = upper_bound(tick);
+ if (i == end()) {
+ printf("timesig(%d): not found\n", tick);
+ // abort();
+ return TimeSignature(4,4);
+ }
+ return i->second->sig;
+ }
+
+//---------------------------------------------------------
+// tickValues
+//---------------------------------------------------------
+
+void SigList::tickValues(unsigned t, int* bar, int* beat, unsigned* tick) const
+ {
+ ciSigEvent e = upper_bound(t);
+ if (e == end()) {
+ fprintf(stderr, "tickValues(0x%x) not found(%d)\n", t, size());
+//DEBUG
+// abort();
+ *bar = 0;
+ *beat = 0;
+ *tick = 0;
+ return;
+ }
+
+ int delta = t - e->second->tick;
+ int ticksB = ticks_beat(e->second->sig.n);
+ int ticksM = ticksB * e->second->sig.z;
+ *bar = e->second->bar + delta / ticksM;
+ int rest = delta % ticksM;
+ *beat = rest / ticksB;
+ *tick = rest % ticksB;
+ }
+
+//---------------------------------------------------------
+// bar2tick
+//---------------------------------------------------------
+
+unsigned SigList::bar2tick(int bar, int beat, unsigned tick) const
+ {
+ ciSigEvent e;
+
+ if (bar < 0)
+ bar = 0;
+ for (e = begin(); e != end();) {
+ ciSigEvent ee = e;
+ ++ee;
+ if (ee == end())
+ break;
+ if (bar < ee->second->bar)
+ break;
+ e = ee;
+ }
+ int ticksB = ticks_beat(e->second->sig.n);
+ int ticksM = ticksB * e->second->sig.z;
+ return e->second->tick + (bar-e->second->bar)*ticksM + ticksB*beat + tick;
+ }
+
+//---------------------------------------------------------
+// raster
+//---------------------------------------------------------
+
+unsigned SigList::raster(unsigned t, int raster) const
+ {
+ if (raster == 1)
+ return t;
+ ciSigEvent e = upper_bound(t);
+ if (e == end()) {
+ printf("SigList::raster(%x,)\n", t);
+ // abort();
+ return t;
+ }
+ int delta = t - e->second->tick;
+ int ticksM = ticks_beat(e->second->sig.n) * e->second->sig.z;
+ if (raster == 0)
+ raster = ticksM;
+ int rest = delta % ticksM;
+ int bb = (delta/ticksM)*ticksM;
+ return e->second->tick + bb + ((rest + raster/2)/raster)*raster;
+ }
+
+//---------------------------------------------------------
+// raster1
+// round down
+//---------------------------------------------------------
+
+unsigned SigList::raster1(unsigned t, int raster) const
+ {
+ if (raster == 1)
+ return t;
+ ciSigEvent e = upper_bound(t);
+
+ int delta = t - e->second->tick;
+ int ticksM = ticks_beat(e->second->sig.n) * e->second->sig.z;
+ if (raster == 0)
+ raster = ticksM;
+ int rest = delta % ticksM;
+ int bb = (delta/ticksM)*ticksM;
+ return e->second->tick + bb + (rest/raster)*raster;
+ }
+
+//---------------------------------------------------------
+// raster2
+// round up
+//---------------------------------------------------------
+
+unsigned SigList::raster2(unsigned t, int raster) const
+ {
+ if (raster == 1)
+ return t;
+ ciSigEvent e = upper_bound(t);
+
+ int delta = t - e->second->tick;
+ int ticksM = ticks_beat(e->second->sig.n) * e->second->sig.z;
+ if (raster == 0)
+ raster = ticksM;
+ int rest = delta % ticksM;
+ int bb = (delta/ticksM)*ticksM;
+ return e->second->tick + bb + ((rest+raster-1)/raster)*raster;
+ }
+
+//---------------------------------------------------------
+// rasterStep
+//---------------------------------------------------------
+
+int SigList::rasterStep(unsigned t, int raster) const
+ {
+ if (raster == 0) {
+ ciSigEvent e = upper_bound(t);
+ return ticks_beat(e->second->sig.n) * e->second->sig.z;
+ }
+ return raster;
+ }
+
+//---------------------------------------------------------
+// SigList::write
+//---------------------------------------------------------
+
+void SigList::write(Xml& xml) const
+ {
+ xml.tag("siglist");
+ for (ciSigEvent i = begin(); i != end(); ++i)
+ i->second->write(xml, i->first);
+ xml.etag("siglist");
+ }
+
+//---------------------------------------------------------
+// SigList::read
+//---------------------------------------------------------
+
+void SigList::read(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.tagName() == "sig") {
+ SigEvent* t = new SigEvent();
+ unsigned tick = t->read(node);
+ iSigEvent pos = find(tick);
+ if (pos != end())
+ erase(pos);
+ insert(std::pair<const unsigned, SigEvent*> (tick, t));
+ }
+ else
+ printf("MusE:SigList: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ normalize();
+ }
+
+//---------------------------------------------------------
+// SigEvent::write
+//---------------------------------------------------------
+
+void SigEvent::write(Xml& xml, int at) const
+ {
+ xml.tag("sig at=\"%d\"", at);
+ xml.intTag("tick", tick);
+ xml.intTag("nom", sig.z);
+ xml.intTag("denom", sig.n);
+ xml.etag("sig");
+ }
+
+//---------------------------------------------------------
+// SigEvent::read
+//---------------------------------------------------------
+
+int SigEvent::read(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ int at = e.attribute("at", "0").toInt();
+ node = node.firstChild();
+
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.tagName() == "tick")
+ tick = e.text().toInt();
+ else if (e.tagName() == "nom")
+ sig.z = e.text().toInt();
+ else if (e.tagName() == "denom")
+ sig.n = e.text().toInt();
+ else
+ printf("MusE:SigEvent: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ return at;
+ }
+
+}
diff --git a/muse/al/sig.h b/muse/al/sig.h
new file mode 100644
index 00000000..d0c70410
--- /dev/null
+++ b/muse/al/sig.h
@@ -0,0 +1,103 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __SIG_H__
+#define __SIG_H__
+
+namespace AL {
+
+#ifndef MAX_TICK
+#define MAX_TICK (0x7fffffff/100)
+#endif
+
+class Xml;
+
+//---------------------------------------------------------
+// TimeSignature
+//---------------------------------------------------------
+
+struct TimeSignature {
+ int z, n;
+ TimeSignature() { z = 4; n = 4; }
+ TimeSignature(int a, int b) { z = a; n = b; }
+ };
+
+//---------------------------------------------------------
+// Signature Event
+//---------------------------------------------------------
+
+struct SigEvent {
+ TimeSignature sig;
+ unsigned tick; // signature valid from this position
+ int bar; // precomputed
+
+ int read(QDomNode);
+ void write(Xml&, int) const;
+
+ SigEvent() { }
+ SigEvent(const TimeSignature& s, unsigned tk) {
+ sig = s;
+ tick = tk;
+ bar = 0;
+ }
+ };
+
+//---------------------------------------------------------
+// SigList
+//---------------------------------------------------------
+
+typedef std::map<unsigned, SigEvent*, std::less<unsigned> > SIGLIST;
+typedef SIGLIST::iterator iSigEvent;
+typedef SIGLIST::const_iterator ciSigEvent;
+typedef SIGLIST::reverse_iterator riSigEvent;
+typedef SIGLIST::const_reverse_iterator criSigEvent;
+
+class SigList : public SIGLIST {
+ int ticks_beat(int N) const;
+ void normalize();
+ int ticksMeasure(const TimeSignature&) const;
+
+ public:
+ SigList();
+ void clear();
+ void add(unsigned tick, const TimeSignature& s);
+ void del(unsigned tick);
+
+ void read(QDomNode);
+ void write(Xml&) const;
+ void dump() const;
+
+ TimeSignature timesig(unsigned tick) const;
+ void tickValues(unsigned t, int* bar, int* beat, unsigned* tick) const;
+ unsigned bar2tick(int bar, int beat, unsigned tick) const;
+
+ int ticksMeasure(unsigned tick) const;
+ int ticksBeat(unsigned tick) const;
+ unsigned raster(unsigned tick, int raster) const;
+ unsigned raster1(unsigned tick, int raster) const; // round down
+ unsigned raster2(unsigned tick, int raster) const; // round up
+ int rasterStep(unsigned tick, int raster) const;
+ };
+
+extern SigList sigmap;
+
+}
+
+#endif
diff --git a/muse/al/tempo.cpp b/muse/al/tempo.cpp
new file mode 100644
index 00000000..9a64f3e8
--- /dev/null
+++ b/muse/al/tempo.cpp
@@ -0,0 +1,393 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al.h"
+#include "tempo.h"
+#include "xml.h"
+
+namespace AL {
+
+TempoList tempomap;
+
+//---------------------------------------------------------
+// TempoList
+//---------------------------------------------------------
+
+TempoList::TempoList()
+ {
+ _tempo = 500000;
+ insert(std::pair<const unsigned, TEvent*> (MAX_TICK+1, new TEvent(_tempo, 0)));
+ _tempoSN = 1;
+ _globalTempo = 100;
+ useList = true;
+ }
+
+//---------------------------------------------------------
+// add
+//---------------------------------------------------------
+
+void TempoList::add(unsigned tick, int tempo)
+ {
+ if (tick > MAX_TICK)
+ tick = MAX_TICK;
+
+ iTEvent e = upper_bound(tick);
+
+ if (tick == e->second->tick)
+ e->second->tempo = tempo;
+ else {
+ TEvent* ne = e->second;
+ TEvent* ev = new TEvent(ne->tempo, ne->tick);
+ ne->tempo = tempo;
+ ne->tick = tick;
+ insert(std::pair<const unsigned, TEvent*> (tick, ev));
+ }
+ normalize();
+ }
+
+//---------------------------------------------------------
+// TempoList::normalize
+//---------------------------------------------------------
+
+void TempoList::normalize()
+ {
+ int frame = 0;
+ for (iTEvent e = begin(); e != end(); ++e) {
+ e->second->frame = frame;
+ unsigned dtick = e->first - e->second->tick;
+ double dtime = double(dtick) / (division * _globalTempo * 10000.0/e->second->tempo);
+ frame += lrint(dtime * sampleRate);
+ }
+ }
+
+//---------------------------------------------------------
+// TempoList::dump
+//---------------------------------------------------------
+
+void TempoList::dump() const
+ {
+ printf("\nTempoList:\n");
+ for (ciTEvent i = begin(); i != end(); ++i) {
+ printf("%6d %06d Tempo %6d Frame %d\n",
+ i->first, i->second->tick, i->second->tempo,
+ i->second->frame);
+ }
+ }
+
+//---------------------------------------------------------
+// clear
+//---------------------------------------------------------
+
+void TempoList::clear()
+ {
+ for (iTEvent i = begin(); i != end(); ++i)
+ delete i->second;
+ TEMPOLIST::clear();
+ insert(std::pair<const unsigned, TEvent*> (MAX_TICK+1, new TEvent(500000, 0)));
+ ++_tempoSN;
+ }
+
+//---------------------------------------------------------
+// tempo
+//---------------------------------------------------------
+
+int TempoList::tempo(unsigned tick) const
+ {
+ if (useList) {
+ ciTEvent i = upper_bound(tick);
+ if (i == end()) {
+ printf("no TEMPO at tick %d,0x%x\n", tick, tick);
+ return 1000;
+ }
+ return i->second->tempo;
+ }
+ else
+ return _tempo;
+ }
+
+//---------------------------------------------------------
+// del
+//---------------------------------------------------------
+
+void TempoList::del(unsigned tick)
+ {
+// printf("TempoList::del(%d)\n", tick);
+ iTEvent e = find(tick);
+ if (e == end()) {
+ printf("TempoList::del(%d): not found\n", tick);
+ return;
+ }
+ del(e);
+ ++_tempoSN;
+ }
+
+void TempoList::del(iTEvent e)
+ {
+ iTEvent ne = e;
+ ++ne;
+ if (ne == end()) {
+ printf("TempoList::del(): not found\n");
+ return;
+ }
+ ne->second->tempo = e->second->tempo;
+ ne->second->tick = e->second->tick;
+ erase(e);
+ normalize();
+ ++_tempoSN;
+ }
+
+//---------------------------------------------------------
+// change
+//---------------------------------------------------------
+
+void TempoList::change(unsigned tick, int newTempo)
+ {
+ iTEvent e = find(tick);
+ e->second->tempo = newTempo;
+ normalize();
+ ++_tempoSN;
+ }
+
+//---------------------------------------------------------
+// setTempo
+// called from transport window
+// & slave mode tempo changes
+//---------------------------------------------------------
+
+void TempoList::setTempo(unsigned tick, int newTempo)
+ {
+ if (useList)
+ add(tick, newTempo);
+ else
+ _tempo = newTempo;
+ ++_tempoSN;
+ }
+
+//---------------------------------------------------------
+// setGlobalTempo
+//---------------------------------------------------------
+
+void TempoList::setGlobalTempo(int val)
+ {
+ _globalTempo = val;
+ ++_tempoSN;
+ normalize();
+ }
+
+//---------------------------------------------------------
+// addTempo
+//---------------------------------------------------------
+
+void TempoList::addTempo(unsigned t, int tempo)
+ {
+ add(t, tempo);
+ ++_tempoSN;
+ }
+
+//---------------------------------------------------------
+// delTempo
+//---------------------------------------------------------
+
+void TempoList::delTempo(unsigned tick)
+ {
+ del(tick);
+ ++_tempoSN;
+ }
+
+//---------------------------------------------------------
+// changeTempo
+//---------------------------------------------------------
+
+void TempoList::changeTempo(unsigned tick, int newTempo)
+ {
+ change(tick, newTempo);
+ ++_tempoSN;
+ }
+
+//---------------------------------------------------------
+// setMasterFlag
+//---------------------------------------------------------
+
+bool TempoList::setMasterFlag(unsigned /*tick*/, bool val)
+ {
+ if (useList != val) {
+ useList = val;
+ ++_tempoSN;
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// tick2frame
+//---------------------------------------------------------
+
+unsigned TempoList::tick2frame(unsigned tick, unsigned frame, int* sn) const
+ {
+ return (*sn == _tempoSN) ? frame : tick2frame(tick, sn);
+ }
+
+//---------------------------------------------------------
+// tick2frame
+//---------------------------------------------------------
+
+unsigned TempoList::tick2frame(unsigned tick, int* sn) const
+ {
+ int f;
+ if (useList) {
+ ciTEvent i = upper_bound(tick);
+ if (i == end()) {
+ printf("tick2frame(%d,0x%x): not found\n", tick, tick);
+ abort(); // debug
+ return 0;
+ }
+ unsigned dtick = tick - i->second->tick;
+ double dtime = double(dtick) / (division * _globalTempo * 10000.0/ i->second->tempo);
+ unsigned dframe = lrint(dtime * sampleRate);
+ f = i->second->frame + dframe;
+ }
+ else {
+ double t = (double(tick) * double(_tempo)) / (double(division) * _globalTempo * 10000.0);
+ f = lrint(t * sampleRate);
+ }
+ if (sn)
+ *sn = _tempoSN;
+ return f;
+ }
+
+//---------------------------------------------------------
+// frame2tick
+// return cached value t if list did not change
+//---------------------------------------------------------
+
+unsigned TempoList::frame2tick(unsigned frame, unsigned t, int* sn) const
+ {
+ return (*sn == _tempoSN) ? t : frame2tick(frame, sn);
+ }
+
+//---------------------------------------------------------
+// frame2tick
+//---------------------------------------------------------
+
+unsigned TempoList::frame2tick(unsigned frame, int* sn) const
+ {
+ unsigned tick;
+ if (useList) {
+ ciTEvent e;
+ for (e = begin(); e != end();) {
+ ciTEvent ee = e;
+ ++ee;
+ if (ee == end())
+ break;
+ if (frame < ee->second->frame)
+ break;
+ e = ee;
+ }
+ unsigned te = e->second->tempo;
+ int dframe = frame - e->second->frame;
+ double dtime = double(dframe) / double(sampleRate);
+ tick = e->second->tick + lrint(dtime * _globalTempo * division * 10000.0 / te);
+ }
+ else
+ tick = lrint((double(frame)/double(sampleRate)) * _globalTempo * division * 10000.0 / double(_tempo));
+ if (sn)
+ *sn = _tempoSN;
+ return tick;
+ }
+
+//---------------------------------------------------------
+// TempoList::write
+//---------------------------------------------------------
+
+void TempoList::write(Xml& xml) const
+ {
+ xml.tag("tempolist fix=\"%d\"", _tempo);
+ if (_globalTempo != 100)
+ xml.intTag("globalTempo", _globalTempo);
+ for (ciTEvent i = begin(); i != end(); ++i)
+ i->second->write(xml, i->first);
+ xml.etag("tempolist");
+ }
+
+//---------------------------------------------------------
+// TempoList::read
+//---------------------------------------------------------
+
+void TempoList::read(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ _tempo = e.attribute("fix","500000").toInt();
+
+ node = node.firstChild();
+ while (!node.isNull()) {
+ e = node.toElement();
+ if (e.tagName() == "tempo") {
+ TEvent* t = new TEvent();
+ unsigned tick = t->read(node);
+ iTEvent pos = find(tick);
+ if (pos != end())
+ erase(pos);
+ insert(std::pair<const int, TEvent*> (tick, t));
+ }
+ else if (e.tagName() == "globalTempo")
+ _globalTempo = e.text().toInt();
+ else
+ printf("MusE:Tempolist: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ normalize();
+ ++_tempoSN;
+ }
+
+//---------------------------------------------------------
+// TEvent::write
+//---------------------------------------------------------
+
+void TEvent::write(Xml& xml, int at) const
+ {
+ xml.tag("tempo at=\"%d\"", at);
+ xml.intTag("tick", tick);
+ xml.intTag("val", tempo);
+ xml.etag("tempo");
+ }
+
+//---------------------------------------------------------
+// TEvent::read
+//---------------------------------------------------------
+
+int TEvent::read(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ int at = e.attribute("at","0").toInt();
+
+ node = node.firstChild();
+ while (!node.isNull()) {
+ e = node.toElement();
+ if (e.tagName() == "tick")
+ tick = e.text().toInt();
+ else if (e.tagName() == "val")
+ tempo = e.text().toInt();
+ else
+ printf("MusE:TEvent: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ return at;
+ }
+}
diff --git a/muse/al/tempo.h b/muse/al/tempo.h
new file mode 100644
index 00000000..68dcbb14
--- /dev/null
+++ b/muse/al/tempo.h
@@ -0,0 +1,100 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __TEMPO_H__
+#define __TEMPO_H__
+
+namespace AL {
+
+#ifndef MAX_TICK
+#define MAX_TICK (0x7fffffff/100)
+#endif
+
+class Xml;
+
+//---------------------------------------------------------
+// Tempo Event
+//---------------------------------------------------------
+
+struct TEvent {
+ int tempo;
+ unsigned tick; // new tempo at tick
+ unsigned frame; // precomputed time for tick in sec
+
+ int read(QDomNode);
+ void write(Xml&, int) const;
+
+ TEvent() { }
+ TEvent(unsigned t, unsigned tk) {
+ tempo = t;
+ tick = tk;
+ frame = 0;
+ }
+ };
+
+//---------------------------------------------------------
+// TempoList
+//---------------------------------------------------------
+
+typedef std::map<unsigned, TEvent*, std::less<unsigned> > TEMPOLIST;
+typedef TEMPOLIST::iterator iTEvent;
+typedef TEMPOLIST::const_iterator ciTEvent;
+typedef TEMPOLIST::reverse_iterator riTEvent;
+typedef TEMPOLIST::const_reverse_iterator criTEvent;
+
+class TempoList : public TEMPOLIST {
+ int _tempoSN; // serial no to track tempo changes
+ bool useList;
+ int _tempo; // tempo if not using tempo list
+ int _globalTempo; // %percent 50-200%
+
+ void normalize();
+ void add(unsigned tick, int tempo);
+ void change(unsigned tick, int newTempo);
+ void del(iTEvent);
+ void del(unsigned tick);
+
+ public:
+ TempoList();
+ void clear();
+
+ void read(QDomNode);
+ void write(Xml&) const;
+ void dump() const;
+
+ int tempo(unsigned tick) const;
+ unsigned tick2frame(unsigned tick, unsigned frame, int* sn) const;
+ unsigned tick2frame(unsigned tick, int* sn = 0) const;
+ unsigned frame2tick(unsigned frame, int* sn = 0) const;
+ unsigned frame2tick(unsigned frame, unsigned tick, int* sn) const;
+ int tempoSN() const { return _tempoSN; }
+ void setTempo(unsigned tick, int newTempo);
+ void addTempo(unsigned t, int tempo);
+ void delTempo(unsigned tick);
+ void changeTempo(unsigned tick, int newTempo);
+ bool setMasterFlag(unsigned tick, bool val);
+ int globalTempo() const { return _globalTempo; }
+ void setGlobalTempo(int val);
+ };
+
+extern TempoList tempomap;
+}
+
+#endif
diff --git a/muse/al/xml.cpp b/muse/al/xml.cpp
new file mode 100644
index 00000000..616b474c
--- /dev/null
+++ b/muse/al/xml.cpp
@@ -0,0 +1,344 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "xml.h"
+
+
+namespace AL {
+
+//---------------------------------------------------------
+// Xml
+//---------------------------------------------------------
+
+Xml::Xml(QIODevice* device)
+ : QTextStream(device)
+ {
+ level = 0;
+ }
+
+//---------------------------------------------------------
+// header
+//---------------------------------------------------------
+
+void Xml::header()
+ {
+ *this << "<?xml version=\"1.0\"?>\n";
+ }
+
+//---------------------------------------------------------
+// put
+//---------------------------------------------------------
+
+void Xml::put(const char* format, ...)
+ {
+ va_list args;
+ va_start(args, format);
+ putLevel();
+ vsnprintf(buffer, BS, format, args);
+ va_end(args);
+ *this << buffer;
+ *this << '\n';
+ }
+
+//---------------------------------------------------------
+// nput
+//---------------------------------------------------------
+
+void Xml::nput(const char* format, ...)
+ {
+ va_list args;
+ va_start(args, format);
+ vsnprintf(buffer, BS, format, args);
+ *this << buffer;
+ va_end(args);
+ }
+
+//---------------------------------------------------------
+// tdata
+//---------------------------------------------------------
+
+void Xml::tdata(const QString& s)
+ {
+ putLevel();
+ *this << s << endl;
+ }
+
+//---------------------------------------------------------
+// tag
+//---------------------------------------------------------
+
+void Xml::tag(const char* format, ...)
+ {
+ va_list args;
+ va_start(args, format);
+ putLevel();
+ *this << '<';
+ vsnprintf(buffer, BS, format, args);
+ *this << buffer;
+ va_end(args);
+ *this << '>' << endl;
+ ++level;
+ }
+
+void Xml::tagE(const char* format, ...)
+ {
+ va_list args;
+ va_start(args, format);
+ putLevel();
+ *this << '<';
+ vsnprintf(buffer, BS, format, args);
+ *this << buffer;
+ va_end(args);
+ *this << "/>" << endl;
+ }
+
+//---------------------------------------------------------
+// etag
+//---------------------------------------------------------
+
+void Xml::etag(const char* format, ...)
+ {
+ va_list args;
+ va_start(args, format);
+ putLevel();
+ *this << "</";
+ vsnprintf(buffer, BS, format, args);
+ *this << buffer;
+ va_end(args);
+ *this << '>' << endl;
+ --level;
+ }
+
+void Xml::putLevel()
+ {
+ for (int i = 0; i < level*2; ++i)
+ *this << ' ';
+ }
+
+void Xml::intTag(const char* name, int val)
+ {
+ putLevel();
+ *this << "<" << name << ">" << val << "</" << name << ">\n";
+ }
+
+void Xml::floatTag(const char* name, float val)
+ {
+ putLevel();
+ *this << QString("<%1>%2</%3>\n").arg(name).arg(val).arg(name);
+ }
+
+void Xml::doubleTag(const char* name, double val)
+ {
+ putLevel();
+ QString s("<%1>%2</%3>\n");
+ *this << s.arg(name).arg(val).arg(name);
+ }
+
+void Xml::strTag(const char* name, const char* val)
+ {
+ putLevel();
+ *this << "<" << name << ">";
+ if (val) {
+ while (*val) {
+ switch(*val) {
+ case '&':
+ *this << "&amp;";
+ break;
+ case '<':
+ *this << "&lt;";
+ break;
+ case '>':
+ *this << "&gt;";
+ break;
+ case '"':
+ *this << "&quot;";
+ break;
+ case '\'':
+ *this << "&apos;";
+ break;
+ default:
+ *this << *val;
+ break;
+ }
+ ++val;
+ }
+ }
+ *this << "</" << name << ">\n";
+ }
+
+//---------------------------------------------------------
+// colorTag
+//---------------------------------------------------------
+
+void Xml::colorTag(const char* name, const QColor& color)
+ {
+ putLevel();
+ snprintf(buffer, BS, "<%s r=\"%d\" g=\"%d\" b=\"%d\" />\n",
+ name, color.red(), color.green(), color.blue());
+ *this << buffer;
+ }
+
+//---------------------------------------------------------
+// geometryTag
+//---------------------------------------------------------
+
+void Xml::geometryTag(const char* name, const QWidget* g)
+ {
+ qrectTag(name, QRect(g->pos(), g->size()));
+ }
+
+//---------------------------------------------------------
+// qrectTag
+//---------------------------------------------------------
+
+void Xml::qrectTag(const char* name, const QRect& r)
+ {
+ putLevel();
+ *this << "<" << name;
+ snprintf(buffer, BS, " x=\"%d\" y=\"%d\" w=\"%d\" h=\"%d\" />\n",
+ r.x(), r.y(), r.width(), r.height());
+ *this << buffer;
+ }
+
+//---------------------------------------------------------
+// strTag
+//---------------------------------------------------------
+
+void Xml::strTag(const char* name, const QString& val)
+ {
+ strTag(name, val.toLatin1().data());
+ }
+
+//---------------------------------------------------------
+// readGeometry
+//---------------------------------------------------------
+
+QRect readGeometry(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ int x = e.attribute("x","0").toInt();
+ int y = e.attribute("y","0").toInt();
+ int w = e.attribute("w","50").toInt();
+ int h = e.attribute("h","50").toInt();
+ return QRect(x, y, w, h);
+ }
+
+//---------------------------------------------------------
+// writeProperties
+//---------------------------------------------------------
+
+void Xml::writeProperties(const QObject* o)
+ {
+ const QMetaObject* meta = o->metaObject();
+
+ //
+ // start from dummy "muse" property, assuming this is the
+ // first muse propertie in widget hierarchy
+ //
+ int from = meta->indexOfProperty("muse") + 1;
+ int n = meta->propertyCount();
+ for (int i = from; i < n; ++i) {
+ QMetaProperty p = meta->property(i);
+ if (!p.isScriptable())
+ continue;
+ const char* name = p.name();
+ QVariant v = p.read(o);
+ switch(v.type()) {
+ case QVariant::Bool:
+ case QVariant::Int:
+ intTag(name, v.toInt());
+ break;
+ case QVariant::Double:
+ doubleTag(name, v.toDouble());
+ break;
+ case QVariant::String:
+ strTag(name, v.toString());
+ break;
+ case QVariant::Rect:
+ qrectTag(name, v.toRect());
+ break;
+ case QVariant::Point:
+ {
+ QPoint p = v.toPoint();
+ putLevel();
+ *this << "<" << name;
+ snprintf(buffer, BS, " x=\"%d\" y=\"%d\" />\n",
+ p.x(), p.y());
+ *this << buffer;
+ }
+ break;
+
+ default:
+ printf("MusE:%s type %d not implemented\n",
+ meta->className(), v.type());
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// readProperties
+//---------------------------------------------------------
+
+void readProperties(QObject* o, QDomNode node)
+ {
+ const QMetaObject* meta = o->metaObject();
+
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ int idx = meta->indexOfProperty(tag.toLatin1().data());
+ if (idx == -1) {
+ printf("MusE:%s: unknown tag %s\n",
+ meta->className(), tag.toLatin1().data());
+ return;
+ }
+ QMetaProperty p = meta->property(idx);
+ QVariant v;
+ switch(p.type()) {
+ case QVariant::Int:
+ case QVariant::Bool:
+ v.setValue(e.text().toInt());
+ break;
+ case QVariant::Double:
+ v.setValue(e.text().toDouble());
+ break;
+ case QVariant::String:
+ v.setValue(e.text());
+ break;
+ case QVariant::Rect:
+ v.setValue(AL::readGeometry(node));
+ break;
+ case QVariant::Point:
+ {
+ int x = e.attribute("x","0").toInt();
+ int y = e.attribute("y","0").toInt();
+ v.setValue(QPoint(x, y));
+ }
+ break;
+ default:
+ printf("MusE:%s type %d not implemented\n",
+ meta->className(), p.type());
+ return;
+ }
+ if (p.isWritable())
+ p.write(o, v);
+ }
+}
+
diff --git a/muse/al/xml.h b/muse/al/xml.h
new file mode 100644
index 00000000..4c438c3b
--- /dev/null
+++ b/muse/al/xml.h
@@ -0,0 +1,62 @@
+//=============================================================================
+// AL
+// Audio Utility Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __XML_H__
+#define __XML_H__
+
+namespace AL {
+
+static const int BS = 2048;
+
+//---------------------------------------------------------
+// Xml
+//---------------------------------------------------------
+
+class Xml : public QTextStream {
+ char buffer[BS];
+ int level;
+
+ public:
+ Xml(QIODevice*);
+ void header();
+ void putLevel();
+ void put(const char* format, ...);
+ void nput(const char* format, ...);
+ void tag(const char* format, ...);
+ void etag(const char* format, ...);
+ void tagE(const char* format, ...);
+ void tdata(const QString&);
+ void intTag(const char* const name, int val);
+ void doubleTag(const char* const name, double val);
+ void floatTag(const char* const name, float val);
+ void strTag(const char* const name, const char* val);
+ void strTag(const char* const name, const QString& s);
+ void colorTag(const char* name, const QColor& color);
+ void geometryTag(const char* name, const QWidget* g);
+ void qrectTag(const char* name, const QRect& r);
+ void writeProperties(const QObject*);
+ };
+
+extern QRect readGeometry(QDomNode);
+extern void readProperties(QObject* o, QDomNode node);
+}
+
+#endif
+
diff --git a/muse/all.h b/muse/all.h
new file mode 100644
index 00000000..7200f872
--- /dev/null
+++ b/muse/all.h
@@ -0,0 +1,115 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __ALLQT_H__
+#define __ALLQT_H__
+
+#include <stdio.h>
+#include <values.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <assert.h>
+#include <cmath>
+#include <list>
+#include <vector>
+#include <map>
+
+#include <QtCore/qplugin.h>
+#include <QtCore/QUrl>
+#include <QtCore/QFile>
+#include <QtCore/QTextStream>
+#include <QtCore/QBuffer>
+#include <QtCore/QLocale>
+#include <QtCore/QTimer>
+#include <QtCore/QSocketNotifier>
+#include <QtCore/QSignalMapper>
+#include <QtCore/QTime>
+#include <QtCore/QMetaProperty>
+#include <QtCore/QEvent>
+#include <QtCore/QTranslator>
+#include <QtCore/qatomic.h>
+
+#include <QtDesigner/QDesignerCustomWidgetInterface>
+#include <QtDesigner/QDesignerFormEditorInterface>
+#include <QtDesigner/QFormBuilder>
+
+#include <QtXml/QDomNode>
+
+#include <QtGui/QScrollBar>
+#include <QtGui/QToolBar>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QPushButton>
+#include <QtGui/QToolButton>
+#include <QtGui/QRadioButton>
+#include <QtGui/QScrollArea>
+#include <QtGui/QListWidgetItem>
+#include <QtGui/QTreeWidgetItem>
+#include <QtGui/QPainterPath>
+#include <QtGui/QStackedWidget>
+#include <QtGui/QShortcut>
+#include <QtGui/QTableView>
+#include <QtGui/QTextEdit>
+#include <QtGui/QFileDialog>
+#include <QtGui/QInputDialog>
+#include <QtGui/QGroupBox>
+#include <QtGui/QProgressDialog>
+#include <QtGui/QHeaderView>
+#include <QtGui/QStyle>
+#include <QtGui/QWindowsStyle>
+#include <QtCore/QProcess>
+#include <QtGui/QWhatsThis>
+#include <QtGui/QDial>
+#include <QtGui/QPaintEvent>
+#include <QtGui/QPen>
+#include <QtGui/QPainter>
+#include <QtGui/QLineEdit>
+#include <QtGui/QCheckBox>
+#include <QtGui/QComboBox>
+#include <QtGui/QApplication>
+#include <QtGui/QSpinBox>
+#include <QtGui/QLabel>
+#include <QtGui/QPixmap>
+#include <QtGui/QPrinter>
+#include <QtGui/QGridLayout>
+#include <QtGui/QMainWindow>
+#include <QtGui/QAction>
+#include <QtGui/QColor>
+#include <QtGui/QColorDialog>
+#include <QtGui/QCursor>
+#include <QtGui/QFont>
+#include <QtGui/QFontInfo>
+#include <QtGui/QFontMetrics>
+#include <QtGui/QIcon>
+#include <QtGui/QMessageBox>
+#include <QtGui/QMenu>
+#include <QtGui/QFontDialog>
+#include <QtGui/QKeyEvent>
+#include <QtGui/QSplitter>
+#include <QtGui/QMenuBar>
+#include <QtGui/QSizeGrip>
+#include <QtGui/QClipboard>
+#include <QtGui/QCloseEvent>
+#include <QtGui/QSplashScreen>
+#include <QtGui/QStyleFactory>
+#include <QtGui/QDockWidget>
+
+#endif
+
diff --git a/muse/awl/CMakeLists.txt b/muse/awl/CMakeLists.txt
new file mode 100644
index 00000000..46f6453b
--- /dev/null
+++ b/muse/awl/CMakeLists.txt
@@ -0,0 +1,57 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+MACRO(WRAP_CPP outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.cpp)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_CPP)
+
+MACRO(WRAP_H outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.h)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_H)
+
+set(mocs
+ aslider knob panknob slider volknob volslider floatentry
+ volentry panentry midivolentry midipanentry midipanknob
+ mslider midimslider midimeter combobox checkbox posedit
+ pitchedit poslabel pitchlabel tempolabel sigedit tcanvas
+ tempoedit
+ )
+
+WRAP_H(mocH ${mocs})
+WRAP_CPP(mocCPP ${mocs})
+
+QT4_WRAP_CPP (moc_headers ${mocH})
+
+set ( awl_src awl.cpp utils.cpp ${mocCPP} ${moc_headers} )
+
+add_library ( awl STATIC ${awl_src} )
+set_target_properties( awl
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all.h"
+ )
+
+add_library ( awlplugin SHARED ${awl_src} awlplugin.cpp )
+set_target_properties( awlplugin
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
diff --git a/muse/awl/aslider.cpp b/muse/awl/aslider.cpp
new file mode 100644
index 00000000..5f751bf6
--- /dev/null
+++ b/muse/awl/aslider.cpp
@@ -0,0 +1,198 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+#include "aslider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// AbstractSlider
+//---------------------------------------------------------
+
+AbstractSlider::AbstractSlider(QWidget* parent)
+ : QWidget(parent), _scaleColor(Qt::black), _scaleValueColor(Qt::blue)
+ {
+ _id = 0;
+ _value = 0.5;
+ _minValue = 0.0;
+ _maxValue = 1.0;
+ _lineStep = 0.1;
+ _pageStep = 0.2;
+ _center = false;
+ _invert = false;
+ _scaleWidth = 4;
+ _log = false;
+ }
+
+//---------------------------------------------------------
+// setEnabled
+//---------------------------------------------------------
+
+void AbstractSlider::setEnabled(bool val)
+ {
+ QWidget::setEnabled(val);
+ update();
+ }
+
+//---------------------------------------------------------
+// setCenter
+//! If the center flag is set, a notch is drawn to
+//! show the center position.
+//---------------------------------------------------------
+
+void AbstractSlider::setCenter(bool val)
+ {
+ if (val != _center) {
+ _center = val;
+ update();
+ }
+ }
+
+//!--------------------------------------------------------
+// setScaleWidth
+//---------------------------------------------------------
+
+void AbstractSlider::setScaleWidth(int val)
+ {
+ if (val != _scaleWidth) {
+ _scaleWidth = val;
+ update();
+ }
+ }
+
+//---------------------------------------------------------
+// setScaleColor
+//---------------------------------------------------------
+
+void AbstractSlider::setScaleColor(const QColor& c)
+ {
+ if (c != _scaleColor) {
+ _scaleColor = c;
+ update();
+ }
+ }
+
+//---------------------------------------------------------
+// setScaleValueColor
+//---------------------------------------------------------
+
+void AbstractSlider::setScaleValueColor(const QColor& c)
+ {
+ if (c != _scaleValueColor) {
+ _scaleValueColor = c;
+ update();
+ }
+ }
+
+//---------------------------------------------------------
+// paintEvent
+//---------------------------------------------------------
+
+void AbstractSlider::paintEvent(QPaintEvent* ev)
+ {
+ paint(ev->rect());
+ }
+
+//---------------------------------------------------------
+// wheelEvent
+//---------------------------------------------------------
+
+void AbstractSlider::wheelEvent(QWheelEvent* ev)
+ {
+ int div = 50;
+ if (ev->modifiers() & Qt::ShiftModifier)
+ div = 15;
+ _value += (ev->delta() * lineStep()) / div;
+ if (_value < _minValue)
+ _value = _minValue;
+ else if (_value > _maxValue)
+ _value = _maxValue;
+ valueChange();
+ }
+
+//---------------------------------------------------------
+// keyPressEvent
+//---------------------------------------------------------
+
+void AbstractSlider::keyPressEvent(QKeyEvent* ev)
+ {
+ float oval = _value;
+
+ switch (ev->key()) {
+ case Qt::Key_Home: _value = _minValue; break;
+ case Qt::Key_End: _value = _maxValue; break;
+ case Qt::Key_Up:
+ case Qt::Key_Left: _value += lineStep(); break;
+ case Qt::Key_Down:
+ case Qt::Key_Right: _value -= lineStep(); break;
+ case Qt::Key_PageDown: _value -= pageStep(); break;
+ case Qt::Key_PageUp: _value += pageStep(); break;
+ default:
+ break;
+ }
+ if (_value < _minValue)
+ _value = _minValue;
+ else if (_value > _maxValue)
+ _value = _maxValue;
+ if (oval != _value)
+ valueChange();
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void AbstractSlider::setValue(float val)
+ {
+ if (_log) {
+ if (val == 0.0f)
+ _value = _minValue;
+ else {
+ _value = fast_log10(val) * 20.0f;
+ if (_value < _minValue)
+ _value = _minValue;
+ }
+ }
+ else
+ _value = val;
+ update();
+ }
+
+//---------------------------------------------------------
+// valueChange
+//---------------------------------------------------------
+
+void AbstractSlider::valueChange()
+ {
+ emit valueChanged(value(), _id);
+ }
+
+//---------------------------------------------------------
+// value
+//---------------------------------------------------------
+
+float AbstractSlider::value() const
+ {
+ return _log ? (_value <= _minValue) ? 0.0f : pow(10.0, _value*0.05f)
+ : _value;
+ }
+}
+
diff --git a/muse/awl/aslider.h b/muse/awl/aslider.h
new file mode 100644
index 00000000..eed73277
--- /dev/null
+++ b/muse/awl/aslider.h
@@ -0,0 +1,126 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLASLIDER_H__
+#define __AWLASLIDER_H__
+
+namespace Awl {
+
+//---------------------------------------------------------
+// AbstractSlider
+//
+//! The AwlAbstractSlider class provides an float value within a range
+//
+//! The class is designed as a common super class for
+//! widgets like AwlKnob and AwlSlider
+//!
+//---------------------------------------------------------
+
+class AbstractSlider : public QWidget {
+ Q_OBJECT
+ Q_PROPERTY(float value READ value WRITE setValue)
+ Q_PROPERTY(bool center READ center WRITE setCenter)
+ Q_PROPERTY(bool invertedAppearance READ invertedAppearance WRITE setInvertedAppearance)
+
+ Q_PROPERTY(int scaleWidth READ scaleWidth WRITE setScaleWidth)
+ Q_PROPERTY(QColor scaleColor READ scaleColor WRITE setScaleColor)
+ Q_PROPERTY(QColor scaleValueColor READ scaleValueColor WRITE setScaleValueColor)
+
+ Q_PROPERTY(int id READ id WRITE setId)
+
+ Q_PROPERTY(double minValue READ minValue WRITE setMinValue)
+ Q_PROPERTY(double maxValue READ maxValue WRITE setMaxValue)
+ Q_PROPERTY(double lineStep READ lineStep WRITE setLineStep)
+ Q_PROPERTY(double pageStep READ pageStep WRITE setPageStep)
+ Q_PROPERTY(bool log READ log WRITE setLog)
+
+ virtual void paint(const QRect&) = 0;
+
+ protected:
+ int _id;
+ float _value;
+ double _minValue, _maxValue, _lineStep, _pageStep;
+ bool _center;
+ bool _invert;
+ int _scaleWidth; //! scale line width
+ QColor _scaleColor;
+ QColor _scaleValueColor;
+ bool _log;
+
+ virtual void paintEvent(QPaintEvent*);
+ virtual void wheelEvent(QWheelEvent*);
+ virtual void keyPressEvent(QKeyEvent*);
+ virtual void valueChange();
+
+ signals:
+ void valueChanged(float, int);
+
+ public slots:
+ virtual void setValue(float v);
+
+ public:
+ AbstractSlider(QWidget* parent = 0);
+
+ virtual void setCenter(bool val);
+ virtual void setScaleWidth(int);
+ virtual void setScaleColor(const QColor&);
+ virtual void setScaleValueColor(const QColor&);
+
+ //! return the center flag
+ bool center() const { return _center; }
+
+ //! return the scale line width
+ int scaleWidth() const { return _scaleWidth; }
+
+ //! return current scale color
+ QColor scaleColor() const { return _scaleColor; }
+
+ //! return color of active scale part
+ QColor scaleValueColor() const { return _scaleValueColor; }
+
+ virtual void setInvertedAppearance(bool val) { _invert = val; }
+ bool invertedAppearance() const { return _invert; }
+
+ int id() const { return _id; }
+ void setId(int i) { _id = i; }
+
+ virtual float value() const;
+
+ double minValue() const { return _minValue; }
+ void setMinValue(double v) { _minValue = v; }
+ double maxValue() const { return _maxValue; }
+ void setMaxValue(double v) { _maxValue = v; }
+ void setRange(double a, double b) {
+ setMinValue(a);
+ setMaxValue(b);
+ }
+ bool log() const { return _log; }
+ void setLog(bool v) { _log = v; }
+ double lineStep() const { return _lineStep; }
+ void setLineStep(double v) { _lineStep = v; }
+ double pageStep() const { return _pageStep; }
+ void setPageStep(double f) { _pageStep = f; }
+ void setEnabled(bool val);
+ };
+
+}
+
+#endif
+
diff --git a/muse/awl/awl.cpp b/muse/awl/awl.cpp
new file mode 100644
index 00000000..87aac3e7
--- /dev/null
+++ b/muse/awl/awl.cpp
@@ -0,0 +1,27 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "awl.h"
+
+namespace Awl {
+// int sampleRate = 44100;
+// int mtcType = 0;
+ };
+
diff --git a/muse/awl/awl.h b/muse/awl/awl.h
new file mode 100644
index 00000000..2019c4bd
--- /dev/null
+++ b/muse/awl/awl.h
@@ -0,0 +1,30 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWL_H__
+#define __AWL_H__
+
+namespace Awl {
+// extern int sampleRate;
+// extern int mtcType;
+ };
+
+#endif
+
diff --git a/muse/awl/awlplugin.cpp b/muse/awl/awlplugin.cpp
new file mode 100644
index 00000000..df0769ed
--- /dev/null
+++ b/muse/awl/awlplugin.cpp
@@ -0,0 +1,121 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "volknob.h"
+#include "volslider.h"
+#include "mslider.h"
+#include "awlplugin.h"
+#include "posedit.h"
+#include "poslabel.h"
+#include "tempoedit.h"
+#include "tempolabel.h"
+#include "checkbox.h"
+#include "combobox.h"
+#include "floatentry.h"
+#include "panknob.h"
+#include "midipanknob.h"
+
+#include <QtCore/QtPlugin>
+#include <QtDesigner/QDesignerCustomWidgetInterface>
+
+QWidget* KnobPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::Knob(parent);
+ }
+QWidget* VolKnobPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::VolKnob(parent);
+ }
+QWidget* SliderPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::Slider(parent);
+ }
+QWidget* VolSliderPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::VolSlider(parent);
+ }
+QWidget* MeterSliderPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::MeterSlider(parent);
+ }
+QWidget* PosEditPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::PosEdit(parent);
+ }
+QWidget* PosLabelPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::PosLabel(parent);
+ }
+QWidget* TempoEditPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::TempoEdit(parent);
+ }
+QWidget* TempoLabelPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::TempoLabel(parent);
+ }
+QWidget* CheckBoxPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::CheckBox(parent);
+ }
+QWidget* ComboBoxPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::ComboBox(parent);
+ }
+QWidget* FloatEntryPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::FloatEntry(parent);
+ }
+QWidget* PanKnobPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::PanKnob(parent);
+ }
+QWidget* MidiPanKnobPlugin::createWidget(QWidget* parent)
+ {
+ return new Awl::MidiPanKnob(parent);
+ }
+
+//---------------------------------------------------------
+// customWidgets
+//---------------------------------------------------------
+
+QList<QDesignerCustomWidgetInterface*> AwlPlugins::customWidgets() const
+ {
+ QList<QDesignerCustomWidgetInterface*> plugins;
+ plugins
+ << new VolKnobPlugin
+ << new PanKnobPlugin
+ << new MidiPanKnobPlugin
+ << new KnobPlugin
+ << new SliderPlugin
+ << new VolSliderPlugin
+ << new MeterSliderPlugin
+ << new PosEditPlugin
+ << new PosLabelPlugin
+ << new TempoEditPlugin
+ << new TempoLabelPlugin
+ << new CheckBoxPlugin
+ << new ComboBoxPlugin
+ << new FloatEntryPlugin;
+ return plugins;
+ }
+
+Q_EXPORT_PLUGIN(AwlPlugins)
+
diff --git a/muse/awl/awlplugin.h b/muse/awl/awlplugin.h
new file mode 100644
index 00000000..8dcfb08e
--- /dev/null
+++ b/muse/awl/awlplugin.h
@@ -0,0 +1,259 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLPLUGIN_H__
+#define __AWLPLUGIN_H__
+
+#include <QtDesigner/QDesignerCustomWidgetInterface>
+
+//---------------------------------------------------------
+// AwlPlugin
+//---------------------------------------------------------
+
+class AwlPlugin : public QDesignerCustomWidgetInterface {
+ Q_INTERFACES(QDesignerCustomWidgetInterface)
+ bool m_initialized;
+
+ public:
+ AwlPlugin() : m_initialized(false) { }
+ bool isContainer() const { return false; }
+ bool isInitialized() const { return m_initialized; }
+ QIcon icon() const { return QIcon(); }
+ virtual QString codeTemplate() const { return QString(); }
+ QString whatsThis() const { return QString(); }
+ QString toolTip() const { return QString(); }
+ QString group() const { return "MusE Awl Widgets"; }
+ void initialize(QDesignerFormEditorInterface *) {
+ if (m_initialized)
+ return;
+ m_initialized = true;
+ }
+ };
+
+//---------------------------------------------------------
+// KnobPlugin
+//---------------------------------------------------------
+
+class KnobPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ KnobPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return QString("awl/knob.h"); }
+ QString name() const { return "Awl::Knob"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// VolKnobPlugin
+//---------------------------------------------------------
+
+class VolKnobPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ VolKnobPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/volknob.h"; }
+ QString name() const { return "Awl::VolKnob"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// SliderPlugin
+//---------------------------------------------------------
+
+class SliderPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ SliderPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/slider.h"; }
+ QString name() const { return "Awl::Slider"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// VolSliderPlugin
+//---------------------------------------------------------
+
+class VolSliderPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ VolSliderPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/volslider.h"; }
+ QString name() const { return "Awl::VolSlider"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// MeterSliderPlugin
+//---------------------------------------------------------
+
+class MeterSliderPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ MeterSliderPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/mslider.h"; }
+ QString name() const { return "Awl::MeterSlider"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// PosEditPlugin
+//---------------------------------------------------------
+
+class PosEditPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ PosEditPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/posedit.h"; }
+ QString name() const { return "Awl::PosEdit"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// PosLabelPlugin
+//---------------------------------------------------------
+
+class PosLabelPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ PosLabelPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/poslabel.h"; }
+ QString name() const { return "Awl::PosLabel"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// TempoEditPlugin
+//---------------------------------------------------------
+
+class TempoEditPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ TempoEditPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/tempoedit.h"; }
+ QString name() const { return "Awl::TempoEdit"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// TempoLabelPlugin
+//---------------------------------------------------------
+
+class TempoLabelPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ TempoLabelPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/tempolabel.h"; }
+ QString name() const { return "Awl::TempoLabel"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// CheckBoxPlugin
+//---------------------------------------------------------
+
+class CheckBoxPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ CheckBoxPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/checkbox.h"; }
+ QString name() const { return "Awl::CheckBox"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// ComboBoxPlugin
+//---------------------------------------------------------
+
+class ComboBoxPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ ComboBoxPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/combobox.h"; }
+ QString name() const { return "Awl::ComboBox"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// FloatEntryPlugin
+//---------------------------------------------------------
+
+class FloatEntryPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ FloatEntryPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/floatentry.h"; }
+ QString name() const { return "Awl::FloatEntry"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// PanKnobPlugin
+//---------------------------------------------------------
+
+class PanKnobPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ PanKnobPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/panknob.h"; }
+ QString name() const { return "Awl::PanKnob"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// MidiPanKnobPlugin
+//---------------------------------------------------------
+
+class MidiPanKnobPlugin : public QObject, public AwlPlugin {
+ Q_OBJECT
+
+ public:
+ MidiPanKnobPlugin(QObject* parent = 0) : QObject(parent) {}
+ QString includeFile() const { return "awl/midipanknob.h"; }
+ QString name() const { return "Awl::MidiPanKnob"; }
+ QWidget* createWidget(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// AwlPlugins
+//---------------------------------------------------------
+
+class AwlPlugins : public QObject, public QDesignerCustomWidgetCollectionInterface {
+ Q_OBJECT
+ Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
+
+ public:
+ QList<QDesignerCustomWidgetInterface*> customWidgets() const;
+ };
+
+#endif
+
diff --git a/muse/awl/checkbox.cpp b/muse/awl/checkbox.cpp
new file mode 100644
index 00000000..6ef74386
--- /dev/null
+++ b/muse/awl/checkbox.cpp
@@ -0,0 +1,36 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "checkbox.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// CheckBox
+//---------------------------------------------------------
+
+CheckBox::CheckBox(QWidget* parent)
+ : QCheckBox(parent)
+ {
+ _id = 0;
+ connect(this, SIGNAL(toggled(bool)), SLOT(hasToggled(bool)));
+ }
+}
+
diff --git a/muse/awl/checkbox.h b/muse/awl/checkbox.h
new file mode 100644
index 00000000..145105bf
--- /dev/null
+++ b/muse/awl/checkbox.h
@@ -0,0 +1,55 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLCHECKBOX_H__
+#define __AWLCHECKBOX_H__
+
+namespace Awl {
+
+//---------------------------------------------------------
+// CheckBox
+//---------------------------------------------------------
+
+class CheckBox : public QCheckBox {
+ Q_OBJECT
+ Q_PROPERTY(int id READ id WRITE setId)
+
+ int _id;
+
+ private slots:
+ void hasToggled(bool val) {
+ emit valueChanged(float(val), _id);
+ }
+ signals:
+ void valueChanged(float, int);
+
+ public slots:
+ void setValue(float val) { setDown(val > 0.5f); }
+
+ public:
+ CheckBox(QWidget* parent);
+ int id() const { return _id; }
+ void setId(int i) { _id = i; }
+ };
+
+}
+
+#endif
+
diff --git a/muse/awl/clock.xpm b/muse/awl/clock.xpm
new file mode 100644
index 00000000..3bf15e01
--- /dev/null
+++ b/muse/awl/clock.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *clock_xpm[]={
+"18 18 3 1",
+". c None",
+"# c #000000",
+"a c #0000c0",
+"...####a#####.....",
+"..####.aaa.###....",
+".####..aaa..###...",
+".###...aaa...###..",
+".#.....aaa....##..",
+"##.....aaa.....##.",
+"##.....aaa.....##.",
+"###....aaaaaaaaa#.",
+"###....aaaaaaaaa#.",
+"##.....aaaaaaaaa#.",
+"##............#.#.",
+".##...........##..",
+".##..........###..",
+"..##........####..",
+"...####...####....",
+"....#########.....",
+"......######......",
+".................."};
diff --git a/muse/awl/combobox.cpp b/muse/awl/combobox.cpp
new file mode 100644
index 00000000..58c82c54
--- /dev/null
+++ b/muse/awl/combobox.cpp
@@ -0,0 +1,36 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "combobox.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// ComboBox
+//---------------------------------------------------------
+
+ComboBox::ComboBox(QWidget* parent)
+ : QComboBox(parent)
+ {
+ _id = 0;
+ connect(this, SIGNAL(activated(int)), SLOT(activatedIntern(int)));
+ }
+}
+
diff --git a/muse/awl/combobox.h b/muse/awl/combobox.h
new file mode 100644
index 00000000..c3c4d91b
--- /dev/null
+++ b/muse/awl/combobox.h
@@ -0,0 +1,55 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLCOMBOBOX_H__
+#define __AWLCOMBOBOX_H__
+
+namespace Awl {
+
+//---------------------------------------------------------
+// ComboBox
+//---------------------------------------------------------
+
+class ComboBox : public QComboBox {
+ Q_OBJECT
+ Q_PROPERTY(int id READ id WRITE setId)
+
+ int _id;
+
+ private slots:
+ void activatedIntern(int val) {
+ emit valueChanged(float(val), _id);
+ }
+
+ signals:
+ void valueChanged(float, int);
+
+ public slots:
+ void setValue(float val) { setCurrentIndex(int(val)); }
+
+ public:
+ ComboBox(QWidget* parent);
+ int id() const { return _id; }
+ void setId(int i) { _id = i; }
+ };
+
+}
+
+#endif
diff --git a/muse/awl/fastlog.h b/muse/awl/fastlog.h
new file mode 100644
index 00000000..90a85342
--- /dev/null
+++ b/muse/awl/fastlog.h
@@ -0,0 +1,39 @@
+/* Copyright unknown. Code by Laurent de Soras <laurent@ohmforce.com>.
+ */
+
+#ifndef __FASTLOG_H__
+#define __FASTLOG_H__
+
+#include <math.h> /* for HUGE_VAL */
+
+static inline float fast_log2 (float val)
+ {
+ /* don't use reinterpret_cast<> because that prevents this
+ from being used by pure C code (for example, GnomeCanvasItems)
+ */
+ union {float f; int i;} t;
+ t.f = val;
+ int* const exp_ptr = &t.i;
+ int x = *exp_ptr;
+ const int log_2 = ((x >> 23) & 255) - 128;
+ x &= ~(255 << 23);
+ x += 127 << 23;
+ *exp_ptr = x;
+ val = ((-1.0f/3) * t.f + 2) * t.f - 2.0f/3;
+ return (val + log_2);
+ }
+
+static inline float fast_log (const float val)
+ {
+ return (fast_log2 (val) * 0.69314718f);
+ }
+
+static inline float fast_log10 (const float val)
+ {
+ return fast_log2(val) / 3.312500f;
+ }
+
+static inline float minus_infinity() { return -HUGE_VAL; }
+
+#endif
+
diff --git a/muse/awl/floatentry.cpp b/muse/awl/floatentry.cpp
new file mode 100644
index 00000000..a9875594
--- /dev/null
+++ b/muse/awl/floatentry.cpp
@@ -0,0 +1,317 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "floatentry.h"
+#include "fastlog.h"
+
+#define TIMER1 400
+#define TIMER2 200
+#define TIMEC 7
+#define TIMER3 100
+#define TIMEC2 20
+#define TIMER4 50
+
+namespace Awl {
+
+//---------------------------------------------------------
+// FloatEntry
+//---------------------------------------------------------
+
+FloatEntry::FloatEntry(QWidget* parent)
+ : QLineEdit(parent)
+ {
+ _id = 0;
+ _minValue = 0.0;
+ _maxValue = 1.0;
+ _log = false;
+ evx = 1.0;
+ _precision = 3;
+ timer = new QTimer(this);
+ connect(timer, SIGNAL(timeout()), SLOT(repeat()));
+ _value = 0.0f;
+ connect(this, SIGNAL(returnPressed()), SLOT(endEdit()));
+ setCursor(QCursor(Qt::ArrowCursor));
+ updateValue();
+ }
+
+//---------------------------------------------------------
+// setString
+//---------------------------------------------------------
+
+bool FloatEntry::setString(float v)
+ {
+ QString s;
+// if (v < _minValue || v > _maxValue) {
+ if (v < _minValue) {
+ if (!_specialText.isEmpty())
+ setText(_specialText);
+ return true;
+ }
+ s.setNum(v, 'f', _precision);
+ if (!_suffix.isEmpty()) {
+ // s += " ";
+ s += _suffix;
+ }
+ setText(s);
+ return false;
+ }
+
+//---------------------------------------------------------
+// setSValue
+//---------------------------------------------------------
+
+void FloatEntry::setSValue(const QString& s)
+ {
+ bool ok;
+ float v = s.toFloat(&ok);
+ if (ok && (v != _value)) {
+ if (v < _minValue)
+ v = _minValue;
+ if (v > _maxValue)
+ v = _maxValue;
+ _value = v;
+ updateValue();
+ valueChange();
+ }
+ }
+
+//---------------------------------------------------------
+// valueChange
+//---------------------------------------------------------
+
+void FloatEntry::valueChange()
+ {
+ emit valueChanged(value(), _id);
+ }
+
+//---------------------------------------------------------
+// incValue
+//---------------------------------------------------------
+
+void FloatEntry::incValue(float)
+ {
+ if (_value + 1.0 < _maxValue) {
+ _value = _value + 1.0;
+ updateValue();
+ valueChange();
+ }
+ }
+
+//---------------------------------------------------------
+// decValue
+//---------------------------------------------------------
+
+void FloatEntry::decValue(float)
+ {
+ if (_value - 1.0 > _minValue) {
+ _value = _value - 1.0;
+ updateValue();
+ valueChange();
+ }
+ }
+
+//---------------------------------------------------------
+// setPrecision
+//---------------------------------------------------------
+
+void FloatEntry::setPrecision(int v)
+ {
+ _precision = v;
+ setString(_value);
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize FloatEntry::sizeHint() const
+ {
+ QFontMetrics fm = fontMetrics();
+ int h = fm.height() + 4;
+ int n = _precision + 3;
+ int w = fm.width(QString("-0.")) + fm.width('0') * n + 6;
+ return QSize(w, h);
+ }
+
+//---------------------------------------------------------
+// endEdit
+//---------------------------------------------------------
+
+void FloatEntry::endEdit()
+ {
+ if (QLineEdit::isModified())
+ setSValue(text());
+ clearFocus();
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void FloatEntry::mousePressEvent(QMouseEvent* event)
+ {
+ button = event->button();
+ starty = event->y();
+ evx = float(event->x());
+ timecount = 0;
+ repeat();
+ timer->start(TIMER1);
+ }
+
+//---------------------------------------------------------
+// wheelEvent
+//---------------------------------------------------------
+
+void FloatEntry::wheelEvent(QWheelEvent* event)
+ {
+ int delta = event->delta();
+
+ if (delta < 0)
+ decValue(-1.0);
+ else if (delta > 0)
+ incValue(1.0);
+ }
+
+//---------------------------------------------------------
+// repeat
+//---------------------------------------------------------
+
+void FloatEntry::repeat()
+ {
+ if (timecount == 1) {
+ ++timecount;
+ timer->stop();
+ timer->start(TIMER2);
+ return;
+ }
+ ++timecount;
+ if (timecount == TIMEC) {
+ timer->stop();
+ timer->start(TIMER3);
+ }
+ if (timecount == TIMEC2) {
+ timer->stop();
+ timer->start(TIMER4);
+ }
+
+ switch (button) {
+ case Qt::LeftButton:
+ return;
+ case Qt::MidButton:
+ decValue(evx);
+ break;
+ case Qt::RightButton:
+ incValue(evx);
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// mouseReleaseEvent
+//---------------------------------------------------------
+
+void FloatEntry::mouseReleaseEvent(QMouseEvent*)
+ {
+ button = Qt::NoButton;
+ timer->stop();
+ }
+
+//---------------------------------------------------------
+// mouseMoveEvent
+//---------------------------------------------------------
+
+void FloatEntry::mouseMoveEvent(QMouseEvent*)
+ {
+ switch (button) {
+ case Qt::LeftButton:
+ break;
+ case Qt::MidButton:
+ break;
+ case Qt::RightButton:
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// mouseDoubleClickEvent
+//---------------------------------------------------------
+
+void FloatEntry::mouseDoubleClickEvent(QMouseEvent* event)
+ {
+ if (event->button() != Qt::LeftButton) {
+ mousePressEvent(event);
+ return;
+ }
+ setFocus();
+ QLineEdit::setFrame(true);
+ update();
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void FloatEntry::setValue(float val)
+ {
+ if (_log) {
+ if (val == 0.0f)
+ _value = _minValue;
+ else
+ _value = fast_log10(val) * 20.0f;
+ }
+ else
+ _value = val;
+ updateValue();
+ }
+
+//---------------------------------------------------------
+// updateValue
+//---------------------------------------------------------
+
+void FloatEntry::updateValue()
+ {
+ if (setString(_value)) {
+ // value is out of range:
+ if (_value > _maxValue)
+ _value = _maxValue;
+ else if (_value < _minValue)
+ _value = _minValue;
+ }
+ }
+
+//---------------------------------------------------------
+// value
+//---------------------------------------------------------
+
+float FloatEntry::value() const
+ {
+ float rv;
+ if (_log)
+ rv = pow(10.0, _value * 0.05f);
+ else
+ rv = _value;
+ return rv;
+ }
+}
+
diff --git a/muse/awl/floatentry.h b/muse/awl/floatentry.h
new file mode 100644
index 00000000..1fbdc7bc
--- /dev/null
+++ b/muse/awl/floatentry.h
@@ -0,0 +1,112 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __FLOATLABEL_H__
+#define __FLOATLABEL_H__
+
+namespace Awl {
+
+//---------------------------------------------------------
+// FloatEntry
+//---------------------------------------------------------
+
+class FloatEntry : public QLineEdit {
+ Q_OBJECT
+ Q_PROPERTY(int id READ id WRITE setId)
+
+ Q_PROPERTY(double minValue READ minValue WRITE setMinValue)
+ Q_PROPERTY(double maxValue READ maxValue WRITE setMaxValue)
+
+ Q_PROPERTY(QString specialText READ specialText WRITE setSpecialText)
+ Q_PROPERTY(QString suffix READ suffix WRITE setSuffix)
+ Q_PROPERTY(int precision READ precision WRITE setPrecision)
+ Q_PROPERTY(bool log READ log WRITE setLog)
+
+ int button;
+ int starty;
+ QTimer* timer;
+ double evx;
+ int timecount;
+ double _minValue, _maxValue;
+ QString _specialText; // text to show if value outside min,max
+ QString _suffix;
+ int _precision;
+ bool _log;
+
+ virtual void wheelEvent(QWheelEvent*);
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void mouseMoveEvent(QMouseEvent*);
+ virtual void mouseDoubleClickEvent(QMouseEvent*);
+ virtual void mouseReleaseEvent(QMouseEvent*);
+ virtual void setSValue(const QString&);
+ virtual bool setString(float);
+ virtual void incValue(float);
+ virtual void decValue(float);
+
+ void updateValue();
+
+ protected:
+ int _id;
+ float _value;
+ virtual void valueChange();
+
+ private slots:
+ void repeat();
+
+ protected slots:
+ void endEdit();
+
+ public slots:
+ virtual void setValue(float);
+
+ signals:
+ void valueChanged(float, int);
+
+ public:
+ FloatEntry(QWidget*);
+ virtual QSize sizeHint() const;
+ virtual float value() const;
+ int id() const { return _id; }
+ void setId(int i) { _id = i; }
+ double minValue() const { return _minValue; }
+ double maxValue() const { return _maxValue; }
+ void setMinValue(double v) { _minValue = v; }
+ void setMaxValue(double v) { _maxValue = v; }
+ void setRange(double a, double b) {
+ _minValue = a;
+ _maxValue = b;
+ }
+ int precision() const { return _precision; }
+ void setPrecision(int val);
+ QString specialText() const { return _specialText; }
+ void setSpecialText(const QString& s) {
+ _specialText = s;
+ update();
+ }
+ QString suffix() const { return _suffix; }
+ void setSuffix(const QString& s) { _suffix = s; }
+ bool log() const { return _log; }
+ void setLog(bool v) { _log = v; }
+ };
+
+}
+
+#endif
+
diff --git a/muse/awl/knob.cpp b/muse/awl/knob.cpp
new file mode 100644
index 00000000..8fb57508
--- /dev/null
+++ b/muse/awl/knob.cpp
@@ -0,0 +1,281 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "knob.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// Knob
+/// this is the AwlKnob contructor
+//---------------------------------------------------------
+
+Knob::Knob(QWidget* parent)
+ : AbstractSlider(parent)
+ {
+ _scaleSize = 270;
+ _markSize = 6;
+ _border = 2;
+ points = 0;
+ }
+
+//---------------------------------------------------------
+// Knob
+//---------------------------------------------------------
+
+Knob::~Knob()
+ {
+ if (points)
+ delete points;
+ }
+
+//---------------------------------------------------------
+// setText
+//---------------------------------------------------------
+
+void Knob::setText(const QString& s)
+ {
+ if (s != _text) {
+ _text = s;
+ update();
+ }
+ }
+
+//---------------------------------------------------------
+// setScaleSize
+//! set the scale size in degrees
+//
+//! the scale size is the max moving angle measured
+//! in degrees
+//---------------------------------------------------------
+
+void Knob::setScaleSize(int val)
+ {
+ if (val != _scaleSize) {
+ _scaleSize = val;
+ update();
+ }
+ }
+
+//---------------------------------------------------------
+// setMarkSize
+//! set size of the center marker
+//---------------------------------------------------------
+
+void Knob::setMarkSize(int val)
+ {
+ if (val != _markSize) {
+ _markSize = val;
+ update();
+ }
+ }
+
+//---------------------------------------------------------
+// setBorder
+//! set border size
+//---------------------------------------------------------
+
+void Knob::setBorder(int val)
+ {
+ if (val != _border) {
+ _border = val;
+ update();
+ }
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void Knob::mousePressEvent(QMouseEvent* ev)
+ {
+ startY = ev->y();
+ emit sliderPressed(_id);
+ if (_center) {
+ QRect r(points->boundingRect().toRect());
+ if (r.contains(ev->pos())) {
+ setValue(.0f);
+ valueChange();
+ update();
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// mouseReleaseEvent
+//---------------------------------------------------------
+
+void Knob::mouseReleaseEvent(QMouseEvent*)
+ {
+ emit sliderReleased(_id);
+ }
+
+//---------------------------------------------------------
+// mouseMoveEvent
+//---------------------------------------------------------
+
+void Knob::mouseMoveEvent(QMouseEvent* ev)
+ {
+ int y = ev->y();
+ float delta = (maxValue() - minValue()) / 100.0f;
+ if (delta == 0)
+ delta = 1;
+ _value += (startY - y) * delta;
+ if (_value < minValue())
+ _value = _minValue;
+ else if (_value > maxValue())
+ _value = _maxValue;
+ startY = y;
+ valueChange();
+ update();
+ }
+
+//---------------------------------------------------------
+// paint
+// r - phys coord system
+//---------------------------------------------------------
+
+void Knob::paint(const QRect& r)
+ {
+ QRect rr(r);
+ QPainter p(this);
+ p.setRenderHint(QPainter::Antialiasing, true);
+
+ int markSize2 = _markSize/2;
+ int restR = 360 - _scaleSize;
+ int w = width() - _scaleWidth - 2 * _border;
+ int h = height() - _scaleWidth/2 - 2 * _border;
+
+ int xoffset, yoffset;
+ if (_center)
+ h -= _markSize;
+ if (w > h) {
+ yoffset = 0;
+ xoffset = (w - h) / 2;
+ w = h;
+ }
+ else {
+ xoffset = 0;
+ yoffset = (h - w) / 2;
+ h = w;
+ }
+
+ int x = xoffset + _scaleWidth / 2 + _border;
+ int y = yoffset + _scaleWidth / 2 + _border + (_center ? _markSize+_scaleWidth/2 : 0);
+ QRectF ar(x, y, w, h);
+
+ QColor sc(isEnabled() ? _scaleColor : Qt::gray);
+ QColor svc(isEnabled() ? _scaleValueColor : Qt::gray);
+
+ //-----------------------------------------
+ // draw arc
+ //-----------------------------------------
+
+ float dvalue = maxValue() - minValue();
+ if (_center) {
+ int size = _scaleSize * 8;
+ if (_value >= 0) {
+ int offset = (restR-180) * 8;
+ int r1 = int (size * _value / maxValue());
+ int r2 = size - r1;
+ p.setPen(QPen(sc, _scaleWidth));
+ if (r2 > 1)
+ p.drawArc(ar, offset, r2);
+ if (size > 1)
+ p.drawArc(ar, 90*16, size);
+ if (r1 > 1) {
+ p.setPen(QPen(svc, _scaleWidth));
+ p.drawArc(ar, offset+r2, r1);
+ }
+ }
+ else {
+ // int offset = (restR+180) * 8;
+ int r1 = int(size * _value / minValue());
+ int r2 = size - r1;
+
+ p.setPen(QPen(sc, _scaleWidth));
+ if (size > 1)
+ p.drawArc(ar, (restR-180)*8, size);
+ if (r2 > 1)
+ p.drawArc(ar, 90 * 16 + r1, r2);
+ if (r1 > 1) {
+ p.setPen(QPen(svc, _scaleWidth));
+ p.drawArc(ar, 90*16, r1);
+ }
+ }
+ }
+ else {
+ int offset = (180-restR) * 8;
+ int size = _scaleSize * 16;
+ int r1 = int(size * (_value - minValue()) / dvalue);
+ int r2 = size - r1;
+ if (r2 >= 1) {
+ p.setPen(QPen(sc, _scaleWidth));
+ p.drawArc(ar, -offset, r2);
+ }
+ if (r1 >= 1) {
+ p.setPen(QPen(svc, _scaleWidth));
+ p.drawArc(ar, r2-offset, r1);
+ }
+ }
+
+ //-----------------------------------------
+ // draw pointer
+ //-----------------------------------------
+
+ p.setPen(QPen(svc, _scaleWidth));
+ double r1 = double(_scaleSize) * (_value-minValue()) / dvalue + 90.0
+ + double(restR/2);
+ r1 = r1 / 180.0 * M_PI; // convert to radians
+ int rd = w/2;
+ int x1 = x + rd;
+ int y1 = y + rd;
+ int x2 = x1 + lrint(cos(r1) * double(rd));
+ int y2 = y1 + lrint(sin(r1) * double(rd));
+ p.drawLine(x1, y1, x2, y2);
+
+ //-----------------------------------------
+ // draw center mark
+ //-----------------------------------------
+
+ p.setPen(QPen(svc, 0));
+ p.setBrush(svc);
+ if (_center) {
+ if (points)
+ delete points;
+ qreal x = ar.width() / 2 + ar.x();
+ qreal y = ar.y() - _markSize - _scaleWidth/2;
+ points = new QPainterPath(QPointF(x - markSize2, y));
+ points->lineTo(x + markSize2, y);
+ points->lineTo(x, _markSize + y);
+ points->closeSubpath();
+ p.drawPath(*points);
+ }
+
+ //-----------------------------------------
+ // draw text
+ //-----------------------------------------
+
+ if (!_text.isEmpty()) {
+ p.drawText(ar, Qt::AlignBottom | Qt::AlignHCenter, _text);
+ }
+ }
+}
+
diff --git a/muse/awl/knob.h b/muse/awl/knob.h
new file mode 100644
index 00000000..cd9cf693
--- /dev/null
+++ b/muse/awl/knob.h
@@ -0,0 +1,85 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLKNOB_H__
+#define __AWLKNOB_H__
+
+#include "aslider.h"
+// #include <QtDesigner/QDesignerExportWidget>
+
+namespace Awl {
+
+//---------------------------------------------------------
+// Knob
+//
+//! Base class of all dialer type input widgets.
+//
+//! xxxxxxxxx
+//!
+//---------------------------------------------------------
+
+class Q_DECL_EXPORT Knob : public AbstractSlider {
+ Q_OBJECT
+ Q_PROPERTY(int scaleSize READ scaleSize WRITE setScaleSize)
+ Q_PROPERTY(int markSize READ markSize WRITE setMarkSize)
+ Q_PROPERTY(int border READ border WRITE setBorder)
+ Q_PROPERTY(QString text READ text WRITE setText)
+
+ int _scaleSize; //! scale size in degrees
+ int _markSize;
+ int _border;
+ QPainterPath* points;
+
+ virtual void paint(const QRect& r);
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void mouseReleaseEvent(QMouseEvent*);
+ virtual void mouseMoveEvent(QMouseEvent*);
+
+ protected:
+ int startY;
+ QString _text;
+
+ signals:
+ void sliderPressed(int);
+ void sliderReleased(int);
+
+ public:
+ Knob(QWidget* parent = 0);
+ ~Knob();
+ virtual QSize sizeHint() const { return QSize(50, 50); }
+ virtual int heightForWidth(int w) { return w; }
+
+ //! return text decoration
+ QString text() const { return _text; }
+ void setText(const QString& s);
+
+ //! return scale size in degrees
+ int scaleSize() const { return _scaleSize; }
+ void setScaleSize(int val);
+ int markSize() const { return _markSize; }
+ void setMarkSize(int val);
+ int border() const { return _border; }
+ void setBorder(int val);
+ };
+
+}
+
+#endif
+
diff --git a/muse/awl/metronom.xpm b/muse/awl/metronom.xpm
new file mode 100644
index 00000000..d16a2fb5
--- /dev/null
+++ b/muse/awl/metronom.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *metronom_xpm[]={
+"18 18 3 1",
+". c None",
+"# c #000000",
+"a c #0000ff",
+".........##.......",
+".........##.......",
+"........###....a..",
+".......###.#..aaa.",
+".......##..#.aaa..",
+"......###...#aa...",
+"......##....aaa...",
+".....##....aaa....",
+"....###...aaa#....",
+"....##....aa.#....",
+"...###...aa...#...",
+"..###...aaa...#...",
+"..##...aaa....#...",
+".###...aaa.....#..",
+".##....aa......#..",
+"###.....a.......#.",
+"##################",
+"##################"};
diff --git a/muse/awl/midimeter.cpp b/muse/awl/midimeter.cpp
new file mode 100644
index 00000000..aa6e528b
--- /dev/null
+++ b/muse/awl/midimeter.cpp
@@ -0,0 +1,139 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+#include "midimeter.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiMeter
+//---------------------------------------------------------
+
+MidiMeter::MidiMeter(QWidget* parent)
+ : Slider(parent)
+ {
+ setRange(0.0f, 127.0f);
+ setLineStep(2);
+ setPageStep(4);
+
+ setScaleWidth(7);
+ _meterWidth = _scaleWidth * 3;
+ meterval = 0.0f;
+ }
+
+//---------------------------------------------------------
+// setMeterVal
+// v - 0.0 < 1.0
+//---------------------------------------------------------
+
+void MidiMeter::setMeterVal(float v)
+ {
+ if (v < 0.001)
+ v = .0f;
+ if (meterval != v) {
+ meterval = v;
+ update();
+ }
+ }
+
+//---------------------------------------------------------
+// mouseDoubleClickEvent
+//---------------------------------------------------------
+
+void MidiMeter::mouseDoubleClickEvent(QMouseEvent*)
+ {
+ _value = _minValue;
+ valueChange();
+ update();
+ }
+
+//---------------------------------------------------------
+// drawScale
+//---------------------------------------------------------
+
+void MidiMeter::paint(const QRect& r)
+ {
+ int pixel = height() - sliderSize().height();
+ float range = maxValue() - minValue();
+ int ppos = int(pixel * (_value - minValue()) / range);
+ if (_invert)
+ ppos = pixel - ppos;
+
+ QRect rr(r);
+ QPainter p(this);
+
+ QColor sc(isEnabled() ? _scaleColor : Qt::gray);
+ QColor svc(isEnabled() ? _scaleValueColor : Qt::gray);
+ p.setBrush(svc);
+
+ int h = height();
+// int kw = sliderSize().width();
+ int kh = sliderSize().height();
+
+ //---------------------------------------------------
+ // draw meter
+ //---------------------------------------------------
+
+ int mw = _meterWidth;
+ int x = 0;
+
+ int y1 = kh / 2;
+// int y2 = h - (ppos + y1);
+ int y3 = h - y1;
+
+ int mh = h - kh;
+
+ p.setPen(Qt::white);
+ h = lrint(meterval * mh);
+ if (h < 0)
+ h = 0;
+ else if (h > mh)
+ h = mh;
+ p.fillRect(x, y3-h, mw, h, QBrush(0x00ff00)); // green
+ p.fillRect(x, y1, mw, mh-h, QBrush(0x007000)); // dark green
+ x += mw;
+
+#if 0
+ //---------------------------------------------------
+ // draw scale
+ //---------------------------------------------------
+
+ x += _scaleWidth/2;
+
+ p.setPen(QPen(sc, _scaleWidth));
+ p.drawLine(x, y1, x, y2);
+ p.setPen(QPen(svc, _scaleWidth));
+ p.drawLine(x, y2, x, y3);
+
+ //---------------------------------------------------
+ // draw slider
+ //---------------------------------------------------
+
+ x += _scaleWidth/2;
+ p.setPen(QPen(svc, 0));
+ points.setPoint(0, x, y2);
+ points.setPoint(1, x + kw, y2 - kh/2);
+ points.setPoint(2, x + kw, y2 + kh/2);
+ p.drawConvexPolygon(points);
+#endif
+ }
+}
+
diff --git a/muse/awl/midimeter.h b/muse/awl/midimeter.h
new file mode 100644
index 00000000..1624fd97
--- /dev/null
+++ b/muse/awl/midimeter.h
@@ -0,0 +1,56 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLMIDIMETER_H__
+#define __AWLMIDIMETER_H__
+
+#include "slider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiMeter
+//---------------------------------------------------------
+
+class MidiMeter : public Slider
+ {
+ Q_PROPERTY(int meterWidth READ meterWidth WRITE setMeterWidth)
+ Q_OBJECT
+
+ float meterval;
+ int _meterWidth;
+
+ virtual void paint(const QRect& r);
+
+ protected:
+ virtual void mouseDoubleClickEvent(QMouseEvent*);
+
+ public slots:
+ void setMeterVal(float value);
+
+ public:
+ MidiMeter(QWidget* parent = 0);
+ int meterWidth() const { return _meterWidth; }
+ void setMeterWidth(int v) { _meterWidth = v; }
+ };
+}
+
+#endif
+
diff --git a/muse/awl/midimslider.cpp b/muse/awl/midimslider.cpp
new file mode 100644
index 00000000..0c3ffc0e
--- /dev/null
+++ b/muse/awl/midimslider.cpp
@@ -0,0 +1,139 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+#include "midimslider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiMeterSlider
+//---------------------------------------------------------
+
+MidiMeterSlider::MidiMeterSlider(QWidget* parent)
+ : Slider(parent)
+ {
+ setRange(0.0f, 127.0f);
+ setLineStep(2);
+ setPageStep(4);
+
+ setScaleWidth(7);
+ _meterWidth = _scaleWidth * 3;
+ meterval = 0.0f;
+ }
+
+//---------------------------------------------------------
+// setMeterVal
+// v - 0.0 < 1.0
+//---------------------------------------------------------
+
+void MidiMeterSlider::setMeterVal(float v)
+ {
+ if (v < 0.001)
+ v = .0f;
+ if (meterval != v) {
+ meterval = v;
+ update();
+ }
+ }
+
+//---------------------------------------------------------
+// mouseDoubleClickEvent
+//---------------------------------------------------------
+
+void MidiMeterSlider::mouseDoubleClickEvent(QMouseEvent*)
+ {
+ _value = _minValue;
+ valueChange();
+ update();
+ }
+
+//---------------------------------------------------------
+// drawScale
+//---------------------------------------------------------
+
+void MidiMeterSlider::paint(const QRect& r)
+ {
+ int pixel = height() - sliderSize().height();
+ float range = maxValue() - minValue();
+ int ppos = int(pixel * (_value - minValue()) / range);
+ if (_invert)
+ ppos = pixel - ppos;
+
+ QRect rr(r);
+ QPainter p(this);
+
+ QColor sc(isEnabled() ? _scaleColor : Qt::gray);
+ QColor svc(isEnabled() ? _scaleValueColor : Qt::gray);
+ p.setBrush(svc);
+
+ int h = height();
+// int kw = sliderSize().width();
+ int kh = sliderSize().height();
+
+ //---------------------------------------------------
+ // draw meter
+ //---------------------------------------------------
+
+ int mw = _meterWidth;
+ int x = 0;
+
+ int y1 = kh / 2;
+ int y2 = h - (ppos + y1);
+ int y3 = h - y1;
+
+ int mh = h - kh;
+
+ p.setPen(Qt::white);
+ h = lrint(meterval * mh);
+ if (h < 0)
+ h = 0;
+ else if (h > mh)
+ h = mh;
+ p.fillRect(x, y3-h, mw, h, QBrush(0x00ff00)); // green
+ p.fillRect(x, y1, mw, mh-h, QBrush(0x007000)); // dark green
+ x += mw;
+
+ //---------------------------------------------------
+ // draw scale
+ //---------------------------------------------------
+
+// x += _scaleWidth/2;
+
+// p.setPen(QPen(sc, _scaleWidth));
+// p.drawLine(x, y1, x, y2);
+// p.setPen(QPen(svc, _scaleWidth));
+// p.drawLine(x, y2, x, y3);
+
+ p.fillRect(x, y1, _scaleWidth, y2-y1, sc);
+ p.fillRect(x, y2, _scaleWidth, y3-y2, svc);
+
+ //---------------------------------------------------
+ // draw slider
+ //---------------------------------------------------
+
+ x += _scaleWidth/2;
+ p.setPen(QPen(svc, 0));
+ p.translate(QPointF(x, y2));
+ p.setRenderHint(QPainter::Antialiasing, true);
+ p.drawPath(*points);
+ }
+}
+
diff --git a/muse/awl/midimslider.h b/muse/awl/midimslider.h
new file mode 100644
index 00000000..f2f58a4d
--- /dev/null
+++ b/muse/awl/midimslider.h
@@ -0,0 +1,56 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLMIDIMSLIDER_H__
+#define __AWLMIDIMSLIDER_H__
+
+#include "slider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiMeterSlider
+//---------------------------------------------------------
+
+class MidiMeterSlider : public Slider
+ {
+ Q_PROPERTY(int meterWidth READ meterWidth WRITE setMeterWidth)
+ Q_OBJECT
+
+ float meterval;
+ int _meterWidth;
+
+ virtual void paint(const QRect& r);
+
+ protected:
+ virtual void mouseDoubleClickEvent(QMouseEvent*);
+
+ public slots:
+ void setMeterVal(float value);
+
+ public:
+ MidiMeterSlider(QWidget* parent = 0);
+ int meterWidth() const { return _meterWidth; }
+ void setMeterWidth(int v) { _meterWidth = v; }
+ };
+}
+
+#endif
+
diff --git a/muse/awl/midipanentry.cpp b/muse/awl/midipanentry.cpp
new file mode 100644
index 00000000..5e4e4f9a
--- /dev/null
+++ b/muse/awl/midipanentry.cpp
@@ -0,0 +1,47 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+#include "midipanentry.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiPanEntry
+//---------------------------------------------------------
+
+MidiPanEntry::MidiPanEntry(QWidget* parent)
+ : FloatEntry(parent)
+ {
+ setRange(-64.0f, 63.0f);
+ setFrame(true);
+ setPrecision(0);
+ }
+
+//---------------------------------------------------------
+// valueChange
+//---------------------------------------------------------
+
+void MidiPanEntry::valueChange()
+ {
+ emit valueChanged(_value + 64.0f, _id);
+ }
+}
+
diff --git a/muse/awl/midipanentry.h b/muse/awl/midipanentry.h
new file mode 100644
index 00000000..913339f8
--- /dev/null
+++ b/muse/awl/midipanentry.h
@@ -0,0 +1,48 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLMIDIPANENTRY_H__
+#define __AWLMIDIPANENTRY_H__
+
+#include "floatentry.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiPanEntry
+//---------------------------------------------------------
+
+class MidiPanEntry : public FloatEntry {
+ Q_OBJECT
+
+ protected:
+ virtual void valueChange();
+
+ public slots:
+ virtual void setValue(float v) {
+ FloatEntry::setValue(v - 64.0f);
+ }
+ public:
+ MidiPanEntry(QWidget* parent);
+ virtual float value() const { return _value + 64.0f; }
+ };
+}
+
+#endif
diff --git a/muse/awl/midipanknob.cpp b/muse/awl/midipanknob.cpp
new file mode 100644
index 00000000..a2530119
--- /dev/null
+++ b/muse/awl/midipanknob.cpp
@@ -0,0 +1,37 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "midipanknob.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiPanKnob
+//---------------------------------------------------------
+
+MidiPanKnob::MidiPanKnob(QWidget* parent)
+ : Knob(parent)
+ {
+ setCenter(true);
+ setRange(-64.0f, 63.0f);
+ setLineStep(1.0f);
+ setPageStep(10.0f);
+ }
+}
diff --git a/muse/awl/midipanknob.h b/muse/awl/midipanknob.h
new file mode 100644
index 00000000..5c4b715a
--- /dev/null
+++ b/muse/awl/midipanknob.h
@@ -0,0 +1,55 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLMIDIPANKNOB_H__
+#define __AWLMIDIPANKNOB_H__
+
+#include "knob.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiPanKnob
+//! MidiPan Knob entry widget
+//
+//! This widget implements a centered floating point
+//! knob used to adjust the pan position in an audio
+//! mixer.
+//---------------------------------------------------------
+
+class MidiPanKnob : public Knob {
+ Q_OBJECT
+
+ virtual void valueChange() {
+ emit valueChanged(_value + 64.0f, _id);
+ }
+
+ public slots:
+ virtual void setValue(float v) {
+ AbstractSlider::setValue(v - 64.0f);
+ }
+ public:
+ MidiPanKnob(QWidget* parent = 0);
+ virtual float value() const { return _value + 64.0f; }
+ };
+}
+
+#endif
+
diff --git a/muse/awl/midivolentry.cpp b/muse/awl/midivolentry.cpp
new file mode 100644
index 00000000..80aa1d1d
--- /dev/null
+++ b/muse/awl/midivolentry.cpp
@@ -0,0 +1,50 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+#include "midivolentry.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiVolEntry
+//---------------------------------------------------------
+
+MidiVolEntry::MidiVolEntry(QWidget* parent)
+ : FloatEntry(parent)
+ {
+ _max = 127;
+ setRange(-98.0f, 0.0f);
+ setSpecialText(tr("off"));
+ setSuffix(tr("db"));
+ setFrame(true);
+ setPrecision(0);
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void MidiVolEntry::setValue(float v)
+ {
+ FloatEntry::setValue(-fast_log10(float(_max*_max)/(v*v))*20.0f);
+ }
+}
+
diff --git a/muse/awl/midivolentry.h b/muse/awl/midivolentry.h
new file mode 100644
index 00000000..45216521
--- /dev/null
+++ b/muse/awl/midivolentry.h
@@ -0,0 +1,47 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLMIDIVOLENTRY_H__
+#define __AWLMIDIVOLENTRY_H__
+
+#include "floatentry.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MidiVolEntry
+//---------------------------------------------------------
+
+class MidiVolEntry : public FloatEntry {
+ Q_OBJECT
+ Q_PROPERTY(int max READ max WRITE setMax)
+
+ int _max;
+
+ public:
+ virtual void setValue(float);
+ void setMax(int val) { _max = val; }
+ int max() const { return _max; }
+ MidiVolEntry(QWidget* parent);
+ };
+}
+
+#endif
+
diff --git a/muse/awl/mslider.cpp b/muse/awl/mslider.cpp
new file mode 100644
index 00000000..2f910731
--- /dev/null
+++ b/muse/awl/mslider.cpp
@@ -0,0 +1,220 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+
+#include "mslider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MeterSlider
+//---------------------------------------------------------
+
+MeterSlider::MeterSlider(QWidget* parent)
+ : VolSlider(parent)
+ {
+ _channel = 0;
+ yellowScale = -10;
+ redScale = 0;
+ _meterWidth = _scaleWidth * 3;
+ setChannel(1);
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize MeterSlider::sizeHint() const
+ {
+ int w = _meterWidth + _scaleWidth + _scaleWidth + 30;
+ return orientation() == Qt::Vertical ? QSize(w, 200) : QSize(200, w);
+ }
+
+//---------------------------------------------------------
+// setChannel
+//---------------------------------------------------------
+
+void MeterSlider::setChannel(int n)
+ {
+ if (n > _channel) {
+ for (int i = _channel; i < n; ++i) {
+ meterval.push_back(0.0f);
+ meterPeak.push_back(0.0f);
+ }
+ }
+ _channel = n;
+ }
+
+//---------------------------------------------------------
+// setMeterVal
+//---------------------------------------------------------
+
+void MeterSlider::setMeterVal(int channel, float v, float peak)
+ {
+ bool mustRedraw = false;
+ if (meterval[channel] != v) {
+ meterval[channel] = v;
+ mustRedraw = true;
+ }
+ if (peak != meterPeak[channel]) {
+ meterPeak[channel] = peak;
+ mustRedraw = true;
+ }
+ if (mustRedraw)
+ update();
+ }
+
+//---------------------------------------------------------
+// resetPeaks
+// reset peak and overflow indicator
+//---------------------------------------------------------
+
+void MeterSlider::resetPeaks()
+ {
+ for (int i = 0; i < _channel; ++i)
+ meterPeak[i] = meterval[i];
+ update();
+ }
+
+//---------------------------------------------------------
+// paint
+//---------------------------------------------------------
+
+void MeterSlider::paint(const QRect& r)
+ {
+ int pixel = height() - sliderSize().height();
+ double range = maxValue() - minValue();
+ int ppos = int(pixel * (_value - minValue()) / range);
+ if (_invert)
+ ppos = pixel - ppos;
+
+ QRect rr(r);
+ QPainter p(this);
+
+ QColor sc(isEnabled() ? _scaleColor : Qt::gray);
+ QColor svc(isEnabled() ? _scaleValueColor : Qt::gray);
+ p.setBrush(svc);
+
+ int h = height();
+ int kh = sliderSize().height();
+
+ //---------------------------------------------------
+ // draw meter
+ //---------------------------------------------------
+
+ int mw = _meterWidth / _channel;
+ int x = 20;
+
+ int y1 = kh / 2;
+ int y2 = h - (ppos + y1);
+ int y3 = h - y1;
+
+ int mh = h - kh;
+ int h1 = mh - lrint((maxValue() - redScale) * mh / range);
+ int h2 = mh - lrint((maxValue() - yellowScale) * mh / range);
+
+ p.setPen(QPen(Qt::white, 2));
+ for (int i = 0; i < _channel; ++i) {
+ int h = mh - (lrint(fast_log10(meterval[i]) * -20.0f * mh / range));
+ if (h < 0)
+ h = 0;
+ else if (h > mh)
+ h = mh;
+ if (h > h1) {
+ p.fillRect(x, y3-h2, mw, h2, QBrush(0x00ff00)); // green
+ p.fillRect(x, y3-h1, mw, h1 - h2, QBrush(0xffff00)); // yellow
+ p.fillRect(x, y3-h, mw, h - h1, QBrush(0xff0000)); // red
+ p.fillRect(x, y1, mw, mh - h, QBrush(0x8e0000)); // dark red
+ }
+ else if (h > h2) {
+ p.fillRect(x, y3-h2, mw, h2, QBrush(0x00ff00)); // green
+ p.fillRect(x, y3-h, mw, h-h2, QBrush(0xffff00)); // yellow
+ p.fillRect(x, y3-h1, mw, h1-h, QBrush(0x8e8e00)); // dark yellow
+ p.fillRect(x, y1, mw, mh - h1, QBrush(0x8e0000)); // dark red
+ }
+ else {
+ p.fillRect(x, y3-h, mw, h, QBrush(0x00ff00)); // green
+ p.fillRect(x, y3-h2, mw, h2-h, QBrush(0x007000)); // dark green
+ p.fillRect(x, y3-h1, mw, h1-h2, QBrush(0x8e8e00)); // dark yellow
+ p.fillRect(x, y1, mw, mh - h1, QBrush(0x8e0000)); // dark red
+ }
+
+ //---------------------------------------------------
+ // draw peak line
+ //---------------------------------------------------
+
+ h = mh - (lrint(fast_log10(meterPeak[i]) * -20.0f * mh / range));
+ p.drawLine(x, y3-h, x+mw, y3-h);
+
+ x += mw;
+ }
+
+ //---------------------------------------------------
+ // draw scale
+ //---------------------------------------------------
+
+ p.fillRect(x, y1, _scaleWidth, y2-y1, sc);
+ p.fillRect(x, y2, _scaleWidth, y3-y2, svc);
+
+ //---------------------------------------------------
+ // draw tick marks
+ //---------------------------------------------------
+
+ QFont f(p.font());
+ f.setPointSize(6);
+ p.setFont(f);
+ p.setPen(QPen(Qt::darkGray, 2));
+ QFontMetrics fm(f);
+ int xt = 20 - fm.width("00") - 5;
+
+ QString s;
+ for (int i = 10; i < 70; i += 10) {
+ h = y1 + lrint(i * mh / range);
+ s.setNum(i - 10);
+ p.drawText(xt, h - 3, s);
+ p.drawLine(15, h, 20, h);
+ }
+
+ //---------------------------------------------------
+ // draw slider
+ //---------------------------------------------------
+
+ x += _scaleWidth/2;
+ p.setPen(QPen(svc, 0));
+ p.translate(QPointF(x, y2));
+ p.setRenderHint(QPainter::Antialiasing, true);
+ p.drawPath(*points);
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void MeterSlider::mousePressEvent(QMouseEvent* ev)
+ {
+ if (ev->pos().x() < _meterWidth) {
+ emit meterClicked();
+ return;
+ }
+ VolSlider::mousePressEvent(ev);
+ }
+}
+
diff --git a/muse/awl/mslider.h b/muse/awl/mslider.h
new file mode 100644
index 00000000..24e67889
--- /dev/null
+++ b/muse/awl/mslider.h
@@ -0,0 +1,66 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLMSLIDER_H__
+#define __AWLMSLIDER_H__
+
+#include "volslider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// MeterSlider
+// volume slider with meter display
+//---------------------------------------------------------
+
+class MeterSlider : public VolSlider
+ {
+ Q_PROPERTY(int meterWidth READ meterWidth WRITE setMeterWidth)
+ Q_PROPERTY(int channel READ channel WRITE setChannel)
+ Q_OBJECT
+
+ int _channel;
+ std::vector<float> meterval;
+ std::vector<float> meterPeak;
+ int yellowScale, redScale;
+ int _meterWidth;
+
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void paint(const QRect& r);
+
+ signals:
+ void meterClicked();
+
+ public slots:
+ void resetPeaks();
+ void setMeterVal(int channel, float value, float peak);
+
+ public:
+ MeterSlider(QWidget* parent = 0);
+ void setChannel(int n);
+ int channel() const { return _channel; }
+ int meterWidth() const { return _meterWidth; }
+ void setMeterWidth(int v) { _meterWidth = v; }
+ virtual QSize sizeHint() const;
+ };
+}
+
+#endif
+
diff --git a/muse/awl/panentry.cpp b/muse/awl/panentry.cpp
new file mode 100644
index 00000000..0cc098c2
--- /dev/null
+++ b/muse/awl/panentry.cpp
@@ -0,0 +1,35 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "panentry.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PanEntry
+//---------------------------------------------------------
+
+PanEntry::PanEntry(QWidget* parent)
+ : FloatEntry(parent)
+ {
+ setRange(-1.0, 1.0);
+ }
+}
+
diff --git a/muse/awl/panentry.h b/muse/awl/panentry.h
new file mode 100644
index 00000000..01689580
--- /dev/null
+++ b/muse/awl/panentry.h
@@ -0,0 +1,40 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLPANENTRY_H__
+#define __AWLPANENTRY_H__
+
+#include "floatentry.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PanEntry
+//---------------------------------------------------------
+
+class PanEntry : public FloatEntry {
+ Q_OBJECT
+
+ public:
+ PanEntry(QWidget*);
+ };
+}
+
+#endif
diff --git a/muse/awl/panknob.cpp b/muse/awl/panknob.cpp
new file mode 100644
index 00000000..083aa2e0
--- /dev/null
+++ b/muse/awl/panknob.cpp
@@ -0,0 +1,38 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "panknob.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PanKnob
+//---------------------------------------------------------
+
+PanKnob::PanKnob(QWidget* parent)
+ : Knob(parent)
+ {
+ setCenter(true);
+ setRange(-1.0f, 1.0f);
+ setLineStep(0.01f);
+ setPageStep(0.1f);
+ }
+}
+
diff --git a/muse/awl/panknob.h b/muse/awl/panknob.h
new file mode 100644
index 00000000..d8bf2d87
--- /dev/null
+++ b/muse/awl/panknob.h
@@ -0,0 +1,46 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLPANKNOB_H__
+#define __AWLPANKNOB_H__
+
+#include "knob.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PanKnob
+//! Pan Knob entry widget
+//
+//! This widget implements a centered floating point
+//! knob used to adjust the pan position in an audio
+//! mixer.
+//---------------------------------------------------------
+
+class PanKnob : public Knob {
+ Q_OBJECT
+
+ public:
+ PanKnob(QWidget* parent = 0);
+ };
+}
+
+#endif
+
diff --git a/muse/awl/pitchedit.cpp b/muse/awl/pitchedit.cpp
new file mode 100644
index 00000000..18136074
--- /dev/null
+++ b/muse/awl/pitchedit.cpp
@@ -0,0 +1,89 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "pitchedit.h"
+#include "utils.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PitchEdit
+//---------------------------------------------------------
+
+PitchEdit::PitchEdit(QWidget* parent)
+ : QSpinBox(parent)
+ {
+ setRange(0, 127);
+ deltaMode = false;
+ }
+
+//---------------------------------------------------------
+// keyPressEvent
+//---------------------------------------------------------
+
+void PitchEdit::keyPressEvent(QKeyEvent* ev)
+ {
+ if (ev->key() == Qt::Key_Return)
+ emit returnPressed();
+ else if (ev->key() == Qt::Key_Escape)
+ emit escapePressed();
+ }
+
+//---------------------------------------------------------
+// mapValueToText
+//---------------------------------------------------------
+
+QString PitchEdit::mapValueToText(int v)
+ {
+ if (deltaMode) {
+ QString s;
+ s.setNum(v);
+ return s;
+ }
+ else
+ return pitch2string(v);
+ }
+
+//---------------------------------------------------------
+// mapTextToValue
+//---------------------------------------------------------
+
+int PitchEdit::mapTextToValue(bool* ok)
+ {
+printf("AwlPitchEdit: mapTextToValue: not impl.\n");
+ if (ok)
+ *ok = false;
+ return 0;
+ }
+
+//---------------------------------------------------------
+// setDeltaMode
+//---------------------------------------------------------
+
+void PitchEdit::setDeltaMode(bool val)
+ {
+ deltaMode = val;
+ if (deltaMode)
+ setRange(-127, 127);
+ else
+ setRange(0, 127);
+ }
+}
+
diff --git a/muse/awl/pitchedit.h b/muse/awl/pitchedit.h
new file mode 100644
index 00000000..dd0ba4c7
--- /dev/null
+++ b/muse/awl/pitchedit.h
@@ -0,0 +1,50 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLPITCHEDIT_H__
+#define __AWLPITCHEDIT_H__
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PitchEdit
+//---------------------------------------------------------
+
+class PitchEdit : public QSpinBox {
+ Q_OBJECT
+
+ bool deltaMode;
+
+ protected:
+ virtual QString mapValueToText(int v);
+ virtual int mapTextToValue(bool* ok);
+ virtual void keyPressEvent(QKeyEvent*);
+
+ signals:
+ void returnPressed();
+ void escapePressed();
+
+ public:
+ PitchEdit(QWidget* parent);
+ void setDeltaMode(bool);
+ };
+}
+
+#endif
diff --git a/muse/awl/pitchlabel.cpp b/muse/awl/pitchlabel.cpp
new file mode 100644
index 00000000..1d7149f6
--- /dev/null
+++ b/muse/awl/pitchlabel.cpp
@@ -0,0 +1,106 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "pitchedit.h"
+#include "pitchlabel.h"
+#include "utils.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PitchLabel
+//---------------------------------------------------------
+
+PitchLabel::PitchLabel()
+ {
+ _pitchMode = true;
+ _value = -1;
+ setFrameStyle(WinPanel | Sunken);
+ setLineWidth(2);
+ setMidLineWidth(3);
+ setValue(0);
+ int fw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
+ setIndent(fw);
+ }
+
+//---------------------------------------------------------
+// setPitchMode
+//---------------------------------------------------------
+
+void PitchLabel::setPitchMode(bool val)
+ {
+ _pitchMode = val;
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize PitchLabel::sizeHint() const
+ {
+ QFontMetrics fm(font());
+ int fw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
+ int h = fm.height() + fw * 2;
+// int w = 2 + fm.width(QString("A#8")) + fw * 4;
+ int w = 2 + fm.width(QString("-9999")) + fw * 4; // must display 14Bit controller values
+ return QSize(w, h).expandedTo(QApplication::globalStrut());
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void PitchLabel::setValue(int val)
+ {
+ if (val == _value)
+ return;
+ _value = val;
+ QString s;
+ if (_pitchMode)
+ s = pitch2string(_value);
+ else
+ s.sprintf("%d", _value);
+ setText(s);
+ }
+
+//---------------------------------------------------------
+// setInt
+//---------------------------------------------------------
+
+void PitchLabel::setInt(int val)
+ {
+ if (_pitchMode)
+ setPitchMode(false);
+ setValue(val);
+ }
+
+//---------------------------------------------------------
+// setPitch
+//---------------------------------------------------------
+
+void PitchLabel::setPitch(int val)
+ {
+ if (!_pitchMode) {
+ setPitchMode(true);
+ }
+ setValue(val);
+ }
+}
+
diff --git a/muse/awl/pitchlabel.h b/muse/awl/pitchlabel.h
new file mode 100644
index 00000000..36a3cbfa
--- /dev/null
+++ b/muse/awl/pitchlabel.h
@@ -0,0 +1,51 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLPITCHLABEL_H__
+#define __AWLPITCHLABEL_H__
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PitchLabel
+//---------------------------------------------------------
+
+class PitchLabel : public QLabel {
+ bool _pitchMode;
+ int _value;
+ Q_OBJECT
+
+ protected:
+ QSize sizeHint() const;
+
+ public slots:
+ void setValue(int);
+ void setInt(int);
+ void setPitch(int);
+
+ public:
+ PitchLabel();
+ int value() const { return _value; }
+ void setPitchMode(bool val);
+ bool pitchMode() const { return _pitchMode; }
+ };
+}
+
+#endif
diff --git a/muse/awl/posedit.cpp b/muse/awl/posedit.cpp
new file mode 100644
index 00000000..4c195452
--- /dev/null
+++ b/muse/awl/posedit.cpp
@@ -0,0 +1,440 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al/al.h"
+#include "awl.h"
+#include "posedit.h"
+#include "al/sig.h"
+
+namespace Awl {
+
+ using AL::mtcType;
+ using AL::sigmap;
+
+//---------------------------------------------------------
+// PosEdit
+//---------------------------------------------------------
+
+PosEdit::PosEdit(QWidget* parent)
+ : QAbstractSpinBox(parent)
+ {
+ initialized = false;
+ setReadOnly(false);
+ setSmpte(false);
+ }
+
+void* PosEdit::operator new(size_t n)
+ {
+ void* p = new char[n];
+ memset(p, 0, n);
+ return p;
+ }
+
+PosEdit::~PosEdit()
+ {
+ }
+
+QSize PosEdit::sizeHint() const
+ {
+ QFontMetrics fm(font());
+ int fw = style()->pixelMetric(QStyle::PM_SpinBoxFrameWidth);
+ int h = fm.height() + fw * 2;
+ int w = fw * 4 + 10; // HACK: 10 = spinbox up/down arrows
+ if (_smpte)
+ w += 2 + fm.width('9') * 9 + fm.width(':') * 3 + fw * 4;
+ else
+ w += 2 + fm.width('9') * 9 + fm.width('.') * 2 + fw * 4;
+ return QSize(w, h).expandedTo(QApplication::globalStrut());
+ }
+
+//---------------------------------------------------------
+// event
+// filter Tab and Backtab key events
+//---------------------------------------------------------
+
+bool PosEdit::event(QEvent* event)
+ {
+ if (event->type() == QEvent::KeyPress) {
+ QKeyEvent* ke = static_cast<QKeyEvent*>(event);
+ int segment = curSegment();
+ if (ke->key() == Qt::Key_Backtab) {
+ if (_smpte) {
+ if (segment == 3) {
+ lineEdit()->setSelection(7, 2);
+ return true;
+ }
+ else if (segment == 2) {
+ lineEdit()->setSelection(4, 2);
+ return true;
+ }
+ else if (segment == 1) {
+ lineEdit()->setSelection(0, 3);
+ return true;
+ }
+ }
+ else {
+ if (segment == 2) {
+ lineEdit()->setSelection(5, 2);
+ return true;
+ }
+ if (segment == 1) {
+ lineEdit()->setSelection(0, 4);
+ return true;
+ }
+ }
+ }
+ if (ke->key() == Qt::Key_Tab) {
+ if (_smpte) {
+ if (segment == 0) {
+ lineEdit()->setSelection(4, 2);
+ return true;
+ }
+ else if (segment == 1) {
+ lineEdit()->setSelection(7, 2);
+ return true;
+ }
+ else if (segment == 2) {
+ lineEdit()->setSelection(10, 2);
+ return true;
+ }
+ }
+ else {
+ if (segment == 0) {
+ lineEdit()->setSelection(5, 2);
+ return true;
+ }
+ if (segment == 1) {
+ lineEdit()->setSelection(8, 3);
+ return true;
+ }
+ }
+ }
+ }
+ else if (event->type() == QEvent::FocusIn) {
+ QFocusEvent* fe = static_cast<QFocusEvent*>(event);
+ QAbstractSpinBox::focusInEvent(fe);
+ int segment = curSegment();
+ switch(segment) {
+ case 0: lineEdit()->setSelection(0,4); break;
+ case 1: lineEdit()->setSelection(5,2); break;
+ case 2: lineEdit()->setSelection(8,3); break;
+ }
+ return true;
+ }
+ return QAbstractSpinBox::event(event);
+ }
+
+//---------------------------------------------------------
+// setSmpte
+//---------------------------------------------------------
+
+void PosEdit::setSmpte(bool f)
+ {
+ _smpte = f;
+ if (_smpte)
+ lineEdit()->setInputMask("999:99:99:99");
+ else
+ lineEdit()->setInputMask("9999.99.999");
+ updateValue();
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void PosEdit::setValue(const Pos& time)
+ {
+ _pos = time;
+ updateValue();
+ }
+
+void PosEdit::setValue(const QString& s)
+ {
+ Pos time(s);
+ setValue(time);
+ }
+
+void PosEdit::setValue(int t)
+ {
+ Pos time(t);
+ setValue(time);
+ }
+
+//---------------------------------------------------------
+// updateValue
+//---------------------------------------------------------
+
+void PosEdit::updateValue()
+ {
+ char buffer[64];
+ if (_smpte) {
+ int minute, sec, frame, subframe;
+ _pos.msf(&minute, &sec, &frame, &subframe);
+ sprintf(buffer, "%03d:%02d:%02d:%02d", minute, sec, frame, subframe);
+ }
+ else {
+ int bar, beat;
+ int tick;
+ _pos.mbt(&bar, &beat, &tick);
+ sprintf(buffer, "%04d.%02d.%03d", bar+1, beat+1, tick);
+ }
+ lineEdit()->setText(buffer);
+ }
+
+//---------------------------------------------------------
+// stepEnables
+//---------------------------------------------------------
+
+QAbstractSpinBox::StepEnabled PosEdit::stepEnabled() const
+ {
+ int segment = curSegment();
+ QAbstractSpinBox::StepEnabled en = QAbstractSpinBox::StepUpEnabled | QAbstractSpinBox::StepDownEnabled;
+
+ if (_smpte) {
+ int minute, sec, frame, subframe;
+ _pos.msf(&minute, &sec, &frame, &subframe);
+ switch(segment) {
+ case 0:
+ if (minute == 0)
+ en &= ~QAbstractSpinBox::StepDownEnabled;
+ break;
+ case 1:
+ if (sec == 0)
+ en &= ~QAbstractSpinBox::StepDownEnabled;
+ else if (sec == 59)
+ en &= ~QAbstractSpinBox::StepUpEnabled;
+ break;
+ case 2:
+ if (frame == 0)
+ en &= ~QAbstractSpinBox::StepDownEnabled;
+ else if (frame == 23)
+ en &= ~QAbstractSpinBox::StepUpEnabled;
+ break;
+ case 3:
+ if (subframe == 0)
+ en &= ~QAbstractSpinBox::StepDownEnabled;
+ else if (subframe == 99)
+ en &= ~QAbstractSpinBox::StepUpEnabled;
+ break;
+ }
+ }
+ else {
+ int bar, beat;
+ unsigned tick;
+ AL::sigmap.tickValues(_pos.tick(), &bar, &beat, &tick);
+ unsigned tb = AL::sigmap.ticksBeat(_pos.tick());
+ unsigned tm = AL::sigmap.ticksMeasure(_pos.tick());
+ int bm = tm / tb;
+
+ switch (segment) {
+ case 0:
+ if (bar == 0)
+ en &= ~QAbstractSpinBox::StepDownEnabled;
+ break;
+ case 1:
+ if (beat == 0)
+ en &= ~QAbstractSpinBox::StepDownEnabled;
+ else {
+ if (beat >= (bm-1))
+ en &= ~QAbstractSpinBox::StepUpEnabled;
+ }
+ break;
+ case 2:
+ if (tick == 0)
+ en &= ~QAbstractSpinBox::StepDownEnabled;
+ else {
+ if (tick >= (tb-1))
+ en &= ~QAbstractSpinBox::StepUpEnabled;
+ }
+ break;
+ }
+ }
+ return en;
+ }
+
+//---------------------------------------------------------
+// fixup
+//---------------------------------------------------------
+
+void PosEdit::fixup(QString& input) const
+ {
+ printf("fixup <%s>\n", input.toLatin1().data());
+ }
+
+//---------------------------------------------------------
+// validate
+//---------------------------------------------------------
+
+QValidator::State PosEdit::validate(QString&,int&) const
+ {
+ printf("validate\n");
+ return QValidator::Acceptable;
+ }
+
+//---------------------------------------------------------
+// curSegment
+//---------------------------------------------------------
+
+int PosEdit::curSegment() const
+ {
+ QLineEdit* le = lineEdit();
+ int pos = le->cursorPosition();
+ int segment = -1;
+
+ if (_smpte) {
+ if (pos >= 0 && pos <= 3)
+ segment = 0;
+ else if (pos >= 4 && pos <= 6)
+ segment = 1;
+ else if (pos >= 7 && pos <= 9)
+ segment = 2;
+ else if (pos >= 10)
+ segment = 3;
+ }
+ else {
+ if (pos >= 0 && pos <= 4)
+ segment = 0;
+ else if (pos >= 5 && pos <= 7)
+ segment = 1;
+ else if (pos >= 8)
+ segment = 2;
+ else
+ printf("curSegment = -1, pos %d\n", pos);
+ }
+ return segment;
+ }
+
+//---------------------------------------------------------
+// stepBy
+//---------------------------------------------------------
+
+void PosEdit::stepBy(int steps)
+ {
+ int segment = curSegment();
+ int selPos;
+ int selLen;
+
+ bool changed = false;
+
+ if (_smpte) {
+ int minute, sec, frame, subframe;
+ _pos.msf(&minute, &sec, &frame, &subframe);
+ switch(segment) {
+ case 0:
+ minute += steps;
+ if (minute < 0)
+ minute = 0;
+ selPos = 0;
+ selLen = 3;
+ break;
+ case 1:
+ sec += steps;
+ if (sec < 0)
+ sec = 0;
+ if (sec > 59)
+ sec = 59;
+ selPos = 4;
+ selLen = 2;
+ break;
+ case 2:
+ frame += steps;
+ if (frame < 0)
+ frame = 0;
+ if (frame > 24) //TD frame type?
+ frame = 24;
+ selPos = 7;
+ selLen = 2;
+ break;
+ case 3:
+ subframe += steps;
+ if (subframe < 0)
+ subframe = 0;
+ if (subframe > 99)
+ subframe = 99;
+ selPos = 10;
+ selLen = 2;
+ break;
+ default:
+ return;
+ }
+ Pos newPos(minute, sec, frame, subframe);
+ if (!(newPos == _pos)) {
+ changed = true;
+ _pos = newPos;
+ }
+ }
+ else {
+ int bar, beat, tick;
+ _pos.mbt(&bar, &beat, &tick);
+
+ int tb = AL::sigmap.ticksBeat(_pos.tick());
+ unsigned tm = AL::sigmap.ticksMeasure(_pos.tick());
+ int bm = tm / tb;
+
+ switch(segment) {
+ case 0:
+ bar += steps;
+ if (bar < 0)
+ bar = 0;
+ selPos = 0;
+ selLen = 4;
+ break;
+ case 1:
+ beat += steps;
+ if (beat < 0)
+ beat = 0;
+ else if (beat >= bm)
+ beat = bm - 1;
+ selPos = 5;
+ selLen = 2;
+ break;
+ case 2:
+ tick += steps;
+ if (tick < 0)
+ tick = 0;
+ else if (tick >= tb)
+ tick = tb -1;
+ selPos = 8;
+ selLen = 3;
+ break;
+ default:
+ return;
+ }
+ Pos newPos(bar, beat, tick);
+ if (!(newPos == _pos)) {
+ changed = true;
+ _pos = newPos;
+ }
+ }
+ if (changed) {
+ updateValue();
+ emit valueChanged(_pos);
+ }
+ lineEdit()->setSelection(selPos, selLen);
+ }
+
+ void PosEdit::paintEvent(QPaintEvent* event) {
+ if (!initialized)
+ updateValue();
+ initialized = true;
+ QAbstractSpinBox::paintEvent(event);
+ }
+}
+
diff --git a/muse/awl/posedit.h b/muse/awl/posedit.h
new file mode 100644
index 00000000..effa0537
--- /dev/null
+++ b/muse/awl/posedit.h
@@ -0,0 +1,72 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __POSEDIT_H__
+#define __POSEDIT_H__
+
+#include "al/pos.h"
+
+namespace Awl {
+
+ using AL::Pos;
+
+//---------------------------------------------------------
+// PosEdit
+//---------------------------------------------------------
+
+class PosEdit : public QAbstractSpinBox
+ {
+ Q_OBJECT
+ Q_PROPERTY(bool smpte READ smpte WRITE setSmpte)
+
+ bool _smpte;
+ Pos _pos;
+ bool initialized;
+
+ virtual void paintEvent(QPaintEvent* event);
+ virtual void stepBy(int steps);
+ virtual StepEnabled stepEnabled() const;
+ virtual void fixup(QString& input) const;
+ virtual QValidator::State validate(QString&, int&) const;
+ void updateValue();
+ int curSegment() const;
+ virtual bool event(QEvent*);
+
+ signals:
+ void valueChanged(const Pos&);
+
+ public slots:
+ void setValue(const Pos& time);
+ void setValue(int t);
+ void setValue(const QString& s);
+
+ public:
+ PosEdit(QWidget* parent = 0);
+ ~PosEdit();
+ QSize sizeHint() const;
+
+ Pos pos() const { return _pos; }
+ void setSmpte(bool);
+ bool smpte() const { return _smpte; }
+ void* operator new(size_t);
+ };
+}
+
+#endif
diff --git a/muse/awl/poslabel.cpp b/muse/awl/poslabel.cpp
new file mode 100644
index 00000000..638508fd
--- /dev/null
+++ b/muse/awl/poslabel.cpp
@@ -0,0 +1,100 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "poslabel.h"
+#include "al/pos.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PosLabel
+//---------------------------------------------------------
+
+PosLabel::PosLabel(QWidget* parent)
+ : QLabel(parent)
+ {
+ _smpte = false;
+ setFrameStyle(WinPanel | Sunken);
+ setLineWidth(2);
+ setMidLineWidth(3);
+ int fw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
+ setIndent(fw);
+ updateValue();
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize PosLabel::sizeHint() const
+ {
+ QFontMetrics fm(font());
+ int fw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
+ int h = fm.height() + fw * 2;
+ int w;
+ if (_smpte)
+ w = 2 + fm.width('9') * 9 + fm.width(':') * 3 + fw * 4;
+ else
+ w = 2 + fm.width('9') * 9 + fm.width('.') * 2 + fw * 4;
+ return QSize(w, h).expandedTo(QApplication::globalStrut());
+ }
+
+//---------------------------------------------------------
+// updateValue
+//---------------------------------------------------------
+
+void PosLabel::updateValue()
+ {
+ QString s;
+ if (_smpte) {
+ int min, sec, frame, subframe;
+ pos.msf(&min, &sec, &frame, &subframe);
+ s.sprintf("%03d:%02d:%02d:%02d", min, sec, frame, subframe);
+ }
+ else {
+ int measure, beat, tick;
+ pos.mbt(&measure, &beat, &tick);
+ s.sprintf("%04d.%02d.%03u", measure+1, beat+1, tick);
+ }
+ setText(s);
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void PosLabel::setValue(const AL::Pos& val, bool enable)
+ {
+ setEnabled(enable);
+ pos = val;
+ updateValue();
+ }
+
+//---------------------------------------------------------
+// setSmpte
+//---------------------------------------------------------
+
+void PosLabel::setSmpte(bool val)
+ {
+ _smpte = val;
+ updateValue();
+ }
+}
+
diff --git a/muse/awl/poslabel.h b/muse/awl/poslabel.h
new file mode 100644
index 00000000..68139efe
--- /dev/null
+++ b/muse/awl/poslabel.h
@@ -0,0 +1,56 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLPOSLABEL_H__
+#define __AWLPOSLABEL_H__
+
+#include "al/pos.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// PosLabel
+//---------------------------------------------------------
+
+class PosLabel : public QLabel {
+ bool _smpte;
+ AL::Pos pos;
+ Q_OBJECT
+
+ void updateValue();
+
+ protected:
+ QSize sizeHint() const;
+
+ public slots:
+ void setValue(const AL::Pos&, bool);
+
+ public:
+ PosLabel(QWidget* parent = 0);
+ AL::Pos value() const { return pos; }
+
+ void setSmpte(bool);
+ bool smpte() const { return _smpte; }
+ };
+
+}
+
+#endif
+
diff --git a/muse/awl/sigedit.cpp b/muse/awl/sigedit.cpp
new file mode 100644
index 00000000..8ba16b54
--- /dev/null
+++ b/muse/awl/sigedit.cpp
@@ -0,0 +1,223 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al/al.h"
+#include "awl.h"
+#include "sigedit.h"
+#include "al/sig.h"
+
+namespace Awl {
+
+ using AL::sigmap;
+
+//---------------------------------------------------------
+// SigEdit
+//---------------------------------------------------------
+
+SigEdit::SigEdit(QWidget* parent)
+ : QAbstractSpinBox(parent)
+ {
+ initialized = false;
+ setReadOnly(false);
+ setMinimumWidth(100); //TD: sizeHint
+ lineEdit()->setInputMask("99/99");
+ }
+
+SigEdit::~SigEdit()
+ {
+ }
+
+//---------------------------------------------------------
+// event
+// filter Tab and Backtab key events
+//---------------------------------------------------------
+
+bool SigEdit::event(QEvent* event)
+ {
+ if (event->type() == QEvent::KeyPress) {
+ QKeyEvent* ke = static_cast<QKeyEvent*>(event);
+ int segment = curSegment();
+ if (ke->key() == Qt::Key_Backtab) {
+ if (segment == 2) {
+ lineEdit()->setSelection(5, 2);
+ return true;
+ }
+ if (segment == 1) {
+ lineEdit()->setSelection(0, 4);
+ return true;
+ }
+ }
+ if (ke->key() == Qt::Key_Tab) {
+ if (segment == 0) {
+ lineEdit()->setSelection(5, 2);
+ return true;
+ }
+ if (segment == 1) {
+ lineEdit()->setSelection(8, 3);
+ return true;
+ }
+ }
+ }
+ else if (event->type() == QEvent::FocusIn) {
+ QFocusEvent* fe = static_cast<QFocusEvent*>(event);
+ QAbstractSpinBox::focusInEvent(fe);
+ int segment = curSegment();
+ switch(segment) {
+ case 0: lineEdit()->setSelection(0,4); break;
+ case 1: lineEdit()->setSelection(5,2); break;
+ case 2: lineEdit()->setSelection(8,3); break;
+ }
+ return true;
+ }
+ return QAbstractSpinBox::event(event);
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void SigEdit::setValue(const AL::TimeSignature& s)
+ {
+ _sig = s;
+ updateValue();
+ }
+
+//---------------------------------------------------------
+// updateValue
+//---------------------------------------------------------
+
+void SigEdit::updateValue()
+ {
+ char buffer[64];
+ sprintf(buffer, "%d/%d", _sig.z, _sig.n);
+ lineEdit()->setText(buffer);
+ }
+
+//---------------------------------------------------------
+// stepEnables
+//---------------------------------------------------------
+
+QAbstractSpinBox::StepEnabled SigEdit::stepEnabled() const
+ {
+ int segment = curSegment();
+ QAbstractSpinBox::StepEnabled en = QAbstractSpinBox::StepUpEnabled | QAbstractSpinBox::StepDownEnabled;
+
+ switch (segment) {
+ case 0:
+ if (_sig.z == 1)
+ en &= ~QAbstractSpinBox::StepDownEnabled;
+ break;
+ case 1:
+ if (_sig.n == 1)
+ en &= ~QAbstractSpinBox::StepDownEnabled;
+ break;
+ }
+ return en;
+ }
+
+//---------------------------------------------------------
+// fixup
+//---------------------------------------------------------
+
+void SigEdit::fixup(QString& input) const
+ {
+ printf("fixup <%s>\n", input.toLatin1().data());
+ }
+
+//---------------------------------------------------------
+// validate
+//---------------------------------------------------------
+
+QValidator::State SigEdit::validate(QString&,int&) const
+ {
+ printf("validate\n");
+ return QValidator::Acceptable;
+ }
+
+//---------------------------------------------------------
+// curSegment
+//---------------------------------------------------------
+
+int SigEdit::curSegment() const
+ {
+ QLineEdit* le = lineEdit();
+ int pos = le->cursorPosition();
+ int segment = -1;
+
+ if (pos >= 0 && pos <= 4)
+ segment = 0;
+ else if (pos >= 5 && pos <= 7)
+ segment = 1;
+ else if (pos >= 8)
+ segment = 2;
+ else
+ printf("curSegment = -1, pos %d\n", pos);
+ return segment;
+ }
+
+//---------------------------------------------------------
+// stepBy
+//---------------------------------------------------------
+
+void SigEdit::stepBy(int steps)
+ {
+ int segment = curSegment();
+ int selPos;
+ int selLen;
+
+ bool changed = false;
+ AL::TimeSignature osig(_sig);
+
+ switch(segment) {
+ case 0:
+ _sig.z += steps;
+ if (_sig.z < 1)
+ _sig.z = 1;
+ selPos = 0;
+ selLen = 2;
+ break;
+ case 1:
+ _sig.n += steps;
+ if (_sig.n < 1)
+ _sig.n = 1;
+ selPos = 3;
+ selLen = 2;
+ break;
+ default:
+ return;
+ }
+ if (osig.z != _sig.z || osig.n != _sig.n) {
+ changed = true;
+ }
+ if (changed) {
+ updateValue();
+ emit valueChanged(_sig);
+ }
+ lineEdit()->setSelection(selPos, selLen);
+ }
+
+ void SigEdit::paintEvent(QPaintEvent* event) {
+ if (!initialized)
+ updateValue();
+ initialized = true;
+ QAbstractSpinBox::paintEvent(event);
+ }
+}
+
diff --git a/muse/awl/sigedit.h b/muse/awl/sigedit.h
new file mode 100644
index 00000000..35e762ca
--- /dev/null
+++ b/muse/awl/sigedit.h
@@ -0,0 +1,66 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __SIGEDIT_H__
+#define __SIGEDIT_H__
+
+#include "al/sig.h"
+
+namespace AL {
+ class TimeSignature;
+ };
+
+namespace Awl {
+
+//---------------------------------------------------------
+// SigEdit
+//---------------------------------------------------------
+
+class SigEdit : public QAbstractSpinBox
+ {
+ Q_OBJECT
+
+ AL::TimeSignature _sig;
+ bool initialized;
+
+ virtual void paintEvent(QPaintEvent* event);
+ virtual void stepBy(int steps);
+ virtual StepEnabled stepEnabled() const;
+ virtual void fixup(QString& input) const;
+ virtual QValidator::State validate(QString&, int&) const;
+ void updateValue();
+ int curSegment() const;
+ virtual bool event(QEvent*);
+
+ signals:
+ void valueChanged(const AL::TimeSignature&);
+
+ public slots:
+ void setValue(const AL::TimeSignature&);
+
+ public:
+ SigEdit(QWidget* parent = 0);
+ ~SigEdit();
+
+ AL::TimeSignature sig() const { return _sig; }
+ };
+}
+
+#endif
diff --git a/muse/awl/slider.cpp b/muse/awl/slider.cpp
new file mode 100644
index 00000000..421c2b99
--- /dev/null
+++ b/muse/awl/slider.cpp
@@ -0,0 +1,248 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "slider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// Slider
+//---------------------------------------------------------
+
+Slider::Slider(QWidget* parent)
+ : AbstractSlider(parent), orient(Qt::Vertical), _sliderSize(14,14)
+ {
+ init();
+ }
+
+//---------------------------------------------------------
+// Slider
+//---------------------------------------------------------
+
+Slider::Slider(Qt::Orientation orientation, QWidget* parent)
+ : AbstractSlider(parent), orient(orientation), _sliderSize(14,14)
+ {
+ init();
+ }
+
+//---------------------------------------------------------
+// Slider
+//---------------------------------------------------------
+
+void Slider::init()
+ {
+ if (orient == Qt::Vertical)
+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+ else
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ dragMode = false;
+ points = 0;
+ updateKnob();
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize Slider::sizeHint() const
+ {
+ int w = _sliderSize.width() + scaleWidth();
+ return orient == Qt::Vertical ? QSize(w, 200) : QSize(200, w);
+ }
+
+//---------------------------------------------------------
+// Slider
+//---------------------------------------------------------
+
+Slider::~Slider()
+ {
+ if (points)
+ delete points;
+ }
+
+//---------------------------------------------------------
+// setOrientation
+//---------------------------------------------------------
+
+void Slider::setOrientation(Qt::Orientation o)
+ {
+ orient = o;
+ updateKnob();
+ update();
+ }
+
+//---------------------------------------------------------
+// updateKnob
+//---------------------------------------------------------
+
+void Slider::updateKnob()
+ {
+ if (points)
+ delete points;
+ points = new QPainterPath;
+ int kh = _sliderSize.height();
+ int kw = _sliderSize.width();
+ points->moveTo(0.0, 0.0);
+ if (orient == Qt::Vertical) {
+ int kh = _sliderSize.height();
+ int kh2 = kh / 2;
+ points->lineTo(kw, -kh2);
+ points->lineTo(kw, kh2);
+ }
+ else {
+ int kw2 = kw/2;
+ points->lineTo(-kw2, kh);
+ points->lineTo(kw2, kh);
+ }
+ points->lineTo(0.0, 0.0);
+ }
+
+//---------------------------------------------------------
+// setInvertedAppearance
+//---------------------------------------------------------
+
+void Slider::setInvertedAppearance(bool val)
+ {
+ AbstractSlider::setInvertedAppearance(val);
+ update();
+ }
+
+//---------------------------------------------------------
+// setSliderSize
+//---------------------------------------------------------
+
+void Slider::setSliderSize(const QSize& s)
+ {
+ _sliderSize = s;
+ update();
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void Slider::mousePressEvent(QMouseEvent* ev)
+ {
+ startDrag = ev->pos();
+// if (points->boundingRect().toRect().contains(startDrag)) {
+ emit sliderPressed(_id);
+ dragMode = true;
+ int pixel = (orient == Qt::Vertical) ? height() - _sliderSize.height() : width() - _sliderSize.width();
+ dragppos = int(pixel * (_value - minValue()) / (maxValue() - minValue()));
+ if (_invert)
+ dragppos = pixel - dragppos;
+// }
+ }
+
+//---------------------------------------------------------
+// mouseReleaseEvent
+//---------------------------------------------------------
+
+void Slider::mouseReleaseEvent(QMouseEvent*)
+ {
+ if (dragMode) {
+ emit sliderReleased(_id);
+ dragMode = false;
+ }
+ }
+
+//---------------------------------------------------------
+// mouseMoveEvent
+//---------------------------------------------------------
+
+void Slider::mouseMoveEvent(QMouseEvent* ev)
+ {
+ if (!dragMode)
+ return;
+ int ppos;
+ if (orient == Qt::Vertical)
+ ppos = dragppos + (startDrag.y() - ev->y());
+ else
+ ppos = dragppos + (ev->x() - startDrag.x());
+ if (ppos < 0)
+ ppos = 0;
+ int pixel = (orient == Qt::Vertical) ? height() - _sliderSize.height() : width() - _sliderSize.width();
+ if (ppos > pixel)
+ ppos = pixel;
+ int pos = _invert ? (pixel - ppos) : ppos;
+ _value = (pos * (maxValue() - minValue()) / pixel) + minValue() - 0.000001;
+ update();
+ valueChange();
+ }
+
+//---------------------------------------------------------
+// paint
+// r - phys coord system
+//---------------------------------------------------------
+
+void Slider::paint(const QRect& r)
+ {
+ int h = height();
+ int w = width();
+ int kw = _sliderSize.width();
+ int kh = _sliderSize.height();
+ int pixel = (orient == Qt::Vertical) ? h - kh : w - kw;
+ double range = maxValue() - minValue();
+ int ppos = int(pixel * (_value - minValue()) / range);
+ if ((orient == Qt::Vertical && _invert) || (orient == Qt::Horizontal && !_invert))
+ ppos = pixel - ppos;
+
+ QRect rr(r);
+ QPainter p(this);
+
+ QColor sc(isEnabled() ? _scaleColor : Qt::gray);
+ QColor svc(isEnabled() ? _scaleValueColor : Qt::gray);
+ p.setBrush(svc);
+
+ int kh2 = kh/2;
+
+ //---------------------------------------------------
+ // draw scale
+ //---------------------------------------------------
+
+ if (orient == Qt::Vertical) {
+ int xm = (w - _scaleWidth - _sliderSize.height()) / 2;
+ int y1 = kh2;
+ int y2 = h - (ppos + y1);
+ int y3 = h - y1;
+ p.fillRect(xm, y1, _scaleWidth, y2-y1, _invert ? svc : sc);
+ p.fillRect(xm, y2, _scaleWidth, y3-y2, _invert ? sc : svc);
+ p.translate(QPointF(xm + _scaleWidth/2, y2));
+ }
+ else {
+ int ym = (h - _scaleWidth - _sliderSize.height()) / 2;
+ int x1 = kh2;
+ int x2 = w - (ppos + x1);
+ int x3 = w - x1;
+ p.fillRect(x1, ym, x2-x1, _scaleWidth, _invert ? sc : svc);
+ p.fillRect(x2, ym, x3-x2, _scaleWidth, _invert ? svc : sc);
+ p.translate(QPointF(x2, ym + _scaleWidth/2));
+ }
+
+ //---------------------------------------------------
+ // draw slider
+ //---------------------------------------------------
+
+ p.setRenderHint(QPainter::Antialiasing, true);
+ p.setPen(QPen(svc, 0));
+ p.drawPath(*points);
+ }
+}
+
diff --git a/muse/awl/slider.h b/muse/awl/slider.h
new file mode 100644
index 00000000..fdc67cc2
--- /dev/null
+++ b/muse/awl/slider.h
@@ -0,0 +1,80 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLSLIDER_H__
+#define __AWLSLIDER_H__
+
+#include "aslider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// Slider
+//
+//! Base class of all slider type input widgets.
+//
+//! Inherits from AwlKnob
+//!
+//---------------------------------------------------------
+
+class Slider : public AbstractSlider {
+ Q_OBJECT
+
+ Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation)
+ Q_PROPERTY(QSize sliderSize READ sliderSize WRITE setSliderSize)
+ Qt::Orientation orient;
+ QSize _sliderSize;
+
+ QPoint startDrag;
+ bool dragMode;
+ int dragppos;
+
+ virtual void mouseReleaseEvent(QMouseEvent*);
+ virtual void mouseMoveEvent(QMouseEvent*);
+ virtual void paint(const QRect& r);
+ void init();
+ void updateKnob();
+
+ protected:
+ QPainterPath* points;
+ virtual void mousePressEvent(QMouseEvent*);
+
+ signals:
+ void sliderPressed(int);
+ void sliderReleased(int);
+
+ public:
+ Slider(QWidget* parent = 0);
+ Slider(Qt::Orientation orientation, QWidget* parent = 0);
+ ~Slider();
+
+ virtual void setOrientation(Qt::Orientation);
+ Qt::Orientation orientation() const { return orient; }
+
+ QSize sliderSize() const { return _sliderSize; }
+ void setSliderSize(const QSize& s);
+
+ virtual void setInvertedAppearance(bool val);
+ virtual QSize sizeHint() const;
+ };
+}
+
+#endif
+
diff --git a/muse/awl/tcanvas.cpp b/muse/awl/tcanvas.cpp
new file mode 100644
index 00000000..0fe29e28
--- /dev/null
+++ b/muse/awl/tcanvas.cpp
@@ -0,0 +1,1799 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "tcanvas.h"
+#include "al/al.h"
+#include "al/sig.h"
+#include "al/tempo.h"
+#include "../muse/gconfig.h"
+#include "../muse/icons.h"
+
+#include "metronom.xpm"
+#include "clock.xpm"
+
+static QIcon* clockIcon;
+static QIcon* metronomIcon;
+
+FollowMode TimeCanvas::followMode = FOLLOW_JUMP;
+QPixmap* TimeCanvas::octave;
+QPixmap* TimeCanvas::mk1;
+QPixmap* TimeCanvas::mk2;
+QPixmap* TimeCanvas::mk3;
+QPixmap* TimeCanvas::mk4;
+
+enum DragType {
+ DRAG_RULER,
+ DRAG_CANVASA, DRAG_CANVAS_B,
+ DRAG_PANELA, DRAG_PANELB,
+ DRAG_OTHER
+ };
+
+//---------------------------------------------------------
+// TimeCanvas
+//---------------------------------------------------------
+
+TimeCanvas::TimeCanvas(TimeCanvasType t)
+ : QFrame()
+ {
+ _yFit = false;
+ _tool = PointerTool;
+ type = t;
+ marker = 0;
+ showCursor = false;
+ ctrlHeight = 0;
+ curPitch = -1;
+ mouseInB = false;
+ dragType = DRAG_OTHER;
+ followPos = true;
+
+ // set default color
+ canvasBackgroundColor = QColor(0x71, 0x8d, 0xbe);
+
+ if (clockIcon == 0) {
+ clockIcon = new QIcon(QPixmap(clock_xpm));
+ metronomIcon = new QIcon(QPixmap(metronom_xpm));
+ }
+ button = Qt::NoButton;
+ grid = new QGridLayout;
+ grid->setMargin(0);
+ grid->setSpacing(5);
+ setLayout(grid);
+
+ _widget = new QWidget;
+// _widget->setAttribute(Qt::WA_OpaquePaintEvent);
+ _widget->setAttribute(Qt::WA_NoSystemBackground);
+
+ // there are some performance problems with qt4.1, so
+ // we roll our own double buffering:
+
+ _widget->setAttribute(Qt::WA_PaintOnScreen);
+
+ _widget->setAttribute(Qt::WA_StaticContents);
+ _widget->installEventFilter(this);
+ _widget->setMouseTracking(true);
+ _widget->setAcceptDrops(true);
+
+ // allow to set slider position before slider range
+ // is known:
+
+ pos1.setTick(0);
+ pos2.setTick(MAXINT);
+
+ hmag = new QSlider(Qt::Horizontal);
+ hmag->setRange(0, 100);
+ _xmagMin = 0.001;
+ _xmagMax = 0.3;
+ _xmag = 0.04;
+ hmag->setValue(xmag2s(_xmag));
+
+ vmag = 0;
+ if (type != TIME_CANVAS_DRUMEDIT) {
+ vmag = new QSlider(Qt::Vertical);
+ vmag->setRange(0, 100);
+ vmag->setPageStep(1);
+ }
+ _ymag = 1.0;
+
+ hbar = new QScrollBar(Qt::Horizontal);
+ hbar->setRange(0, MAXINT);
+ vbar = new QScrollBar(Qt::Vertical);
+ timeTypeButton = new QToolButton;
+ timeTypeButton->setFixedSize(20, rulerHeight);
+ setTimeType1(AL::TICKS);
+ yRange = 0;
+
+ if (type == TIME_CANVAS_PIANOROLL) {
+ _ymagMin = 0.5;
+ _ymagMax = 3.0;
+ vmag->setValue(lrint((_ymag-_ymagMin)*100.0/(_ymagMax-_ymagMin)));
+ initPianoroll();
+ }
+ else if (type == TIME_CANVAS_DRUMEDIT) {
+ _ymagMin = 1.0;
+ _ymagMax = 1.0;
+ yRange = drumHeight * 128;
+ }
+ else if (type == TIME_CANVAS) {
+ _ymagMin = 1.0;
+ _ymagMax = 1.0;
+ }
+ updateGeometry();
+ if (type == TIME_CANVAS_PIANOROLL || type == TIME_CANVAS_DRUMEDIT) {
+ addCtrlButton = new QPushButton(tr("Ctrl"), _widget);
+ addCtrlButton->setGeometry(1, 1, rPanelA.width()-4, rulerHeight-4);
+ addCtrlButton->setToolTip(tr("Add Controller View"));
+ connect(addCtrlButton, SIGNAL(clicked()), SLOT(addCtrlClicked()));
+ }
+
+ grid->addWidget(_widget, 0, 0, 3, 2);
+ grid->addWidget(hbar, 3, 0);
+ grid->addWidget(hmag, 3, 1);
+ grid->addWidget(timeTypeButton, 0, 2);
+ grid->addWidget(vbar, 1, 2);
+ if (vmag)
+ grid->addWidget(vmag, 2, 2);
+
+ grid->setColumnStretch(0, 100);
+ grid->setRowStretch(1, 100);
+
+ _raster = 0;
+ updateScrollBars();
+ connect(hbar, SIGNAL(sliderMoved(int)), SLOT(moveX(int)));
+ connect(vbar, SIGNAL(valueChanged(int)), SLOT(moveY(int)));
+ connect(hmag, SIGNAL(valueChanged(int)), SLOT(scaleX(int)));
+ if (vmag)
+ connect(vmag, SIGNAL(valueChanged(int)), SLOT(scaleY(int)));
+ connect(timeTypeButton, SIGNAL(clicked()), SLOT(toggleTimeType()));
+ }
+
+//---------------------------------------------------------
+// resizeController
+//---------------------------------------------------------
+
+void TimeCanvas::resizeController(int h)
+ {
+ if (h == ctrlHeight)
+ return;
+ int updateH = h > ctrlHeight ? h : ctrlHeight;
+ ctrlHeight = h;
+ updateGeometry();
+ updateScrollBars();
+ widget()->update(0, widget()->height() - updateH, widget()->width(), updateH);
+ }
+
+//---------------------------------------------------------
+// eventFilter
+//---------------------------------------------------------
+
+bool TimeCanvas::eventFilter(QObject* obj, QEvent* event)
+ {
+ if (obj != _widget)
+ return QFrame::eventFilter(obj, event);
+
+ switch(event->type()) {
+ case QEvent::Paint:
+ {
+ QRect r(((QPaintEvent*)event)->rect());
+
+// if (r == _widget->geometry())
+// printf("full paint event\n");
+
+ QPixmap pm(_widget->width(), _widget->height());
+ QPainter p;
+ p.begin(&pm);
+ canvasPaintEvent(r, p);
+ p.end();
+ p.begin(_widget);
+ p.drawPixmap(r.topLeft(), pm, r);
+ p.end();
+ }
+ return true;
+
+ case QEvent::Resize:
+ updateGeometry();
+ updateScrollBars();
+ layout();
+ return false;
+
+ case QEvent::MouseButtonDblClick:
+ {
+ QMouseEvent* me = (QMouseEvent*)event;
+ QPoint p(me->pos());
+ button = me->button();
+ keyState = me->modifiers();
+ mouseDoubleClick(me);
+ }
+ return true;
+
+ case QEvent::MouseButtonPress:
+ {
+ QMouseEvent* me = (QMouseEvent*)event;
+ keyState = me->modifiers();
+ button = me->button();
+ QPoint p(me->pos());
+ int x = p.x() - rRuler.x();
+ bool shift = keyState & Qt::ShiftModifier;
+
+ if (rRuler.contains(p)) {
+ dragType = DRAG_RULER;
+ if (shift) {
+ AL::Pos pos(pix2pos(x));
+ if (button == Qt::LeftButton)
+ emit addMarker(pos);
+ else if (button == Qt::RightButton)
+ emit removeMarker(pos);
+ return true;
+ }
+ }
+ else {
+ dragType = DRAG_OTHER;
+ mousePress(me);
+ }
+ }
+ // go on with MouseMove
+
+ case QEvent::MouseMove:
+ {
+ QMouseEvent* me = (QMouseEvent*)event;
+ keyState = me->modifiers();
+ button = me->buttons();
+ QPoint p(me->pos());
+ AL::Pos pos(pix2pos(p.x()-rCanvasA.x()));
+
+ if (dragType == DRAG_OTHER) {
+ if (button == 0 && (rPanelB.contains(p) || rCanvasB.contains(p))) {
+ if (!mouseInB) {
+ mouseInB = true;
+ enterB();
+ }
+ }
+ else {
+ if (button == 0 && mouseInB) {
+ mouseInB = false;
+ leaveB();
+ }
+ }
+
+ if (showCursor && p.x() < rCanvasA.x()) {
+ showCursor = false;
+ widget()->update(rRuler);
+ emit cursorPos(cursor, showCursor);
+ }
+
+ if (p.x() >= rCanvasA.x() && (cursor != pos)) {
+ int x1 = pos2pix(cursor) + rCanvasA.x();
+ int x2 = pos2pix(pos) + rCanvasA.x();
+ QRect r1(x1-1, 0, 2, rRuler.height());
+ QRect r2(x2-1, 0, 2, rRuler.height());
+ widget()->update(rRuler & (r1 | r2));
+ cursor = pos;
+ showCursor = true;
+ emit cursorPos(cursor, showCursor);
+ }
+
+ if (rRuler.contains(p)) {
+ int b = me->buttons();
+ if (b == 0)
+ return true;
+ int i = 0;
+ if (b & Qt::MidButton)
+ i = 1;
+ else if (b & Qt::RightButton)
+ i = 2;
+ if (keyState & Qt::ShiftModifier)
+ emit addMarker(i);
+ emit posChanged(i, pos);
+ }
+ else {
+ mouseMove(p);
+ }
+ }
+ else if (dragType == DRAG_RULER) {
+ int b = me->buttons();
+ if (b == 0)
+ return true;
+ int i = 0;
+ if (b & Qt::MidButton)
+ i = 1;
+ else if (b & Qt::RightButton)
+ i = 2;
+ if (keyState & Qt::ShiftModifier)
+ emit addMarker(i);
+ emit posChanged(i, pos);
+ }
+ }
+ return true;
+
+ case QEvent::MouseButtonRelease:
+ {
+ QMouseEvent* me = (QMouseEvent*)event;
+ button = Qt::NoButton;
+ keyState = me->modifiers();
+ mouseRelease(me);
+ dragType = DRAG_OTHER;
+ }
+ return true;
+
+ case QEvent::DragEnter:
+ dragEnter((QDragEnterEvent*)event);
+ return true;
+
+ case QEvent::Drop:
+ drop((QDropEvent*)event);
+ return true;
+
+ case QEvent::DragMove:
+ dragMove((QDragMoveEvent*)event);
+ return true;
+
+ case QEvent::DragLeave:
+ dragLeave((QDragLeaveEvent*)event);
+ return true;
+
+ case QEvent::Leave:
+ {
+ emit cursorPos(cursor, false);
+ showCursor = false;
+ emit pitchChanged(-1);
+ curPitch = -1;
+ QRect r(rRuler);
+ if (!rPanelA.isEmpty())
+ r |= rPanelA;
+ widget()->update(r);
+
+ if (mouseInB) {
+ mouseInB = false;
+ // button = ((QMouseEvent*)event)->buttons();
+ leaveB();
+ }
+ }
+ return false;
+
+ case QEvent::Wheel:
+ {
+ QWheelEvent* e = (QWheelEvent*)event;
+ if (e->orientation() != Qt::Vertical)
+ return true;
+ int step = qMin(QApplication::wheelScrollLines() * vbar->singleStep(), vbar->pageStep());
+ if ((e->modifiers() & Qt::ControlModifier) || (e->modifiers() & Qt::ShiftModifier))
+ step = vbar->pageStep();
+ int offset = e->delta() * step / 120;
+ if (vbar->invertedControls())
+ offset = -offset;
+ if (qAbs(offset) < 1)
+ return true;
+ vbar->setValue(vbar->value() + offset);
+ }
+ return true;
+
+
+ default:
+// printf("event %d missed\n", event->type());
+ break;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// moveX
+//---------------------------------------------------------
+
+void TimeCanvas::moveX(int x)
+ {
+ int dx = wpos.x() - x;
+ wpos.setX(x);
+
+ int wh = _widget->height();
+
+ if (type == TIME_CANVAS_PIANOROLL || type == TIME_CANVAS_DRUMEDIT) {
+ _widget->scroll(dx, 0, QRect(rCanvasA.x(), 0, rCanvasA.width(), wh));
+
+ //HACK:
+ // update controller names
+ int w = 100 + ((dx > 0) ? dx : 0);
+ _widget->update(rCanvasB.x(), rCanvasB.y(), w, rCanvasB.height());
+
+ //HACK:
+ // repaint rounded line end (splitter handle for controller
+ // canvas)
+ int x = rCanvasB.x() + rCanvasB.width() - 1;
+ w = 1;
+ if (dx < 0) {
+ x += dx;
+ w -= dx;
+ }
+ _widget->update(x, rCanvasB.y(), w, rCanvasB.height());
+ }
+ else
+ _widget->scroll(dx, 0);
+ emit contentsMoving(wpos.x(), wpos.y());
+ }
+
+//---------------------------------------------------------
+// moveY
+//---------------------------------------------------------
+
+void TimeCanvas::moveY(int y)
+ {
+ int dy = wpos.y() - y;
+ if (dy == 0)
+ return;
+ wpos.setY(y);
+
+ // dont move ruler:
+
+ int ww = _widget->width();
+ int wh = _widget->height();
+
+ QRect r(0, rulerHeight, ww, wh - rulerHeight - ctrlHeight);
+
+ _widget->scroll(0, dy, r);
+ emit contentsMoving(wpos.x(), wpos.y());
+ }
+
+//---------------------------------------------------------
+// setYPos
+//---------------------------------------------------------
+
+void TimeCanvas::setYPos(int y)
+ {
+ setWPos(QPoint(wpos.x(), y));
+ }
+
+//---------------------------------------------------------
+// setWPos
+//---------------------------------------------------------
+
+void TimeCanvas::setWPos(const QPoint& p)
+ {
+ if (wpos != p) {
+ wpos = p;
+ hbar->setValue(wpos.x());
+ vbar->setValue(wpos.y());
+ _widget->update();
+// QCoreApplication::flush();
+ }
+ }
+
+//---------------------------------------------------------
+// paintClockRuler
+//---------------------------------------------------------
+
+void TimeCanvas::paintClockRuler(QPainter& p, const QRect& r)
+ {
+ int x1 = r.x();
+ int x2 = x1 + r.width();
+
+ int y1 = r.y();
+ int rh = r.height();
+ if (y1 < rulerHeight) {
+ rh -= rulerHeight - y1;
+ y1 = rulerHeight;
+ }
+ int y2 = y1 + rh;
+
+ //---------------------------------------------------
+ // draw Marker
+ //---------------------------------------------------
+
+ int y = rulerHeight - 16;
+ p.setPen(Qt::black);
+ p.setFont(*config.fonts[4]);
+ QRect tr(r);
+ tr.setHeight(12);
+
+ if (marker) {
+ for (AL::iMarker m = marker->begin(); m != marker->end(); ++m) {
+ int xp = mapx(int(m->second.frame()));
+ if (xp > x2)
+ break;
+ AL::iMarker mm = m;
+ ++mm;
+ int xe = x2;
+ if (mm != marker->end()) {
+ xe = mapx(mm->first);
+ }
+ QRect tr(xp, 0, x2 - xp, 11);
+ if (m->second.current()) {
+ p.fillRect(tr, Qt::white);
+ }
+ if (r.intersects(tr)) {
+ int x2;
+ AL::iMarker mm = m;
+ ++mm;
+ if (mm != marker->end())
+ x2 = mapx(mm->first);
+ else
+ x2 = xp+200;
+ QRect r = QRect(xp+10, 0, x2-xp, 12);
+ p.drawPixmap(xp, 0, *flagIconS);
+ p.drawText(r, Qt::AlignLeft|Qt::AlignVCenter, m->second.name());
+ }
+ }
+ }
+
+ p.setPen(Qt::black);
+ if (showCursor) {
+ int xp = pos2pix(cursor);
+ if (xp >= x1 && xp < x2)
+ p.drawLine(xp, 0, xp, rulerHeight);
+ }
+
+ AL::Pos p1(pix2pos(x1));
+ AL::Pos p2(pix2pos(x2));
+
+ int sec1 = p1.frame() / AL::sampleRate;
+ int sec2 = (p2.frame() + AL::sampleRate - 1) / AL::sampleRate;
+
+ int sw = lrint(AL::sampleRate * _xmag);
+
+ if (sw > 20) {
+ for (int sec = sec1; sec < sec2; ++sec) {
+ int min = sec / 60;
+ int sr = sec % 60;
+
+ int yy;
+ QString s;
+ if (sr == 0) {
+ p.setFont(*config.fonts[3]);
+ s.sprintf("%d:00", min);
+ yy = y;
+ }
+ else {
+ p.setFont(*config.fonts[1]);
+ s.sprintf("%02d", sr);
+ yy = y + 7;
+ }
+ int xp = pos2pix(AL::Pos(sec * AL::sampleRate, AL::FRAMES));
+// printf(" sec %d min %d sr %d xp %d\n", sec, min, sr, xp);
+ p.setPen(Qt::black);
+ p.drawLine(xp, yy, xp, rulerHeight);
+ p.drawText(xp + 2, rulerHeight - 4, s);
+ p.setPen(sr == 0 ? Qt::lightGray : Qt::gray);
+ p.drawLine(xp, y1, xp, y2);
+ }
+ }
+ else {
+ int min1 = sec1/60;
+ int min2 = (sec2+59)/60;
+ for (int min = min1; min < min2; ++min) {
+ QString s;
+ p.setFont(*config.fonts[3]);
+ s.sprintf("%d", min);
+ int xp = pos2pix(AL::Pos(min * AL::sampleRate * 60, AL::FRAMES));
+ p.setPen(Qt::black);
+ p.drawLine(xp, y, xp, rulerHeight);
+ p.drawText(xp + 2, rulerHeight - 4, s);
+ p.setPen(Qt::lightGray);
+ p.drawLine(xp, y1, xp, y2);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// updateRulerMag
+//---------------------------------------------------------
+
+void TimeCanvas::updateRulerMag()
+ {
+ int bar1, beat, tick;
+ pos1.mbt(&bar1, &beat, &tick);
+ AL::Pos stick(bar1, 0, 0);
+ AL::Pos ntick = AL::Pos(bar1 + 1, 0, 0);
+ int tpix = pos2pix(ntick) - pos2pix(stick);
+ metronomeRulerMag = 0;
+ if (tpix < 64)
+ metronomeRulerMag = 1;
+ if (tpix < 32)
+ metronomeRulerMag = 2;
+ if (tpix <= 16)
+ metronomeRulerMag = 3;
+ if (tpix < 8)
+ metronomeRulerMag = 4;
+ if (tpix <= 4)
+ metronomeRulerMag = 5;
+ if (tpix <= 2)
+ metronomeRulerMag = 6;
+ }
+
+//---------------------------------------------------------
+// paintMetronomRuler
+//---------------------------------------------------------
+
+void TimeCanvas::paintMetronomRuler(QPainter& p, const QRect& r)
+ {
+ static const int mag[7] = {
+ 1, 1, 2, 5, 10, 20, 50
+ };
+
+ int x = r.x();
+ int w = r.width();
+ int y = rulerHeight - 16;
+
+ p.setFont(*config.fonts[4]);
+
+ int h = 14;
+ int y1 = r.y();
+ int rh = r.height();
+ if (y1 < rulerHeight) {
+ rh -= rulerHeight - y1;
+ y1 = rulerHeight;
+ }
+ int y2 = y1 + rh;
+
+ if (x < (MAP_OFFSET - wpos.x()))
+ x = MAP_OFFSET - wpos.x();
+// AL::Pos pos1 = pix2pos(x - flagIconS->width());
+ AL::Pos pos1 = pix2pos(x);
+ AL::Pos pos2 = pix2pos(x+w);
+
+ if (marker) {
+ AL::iMarker start = marker->lower_bound(pos1.tick());
+ if (start != marker->begin())
+ --start;
+ AL::iMarker end = marker->lower_bound(pos2.tick());
+ for (AL::iMarker m = start; m != end; ++m) {
+ AL::Pos pm1(m->second);
+ AL::iMarker m2 = m;
+ ++m2;
+ AL::Pos pm2(pos2);
+ if (m2 != marker->end())
+ pm2 = m2->second;
+
+ int x1 = pos2pix(pm1);
+ int x2 = pos2pix(pm2);
+
+ if (pos[0] >= pm1 && (m2 == marker->end() || pos[0] < pm2))
+ p.fillRect(x1, 0, x2 - x1, 11, Qt::white);
+
+ QRect r = QRect(x1 + 10, 0, x2 - x1, 12);
+ p.drawPixmap(x1, 0, *flagIconS);
+ p.drawText(r, Qt::AlignLeft|Qt::AlignVCenter, m->second.name());
+ }
+ }
+
+ //---------------------------------------------------
+ // draw raster
+ //---------------------------------------------------
+
+ int bar1, bar2, beat, tick;
+ pos1.mbt(&bar1, &beat, &tick);
+ pos2.mbt(&bar2, &beat, &tick);
+
+ int n = mag[metronomeRulerMag];
+ bar1 = (bar1 / n) * n; // round down
+ if (bar1 && n >= 2)
+ bar1 -= 1;
+ bar2 = ((bar2 + n - 1) / n) * n - 1; // round up
+
+ for (int bar = bar1; bar <= bar2;) {
+ AL::Pos stick(bar, 0, 0);
+ if (metronomeRulerMag) {
+ p.setFont(*config.fonts[3]);
+ int x = pos2pix(stick);
+ QString s;
+ s.setNum(bar + 1);
+
+ p.setPen(Qt::black);
+ p.drawLine(x, y, x, y + h);
+ QRect r = QRect(x+2, y, 1000, h);
+ p.drawText(r, Qt::AlignLeft | Qt::AlignVCenter, s);
+ p.setPen(Qt::lightGray);
+ p.drawLine(x, y1, x, y2);
+ }
+ else {
+ AL::TimeSignature sig = stick.timesig();
+ int z = sig.z;
+ for (int beat = 0; beat < z; beat++) {
+ AL::Pos xx(bar, beat, 0);
+ int xp = pos2pix(xx);
+ if (xp < 0)
+ continue;
+ QString s;
+ QRect r(xp+2, y, 1000, h);
+ int y3;
+ int num;
+ if (beat == 0) {
+ num = bar + 1;
+ y3 = y + 2;
+ p.setFont(*config.fonts[3]);
+ }
+ else {
+ num = beat + 1;
+ y3 = y + 8;
+ p.setFont(*config.fonts[1]);
+ r.setY(y+3);
+ }
+ s.setNum(num);
+ p.setPen(Qt::black);
+ p.drawLine(xp, y3, xp, y+h);
+ p.drawText(r, Qt::AlignLeft | Qt::AlignVCenter, s);
+ p.setPen(beat == 0 ? Qt::lightGray : Qt::gray);
+ p.drawLine(xp, y1, xp, y2);
+ }
+ }
+ if (bar == 0 && n >= 2)
+ bar += (n-1);
+ else
+ bar += n;
+ }
+ //
+ // draw mouse cursor marker
+ //
+ p.setPen(Qt::black);
+ if (showCursor) {
+ int xp = pos2pix(cursor);
+ if (xp >= x && xp < x+w)
+ p.drawLine(xp, 0, xp, rulerHeight-1);
+ }
+
+ }
+
+//---------------------------------------------------------
+// tempoChanged
+//---------------------------------------------------------
+
+void TimeCanvas::tempoChanged()
+ {
+ widget()->update(rCanvasA.x(), 0, rCanvasA.width(), widget()->height());
+ }
+
+//---------------------------------------------------------
+// canvasPaintEvent
+//---------------------------------------------------------
+
+void TimeCanvas::canvasPaintEvent(const QRect& r, QPainter& p)
+ {
+ if (r.intersects(rButton)) {
+ p.fillRect(rButton, QColor(0xe0, 0xe0, 0xe0));
+ p.setPen(QPen(Qt::black, 2));
+ int y = rButton.y() + rButton.height() - 1;
+ p.drawLine(rButton.x(), y, rButton.width(), y);
+ }
+ p.setRenderHint(QPainter::TextAntialiasing, true);
+ p.setRenderHint(QPainter::SmoothPixmapTransform, true);
+
+ QRect par = r & rPanelA;
+ if (!(par.isEmpty() || rPanelA.isEmpty())) {
+ p.setClipRect(par);
+ if (type == TIME_CANVAS_DRUMEDIT) {
+ paintDrumList(p, par);
+ }
+ else if (type == TIME_CANVAS_PIANOROLL) {
+ paintPiano(p, par);
+ }
+ }
+
+ QRect pbr(r & rPanelB);
+ QRect hor(r & (rRuler | rCanvasA | rCanvasB));
+ QRect car(r & rCanvasA);
+ QRect cbr(r & rCanvasB);
+
+ bool drawPanelB = !(pbr.isEmpty() || rPanelB.isEmpty());
+ bool drawRuler = !(hor.isEmpty() || (rRuler.isEmpty() && rCanvasA.isEmpty() && rCanvasB.isEmpty()));
+ bool drawCanvasA = !(car.isEmpty() || rCanvasA.isEmpty());
+ bool drawCanvasB = !(cbr.isEmpty() || rCanvasB.isEmpty());
+
+ p.setClipRect(r);
+
+ //
+ // draw canvas background
+ //
+ p.setBrushOrigin(QPoint(car.x() + wpos.x(), car.y() + wpos.y()));
+ if (drawCanvasA) {
+ if (canvasBackgroundPixmap.isNull()) {
+ if (type == TIME_CANVAS_DRUMEDIT || type == TIME_CANVAS_PIANOROLL) {
+ QRect rr(car);
+ // paint inactive area different
+ // (darker)
+ QColor c = canvasBackgroundColor.dark();
+ int x1 = pos2pix(partPos1) + rCanvasA.x();
+ int x2 = pos2pix(partPos2) + rCanvasA.x();
+ if (rr.x() < x1) {
+ QRect r(rr.x(), rr.y(), x1-rr.x(), rr.height());
+ p.fillRect(r, c);
+ rr.adjust(x1-rr.x(), 0, 0, 0);
+ }
+ int xx2 = rr.x() + rr.width();
+ if (xx2 > x2) {
+ QRect r(x2, rr.y(), xx2-x2, rr.height());
+ p.fillRect(r, c);
+ rr.adjust(0, 0, -(xx2-x2), 0);
+ }
+ if (!rr.isEmpty()) {
+ p.fillRect(rr, canvasBackgroundColor);
+ }
+ }
+ else
+ p.fillRect(car, canvasBackgroundColor);
+ }
+ else {
+ p.drawTiledPixmap(car, canvasBackgroundPixmap,
+ car.topLeft() + QPoint(wpos));
+ }
+ }
+ if (drawCanvasB)
+ p.fillRect(cbr, canvasBackgroundColor);
+
+ //---------------------------------------------------
+ // draw Ruler
+ //---------------------------------------------------
+
+ if (drawRuler) {
+ QRect rrr(r & rRuler);
+ if (!rrr.isEmpty())
+ p.fillRect(rrr, QColor(0xe0, 0xe0, 0xe0));
+ int x1 = hor.x();
+ int x2 = x1 + hor.width();
+ int y1 = rulerHeight - 17;
+ int y2 = rulerHeight - 1;
+
+ p.setPen(QPen(Qt::black, 1));
+ p.drawLine(x1, y1, x2, y1);
+ p.setPen(QPen(Qt::black, 2));
+ p.drawLine(x1, y2, x2, y2);
+
+ QPoint off(rRuler.topLeft());
+ p.translate(off);
+ if (_timeType == AL::TICKS)
+ paintMetronomRuler(p, hor.translated(-off));
+ else
+ paintClockRuler(p, hor.translated(-off));
+ p.translate(-off);
+ }
+
+ if (drawCanvasA) {
+ p.setClipRect(car);
+ paintCanvas(p, car);
+ }
+ p.setRenderHint(QPainter::Antialiasing, false);
+ if (drawPanelB) {
+ p.setClipRect(pbr);
+ QPoint off(rPanelB.topLeft());
+ p.translate(off);
+ paintControllerPanel(p, pbr.translated(-off));
+ p.translate(-off);
+ }
+ if (drawCanvasB) {
+ p.setClipRect(cbr);
+ QPoint off(rCanvasB.topLeft());
+ p.translate(off);
+ paintControllerCanvas(p, cbr.translated(-off));
+ p.translate(-off);
+ }
+
+ //---------------------------------------------------
+ // draw marker
+ //---------------------------------------------------
+
+ int y1 = r.y();
+ int y2 = y1 + r.height();
+ if (marker) {
+ int yy1 = y1;
+ if (yy1 < rCanvasA.x())
+ yy1 = rCanvasA.x();
+ p.setPen(Qt::green);
+ AL::iMarker start = marker->lower_bound(pos1.tick());
+ if (start != marker->begin())
+ --start;
+ AL::iMarker end = marker->lower_bound(pos2.tick());
+ for (AL::iMarker m = start; m != end; ++m) {
+ AL::Pos pm(m->second);
+ int x = pos2pix(pm) + rRuler.x();
+ p.drawLine(x, yy1, x, y2);
+ }
+ }
+ if (!drawRuler)
+ return;
+
+ p.setClipRect(hor);
+ int w = r.width();
+ int x = r.x();
+ int y = rulerHeight - 16;
+ QColor lcColors[3] = { Qt::red, Qt::blue, Qt::blue };
+
+ for (int i = 0; i < 3; ++i) {
+ p.setPen(lcColors[i]);
+ int xp = pos2pix(pos[i]) + rRuler.x();
+ QPixmap* pm = markIcon[i];
+ int pw = (pm->width() + 1) / 2;
+ int x1 = x - pw;
+ int x2 = x + w + pw;
+ if (xp >= x1 && xp < x2) {
+ p.drawPixmap(xp - pw, y-2, *pm);
+ p.drawLine(xp, y1, xp, y2);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// paintCanvas
+//---------------------------------------------------------
+
+void TimeCanvas::paintCanvas(QPainter& p, const QRect& cr)
+ {
+ QPoint off(rCanvasA.topLeft());
+
+ if (type == TIME_CANVAS_PIANOROLL) {
+ paintPianorollHorizontalGrid(p, cr);
+ p.setRenderHint(QPainter::Antialiasing, true);
+ }
+ else if (type == TIME_CANVAS_DRUMEDIT) {
+ paintDrumeditHorizontalGrid(p, cr);
+ p.setRenderHint(QPainter::Antialiasing, true);
+ }
+ else
+ off = QPoint(rCanvasA.x(), rCanvasA.y() - wpos.y());
+ p.translate(off);
+ paint(p, cr.translated(-off));
+ p.resetMatrix();
+ }
+
+//---------------------------------------------------------
+// setLocatorPos
+//---------------------------------------------------------
+
+void TimeCanvas::setLocatorPos(int idx, const AL::Pos& val, bool follow)
+ {
+ if (pos[idx] == val)
+ return;
+ QFontMetrics fm(*config.fonts[3]);
+ int fw = fm.width("123") + 2;
+ int w = qMax(markIcon[idx]->width() + 2, fw);
+ int h = widget()->height();
+
+ int x = pos2pix(val);
+ if (idx == 0 && follow && followPos && followMode != FOLLOW_NO) {
+ int scroll = 0;
+ if (followMode == FOLLOW_JUMP) {
+ int x2 = rRuler.width() - 20;
+ if (x2 < 0)
+ x2 = rRuler.width();
+ if (x > x2) {
+ int x1 = 20;
+ if (x1 >= rRuler.width())
+ x1 = 0;
+ scroll = x - x1;
+ }
+ else if (x < 0) {
+ scroll = x - MAP_OFFSET;
+ }
+ }
+ else if (followMode == FOLLOW_CONTINUOUS) {
+ int x1 = rRuler.width() / 2;
+ if (x != x1) {
+ scroll = x - (rRuler.width() / 2);
+ }
+ }
+ if (scroll) {
+ moveX(wpos.x() + scroll);
+ hbar->setValue(wpos.x());
+ }
+ }
+
+ int offset = rRuler.x() - (w/2);
+ int x1 = pos2pix(pos[idx]);
+ int x2 = pos2pix(val);
+ QRect oR(x1 + offset, 0, w, h);
+ QRect nR(x2 + offset, 0, w, h);
+ pos[idx] = val;
+ widget()->update(oR | nR);
+ }
+
+//---------------------------------------------------------
+// setMag
+//---------------------------------------------------------
+
+void TimeCanvas::setMag(double x, double y)
+ {
+ if (_xmag == x && _ymag == y)
+ return;
+ _xmag = x;
+ _ymag = y;
+ if (vmag)
+ vmag->setValue(lrint((_ymag-_ymagMin)*100.0/(_ymagMax-_ymagMin)));
+ hmag->setValue(xmag2s(_xmag));
+ updateScrollBars();
+ updateRulerMag();
+ magChanged();
+ _widget->update();
+ }
+
+//---------------------------------------------------------
+// scaleX
+//---------------------------------------------------------
+
+void TimeCanvas::scaleX(int val)
+ {
+ _xmag = s2xmag(val);
+ updateScrollBars();
+ updateRulerMag();
+ magChanged();
+ _widget->update();
+ }
+
+//---------------------------------------------------------
+// scaleY
+//---------------------------------------------------------
+
+void TimeCanvas::scaleY(int val)
+ {
+ int y = lrint(wpos.y() / _ymag);
+ _ymag = (_ymagMax - _ymagMin) / 100.0 * val + _ymagMin;
+ y = lrint(y * _ymag);
+ wpos.setY(y);
+ updateScrollBars();
+ magChanged();
+ _widget->update();
+ }
+
+//---------------------------------------------------------
+// setRaster
+// r = 1 - no raster
+// 0 - measure raster
+// > 1 - tick raster
+//---------------------------------------------------------
+
+void TimeCanvas::setRaster(int r)
+ {
+ if (_raster != r) {
+ _raster = r;
+ _widget->update();
+ }
+ }
+
+//---------------------------------------------------------
+// setTimeRange
+//---------------------------------------------------------
+
+void TimeCanvas::setTimeRange(const AL::Pos& p1, const AL::Pos& p2)
+ {
+ if (pos1 == p1 && pos2 == p2)
+ return;
+ pos1 = p1;
+ pos2 = p2;
+ updateScrollBars();
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// setEndPos
+//---------------------------------------------------------
+
+void TimeCanvas::setEndPos(const AL::Pos& p2)
+ {
+ if (pos2 == p2)
+ return;
+ pos2 = p2;
+ updateScrollBars();
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// updateScrollBars
+//---------------------------------------------------------
+
+void TimeCanvas::updateScrollBars()
+ {
+ hbar->blockSignals(true);
+ vbar->blockSignals(true);
+
+ int ymax = lrint(yRange * _ymag) - rCanvasA.height();
+ if (ymax < 0)
+ ymax = 0;
+ vbar->setRange(0, ymax);
+ vbar->setPageStep(rCanvasA.height());
+
+ int xmin = lrint(pos1.time(_timeType) * _xmag);
+ unsigned x2 = pos2.time(_timeType);
+ int xmax = lrint(x2 * _xmag) - rCanvasA.width();
+ if (xmax - xmin < 0)
+ xmax = xmin;
+ hbar->setRange(xmin, xmax);
+ hbar->setPageStep(rCanvasA.width());
+ wpos.setX(hbar->value());
+ wpos.setY(vbar->value());
+
+ hbar->blockSignals(false);
+ vbar->blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// setTimeType1
+//---------------------------------------------------------
+
+void TimeCanvas::setTimeType1(AL::TType t)
+ {
+ double conv = 1.0;
+ if (t == AL::TICKS) {
+ timeTypeButton->setIcon(*metronomIcon);
+ if (_timeType == AL::FRAMES)
+ conv = AL::sampleRate / double(AL::division * 120 / 60);
+ }
+ else {
+ timeTypeButton->setIcon(*clockIcon);
+ if (_timeType == AL::TICKS)
+ conv = double(AL::division * 120 / 60) / double(AL::sampleRate);
+ }
+ _timeType = t;
+ _xmag *= conv;
+ _xmagMax *= conv;
+ _xmagMin *= conv;
+
+ updateRulerMag();
+ magChanged();
+ }
+
+//---------------------------------------------------------
+// setTimeType
+//---------------------------------------------------------
+
+void TimeCanvas::setTimeType(AL::TType t)
+ {
+ setTimeType1(t);
+ updateScrollBars();
+ timeTypeChanged();
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// toggleTimeType
+//---------------------------------------------------------
+
+void TimeCanvas::toggleTimeType()
+ {
+ if (_timeType == AL::TICKS)
+ setTimeType(AL::FRAMES);
+ else
+ setTimeType(AL::TICKS);
+ }
+
+//---------------------------------------------------------
+// setMarkerList
+//---------------------------------------------------------
+
+void TimeCanvas::setMarkerList(AL::MarkerList* ml)
+ {
+ if (marker == ml)
+ return;
+ marker = ml;
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// pix2pos
+//---------------------------------------------------------
+
+AL::Pos TimeCanvas::pix2pos(int x) const
+ {
+ int val = lrint((x + wpos.x() - MAP_OFFSET)/_xmag);
+ if (val < 0)
+ val = 0;
+ return AL::Pos(val, _timeType);
+ }
+
+//---------------------------------------------------------
+// pos2pix
+//---------------------------------------------------------
+
+int TimeCanvas::pos2pix(const AL::Pos& p) const
+ {
+ return lrint(p.time(_timeType) * _xmag) + MAP_OFFSET - wpos.x();
+ }
+
+//---------------------------------------------------------
+// mapx
+//---------------------------------------------------------
+
+int TimeCanvas::mapx(int x) const
+ {
+ return lrint(x * _xmag) + MAP_OFFSET - wpos.x();
+ }
+
+//---------------------------------------------------------
+// mapxDev
+//---------------------------------------------------------
+
+int TimeCanvas::mapxDev(int x) const
+ {
+ int val = lrint((x + wpos.x() - MAP_OFFSET)/_xmag);
+ if (val < 0)
+ val = 0;
+ return val;
+ }
+
+//---------------------------------------------------------
+// setCorderWidget
+//---------------------------------------------------------
+
+void TimeCanvas::setCornerWidget(QWidget* w)
+ {
+ grid->addWidget(w, 3, 2);
+ }
+
+//---------------------------------------------------------
+// initPianoroll
+//---------------------------------------------------------
+
+/*
+ 0 1 2 3 4 5 6 7 8 9 10
+ c-2 c-1 C0 C1 C2 C3 C4 C5 C6 C7 C8 - G8
+
+ Grid über Oktave:
+
+ +------------+ ------------------------------
+ 11 | |
+ | b | 7
+ +------+ |
+ 10 | a# +-----+ ..............................
+ +------+ a |
+ 9 | | 6
+ +------+ |
+ 8 | g# +-----+ ..............................
+ +------+ g |
+ 7 | | 5
+ +------+ |
+ 6 | f# +-----+ ..............................
+ +------+ f |
+ 5 | | 4
+ | |
+ +------------+ ------------------------------
+ 4 | |
+ | e | 3
+ +------+ |
+ 3 | d# +-----+ ..............................
+ +------+ d |
+ 2 | | 2
+ +------+ |
+ 1 | c# +-----+ ..............................
+ +------+ c |
+ | | 1
+ 0 | |
+ +------------+ ------------------------------
+ */
+
+void TimeCanvas::initPianoroll()
+ {
+ static const char *oct_xpm[] = {
+ // w h colors
+ "40 91 2 1",
+ ". c #f0f0f0",
+ "# c #000000",
+ // x
+ "####################################### ",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", // 10
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", //------------------------
+ "#######################................#",
+ "########################...............#",
+ "########################...............#",
+ "####################################### ", // 7
+ "########################...............#",
+ "########################...............#",
+ "#######################................#", //------------------------
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", // 6
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", //------------------------
+ "#######################................#",
+ "########################...............#",
+ "########################...............#", // 7
+ "####################################### ",
+ "########################...............#",
+ "########################...............#",
+ "#######################................#", //------------------------
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", // 6
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", //------------------------
+ "#######################................#",
+ "########################...............#",
+ "########################...............#", // 7
+ "####################################### ",
+ "########################...............#",
+ "########################...............#",
+ "#######################................#", //------------------------
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", // 10
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ "####################################### ", //----------------------
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", // 9
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", //------------------------
+ "#######################................#",
+ "########################...............#",
+ "########################...............#",
+ "####################################### ", // 7
+ "########################...............#",
+ "########################...............#",
+ "#######################................#", //------------------------
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", // 6
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", //--------------------------
+ "#######################................#",
+ "########################...............#",
+ "########################...............#", // 7
+ "####################################### ",
+ "########################...............#",
+ "########################...............#",
+ "#######################................#", //------------------------
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", // 10
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ };
+
+ static const char *mk1_xpm[] = {
+ "40 13 2 1",
+ ". c #ff0000",
+ "# c none",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ "#######################................#",
+ "########################...............#",
+ "########################...............#",
+ "####################################### ",
+ };
+
+ static const char *mk2_xpm[] = {
+ "40 13 2 1",
+ ". c #ff0000",
+ "# c none",
+ "########################...............#",
+ "########################...............#",
+ "#######################................#", //------------------------
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", // 6
+ ".......................................#",
+ ".......................................#",
+ ".......................................#", //--------------------------
+ "#######################................#",
+ "########################...............#",
+ "########################...............#", // 7
+ "####################################### ",
+ };
+
+ static const char *mk3_xpm[] = {
+ "40 13 2 1",
+ ". c #ff0000",
+ "# c none",
+ "########################...............#",
+ "########################...............#",
+ "#######################................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ ".......................................#",
+ "########################################",
+ };
+
+ static const char *mk4_xpm[] = {
+ "40 13 2 1",
+ "# c #ff0000",
+ ". c none",
+ "........................................",
+ "........................................",
+ "........................................",
+ "#######################.................",
+ "########################................",
+ "########################................",
+ "########################................",
+ "########################................",
+ "########################................",
+ "#######################.................",
+ "........................................",
+ "........................................",
+ "........................................",
+ };
+
+ if (octave == 0) {
+ octave = new QPixmap(oct_xpm);
+ mk1 = new QPixmap(mk1_xpm);
+ mk2 = new QPixmap(mk2_xpm);
+ mk3 = new QPixmap(mk3_xpm);
+ mk4 = new QPixmap(mk4_xpm);
+ }
+ yRange = keyHeight * 75;
+ }
+
+//---------------------------------------------------------
+// pitch2y
+// y = 0 == origin of rCanvasA
+//---------------------------------------------------------
+
+int TimeCanvas::pitch2y(int pitch) const
+ {
+ int y;
+ if (type == TIME_CANVAS_DRUMEDIT)
+ y = pitch * drumHeight;
+ else {
+ static int tt[] = {
+ 12, 19, 25, 32, 38, 51, 58, 64, 71, 77, 84, 90
+ };
+ y = (75 * keyHeight) - (tt[pitch%12] + (7 * keyHeight) * (pitch/12));
+ if (y < 0)
+ y = 0;
+ }
+ return lrint(y * _ymag) - wpos.y();
+ }
+
+//---------------------------------------------------------
+// y2pitch
+// y = 0 == origin of rCanvasA
+//---------------------------------------------------------
+
+int TimeCanvas::y2pitch(int y) const
+ {
+ y = lrint((y + wpos.y()) / _ymag);
+ int pitch;
+ if (type == TIME_CANVAS_DRUMEDIT)
+ pitch = y / drumHeight;
+ else {
+ const int total = (10 * 7 + 5) * keyHeight; // 75 Ganztonschritte
+ y = total - y;
+ int oct = (y / (7 * keyHeight)) * 12;
+ char kt[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8,
+ 9, 9, 9, 9, 9, 9,
+ 10, 10, 10, 10, 10, 10, 10,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11
+ };
+ pitch = kt[y % 91] + oct;
+ if (pitch < 0 || pitch > 127)
+ pitch = -1;
+ }
+ return pitch;
+ }
+
+//---------------------------------------------------------
+// paintPiano
+//---------------------------------------------------------
+
+void TimeCanvas::paintPiano(QPainter& p, QRect r)
+ {
+// printf("paint piano %d %d %d %d\n", r.x(), r.y(), r.width(), r.height());
+
+// p.setClipRect(r);
+ int d = int(_ymag)+1;
+ qreal x = qreal(r.x());
+ qreal y = (r.y()-rulerHeight-d) / _ymag;
+ if (y < 0.0)
+ y = 0.0;
+ qreal h = (r.height()+d) / _ymag;
+ QPointF offset(x, wpos.y() / _ymag + keyHeight * 2 + y);
+
+ p.translate(0.0, qreal(rulerHeight));
+ p.scale(1.0, _ymag);
+ p.drawTiledPixmap(QRectF(x, y, qreal(r.width()), h), *octave, offset);
+
+ if (curPitch != -1) {
+ int y = pitch2y(curPitch); // - lrint(wpos.y() / _ymag);
+ QPixmap* pm;
+ switch(curPitch % 12) {
+ case 0:
+ case 5:
+ pm = mk3;
+ break;
+ case 2:
+ case 7:
+ case 9:
+ pm = mk2;
+ break;
+ case 4:
+ case 11:
+ pm = mk1;
+ break;
+ default:
+ pm = mk4;
+ break;
+ }
+ p.drawPixmap(0, y, *pm);
+ }
+ p.resetMatrix();
+ }
+
+//---------------------------------------------------------
+// paintPianorollHorizontalGrid
+//---------------------------------------------------------
+
+void TimeCanvas::paintPianorollHorizontalGrid(QPainter& p, QRect r)
+ {
+ qreal offset = rulerHeight - wpos.y();
+ qreal kh = keyHeight * _ymag;
+
+ int x1 = r.x();
+ int x2 = x1 + r.width();
+ if (x1 < pianoWidth)
+ x1 = pianoWidth;
+ qreal y = kh + offset;
+ qreal y1 = r.y() - _ymag;
+ qreal y2 = y1 + r.height() + _ymag;
+ for (int key = 1; key < 75; ++key, y += kh) {
+ if (y < y1)
+ continue;
+ if (y > y2)
+ break;
+ switch (key % 7) {
+ case 2:
+ case 5:
+ p.setPen(QPen(Qt::lightGray));
+ break;
+ default:
+ p.setPen(QPen(Qt::gray));
+ break;
+ }
+ p.drawLine(QLineF(x1, y, x2, y));
+ }
+ }
+
+//---------------------------------------------------------
+// paintDrumeditHorizontalGrid
+//---------------------------------------------------------
+
+void TimeCanvas::paintDrumeditHorizontalGrid(QPainter& p, QRect r)
+ {
+ int offset = rulerHeight - wpos.y();
+
+ p.setPen(QPen(Qt::lightGray));
+ int x1 = r.x();
+ int x2 = x1 + r.width();
+ if (x1 < drumWidth)
+ x1 = drumWidth;
+
+ p.setPen(QPen(Qt::lightGray));
+
+ int y = offset;
+ int y1 = r.y();
+ int y2 = y1 + r.height();
+ for (int i = 0; i < 128; ++i, y += drumHeight) {
+ if (y < y1)
+ continue;
+ if (y > y2)
+ break;
+ p.drawLine(QLine(x1, y, x2, y));
+ }
+ }
+
+//---------------------------------------------------------
+// addCtrlClicked
+//---------------------------------------------------------
+
+void TimeCanvas::addCtrlClicked()
+ {
+ addController();
+ }
+
+//---------------------------------------------------------
+// updateGeometry
+//---------------------------------------------------------
+
+void TimeCanvas::updateGeometry()
+ {
+ int wh = _widget->height();
+ int ww = _widget->width();
+ if (wh < ctrlHeight)
+ ctrlHeight = wh;
+
+ int x1 = 0;
+ if (type == TIME_CANVAS_PIANOROLL)
+ x1 = pianoWidth;
+ else if (type == TIME_CANVAS_DRUMEDIT)
+ x1 = drumWidth;
+ int y2 = wh - ctrlHeight;
+
+ rPanelA.setRect(0, rulerHeight, x1, wh - rulerHeight - ctrlHeight);
+ rPanelB.setRect(0, y2, x1, ctrlHeight);
+
+ int cw = ww - x1;
+ rRuler.setRect( x1, 0, cw, rulerHeight);
+ rCanvasA.setRect(x1, rulerHeight, cw, wh - rulerHeight - ctrlHeight);
+ rCanvasB.setRect(x1, y2, cw, ctrlHeight);
+
+ rButton.setRect(0, 0, rCanvasA.x(), rPanelA.y());
+
+ if (yRange > 0 && _yFit) {
+ _ymagMin = double(rCanvasA.height()) / double(yRange);
+ if (_ymag < _ymagMin)
+ _ymag = _ymagMin;
+ if (vmag)
+ vmag->setValue(lrint((_ymag-_ymagMin)*100.0/(_ymagMax-_ymagMin)));
+ }
+ }
+
+//---------------------------------------------------------
+// setTool
+//---------------------------------------------------------
+
+void TimeCanvas::setTool(int t)
+ {
+ if (_tool == Tool(t))
+ return;
+ _tool = Tool(t);
+ emit toolChanged(_tool);
+ setCursor();
+ }
+
+//---------------------------------------------------------
+// setCursor
+//---------------------------------------------------------
+
+void TimeCanvas::setCursor()
+ {
+ switch(_tool) {
+ case PencilTool:
+ widget()->setCursor(QCursor(*pencilIcon, 4, 15));
+ break;
+ case RubberTool:
+ widget()->setCursor(QCursor(*deleteIcon, 4, 15));
+ break;
+ case GlueTool:
+ widget()->setCursor(QCursor(*glueIcon, 4, 15));
+ break;
+ case CutTool:
+ widget()->setCursor(QCursor(*cutIcon, 4, 15));
+ break;
+ case MuteTool:
+ widget()->setCursor(QCursor(*editmuteIcon, 4, 15));
+ break;
+ default:
+ widget()->setCursor(QCursor(Qt::ArrowCursor));
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// setCanvasBackground
+//---------------------------------------------------------
+
+void TimeCanvas::setCanvasBackground(const QColor& color)
+ {
+ canvasBackgroundPixmap = QPixmap();
+ canvasBackgroundColor = color;
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// setCanvasBackground
+//---------------------------------------------------------
+
+void TimeCanvas::setCanvasBackground(const QPixmap& pm)
+ {
+ canvasBackgroundPixmap = pm;
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// setYMagRange
+//---------------------------------------------------------
+
+void TimeCanvas::setYMagRange(double min, double max)
+ {
+ _ymagMin = min;
+ _ymagMax = max;
+ if (vmag)
+ vmag->setValue(lrint((_ymag-_ymagMin)*100.0/(_ymagMax-_ymagMin)));
+ }
+
+//---------------------------------------------------------
+// setVSize
+//---------------------------------------------------------
+
+void TimeCanvas::setVSize(int val)
+ {
+ if (yRange == val)
+ return;
+ yRange = val;
+ if (_yFit) {
+ _ymagMin = double(rCanvasA.height()) / double(yRange);
+ if (_ymag < _ymagMin)
+ _ymag = _ymagMin;
+ if (vmag)
+ vmag->setValue(lrint((_ymag-_ymagMin)*100.0/(_ymagMax-_ymagMin)));
+ }
+ updateScrollBars();
+ }
+
+//---------------------------------------------------------
+// s2xmag
+// nonlinear xmag behaviour, feels better
+//---------------------------------------------------------
+
+double TimeCanvas::s2xmag(int val)
+ {
+ val = 100 - val;
+ double f = 1.0 - log10(val * val + 1) * 0.25;
+ return (_xmagMax - _xmagMin) * f + _xmagMin;
+ }
+
+//---------------------------------------------------------
+// xmag2s
+//---------------------------------------------------------
+
+int TimeCanvas::xmag2s(double m)
+ {
+ m -= _xmagMin;
+ m /= (_xmagMax - _xmagMin);
+ double val = sqrt(exp10((1.0 - m) * 4.0)-1.0);
+ return lrint(100.0 - val);
+ }
+
+//---------------------------------------------------------
+// setPart
+//---------------------------------------------------------
+
+void TimeCanvas::setPart(const AL::Pos& p1, const AL::Pos& p2)
+ {
+ partPos1 = p1;
+ partPos2 = p2;
+ widget()->update();
+ }
+
diff --git a/muse/awl/tcanvas.h b/muse/awl/tcanvas.h
new file mode 100644
index 00000000..df4b9d70
--- /dev/null
+++ b/muse/awl/tcanvas.h
@@ -0,0 +1,253 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __TCANVAS_H__
+#define __TCANVAS_H__
+
+#include "al/pos.h"
+#include "al/marker.h"
+
+#define MAP_OFFSET 20
+
+enum TimeCanvasType {
+ TIME_CANVAS, TIME_CANVAS_PIANOROLL, TIME_CANVAS_DRUMEDIT
+ };
+
+enum Tool {
+ PointerTool=1, PencilTool=2, RubberTool=4, CutTool=8,
+ ScoreTool=16, GlueTool=32, QuantTool=64, DrawTool=128, MuteTool=256
+ };
+
+enum FollowMode {
+ FOLLOW_NO, FOLLOW_JUMP, FOLLOW_CONTINUOUS
+ };
+
+static const int rulerHeight = 28;
+static const int pianoWidth = 40;
+static const int drumWidth = 120;
+static const int drumHeight = 18;
+static const int keyHeight = 13;
+
+//---------------------------------------------------------
+// TimeCanvas
+//
+// Layout:
+// Button Ruler
+// panelA canvasA
+// panelB canvasB
+//
+// Pianoroll:
+// panelA -> keyboard
+//
+// Drumeditor:
+// panelA -> instrument list
+//
+//---------------------------------------------------------
+
+class TimeCanvas : public QFrame {
+ Q_OBJECT
+
+ int yRange;
+ bool _yFit;
+ AL::Pos pos1; // time scroll range
+ AL::Pos pos2;
+
+ int metronomeRulerMag;
+
+ double _xmagMin, _xmagMax;
+ double _ymagMin, _ymagMax;
+
+ AL::TType _timeType;
+ AL::MarkerList* marker;
+ QScrollBar* hbar;
+ QScrollBar* vbar;
+ QSlider* vmag;
+ QSlider* hmag;
+ QToolButton* timeTypeButton;
+ QGridLayout* grid;
+ QColor canvasBackgroundColor;
+ QPixmap canvasBackgroundPixmap;
+ int dragType;
+ bool followPos;
+
+ //
+ // pianoroll variables
+ //
+ static QPixmap* octave;
+ static QPixmap* mk1;
+ static QPixmap* mk2;
+ static QPixmap* mk3;
+ static QPixmap* mk4;
+ QPushButton* addCtrlButton;
+
+ bool mouseInB;
+
+ void updateScrollBars();
+ void canvasPaintEvent(const QRect&, QPainter&);
+ void paintCanvas(QPainter&, const QRect&);
+ void paintMetronomRuler(QPainter&, const QRect&);
+ void paintClockRuler(QPainter&, const QRect&);
+ void initPianoroll();
+ void paintPiano(QPainter&, QRect);
+ void paintPianorollHorizontalGrid(QPainter&, QRect);
+ void paintDrumeditHorizontalGrid(QPainter&, QRect);
+ void updateGeometry();
+ double s2xmag(int val);
+ int xmag2s(double m);
+ void updateRulerMag();
+
+ protected:
+ TimeCanvasType type;
+ Tool _tool;
+ QRect rButton, rPanelA, rPanelB, rRuler, rCanvasA, rCanvasB;
+ AL::Pos pos[3];
+ bool showCursor;
+ AL::Pos cursor;
+
+ QWidget* _widget;
+
+ AL::Pos partPos1; // active time range for midi editors
+ AL::Pos partPos2;
+
+ QPoint wpos; // "widget" position
+ double _xmag, _ymag;
+
+ int ctrlHeight;
+ int curPitch;
+
+ int _raster;
+ int button;
+ Qt::KeyboardModifiers keyState;
+
+ bool eventFilter(QObject*, QEvent*);
+
+ virtual void paint(QPainter&, QRect) {}
+ virtual void mousePress(QMouseEvent*) {}
+ virtual void mouseMove(QPoint) {}
+ virtual void mouseRelease(QMouseEvent*) {}
+ virtual void mouseDoubleClick(QMouseEvent*) {}
+ virtual void paintDrumList(QPainter&, QRect) {}
+ virtual void layout() {}
+ virtual void enterB() {}
+ virtual void leaveB() {}
+ virtual void setCursor();
+ virtual void timeTypeChanged() {}
+ virtual void magChanged() {}
+
+ virtual void paintControllerCanvas(QPainter&, QRect) {}
+ virtual void paintControllerPanel(QPainter&, QRect) {}
+
+ virtual void dragEnter(QDragEnterEvent*) {}
+ virtual void drop(QDropEvent*) {}
+ virtual void dragMove(QDragMoveEvent*) {}
+ virtual void dragLeave(QDragLeaveEvent*) {}
+
+ virtual void addController() {}
+
+ // map logical coordinates to physical coordinates (pixel)
+ int mapx(int x) const;
+ int mapy(int y) const { return lrint(y * _ymag) - wpos.y(); }
+ int rmapx(int x) const { return lrint(x * _xmag); }
+ int rmapy(int y) const { return lrint(y * _ymag); }
+ QPoint map(const QPoint& p) const {
+ return QPoint(mapx(p.x()), mapy(p.y()));
+ }
+ QPoint rmap(const QPoint& p) const {
+ return QPoint(rmapx(p.x()), rmapy(p.y()));
+ }
+
+ // map physical coordinates (pixel) to logical coordinates
+ int mapxDev(int x) const;
+ int rmapxDev(int x) const { return lrint(x / _xmag); }
+ int mapyDev(int y) const {
+ int val = lrint((y + wpos.y()) / _ymag);
+ return val < 0 ? 0 : val;
+ }
+ QPoint mapDev(const QPoint& p) const {
+ return QPoint(mapxDev(p.x()), mapyDev(p.y()));
+ }
+
+ virtual int y2pitch(int y) const;
+ virtual int pitch2y(int pitch) const;
+ void setTimeType1(AL::TType t);
+ void setPart(const AL::Pos& p1, const AL::Pos& p2);
+
+ private slots:
+ void moveX(int);
+ void scaleX(int);
+ void scaleY(int);
+ void toggleTimeType();
+ void addCtrlClicked();
+
+ signals:
+ void posChanged(int, const AL::Pos&); // emitted from ruler
+ void cursorPos(const AL::Pos&, bool);
+ void contentsMoving(int, int);
+ void addMarker(const AL::Pos&);
+ void removeMarker(const AL::Pos&);
+ void pitchChanged(int);
+ void toolChanged(int);
+
+ public slots:
+ void setLocatorPos(int idx, const AL::Pos&, bool follow);
+ void setVSize(int);
+ virtual void setRaster(int);
+ void setYPos(int);
+ void moveY(int);
+ void setEndPos(const AL::Pos&);
+ void tempoChanged();
+ void setTool(int);
+ void setFollow(bool val) { followPos = val; }
+
+ public:
+ TimeCanvas(TimeCanvasType = TIME_CANVAS);
+ void setTimeRange(const AL::Pos&, const AL::Pos&);
+ void setMag(double, double);
+ double xmag() const { return _xmag; }
+ double ymag() const { return _ymag; }
+
+ void setYMagRange(double, double);
+ void setYFit(bool val) { _yFit = val; }
+
+ QPoint getWPos() const { return wpos; }
+ QWidget* widget() const { return _widget; }
+ void setWPos(const QPoint& p);
+ void setTimeType(AL::TType t);
+ AL::TType timeType() const { return _timeType; }
+ void setMarkerList(AL::MarkerList*);
+ void setCornerWidget(QWidget* w);
+ void resizeController(int);
+ int raster() const { return _raster; }
+
+ AL::Pos pix2pos(int x) const;
+ int pos2pix(const AL::Pos&) const;
+ QScrollBar* verticalScrollBar() const { return vbar; }
+ Tool tool() const { return _tool; }
+ void setCanvasBackground(const QColor& color);
+ void setCanvasBackground(const QPixmap& pm);
+
+ void updateCanvasB() { _widget->update(rCanvasB); }
+
+ static FollowMode followMode;
+ friend class CtrlEdit;
+ };
+
+#endif
+
diff --git a/muse/awl/tempoedit.cpp b/muse/awl/tempoedit.cpp
new file mode 100644
index 00000000..d7dbac81
--- /dev/null
+++ b/muse/awl/tempoedit.cpp
@@ -0,0 +1,88 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "tempoedit.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// TempoEdit
+//---------------------------------------------------------
+
+TempoEdit::TempoEdit(QWidget* parent)
+ : QDoubleSpinBox(parent)
+ {
+ curVal = -1.0;
+ setSingleStep(1.0);
+ setRange(30.0, 600.0);
+ connect(this, SIGNAL(valueChanged(double)), SLOT(newValue(double)));
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize TempoEdit::sizeHint() const
+ {
+ QFontMetrics fm(font());
+ int fw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
+ int h = fm.height() + fw * 2;
+ int w = 2 + fm.width(QString("000.00")) + fw * 4 + 30;
+ return QSize(w, h).expandedTo(QApplication::globalStrut());
+ }
+
+//---------------------------------------------------------
+// newValue
+//---------------------------------------------------------
+
+void TempoEdit::newValue(double val)
+ {
+ if (val != curVal) {
+ curVal = val;
+ emit tempoChanged(tempo());
+ }
+ }
+
+//---------------------------------------------------------
+// setTempo
+//---------------------------------------------------------
+
+void TempoEdit::setTempo(int val)
+ {
+ double d = 60000000.0/double(val);
+ if (d != curVal) {
+ curVal = d;
+ blockSignals(true);
+ setValue(d);
+ blockSignals(false);
+ }
+ }
+
+//---------------------------------------------------------
+// tempo
+//---------------------------------------------------------
+
+int TempoEdit::tempo() const
+ {
+ return lrint(60000000.0/value());
+ }
+
+}
+
diff --git a/muse/awl/tempoedit.h b/muse/awl/tempoedit.h
new file mode 100644
index 00000000..af06221d
--- /dev/null
+++ b/muse/awl/tempoedit.h
@@ -0,0 +1,55 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLTEMPOEDIT_H__
+#define __AWLTEMPOEDIT_H__
+
+namespace Awl {
+
+//---------------------------------------------------------
+// TempoEdit
+//---------------------------------------------------------
+
+class TempoEdit : public QDoubleSpinBox {
+ Q_OBJECT
+
+ double curVal;
+
+ protected:
+ QSize sizeHint() const;
+
+ private slots:
+ void newValue(double);
+
+ public slots:
+ void setTempo(int);
+
+ signals:
+ void tempoChanged(int);
+
+ public:
+ TempoEdit(QWidget*);
+ int tempo() const;
+ };
+
+}
+
+#endif
+
diff --git a/muse/awl/tempolabel.cpp b/muse/awl/tempolabel.cpp
new file mode 100644
index 00000000..3fcdec5c
--- /dev/null
+++ b/muse/awl/tempolabel.cpp
@@ -0,0 +1,72 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "tempolabel.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// TempoLabel
+//---------------------------------------------------------
+
+TempoLabel::TempoLabel(QWidget* parent)
+ : QLabel(parent)
+ {
+ setFrameStyle(WinPanel | Sunken);
+ setLineWidth(2);
+ setMidLineWidth(3);
+ _value = 1.0;
+ setValue(0.0);
+ setIndent(3);
+ setMinimumSize(sizeHint());
+ }
+
+//---------------------------------------------------------
+// setVal
+//---------------------------------------------------------
+
+void TempoLabel::setValue(int val)
+ {
+ setValue(double(val/1000.0));
+ }
+
+void TempoLabel::setValue(double val)
+ {
+ if (val == _value)
+ return;
+ _value = val;
+ QString s = QString("%1").arg(val, 3, 'f', 2);
+ setText(s);
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize TempoLabel::sizeHint() const
+ {
+ QFontMetrics fm(font());
+ int fw = 4;
+ int h = fm.height() + fw * 2;
+ int w = 6 + fm.width(QString("000.00")) + fw * 2; // 6=indent
+ return QSize(w, h).expandedTo(QApplication::globalStrut());
+ }
+}
+
diff --git a/muse/awl/tempolabel.h b/muse/awl/tempolabel.h
new file mode 100644
index 00000000..cf30444e
--- /dev/null
+++ b/muse/awl/tempolabel.h
@@ -0,0 +1,48 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLTEMPOLABEL_H__
+#define __AWLTEMPOLABEL_H__
+
+namespace Awl {
+
+//---------------------------------------------------------
+// TempoLabel
+//---------------------------------------------------------
+
+class TempoLabel : public QLabel {
+ double _value;
+
+ Q_OBJECT
+
+ protected:
+ QSize sizeHint() const;
+
+ public slots:
+ void setValue(int);
+ void setValue(double);
+
+ public:
+ TempoLabel(QWidget*);
+ };
+}
+
+#endif
+
diff --git a/muse/awl/utils.cpp b/muse/awl/utils.cpp
new file mode 100644
index 00000000..29fe148f
--- /dev/null
+++ b/muse/awl/utils.cpp
@@ -0,0 +1,48 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "utils.h"
+
+static const char* vall[] = {
+ "c","c#","d","d#","e","f","f#","g","g#","a","a#","h"
+ };
+static const char* valu[] = {
+ "C","C#","D","D#","E","F","F#","G","G#","A","A#","H"
+ };
+
+namespace Awl {
+
+//---------------------------------------------------------
+// pitch2string
+//---------------------------------------------------------
+
+QString pitch2string(int v)
+ {
+ if (v < 0 || v > 127)
+ return QString("----");
+ int octave = (v / 12) - 2;
+ QString o;
+ o.sprintf("%d", octave);
+ int i = v % 12;
+ QString s(octave < 0 ? valu[i] : vall[i]);
+ return s + o;
+ }
+}
+
diff --git a/muse/awl/utils.h b/muse/awl/utils.h
new file mode 100644
index 00000000..c97bc7bf
--- /dev/null
+++ b/muse/awl/utils.h
@@ -0,0 +1,29 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLUTILS_H__
+#define __AWLUTILS_H__
+
+namespace Awl {
+ extern QString pitch2string(int);
+ }
+
+#endif
+
diff --git a/muse/awl/volentry.cpp b/muse/awl/volentry.cpp
new file mode 100644
index 00000000..23b38720
--- /dev/null
+++ b/muse/awl/volentry.cpp
@@ -0,0 +1,37 @@
+//=============================================================================
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+#include "volentry.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// VolEntry
+//---------------------------------------------------------
+
+VolEntry::VolEntry(QWidget* parent)
+ : FloatEntry(parent)
+ {
+ setRange(-60.0f, 10.0f);
+ setSpecialText(tr("off"));
+ setPrecision(0);
+ setLog(true);
+ }
+}
+
diff --git a/muse/awl/volentry.h b/muse/awl/volentry.h
new file mode 100644
index 00000000..0b51b945
--- /dev/null
+++ b/muse/awl/volentry.h
@@ -0,0 +1,41 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLVOLENTRY_H__
+#define __AWLVOLENTRY_H__
+
+#include "floatentry.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// VolEntry
+//---------------------------------------------------------
+
+class VolEntry : public FloatEntry {
+ Q_OBJECT
+
+ public:
+ VolEntry(QWidget* parent);
+ };
+
+}
+
+#endif
diff --git a/muse/awl/volknob.cpp b/muse/awl/volknob.cpp
new file mode 100644
index 00000000..da9a1e63
--- /dev/null
+++ b/muse/awl/volknob.cpp
@@ -0,0 +1,39 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+#include "volknob.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// VolKnob
+//---------------------------------------------------------
+
+VolKnob::VolKnob(QWidget* parent)
+ : Knob(parent)
+ {
+ setLog(true);
+ setRange(-60.0f, 10.0f);
+ _lineStep = .8f;
+ _pageStep = 3.0f;
+ }
+}
+
diff --git a/muse/awl/volknob.h b/muse/awl/volknob.h
new file mode 100644
index 00000000..7cec4335
--- /dev/null
+++ b/muse/awl/volknob.h
@@ -0,0 +1,46 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLVOLKNOB_H__
+#define __AWLVOLKNOB_H__
+
+#include "knob.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// VolKnob
+//! Volume Knob entry widget
+//
+//! This widget implements knob with a logarithmic
+//! floating point scale used to adjust the volume
+//! in an audio mixer.
+//---------------------------------------------------------
+
+class VolKnob : public Knob {
+ Q_OBJECT
+
+ public:
+ VolKnob(QWidget* parent = 0);
+ };
+}
+
+#endif
+
diff --git a/muse/awl/volslider.cpp b/muse/awl/volslider.cpp
new file mode 100644
index 00000000..dc4eddac
--- /dev/null
+++ b/muse/awl/volslider.cpp
@@ -0,0 +1,54 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+#include "volslider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// VolSlider
+//---------------------------------------------------------
+
+VolSlider::VolSlider(QWidget* parent)
+ : Slider(parent)
+ {
+ setLog(true);
+ setRange(-60.0f, 10.0f);
+ setScaleWidth(7);
+ setLineStep(.8f);
+ setPageStep(3.0f);
+ }
+
+//---------------------------------------------------------
+// mouseDoubleClickEvent
+//---------------------------------------------------------
+
+void VolSlider::mouseDoubleClickEvent(QMouseEvent* ev)
+ {
+ if (ev->button() == Qt::RightButton)
+ _value = 0.0;
+ else
+ _value = _minValue;
+ valueChange();
+ update();
+ }
+}
+
diff --git a/muse/awl/volslider.h b/muse/awl/volslider.h
new file mode 100644
index 00000000..cbea8ca9
--- /dev/null
+++ b/muse/awl/volslider.h
@@ -0,0 +1,52 @@
+//=============================================================================
+// Awl
+// Audio Widget Library
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AWLVOLSLIDER_H__
+#define __AWLVOLSLIDER_H__
+
+#include "slider.h"
+
+namespace Awl {
+
+//---------------------------------------------------------
+// VolSlider
+//! Volume Slider entry widget
+//
+//! This widget implements a slider with a logarithmic
+//! floating point scale used to adjust the volume
+//! in an audio mixer.
+//! Internal value represents gain as a logarythmic
+//! dB value.
+//---------------------------------------------------------
+
+class VolSlider : public Slider {
+ Q_OBJECT
+
+ protected:
+ virtual void mouseDoubleClickEvent(QMouseEvent*);
+
+ public:
+ VolSlider(QWidget* parent = 0);
+ };
+
+}
+
+#endif
+
diff --git a/muse/cmake/UsePkgConfig1.cmake b/muse/cmake/UsePkgConfig1.cmake
new file mode 100644
index 00000000..55654d98
--- /dev/null
+++ b/muse/cmake/UsePkgConfig1.cmake
@@ -0,0 +1,45 @@
+# - pkg-config module for CMake
+#
+# Defines the following macros:
+#
+# PKGCONFIG(package includedir libdir linkflags cflags)
+#
+# Calling PKGCONFIG will fill the desired information into the 4 given arguments,
+# e.g. PKGCONFIG(libart-2.0 LIBART_INCLUDE_DIR LIBART_LINK_DIR LIBART_LINK_FLAGS LIBART_CFLAGS)
+# if pkg-config was NOT found or the specified software package doesn't exist, the
+# variable will be empty when the function returns, otherwise they will contain the respective information
+#
+
+FIND_PROGRAM(PKGCONFIG_EXECUTABLE NAMES pkg-config PATHS /usr/bin /usr/local/bin )
+
+MACRO(PKGCONFIG _package _minVersion _include_DIR _link_DIR _link_FLAGS _cflags)
+# reset the variables at the beginning
+ SET(${_include_DIR})
+ SET(${_link_DIR})
+ SET(${_link_FLAGS})
+ SET(${_cflags})
+
+ # if pkg-config has been found
+ IF(PKGCONFIG_EXECUTABLE)
+
+ EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS ${_package} --atleast-version=${_minVersion} RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _pkgconfigDevNull )
+# EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS ${_package} --exists RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _pkgconfigDevNull )
+
+ # and if the package of interest also exists for pkg-config, then get the information
+ IF(NOT _return_VALUE)
+
+ EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS ${_package} --variable=includedir OUTPUT_VARIABLE ${_include_DIR} )
+
+ EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS ${_package} --variable=libdir OUTPUT_VARIABLE ${_link_DIR} )
+
+ EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS ${_package} --libs OUTPUT_VARIABLE ${_link_FLAGS} )
+
+ EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS ${_package} --cflags OUTPUT_VARIABLE ${_cflags} )
+
+ ENDIF(NOT _return_VALUE)
+
+ ENDIF(PKGCONFIG_EXECUTABLE)
+
+ENDMACRO(PKGCONFIG _include_DIR _link_DIR _link_FLAGS _cflags)
+
+MARK_AS_ADVANCED(PKGCONFIG_EXECUTABLE)
diff --git a/muse/config.h b/muse/config.h
new file mode 100644
index 00000000..45bdd3e1
--- /dev/null
+++ b/muse/config.h
@@ -0,0 +1,22 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+/* #undef DSSI_SUPPORT */
+/* #undef VST_SUPPORT */
diff --git a/muse/config.h.in b/muse/config.h.in
new file mode 100644
index 00000000..d18eb91e
--- /dev/null
+++ b/muse/config.h.in
@@ -0,0 +1,22 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#cmakedefine DSSI_SUPPORT
+#cmakedefine VST_SUPPORT
diff --git a/muse/doc/README.CVS b/muse/doc/README.CVS
new file mode 100644
index 00000000..43d973c5
--- /dev/null
+++ b/muse/doc/README.CVS
@@ -0,0 +1,3 @@
+
+To compile a cvs tree, inspect ./autogen.sh and then run it
+
diff --git a/muse/doc/README.de b/muse/doc/README.de
new file mode 100644
index 00000000..b6b03c5a
--- /dev/null
+++ b/muse/doc/README.de
@@ -0,0 +1,69 @@
+====================================================================
+ MusE --- Linux (Midi) Music Editor
+====================================================================
+
+Guten Tag!
+dies ist MusE, der Open Source MIDI/Audio Sequencer.
+
+MusE steht unter der GNU General Public Licence (GPL).
+Für Einzelheiten siehe COPYING.
+
+,-----------------------------------------------------------------.
+| HINWEIS |
+|-----------------------------------------------------------------|
+| Viel Teile des Codes von MusE sind EXPERIMENTELL und können |
+| zu Programmabstürzen und wer weiß was sonst noch allem |
+| führen. |
+| SIE BENUTZEN DIESE SOFTWARE AUF EIGENES RISIKO! |
+`-----------------------------------------------------------------'
+
+ =============================
+ Voraussetzungen
+ =============================
+
+ - qt 3.2.0 oder neuer
+ ftp://ftp.trolltech.com/qt/source
+ Bitte mit "-thread" option compilieren.
+
+ - libsndfile 1.0.1 (aktuell ist 1.0.4)
+ http://www.zip.com.au/~erikd/libsndfile/
+
+ - JACK
+ http://jackit.sourceforge.net/
+ download:
+ http://jackit.sourceforge.net/download/
+
+ - fluidsynth-1.0.3 (the synti formerly known as "iiwusynth") von
+ http://savannah.nongnu.org/download/fluid
+
+ - Linux Kernel mit rtc (RealTimeClock) Treiber (device /dev/rtc)
+ ("low latency patches" für minimales timing-jitter wären fein)
+
+ - ALSA von http://www.alsa-project.org/
+ Version 0.9.x oder neuer
+
+ - gcc 3.x.x
+ (es muß der gleiche Compiler wie der zum compilieren der
+ QT-Libraries verwendet werden)
+
+ - natürlich: eine Soundkarte und/oder irgendwelche Midi Geräte
+
+ =============================
+ Kompilierung
+ =============================
+
+ - download source von http://lmuse.sourceforge.net/
+ - untar source:
+ tar xvofj muse-current-tar.bz2 </code>
+ - konfigurieren:
+ run "configure"
+ - kompilieren:
+ run "make all"
+ - installieren
+ als root, run "make install"
+ - Test
+
+====================================================================
+Aktuelle(re) Infos gibt es auf der MusE Homepage
+http://lmuse.sourceforge.net/
+
diff --git a/muse/doc/README.instruments b/muse/doc/README.instruments
new file mode 100644
index 00000000..a2693b4e
--- /dev/null
+++ b/muse/doc/README.instruments
@@ -0,0 +1,108 @@
+================================================
+ MusE loadable Midi Instrument Definitions
+ (as of 10.09.2003) MusE 0.7.0
+================================================
+
+ - File Extension ".idf"
+ - searched in Subdirectory "instruments"
+ (/usr/share/muse/instruments on my system)
+
+ All found instrument definitions are presented by MusE
+ in Config->MidiPorts in Pulldown in column "Instrument".
+
+-------------------------------------------------
+ Example of Instrument Definition File:
+-------------------------------------------------
+
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="GM">
+ <Init>
+ ...MusE event list which initializes instrument
+ </Init>
+ <PatchGroup name="Piano">
+ <Patch name="Grand Piano" prog="0"/>
+ <Patch name="Bright Piano" prog="1"/>
+ ...
+ </PatchGroup>
+ <PatchGroup name="Bass">
+ <Patch name="Acoustic Bass" prog="32"/>
+ <Patch name="Fingered Bass" prog="33"/>
+ </PatchGroup>
+ ...
+ <Controller name="Brightness">
+ <n>0x4a</n>
+ <min>0</min>
+ <max>127</max>
+ <init>0</init>
+ </Controller>
+ ...
+ </MidiInstrument>
+ </muse>
+
+-------------------------------------------------
+ Notes
+-------------------------------------------------
+
+ (1) PatchGroups are not mandatory; its valid to write:
+
+ <MidiInstrument name="GM">
+ <Patch name="Grand Piano" prog="0"/>
+ <Patch name="Bright Piano" prog="1"/>
+ <Patch name="Acoustic Bass" prog="32"/>
+ <Patch name="Fingered Bass" prog="33"/>
+ ...
+ </MidiInstrument>
+
+ (2) An "Instrument Definition File" can define more than on
+ Instrument, but it is recommended to use one file for
+ one instrument
+
+ (3) the "prog" parameter in a "Patch" is mandatory. Missing
+ "hbank" or "lbank" are treated as "don't care".
+ Missing "drum" is treated as drum="0".
+
+ A XG-Patch looks like:
+ <Patch name="Electro" drum="1" hbank="127" lbank="0" prog="24"/>
+
+ (5) A patch can be associated with a "mode" with one of
+
+ 1 - GM
+ 2 - GS
+ 4 - XG
+
+ Example:
+ <Patch name="Electro" mode="4" drum="1" hbank="127" lbank="0" prog="24"/>
+
+ Mode id's can be ore'd together for patches which are valid
+ for more than one mode:
+
+ <Patch name="Grand Piano" mode=7" hbank="0" lbank="0" prog="0"/>
+
+ (4) example for MusE event (Sysex "XG-On"):
+
+ <event tick="0" type="5" datalen="7">
+ 43 10 4c 00 00 7e 00
+ </event>
+
+ (5) <Init> ... </Init> part can be omitted
+
+
+ (6) Controller have the following porperties:
+
+ name: arbitrary unique (short) string describing the controller
+ n: controller number, defines also the controller type:
+ values from 0x0 - 0x7f are 7Bit controller
+ values from 0x1000 - 0x1ffff are 14 bit controller with
+ MSB/LSB value pairs
+ values from 0x20000 - 0x2ffff are RPN's
+ values from 0x30000 - 0x3ffff are NRPN's
+
+ min: minimum value for controller
+ max: maximum value for controller
+ init: reset value for controller; when controller value is
+ undefined after instrument reset, use the ''undefined''
+ value 0x10000
+
+ the min/max/init values can be ommited
+
diff --git a/muse/doc/README.ladspaguis b/muse/doc/README.ladspaguis
new file mode 100644
index 00000000..5c77be26
--- /dev/null
+++ b/muse/doc/README.ladspaguis
@@ -0,0 +1,63 @@
+MusE can create LADSPA GUI's (graphical user interfaces) from
+Qt designer *.ui files at runtime.
+This allows a user to create or modify customized LADSPA guis without
+recompiling MusE.
+
+======================
+ Installation
+=====================
+
+Copy the file muse/awl/libawlplugin.so and muse/awl/libawlplugin_debug.so
+into a directory were Qt (designer) can find it.
+
+Example:
+ if you installed Qt in /usr/qt4:
+ su -c "cp -af awlplugin.so /usr/qt4/plugins/designer"
+Check:
+ After starting the Qt designer you see all MusE specific widgets
+ in the widget box titled "MusE Awl Widgets".
+ If you cannot find any MusE widgets, designer did not find the
+ muse shared libs.
+ The MusE shared libs must have a signature qt designer understands.
+ If the signature is wrong, qt designer silently ignores the libs.
+
+======================
+ Environment
+======================
+
+Naming:
+ The Qt designer files are named after the LADSPA plugin ID.
+ Example: the "freeverb" plugin has the id "1050". A gui for
+ freeverb has to be named "1050.ui".
+ The plugin ID is shown in the MusE plugin browser.
+
+Path:
+ MusE looks for *ui files at (museglobalshare)/plugins/.
+ If you installed MusE at "/usr" (configured with --prefix=/usr)
+ MusE looks at "/usr/share/muse/plugins" for *ui files.
+
+======================
+ Creating *.ui file
+======================
+
+The association between LADSPA plugin parameters and Qt-Widgets is
+done by name. All input widgets which manipulate a LADSPA parameter
+must have a name starting with the letter "P".
+The "id" property of every widget must be set to the parameter index
+of the plugin,
+One parameter can be manipulated with more than one widgets.
+
+ Example:
+ A "Slider" widget which manipulates the 3th parameter of a
+ plugin has the name "Pslider" and the "id" property has a
+ value of "3".
+
+Supported Widgets:
+ "AwlSlider" slider for float values
+ "AwlFloatEntry" entry for float values
+ "AwlCheckbox" to manipulate a on/off LADSPA parameter
+ "AwlComboBox" select from a list of named values; sets
+ integer LADSPA values
+
+(for more hints please look at the example *.ui files)
+
diff --git a/muse/doc/README.realtime b/muse/doc/README.realtime
new file mode 100644
index 00000000..1d7b3e31
--- /dev/null
+++ b/muse/doc/README.realtime
@@ -0,0 +1,37 @@
+For reliable operation MusE needs "realtime priviledges".
+
+Kernel >= 2.6.12
+ - load the set_rtlimits utility from:
+ http://www.physics.adelaide.edu.au/~jwoithe
+ - compile & install
+
+ - create an audio group (if you dont have one already):
+ groupadd audio
+
+ - add yourself to the audio group
+
+ - create an entry in "/etc/set_rtlimits.conf":
+
+ @audio /home/ws/projects/muse/muse/muse/muse -1 90
+
+ - start MusE with
+ set_rtlimits -r 60 /usr/local/bin/muse
+
+
+========================================================
+ Low Latency
+========================================================
+
+ Start JACK with a realtime priority of 60 (option -P60).
+ This should be higher than all (Realtime) system processes
+ if you run a realtime kernel (with Ingo Molnars realtime
+ patches). The JACK default priority is 10 which is too low.
+
+ MusE must be started with a higher priority than jack.
+ This allows the MusE midi thread to interrupt all
+ audio threads. This is important to get a midi timing
+ which is of higher resolution than the audio segment
+ time. The default priority of 70 for MusE should do.
+
+
+
diff --git a/muse/doc/README.shortcuts b/muse/doc/README.shortcuts
new file mode 100644
index 00000000..48de30f3
--- /dev/null
+++ b/muse/doc/README.shortcuts
@@ -0,0 +1,159 @@
+From: Frank Neumann
+Subject: [MusE] Keyboard shortcut list
+
+Hi all,
+while reading some MusE source code during the last weeks, I made a list
+of all keyboard shortcuts I found in there. I thought other might find
+this useful, so I am posting this here. There are some "?" spots in
+there where I am not perfectly sure if something is correct or really
+works the way it should, so comments or corrections are welcome. A few
+keys are also result of my first ever cvs commit to Muse :-).
+
+Frank
+
+2004-04-xx:
+ Also changed Ctrl+Shift+A to Select None.
+
+2004-01-08:
+ Changed Ctrl+A to Select All in Arranger for the sake of uniformity. (ML)
+
+2003-10-26:
+ Added Alt+L shortcut in drumeditor to set fixed length on drumnotes
+ according to drummap (Mathias Lundgren)
+ 2003-10-19:
+ In Arranger, Part Canvas:
+ added Alt+P shortcut in to move locators to part boundaries
+ Crsr Up / Crsr Down to move to nearest part on track above/below
+ in current window.
+
+04.01.2003:
+ - (ws) added new Delete keys in pianoroll and drumedit
+
+<cut here>
+
+Shortcut keys in Muse, as of 0.6.0pre5:
+
+Arranger:
+=========
+Undo: Ctrl-Z
+Redo: Ctrl-Y
+New: Ctrl-N
+Open: Ctrl-O
+Save: Ctrl-S
+Open PianoRoll Editor: Ctrl-E
+Open Score Editor: Ctrl-R
+
+Open Recent: Ctrl-S (? collides with "Save"?)
+Config Printer: Ctrl-P
+Quit: Ctrl-Q
+
+Cut: Ctrl-X
+Copy: Ctrl-C
+Paste: Ctrl-V
+Delete Track: Delete
+Add Track: Ctrl-J
+Select all: Ctrl-A
+Deselect All Parts: Ctrl-B
+Open Drums Editor: Ctrl-D
+Open List Editor: Ctrl-L
+Open Graphical Mastertrack Editor: Ctrl-M
+Open List Mastertrack Editor: Shift-Ctrl-M
+Open MIDI Transform Editor: Ctrl-T
+Open Transport Panel: F11
+Open Bigtime Window: F12
+Open Help Browser: F1
+Start "What's This" Mode: Shift-F1
+Toggle Metronome Click: C
+
+Stop Playback / Rewind: Space
+Stop Playback: Insert
+Start Playback: Enter
+Go to left Marker: End (Keypad)
+Go to right marker: CursorDown (Keypad)
+Toggle Loop Mode: / (Keypad)
+Start Recording: * (Keypad)
+
+
+Arranger, Part Canvas:
+======================
+Cut: Ctrl-X
+Copy: Ctrl-C
+Select previous/next part in this track: Crsr-Left / Crsr-Right
+Remove Part: Delete
+
+
+Arranger, Track List Canvas:
+============================
+Move to previous track: Crsr-Up
+Move to next track: Crsr-Down
+
+
+Pianoedit:
+==========
+Cut: Ctrl-X
+Copy: Ctrl-C
+Paste: Ctrl-V
+Select All: Ctrl-A (just added in CVS)
+Deselect All: Ctrl-Shift-A (just added in CVS)
+Invertion Selection: Ctrl-I (just added in CVS)
+Delete selected Events: Delete
+
+Insert Notes at locator position: Shift-Crsr-Right
+Move Locator right: Crsr-Right
+Move Locator left: Crsr-Left
+Delete under Locator: Delete (KP?), "collects" notes left of locator
+Set Grid Snap/Quantizer to 1/1, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64:
+1/2/3/4/5/6/7
+Toggle "triolic" flag of Grid Snap/Quantizer: T
+Toggle "punctuated" flag of Grid Snap/Quantizer: .
+Set Grid Snap/Quantizer to "first value in list"(?): ,
+Open "Event Color" dialog: e (just fixed in CVS)
+
+
+Drumedit:
+=========
+Cut: Ctrl-X
+Copy: Ctrl-C
+Paste:Ctrl-V
+Load Drummap: Ctrl-O
+Save Drummap: Ctrl-S
+Set fixed length: Alt-L (Sets length on selected events to the length specified in the drummap)
+
+Delete selected Events: Delete
+
+Listedit:
+=========
+Insert Note: Ctrl-N
+Insert SysEx: Ctrl-S
+Insert Ctrl: Ctrl-T
+Insert Pitch: Ctrl-E
+Insert Channel Aftertouch: Ctrl-A
+Insert Key Aftertouch: Ctrl-P
+Delete Events: Delete
+
+
+Score Edit:
+===========
+When entering Lyrics:
+Move to next Note's Lyrics: Crsr-Left (problems when at beginning/end of
+notes)
+Move to previous Note' Lyrics: Crsr-Right
+Cancel (?) entering notes: Escape
+Remove last character from lyrics: Backspace or Delete
+End entering Lyrics: Enter
+
+
+Help Browser:
+=============
+New Window: Alt-N
+Open File: Alt-O
+Print: Alt-P
+Close: Alt-Q
+Exit: Alt-X
+
+
+Transport:
+==========
+Toggle metronome Click: C
+Toggle Loop Mode: / (Keypad)
+
diff --git a/muse/doc/README.softsynth b/muse/doc/README.softsynth
new file mode 100644
index 00000000..e3201ff2
--- /dev/null
+++ b/muse/doc/README.softsynth
@@ -0,0 +1,86 @@
+=============================================================
+ Short instructions to get the soft
+ synthesizer up and running
+=============================================================
+
+1. Compile and install MusE
+
+3. Run MusE from an xterm with Option "-D";
+ look at the debug output in the xterm; you should see something
+ like:
+
+ 3 soft synth found
+ found soft synth <fluid> <fluid soft synth>
+ found soft synth <organ> <organ soft synth>
+ found soft synth <S1> <organ soft synth>
+
+
+4. Configure Software Synthesizer
+
+ Open Settings->MidiPorts/SoftSynth.
+
+ - select a software synthesizer
+ - press "Add Instance" to create an istance of this
+ synthesizer; the synthi shows up in the list
+ of instances with a unique name
+
+5. Configure Midi Port
+
+ To use the synthesizer instance you must
+ connect it to a MusE midi port:
+
+ - click into the "Device Name" column of an empty midi port
+ (Device Name == "none")
+ - select the synthesizer from the dropdown menu.
+
+ This connects the synthesizer to the selected midi port.
+ The instrument type is automatically set.
+
+6. Open the Audio Mixer
+
+ You see a new mixer strip of type "Synthi" and the name
+ of the new created synthesizer instance.
+
+ Route the audio output of this strip to "Output".
+ (per default the synthesizer is routed to the first Output strip)
+
+7. Now you are ready to play with the "organ" synthesizer
+
+ - create midi track
+ - set the midi port to the synthesizer port
+ - click the "R" column in the tracklist to enable "Recording"
+
+8. Optional: open Configure->MidiPorts and click in column GUI
+ to show a GUI for the synthesizer instance.
+ There is no gui available for the S1 synth.
+ The iiwu gui enables you to enter a different sound font.
+ The organ gui has some "draw bars" to let you play with
+ sounds in real time.
+
+These are the software synthesizers currently available:
+
+ - S1 a simple sythesizer skeleton as a guide for all who
+ want to code their own one:
+ - only one tone at a time
+ - simple sinus wave form
+ - no gui
+ The synthi may be used as a metronome.
+
+ - organ, an adapted version of the LADSPA plugin
+ "Organ - Additive Organ Synthesizer Voice" from
+ David A. Bartold
+
+ "organ" implements a gui connected bidirectional
+ to the synth via stdin/stdout
+
+ - fluid, is the adapted version of Peter Hanappe´s
+ sample based fluid synthesizer (formerly known as iiwu)
+ - loadable sound fonts
+ - multi timbral
+ - 128 voices
+ - simple gui lets you load a different sound font
+ Fluid loads a default sound font determined by the
+ environment variable "DEFAULT_SOUNDFONT".
+
+
+
diff --git a/muse/doc/README.translate b/muse/doc/README.translate
new file mode 100644
index 00000000..d169e35f
--- /dev/null
+++ b/muse/doc/README.translate
@@ -0,0 +1,62 @@
+Internationalisation
+
+If you want to contribute a translation the following hints
+may be of help to you:
+
+
+Step 1:
+ enter the MusE directory and edit the
+ file "muse.pro"
+
+ Append a new target file name at "TRANSLATIONS"
+ e.g. change
+ TRANSLATIONS = share/locale/muse_de.ts
+ into
+ TRANSLATIONS = share/locale/muse_de.ts \
+ share/locale/muse_fr.ts
+ if you want to generate a french MusE version.
+
+Step 2:
+ start the Qt-Program "lupdate"
+
+ lupdate muse.pro
+
+ Maybe "lupdate" is not in your PATH and you must
+ specify the complete pathname "lupdate"
+ Example:
+ /usr/qt3-2/bin/lupdate muse.pro
+
+ This generates the file "locale/muse_fr.ts".
+
+Step 3:
+ Edit "locale/muse_fr.ts" manually or use the Qt "linguist" tool:
+
+ linguist muse_fr.ts
+
+Step 4:
+ Save the edited file "muse_fr.ts" from linguist and
+ start File->Release. This generates the file "locale/muse_fr.qm"
+
+ or
+
+ start the Qt program "lrelease"
+
+ lrelease muse.pro
+
+ This generates all *.qm files.
+
+Step 5:
+ install the *.qm files: as superuser start "make install"
+
+
+Step 6:
+ Test:
+ set the environment variable LANG to the desired
+ Language:
+ export LANG=fr
+
+ Start MusE:
+ muse
+
+
+
diff --git a/muse/doc/dimpl/dimpl.pdf b/muse/doc/dimpl/dimpl.pdf
new file mode 100644
index 00000000..0e055d37
--- /dev/null
+++ b/muse/doc/dimpl/dimpl.pdf
Binary files differ
diff --git a/muse/doc/dimpl/dimpl.tex b/muse/doc/dimpl/dimpl.tex
new file mode 100644
index 00000000..81bc23c8
--- /dev/null
+++ b/muse/doc/dimpl/dimpl.tex
@@ -0,0 +1,773 @@
+%====================================================================
+% Muse
+% Design & Implementation
+%
+% (C) 2005 Copyright: Werner Schweer and Others
+%====================================================================
+
+%----------------------------------------------------------
+% Setup
+%----------------------------------------------------------
+
+%\showframe
+%\showsetups
+\usemodule[chart]
+\setupcolors[state=start]
+\setupbodyfont[Palatino]
+\language[en]
+\enableregime[il1]
+
+\startuseMPgraphic{FunnyFrame}
+ picture p; numeric o; path a, b; pair c;
+ p := textext.rt(\MPstring{FunnyFrame});
+ o := BodyFontSize;
+ a := unitsquare xyscaled(OverlayWidth,OverlayHeight);
+ p := p shifted (20, OverlayHeight-ypart center p);
+ drawoptions (withpen pencircle scaled 1pt withcolor .625red);
+ b := a superellipsed .95;
+ fill b withcolor .85white; draw b;
+ b := (boundingbox p) superellipsed .95;
+ fill b withcolor .85white; draw b;
+ draw p withcolor black;
+ setbounds currentpicture to a;
+ \stopuseMPgraphic
+
+\defineoverlay[FunnyFrame][\useMPgraphic{FunnyFrame}]
+\defineframedtext[FunnyText][frame=off,background=FunnyFrame]
+\def\StartFrame{\startFunnyText}
+\def\StopFrame{\stopFunnyText}
+\def\FrameTitle#1%
+ {\setMPtext{FunnyFrame}{\hbox spread 1em{\hss\strut#1\hss}}}
+\setMPtext{FunnyFrame}{}
+
+
+\define\M{Muse}
+\define[1]\Index{{\it #1}\marginpar{#1}\index{#1}}
+
+\defineindenting[Cmdi][text=,separator=,width=fit,distance=1em]
+
+\define[1]\Cmd{
+ \Cmdi
+ \framed[
+ background=color,
+ width=fit,
+ align=right,
+ backgroundcolor=lightgray,
+ framecolor=blue]
+ {\tt\space #1}}
+
+\define[2]\CCmd{
+ \Cmdi
+ \framed[
+ background=color,
+ width=broad,
+ align=right,
+ backgroundcolor=lightgray,
+ framecolor=blue]
+ {\vbox{\hbox{\tt\space #1}\hbox{\tt\space #2}}}}
+
+
+%\define\startdescription{\startpacked}
+\define\startdescription{}
+%\define\stopdescription{\stoppacked}
+\define\stopdescription{}
+
+\define[1]\Fig{\hbox{\externalfigure[pics/#1]}}
+
+\define[2]\Screen{
+ \placefigure[here][fig:#1]{#2}{\externalfigure[pics/#1][scale=1600]}
+ }
+\define[1]\Noten{
+ \blank[line]
+ {\externalfigure[pics/#1][scale=700]}
+ \blank[line]
+ }
+
+\definedescription[Option][
+ location=left,
+ headstyle=bold,
+ width=4em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[Filetype][
+ location=left,
+ headstyle=bold,
+ width=4em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[FileList][
+ location=left,
+ headstyle=bold,
+ width=7em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[Input][
+ location=left,
+ headstyle=bold,
+ width=9em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[InputN][
+ location=left,
+ headstyle=bold,
+ width=6em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\define[2]\Figure{
+ \placefigure
+ [#1][fig:#2]{}
+ {\externalfigure[pics/#2]}
+ }
+
+\define[1]\Menu{
+ \placefigure[right][fig:#1]{}
+ {\externalfigure[pics/#1][scale=2000]}
+ }
+
+\definedescription[Opt][location=hanging,headstyle=bold,width=broad]
+
+\setuptyping[before=\blank\startbackground, after=\stopbackground\blank] % source code with background
+\setupwhitespace[medium]
+
+%----------------------------------------------------------
+% Body
+%----------------------------------------------------------
+
+\starttext
+ \language[en]
+ \mainlanguage[en]
+ \startstandardmakeup[doublesided=no]
+ \definebodyfont[10pt,11pt,12pt][rm][tfe=Regular at 48pt]
+ \tfe\setupinterlinespace
+ \hfill \color[red]{\M}\par
+ \hfill \color[blue]{Design \&}\par
+ \hfill \color[blue]{Implementation}\par
+ \vfill
+ \definebodyfont[10pt,11pt,12pt][rm][tfb=Regular at 24pt]
+ \tfb\setupinterlinespace
+ \hfill Version 1.0\par
+%% \hfill April 2005\par
+%% \hfill Werner Schweer
+ \stopstandardmakeup
+
+ \startstandardmakeup[page=no]
+ \vfill
+ \M\ is hosted on SourceForge:\par
+ \type{http://lmuse.sourceforge.net/}
+ \blank[line]
+ This document was created using \pdfTeX\ and the
+ \ConTeXt\ macro package.
+ \blank[line]
+ \copyright 2005 Werner Schweer and Others
+ \stopstandardmakeup
+
+ \completecontent
+
+%%
+%%=======================================================================
+%% File Formats
+%%=======================================================================
+%%
+
+\chapter{File Formats}
+ \section{Instrument Definition Files}
+
+ \M\ Instrument Definition Files are used to describe the
+ properties of external midi instruments.
+
+ IDF-Files have the file extension \type{*.idf} \index{idf} and
+ they are searched in the \M\ "instruments" subdirectory (which is on
+ my system \type{/usr/share/muse-1.0/instruments}.
+
+ An instrument\index{Instrument definition} is a property of the
+ midi ouput port \index{Midi output port}.
+ All found instrument definitions are presented by MusE
+ in the Instrument pulldown menu of the midi output port.
+
+ Example of an instrument definition file:
+ \blank
+\starttyping
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="GM">
+ <Init>
+ ...MusE event list which initializes instrument
+ </Init>
+ <PatchGroup name="Piano">
+ <Patch name="Grand Piano" prog="0"/>
+ <Patch name="Bright Piano" prog="1"/>
+ ...
+ </PatchGroup>
+ <PatchGroup name="Bass">
+ <Patch name="Acoustic Bass" prog="32"/>
+ <Patch name="Fingered Bass" prog="33"/>
+ </PatchGroup>
+ ...
+ <Controller name="Brightness">
+ <n>0x4a</n>
+ <min>0</min>
+ <max>127</max>
+ <init>0</init>
+ </Controller>
+ ...
+ </MidiInstrument>
+ </muse>
+\stoptyping
+ \blank
+
+ PatchGroups\index{PatchGroups} are not mandatory; its valid to write:
+
+ \blank
+\starttyping
+<MidiInstrument name="GM">
+ <Patch name="Grand Piano" prog="0"/>
+ <Patch name="Bright Piano" prog="1"/>
+ <Patch name="Acoustic Bass" prog="32"/>
+ <Patch name="Fingered Bass" prog="33"/>
+ ...
+ </MidiInstrument>
+\stoptyping
+ \blank
+
+ An instrument definition file should only define one
+ instrument.
+
+ The "prog" parameter in a "Patch" is mandatory. Missing
+ "hbank" or "lbank" are treated as "don't care".
+ Missing "drum" is treated as drum="0".
+
+ A XG-Patch looks like this:
+
+ \blank
+ \starttyping
+<Patch name="Electro" drum="1" hbank="127"
+ lbank="0" prog="24"/>
+ \stoptyping
+ \blank
+
+ A patch can be associated with a "mode" with one of:
+ \blank[medium]
+ \Option{1} - GM\par
+ \Option{2} - GS\par
+ \Option{4} - XG\par
+ \blank[big]
+
+ Example:
+
+ \blank
+ \starttyping
+<Patch name="Electro" mode="4" drum="1" hbank="127"
+ lbank="0" prog="24"/>
+ \stoptyping
+ \blank
+
+ Mode id's can be ore'd together for patches which are valid
+ for more than one mode:
+
+ \blank
+ \starttyping
+<Patch name="Grand Piano" mode=7" hbank="0" lbank="0" prog="0"/>
+ \stoptyping
+ \blank
+
+ example for MusE event (Sysex "XG-On"):
+
+ \blank
+ \starttyping
+<event tick="0" type="5" datalen="7">
+ 43 10 4c 00 00 7e 00
+ </event>
+ \stoptyping
+ \blank
+
+ \type{<Init> ... </Init>} part can be omitted
+
+
+ Controller\index{Controller} have the following properties:
+
+ \starttabulate
+ \NC name:\NC
+ arbitrary unique (short) string describing the controller\NC\NR
+ \NC n:\NC
+ controller number, defines also the controller type:\par
+ values from \type{0x0 - 0x7f} are 7Bit controller\par
+ values from \type{0x1000 - 0x1ffff} are 14 bit controller with
+ MSB/LSB value pairs\par
+ values from \type{0x20000 - 0x2ffff} are RPN's\par
+ values from \type{0x30000 - 0x3ffff} are NRPN's
+ \NC\NR
+ \NC min:\NC minimum value for controller\NC\NR
+ \NC max:\NC maximum value for controller\NC\NR
+ \NC init:\NC
+ reset value for controller; when controller value is
+ undefined after instrument reset, use the ''undefined''
+ value \type{0x10000}
+ \NC\NR
+ \stoptabulate
+
+ the min/max/init values can be ommited
+
+%%
+%%=======================================================================
+%% Midi Plugins
+%%=======================================================================
+%%
+\chapter{Plugins}
+ \section{Midi Plugins}
+
+
+ Midi plugins have the file extension \type{*.so} and they are
+ searched in the \M\ "\type{midiplugins}" subdirectory (which is on
+ my system \type{/usr/lib/muse-1.0/midiplugins}.
+
+%
+%-----------------------------------
+% Midi Filter
+%-----------------------------------
+%
+ \subsection{Midi Filter}
+
+ Example for an midi plugin which does essentially nothing:
+
+ First define your custom \type{Filter} class with \type{Mempi}
+ as base class.
+
+\starttyping
+#include "../libmidiplugin/mempi.h"
+
+class Filter : public Mempi {
+ virtual void process(unsigned, unsigned,
+ MPEventList*, MPEventList*);
+
+ public:
+ Filter(const char* name, const MempiHost*);
+ ~Filter() {}
+ virtual bool init() { return false; }
+ };
+
+Filter::Filter(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ }
+\stoptyping
+
+ Now comes the main \type{Mempi} function you have to implement:
+ \type{process()} which has two parameters, an midi event input
+ list and an midi event output list. The example code simply
+ copies all events from the input list to the output list.
+
+\starttyping
+void Filter::process(unsigned, unsigned, MPEventList* il,
+ MPEventList* ol)
+ {
+ for (iMPEvent i = il->begin(); i != il->end(); ++i) {
+ ol->insert(*i);
+ }
+ }
+\stoptyping
+
+ When loading the plugin, the \type{Mempi} Host looks for
+ the symbol \type{mempi_descriptor}. This function returns a
+ pointer to the plugin class description you have to fill in.
+
+\starttyping
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new Filter(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "Filter",
+ "MusE Zero Filter",
+ "0.1", // filter version string
+ MEMPI_FILTER, // plugin type
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+\stoptyping
+
+
+%
+%-----------------------------------
+% GUI interface
+%-----------------------------------
+%
+\subsection{GUI interface}
+ Every midi plugin can implement a native graphical user
+ interface (GUI). For this you have to overload five
+ virtual functions.
+
+\starttyping
+ virtual bool hasGui() const { return true; }
+\stoptyping
+ This function informs the host whether there is an GUI or not.
+
+\starttyping
+ virtual bool guiVisible() const { return gui->isVisible(); }
+\stoptyping
+ This fuction returns \type{true} if your GUI is visible.
+
+\starttyping
+ virtual void showGui(bool val) const { gui->setShown(val); }
+\stoptyping
+ This function shows or hides the GUI.
+
+ There are two helper functions the plugin host uses to save
+ and restore the GUI geometry across sessions:
+
+\starttyping
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+\stoptyping
+
+%
+%-----------------------------------
+% Persistent Parameters
+%-----------------------------------
+%
+\subsection{Persistent Parameters}
+
+ The plugin host can save and restore plugin parameter across
+ sessions. When the host saves his session status, he calls
+ the midi plugin function:
+
+\starttyping
+ virtual void getInitData(int* len, const unsigned char**p) const;
+\stoptyping
+
+ You can overload this function to return a pointer to your
+ session data and the len of the data block.
+
+ When the session is restored, the host calls
+
+\starttyping
+ virtual void setInitData(int len, const unsigned char* p);
+\stoptyping
+
+ which you can use to restore the last plugin state.
+%
+%-----------------------------------
+% Host Access Functions
+%-----------------------------------
+%
+
+\subsection{Host Access Functions}
+
+ The plugin host supplies some functions which are
+ accessible through the \type{MempiHost*} in the
+ \type{Mempi} interface.
+
+ The host supplies the following functions:
+
+\starttyping
+ int division() const;
+\stoptyping
+ \index{division()}
+ returns the midi \type{division} value which gives the number
+ of midi ticks per midi beat, typically 384.
+
+\starttyping
+ int tempo(unsigned tick) const;
+\stoptyping
+ \index{tempo()}
+ returns the midi tempo value.
+
+\starttyping
+ unsigned tick2frame(unsigned tick) const;
+\stoptyping
+ \index{tick2frame()}
+ This function converts a transport position given in midi ticks
+ to a audio frame position.
+
+\starttyping
+ unsigned frame2tick(unsigned frame) const;
+\stoptyping
+ \index{frame2tick()}
+ This function converts a transport position given in audio frames
+ to midi ticks.
+
+\starttyping
+ void bar(int tick, int* bar, int* beat, unsigned* rest) const;
+\stoptyping
+ \index{bar()}
+ This function return bar/beat and a tick rest for a given
+ tick position.
+
+\starttyping
+ unsigned bar2tick(int bar, int beat, int tick) const;
+\stoptyping
+ This is the opposite to the \type{bar} function. It converts
+ a time position given in bar/beat/tick into a midi tick value.
+
+%
+%-----------------------------------
+% Midi Synthesizer
+%-----------------------------------
+%
+\subsection{Midi Synthesizer}
+ As an example for a midi synthesizer plugin we use a midi
+ metronome.
+
+ Lets start with the class definition:
+
+\starttyping
+#include "../libmidiplugin/mempi.h"
+
+//---------------------------------------------------------
+// metronom - simple midi metronom
+//---------------------------------------------------------
+
+class Metronom : public Mempi {
+
+ protected:
+ struct InitData {
+ char measureNote;
+ char measureVelo;
+ char beatNote;
+ char beatVelo;
+ } data;
+ MetronomGui* gui;
+ friend class MetronomGui;
+
+ unsigned int nextTick;
+ unsigned int lastTo;
+
+ virtual void process(unsigned, unsigned, MPEventList*,
+ MPEventList*);
+
+ public:
+ Metronom(const char* name, const MempiHost*);
+ ~Metronom();
+ virtual bool init();
+
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+\stoptyping
+
+%
+%-----------------------------------
+% MESS interface
+%-----------------------------------
+%
+\chapter {The M.E.S.S (MusE Experimental Software Synthesizer) API}
+
+ M.E.S.S.\index{M.E.S.S.} stands for MusE Experimental Soft Synth and is
+ an API/interface (like DSSI) to enable programmers to easily create their
+ own softsynths.
+
+ The interface for a M.E.S.S.-synth consists of two classes, the Mess and
+ MessGui. In short, the framework provides the Mess (the synth) midi data
+ (notes, controllers and sysexes) and methods that handle the IPC between
+ the gui and the synth, so the programmer can focus on DSP-issues instead.
+
+ The interface for the synth is specified in the mess.h file in the libsynti
+ directory. The interface for the MessGui is specified in the gui.h file.
+
+\starttyping
+//---------------------------------------------------------
+// Mess
+// MusE experimental software synth
+// Instance virtual interface class
+//---------------------------------------------------------
+
+class Mess {
+ MessP* d;
+
+ int _sampleRate;
+ int _channels; // 1 - mono, 2 - stereo
+
+ public:
+ Mess(int channels);
+ virtual ~Mess();
+
+ int channels() const { return _channels; }
+ int sampleRate() const { return _sampleRate; }
+ void setSampleRate(int r) { _sampleRate = r; }
+
+ virtual void process(float** data, int offset, int len) = 0;
+
+ // the synti has to (re-)implement processEvent() or provide
+ // some of the next three functions:
+
+ virtual bool processEvent(const MidiEvent&);
+ virtual bool setController(int, int, int) { return false; }
+ virtual bool playNote(int, int, int) { return false; }
+ virtual bool sysex(int, const unsigned char*) { return false; }
+
+ virtual void getInitData(int*, const unsigned char**) const {}
+ virtual int getControllerInfo(int, const char**, int*, int*, int*) const {return 0;}
+ virtual const char* getPatchName(int, int, int) const { return "?"; }
+ virtual const MidiPatch* getPatchInfo(int, const MidiPatch*) const { return 0; }
+
+ // synthesizer -> host communication
+ void sendEvent(MidiEvent); // called from synti
+ MidiEvent receiveEvent(); // called from host
+ int eventsPending() const;
+
+ // GUI interface routines
+ virtual bool hasGui() const { return false; }
+ virtual bool guiVisible() const { return false; }
+ virtual void showGui(bool) {}
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int) {}
+ };
+\stoptyping
+
+\section{Overview of virtual member functions}
+ This is a short description of the virtual functions in the Mess-class:
+\subsection{process}
+\starttyping
+virtual void process(float** data, int offset, int len) = 0;
+\stoptyping
+ This is where the audio processing takes place. The Mess is called with a float array, and
+ it's up to the programmer to fill it with data beginning at data[offset] to data[offset+len].
+
+\subsection{processEvent}
+ There are two ways to go when it comes to how midi data is fed into the Mess. You can either
+ implement processEvent and manage the different event types (controllers, sysexes and notes)
+ or implement one or more of the setController, playNote and sysex functions.
+
+
+ Note that overriding processEvent results in setController, playNote and sysex
+ not being called!
+
+\subsection{setController, playNote, sysex}
+ The setController, playNote and sysex functions should return false if the event was
+ processed, true if the synth was busy.
+
+\starttyping
+virtual bool setController(int channel, int controller_no, int value)
+
+virtual bool playNote(int channel, int pitch, int velo)
+
+virtual bool sysex(int length, const unsigned char* data)
+\stoptyping
+
+\subsection{getInitData}
+ MusE provides an interface for storing the state of the synth in the project file.
+ getInitData is called when the project is saved, and provides a pointer to a data
+ block where you store the data which will recreate the synths current state when
+ the project is reopened.
+\starttyping
+virtual void getInitData(int* nrofchars, const unsigned char** data) const {}
+\stoptyping
+
+\subsection{getControllerInfo}
+ getControllerInfo is called when the Mess is instantiated, and this is where
+ you tell MusE which controllers the Mess supports. The function is called
+ repeteadly: just fill in the values for the controller and return the index
+ you want to be sent next time. Return 0 when you've given MusE information about
+ all controllers your Mess supports.
+
+ As you can see, the necessary parameters are an index (used internally), a name
+ for the controller, an int describing the actual controller number (f.ex. 91 for
+ reverb), and finally min and max values for the controller.
+
+\starttyping
+virtual int getControllerInfo(int index,
+ const char** name,
+ int* controller,
+ int* min,
+ int* max) const
+\stoptyping
+
+\subsection{hasGui}
+ hasGui is called when the Mess is instantiated, and tells MusE if the synth has
+ a gui or not.
+\starttyping
+virtual bool hasGui() const;
+\stoptyping
+
+\subsection{showGui}
+showGui is called from MusE when the gui is supposed to be visible
+\starttyping
+virtual void showGui(bool show);
+\stoptyping
+
+\subsection{getPatchName, getPatchInfo}
+ getPatchName and getPatchInfo are used to give MusE information about patches,
+ which can be selected in the track inspector.
+
+ The getPatchName function specifies three parameters to be passed: channel,
+ program, and a third that is unused. It is the responsibility for the synth
+ to return the patchname for the particular channel and a program.
+
+\starttyping
+virtual const char* SimpleSynth::getPatchName(int channel, int program, int unused) const
+\stoptyping
+
+ getPatchInfo is called repeatedly until the synth returns 0. The synth must
+ send information back in a MidiPatch struct. The MidiPatch parameter sent
+ contains information on the last MidiPatch that was sent from the synth
+ (a null pointer on first call).
+
+\starttyping
+virtual const MidiPatch* getPatchInfo(int channel,
+ const MidiPatch* previouspatch)
+ const;
+
+struct MidiPatch {
+ signed char type; // 1 - GM 2 - GS 4 - XG
+ signed char hbank, lbank, prog;
+ const char* name;
+ };
+\stoptyping
+
+
+\subsection{Descriptor}
+ Since the synths are built as shared libraries, you need to specify a descriptor
+ for your MESS. They look something like this: (example taken from SimpleSynth/SimpleDrums)
+
+\starttyping
+static Mess* instantiate(int sr, QWidget*, const char* name)
+ {
+ printf("SimpleSynth sampleRate %d\n", sr);
+ SimpleSynth* synth = new SimpleSynth(sr);
+ if (!synth->init(name)) {
+ delete synth;
+ synth = 0;
+ }
+ return synth;
+ }
+extern "C"
+ {
+ static MESS descriptor = {
+ "SimpleSynth",
+ "Mathias Lundgren (lunar_shuttle@users.sf.net)",
+ "0.1", //Version string
+ MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
+ instantiate,
+ };
+ const MESS* mess_descriptor() { return &descriptor; }
+ }
+\stoptyping
+
+\section{MessGui}
+ For the Gui, there's really only one method that is interesting, processEvent.
+ processEvent in the gui is called whenever the synth sends it a midiEvent, which
+ it does with send(MidiEvent ).
+ Since this is the only method of communicating the gui can send midimessages
+ to the synth via sendEvent, sendController and sendSysex calls.
+\starttyping
+virtual void processEvent(const MidiPlayEvent&) {};
+\stoptyping
+
+
+\completeindex
+\stoptext
diff --git a/muse/doc/man/de/man-de.tex b/muse/doc/man/de/man-de.tex
new file mode 100644
index 00000000..04fc20c2
--- /dev/null
+++ b/muse/doc/man/de/man-de.tex
@@ -0,0 +1,173 @@
+%====================================================================
+% MusE Manual
+% dies ist das MusE Manual
+%
+% (C) 2006 Copyright: Werner Schweer und Andere
+%====================================================================
+
+%----------------------------------------------------------
+% Setup
+%----------------------------------------------------------
+
+%\showframe
+%\showsetups
+\usemodule[chart]
+\setupcolors[state=start]
+\setupbodyfont[Palatino]
+\language[de]
+\enableregime[il1]
+
+\startuseMPgraphic{FunnyFrame}
+ picture p; numeric o; path a, b; pair c;
+ p := textext.rt(\MPstring{FunnyFrame});
+ o := BodyFontSize;
+ a := unitsquare xyscaled(OverlayWidth,OverlayHeight);
+ p := p shifted (20, OverlayHeight-ypart center p);
+ drawoptions (withpen pencircle scaled 1pt withcolor .625red);
+ b := a superellipsed .95;
+ fill b withcolor .85white; draw b;
+ b := (boundingbox p) superellipsed .95;
+ fill b withcolor .85white; draw b;
+ draw p withcolor black;
+ setbounds currentpicture to a;
+ \stopuseMPgraphic
+
+\defineoverlay[FunnyFrame][\useMPgraphic{FunnyFrame}]
+\defineframedtext[FunnyText][frame=off,background=FunnyFrame]
+\def\StartFrame{\startFunnyText}
+\def\StopFrame{\stopFunnyText}
+\def\FrameTitle#1%
+ {\setMPtext{FunnyFrame}{\hbox spread 1em{\hss\strut#1\hss}}}
+\setMPtext{FunnyFrame}{}
+
+
+\define\M{MusE}
+\define[1]\Index{{\it #1}\marginpar{#1}\index{#1}}
+
+\defineindenting[Cmdi][text=,separator=,width=fit,distance=1em]
+
+\define[1]\Cmd{
+ \Cmdi
+ \framed[
+ background=color,
+ width=fit,
+ align=right,
+ backgroundcolor=lightgray,
+ framecolor=blue]
+ {\tt\space #1}}
+
+\define[2]\CCmd{
+ \Cmdi
+ \framed[
+ background=color,
+ width=broad,
+ align=right,
+ backgroundcolor=lightgray,
+ framecolor=blue]
+ {\vbox{\hbox{\tt\space #1}\hbox{\tt\space #2}}}}
+
+
+%\define\startdescription{\startpacked}
+\define\startdescription{}
+%\define\stopdescription{\stoppacked}
+\define\stopdescription{}
+
+\define[1]\Fig{\hbox{\externalfigure[pics/#1]}}
+
+\define[2]\Screen{
+ \placefigure[here][fig:#1]{#2}{\externalfigure[pics/#1][scale=1600]}
+ }
+\definedescription[Option][
+ location=left,
+ headstyle=bold,
+ width=4em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[Sc][
+ location=left,
+ headstyle=bold,
+ width=4em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[Filetype][
+ location=left,
+ headstyle=bold,
+ width=4em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[FileList][
+ location=left,
+ headstyle=bold,
+ width=7em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[Input][
+ location=left,
+ headstyle=bold,
+ width=9em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[InputN][
+ location=left,
+ headstyle=bold,
+ width=6em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\define[2]\Figure{
+ \placefigure
+ [#1][fig:#2]{}
+ {\externalfigure[pics/#2]}
+ }
+
+\define[1]\Menu{
+ \placefigure[right][fig:#1]{}
+ {\externalfigure[pics/#1][scale=2000]}
+ }
+
+\definedescription[Opt][location=hanging,headstyle=bold,width=broad]
+
+%----------------------------------------------------------
+% Body
+%----------------------------------------------------------
+
+\starttext
+ \language[de]
+ \mainlanguage[de]
+ \startstandardmakeup[doublesided=no]
+ \definebodyfont[10pt,11pt,12pt][rm][tfe=Regular at 48pt]
+ \tfe\setupinterlinespace
+ \hfill \color[red]{\M}\par
+ \hfill \color[blue]{Manual}\par
+ \vfill
+ \hfill \color[blue]{DE}\par
+ \definebodyfont[10pt,11pt,12pt][rm][tfb=Regular at 24pt]
+ \tfb\setupinterlinespace
+ \hfill Version 1.0pre1\par
+ \stopstandardmakeup
+
+ \startstandardmakeup[page=no]
+ \vfill
+ \M\ wird von SourceForge gehostet:\par
+ \type{http://mscore.sourceforge.net/}
+ \blank[line]
+ Dieses Dokument wurde mit \pdfTeX\ und dem Macro Paket
+ \ConTeXt\ erstellt.
+ \blank
+ \copyright 2006 Werner Schweer und Andere
+ \stopstandardmakeup
+
+ \completecontent
+
+\chapter{Einführung}
+ \section{Was ist \M?}
+ \M\ ist ein ein "open source" Programm, veröffentlicht unter der GNU General
+ Public License (GPL) (siehe Appendix).
+
+\completeindex
+\stoptext
diff --git a/muse/doc/man/en/man-en.tex b/muse/doc/man/en/man-en.tex
new file mode 100644
index 00000000..d05123e2
--- /dev/null
+++ b/muse/doc/man/en/man-en.tex
@@ -0,0 +1,302 @@
+%====================================================================
+%
+% MusE Manual
+% this is the MusE manual
+%
+% (C) 2006 Copyright: Werner Schweer and Others
+%====================================================================
+
+%----------------------------------------------------------
+% Setup
+%----------------------------------------------------------
+
+%\showframe
+%\showsetups
+\usemodule[chart]
+\setupcolors[state=start]
+\setupbodyfont[Palatino]
+\language[en]
+\enableregime[il1]
+
+\startuseMPgraphic{FunnyFrame}
+ picture p; numeric o; path a, b; pair c;
+ p := textext.rt(\MPstring{FunnyFrame});
+ o := BodyFontSize;
+ a := unitsquare xyscaled(OverlayWidth,OverlayHeight);
+ p := p shifted (20, OverlayHeight-ypart center p);
+ drawoptions (withpen pencircle scaled 1pt withcolor .625red);
+ b := a superellipsed .95;
+ fill b withcolor .85white; draw b;
+ b := (boundingbox p) superellipsed .95;
+ fill b withcolor .85white; draw b;
+ draw p withcolor black;
+ setbounds currentpicture to a;
+ \stopuseMPgraphic
+
+\defineoverlay[FunnyFrame][\useMPgraphic{FunnyFrame}]
+\defineframedtext[FunnyText][frame=off,background=FunnyFrame]
+\def\StartFrame{\startFunnyText}
+\def\StopFrame{\stopFunnyText}
+\def\FrameTitle#1%
+ {\setMPtext{FunnyFrame}{\hbox spread 1em{\hss\strut#1\hss}}}
+\setMPtext{FunnyFrame}{}
+
+
+\define\M{MusE}
+\define[1]\Index{{\it #1}\marginpar{#1}\index{#1}}
+
+\defineindenting[Cmdi][text=,separator=,width=fit,distance=1em]
+
+\define[1]\Cmd{
+ \Cmdi
+ \framed[
+ background=color,
+ width=fit,
+ align=right,
+ backgroundcolor=lightgray,
+ framecolor=blue]
+ {\tt\space #1}}
+
+\define[2]\CCmd{
+ \Cmdi
+ \framed[
+ background=color,
+ width=broad,
+ align=right,
+ backgroundcolor=lightgray,
+ framecolor=blue]
+ {\vbox{\hbox{\tt\space #1}\hbox{\tt\space #2}}}}
+
+
+%\define\startdescription{\startpacked}
+\define\startdescription{}
+%\define\stopdescription{\stoppacked}
+\define\stopdescription{}
+
+\define[1]\Fig{\hbox{\externalfigure[pics/#1]}}
+
+\define[2]\Screen{
+ \placefigure[here][fig:#1]{#2}{\externalfigure[pics/#1][scale=1600]}
+ }
+\definedescription[Option][
+ location=left,
+ headstyle=bold,
+ width=4em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[Sc][
+ location=left,
+ headstyle=bold,
+ width=4em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[Filetype][
+ location=left,
+ headstyle=bold,
+ width=6em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[FileList][
+ location=left,
+ headstyle=bold,
+ width=7em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[Input][
+ location=left,
+ headstyle=bold,
+ width=9em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\definedescription[InputN][
+ location=left,
+ headstyle=bold,
+ width=6em,
+ before={\startnarrower[left]\setupblank[0pt]},
+ after={\stopnarrower\setupblank}]
+
+\define[2]\Figure{
+ \placefigure
+ [#1][fig:#2]{}
+ {\externalfigure[pics/#2]}
+ }
+
+\define[1]\Menu{
+ \placefigure[right][fig:#1]{}
+ {\externalfigure[pics/#1][scale=2000]}
+ }
+
+\definedescription[Opt][location=hanging,headstyle=bold,width=broad]
+
+%----------------------------------------------------------
+% Body
+%----------------------------------------------------------
+
+\starttext
+ \language[en]
+ \mainlanguage[en]
+ \startstandardmakeup[doublesided=no]
+ \definebodyfont[10pt,11pt,12pt][rm][tfe=Regular at 48pt]
+ \tfe\setupinterlinespace
+ \hfill \color[red]{\M}\par
+ \hfill \color[blue]{Manual}\par
+ \vfill
+ \rightaligned{\externalfigure[../titlelogo.jpg]}
+ \vfill
+ \hfill \color[blue]{EN}\par
+ \definebodyfont[10pt,11pt,12pt][rm][tfb=Regular at 24pt]
+ \tfb\setupinterlinespace
+ \hfill Version 1.0pre1\par
+ \stopstandardmakeup
+
+ \startstandardmakeup[page=no]
+ \vfill
+ \M\ is hosted on SourceForge:\par
+ \type{http://mscore.sourceforge.net/}
+ \blank[line]
+ This document was created using \pdfTeX\ and the macro package
+ \ConTeXt\.
+ \blank
+ \copyright 2006 Werner Schweer and Others
+ \stopstandardmakeup
+
+ \completecontent
+
+\chapter{Introduction}
+ \section{Where from and where to go}
+ There's a long history of sequencers. In the beginning there were
+ only analogue synthesizers, which could only be played live. The classical
+ example is presumably the Moog. After the introduction of MIDI, the first
+ devices appeared where music data could be saved and replayed, in short:
+ Sequencers. To program these devices, i.e. to record and process music can
+ rather be compared with assembler programming of computers than with making
+ music. But soon the first sequencers for computers were developed. At
+ first, one could only process MIDI data, since the corresponding hardware
+ capacities were missing. But those developed at high speed and thus the
+ quality of hardware - and what is most important in this case: sound
+ cards - improved that much, that one could even do without external tape
+ drives. Now multi-track audio on-line recordings were possible and there
+ were even astounding possibilities for the post-editing of large projects.
+ Hard to believe, but nowadays computers can do even more.
+ Software-synthesizers in combination with software sequencers
+ (\M\ for example!) offer apparently unlimited possibilities of
+ variation. In fact, one can compose without even touching the wheel or
+ the button of a "real" synthesizer. It will need time, however, until this
+ software will be affordable, as the prices are immense. That's where \M\
+ enters the game!
+
+ \section{\M\ and its competitors}
+ Of course there will always be "better" programs or not! This decision is
+ due to strongly subjective criteria. On the one hand, it depends on what one
+ is aiming at. On the other hand, it depends on individual technical knowledge
+ in the field of synthesizers/sequencers. To the time that I write this article,
+ there are unfortunately no commercial sequencers for Linux, not to speak of
+ whole studios like Cubase or Logic. So the Linux-user can only choose between
+ a parallel installation either to Mac (if one has a PPC architecture) or to
+ Windows (in case of IBM Hardware). But where do those programs actually beat
+ \M? Certainly not in their price because commercial, proprietary software
+ is expensive. That's where programs like \M\ become interesting because
+ everybody can have it for free. Furthermore they are "open source", which is
+ another important point, because thereby the users get the opportunity of
+ finding bugs themselves and doing away with them.
+
+ Naturally, all projects start small. It's the same with \M. With \M,
+ Linux enters a new dimension of MIDI and Audio processing. Together with
+ Jack, even multi-track on-line recordings can be realized. In the the next
+ few years \M\ will certainly evolve strongly and with some luck there will
+ be an easier installation and more comfortable manuals.
+
+ \section{Features of \M}
+
+ Main features of \M:
+
+ \startitemize[1,packed]
+ \head Arranger
+ The arranger window structures a song into tracks and
+ parts.
+
+ \head Pianoroll Editor
+
+ \head Drum Editor
+
+ \head Mastertrack
+ Allows you to edit tempo changes and time signatures
+
+ \head Controller Editor
+ Allows to graphically edit controller values.
+
+ \head Recording
+ Muse allows simultaneous midi and audio recording.
+ Midi can be recorded non realtime step by step.
+
+ \head Editing
+ Midi and audio editing can be done even during play.
+
+ \head LADSPA, JACK etc. compatible
+
+ \stopitemize
+
+
+\chapter{Invoking \M}
+ \section{Invoking \M}
+ \M\ is invoked from the command line by typing in:
+
+ \Cmd{muse}
+
+ Optionally, you can use command line options of the form:
+
+ \Cmd{muse <options> <midifile>}
+
+ \definedescription[Mops][location=left,headstyle=bold]
+
+ \Mops{\tt <options>:}
+ see below for a list of available options.
+ \Mops{\tt <midifile>:}
+ can be either a standard MIDI file or a \M\ file
+ ({\tt *.med, *.med.gz or *.med.bz2}).
+
+ \section{Command Line Options}
+
+ \M\ accepts some options as listed below:
+
+ \blank[medium]
+ \Option{ -v}print version\par
+ \Option{ -m}MIDI only mode\par
+ \Option{ -d}debug mode: no threads, no RT\par
+ \Option{ -D}debug mode: enable some debug messages\par
+ \Option{ -i}debug mode: trace midi Input\par
+ \Option{ -o}debug mode: trace midi Output\par
+ \Option{ -p}don't load LADSPA plugins\par
+ \blank[big]
+
+ Example:
+
+ \Cmd{muse -i mysong.med}
+
+ will add trace midi input and open mysong.med on startup.
+
+ \section{File types used by \M}
+
+ \Filetype{\textasciitilde/.MusE}
+ \M\ Configuration File (``\textasciitilde´´ refers to your home directory
+ aka "/home/tux")\par
+ \Filetype{\textasciitilde/.musePrj}
+ Hidden Project File; stores list of last projects\par
+ \Filetype{.med}
+ \M\ song file; internal \M format\par
+ \Filetype{.mid}
+ midi file; can be imported or exported\par
+ \Filetype{.kar}
+ karaoke: midi file with additional information; some types
+ can be imported\par
+
+\startappendices
+ \component ../gpl.tex
+ \completeindex
+ \stopappendices
+\stoptext
diff --git a/muse/doc/man/fdl.tex b/muse/doc/man/fdl.tex
new file mode 100644
index 00000000..bdad2a11
--- /dev/null
+++ b/muse/doc/man/fdl.tex
@@ -0,0 +1,510 @@
+%---------The file header---------------------------------------------
+\documentclass[a4paper,12pt]{book} % possibilities : report book article , etc.
+
+\usepackage[english]{babel} %language selection
+\usepackage[T1]{fontenc}
+
+\pagenumbering{arabic}
+
+\usepackage{hyperref}
+\hypersetup{colorlinks,
+ citecolor=black,
+ filecolor=black,
+ linkcolor=black,
+ urlcolor=black,
+ pdftex}
+
+
+\begin{document}
+%---------------------------------------------------------------------
+\chapter{GNU Free Documentation License}
+%\label{label_fdl}
+
+ \begin{center}
+
+ Version 1.2, November 2002
+
+
+ Copyright \copyright 2000,2001,2002 Free Software Foundation, Inc.
+
+ \bigskip
+
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ \bigskip
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+\end{center}
+
+
+\begin{center}
+{\bf\large Preamble}
+\end{center}
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+\begin{center}
+{\Large\bf 1. APPLICABILITY AND DEFINITIONS}
+\addcontentsline{toc}{section}{1. APPLICABILITY AND DEFINITIONS}
+\end{center}
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The \textbf{"Document"}, below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as \textbf{"you"}. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A \textbf{"Modified Version"} of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A \textbf{"Secondary Section"} is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The \textbf{"Invariant Sections"} are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The \textbf{"Cover Texts"} are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A \textbf{"Transparent"} copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called \textbf{"Opaque"}.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The \textbf{"Title Page"} means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section \textbf{"Entitled XYZ"} means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as \textbf{"Acknowledgements"},
+\textbf{"Dedications"}, \textbf{"Endorsements"}, or \textbf{"History"}.)
+To \textbf{"Preserve the Title"}
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+\begin{center}
+{\Large\bf 2. VERBATIM COPYING}
+\addcontentsline{toc}{section}{2. VERBATIM COPYING}
+\end{center}
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+\begin{center}
+{\Large\bf 3. COPYING IN QUANTITY}
+\addcontentsline{toc}{section}{3. COPYING IN QUANTITY}
+\end{center}
+
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+\begin{center}
+{\Large\bf 4. MODIFICATIONS}
+\addcontentsline{toc}{section}{4. MODIFICATIONS}
+\end{center}
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+\begin{itemize}
+\item[A.]
+ Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+
+\item[B.]
+ List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+
+\item[C.]
+ State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+\item[D.]
+ Preserve all the copyright notices of the Document.
+
+\item[E.]
+ Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+\item[F.]
+ Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+
+\item[G.]
+ Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+
+\item[H.]
+ Include an unaltered copy of this License.
+
+\item[I.]
+ Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+
+\item[J.]
+ Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+
+\item[K.]
+ For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+
+\item[L.]
+ Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+
+\item[M.]
+ Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+\item[N.]
+ Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+
+\item[O.]
+ Preserve any Warranty Disclaimers.
+\end{itemize}
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+\begin{center}
+{\Large\bf 5. COMBINING DOCUMENTS}
+\addcontentsline{toc}{section}{5. COMBINING DOCUMENTS}
+\end{center}
+
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+\begin{center}
+{\Large\bf 6. COLLECTIONS OF DOCUMENTS}
+\addcontentsline{toc}{section}{6. COLLECTIONS OF DOCUMENTS}
+\end{center}
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+\begin{center}
+{\Large\bf 7. AGGREGATION WITH INDEPENDENT WORKS}
+\addcontentsline{toc}{section}{7. AGGREGATION WITH INDEPENDENT WORKS}
+\end{center}
+
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+\begin{center}
+{\Large\bf 8. TRANSLATION}
+\addcontentsline{toc}{section}{8. TRANSLATION}
+\end{center}
+
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+\begin{center}
+{\Large\bf 9. TERMINATION}
+\addcontentsline{toc}{section}{9. TERMINATION}
+\end{center}
+
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+\begin{center}
+{\Large\bf 10. FUTURE REVISIONS OF THIS LICENSE}
+\addcontentsline{toc}{section}{10. FUTURE REVISIONS OF THIS LICENSE}
+\end{center}
+
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+\begin{center}
+{\Large\bf ADDENDUM: How to use this License for your documents}
+\addcontentsline{toc}{section}{ADDENDUM: How to use this License for your documents}
+\end{center}
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+\bigskip
+\begin{quote}
+ Copyright \copyright YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+\end{quote}
+\bigskip
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+\bigskip
+\begin{quote}
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+\end{quote}
+\bigskip
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+%---------------------------------------------------------------------
+\end{document}
diff --git a/muse/doc/man/gpl.tex b/muse/doc/man/gpl.tex
new file mode 100644
index 00000000..f939f169
--- /dev/null
+++ b/muse/doc/man/gpl.tex
@@ -0,0 +1,318 @@
+\chapter{The GNU General Public License}
+
+\midaligned{Version 2, June 1991}
+\blank[big]
+\midaligned{Copyright \copyright\ 1989, 1991 Free Software Foundation, Inc.}
+\blank[big]
+\midaligned{51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA}
+\blank[big]
+\midaligned{Everyone is permitted to copy and distribute verbatim copies}
+\midaligned{of this license document, but changing it is not allowed.}
+
+\blank[big]
+\midaligned{\bf Preamble}
+\blank[big]
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free software---to
+make sure the software is free for all its users. This General Public
+License applies to most of the Free Software Foundation's software and to
+any other program whose authors commit to using it. (Some other Free
+Software Foundation software is covered by the GNU Library General Public
+License instead.) 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 this service
+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 make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or
+for a fee, you must give the recipients all the rights that you have. 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.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If
+the software is modified by someone else and passed on, we want its
+recipients to know that what they have is not the original, so that any
+problems introduced by others will not reflect on the original authors'
+reputations.
+
+Finally, any free program is threatened constantly by software patents.
+We wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program
+proprietary. To prevent this, we have made it clear that any patent must
+be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+\blank[big]
+\midaligned{GNU GENERAL PUBLIC LICENSE}
+\midaligned{Terms and Conditions For Copying, Distribution and
+ Modification}
+\blank[big]
+
+\setupitemize[2][width=5em]
+\startitemize[n,broad]
+
+\item
+This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the
+terms of this General Public License. The ``Program'', below, refers to
+any such program or work, and a ``work based on the Program'' means either
+the Program or any derivative work under copyright law: that is to say, a
+work containing the Program or a portion of it, either verbatim or with
+modifications and/or translated into another language. (Hereinafter,
+translation is included without limitation in the term ``modification''.)
+Each licensee is addressed as ``you''.
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+\item You may copy and distribute 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
+ and disclaimer of warranty; keep intact all the notices that refer to
+ this License and to the absence of any warranty; and give any other
+ recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you
+may at your option offer warranty protection in exchange for a fee.
+
+\item
+You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+\startitemize[a]
+
+\item
+You must cause the modified files to carry prominent notices stating that
+you changed the files and the date of any change.
+
+\item
+You must cause any work that you distribute or publish, that in
+whole or in part contains or is derived from the Program or any
+part thereof, to be licensed as a whole at no charge to all third
+parties under the terms of this License.
+
+\item
+If the modified program normally reads commands interactively
+when run, you must cause it, when started running for such
+interactive use in the most ordinary way, to print or display an
+announcement including an appropriate copyright notice and a
+notice that there is no warranty (or else, saying that you provide
+a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this
+License. (Exception: if the Program itself is interactive but
+does not normally print such an announcement, your work based on
+the Program is not required to print an announcement.)
+
+\stopitemize
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+\item
+You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+\startitemize[a,packed]
+
+\item
+Accompany it with the complete corresponding machine-readable
+source code, which must be distributed under the terms of Sections
+1 and 2 above on a medium customarily used for software interchange; or,
+
+\item
+Accompany it with a written offer, valid for at least three
+years, to give any third party, for a charge no more than your
+cost of physically performing source distribution, a complete
+machine-readable copy of the corresponding source code, to be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+\item
+Accompany it with the information you received as to the offer
+to distribute corresponding source code. (This alternative is
+allowed only for noncommercial distribution and only if you
+received the program in object code or executable form with such
+an offer, in accord with Subsection b above.)
+
+\stopitemize
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+\item
+You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+\item
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+\item
+Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+\item
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+\item
+If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+\item
+The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and ``any
+later version'', you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+\item
+If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+\blank[big]
+\midaligned{\sc No Warranty}
+\blank[big]
+
+\item
+{\sc Because the program is licensed free of charge, 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.}
+
+\item
+{\sc In no event unless required by applicable law or agreed to in writing
+will any copyright holder, or any other party who may modify and/or
+redistribute 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.}
+
+
+\blank[big]
+\midaligned{\sc End of Terms and Conditions}
diff --git a/muse/doc/man/titlelogo.jpg b/muse/doc/man/titlelogo.jpg
new file mode 100644
index 00000000..0c26f3e8
--- /dev/null
+++ b/muse/doc/man/titlelogo.jpg
Binary files differ
diff --git a/muse/files b/muse/files
new file mode 100644
index 00000000..6fa79b29
--- /dev/null
+++ b/muse/files
@@ -0,0 +1,907 @@
+.
+./al
+./al/al.h
+./al/xml.cpp
+./al/marker.cpp
+./al/pos.h
+./al/sig.h
+./al/xml.h
+./al/sig.cpp
+./al/CMakeLists.txt
+./al/tempo.h
+./al/al.cpp
+./al/marker.h
+./al/pos.cpp
+./al/tempo.cpp
+./awl
+./awl/mslider.cpp
+./awl/midipanknob.h
+./awl/tcanvas.h
+./awl/metronom.xpm
+./awl/pitchedit.cpp
+./awl/knob.cpp
+./awl/tempolabel.cpp
+./awl/awl.h
+./awl/mslider.h
+./awl/floatentry.h
+./awl/pitchedit.h
+./awl/aslider.cpp
+./awl/panentry.cpp
+./awl/volslider.cpp
+./awl/volknob.cpp
+./awl/pitchlabel.cpp
+./awl/midimeter.h
+./awl/poslabel.cpp
+./awl/tcanvas.cpp
+./awl/CMakeLists.txt
+./awl/aslider.h
+./awl/combobox.h
+./awl/panknob.cpp
+./awl/panknob.h
+./awl/midimeter.cpp
+./awl/awlplugin.cpp
+./awl/posedit.h
+./awl/slider.cpp
+./awl/midipanentry.cpp
+./awl/midimslider.cpp
+./awl/fastlog.h
+./awl/midipanentry.h
+./awl/pitchlabel.h
+./awl/clock.xpm
+./awl/sigedit.cpp
+./awl/knob.h
+./awl/combobox.cpp
+./awl/poslabel.h
+./awl/checkbox.cpp
+./awl/slider.h
+./awl/checkbox.h
+./awl/volentry.cpp
+./awl/volslider.h
+./awl/panentry.h
+./awl/utils.h
+./awl/midivolentry.h
+./awl/posedit.cpp
+./awl/midimslider.h
+./awl/sigedit.h
+./awl/awlplugin.h
+./awl/awl.cpp
+./awl/tempolabel.h
+./awl/volknob.h
+./awl/midipanknob.cpp
+./awl/tempoedit.h
+./awl/floatentry.cpp
+./awl/tempoedit.cpp
+./awl/volentry.h
+./awl/midivolentry.cpp
+./awl/utils.cpp
+./doc
+./doc/man
+./doc/man/de
+./doc/man/de/man-de.tex
+./doc/man/en
+./doc/man/en/man-en.tex
+./doc/man/fdl.tex
+./doc/man/titlelogo.jpg
+./doc/man/gpl.tex
+./doc/dimpl
+./doc/dimpl/dimpl.pdf
+./doc/dimpl/dimpl.tex
+./doc/README.de
+./doc/doxygen
+./doc/README.translate
+./doc/README.instruments
+./doc/README.realtime
+./doc/README.ladspaguis
+./doc/README.softsynth
+./doc/README.CVS
+./doc/README.shortcuts
+./gen
+./NEWS
+./TODO
+./mops
+./muse
+./muse/vg
+./muse/DOC
+./muse/xpm
+./muse/xpm/pafter.xpm
+./muse/xpm/plus.xpm
+./muse/xpm/inputpluginS.xpm
+./muse/xpm/select_all_parts_on_track.xpm
+./muse/xpm/newmutebutton.xpm
+./muse/xpm/bluedot.xpm
+./muse/xpm/master.xpm
+./muse/xpm/undo.xpm
+./muse/xpm/view_cliplist.xpm
+./muse/xpm/meta.xpm
+./muse/xpm/edit_pianoroll.xpm
+./muse/xpm/edit_list.xpm
+./muse/xpm/midi_init_instr.xpm
+./muse/xpm/dot1.xpm
+./muse/xpm/settings_metronome.xpm
+./muse/xpm/addtrack_auxsend.xpm
+./muse/xpm/buttondown.xpm
+./muse/xpm/settings_configureshortcuts.xpm
+./muse/xpm/note.xpm
+./muse/xpm/mustangS.xpm
+./muse/xpm/cut.xpm
+./muse/xpm/mastertrackS.xpm
+./muse/xpm/muse_icon.xpm
+./muse/xpm/punchout1.xpm
+./muse/xpm/doth.xpm
+./muse/xpm/view_transport_window.xpm
+./muse/xpm/quant.xpm
+./muse/xpm/dot.xpm
+./muse/xpm/down.xpm
+./muse/xpm/track_add.xpm
+./muse/xpm/sysex.xpm
+./muse/xpm/midi_inputplugins_random_rhythm_generator.xpm
+./muse/xpm/iiwusynth.xpm
+./muse/xpm/exit1.xpm
+./muse/xpm/midi_transform.xpm
+./muse/xpm/flagS.xpm
+./muse/xpm/midi_reset_instr.xpm
+./muse/xpm/record_on.xpm
+./muse/xpm/exitS.xpm
+./muse/xpm/context_help.xpm
+./muse/xpm/note1.xpm
+./muse/xpm/ctrl.xpm
+./muse/xpm/midi_local_off.xpm
+./muse/xpm/fileopenS.xpm
+./muse/xpm/solobutton_off.xpm
+./muse/xpm/edit_track_del.xpm
+./muse/xpm/cmark.xpm
+./muse/xpm/editcopyS.xpm
+./muse/xpm/midi_transpose.xpm
+./muse/xpm/automation_take_snapshot.xpm
+./muse/xpm/midi_inputplugins_midi_input_transform.xpm
+./muse/xpm/settings_follow_song.xpm
+./muse/xpm/editcut.xpm
+./muse/xpm/idea.xpm
+./muse/xpm/select_invert_selection.xpm
+./muse/xpm/punchin1.xpm
+./muse/xpm/solobutton.xpm
+./muse/xpm/piano.xpm
+./muse/xpm/muse_icon_64x64.png
+./muse/xpm/filenew.png
+./muse/xpm/view_mixer.xpm
+./muse/xpm/filesave.png
+./muse/xpm/splash.png
+./muse/xpm/draw.xpm
+./muse/xpm/fileprintS.xpm
+./muse/xpm/midi_inputplugins_transpose.xpm
+./muse/xpm/panic.xpm
+./muse/xpm/punchout.xpm
+./muse/xpm/reddot.xpm
+./muse/xpm/track_delete.xpm
+./muse/xpm/find.xpm
+./muse/xpm/darkgreendot.xpm
+./muse/xpm/select.xpm
+./muse/xpm/mute.xpm
+./muse/xpm/record.xpm
+./muse/xpm/lmark.xpm
+./muse/xpm/record1.xpm
+./muse/xpm/config.xpm
+./muse/xpm/mastertrack_graphic.xpm
+./muse/xpm/home.xpm
+./muse/xpm/underlined.xpm
+./muse/xpm/mono.xpm
+./muse/xpm/view_marker.xpm
+./muse/xpm/mutebutton_on.xpm
+./muse/xpm/edit_midi.xpm
+./muse/xpm/forward.xpm
+./muse/xpm/localoffS.xpm
+./muse/xpm/initS.xpm
+./muse/xpm/configure.xpm
+./muse/xpm/miditransposeS.xpm
+./muse/xpm/settings_globalsettings.xpm
+./muse/xpm/greendot.xpm
+./muse/xpm/addtrack_addmiditrack.xpm
+./muse/xpm/toc.xpm
+./muse/xpm/redoS.xpm
+./muse/xpm/automation_clear_data.xpm
+./muse/xpm/gv.xpm
+./muse/xpm/glue.xpm
+./muse/xpm/mixerS.xpm
+./muse/xpm/addtrack_audiooutput.xpm
+./muse/xpm/minus.xpm
+./muse/xpm/score.xpm
+./muse/xpm/loop1.xpm
+./muse/xpm/audio_bounce_to_file.xpm
+./muse/xpm/addtrack_wavetrack.xpm
+./muse/xpm/addtrack_drumtrack.xpm
+./muse/xpm/midi_edit_instrument.xpm
+./muse/xpm/settings_midifileexport.xpm
+./muse/xpm/automation_mixer.xpm
+./muse/xpm/addtrack_audioinput.xpm
+./muse/xpm/bouncetofile.xpm
+./muse/xpm/select_outside_loop.xpm
+./muse/xpm/undoS.xpm
+./muse/xpm/wave.xpm
+./muse/xpm/audio_restartaudio.xpm
+./muse/xpm/select_all.xpm
+./muse/xpm/select_deselect_all.xpm
+./muse/xpm/resetS.xpm
+./muse/xpm/cliplistS.xpm
+./muse/xpm/pointer.xpm
+./muse/xpm/pencil.xpm
+./muse/xpm/edit_drumms.xpm
+./muse/xpm/editmute.xpm
+./muse/xpm/editcutS.xpm
+./muse/xpm/listS.xpm
+./muse/xpm/off.xpm
+./muse/xpm/flag.xpm
+./muse/xpm/miditransformS.xpm
+./muse/xpm/cafter.xpm
+./muse/xpm/up.xpm
+./muse/xpm/back.xpm
+./muse/xpm/edit_score.xpm
+./muse/xpm/lock.xpm
+./muse/xpm/fforward.xpm
+./muse/xpm/select_inside_loop.xpm
+./muse/xpm/midi_plugS.xpm
+./muse/xpm/stick.xpm
+./muse/xpm/settings_appearance_settings.xpm
+./muse/xpm/filesaveasS.xpm
+./muse/xpm/settings_midiport_softsynths.xpm
+./muse/xpm/play.xpm
+./muse/xpm/midi_inputplugins_remote_control.xpm
+./muse/xpm/stereo.xpm
+./muse/xpm/editcopy.xpm
+./muse/xpm/addtrack_audiogroup.xpm
+./muse/xpm/solobutton_on.xpm
+./muse/xpm/fileprint.xpm
+./muse/xpm/punchin.xpm
+./muse/xpm/drumS.xpm
+./muse/xpm/start.xpm
+./muse/xpm/pianoS.xpm
+./muse/xpm/record_off.xpm
+./muse/xpm/delete.xpm
+./muse/xpm/edit_mastertrack.xpm
+./muse/xpm/speaker.xpm
+./muse/xpm/editpaste.xpm
+./muse/xpm/edit_track_add.xpm
+./muse/xpm/mastertrack_list.xpm
+./muse/xpm/fileopen.png
+./muse/xpm/bold.xpm
+./muse/xpm/filenewS.xpm
+./muse/xpm/midi_inputplugins_midi_input_filter.xpm
+./muse/xpm/steprec.xpm
+./muse/xpm/loop.xpm
+./muse/xpm/view_bigtime_window.xpm
+./muse/xpm/graydot.xpm
+./muse/xpm/stop.xpm
+./muse/xpm/frewind.xpm
+./muse/xpm/rmark.xpm
+./muse/xpm/audio_bounce_to_track.xpm
+./muse/xpm/exit.xpm
+./muse/xpm/scoreS.xpm
+./muse/xpm/settings_midisync.xpm
+./muse/xpm/mutebutton_off.xpm
+./muse/xpm/midi_inputplugins.xpm
+./muse/xpm/mixeraudioS.xpm
+./muse/xpm/filesaveS.xpm
+./muse/xpm/redo.xpm
+./muse/xpm/italic.xpm
+./muse/xpm/pitch.xpm
+./muse/xpm/editpasteS.xpm
+./muse/xpm/midiin.xpm
+./muse/xpm/editmuteS.xpm
+./muse/xpm/darkreddot.xpm
+./muse/audiotrack.h
+./muse/ctrl
+./muse/ctrl/ctrleditor.cpp
+./muse/ctrl/CMakeLists.txt
+./muse/ctrl/ctrleditor.h
+./muse/ctrl/configmidictrl.cpp
+./muse/ctrl/configmidictrl.ui
+./muse/ctrl/configmidictrl.h
+./muse/editor.h
+./muse/route.cpp
+./muse/debug.h
+./muse/undo.cpp
+./muse/midievent.cpp
+./muse/midiport.h
+./muse/midirc.cpp
+./muse/configmidifile.ui
+./muse/midiseq.cpp
+./muse/aboutbox.ui
+./muse/plugingui.h
+./muse/song.cpp
+./muse/default_click.h
+./muse/audiogroup.h
+./muse/bench
+./muse/gui.h
+./muse/eventbase.h
+./muse/liste
+./muse/liste/editnotedialog.ui
+./muse/liste/editctrlbase.ui
+./muse/liste/listedit.cpp
+./muse/liste/CMakeLists.txt
+./muse/liste/listedit.h
+./muse/liste/editevent.h
+./muse/liste/editevent.cpp
+./muse/mixer
+./muse/mixer/midirack.h
+./muse/mixer/strip.cpp
+./muse/mixer/routedialog.ui
+./muse/mixer/mstrip.h
+./muse/mixer/rack.cpp
+./muse/mixer/routedialog.cpp
+./muse/mixer/mixer.h
+./muse/mixer/strip.h
+./muse/mixer/midirack.cpp
+./muse/mixer/rack.h
+./muse/mixer/routedialog.h
+./muse/mixer/mstrip.cpp
+./muse/mixer/astrip.cpp
+./muse/mixer/mixer.cpp
+./muse/mixer/astrip.h
+./muse/mtc.h
+./muse/vst.h
+./muse/transpose.cpp
+./muse/eventlist.cpp
+./muse/transport.cpp
+./muse/wavetrack.cpp
+./muse/esettings.cpp
+./muse/esettings.h
+./muse/audioprefetch.cpp
+./muse/miditransform.h
+./muse/helper.cpp
+./muse/.muse.bin.bak
+./muse/audiowriteback.h
+./muse/midiplugin.cpp
+./muse/audiowriteback.cpp
+./muse/midiplugin.h
+./muse/miditransform.cpp
+./muse/route.h
+./muse/globaldefs.h
+./muse/appearance.h
+./muse/midievent.h
+./muse/ctrl.cpp
+./muse/midisynti.cpp
+./muse/fifo.cpp
+./muse/audioaux.cpp
+./muse/CMakeLists.txt
+./muse/runmuse
+./muse/shortcuts.cpp
+./muse/midisynti.h
+./muse/audio.cpp
+./muse/audioinput.h
+./muse/part.cpp
+./muse/transpose.ui
+./muse/transport.ui
+./muse/audioinput.cpp
+./muse/miditrack.h
+./muse/muse.cpp
+./muse/muse.qrc
+./muse/appearance.cpp
+./muse/mpevent.cpp
+./muse/audioprefetch.h
+./muse/event.h
+./muse/genset.h
+./muse/waveevent.h
+./muse/midi.cpp
+./muse/event.cpp
+./muse/midiedit
+./muse/midiedit/pianoroll.h
+./muse/midiedit/cmd.h
+./muse/midiedit/midieditor.h
+./muse/midiedit/drumedit.cpp
+./muse/midiedit/prcanvas.h
+./muse/midiedit/ecanvas.cpp
+./muse/midiedit/ctrledit.cpp
+./muse/midiedit/quantconfig.cpp
+./muse/midiedit/quantconfig.ui
+./muse/midiedit/quantconfig.h
+./muse/midiedit/ecanvas.h
+./muse/midiedit/pianoroll.cpp
+./muse/midiedit/citem.cpp
+./muse/midiedit/midieditor.cpp
+./muse/midiedit/dcanvas.cpp
+./muse/midiedit/prcanvas.cpp
+./muse/midiedit/ctrledit.h
+./muse/midiedit/drumedit.h
+./muse/midiedit/drummap.h
+./muse/midiedit/dcanvas.h
+./muse/midiedit/.Ped-tk
+./muse/midiedit/drummap.cpp
+./muse/midiedit/citem.h
+./muse/midirc.h
+./muse/conf.h
+./muse/plugin.cpp
+./muse/ctrl.h
+./muse/conf.cpp
+./muse/driver
+./muse/driver/alsatimer.h
+./muse/driver/posixtimer.h
+./muse/driver/jackaudio.h
+./muse/driver/posixtimer.cpp
+./muse/driver/alsatimer.cpp
+./muse/driver/CMakeLists.txt
+./muse/driver/driver.h
+./muse/driver/jack.cpp
+./muse/driver/alsamidi.h
+./muse/driver/rtctimer.h
+./muse/driver/timerdev.h
+./muse/driver/alsamidi.cpp
+./muse/driver/dummyaudio.cpp
+./muse/driver/audiodev.h
+./muse/driver/rtctimer.cpp
+./muse/fifo.h
+./muse/fastlog.h
+./muse/mpevent.h
+./muse/midictrl.cpp
+./muse/songfile.cpp
+./muse/synth.h
+./muse/help.h
+./muse/audiooutput.cpp
+./muse/cobject.h
+./muse/midififo.cpp
+./muse/gconfig.cpp
+./muse/mtc.cpp
+./muse/track.h
+./muse/miditrack.cpp
+./muse/evdata.h
+./muse/dssihost.h
+./muse/wavetrack.h
+./muse/marker
+./muse/marker/markerview.h
+./muse/marker/markerview.cpp
+./muse/marker/CMakeLists.txt
+./muse/audiogroup.cpp
+./muse/master
+./muse/master/master.cpp
+./muse/master/CMakeLists.txt
+./muse/master/masteredit.h
+./muse/master/master.h
+./muse/master/masteredit.cpp
+./muse/gconfig.h
+./muse/sync.cpp
+./muse/muse.ui
+./muse/midi.h
+./muse/wave.cpp
+./muse/waveedit
+./muse/waveedit/waveview.cpp
+./muse/waveedit/waveedit.h
+./muse/waveedit/waveedit.cpp
+./muse/waveedit/waveview.h
+./muse/genset.cpp
+./muse/cobject.cpp
+./muse/muse.h
+./muse/midifile.cpp
+./muse/extmidieditor.cpp
+./muse/part.h
+./muse/midiport.cpp
+./muse/exportmidi.cpp
+./muse/value.cpp
+./muse/synth.cpp
+./muse/ticksynth.cpp
+./muse/song.h
+./muse/waveevent.cpp
+./muse/extmidieditor.h
+./muse/sync.h
+./muse/genset.ui
+./muse/audiooutput.h
+./muse/undo.h
+./muse/ladspa.h
+./muse/plugingui.cpp
+./muse/wave.h
+./muse/icons.cpp
+./muse/device.h
+./muse/instruments
+./muse/instruments/minstrument.cpp
+./muse/instruments/CMakeLists.txt
+./muse/instruments/editinstrument.cpp
+./muse/instruments/midictrledit.h
+./muse/instruments/minstrument.h
+./muse/instruments/midictrledit.cpp
+./muse/instruments/editinstrument.h
+./muse/instruments/editinstrument.ui
+./muse/icons.h
+./muse/thread.h
+./muse/appearance.ui
+./muse/arranger
+./muse/arranger/trackinfo.h
+./muse/arranger/selectfilter.h
+./muse/arranger/tlswidget.cpp
+./muse/arranger/configtrack.cpp
+./muse/arranger/tllineedit.h
+./muse/arranger/arranger.cpp
+./muse/arranger/tlwlayout.h
+./muse/arranger/trackinfo.cpp
+./muse/arranger/tllineedit.cpp
+./muse/arranger/partdrag.h
+./muse/arranger/tlwidget.cpp
+./muse/arranger/configtrack.h
+./muse/arranger/partdrag.cpp
+./muse/arranger/tlswidget.h
+./muse/arranger/canvas.h
+./muse/arranger/configtrack.ui
+./muse/arranger/miditrackinfo.h
+./muse/arranger/arranger.h
+./muse/arranger/canvas.cpp
+./muse/arranger/tlwlayout.cpp
+./muse/arranger/trackdrag.cpp
+./muse/arranger/trelement.h
+./muse/arranger/tlwidget.h
+./muse/arranger/trackdrag.h
+./muse/exportmididialog.ui
+./muse/audiotrack.cpp
+./muse/globals.h
+./muse/dssihost.cpp
+./muse/editor.cpp
+./muse/audio.h
+./muse/seqmsg.cpp
+./muse/transpose.h
+./muse/transport.h
+./muse/widgets
+./muse/widgets/rastercombo.cpp
+./muse/widgets/mixdowndialog.h
+./muse/widgets/siglabel.cpp
+./muse/widgets/fontsel.h
+./muse/widgets/midisync.h
+./muse/widgets/tb1.h
+./muse/widgets/gatetime.h
+./muse/widgets/comboQuant.h
+./muse/widgets/ctrlcombo.h
+./muse/widgets/comment.h
+./muse/widgets/dentry.cpp
+./muse/widgets/filedialog.h
+./muse/widgets/quantcombo.cpp
+./muse/widgets/tools.cpp
+./muse/widgets/fdialogbuttons1.h
+./muse/widgets/fdialogbuttons.ui
+./muse/widgets/simplebutton.h
+./muse/widgets/menutitle.h
+./muse/widgets/bigtime.h
+./muse/widgets/tb1.cpp
+./muse/widgets/gatetime.cpp
+./muse/widgets/mtrackinfobase.ui
+./muse/widgets/greendotbutton.h
+./muse/widgets/CMakeLists.txt
+./muse/widgets/floatlabel.cpp
+./muse/widgets/editmetadialogbase.ui
+./muse/widgets/combobox.h
+./muse/widgets/cliplisteditorbase.h
+./muse/widgets/editsysexdialogbase.ui
+./muse/widgets/wtrackinfobase.ui
+./muse/widgets/midisync.ui
+./muse/widgets/rastercombo.h
+./muse/widgets/noteinfo.cpp
+./muse/widgets/velocity.ui
+./muse/widgets/shortcutconfig.ui
+./muse/widgets/editmetadialogbase.cpp
+./muse/widgets/shortcutcapturedialog.h
+./muse/widgets/doublelabel.cpp
+./muse/widgets/shortcutconfig.h
+./muse/widgets/tools.h
+./muse/widgets/splitter.h
+./muse/widgets/cliplisteditorbase.ui
+./muse/widgets/simplebutton.cpp
+./muse/widgets/combobox.cpp
+./muse/widgets/outportcombo.cpp
+./muse/widgets/velocity.h
+./muse/widgets/comboQuant.cpp
+./muse/widgets/action.h
+./muse/widgets/dentry.h
+./muse/widgets/mittransposebase.ui
+./muse/widgets/transformbase.ui
+./muse/widgets/siglabel.h
+./muse/widgets/gatetime.ui
+./muse/widgets/editsysexdialogbase.h
+./muse/widgets/noteinfo.h
+./muse/widgets/doublelabel.h
+./muse/widgets/splitter.cpp
+./muse/widgets/utils.h
+./muse/widgets/fontsel.cpp
+./muse/widgets/recordbutton.h
+./muse/widgets/mixdowndialog.cpp
+./muse/widgets/ctrlcombo.cpp
+./muse/widgets/comment.cpp
+./muse/widgets/intlabel.h
+./muse/widgets/comment.ui
+./muse/widgets/midisync.cpp
+./muse/widgets/synthwizardbase.h
+./muse/widgets/velocity.cpp
+./muse/widgets/shortcutconfig.cpp
+./muse/widgets/mittransposebase.h
+./muse/widgets/.Ped-tk
+./muse/widgets/shortcutcapturedialog.ui
+./muse/widgets/shortcutcapturedialog.cpp
+./muse/widgets/menutitle.cpp
+./muse/widgets/quantcombo.h
+./muse/widgets/floatlabel.h
+./muse/widgets/outportcombo.h
+./muse/widgets/bigtime.cpp
+./muse/widgets/stutk9Nz
+./muse/widgets/mixdowndialog.ui
+./muse/widgets/filedialog.cpp
+./muse/widgets/utils.cpp
+./muse/vst.cpp
+./muse/midictrl.h
+./muse/midiseq.h
+./muse/midififo.h
+./muse/midifile.h
+./muse/track.cpp
+./muse/globals.cpp
+./muse/audioaux.h
+./muse/shortcuts.h
+./muse/importmidi.cpp
+./muse/exportmidi.h
+./muse/thread.cpp
+./muse/cliplist
+./muse/cliplist/cliplist.h
+./muse/cliplist/cliplist.cpp
+./muse/help.cpp
+./muse/qrc_muse.cxx
+./muse/helper.h
+./muse/plugin.h
+./muse/ticksynth.h
+./.qped
+./SECURITY
+./all.h
+./cmake
+./cmake/UsePkgConfig1.cmake
+./files
+./share
+./share/html
+./share/html/right_pane.jpg
+./share/html/main_window_track_info.jpg
+./share/html/installation.html
+./share/html/CMakeLists.txt
+./share/html/window_ref.html
+./share/html/index.html
+./share/html/getting_started.html
+./share/html/track_info.jpg
+./share/html/toc_.txt
+./share/html/main_window.jpg
+./share/html/COPYING.html
+./share/html/button_bar.jpg
+./share/html/styles.css
+./share/html/left_pane.jpg
+./share/html/invocation.html
+./share/wallpapers
+./share/wallpapers/stone1.gif
+./share/wallpapers/gray_stucco.gif
+./share/wallpapers/gray.gif
+./share/wallpapers/gray_rock.gif
+./share/wallpapers/CMakeLists.txt
+./share/wallpapers/paper1.jpg
+./share/CMakeLists.txt
+./share/locale
+./share/locale/muse_de.qm
+./share/locale/muse_de.ts
+./share/locale/muse_es.qm
+./share/locale/muse_es.ts
+./share/locale/muse_fr.qm
+./share/locale/muse_fr.ts
+./share/locale/muse_ru.qm
+./share/locale/muse_ru.ts
+./share/locale/CMakeLists.txt
+./share/locale/muse_sv_SE.qm
+./share/locale/muse_sv_SE.ts
+./share/instruments
+./share/instruments/AlesisQS6.idf
+./share/instruments/Roland_FantomXR.idf
+./share/instruments/Yamaha-PSR530.idf
+./share/instruments/Roland_SRX-02.idf
+./share/instruments/Roland_SRX-09.idf
+./share/instruments/Yamaha-S90.idf
+./share/instruments/CMakeLists.txt
+./share/instruments/emuproteus2000.idf
+./share/instruments/gm.idf
+./share/instruments/gs.idf
+./share/instruments/Roland-E28.idf
+./share/instruments/Alesis-Ion.idf
+./share/instruments/Roland-SCD70.idf
+./share/instruments/Access_Virus.idf
+./share/instruments/Quasimidi-Sirius.idf
+./share/instruments/MC303.idf
+./share/instruments/Hammond_XB-1.idf
+./share/instruments/xg.idf
+./share/instruments/Waldorf_Microwave-I.idf
+./share/instruments/Roland-XP30.idf
+./share/instruments/Yamaha-PSR275.idf
+./share/instruments/Yamaha-P80.idf
+./share/instruments/ns5r.idf
+./share/instruments/Yamaha-P50m.idf
+./share/instruments/ZynAdd-1_4.idf
+./share/instruments/MC505.idf
+./share/instruments/Alesis-QS-78R.idf
+./share/plugins
+./share/plugins/2142.ui
+./share/plugins/CMakeLists.txt
+./share/plugins/1050.ui
+./share/plugins/1436.ui
+./share/templates
+./share/templates/default.med
+./share/templates/monorecord.med
+./share/templates/CMakeLists.txt
+./share/templates/audio.med
+./share/templates/midiGM.med
+./share/templates/synti.med
+./synti
+./synti/s1
+./synti/s1/CMakeLists.txt
+./synti/s1/s1.cpp
+./synti/vam
+./synti/vam/TODO
+./synti/vam/vam.h
+./synti/vam/README
+./synti/vam/CMakeLists.txt
+./synti/vam/vam.cpp
+./synti/vam/vamgui.ui
+./synti/vam/vamgui.h
+./synti/vam/ChangeLog
+./synti/vam/COPYING
+./synti/vam/vamgui.cpp
+./synti/deicsonze
+./synti/deicsonze/TODO
+./synti/deicsonze/pics
+./synti/deicsonze/pics/wave7.gnuplot
+./synti/deicsonze/pics/sawUp.fig
+./synti/deicsonze/pics/sawUp.png
+./synti/deicsonze/pics/wave2.gnuplot
+./synti/deicsonze/pics/algo1.fig
+./synti/deicsonze/pics/algo1.png
+./synti/deicsonze/pics/algo2.fig
+./synti/deicsonze/pics/algo2.png
+./synti/deicsonze/pics/algo3.fig
+./synti/deicsonze/pics/algo3.png
+./synti/deicsonze/pics/algo4.fig
+./synti/deicsonze/pics/algo4.png
+./synti/deicsonze/pics/algo5.fig
+./synti/deicsonze/pics/algo5.png
+./synti/deicsonze/pics/algo6.fig
+./synti/deicsonze/pics/algo6.png
+./synti/deicsonze/pics/algo7.fig
+./synti/deicsonze/pics/algo7.png
+./synti/deicsonze/pics/algo8.fig
+./synti/deicsonze/pics/algo8.png
+./synti/deicsonze/pics/wave4.gnuplot
+./synti/deicsonze/pics/square.fig
+./synti/deicsonze/pics/square.png
+./synti/deicsonze/pics/wave1.fig
+./synti/deicsonze/pics/wave1.png
+./synti/deicsonze/pics/wave2.fig
+./synti/deicsonze/pics/wave2.png
+./synti/deicsonze/pics/wave3.fig
+./synti/deicsonze/pics/wave3.png
+./synti/deicsonze/pics/wave4.fig
+./synti/deicsonze/pics/wave4.png
+./synti/deicsonze/pics/wave5.fig
+./synti/deicsonze/pics/wave5.png
+./synti/deicsonze/pics/wave6.fig
+./synti/deicsonze/pics/wave6.png
+./synti/deicsonze/pics/wave7.fig
+./synti/deicsonze/pics/wave7.png
+./synti/deicsonze/pics/wave8.fig
+./synti/deicsonze/pics/wave8.png
+./synti/deicsonze/pics/wave6.gnuplot
+./synti/deicsonze/pics/wave8.gnuplot
+./synti/deicsonze/pics/wave1.gnuplot
+./synti/deicsonze/pics/SHold.fig
+./synti/deicsonze/pics/SHold.png
+./synti/deicsonze/pics/triangl.fig
+./synti/deicsonze/pics/triangl.png
+./synti/deicsonze/pics/wave3.gnuplot
+./synti/deicsonze/pics/wave5.gnuplot
+./synti/deicsonze/SutulaBank.dei
+./synti/deicsonze/README
+./synti/deicsonze/CMakeLists.txt
+./synti/deicsonze/deicsonzegui.ui
+./synti/deicsonze/deicsonzegui.h
+./synti/deicsonze/ARCH_ALIN
+./synti/deicsonze/deicsonzegui.cpp
+./synti/deicsonze/deicsonzepreset.h
+./synti/deicsonze/deicsonze.cpp
+./synti/deicsonze/deicsonze.h
+./synti/deicsonze/deicsonzepreset.cpp
+./synti/fluidsynth
+./synti/fluidsynth/TODO
+./synti/fluidsynth/fluidsynthgui.ui
+./synti/fluidsynth/fluidsynthgui.cpp
+./synti/fluidsynth/CMakeLists.txt
+./synti/fluidsynth/README.txt
+./synti/fluidsynth/fluidsynti.cpp
+./synti/fluidsynth/fluidsynti.h
+./synti/fluidsynth/fluidsynthgui.h
+./synti/fluid
+./synti/fluid/fluidgui.h
+./synti/fluid/fluid.cpp
+./synti/fluid/fluidgui.ui
+./synti/fluid/CMakeLists.txt
+./synti/fluid/fluid.h
+./synti/fluid/fluidgui.cpp
+./synti/organ
+./synti/organ/organgui.ui
+./synti/organ/organgui.cpp
+./synti/organ/CMakeLists.txt
+./synti/organ/organgui.h
+./synti/organ/organ.h
+./synti/organ/organ.cpp
+./synti/CMakeLists.txt
+./synti/simpledrums
+./synti/simpledrums/simpledrumsgui.cpp
+./synti/simpledrums/ssplugin.h
+./synti/simpledrums/README
+./synti/simpledrums/ssplugingui.h
+./synti/simpledrums/ssplugingui.cpp
+./synti/simpledrums/simpledrumsguibase.ui
+./synti/simpledrums/ssplugin.cpp
+./synti/simpledrums/sspluginchooserbase.ui
+./synti/simpledrums/common.h
+./synti/simpledrums/simpledrums.h
+./synti/simpledrums/simpledrums.cpp
+./synti/simpledrums/COPYING
+./synti/simpledrums/ReleaseNotes.txt
+./synti/simpledrums/simpledrumsgui.h
+./synti/libsynti
+./synti/libsynti/mess.cpp
+./synti/libsynti/gui.h
+./synti/libsynti/CMakeLists.txt
+./synti/libsynti/poly.cpp
+./synti/libsynti/mpevent.cpp
+./synti/libsynti/mono.cpp
+./synti/libsynti/mpevent.h
+./synti/libsynti/evdata.h
+./synti/libsynti/mess.h
+./synti/libsynti/mono.h
+./synti/libsynti/poly.h
+./synti/libsynti/gui.cpp
+./README
+./.files,
+./grepmidi
+./grepmidi/grepmidi
+./grepmidi/CMakeLists.txt
+./grepmidi/grepmidi.cpp
+./CMakeLists.txt
+./Reference
+./config.h
+./config.h.in
+./AUTHORS
+./midiplugins
+./midiplugins/metronom
+./midiplugins/metronom/metronom.cpp
+./midiplugins/metronom/metronomgui.cpp
+./midiplugins/metronom/metronom.h
+./midiplugins/metronom/metronomgui.h
+./midiplugins/metronom/metronomgui.ui
+./midiplugins/transform
+./midiplugins/transform/transform.cpp
+./midiplugins/transform/transform.h
+./midiplugins/transform/transform.ui
+./midiplugins/libmidiplugin
+./midiplugins/libmidiplugin/mempi.h
+./midiplugins/libmidiplugin/mpevent.cpp
+./midiplugins/libmidiplugin/mpevent.h
+./midiplugins/libmidiplugin/evdata.h
+./midiplugins/libmidiplugin/mempi.cpp
+./midiplugins/filter
+./midiplugins/filter/filtergui.cpp
+./midiplugins/filter/filterbase.ui
+./midiplugins/filter/ctrlcombo.h
+./midiplugins/filter/filtergui.h
+./midiplugins/filter/filter.h
+./midiplugins/filter/filter.cpp
+./midiplugins/filter/ctrlcombo.cpp
+./.mops,
+./packaging
+./packaging/muse_icon.png
+./packaging/muse_mdk.spec
+./ChangeLog
+./Doxyfile.in
+./plugins
+./plugins/CMakeLists.txt
+./plugins/freeverb
+./plugins/freeverb/revmodel.cpp
+./plugins/freeverb/allpass.h
+./plugins/freeverb/CMakeLists.txt
+./plugins/freeverb/freeverb.cpp
+./plugins/freeverb/comb.h
+./plugins/freeverb/revmodel.h
+./plugins/freeverb/readme.txt
+./plugins/freeverb/tuning.h
+./plugins/freeverb/denormals.h
+./COPYING
+./Doxyfile
diff --git a/muse/gen b/muse/gen
new file mode 100755
index 00000000..bde49506
--- /dev/null
+++ b/muse/gen
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+if test ! -d build;
+ then
+ echo "+creating build directory"
+ mkdir build
+ echo "+entering build directory"
+ cd build
+ echo "+calling cmake"
+ cmake ..
+ else
+ cd build
+ fi
+
+echo "+start top level make..."
+make
+
diff --git a/muse/grepmidi/CMakeLists.txt b/muse/grepmidi/CMakeLists.txt
new file mode 100644
index 00000000..55084217
--- /dev/null
+++ b/muse/grepmidi/CMakeLists.txt
@@ -0,0 +1,24 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+add_executable ( grepmidi grepmidi.cpp )
+
+install_targets ( /bin grepmidi )
+
diff --git a/muse/grepmidi/grepmidi b/muse/grepmidi/grepmidi
new file mode 100755
index 00000000..5b16cc0b
--- /dev/null
+++ b/muse/grepmidi/grepmidi
Binary files differ
diff --git a/muse/grepmidi/grepmidi.cpp b/muse/grepmidi/grepmidi.cpp
new file mode 100644
index 00000000..d5d68a4d
--- /dev/null
+++ b/muse/grepmidi/grepmidi.cpp
@@ -0,0 +1,348 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: grepmidi.cpp,v 1.1.1.1 2003/10/27 18:57:02 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#define XCHG_SHORT(x) ((((x)&0xFF)<<8) | (((x)>>8)&0xFF))
+#ifdef __i486__
+#define XCHG_LONG(x) \
+ ({ int __value; \
+ asm ("bswap %1; movl %1,%0" : "=g" (__value) : "r" (x)); \
+ __value; })
+#else
+#define XCHG_LONG(x) ((((x)&0xFF)<<24) | \
+ (((x)&0xFF00)<<8) | \
+ (((x)&0xFF0000)>>8) | \
+ (((x)>>24)&0xFF))
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define BE_SHORT(x) XCHG_SHORT(x)
+#define BE_LONG(x) XCHG_LONG(x)
+#else
+#define BE_SHORT(x) x
+#define BE_LONG(x) x
+#endif
+
+
+int cpos;
+bool printName = false;
+const char* curName;
+
+//---------------------------------------------------------
+// readLong
+//---------------------------------------------------------
+
+int readLong(FILE* f)
+ {
+ int format;
+ if (fread(&format, 4, 1, f) != 1) {
+ printf("read long failed\n");
+ exit(1);
+ }
+ cpos += 4;
+ return BE_LONG(format);
+ }
+
+//---------------------------------------------------------
+// readShort
+//---------------------------------------------------------
+
+int readShort(FILE* f)
+ {
+ short format;
+ if (fread(&format, 2, 1, f) != 1) {
+ printf("read short failed\n");
+ exit(1);
+ }
+ cpos += 2;
+ return BE_SHORT(format);
+ }
+
+/*---------------------------------------------------------
+ * getvl
+ * Read variable-length number (7 bits per byte, MSB first)
+ *---------------------------------------------------------*/
+
+int getvl(FILE* f)
+ {
+ int l = 0;
+ for (int i = 0;i < 8; i++) {
+ int c = getc(f);
+ ++cpos;
+ if (c == EOF)
+ break;
+ c &= 0xff;
+ l += (c & 0x7f);
+ if (!(c & 0x80))
+ return l;
+ l <<= 7;
+ }
+ printf("Variable Len too long\n");
+ return -1;
+ }
+
+//---------------------------------------------------------
+// skip
+//---------------------------------------------------------
+
+void skip(FILE* f, int n)
+ {
+ while (n--) {
+ ++cpos;
+ if (getc(f) == EOF) {
+ printf("skip %d failed\n", n);
+ exit(1);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// grepTrack
+//---------------------------------------------------------
+
+int grepTrack(FILE* f, int trackno)
+ {
+// printf("TRACK %d\n", trackno);
+ int mtype, mlen;
+ int b;
+ char* buffer;
+
+ char tmp[4];
+ fread(tmp, 4, 1, f);
+ if (memcmp(tmp, "MTrk", 4))
+ return -5;
+ int len = readLong(f);
+ int endpos = cpos + len;
+ int runstate = -1;
+
+ for (;;) {
+/* int nclick = */ getvl(f);
+ int me = getc(f);
+ ++cpos;
+ int a = -1;
+ if ((me & 0x80) == 0) {
+ if (runstate == -1)
+ return -6;
+ a = me;
+ me = runstate;
+ }
+ switch (me & 0xf0) {
+ case 0x80:
+ case 0x90:
+ case 0xa0:
+ case 0xb0:
+ case 0xe0:
+ b = getc(f);
+ ++cpos;
+ case 0xc0:
+ case 0xd0:
+ if (a == -1) {
+ a = getc(f);
+ ++cpos;
+ }
+ runstate = me;
+ break;
+ case 0xf0:
+ switch(me & 0xf) {
+ case 0: // SYSEX
+ mlen = getvl(f);
+ skip(f, mlen);
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ if (printName)
+ printf("%s: ", curName);
+ printf("unknown Message\n");
+ break;
+ case 7: // EOX
+ case 8: // timing clock
+ case 9: // undefined
+ case 0xa: // start
+ case 0xb: // continue
+ case 0xc: // stop
+ case 0xd: // undefined
+ case 0xe: // active sensing
+ if (printName)
+ printf("%s: ", curName);
+ printf("RT Message??\n");
+ break;
+ case 0xf: // META
+ mtype = getc(f);
+ ++cpos;
+ mlen = getvl(f);
+ buffer = new char[mlen+1];
+ if (mlen) {
+ if (fread(buffer, mlen, 1, f) != 1) {
+ if (printName)
+ printf("%s: ", curName);
+ printf("---meta %d too short (%d)\n", mtype, mlen);
+ exit(1);
+ }
+ cpos += mlen;
+ }
+ switch(mtype) {
+ case 0x2f:
+ delete buffer;
+ goto end;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6: // Marker
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ buffer[mlen] = 0;
+ if (printName)
+ printf("%s: ", curName);
+ printf("%02d Meta %0d: <%s>\n", trackno, mtype, buffer);
+ default:
+ break;
+ }
+ delete buffer;
+ break;
+ }
+ break;
+ }
+ }
+end:
+ if (cpos != endpos) {
+ if (printName)
+ printf("%s: ", curName);
+ printf(" %d zu kurz\n", cpos - endpos);
+ }
+ if (endpos-cpos > 0)
+ skip(f, endpos-cpos);
+ return 0;
+ }
+
+//---------------------------------------------------------
+// grep
+//---------------------------------------------------------
+
+int grep(FILE* f)
+ {
+ char tmp[4];
+
+ fread(tmp, 4, 1, f);
+ if (memcmp(tmp, "MThd", 4) != 0)
+ return -2;
+ int len = readLong(f);
+ if (len < 6)
+ return -3;
+ cpos += 8;
+ int format = readShort(f);
+ int ntracks = readShort(f);
+ readShort(f); // division
+ if (len > 6)
+ skip(f, len-6); /* skip the excess */
+ int rv = 0;
+ switch (format) {
+ case 0: rv = grepTrack(f, 0); break;
+ case 1:
+ for (int i = 0; i < ntracks; i++) {
+ rv = grepTrack(f, i);
+ if (rv != 0)
+ return rv;
+ }
+ break;
+ default:
+ return -4;
+ }
+
+ return 0;
+ }
+
+//---------------------------------------------------------
+// grep
+//---------------------------------------------------------
+
+int grepMidi(const char* name)
+ {
+ curName = name;
+ char*p = strrchr(name, '.');
+ FILE* f;
+ if (p && strcmp(p, ".gz") == 0) {
+ char buffer[512];
+ sprintf(buffer, "gunzip < %s", name);
+ f = popen(buffer, "r");
+ }
+ else {
+ p = 0;
+ f = fopen(name, "r");
+ }
+ if (f == 0)
+ return -1;
+ cpos = 0;
+ int rc = grep(f);
+ if (p)
+ pclose(f);
+ else
+ fclose(f);
+ return rc;
+ }
+
+//---------------------------------------------------------
+// usage
+//---------------------------------------------------------
+
+void usage(const char* fname, const char* txt)
+ {
+ fprintf(stderr, "%s: %s\n", fname, txt);
+// fprintf(stderr, "usage:\n");
+ }
+
+//---------------------------------------------------------
+// main
+//---------------------------------------------------------
+
+int main(int argc, char* argv[])
+ {
+ int c;
+ while ((c = getopt(argc, argv, "f")) != EOF) {
+ switch (c) {
+ case 'f': printName = true; break;
+ default: usage(argv[0], "bad argument"); return -1;
+ }
+ }
+ argc -= optind;
+ ++argc;
+ char* p = 0;
+ for (int i = 1; i < argc; ++i) {
+ switch (grepMidi(argv[i])) {
+ case 0: break;
+ case -1: p = "not found"; break;
+ case -2: p = "no 'MThd': not a midi file"; break;
+ case -3: p = "file too short"; break;
+ case -4: p = "bad file type"; break;
+ case -5: p = "no 'MTrk': not a midi file"; break;
+ case -6: p = "no running state"; break;
+ default:
+ printf("was??\n");
+ return -1;
+ }
+ }
+ if (p)
+ printf("Error: <%s>\n", p);
+ return 0;
+ }
diff --git a/muse/midiplugins/filter/ctrlcombo.cpp b/muse/midiplugins/filter/ctrlcombo.cpp
new file mode 100644
index 00000000..b4c436c6
--- /dev/null
+++ b/muse/midiplugins/filter/ctrlcombo.cpp
@@ -0,0 +1,56 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrlcombo.cpp,v 1.2 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "ctrlcombo.h"
+
+//---------------------------------------------------------
+// CtrlComboBox
+//---------------------------------------------------------
+
+CtrlComboBox::CtrlComboBox(QWidget* parent)
+ : QComboBox(parent)
+ {
+ const char* ctxt[] = {
+ "No Ctrl", "BankSelMSB", "Modulation", "BreathCtrl",
+ "Control 3", "Foot Ctrl", "Porta Time", "DataEntMSB",
+ "MainVolume", "Balance", "Control 9", "Pan",
+ "Expression", "Control 12", "Control 13", "Control 14",
+ "Control 15", "Gen.Purp.1", "Gen.Purp.2", "Gen.Purp.3",
+ "Gen.Purp.4", "Control 20", "Control 21", "Control 22",
+ "Control 23", "Control 24", "Control 25", "Control 26",
+ "Control 27", "Control 28", "Control 29", "Control 30",
+ "Control 31", "BankSelLSB", "Modul. LSB", "BrthCt.LSB",
+ "Control 35", "FootCt.LSB", "Port.T LSB", "DataEntLSB",
+ "MainVolLSB", "BalanceLSB", "Control 41", "Pan LSB",
+ "Expr. LSB", "Control 44", "Control 45", "Control 46",
+ "Control 47", "Gen.P.1LSB", "Gen.P.2LSB", "Gen.P.3LSB",
+ "Gen.P.4LSB", "Control 52", "Control 53", "Control 54",
+ "Control 55", "Control 56", "Control 57", "Control 58",
+ "Control 59", "Control 60", "Control 61", "Control 62",
+ "Control 63", "Sustain", "Porta Ped", "Sostenuto",
+ "Soft Pedal", "Control 68", "Hold 2", "Control 70",
+ "HarmonicCo", "ReleaseTime", "Attack Time", "Brightness",
+ "Control 75", "Control 76", "Control 77", "Control 78",
+ "Control 79", "Gen.Purp.5", "Gen.Purp.6", "Gen.Purp.7",
+ "Gen.Purp.8", "Porta Ctrl", "Control 85", "Control 86",
+ "Control 87", "Control 88", "Control 89", "Control 90",
+ "Effect1Dep", "Effect2Dep", "Effect3Dep", "Effect4Dep",
+ "Phaser Dep", "Data Incr", "Data Decr", "NRPN LSB",
+ "NRPN MSB", "RPN LSB", "RPN MSB", "Control102",
+ "Control103", "Control104", "Control105", "Control106",
+ "Control107", "Control108", "Control109", "Control110",
+ "Control111", "Control112", "Control113", "Control114",
+ "Control115", "Control116", "Control117", "Control118",
+ "Control119", "AllSndOff", "Reset Ctrl", "Local Ctrl",
+ "AllNoteOff", "OmniModOff", "OmniModeOn", "MonoModeOn",
+ "PolyModeOn"
+ };
+ for (unsigned int i = 0; i < sizeof(ctxt)/sizeof(*ctxt); ++i)
+ addItem(QString(ctxt[i]));
+ }
+
diff --git a/muse/midiplugins/filter/ctrlcombo.h b/muse/midiplugins/filter/ctrlcombo.h
new file mode 100644
index 00000000..53044b20
--- /dev/null
+++ b/muse/midiplugins/filter/ctrlcombo.h
@@ -0,0 +1,24 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrlcombo.h,v 1.2 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CTRLGRP_H__
+#define __CTRLGRP_H__
+
+//---------------------------------------------------------
+// CtrlComboBox
+//---------------------------------------------------------
+
+class CtrlComboBox : public QComboBox {
+ Q_OBJECT
+ public:
+ CtrlComboBox(QWidget* parent = 0);
+ };
+
+
+#endif
+
diff --git a/muse/midiplugins/filter/filter.cpp b/muse/midiplugins/filter/filter.cpp
new file mode 100644
index 00000000..696d7c61
--- /dev/null
+++ b/muse/midiplugins/filter/filter.cpp
@@ -0,0 +1,167 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filter.cpp,v 1.10 2005/11/06 17:49:34 wschweer Exp $
+//
+// filter - simple midi filter
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "filtergui.h"
+#include "filter.h"
+#include "midi.h"
+
+//---------------------------------------------------------
+// Filter
+//---------------------------------------------------------
+
+Filter::Filter(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ data.type = 0; // allow any events
+ for (int i = 0; i < 4; ++i)
+ data.ctrl[i] = -1;
+ gui = 0;
+ }
+
+//---------------------------------------------------------
+// Filter
+//---------------------------------------------------------
+
+Filter::~Filter()
+ {
+ if (gui)
+ delete gui;
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool Filter::init()
+ {
+ gui = new FilterGui(this, 0);
+ gui->setWindowTitle("MusE: "+QString(name()));
+ gui->show();
+ return false;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void Filter::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void Filter::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void Filter::process(unsigned, unsigned, MPEventList* il, MPEventList* ol)
+ {
+ for (iMPEvent i = il->begin(); i != il->end(); ++i) {
+ if (!filterEvent(*i))
+ ol->insert(*i);
+ }
+ }
+
+//---------------------------------------------------------
+// filterEvent
+// return true if event filtered
+//---------------------------------------------------------
+
+bool Filter::filterEvent(const MidiEvent& event)
+ {
+ switch(event.type()) {
+ case ME_NOTEON:
+ case ME_NOTEOFF:
+ if (data.type & MIDI_FILTER_NOTEON)
+ return true;
+ break;
+ case ME_POLYAFTER:
+ if (data.type & MIDI_FILTER_POLYP)
+ return true;
+ break;
+ case ME_CONTROLLER:
+ if (data.type & MIDI_FILTER_CTRL)
+ return true;
+ for (int i = 0; i < 4; ++i) {
+ if (data.ctrl[i] == event.dataA())
+ return true;
+ }
+ break;
+ case ME_PROGRAM:
+ if (data.type & MIDI_FILTER_PROGRAM)
+ return true;
+ break;
+ case ME_AFTERTOUCH:
+ if (data.type & MIDI_FILTER_AT)
+ return true;
+ break;
+ case ME_PITCHBEND:
+ if (data.type & MIDI_FILTER_PITCH)
+ return true;
+ break;
+ case ME_SYSEX:
+ if (data.type & MIDI_FILTER_SYSEX)
+ return true;
+ break;
+ default:
+ break;
+ }
+ return false;
+ }
+
+void Filter::getInitData(int* n, const unsigned char** p) const
+ {
+ *n = sizeof(data);
+ *p = (unsigned char*)&data;
+ }
+
+void Filter::setInitData(int n, const unsigned char* p)
+ {
+ memcpy((void*)&data, p, n);
+ if (gui)
+ gui->init();
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new Filter(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "Filter",
+ "MusE Simple Midi Filter",
+ "0.1", // filter version string
+ MEMPI_FILTER, // plugin type
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse/midiplugins/filter/filter.h b/muse/midiplugins/filter/filter.h
new file mode 100644
index 00000000..423eb225
--- /dev/null
+++ b/muse/midiplugins/filter/filter.h
@@ -0,0 +1,51 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filter.h,v 1.4 2005/06/12 08:18:37 wschweer Exp $
+//
+// filter - simple midi filter
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __FILTER_H__
+#define __FILTER_H__
+
+#include "../libmidiplugin/mempi.h"
+
+//---------------------------------------------------------
+// filter - simple midi filter
+//---------------------------------------------------------
+
+class Filter : public Mempi {
+ struct initData {
+ int type;
+ int ctrl[4];
+ } data;
+ FilterGui* gui;
+
+ bool filterEvent(const MidiEvent& event);
+ virtual void process(unsigned, unsigned, MPEventList*, MPEventList*);
+
+ public:
+ Filter(const char* name, const MempiHost*);
+ ~Filter();
+ virtual bool init();
+
+ int midiType() const { return data.type; }
+ void setMidiType(int t) { data.type = t; }
+ int midiCtrl(int i) const { return data.ctrl[i]; }
+ void setMidiCtrl(int i, int val) { data.ctrl[i] = val; }
+
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+
+#endif
+
diff --git a/muse/midiplugins/filter/filterbase.ui b/muse/midiplugins/filter/filterbase.ui
new file mode 100644
index 00000000..8e1693f2
--- /dev/null
+++ b/muse/midiplugins/filter/filterbase.ui
@@ -0,0 +1,269 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>FilterBase</class>
+ <widget class="QDialog" name="FilterBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>388</width>
+ <height>213</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Input Filter</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="GroupBoxx" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Event Filter</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="rf1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Note On</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Poly Pressure</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Controller</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Program Change</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>After Touch</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf6" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Pitch Bend</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf7" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Sysex</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="GroupBox4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Controller Filter</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="CtrlComboBox" name="cb1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="CtrlComboBox" name="cb2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="CtrlComboBox" name="cb3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="CtrlComboBox" name="cb4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>CtrlComboBox</class>
+ <extends>QComboBox</extends>
+ <header>ctrlcombo.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>rf1</tabstop>
+ <tabstop>rf2</tabstop>
+ <tabstop>rf3</tabstop>
+ <tabstop>rf4</tabstop>
+ <tabstop>rf5</tabstop>
+ <tabstop>rf6</tabstop>
+ <tabstop>rf7</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/midiplugins/filter/filtergui.cpp b/muse/midiplugins/filter/filtergui.cpp
new file mode 100644
index 00000000..f6fdd0eb
--- /dev/null
+++ b/muse/midiplugins/filter/filtergui.cpp
@@ -0,0 +1,187 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filtergui.cpp,v 1.4 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "filtergui.h"
+#include "filter.h"
+#include "ctrlcombo.h"
+
+//---------------------------------------------------------
+// MidiFilterConfig
+//---------------------------------------------------------
+
+FilterGui::FilterGui(Filter* f, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ filter = f;
+ connect(rf1, SIGNAL(toggled(bool)), SLOT(rf1Toggled(bool)));
+ connect(rf2, SIGNAL(toggled(bool)), SLOT(rf2Toggled(bool)));
+ connect(rf3, SIGNAL(toggled(bool)), SLOT(rf3Toggled(bool)));
+ connect(rf4, SIGNAL(toggled(bool)), SLOT(rf4Toggled(bool)));
+ connect(rf5, SIGNAL(toggled(bool)), SLOT(rf5Toggled(bool)));
+ connect(rf6, SIGNAL(toggled(bool)), SLOT(rf6Toggled(bool)));
+ connect(rf7, SIGNAL(toggled(bool)), SLOT(rf7Toggled(bool)));
+ connect(cb1, SIGNAL(activated(int)), SLOT(cb1Activated(int)));
+ connect(cb2, SIGNAL(activated(int)), SLOT(cb2Activated(int)));
+ connect(cb3, SIGNAL(activated(int)), SLOT(cb3Activated(int)));
+ connect(cb4, SIGNAL(activated(int)), SLOT(cb4Activated(int)));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void FilterGui::init()
+ {
+ int midiType = filter->midiType();
+ rf1->setChecked(midiType & MIDI_FILTER_NOTEON);
+ rf2->setChecked(midiType & MIDI_FILTER_POLYP);
+ rf3->setChecked(midiType & MIDI_FILTER_CTRL);
+ rf4->setChecked(midiType & MIDI_FILTER_PROGRAM);
+ rf5->setChecked(midiType & MIDI_FILTER_AT);
+ rf6->setChecked(midiType & MIDI_FILTER_PITCH);
+ rf7->setChecked(midiType & MIDI_FILTER_SYSEX);
+ cb1->setCurrentIndex(filter->midiCtrl(0));
+ cb2->setCurrentIndex(filter->midiCtrl(1));
+ cb3->setCurrentIndex(filter->midiCtrl(2));
+ cb4->setCurrentIndex(filter->midiCtrl(3));
+ }
+
+//---------------------------------------------------------
+// cb1Activated
+//---------------------------------------------------------
+
+void FilterGui::cb1Activated(int idx)
+ {
+ filter->setMidiCtrl(0, idx - 1);
+ }
+
+//---------------------------------------------------------
+// cb2Activated
+//---------------------------------------------------------
+
+void FilterGui::cb2Activated(int idx)
+ {
+ filter->setMidiCtrl(1, idx - 1);
+ }
+
+//---------------------------------------------------------
+// cb3Activated
+//---------------------------------------------------------
+
+void FilterGui::cb3Activated(int idx)
+ {
+ filter->setMidiCtrl(2, idx - 1);
+ }
+
+//---------------------------------------------------------
+// cb4Activated
+//---------------------------------------------------------
+
+void FilterGui::cb4Activated(int idx)
+ {
+ filter->setMidiCtrl(3, idx - 1);
+ }
+
+//---------------------------------------------------------
+// rf1Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf1Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf1->isChecked())
+ midiType |= MIDI_FILTER_NOTEON;
+ else
+ midiType &= ~MIDI_FILTER_NOTEON;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf2Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf2Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf2->isChecked())
+ midiType |= MIDI_FILTER_POLYP;
+ else
+ midiType &= ~MIDI_FILTER_POLYP;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf3Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf3Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf3->isChecked())
+ midiType |= MIDI_FILTER_CTRL;
+ else
+ midiType &= ~MIDI_FILTER_CTRL;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf4Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf4Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf4->isChecked())
+ midiType |= MIDI_FILTER_PROGRAM;
+ else
+ midiType &= ~MIDI_FILTER_PROGRAM;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf5Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf5Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf5->isChecked())
+ midiType |= MIDI_FILTER_AT;
+ else
+ midiType &= ~MIDI_FILTER_AT;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf6Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf6Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf1->isChecked())
+ midiType |= MIDI_FILTER_PITCH;
+ else
+ midiType &= ~MIDI_FILTER_PITCH;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf7Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf7Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf7->isChecked())
+ midiType |= MIDI_FILTER_SYSEX;
+ else
+ midiType &= ~MIDI_FILTER_SYSEX;
+ filter->setMidiType(midiType);
+ }
diff --git a/muse/midiplugins/filter/filtergui.h b/muse/midiplugins/filter/filtergui.h
new file mode 100644
index 00000000..871f3c1a
--- /dev/null
+++ b/muse/midiplugins/filter/filtergui.h
@@ -0,0 +1,57 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filtergui.h,v 1.4 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __FILTERGUI_H__
+#define __FILTERGUI_H__
+
+#include "filterbase.h"
+
+class Filter;
+
+enum {
+ MIDI_FILTER_NOTEON = 1,
+ MIDI_FILTER_POLYP = 2,
+ MIDI_FILTER_CTRL = 4,
+ MIDI_FILTER_PROGRAM = 8,
+ MIDI_FILTER_AT = 16,
+ MIDI_FILTER_PITCH = 32,
+ MIDI_FILTER_SYSEX = 64
+ };
+
+//---------------------------------------------------------
+// FilterGui
+//---------------------------------------------------------
+
+class FilterGui : public QDialog, public Ui::FilterBase {
+ Q_OBJECT
+
+ Filter* filter;
+
+ signals:
+ void hideWindow();
+
+ private slots:
+ void rf1Toggled(bool);
+ void rf2Toggled(bool);
+ void rf3Toggled(bool);
+ void rf4Toggled(bool);
+ void rf5Toggled(bool);
+ void rf6Toggled(bool);
+ void rf7Toggled(bool);
+ void cb1Activated(int);
+ void cb2Activated(int);
+ void cb3Activated(int);
+ void cb4Activated(int);
+
+ public:
+ FilterGui(Filter*, QWidget* parent=0);
+ void init();
+ };
+
+#endif
+
diff --git a/muse/midiplugins/libmidiplugin/evdata.h b/muse/midiplugins/libmidiplugin/evdata.h
new file mode 100644
index 00000000..8247b6e0
--- /dev/null
+++ b/muse/midiplugins/libmidiplugin/evdata.h
@@ -0,0 +1,64 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: evdata.h,v 1.2 2005/05/11 14:18:39 wschweer Exp $
+//
+// (C) Copyright 1999-2003 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __EVDATA_H__
+#define __EVDATA_H__
+
+//---------------------------------------------------------
+// EvData
+// variable len event data (sysex, meta etc.)
+//---------------------------------------------------------
+
+class EvData {
+ int* refCount;
+
+ public:
+ unsigned char* data;
+ int dataLen;
+
+ EvData() {
+ data = 0;
+ dataLen = 0;
+ refCount = new int(1);
+ }
+ EvData(const EvData& ed) {
+ data = ed.data;
+ dataLen = ed.dataLen;
+ refCount = ed.refCount;
+ (*refCount)++;
+ }
+
+ EvData& operator=(const EvData& ed) {
+ if (data == ed.data)
+ return *this;
+ if (--(*refCount) == 0) {
+ delete refCount;
+ delete[] data;
+ }
+ data = ed.data;
+ dataLen = ed.dataLen;
+ refCount = ed.refCount;
+ (*refCount)++;
+ return *this;
+ }
+
+ ~EvData() {
+ if (--(*refCount) == 0) {
+ delete[] data;
+ delete refCount;
+ }
+ }
+ void setData(const unsigned char* p, int l) {
+ data = new unsigned char[l];
+ memcpy(data, p, l);
+ dataLen = l;
+ }
+ };
+
+#endif
+
diff --git a/muse/midiplugins/libmidiplugin/mempi.cpp b/muse/midiplugins/libmidiplugin/mempi.cpp
new file mode 100644
index 00000000..91171c3b
--- /dev/null
+++ b/muse/midiplugins/libmidiplugin/mempi.cpp
@@ -0,0 +1,81 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mempi.cpp,v 1.4 2005/05/24 15:27:48 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "mempi.h"
+
+static const int FIFO_SIZE = 128;
+
+//---------------------------------------------------------
+// MidiEvent
+//---------------------------------------------------------
+
+MidiEvent::MidiEvent(unsigned t, int tpe, const unsigned char* data, int len)
+ {
+ _time = t;
+ edata.setData(data, len);
+ _type = tpe;
+ }
+
+//---------------------------------------------------------
+// operator <
+//---------------------------------------------------------
+
+bool MidiEvent::operator<(const MidiEvent& e) const
+ {
+ if (time() != e.time())
+ return time() < e.time();
+
+ // play note off events first to prevent overlapping
+ // notes
+
+ if (channel() == e.channel())
+ return type() == 0x80
+ || (type() == 0x90 && dataB() == 0);
+
+ int map[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, 13, 14, 15 };
+ return map[channel()] < map[e.channel()];
+ }
+
+//---------------------------------------------------------
+// MempiP
+// Mempi private data structure
+//---------------------------------------------------------
+
+struct MempiP {
+ int dummy;
+ };
+
+//---------------------------------------------------------
+// Mempi
+//---------------------------------------------------------
+
+Mempi::Mempi(const char* n, const MempiHost* h)
+ {
+ _name = strdup(n);
+ host = h;
+ d = new MempiP;
+ }
+
+Mempi::~Mempi()
+ {
+ delete _name;
+ delete d;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+// dummy
+//---------------------------------------------------------
+
+void Mempi::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ x = 0;
+ y = 0;
+ w = 0;
+ h = 0;
+ }
+
diff --git a/muse/midiplugins/libmidiplugin/mempi.h b/muse/midiplugins/libmidiplugin/mempi.h
new file mode 100644
index 00000000..3d8ef68e
--- /dev/null
+++ b/muse/midiplugins/libmidiplugin/mempi.h
@@ -0,0 +1,97 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mempi.h,v 1.10 2005/07/16 09:31:50 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+//
+// MusE experimental midi plugin interface
+//
+
+#ifndef __MEMPI_H__
+#define __MEMPI_H__
+
+#define MEMPI_MAJOR_VERSION 1
+#define MEMPI_MINOR_VERSION 1
+
+#include <set>
+#include "evdata.h"
+#include "memory.h"
+#include "mpevent.h"
+
+class MempiP;
+
+//---------------------------------------------------------
+// MempiHost
+// Host Infos
+//---------------------------------------------------------
+
+struct MempiHost {
+ virtual int division() const; // midi division
+ virtual int tempo(unsigned tick) const;
+ virtual unsigned tick2frame(unsigned tick) const;
+ virtual unsigned frame2tick(unsigned frame) const;
+ virtual void bar(int tick, int* bar, int* beat, unsigned* rest) const;
+ virtual unsigned bar2tick(int bar, int beat, int tick) const;
+ virtual ~MempiHost() {}
+ };
+
+//---------------------------------------------------------
+// Mempi
+// Instance class
+// MusE experimental midi plugin interface
+// Instance virtual interface class
+//---------------------------------------------------------
+
+class Mempi {
+ MempiP* d;
+ const char* _name; // mempi instance name
+
+ protected:
+ const MempiHost* host;
+
+ public:
+ // modul interface
+ Mempi(const char* name, const MempiHost*);
+ virtual ~Mempi();
+ virtual bool init() { return false; }
+ const char* name() const { return _name; }
+
+ // process interface
+ virtual void process(unsigned, unsigned, MPEventList*, MPEventList*) = 0;
+
+ // session interface
+ virtual void getInitData(int*, const unsigned char**) const {}
+ virtual void setInitData(int, const unsigned char*) {}
+
+ // GUI interface routines
+ virtual bool hasGui() const { return false; }
+ virtual bool guiVisible() const { return false; }
+ virtual void showGui(bool) {}
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int) {}
+ };
+
+//---------------------------------------------------------
+// MEMPI
+// Class descriptor
+//---------------------------------------------------------
+
+enum MempiType { MEMPI_FILTER = 0, MEMPI_GENERATOR = 1 };
+
+struct MEMPI {
+ const char* name;
+ const char* description;
+ const char* version;
+ MempiType type;
+ int majorMempiVersion, minorMempiVersion;
+ Mempi* (*instantiate)(const char* name, const MempiHost*);
+ };
+
+extern "C" {
+ const MEMPI* mempi_descriptor();
+ }
+
+#endif
+
diff --git a/muse/midiplugins/libmidiplugin/mpevent.cpp b/muse/midiplugins/libmidiplugin/mpevent.cpp
new file mode 100644
index 00000000..872261e1
--- /dev/null
+++ b/muse/midiplugins/libmidiplugin/mpevent.cpp
@@ -0,0 +1,21 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mpevent.cpp,v 1.1 2005/05/08 17:01:30 wschweer Exp $
+//
+// (C) Copyright 2002-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "mpevent.h"
+
+//---------------------------------------------------------
+// MEvent
+//---------------------------------------------------------
+
+MEvent::MEvent(unsigned t, int tpe, const unsigned char* data, int len)
+ {
+ _time = t;
+ edata.setData(data, len);
+ _type = tpe;
+ }
+
diff --git a/muse/midiplugins/libmidiplugin/mpevent.h b/muse/midiplugins/libmidiplugin/mpevent.h
new file mode 100644
index 00000000..b7bdee60
--- /dev/null
+++ b/muse/midiplugins/libmidiplugin/mpevent.h
@@ -0,0 +1,104 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mpevent.h,v 1.3 2005/06/06 14:24:53 wschweer Exp $
+//
+// (C) Copyright 1999-2002 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MPEVENT_H__
+#define __MPEVENT_H__
+
+#include <set>
+#include "evdata.h"
+#include <ext/mt_allocator.h>
+
+class Event;
+class EvData;
+
+//---------------------------------------------------------
+// MidiEvent
+//---------------------------------------------------------
+
+class MidiEvent {
+ unsigned _time;
+ EvData edata;
+ unsigned char _channel, _type;
+ int _a, _b;
+
+ public:
+ MidiEvent() {}
+ MidiEvent(unsigned tm, int c, int t, int a, int b)
+ : _time(tm), _channel(c & 0xf), _type(t), _a(a), _b(b) {}
+ MidiEvent(unsigned t, int type, const unsigned char* data, int len);
+ MidiEvent(unsigned t, int tpe, EvData d) : _time(t), edata(d), _type(tpe) {}
+ MidiEvent(unsigned t, int channel, const Event& e);
+
+ ~MidiEvent() {}
+
+ MidiEvent& operator=(const MidiEvent& ed) {
+ _time = ed._time;
+ edata = ed.edata;
+ _channel = ed._channel;
+ _type = ed._type;
+ _a = ed._a;
+ _b = ed._b;
+ return *this;
+ }
+
+ int channel() const { return _channel; }
+ int type() const { return _type; }
+ int dataA() const { return _a; }
+ int dataB() const { return _b; }
+ unsigned time() const { return _time; }
+
+ void setChannel(int val) { _channel = val; }
+ void setType(int val) { _type = val; }
+ void setA(int val) { _a = val; }
+ void setB(int val) { _b = val; }
+ void setTime(unsigned val) { _time = val; }
+
+ const EvData& eventData() const { return edata; }
+ unsigned char* data() const { return edata.data; }
+ int len() const { return edata.dataLen; }
+ void setData(const EvData& e) { edata = e; }
+ void setData(const unsigned char* p, int len) { edata.setData(p, len); }
+ void dump() const;
+ bool isNote() const { return _type == 0x90; }
+ bool isNoteOff() const { return (_type == 0x80)||(_type == 0x90 && _b == 0); }
+ bool operator<(const MidiEvent&) const;
+ };
+
+//---------------------------------------------------------
+// MPEventList
+//---------------------------------------------------------
+
+// typedef std::multiset<MidiEvent, std::less<MidiEvent>,
+// __gnu_cxx::__mt_alloc<MidiEvent> > MPEL;
+
+typedef std::multiset<MidiEvent, std::less<MidiEvent> > MPEL;
+
+struct MPEventList : public MPEL {
+ void add(const MidiEvent& ev) { MPEL::insert(ev); }
+ };
+
+typedef MPEventList::iterator iMPEvent;
+typedef MPEventList::const_iterator ciMPEvent;
+
+//---------------------------------------------------------
+// MREventList
+//---------------------------------------------------------
+
+// typedef std::list<MidiEvent, __gnu_cxx::__mt_alloc<MidiEvent> > MREL;
+
+typedef std::list<MidiEvent> MREL;
+
+struct MREventList : public MREL {
+ void add(const MidiEvent& ev) { MREL::push_back(ev); }
+ };
+
+typedef MREventList::iterator iMREvent;
+typedef MREventList::const_iterator ciMREvent;
+
+#endif
+
diff --git a/muse/midiplugins/metronom/metronom.cpp b/muse/midiplugins/metronom/metronom.cpp
new file mode 100644
index 00000000..8dfce574
--- /dev/null
+++ b/muse/midiplugins/metronom/metronom.cpp
@@ -0,0 +1,167 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: metronom.cpp,v 1.3 2005/11/16 17:55:59 wschweer Exp $
+//
+// metronom - midi metronom
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "metronomgui.h"
+#include "metronom.h"
+#include "midi.h"
+#include "mpevent.h"
+
+//---------------------------------------------------------
+// Metronom
+//---------------------------------------------------------
+
+Metronom::Metronom(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ gui = 0;
+ }
+
+//---------------------------------------------------------
+// Metronom
+//---------------------------------------------------------
+
+Metronom::~Metronom()
+ {
+ if (gui)
+ delete gui;
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool Metronom::init()
+ {
+ nextTick = 0;
+ lastTo = 0;
+ data.measureNote = 63;
+ data.measureVelo = 127;
+ data.beatNote = 63;
+ data.beatVelo = 70;
+
+ gui = new MetronomGui(this, 0);
+ gui->setWindowTitle(QString(name()));
+ gui->show();
+
+ return false;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void Metronom::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void Metronom::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void Metronom::process(unsigned from, unsigned to, MPEventList* il, MPEventList* ol)
+ {
+ if (from == to) {
+ nextTick = 0;
+ return;
+ }
+ if (lastTo != from) { // seek?
+// printf(" seek? %d-%d\n", lastTo, from);
+ nextTick = 0;
+ }
+ lastTo = to;
+ if (nextTick > to)
+ return;
+ while (nextTick < to) {
+ int bar, beat;
+ unsigned tick;
+ if (nextTick < from) {
+ host->bar(from, &bar, &beat, &tick);
+ if (tick)
+ nextTick = host->bar2tick(bar, beat+1, 0);
+ else
+ nextTick = from;
+ }
+ host->bar(nextTick, &bar, &beat, &tick);
+ bool isMeasure = beat == 0;
+
+ MidiEvent ev(nextTick, 0, ME_NOTEON, data.beatNote, data.beatVelo);
+ if (isMeasure) {
+ ev.setA(data.measureNote);
+ ev.setB(data.measureVelo);
+ }
+ ol->insert(ev); // insert note on
+ ev.setB(0);
+ ev.setTime(nextTick + 10);
+ ev.setB(0);
+ ol->insert(ev); // insert note off
+
+ nextTick = host->bar2tick(bar, beat+1, 0);
+ }
+ }
+
+//---------------------------------------------------------
+// getInitData
+//---------------------------------------------------------
+
+void Metronom::getInitData(int* n, const unsigned char** p) const
+ {
+ *n = sizeof(data);
+ *p = (unsigned char*)&data;
+ }
+
+//---------------------------------------------------------
+// setInitData
+//---------------------------------------------------------
+
+void Metronom::setInitData(int n, const unsigned char* p)
+ {
+ memcpy((void*)&data, p, n);
+ if (gui)
+ gui->init();
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new Metronom(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "Metronom",
+ "MusE Simple Midi Metronom",
+ "0.1", // version string
+ MEMPI_GENERATOR,
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse/midiplugins/metronom/metronom.h b/muse/midiplugins/metronom/metronom.h
new file mode 100644
index 00000000..89ffb69b
--- /dev/null
+++ b/muse/midiplugins/metronom/metronom.h
@@ -0,0 +1,53 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: metronom.h,v 1.3 2005/06/12 09:22:51 wschweer Exp $
+//
+// metronom - simple midi metronom
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __METRONOM_H__
+#define __METRONOM_H__
+
+#include "../libmidiplugin/mempi.h"
+
+//---------------------------------------------------------
+// metronom - simple midi metronom
+//---------------------------------------------------------
+
+class Metronom : public Mempi {
+
+ protected:
+ struct InitData {
+ char measureNote;
+ char measureVelo;
+ char beatNote;
+ char beatVelo;
+ } data;
+ MetronomGui* gui;
+ friend class MetronomGui;
+
+ unsigned int nextTick;
+ unsigned int lastTo;
+
+ virtual void process(unsigned, unsigned, MPEventList*, MPEventList*);
+
+ public:
+ Metronom(const char* name, const MempiHost*);
+ ~Metronom();
+ virtual bool init();
+
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+
+#endif
+
diff --git a/muse/midiplugins/metronom/metronomgui.cpp b/muse/midiplugins/metronom/metronomgui.cpp
new file mode 100644
index 00000000..e6705f7c
--- /dev/null
+++ b/muse/midiplugins/metronom/metronomgui.cpp
@@ -0,0 +1,75 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: metronomgui.cpp,v 1.2 2005/10/05 17:02:03 lunar_shuttle Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "metronomgui.h"
+#include "metronom.h"
+
+//---------------------------------------------------------
+// MidiMetronomConfig
+//---------------------------------------------------------
+
+MetronomGui::MetronomGui(Metronom* f, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ metronom = f;
+ init();
+ connect(beatNote, SIGNAL(valueChanged(int)), SLOT(beatNoteChanged(int)));
+ connect(measureVelocity, SIGNAL(valueChanged(int)), SLOT(measureVelocityChanged(int)));
+ connect(measureNote, SIGNAL(valueChanged(int)), SLOT(measureNoteChanged(int)));
+ connect(beatVelocity, SIGNAL(valueChanged(int)), SLOT(beatVelocityChanged(int)));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void MetronomGui::init()
+ {
+ beatNote->setValue(metronom->data.beatNote);
+ measureNote->setValue(metronom->data.measureNote);
+ beatVelocity->setValue(metronom->data.beatVelo);
+ measureVelocity->setValue(metronom->data.measureVelo);
+ }
+
+//---------------------------------------------------------
+// beatNoteChanged
+//---------------------------------------------------------
+
+void MetronomGui::beatNoteChanged(int val)
+ {
+ metronom->data.beatNote = val;
+ }
+
+//---------------------------------------------------------
+// measureVelocityChanged
+//---------------------------------------------------------
+
+void MetronomGui::measureVelocityChanged(int val)
+ {
+ metronom->data.measureVelo = val;
+ }
+
+//---------------------------------------------------------
+// measureNoteChanged
+//---------------------------------------------------------
+
+void MetronomGui::measureNoteChanged(int val)
+ {
+ metronom->data.measureNote = val;
+ }
+
+//---------------------------------------------------------
+// beatVelocityChanged
+//---------------------------------------------------------
+
+void MetronomGui::beatVelocityChanged(int val)
+ {
+ metronom->data.beatVelo = val;
+ }
+
diff --git a/muse/midiplugins/metronom/metronomgui.h b/muse/midiplugins/metronom/metronomgui.h
new file mode 100644
index 00000000..d99dab0b
--- /dev/null
+++ b/muse/midiplugins/metronom/metronomgui.h
@@ -0,0 +1,36 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: metronomgui.h,v 1.3 2005/10/05 17:02:03 lunar_shuttle Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __METRONOMGUI_H__
+#define __METRONOMGUI_H__
+
+#include "ui_metronogui.h"
+
+class Metronom;
+
+//---------------------------------------------------------
+// MetronomGui
+//---------------------------------------------------------
+
+class MetronomGui : public QDialog, public Ui::MetronomBase {
+ Q_OBJECT
+ Metronom* metronom;
+
+ private slots:
+ void beatNoteChanged(int);
+ void measureVelocityChanged(int);
+ void measureNoteChanged(int);
+ void beatVelocityChanged(int);
+
+ public:
+ MetronomGui(Metronom*, QWidget* parent=0);
+ void init();
+ };
+
+#endif
+
diff --git a/muse/midiplugins/metronom/metronomgui.ui b/muse/midiplugins/metronom/metronomgui.ui
new file mode 100644
index 00000000..188735d4
--- /dev/null
+++ b/muse/midiplugins/metronom/metronomgui.ui
@@ -0,0 +1,150 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MetronomBase</class>
+ <widget class="QDialog" name="MetronomBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>429</width>
+ <height>164</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Metronome</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font" >
+ <font>
+ <family>ZappedChancellor</family>
+ <pointsize>48</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="toolTip" >
+ <string>Metronome</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Metronome</string>
+ </property>
+ <property name="text" >
+ <string>M</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>Measure Note</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>Measure Velocity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QLabel" name="TextLabel4" >
+ <property name="text" >
+ <string>Beat Velocity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>Beat Note</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QSpinBox" name="beatNote" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QSpinBox" name="measureVelocity" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="measureNote" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QSpinBox" name="beatVelocity" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/midiplugins/transform/transform.cpp b/muse/midiplugins/transform/transform.cpp
new file mode 100644
index 00000000..6c2b2968
--- /dev/null
+++ b/muse/midiplugins/transform/transform.cpp
@@ -0,0 +1,904 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: transform.cpp,v 1.8 2005/11/17 18:19:30 wschweer Exp $
+//
+// (C) Copyright 2001-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "mpevent.h"
+#include "transform.h"
+
+static int eventTypeTable[] = {
+ 1, 6, 4, 7, 8, 10, 11
+ };
+static int procVal2Map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 10, 11 };
+
+struct TDict {
+ TransformFunction id;
+ const QString text;
+ TDict(TransformFunction f, const QString& s) : id(f), text(s) {}
+ };
+
+static const TDict oplist[] = {
+ TDict(Trans, QString("Transform")),
+ TDict(Delete, QString("Filter"))
+ };
+
+static const char* vall[] = {
+ "c","c#","d","d#","e","f","f#","g","g#","a","a#","h"
+ };
+static const char* valu[] = {
+ "C","C#","D","D#","E","F","F#","G","G#","A","A#","H"
+ };
+
+//---------------------------------------------------------
+// pitch2string
+//---------------------------------------------------------
+
+static QString pitch2string(int v)
+ {
+ if (v < 0 || v > 127)
+ return QString("----");
+ int octave = (v / 12) - 2;
+ QString o;
+ o.sprintf("%d", octave);
+ int i = v % 12;
+ QString s(octave < 0 ? valu[i] : vall[i]);
+ return s + o;
+ }
+//---------------------------------------------------------
+// Transform
+//---------------------------------------------------------
+
+Transform::Transform(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ }
+
+bool Transform::init()
+ {
+ gui = new TransformDialog(this, 0);
+ gui->setWindowTitle(QString(name()));
+ gui->show();
+
+ data.selEventOp = All;
+ data.selType = 0x90;
+ data.selVal1 = Ignore;
+ data.selVal1a = 0;
+ data.selVal1b = 0;
+ data.selVal2 = Ignore;
+ data.selVal2a = 0;
+ data.selVal2b = 0;
+ data.procEvent = Keep;
+ data.eventType = 0x90;
+ data.procVal1 = Keep;
+ data.procVal1a = 0;
+ data.procVal1b = 0;
+ data.procVal2 = Keep;
+ data.procVal2a = 0;
+ data.procVal2b = 0;
+ data.funcOp = Trans;
+ data.quantVal = host->division();
+ data.selChannel = Ignore;
+ data.selChannela = 0;
+ data.selChannelb = 0;
+ data.procChannel = Keep;
+ data.procChannela = 0;
+ data.procChannelb = 0;
+ return false;
+ }
+
+//---------------------------------------------------------
+// filterValOp
+//---------------------------------------------------------
+
+static bool filterValOp(ValOp op, int val, int val1, int val2)
+ {
+ switch (op) {
+ case Ignore:
+ break;
+ case Equal:
+ if (val != val1)
+ return true;
+ break;
+ case Unequal:
+ if (val == val1)
+ return true;
+ break;
+ case Higher:
+ if (val <= val1)
+ return true;
+ break;
+ case Lower:
+ if (val >= val1)
+ return true;
+ break;
+ case Inside:
+ if ((val < val1) || (val >= val2))
+ return true;
+ break;
+ case Outside:
+ if ((val >= val1) && (val < val2))
+ return true;
+ break;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// apply
+// apply Select filter
+// return 0 - not applied
+// 1 - drop event
+// 2 - event changed
+//---------------------------------------------------------
+
+void Transform::process(unsigned, unsigned, MPEventList* il, MPEventList* ol)
+ {
+ for (iMPEvent i = il->begin(); i != il->end(); ++i) {
+ MidiEvent event(*i);
+ if (filterEvent(event) == 1)
+ continue;
+ ol->insert(event);
+ }
+ }
+
+//---------------------------------------------------------
+// filterEvent
+//---------------------------------------------------------
+
+int Transform::filterEvent(MidiEvent& event)
+ {
+ switch (data.selEventOp) {
+ case Equal:
+ switch(event.type()) {
+ case 0x90:
+ case 0x80:
+ if (data.selType != 0x90)
+ return 0;
+ break;
+ default:
+ if (event.type() != data.selType)
+ return 0;
+ break;
+ }
+ break;
+ case Unequal:
+ switch(event.type()) {
+ case 0x90:
+ case 0x80:
+ if (data.selType == 0x90)
+ return 0;
+ break;
+ default:
+ if (event.type() == data.selType)
+ return 0;
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ if (filterValOp(data.selVal1, event.dataA(), data.selVal1a, data.selVal1b))
+ return 0;
+ if (filterValOp(data.selVal2, event.dataB(), data.selVal2a, data.selVal2b))
+ return 0;
+ if (filterValOp(data.selChannel, event.channel(), data.selChannela, data.selChannelb))
+ return 0;
+
+ if (data.funcOp == Delete)
+ return 1; // discard event
+
+ // transform event
+ if (data.procEvent != Keep)
+ event.setType(data.eventType);
+
+ //---------------------------------------------------
+ // transform value A
+ //---------------------------------------------------
+
+ int val = event.dataA();
+ switch (data.procVal1) {
+ case Keep:
+ break;
+ case Plus:
+ val += data.procVal1a;
+ break;
+ case Minus:
+ val -= data.procVal1a;
+ break;
+ case Multiply:
+ val = int(val * (data.procVal1a/100.0) + .5);
+ break;
+ case Divide:
+ val = int(val / (data.procVal1a/100.0) + .5);
+ break;
+ case Fix:
+ val = data.procVal1a;
+ break;
+ case Value:
+ val = data.procVal2a;
+ break;
+ case Invert:
+ val = 127 - val;
+ break;
+ case ScaleMap:
+ printf("scale map not implemented\n");
+ break;
+ case Flip:
+ val = data.procVal1a - val;
+ break;
+ case Dynamic: // "crescendo"
+ printf("transform not implemented\n");
+ break;
+ case Random:
+ {
+ int range = data.procVal1b - data.procVal1a;
+ if (range > 0)
+ val = (rand() % range) + data.procVal1a;
+ else if (range < 0)
+ val = (rand() % -range) + data.procVal1b;
+ else
+ val = data.procVal1a;
+ }
+ break;
+ }
+ if (val < 0)
+ val = 0;
+ if (val > 127)
+ val = 127;
+ event.setA(val);
+
+ //---------------------------------------------------
+ // transform value B
+ //---------------------------------------------------
+
+ val = event.dataB();
+ switch (data.procVal2) {
+ case Plus:
+ val += data.procVal2a;
+ break;
+ case Minus:
+ val -= data.procVal2a;
+ break;
+ case Multiply:
+ val = int(val * (data.procVal2a/100.0) + .5);
+ break;
+ case Divide:
+ val = int(val / (data.procVal2a/100.0) + .5);
+ break;
+ case Fix:
+ val = data.procVal2a;
+ break;
+ case Value:
+ val = data.procVal1a;
+ break;
+ case Invert:
+ val = 127 - val;
+ break;
+ case Dynamic:
+ printf("transform not implemented\n");
+ break;
+ case Random:
+ {
+ int range = data.procVal2b - data.procVal2a;
+ if (range > 0)
+ val = (rand() % range) + data.procVal2a;
+ else if (range < 0)
+ val = (rand() % -range) + data.procVal2b;
+ else
+ val = data.procVal2a;
+ }
+ break;
+ case ScaleMap:
+ case Keep:
+ case Flip:
+ break;
+ }
+ if (val < 0)
+ val = 0;
+ if (val > 127)
+ val = 127;
+ event.setB(val);
+
+ //---------------------------------------------------
+ // transform channel
+ //---------------------------------------------------
+
+ val = event.channel();
+ switch (data.procChannel) {
+ case Plus:
+ val += data.procChannela;
+ break;
+ case Minus:
+ val -= data.procChannela;
+ break;
+ case Multiply:
+ val = int(val * (data.procChannela/100.0) + .5);
+ break;
+ case Divide:
+ val = int(val / (data.procChannela/100.0) + .5);
+ break;
+ case Fix:
+ val = data.procChannela;
+ break;
+ case Value:
+ val = data.procChannela;
+ break;
+ case Invert:
+ val = 16 - val;
+ break;
+ case Dynamic:
+ printf("transform not implemented\n");
+ break;
+ case Random:
+ {
+ int range = data.procChannelb - data.procChannela;
+ if (range > 0)
+ val = (rand() % range) + data.procChannela;
+ else if (range < 0)
+ val = (rand() % -range) + data.procChannelb;
+ else
+ val = data.procChannela;
+ }
+ break;
+ case ScaleMap:
+ case Keep:
+ case Flip:
+ break;
+ }
+ if (val < 0)
+ val = 0;
+ if (val > 15)
+ val = 15;
+ event.setChannel(val);
+ return 2;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void Transform::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void Transform::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// TransformDialog
+// Widgets:
+// selEventOp selType
+// selVal1Op selVal1a selVal1b
+// selVal2Op selVal2a selVal2b
+//
+// procEventOp procType
+// procVal1Op procVal1a procVal1b
+// procVal2Op procVal2a procVal2b
+// funcOp funcQuantVal
+// buttonNew buttonDelete
+//
+// selChannelOp selChannelVala selChannelValb
+// procChannelOp procChannelVala procChannelValb
+//---------------------------------------------------------
+
+TransformDialog::TransformDialog(Transform* tf, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ cmt = tf;
+
+ for (unsigned i = 0; i < sizeof(oplist)/sizeof(*oplist); ++i)
+ funcOp->addItem(oplist[i].text, i);
+
+ connect(selEventOp, SIGNAL(activated(int)), SLOT(selEventOpSel(int)));
+ connect(selType, SIGNAL(activated(int)), SLOT(selTypeSel(int)));
+ connect(selVal1Op, SIGNAL(activated(int)), SLOT(selVal1OpSel(int)));
+ connect(selVal2Op, SIGNAL(activated(int)), SLOT(selVal2OpSel(int)));
+ connect(procEventOp, SIGNAL(activated(int)), SLOT(procEventOpSel(int)));
+ connect(procType, SIGNAL(activated(int)), SLOT(procEventTypeSel(int)));
+ connect(procVal1Op, SIGNAL(activated(int)), SLOT(procVal1OpSel(int)));
+ connect(procVal2Op, SIGNAL(activated(int)), SLOT(procVal2OpSel(int)));
+ connect(funcOp, SIGNAL(activated(int)), SLOT(funcOpSel(int)));
+ connect(selVal1a, SIGNAL(valueChanged(int)), SLOT(selVal1aChanged(int)));
+ connect(selVal1b, SIGNAL(valueChanged(int)), SLOT(selVal1bChanged(int)));
+ connect(selVal2a, SIGNAL(valueChanged(int)), SLOT(selVal2aChanged(int)));
+ connect(selVal2b, SIGNAL(valueChanged(int)), SLOT(selVal2bChanged(int)));
+ connect(procVal1a, SIGNAL(valueChanged(int)), SLOT(procVal1aChanged(int)));
+ connect(procVal1b, SIGNAL(valueChanged(int)), SLOT(procVal1bChanged(int)));
+ connect(procVal2a, SIGNAL(valueChanged(int)), SLOT(procVal2aChanged(int)));
+ connect(procVal2b, SIGNAL(valueChanged(int)), SLOT(procVal2bChanged(int)));
+ connect(selChannelOp, SIGNAL(activated(int)), SLOT(selChannelOpSel(int)));
+ connect(selChannelVala, SIGNAL(valueChanged(int)), SLOT(selChannelValaChanged(int)));
+ connect(selChannelValb, SIGNAL(valueChanged(int)), SLOT(selChannelValbChanged(int)));
+ connect(procChannelOp, SIGNAL(activated(int)), SLOT(procChannelOpSel(int)));
+ connect(procChannelVala, SIGNAL(valueChanged(int)), SLOT(procChannelValaChanged(int)));
+ connect(procChannelValb, SIGNAL(valueChanged(int)), SLOT(procChannelValbChanged(int)));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void TransformDialog::init()
+ {
+ selEventOp->setCurrentIndex(cmt->data.selEventOp);
+ selEventOpSel(cmt->data.selEventOp);
+
+ for (unsigned i = 0; i < sizeof(eventTypeTable)/sizeof(*eventTypeTable); ++i) {
+ if (eventTypeTable[i] == cmt->data.selType) {
+ selType->setCurrentIndex(i);
+ break;
+ }
+ }
+
+ selVal1Op->setCurrentIndex(cmt->data.selVal1);
+ selVal1OpSel(cmt->data.selVal1);
+
+ selVal2Op->setCurrentIndex(cmt->data.selVal2);
+ selVal2OpSel(cmt->data.selVal2);
+
+ selChannelOp->setCurrentIndex(cmt->data.selChannel);
+ selChannelOpSel(cmt->data.selChannel);
+
+ {
+ unsigned i;
+ for (i = 0; i < sizeof(oplist)/sizeof(*oplist); ++i) {
+ if (oplist[i].id == cmt->data.funcOp) {
+ funcOp->setCurrentIndex(i);
+ break;
+ }
+ }
+ if (i == sizeof(oplist)/sizeof(*oplist))
+ printf("internal error: bad OpCode\n");
+ funcOpSel(i);
+ }
+
+ procEventOp->setCurrentIndex(cmt->data.procEvent);
+ procEventOpSel(cmt->data.procEvent);
+
+ procVal1Op->setCurrentIndex(cmt->data.procVal1);
+ procVal1OpSel(cmt->data.procVal1);
+
+ for (unsigned i = 0; i < sizeof(procVal2Map)/sizeof(*procVal2Map); ++i) {
+ if (procVal2Map[i] == cmt->data.procVal2) {
+ procVal2Op->setCurrentIndex(i);
+ break;
+ }
+ }
+
+ selVal1a->setValue(cmt->data.selVal1a);
+ selVal1b->setValue(cmt->data.selVal1b);
+ selVal1aChanged(cmt->data.selVal1a);
+ selVal1bChanged(cmt->data.selVal1b);
+
+ selVal2a->setValue(cmt->data.selVal2a);
+ selVal2b->setValue(cmt->data.selVal2b);
+
+ selChannelVala->setValue(cmt->data.selChannela);
+ selChannelValb->setValue(cmt->data.selChannelb);
+
+ procVal1a->setValue(cmt->data.procVal1a);
+ procVal1b->setValue(cmt->data.procVal1b);
+
+ procVal2a->setValue(cmt->data.procVal2a);
+ procVal2b->setValue(cmt->data.procVal2b);
+
+ procChannelVala->setValue(cmt->data.procChannela);
+ procChannelValb->setValue(cmt->data.procChannelb);
+ }
+
+//---------------------------------------------------------
+// setValOp
+//---------------------------------------------------------
+
+void TransformDialog::setValOp(QWidget* a, QWidget* b, ValOp op)
+ {
+ switch (op) {
+ case Ignore:
+ a->setEnabled(false);
+ b->setEnabled(false);
+ break;
+ case Equal:
+ case Unequal:
+ case Higher:
+ case Lower:
+ a->setEnabled(true);
+ b->setEnabled(false);
+ break;
+ case Inside:
+ case Outside:
+ a->setEnabled(true);
+ b->setEnabled(true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// selEventOpSel
+//---------------------------------------------------------
+
+void TransformDialog::selEventOpSel(int val)
+ {
+ selType->setEnabled(val != All);
+ cmt->data.selEventOp = ValOp(val);
+ selVal1aChanged(cmt->data.selVal1a);
+ selVal1bChanged(cmt->data.selVal1b);
+ }
+
+//---------------------------------------------------------
+// selTypeSel
+//---------------------------------------------------------
+
+void TransformDialog::selTypeSel(int val)
+ {
+ cmt->data.selType = eventTypeTable[val];
+ selVal1aChanged(cmt->data.selVal1a);
+ selVal1bChanged(cmt->data.selVal1b);
+ }
+
+//---------------------------------------------------------
+// selVal1OpSel
+//---------------------------------------------------------
+
+void TransformDialog::selVal1OpSel(int val)
+ {
+ setValOp(selVal1a, selVal1b, ValOp(val));
+ cmt->data.selVal1 = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// selVal2OpSel
+//---------------------------------------------------------
+
+void TransformDialog::selVal2OpSel(int val)
+ {
+ setValOp(selVal2a, selVal2b, ValOp(val));
+ cmt->data.selVal2 = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// procEventOpSel
+//---------------------------------------------------------
+
+void TransformDialog::procEventOpSel(int val)
+ {
+ TransformOperator op = val == 0 ? Keep : Fix;
+ procType->setEnabled(op == Fix);
+ cmt->data.procEvent = op;
+ }
+
+//---------------------------------------------------------
+// procEventTypeSel
+//---------------------------------------------------------
+
+void TransformDialog::procEventTypeSel(int val)
+ {
+ cmt->data.eventType = eventTypeTable[val];
+ }
+
+//---------------------------------------------------------
+// procVal1OpSel
+//---------------------------------------------------------
+
+void TransformDialog::procVal1OpSel(int val)
+ {
+ cmt->data.procVal1 = TransformOperator(val);
+ switch(TransformOperator(val)) {
+ case Keep:
+ case Invert:
+ procVal1a->setEnabled(false);
+ procVal1b->setEnabled(false);
+ break;
+ case Multiply:
+ case Divide:
+ procVal1a->setEnabled(true);
+ procVal1b->setEnabled(false);
+ break;
+ case Plus:
+ case Minus:
+ case Fix:
+ case Value:
+ case Flip:
+ procVal1a->setEnabled(true);
+ procVal1b->setEnabled(false);
+ break;
+ case Random:
+ case ScaleMap:
+ case Dynamic:
+ procVal1a->setEnabled(true);
+ procVal1b->setEnabled(true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// procVal2OpSel
+//---------------------------------------------------------
+
+void TransformDialog::procVal2OpSel(int val)
+ {
+ TransformOperator op = TransformOperator(procVal2Map[val]);
+ cmt->data.procVal2 = op;
+
+ switch (op) {
+ case Keep:
+ case Invert:
+ procVal2a->setEnabled(false);
+ procVal2b->setEnabled(false);
+ break;
+ case Multiply:
+ case Divide:
+ procVal2a->setEnabled(true);
+ procVal2b->setEnabled(false);
+ break;
+ case Plus:
+ case Minus:
+ case Fix:
+ case Value:
+ procVal2a->setEnabled(true);
+ procVal2b->setEnabled(false);
+ break;
+ case Random:
+ case Dynamic:
+ procVal2a->setEnabled(true);
+ procVal2b->setEnabled(true);
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// funcOpSel
+//---------------------------------------------------------
+
+void TransformDialog::funcOpSel(int val)
+ {
+ TransformFunction op = oplist[val].id;
+
+ bool isFuncOp(op == Trans);
+
+ procEventOp->setEnabled(isFuncOp);
+ procType->setEnabled(isFuncOp);
+ procVal1Op->setEnabled(isFuncOp);
+ procVal1a->setEnabled(isFuncOp);
+ procVal1b->setEnabled(isFuncOp);
+ procVal2Op->setEnabled(isFuncOp);
+ procVal2a->setEnabled(isFuncOp);
+ procVal2b->setEnabled(isFuncOp);
+ procChannelOp->setEnabled(isFuncOp);
+ procChannelVala->setEnabled(isFuncOp);
+ procChannelValb->setEnabled(isFuncOp);
+ if (isFuncOp) {
+ procEventOpSel(cmt->data.procEvent);
+ procVal1OpSel(cmt->data.procVal1);
+ procVal2OpSel(cmt->data.procVal2);
+ procChannelOpSel(cmt->data.procChannel);
+ }
+ cmt->data.funcOp = op;
+ }
+
+//---------------------------------------------------------
+// selVal1aChanged
+//---------------------------------------------------------
+
+void TransformDialog::selVal1aChanged(int val)
+ {
+ cmt->data.selVal1a = val;
+ if ((cmt->data.selEventOp != All)
+ && (cmt->data.selType == 0x90)) {
+ selVal1a->setSuffix(" - " + pitch2string(val));
+ }
+ else
+ selVal1a->setSuffix(QString(""));
+ }
+
+//---------------------------------------------------------
+// selVal1bChanged
+//---------------------------------------------------------
+
+void TransformDialog::selVal1bChanged(int val)
+ {
+ cmt->data.selVal1b = val;
+ if ((cmt->data.selEventOp != All)
+ && (cmt->data.selType == 0x90)) {
+ selVal1b->setSuffix(" - " + pitch2string(val));
+ }
+ else
+ selVal1b->setSuffix(QString(""));
+ }
+
+//---------------------------------------------------------
+// selVal2aChanged
+//---------------------------------------------------------
+
+void TransformDialog::selVal2aChanged(int val)
+ {
+ cmt->data.selVal2a = val;
+ }
+
+//---------------------------------------------------------
+// selVal2bChanged
+//---------------------------------------------------------
+
+void TransformDialog::selVal2bChanged(int val)
+ {
+ cmt->data.selVal2b = val;
+ }
+
+//---------------------------------------------------------
+// procVal1aChanged
+//---------------------------------------------------------
+
+void TransformDialog::procVal1aChanged(int val)
+ {
+ cmt->data.procVal1a = val;
+ }
+
+//---------------------------------------------------------
+// procVal1bChanged
+//---------------------------------------------------------
+
+void TransformDialog::procVal1bChanged(int val)
+ {
+ cmt->data.procVal1b = val;
+ }
+
+//---------------------------------------------------------
+// procVal2aChanged
+//---------------------------------------------------------
+
+void TransformDialog::procVal2aChanged(int val)
+ {
+ cmt->data.procVal2a = val;
+ }
+
+//---------------------------------------------------------
+// procVal2bChanged
+//---------------------------------------------------------
+
+void TransformDialog::procVal2bChanged(int val)
+ {
+ cmt->data.procVal2b = val;
+ }
+
+//---------------------------------------------------------
+// selChannelOpSel
+//---------------------------------------------------------
+
+void TransformDialog::selChannelOpSel(int val)
+ {
+ setValOp(selChannelVala, selChannelValb, ValOp(val));
+ cmt->data.selChannel = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// selChannelValaChanged
+//---------------------------------------------------------
+
+void TransformDialog::selChannelValaChanged(int val)
+ {
+ cmt->data.selChannela = val;
+ }
+
+//---------------------------------------------------------
+// selChannelValbChanged
+//---------------------------------------------------------
+
+void TransformDialog::selChannelValbChanged(int val)
+ {
+ cmt->data.selChannelb = val;
+ }
+
+//---------------------------------------------------------
+// procChannelOpSel
+//---------------------------------------------------------
+
+void TransformDialog::procChannelOpSel(int val)
+ {
+ cmt->data.procChannel = TransformOperator(val);
+ switch(TransformOperator(val)) {
+ case Keep:
+ case Invert:
+ procChannelVala->setEnabled(false);
+ procChannelValb->setEnabled(false);
+ break;
+ case Multiply:
+ case Divide:
+ procChannelVala->setEnabled(true);
+ procChannelValb->setEnabled(false);
+ break;
+ case Plus:
+ case Minus:
+ case Fix:
+ case Value:
+ case Flip:
+ procChannelVala->setEnabled(true);
+ procChannelValb->setEnabled(false);
+ break;
+ case Random:
+ case ScaleMap:
+ case Dynamic:
+ procChannelVala->setEnabled(true);
+ procChannelValb->setEnabled(true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// procChannelValaChanged
+//---------------------------------------------------------
+
+void TransformDialog::procChannelValaChanged(int val)
+ {
+ cmt->data.procChannela = val;
+ }
+
+//---------------------------------------------------------
+// procChannelValbChanged
+//---------------------------------------------------------
+
+void TransformDialog::procChannelValbChanged(int val)
+ {
+ cmt->data.procChannelb = val;
+ }
+
+//---------------------------------------------------------
+// getInitData
+//---------------------------------------------------------
+
+void Transform::getInitData(int* n, const unsigned char** p) const
+ {
+ *n = sizeof(data);
+ *p = (unsigned char*)&data;
+ }
+
+//---------------------------------------------------------
+// setInitData
+//---------------------------------------------------------
+
+void Transform::setInitData(int n, const unsigned char* p)
+ {
+ memcpy((void*)&data, p, n);
+ if (gui)
+ gui->init();
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new Transform(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "Transformator",
+ "MusE Midi Event Transformator",
+ "0.1", // version string
+ MEMPI_FILTER,
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse/midiplugins/transform/transform.h b/muse/midiplugins/transform/transform.h
new file mode 100644
index 00000000..bc91c9c0
--- /dev/null
+++ b/muse/midiplugins/transform/transform.h
@@ -0,0 +1,126 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: transform.h,v 1.5 2005/10/05 17:02:03 lunar_shuttle Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TRANSFORM_H__
+#define __TRANSFORM_H__
+
+#include "../libmidiplugin/mempi.h"
+#include "ui_transform.h"
+
+class Transform;
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+enum ValOp {
+ All=0, Ignore=0, Equal=1, Unequal=2, Higher=3, Lower=4,
+ Inside=5, Outside=6
+ };
+
+enum TransformFunction {
+ Select, Quantize, Delete, Trans, Insert, Copy, Extract
+ };
+
+enum TransformOperator {
+ Keep, Plus, Minus, Multiply, Divide, Fix, Value, Invert,
+ ScaleMap, Flip, Dynamic, Random
+ };
+
+//---------------------------------------------------------
+// TransformDialog
+//---------------------------------------------------------
+
+class TransformDialog : public QDialog, public Ui::TransformDialogBase {
+ Q_OBJECT
+ Transform* cmt;
+
+ void setValOp(QWidget* a, QWidget* b, ValOp op);
+
+ signals:
+ void hideWindow();
+
+ private slots:
+ void selEventOpSel(int);
+ void selTypeSel(int);
+ void selVal1OpSel(int);
+ void selVal2OpSel(int);
+ void procEventOpSel(int);
+ void procEventTypeSel(int);
+ void procVal1OpSel(int);
+ void procVal2OpSel(int);
+ void funcOpSel(int);
+ void selVal1aChanged(int);
+ void selVal1bChanged(int);
+ void selVal2aChanged(int);
+ void selVal2bChanged(int);
+ void procVal1aChanged(int);
+ void procVal1bChanged(int);
+ void procVal2aChanged(int);
+ void procVal2bChanged(int);
+ void selChannelOpSel(int);
+ void selChannelValaChanged(int);
+ void selChannelValbChanged(int);
+ void procChannelOpSel(int);
+ void procChannelValaChanged(int);
+ void procChannelValbChanged(int);
+
+ public:
+ TransformDialog(Transform*, QWidget* parent);
+ void init();
+ };
+
+//---------------------------------------------------------
+// Transform
+//---------------------------------------------------------
+
+class Transform : public Mempi {
+ int filterEvent(MidiEvent& event);
+
+ public:
+ struct initData {
+ ValOp selEventOp;
+ int selType;
+
+ ValOp selVal1;
+ int selVal1a, selVal1b;
+ ValOp selVal2;
+ int selVal2a, selVal2b;
+ ValOp selChannel;
+ int selChannela, selChannelb;
+
+ TransformOperator procEvent;
+ int eventType;
+ TransformOperator procVal1;
+ int procVal1a, procVal1b;
+ TransformOperator procVal2;
+ int procVal2a, procVal2b;
+ TransformOperator procChannel;
+ int procChannela, procChannelb;
+
+ TransformFunction funcOp;
+ int quantVal;
+ } data;
+
+ TransformDialog* gui;
+ virtual void process(unsigned, unsigned, MPEventList*, MPEventList*);
+
+ Transform(const char* name, const MempiHost*);
+ virtual bool init();
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+
+#endif
+
diff --git a/muse/midiplugins/transform/transform.ui b/muse/midiplugins/transform/transform.ui
new file mode 100644
index 00000000..c23cf343
--- /dev/null
+++ b/muse/midiplugins/transform/transform.ui
@@ -0,0 +1,616 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>TransformDialogBase</class>
+ <widget class="QDialog" name="TransformDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>630</width>
+ <height>418</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Input Transformator</string>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="GroupBox3" >
+ <property name="title" >
+ <string>Filter</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <widget class="QComboBox" name="selEventOp" >
+ <item>
+ <property name="text" >
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QComboBox" name="selType" >
+ <item>
+ <property name="text" >
+ <string>Note</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Poly Pressure</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Control Change</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Aftertouch</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pitch Bend</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>NRPN</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>RPN</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>Value 2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>Event Type</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="selVal1Op" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="selVal1b" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="selVal2b" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="selVal1a" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QComboBox" name="selVal2Op" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QComboBox" name="selChannelOp" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="TextLabel2_2" >
+ <property name="text" >
+ <string>Channel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="selVal2a" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QSpinBox" name="selChannelVala" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" >
+ <widget class="QSpinBox" name="selChannelValb" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="GroupBox5" >
+ <property name="title" >
+ <string>Processing</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel5" >
+ <property name="text" >
+ <string>Event Type</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QComboBox" name="procEventOp" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QComboBox" name="procType" >
+ <item>
+ <property name="text" >
+ <string>Note</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Poly Pressure</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Control Change</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Aftertouch</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pitch Bend</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>NRPN</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>RPN</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="procVal1Op" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Value 2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Invert</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>ScaleMap</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Flip</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Dyn</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Random</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="TextLabel6" >
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="TextLabel7" >
+ <property name="text" >
+ <string>Value 2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="procVal1b" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="procVal2b" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" >
+ <widget class="QSpinBox" name="procChannelValb" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QComboBox" name="procVal2Op" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Invert</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Dyn</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Random</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QComboBox" name="procChannelOp" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Invert</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Dyn</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Random</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="TextLabel2_2_2" >
+ <property name="text" >
+ <string>Channel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QComboBox" name="funcOp" />
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="procVal1a" />
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="procVal2a" />
+ </item>
+ <item row="2" column="3" >
+ <widget class="QSpinBox" name="procChannelVala" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <tabstops>
+ <tabstop>selEventOp</tabstop>
+ <tabstop>selType</tabstop>
+ <tabstop>selVal1Op</tabstop>
+ <tabstop>selVal1a</tabstop>
+ <tabstop>selVal1b</tabstop>
+ <tabstop>selVal2Op</tabstop>
+ <tabstop>selVal2a</tabstop>
+ <tabstop>selVal2b</tabstop>
+ <tabstop>selChannelOp</tabstop>
+ <tabstop>selChannelVala</tabstop>
+ <tabstop>selChannelValb</tabstop>
+ <tabstop>procEventOp</tabstop>
+ <tabstop>procType</tabstop>
+ <tabstop>procVal1Op</tabstop>
+ <tabstop>procVal1b</tabstop>
+ <tabstop>procVal2Op</tabstop>
+ <tabstop>procVal2b</tabstop>
+ <tabstop>procChannelOp</tabstop>
+ <tabstop>procChannelValb</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/mops b/muse/mops
new file mode 100644
index 00000000..93d861fd
--- /dev/null
+++ b/muse/mops
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+rm `find . -name "Makefile"`
+
+find . > files
+
diff --git a/muse/muse/.muse.bin.bak b/muse/muse/.muse.bin.bak
new file mode 100755
index 00000000..f40eeacb
--- /dev/null
+++ b/muse/muse/.muse.bin.bak
Binary files differ
diff --git a/muse/muse/CMakeLists.txt b/muse/muse/CMakeLists.txt
new file mode 100644
index 00000000..37a0c404
--- /dev/null
+++ b/muse/muse/CMakeLists.txt
@@ -0,0 +1,129 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+MACRO(WRAP_CPP outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.cpp)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_CPP)
+
+MACRO(WRAP_H outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.h)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_H)
+
+MACRO(WRAP_UI outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.ui)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_UI)
+
+subdirs(
+ ctrl widgets master driver instruments marker liste
+ )
+set (muse_uics
+ muse genset appearance exportmididialog configmidifile
+ transport aboutbox transpose
+ midiedit/quantconfig
+ mixer/routedialog
+ arranger/configtrack
+ )
+
+set(muse_mocs
+ appearance plugingui midiplugin muse genset song transport conf editor
+ cobject transpose track midisynti midiport
+ miditrack wavetrack audiotrack audioaux audiooutput
+ audioinput audiogroup exportmidi
+ midiedit/pianoroll
+ midiedit/prcanvas
+ midiedit/quantconfig
+ midiedit/drumedit
+ midiedit/dcanvas
+ midiedit/ecanvas
+ midiedit/ctrledit
+ midiedit/midieditor
+ mixer/mixer
+ mixer/rack
+ mixer/midirack
+ mixer/routedialog
+ mixer/strip
+ mixer/astrip
+ mixer/mstrip
+ arranger/arranger
+ arranger/canvas
+ arranger/configtrack
+ arranger/partdrag
+ arranger/tllineedit
+ arranger/tlswidget
+ arranger/tlwidget
+ arranger/tlwlayout
+ arranger/trackdrag
+ arranger/trackinfo
+ waveedit/waveedit
+ waveedit/waveview
+ )
+
+WRAP_H(muse_mocH ${muse_mocs})
+WRAP_CPP(muse_mocCPP ${muse_mocs})
+WRAP_UI(muse_uiUI ${muse_uics})
+
+QT4_WRAP_CPP (muse_moc_headers ${muse_mocH})
+QT4_WRAP_UI (ui_headers ${muse_uiUI})
+QT4_ADD_RESOURCES (qrc_files muse.qrc)
+
+add_executable ( muse
+ ${qrc_files}
+ ticksynth.cpp
+ vst.cpp dssihost.cpp synth.cpp plugin.cpp
+ mtc.cpp thread.cpp audio.cpp
+ audioprefetch.cpp audiowriteback.cpp globals.cpp sync.cpp
+ part.cpp undo.cpp songfile.cpp midi.cpp
+ importmidi.cpp midifile.cpp icons.cpp event.cpp
+ eventlist.cpp midievent.cpp waveevent.cpp mpevent.cpp
+ wave.cpp seqmsg.cpp
+ help.cpp
+ midictrl.cpp fifo.cpp
+ midiseq.cpp helper.cpp route.cpp shortcuts.cpp ctrl.cpp
+ gconfig.cpp midirc.cpp midififo.cpp
+
+ midiedit/drummap.cpp
+ midiedit/citem.cpp
+# midiedit/midieditor.cpp
+
+ ${muse_mocCPP}
+ ${muse_moc_headers}
+ )
+
+set_target_properties( muse
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all.h"
+ )
+
+target_link_libraries(muse
+ widgets ctrl master driver instruments marker liste
+ al awl synti
+ ${QT_LIBRARIES}
+ ${ALSA_LIB}
+ ${JACK_LIB}
+ ${SNDFILE_LIB}
+ )
+
+install_targets ( /bin muse )
+
diff --git a/muse/muse/DOC b/muse/muse/DOC
new file mode 100644
index 00000000..991a6bec
--- /dev/null
+++ b/muse/muse/DOC
@@ -0,0 +1,59 @@
+ len 4608
+
+TopLevels
+
+ tr_id Transport
+ showTransport(bool)
+ Transport* transport;
+ bt_id BigTime
+ showBigtime(bool)
+ BigTime* bigtime;
+ aid1a Mixer1
+ showMixer1(bool)
+ Mixer* mixer1
+ aid1b Mixer2
+ showMixer2(bool)
+ Mixer* mixer2;
+ mk_id Marker
+ showMarker(bool)
+ MarkerView* markerView
+
+
+Drum Maps
+
+ - use Drum Map
+ es wird die GM Drummap benutzt, wenn für den selektierten
+ Patch keine andere Drummap konfiguriert ist
+
+
+
+Time:
+ Frames
+ Ticks
+
+ Part-Positionen werden normalerweise in Ticks angegeben. Nur die
+ Positionen von Parts einer "Locked" Spur beziehen sich auf Frames.
+
+ Die Länge von Wave-Parts wird immer in Frames angegeben.
+
+ Die Positionen von Controller-Events werden ebenfalls normalerweise
+ in Ticks angegeben, es sei denn, sie befinden sich in "Locked"
+ Spuren.
+
+ Der Arranger und die Editoren können Parts und/oder Events entweder
+ im Metronom-Mode oder im Uhr-Mode anzeigen. Das Lineal zeigt
+ dabei entweder Takt/Beat/Tick oder Minute/Sekunde/Frame an.
+
+
+
+WaveTrack
+ Record
+
+ Disk--Fader------+
+ +---o
+ / o------------->outRouting
+ +---o/
+ InputRouting-----+
+
+
+
diff --git a/muse/muse/aboutbox.ui b/muse/muse/aboutbox.ui
new file mode 100644
index 00000000..bd8595a4
--- /dev/null
+++ b/muse/muse/aboutbox.ui
@@ -0,0 +1,413 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>AboutBox</class>
+ <widget class="QDialog" name="AboutBox" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>568</width>
+ <height>276</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>237</green>
+ <blue>165</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>237</green>
+ <blue>165</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>237</green>
+ <blue>165</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>237</green>
+ <blue>165</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="windowTitle" >
+ <string>AboutBox</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="museIcon" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="textFormat" >
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="pixmap" >
+ <pixmap>../../share/muse_icon_64x64.png</pixmap>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="textLabel1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;">MusE&lt;/p>&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;">&lt;span style=" font-size:10pt; font-weight:400;">Version 1.0pre1&lt;/span>&lt;/p>&lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;/p>&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(C) Copyright 1999-2004 Werner Schweer and others. &lt;/p>&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">See http://lmuse.sourceforge.net for new versions and&lt;/p>&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">more information.&lt;/p>&lt;p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;/p>&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Published under the GNU Public License&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="wordWrap" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="doneHere" >
+ <property name="text" >
+ <string>Keep On Rocking!</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>doneHere</sender>
+ <signal>clicked()</signal>
+ <receiver>AboutBox</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>279</x>
+ <y>245</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>491</x>
+ <y>260</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/appearance.cpp b/muse/muse/appearance.cpp
new file mode 100644
index 00000000..02b9819a
--- /dev/null
+++ b/muse/muse/appearance.cpp
@@ -0,0 +1,647 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "icons.h"
+#include "appearance.h"
+#include "track.h"
+#include "muse.h"
+#include "song.h"
+#include "event.h"
+#include "arranger/arranger.h"
+#include "widgets/filedialog.h"
+#include "waveedit/waveedit.h"
+#include "globals.h"
+#include "conf.h"
+#include "gconfig.h"
+
+//---------------------------------------------------------
+// twi
+//---------------------------------------------------------
+
+static QTreeWidgetItem* twi(QTreeWidget* tw, const char* txt, int data)
+ {
+ QTreeWidgetItem* i = new QTreeWidgetItem(tw);
+ i->setText(0, txt);
+ i->setData(0, 1, data);
+ return i;
+ }
+
+static QTreeWidgetItem* twi(QTreeWidgetItem* tw, const char* txt, int data)
+ {
+ QTreeWidgetItem* i = new QTreeWidgetItem(tw);
+ i->setText(0, txt);
+ i->setData(0, 1, data);
+ return i;
+ }
+
+//---------------------------------------------------------
+// Appearance
+//---------------------------------------------------------
+
+Appearance::Appearance(Arranger* a, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ colorframe->setAutoFillBackground(true);
+ palette0->setAutoFillBackground(true);
+ palette1->setAutoFillBackground(true);
+ palette2->setAutoFillBackground(true);
+ palette3->setAutoFillBackground(true);
+ arr = a;
+ color = 0;
+ config = new GlobalConfigValues;
+ resetValues();
+
+ // ARRANGER
+
+ usePixmap->setChecked(config->canvasUseBgPixmap);
+ useColor->setChecked(!config->canvasUseBgPixmap);
+ connect(usePixmap, SIGNAL(toggled(bool)), SLOT(usePixmapToggled(bool)));
+ connect(useColor, SIGNAL(toggled(bool)), SLOT(useColorToggled(bool)));
+
+ currentBg = config->canvasBgPixmap;
+ if (currentBg.isEmpty())
+ currentBg = "<none>";
+ else {
+ QBrush b;
+ b.setTexture(QPixmap(currentBg));
+ QPalette p;
+ p.setBrush(QPalette::Window, b);
+ currentBgLabel->setPalette(p);
+ }
+ QPalette p;
+ canvasBackgroundColor->setAutoFillBackground(true);
+ p.setColor(QPalette::Window, config->canvasBgColor);
+ canvasBackgroundColor->setPalette(p);
+
+ currentBgLabel->setAutoFillBackground(true);
+ currentBgLabel->setText(currentBg);
+
+ partShownames->setChecked(config->canvasShowPartType & 1);
+ partShowevents->setChecked(config->canvasShowPartType & 2);
+ partShowCakes->setChecked(!(config->canvasShowPartType & 2));
+
+ eventNoteon->setChecked(config->canvasShowPartEvent & (1 << 0));
+ eventPolypressure->setChecked(config->canvasShowPartEvent & (1 << 1));
+ eventController->setChecked(config->canvasShowPartEvent & (1 << 2));
+ eventProgramchange->setChecked(config->canvasShowPartEvent & (1 << 3));
+ eventAftertouch->setChecked(config->canvasShowPartEvent & (1 << 4));
+ eventPitchbend->setChecked(config->canvasShowPartEvent & (1 << 5));
+ eventSpecial->setChecked(config->canvasShowPartEvent & (1 << 6));
+ eventButtonGroup->setEnabled(config->canvasShowPartType == 2);
+ arrGrid->setChecked(config->canvasShowGrid);
+
+ // COLORS
+ QTreeWidgetItem* id;
+ QTreeWidgetItem* aid;
+ itemList->setSortingEnabled(false);
+ itemList->clear();
+
+ aid = twi(itemList, "Arranger", 0);
+ id = twi(aid, "PartColors", 0);
+ twi(id, "Selected", 0x41d);
+
+ twi(id, "Default", 0x400);
+ twi(id, "Refrain", 0x401);
+ twi(id, "Bridge", 0x402);
+ twi(id, "Intro", 0x403);
+ twi(id, "Coda", 0x404);
+ twi(id, "Chorus", 0x405);
+ twi(id, "Solo", 0x406);
+ twi(id, "Brass", 0x407);
+ twi(id, "Percussion", 0x408);
+ twi(id, "Drums", 0x409);
+ twi(id, "Guitar", 0x40a);
+ twi(id, "Bass", 0x40b);
+ twi(id, "Flute", 0x40c);
+ twi(id, "Strings", 0x40d);
+ twi(id, "Keyboard", 0x40e);
+ twi(id, "Piano", 0x40f);
+ twi(id, "Saxophon", 0x410);
+
+ twi(id, "part canvas background", 0x41c);
+
+ id = twi(aid, "Track List", 0);
+ twi(id, "Audio Output", 0x500 + Track::AUDIO_OUTPUT);
+ twi(id, "Audio Group", 0x500 + Track::AUDIO_GROUP);
+ twi(id, "Audio Aux", 0x500 + Track::AUDIO_AUX);
+ twi(id, "Wave Track", 0x500 + Track::WAVE);
+ twi(id, "Audio Input", 0x500 + Track::AUDIO_INPUT);
+ twi(id, "Synthesizer", 0x500 + Track::AUDIO_SOFTSYNTH);
+ twi(id, "Midi Track", 0x500 + Track::MIDI);
+ twi(id, "Midi Output", 0x500 + Track::MIDI_OUT);
+ twi(id, "Midi Input", 0x500 + Track::MIDI_IN);
+ twi(id, "Midi Channel", 0x500 + Track::MIDI_CHANNEL);
+ twi(id, "Midi Synti", 0x500 + Track::MIDI_SYNTI);
+
+ id = twi(itemList, "BigTime", 0);
+ twi(id, "background", 0x100);
+ twi(id, "foreground", 0x101);
+
+ id = twi(itemList, "Transport", 0);
+ twi(id, "handle", 0x200);
+
+ id = twi(itemList, "Editor", 0);
+ twi(id, "background", 0x300);
+
+ colorGroup = new QButtonGroup(this);
+ colorGroup->setExclusive(true);
+ colorGroup->addButton(palette0, 0);
+ colorGroup->addButton(palette1, 1);
+ colorGroup->addButton(palette2, 2);
+ colorGroup->addButton(palette3, 3);
+ colorGroup->addButton(palette4, 4);
+ colorGroup->addButton(palette5, 5);
+ colorGroup->addButton(palette6, 6);
+ colorGroup->addButton(palette7, 7);
+ colorGroup->addButton(palette8, 8);
+ colorGroup->addButton(palette9, 9);
+ colorGroup->addButton(palette10, 10);
+ colorGroup->addButton(palette11, 11);
+ colorGroup->addButton(palette12, 12);
+ colorGroup->addButton(palette13, 13);
+ colorGroup->addButton(palette14, 14);
+ colorGroup->addButton(palette15, 15);
+ connect(itemList, SIGNAL(itemSelectionChanged()), SLOT(colorItemSelectionChanged()));
+ connect(colorGroup, SIGNAL(buttonClicked(QAbstractButton*)), SLOT(paletteClicked(QAbstractButton*)));
+ connect(hslider, SIGNAL(valueChanged(int)), SLOT(hsliderChanged(int)));
+ connect(sslider, SIGNAL(valueChanged(int)), SLOT(ssliderChanged(int)));
+ connect(vslider, SIGNAL(valueChanged(int)), SLOT(vsliderChanged(int)));
+
+ connect(addToPalette, SIGNAL(clicked()), SLOT(addToPaletteClicked()));
+
+ //---------------------------------------------------
+ // STYLE
+ //---------------------------------------------------
+
+ themeComboBox->clear();
+
+ QString cs = muse->style()->objectName();
+ cs = cs.toLower();
+
+ themeComboBox->addItems(QStyleFactory::keys());
+ for (int i = 0; i < themeComboBox->count(); ++i) {
+ if (themeComboBox->itemText(i).toLower() == cs) {
+ themeComboBox->setCurrentIndex(i);
+ }
+ }
+
+ //---------------------------------------------------
+ // Fonts
+ //---------------------------------------------------
+
+ fontBrowse0->setIcon(*openIcon);
+ fontBrowse1->setIcon(*openIcon);
+ fontBrowse2->setIcon(*openIcon);
+ fontBrowse3->setIcon(*openIcon);
+ fontBrowse4->setIcon(*openIcon);
+ fontBrowse5->setIcon(*openIcon);
+ connect(fontBrowse0, SIGNAL(clicked()), SLOT(browseFont0()));
+ connect(fontBrowse1, SIGNAL(clicked()), SLOT(browseFont1()));
+ connect(fontBrowse2, SIGNAL(clicked()), SLOT(browseFont2()));
+ connect(fontBrowse3, SIGNAL(clicked()), SLOT(browseFont3()));
+ connect(fontBrowse4, SIGNAL(clicked()), SLOT(browseFont4()));
+ connect(fontBrowse5, SIGNAL(clicked()), SLOT(browseFont5()));
+
+ connect(applyButton, SIGNAL(clicked()), SLOT(apply()));
+ connect(okButton, SIGNAL(clicked()), SLOT(ok()));
+ connect(cancelButton, SIGNAL(clicked()), SLOT(cancel()));
+ connect(selectCanvasBgPixmap, SIGNAL(clicked()), SLOT(configCanvasBgPixmap()));
+ connect(selectCanvasBgColor, SIGNAL(clicked()), SLOT(configCanvasBgColor()));
+ connect(partShowevents, SIGNAL(toggled(bool)), eventButtonGroup, SLOT(setEnabled(bool)));
+ updateColor();
+ }
+
+//---------------------------------------------------------
+// resetValues
+//---------------------------------------------------------
+
+void Appearance::resetValues()
+ {
+ *config = ::config; // init with global config values
+ updateFonts();
+ QPalette p(palette0->palette());
+ p.setColor(QPalette::Button, config->palette[0]);
+ palette0->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[1]);
+ palette1->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[2]);
+ palette2->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[3]);
+ palette3->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[4]);
+ palette4->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[5]);
+ palette5->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[6]);
+ palette6->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[7]);
+ palette7->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[8]);
+ palette8->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[9]);
+ palette9->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[10]);
+ palette10->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[11]);
+ palette11->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[12]);
+ palette12->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[13]);
+ palette13->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[14]);
+ palette14->setPalette(p);
+ p.setColor(QPalette::Button, config->palette[15]);
+ palette15->setPalette(p);
+ }
+
+//---------------------------------------------------------
+// Appearance
+//---------------------------------------------------------
+
+Appearance::~Appearance()
+ {
+ delete config;
+ }
+
+//---------------------------------------------------------
+// updateFonts
+//---------------------------------------------------------
+
+void Appearance::updateFonts()
+ {
+ fontSize0->setValue(config->fonts[0]->pointSize());
+ fontName0->setText(config->fonts[0]->family());
+ italic0->setChecked(config->fonts[0]->italic());
+ bold0->setChecked(config->fonts[0]->bold());
+
+ fontSize1->setValue(config->fonts[1]->pointSize());
+ fontName1->setText(config->fonts[1]->family());
+ italic1->setChecked(config->fonts[1]->italic());
+ bold1->setChecked(config->fonts[1]->bold());
+
+ fontSize2->setValue(config->fonts[2]->pointSize());
+ fontName2->setText(config->fonts[2]->family());
+ italic2->setChecked(config->fonts[2]->italic());
+ bold2->setChecked(config->fonts[2]->bold());
+
+ fontSize3->setValue(config->fonts[3]->pointSize());
+ fontName3->setText(config->fonts[3]->family());
+ italic3->setChecked(config->fonts[3]->italic());
+ bold3->setChecked(config->fonts[3]->bold());
+
+ fontSize4->setValue(config->fonts[4]->pointSize());
+ fontName4->setText(config->fonts[4]->family());
+ italic4->setChecked(config->fonts[4]->italic());
+ bold4->setChecked(config->fonts[4]->bold());
+
+ fontSize5->setValue(config->fonts[5]->pointSize());
+ fontName5->setText(config->fonts[5]->family());
+ italic5->setChecked(config->fonts[5]->italic());
+ bold5->setChecked(config->fonts[5]->bold());
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void Appearance::apply()
+ {
+ int showPartEvent = 0;
+ int showPartType = 0;
+
+ if (partShownames->isChecked())
+ showPartType |= 1;
+ if (partShowevents->isChecked())
+ showPartType |= 2;
+ if (partShowCakes->isChecked())
+ showPartType |= 4;
+
+ if (eventNoteon->isChecked())
+ showPartEvent |= (1 << 0);
+ if (eventPolypressure->isChecked())
+ showPartEvent |= (1 << 1);
+ if (eventController->isChecked())
+ showPartEvent |= (1 << 2);
+ if (eventProgramchange->isChecked())
+ showPartEvent |= (1 << 3);
+ if (eventAftertouch->isChecked())
+ showPartEvent |= (1 << 4);
+ if (eventPitchbend->isChecked())
+ showPartEvent |= (1 << 5);
+ if (eventSpecial->isChecked())
+ showPartEvent |= (1 << 6);
+
+ config->canvasUseBgPixmap = usePixmap->isChecked();
+ if (currentBg != "<none>")
+ config->canvasBgPixmap = currentBg;
+ config->fonts[0]->setPointSize(fontSize0->value());
+ config->fonts[0]->setItalic(italic0->isChecked());
+ config->fonts[0]->setBold(bold0->isChecked());
+
+ QApplication::setFont(*config->fonts[0]);
+
+ config->fonts[1]->setPointSize(fontSize1->value());
+ config->fonts[1]->setItalic(italic1->isChecked());
+ config->fonts[1]->setBold(bold1->isChecked());
+
+ config->fonts[2]->setPointSize(fontSize2->value());
+ config->fonts[2]->setItalic(italic2->isChecked());
+ config->fonts[2]->setBold(bold2->isChecked());
+
+ config->fonts[3]->setPointSize(fontSize3->value());
+ config->fonts[3]->setItalic(italic3->isChecked());
+ config->fonts[3]->setBold(bold3->isChecked());
+
+ config->fonts[4]->setPointSize(fontSize4->value());
+ config->fonts[4]->setItalic(italic4->isChecked());
+ config->fonts[4]->setBold(bold4->isChecked());
+
+ config->fonts[5]->setPointSize(fontSize5->value());
+ config->fonts[5]->setItalic(italic5->isChecked());
+ config->fonts[5]->setBold(bold5->isChecked());
+
+ config->style = themeComboBox->currentText();
+ // setting up a new theme might change the fontsize, so re-read
+ fontSize0->setValue(QApplication::font().pointSize());
+
+ config->canvasShowGrid = arrGrid->isChecked();
+ // set colors...
+ ::config = *config;
+ muse->changeConfig(true);
+ }
+
+//---------------------------------------------------------
+// ok
+//---------------------------------------------------------
+
+void Appearance::ok()
+ {
+ apply();
+ close();
+ }
+
+//---------------------------------------------------------
+// cancel
+//---------------------------------------------------------
+
+void Appearance::cancel()
+ {
+ close();
+ }
+
+//---------------------------------------------------------
+// configCanvasBgPixmap
+//---------------------------------------------------------
+
+void Appearance::configCanvasBgPixmap()
+ {
+ QString cur(currentBg);
+ if (cur == "<none>")
+ cur = museGlobalShare + "/wallpapers";
+
+ QStringList pattern;
+ const char** p = image_file_pattern;
+ while(*p)
+ pattern << *p++;
+ QString s = getImageFileName(cur, pattern, this, tr("MusE: load image"));
+ if (!s.isEmpty()) {
+ QBrush b;
+ currentBg = s;
+ b.setTexture(QPixmap(s));
+ QPalette p;
+ p.setBrush(QPalette::Window, b);
+ currentBgLabel->setPalette(p);
+ currentBgLabel->setText(currentBg);
+ }
+ }
+
+//---------------------------------------------------------
+// configCanvasBgColor
+//---------------------------------------------------------
+
+void Appearance::configCanvasBgColor()
+ {
+ QColor color = QColorDialog::getColor(config->canvasBgColor, this);
+ if (color.isValid()) {
+ config->canvasBgColor = color;
+ QPalette p;
+ p.setColor(QPalette::Window, color);
+ canvasBackgroundColor->setPalette(p);
+ }
+ }
+
+//---------------------------------------------------------
+// selectionChanged
+//---------------------------------------------------------
+
+void Appearance::colorItemSelectionChanged()
+ {
+ QTreeWidgetItem* item = (QTreeWidgetItem*)itemList->selectedItems().at(0);
+ QString txt = item->text(0);
+ int id = item->data(0, 1).toInt();
+ if (id == 0) {
+ color = 0;
+ return;
+ }
+ switch(id) {
+ case 0x400 ... 0x410: // "Default"
+ color = &config->partColors[id & 0xff];
+ break;
+ case 0x100:
+ color = &config->bigTimeBackgroundColor;
+ break;
+ case 0x101:
+ color = &config->bigTimeForegroundColor;
+ break;
+ case 0x200:
+ color = &config->transportHandleColor;
+ break;
+ case 0x300:
+ color = &config->waveEditBackgroundColor;
+ break;
+ case 0x500 ... 0x5ff:
+ color = &config->trackBg[id & 0xff];
+ break;
+ case 0x41c:
+ color = &config->selectPartBg;
+ break;
+ default:
+ color = 0;
+ break;
+ }
+ updateColor();
+ }
+
+//---------------------------------------------------------
+// updateColor
+//---------------------------------------------------------
+
+void Appearance::updateColor()
+ {
+ hslider->setEnabled(color);
+ sslider->setEnabled(color);
+ vslider->setEnabled(color);
+ if (color == 0)
+ return;
+ QPalette p(colorframe->palette());
+ p.setColor(QPalette::Window, *color);
+ colorframe->setPalette(p);
+ int r, g, b, h, s, v;
+ color->getRgb(&r, &g, &b);
+ color->getHsv(&h, &s, &v);
+
+ hslider->blockSignals(true);
+ sslider->blockSignals(true);
+ vslider->blockSignals(true);
+
+ hslider->setValue(h);
+ sslider->setValue(s);
+ vslider->setValue(v);
+
+ hslider->blockSignals(false);
+ sslider->blockSignals(false);
+ vslider->blockSignals(false);
+ }
+
+void Appearance::hsliderChanged(int val)
+ {
+ int h, s, v;
+ if (color) {
+ color->getHsv(&h, &s, &v);
+ color->setHsv(val, s, v);
+ }
+ updateColor();
+ }
+
+void Appearance::ssliderChanged(int val)
+ {
+ int h, s, v;
+ if (color) {
+ color->getHsv(&h, &s, &v);
+ color->setHsv(h, val, v);
+ }
+ updateColor();
+ }
+
+void Appearance::vsliderChanged(int val)
+ {
+ int h, s, v;
+ if (color) {
+ color->getHsv(&h, &s, &v);
+ color->setHsv(h, s, val);
+ }
+ updateColor();
+ }
+
+//---------------------------------------------------------
+// addToPaletteClicked
+//---------------------------------------------------------
+
+void Appearance::addToPaletteClicked()
+ {
+ if (!color)
+ return;
+ QAbstractButton* button = colorGroup->checkedButton();
+ int r, g, b;
+ QColor c;
+ if (button) {
+ c = button->palette().color(QPalette::Button);
+ c.getRgb(&r, &g, &b);
+ }
+ if (button == 0 || r != 0xff || g != 0xff || b != 0xff) {
+ for (int i = 0; i < 16; ++i) {
+ button = colorGroup->button(i);
+ c = button->palette().color(QPalette::Button);
+ c.getRgb(&r, &g, &b);
+ if (r == 0xff && g == 0xff && b == 0xff) {
+ // found empty slot
+ button->setChecked(true);
+ break;
+ }
+ }
+ }
+ if (button) {
+ int id = colorGroup->checkedId();
+ config->palette[id] = *color;
+ QPalette p(button->palette());
+ // p.setColor(QPalette::Active, QPalette::Button, *color);
+ p.setColor(QPalette::Button, *color);
+ p.setColor(button->backgroundRole(), *color);
+
+ p.setColor(QPalette::Inactive, QPalette::Button, *color);
+ button->setPalette(p);
+ }
+ }
+
+//---------------------------------------------------------
+// paletteClicked
+//---------------------------------------------------------
+
+void Appearance::paletteClicked(QAbstractButton* button)
+ {
+ QColor c = button->palette().color(QPalette::Button);
+ int r, g, b;
+ c.getRgb(&r, &g, &b);
+ if (r == 0xff && g == 0xff && b == 0xff)
+ return; // interpret palette slot as empty
+ *color = c;
+ updateColor();
+ }
+
+//---------------------------------------------------------
+// browseFont
+//---------------------------------------------------------
+
+void Appearance::browseFont0() { browseFont(0); }
+void Appearance::browseFont1() { browseFont(1); }
+void Appearance::browseFont2() { browseFont(2); }
+void Appearance::browseFont3() { browseFont(3); }
+void Appearance::browseFont4() { browseFont(4); }
+void Appearance::browseFont5() { browseFont(5); }
+
+void Appearance::browseFont(int n)
+ {
+ bool ok;
+ QFont font = QFontDialog::getFont(&ok, *config->fonts[n], this);
+ if (ok) {
+ config->fonts[n] = new QFont(font);
+ updateFonts();
+ }
+ }
+
+//---------------------------------------------------------
+// usePixmapToggled
+//---------------------------------------------------------
+
+void Appearance::usePixmapToggled(bool val)
+ {
+ useColor->setChecked(!val);
+ }
+
+//---------------------------------------------------------
+// useColorToggled
+//---------------------------------------------------------
+
+void Appearance::useColorToggled(bool val)
+ {
+ usePixmap->setChecked(!val);
+ }
+
diff --git a/muse/muse/appearance.h b/muse/muse/appearance.h
new file mode 100644
index 00000000..e993f437
--- /dev/null
+++ b/muse/muse/appearance.h
@@ -0,0 +1,73 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __APPEARANCE_H__
+#define __APPEARANCE_H__
+
+#include "ui_appearance.h"
+
+class MusE;
+class Arranger;
+class GlobalConfigValues;
+
+//---------------------------------------------------------
+// Appearance Dialog
+//---------------------------------------------------------
+
+class Appearance : public QDialog, public Ui::AppearanceDialogBase {
+ Arranger* arr;
+ QColor* color;
+ QString currentBg;
+ GlobalConfigValues* config;
+ QButtonGroup* colorGroup;
+
+ Q_OBJECT
+ void updateFonts();
+ void updateColor();
+
+ private slots:
+ void apply();
+ void ok();
+ void cancel();
+ void configCanvasBgColor();
+ void configCanvasBgPixmap();
+ void colorItemSelectionChanged();
+ void browseFont(int);
+ void browseFont0();
+ void browseFont1();
+ void browseFont2();
+ void browseFont3();
+ void browseFont4();
+ void browseFont5();
+ void hsliderChanged(int);
+ void ssliderChanged(int);
+ void vsliderChanged(int);
+ void addToPaletteClicked();
+ void paletteClicked(QAbstractButton*);
+ void useColorToggled(bool);
+ void usePixmapToggled(bool);
+
+ public:
+ Appearance(Arranger*, QWidget* parent=0);
+ ~Appearance();
+ void resetValues();
+ };
+
+#endif
diff --git a/muse/muse/appearance.ui b/muse/muse/appearance.ui
new file mode 100644
index 00000000..920d68de
--- /dev/null
+++ b/muse/muse/appearance.ui
@@ -0,0 +1,1182 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>AppearanceDialogBase</class>
+ <widget class="QDialog" name="AppearanceDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>583</width>
+ <height>395</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Appearance settings</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="TabWidget2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <widget class="QWidget" name="tab1" >
+ <attribute name="title" >
+ <string>Arranger</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QGroupBox" name="useCanvasBgPixmap" >
+ <property name="title" >
+ <string>Background</string>
+ </property>
+ <property name="checkable" >
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="2" >
+ <widget class="QToolButton" name="selectCanvasBgColor" >
+ <property name="text" >
+ <string>select...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QToolButton" name="selectCanvasBgPixmap" >
+ <property name="text" >
+ <string>select...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QRadioButton" name="useColor" >
+ <property name="text" >
+ <string>Color</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QRadioButton" name="usePixmap" >
+ <property name="text" >
+ <string>Pixmap</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="currentBgLabel" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>bg</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="indent" >
+ <number>-1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="canvasBackgroundColor" >
+ <property name="text" >
+ <string>Color</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QCheckBox" name="arrGrid" >
+ <property name="text" >
+ <string>show snap grid</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QGroupBox" name="eventButtonGroup" >
+ <property name="title" >
+ <string>Events</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QCheckBox" name="eventNoteon" >
+ <property name="text" >
+ <string>note on</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QCheckBox" name="eventPolypressure" >
+ <property name="text" >
+ <string>poly pressure</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QCheckBox" name="eventController" >
+ <property name="text" >
+ <string>controller</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QCheckBox" name="eventAftertouch" >
+ <property name="text" >
+ <string>aftertouch</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QCheckBox" name="eventPitchbend" >
+ <property name="text" >
+ <string>pitch bend</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QCheckBox" name="eventProgramchange" >
+ <property name="text" >
+ <string>program change</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QCheckBox" name="eventSpecial" >
+ <property name="text" >
+ <string>special</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="ButtonGroup3" >
+ <property name="title" >
+ <string>Parts</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="partShownames" >
+ <property name="text" >
+ <string>show names</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="partShowevents" >
+ <property name="text" >
+ <string>show events</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="partShowCakes" >
+ <property name="text" >
+ <string>show Cakewalk Style</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab2" >
+ <attribute name="title" >
+ <string>Colors</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="4" column="1" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel6_2" >
+ <property name="text" >
+ <string>V</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="vslider" >
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="1" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel5_2" >
+ <property name="text" >
+ <string>S</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="sslider" >
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="1" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel4_2" >
+ <property name="text" >
+ <string>H</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="hslider" >
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QPushButton" name="addToPalette" >
+ <property name="text" >
+ <string>add to palette</string>
+ </property>
+ </widget>
+ </item>
+ <item rowspan="5" row="0" column="0" >
+ <widget class="QTreeWidget" name="itemList" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="rootIsDecorated" >
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>Items</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item rowspan="2" row="0" column="2" >
+ <widget class="QFrame" name="colorframe" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QGroupBox" name="colorPalette" >
+ <property name="focusPolicy" >
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="title" >
+ <string>Palette</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="3" column="3" >
+ <widget class="QToolButton" name="palette15" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QToolButton" name="palette14" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QToolButton" name="palette11" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QToolButton" name="palette10" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QToolButton" name="palette7" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QToolButton" name="palette6" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QToolButton" name="palette13" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QToolButton" name="palette9" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QToolButton" name="palette5" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QToolButton" name="palette12" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QToolButton" name="palette8" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QToolButton" name="palette4" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QToolButton" name="palette3" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QToolButton" name="palette2" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QToolButton" name="palette1" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QToolButton" name="palette0" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab3" >
+ <attribute name="title" >
+ <string>Style/Fonts</string>
+ </attribute>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="GroupBox18" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>QT Theme</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="themeComboBox" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <item>
+ <property name="text" >
+ <string>Windows</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>MusE</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Metal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Norwegian Wood</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Platinum</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>CDE</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Motif</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Motif Plus</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>190</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="GroupBox6" >
+ <property name="title" >
+ <string>Fonts</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="textLabel2" >
+ <property name="text" >
+ <string>Family</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="textLabel4" >
+ <property name="text" >
+ <string>Font 1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="textLabel5" >
+ <property name="text" >
+ <string>Font 2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="textLabel6" >
+ <property name="text" >
+ <string>Font 3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLineEdit" name="fontName0" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLineEdit" name="fontName1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QLineEdit" name="fontName2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QLineEdit" name="fontName3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="textLabel3" >
+ <property name="text" >
+ <string>Font 0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSpinBox" name="fontSize0" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="fontSize1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="fontSize2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2" >
+ <widget class="QSpinBox" name="fontSize3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QCheckBox" name="bold1" >
+ <property name="text" >
+ <string>Bold</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" >
+ <widget class="QCheckBox" name="bold2" >
+ <property name="text" >
+ <string>Bold</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3" >
+ <widget class="QCheckBox" name="bold3" >
+ <property name="text" >
+ <string>Bold</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QCheckBox" name="bold0" >
+ <property name="text" >
+ <string>Bold</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4" >
+ <widget class="QCheckBox" name="italic2" >
+ <property name="text" >
+ <string>Italic</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="4" >
+ <widget class="QCheckBox" name="italic3" >
+ <property name="text" >
+ <string>Italic</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4" >
+ <widget class="QCheckBox" name="italic1" >
+ <property name="text" >
+ <string>Italic</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QCheckBox" name="italic0" >
+ <property name="text" >
+ <string>Italic</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="5" >
+ <widget class="QToolButton" name="fontBrowse0" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="5" >
+ <widget class="QToolButton" name="fontBrowse1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="5" >
+ <widget class="QToolButton" name="fontBrowse2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="5" >
+ <widget class="QToolButton" name="fontBrowse3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLabel" name="textLabel7" >
+ <property name="text" >
+ <string>Font 4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" >
+ <widget class="QLineEdit" name="fontName4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" >
+ <widget class="QLabel" name="textLabel7_2" >
+ <property name="text" >
+ <string>Font 5</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1" >
+ <widget class="QLineEdit" name="fontName5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2" >
+ <widget class="QSpinBox" name="fontSize4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2" >
+ <widget class="QSpinBox" name="fontSize5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3" >
+ <widget class="QCheckBox" name="bold4" >
+ <property name="text" >
+ <string>Bold</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3" >
+ <widget class="QCheckBox" name="bold5" >
+ <property name="text" >
+ <string>Bold</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="4" >
+ <widget class="QCheckBox" name="italic4" >
+ <property name="text" >
+ <string>Italic</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="4" >
+ <widget class="QCheckBox" name="italic5" >
+ <property name="text" >
+ <string>Italic</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="5" >
+ <widget class="QToolButton" name="fontBrowse4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="5" >
+ <widget class="QToolButton" name="fontBrowse5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="applyButton" >
+ <property name="text" >
+ <string>Apply</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>Ok</string>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <tabstops>
+ <tabstop>TabWidget2</tabstop>
+ <tabstop>itemList</tabstop>
+ <tabstop>addToPalette</tabstop>
+ <tabstop>hslider</tabstop>
+ <tabstop>sslider</tabstop>
+ <tabstop>vslider</tabstop>
+ <tabstop>applyButton</tabstop>
+ <tabstop>okButton</tabstop>
+ <tabstop>cancelButton</tabstop>
+ <tabstop>partShownames</tabstop>
+ <tabstop>partShowevents</tabstop>
+ <tabstop>partShowCakes</tabstop>
+ <tabstop>eventNoteon</tabstop>
+ <tabstop>eventPolypressure</tabstop>
+ <tabstop>eventController</tabstop>
+ <tabstop>eventAftertouch</tabstop>
+ <tabstop>eventPitchbend</tabstop>
+ <tabstop>eventProgramchange</tabstop>
+ <tabstop>eventSpecial</tabstop>
+ <tabstop>arrGrid</tabstop>
+ <tabstop>themeComboBox</tabstop>
+ <tabstop>fontName0</tabstop>
+ <tabstop>fontName1</tabstop>
+ <tabstop>fontName2</tabstop>
+ <tabstop>fontName3</tabstop>
+ <tabstop>fontSize0</tabstop>
+ <tabstop>fontSize1</tabstop>
+ <tabstop>fontSize2</tabstop>
+ <tabstop>fontSize3</tabstop>
+ <tabstop>bold1</tabstop>
+ <tabstop>bold2</tabstop>
+ <tabstop>bold3</tabstop>
+ <tabstop>bold0</tabstop>
+ <tabstop>italic2</tabstop>
+ <tabstop>italic3</tabstop>
+ <tabstop>italic1</tabstop>
+ <tabstop>italic0</tabstop>
+ <tabstop>fontName4</tabstop>
+ <tabstop>fontName5</tabstop>
+ <tabstop>fontSize4</tabstop>
+ <tabstop>fontSize5</tabstop>
+ <tabstop>bold4</tabstop>
+ <tabstop>bold5</tabstop>
+ <tabstop>italic4</tabstop>
+ <tabstop>italic5</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/arranger/arranger.cpp b/muse/muse/arranger/arranger.cpp
new file mode 100644
index 00000000..4884fb59
--- /dev/null
+++ b/muse/muse/arranger/arranger.cpp
@@ -0,0 +1,1315 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: arranger.cpp,v 1.150 2006/04/23 12:27:50 wschweer Exp $
+//
+// (C) Copyright 2004-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "song.h"
+#include "muse.h"
+#include "arranger.h"
+#include "tlwidget.h"
+#include "tlswidget.h"
+#include "icons.h"
+#include "widgets/simplebutton.h"
+#include "configtrack.h"
+#include "canvas.h"
+#include "widgets/utils.h"
+#include "widgets/splitter.h"
+#include "mixer/astrip.h"
+#include "mixer/mstrip.h"
+#include "audio.h"
+#include "shortcuts.h"
+#include "trackinfo.h"
+#include "midictrl.h"
+#include "gconfig.h"
+#include "part.h"
+
+int Arranger::trackNameWidth = 80;
+
+//---------------------------------------------------------
+// TrElement elements
+// list of available track gui elements
+//---------------------------------------------------------
+
+const TrElement trElements[] = {
+ TrElement(TR_NAME, 1, "trackname", -1),
+ TrElement(TR_RECORD, 0, "record",
+ Track::M_MIDI | Track::M_AUDIO_OUTPUT | Track::M_WAVE),
+ TrElement(TR_OFF, 2, "off",
+ Track::M_AUDIO_OUTPUT
+ | Track::M_AUDIO_GROUP
+ | Track::M_AUDIO_AUX
+ | Track::M_WAVE
+ | Track::M_AUDIO_INPUT
+ | Track::M_AUDIO_SOFTSYNTH),
+ TrElement(TR_DRUMMAP, 2, "use drum map", Track::M_MIDI_CHANNEL),
+ TrElement(TR_MUTE, 3, "mute", -1),
+ TrElement(TR_SOLO, 3, "solo", -1),
+ TrElement(TR_MONITOR, 3, "monitor",
+ Track::M_MIDI | Track::M_WAVE),
+ TrElement(TR_AREAD, 4, "automation read",
+ -1 & ~Track::M_MIDI_IN),
+ TrElement(TR_AWRITE, 4, "automation write",
+ -1 & ~Track::M_MIDI_IN),
+ TrElement(TR_OCHANNEL, 5, "output channel", Track::M_MIDI),
+ TrElement(TR_INSTRUMENT, 6, "instrument", Track::M_MIDI_OUT),
+ TrElement(TR_PATCH, 7, "patch", Track::M_MIDI_CHANNEL),
+ };
+
+const int nTrElements = sizeof(trElements)/sizeof(*trElements);
+
+TrGroupList glist[Track::TRACK_TYPES];
+
+extern void populateAddTrack(QMenu*);
+
+//---------------------------------------------------------
+// TLayout
+// simple layout for trackList
+//---------------------------------------------------------
+
+class TLayout : public QLayout {
+ QList<QLayoutItem*> itemList;
+
+ public:
+ TLayout() {}
+ ~TLayout();
+
+ void addItem(QLayoutItem* item);
+ void insertWidget(int index, QWidget* item);
+ Qt::Orientations expandingDirections() const { return 0; }
+ bool hasHeightForWidth() const { return false; }
+ int count() const { return itemList.size(); }
+ void setGeometry(const QRect &rect);
+ QSize sizeHint() const { return ((QWidget*)parent())->size(); }
+ QLayoutItem *itemAt(int index) const { return itemList.value(index); }
+ QLayoutItem *takeAt(int idx) {
+ if (idx < 0 || idx >= itemList.size())
+ printf("TLayout::takeAt: bad index %d\n", idx);
+ return idx >= 0 && idx < itemList.size() ? itemList.takeAt(idx) : 0;
+ }
+ void clear() {
+ QLayoutItem* child;
+ while ((child = takeAt(0)) != 0) {
+ delete child;
+ }
+ }
+ };
+
+//---------------------------------------------------------
+// TLayout
+//---------------------------------------------------------
+
+TLayout::~TLayout()
+ {
+ QLayoutItem* child;
+ while ((child = takeAt(0)) != 0)
+ delete child;
+ }
+
+//---------------------------------------------------------
+// insertWidget
+//---------------------------------------------------------
+
+void TLayout::insertWidget(int index, QWidget* item)
+ {
+ if (item->parent() == 0)
+ item->setParent((QWidget*)parent());
+ itemList.insert(index, new QWidgetItem(item));
+ update();
+ }
+
+//---------------------------------------------------------
+// addItem
+//---------------------------------------------------------
+
+void TLayout::addItem(QLayoutItem* item)
+ {
+ itemList.append(item);
+ update();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void TLayout::setGeometry(const QRect& r)
+ {
+ int y = r.y() + 3;
+ int n = itemList.size();
+ int width = r.width(); // ((QWidget*)parent())->width();
+ for (int i = 0; i < n; ++i) {
+ QLayoutItem *item = itemList.at(i);
+ QWidget* w = item->widget();
+ int h = w->height();
+ w->setGeometry(0, y, width, h);
+ y += h;
+ }
+ }
+
+//---------------------------------------------------------
+// TlsvLayout
+//---------------------------------------------------------
+
+class TlsvLayout : public QLayout {
+ QList<QLayoutItem*> itemList;
+ int dx, dy;
+
+ public:
+ TlsvLayout() {
+ dx = 0;
+ dy = 0;
+ }
+ ~TlsvLayout();
+
+ void setOffset(int x, int y) {
+ dx = x;
+ dy = y;
+ }
+ void addItem(QLayoutItem* item);
+ void insertWidget(int index, QWidget* item);
+ Qt::Orientations expandingDirections() const { return 0; }
+ bool hasHeightForWidth() const { return false; }
+ int count() const { return itemList.size(); }
+ void setGeometry(const QRect &rect);
+ QSize sizeHint() const { return ((QWidget*)parent())->size(); }
+ QLayoutItem *itemAt(int index) const { return itemList.value(index); }
+ QLayoutItem *takeAt(int idx) {
+ return idx >= 0 && idx < itemList.size() ? itemList.takeAt(idx) : 0;
+ }
+ };
+
+//---------------------------------------------------------
+// TlsvLayout
+//---------------------------------------------------------
+
+TlsvLayout::~TlsvLayout()
+ {
+ QLayoutItem* child;
+ while ((child = takeAt(0)) != 0)
+ delete child;
+ }
+
+//---------------------------------------------------------
+// insertWidget
+//---------------------------------------------------------
+
+void TlsvLayout::insertWidget(int index, QWidget* item)
+ {
+ if (item->parent() == 0)
+ item->setParent((QWidget*)parent());
+ itemList.insert(index, new QWidgetItem(item));
+ update();
+ }
+
+//---------------------------------------------------------
+// addItem
+//---------------------------------------------------------
+
+void TlsvLayout::addItem(QLayoutItem* item)
+ {
+ itemList.append(item);
+ update();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void TlsvLayout::setGeometry(const QRect& r)
+ {
+ QLayoutItem *item = itemList.at(0);
+ QWidget* w = item->widget();
+ w->setGeometry(dx, dy, r.width(), w->height());
+ }
+
+//---------------------------------------------------------
+// newAddTrackMenu
+//---------------------------------------------------------
+
+QMenu* newAddTrackMenu(QWidget* parent)
+ {
+ QMenu* menu = new QMenu(parent);
+ populateAddTrack(menu);
+ return menu;
+ }
+
+//---------------------------------------------------------
+// Arranger
+//---------------------------------------------------------
+
+Arranger::Arranger(QMainWindow* parent)
+ : QWidget(parent)
+ {
+ setFocusPolicy(Qt::StrongFocus);
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+ for (int i = 0; i < Track::TRACK_TYPES; ++i)
+ trackInfos[i] = 0;
+
+ _curTrack = 0;
+ strip = 0;
+ info = 0;
+ tool = PointerTool;
+
+ for (int tt = 0; tt < Track::TRACK_TYPES; ++tt) {
+ int gn = 0;
+ TrElementList group;
+ for (int i = 0; i < nTrElements; ++i) {
+ if (!(trElements[i].trackMask & (1<<tt)))
+ continue;
+ if (trElements[i].grp != gn) {
+ glist[tt].push_back(group);
+ group.clear();
+ gn = trElements[i].grp;
+ }
+ group.push_back(&trElements[i]);
+ }
+ if (!group.empty())
+ glist[tt].push_back(group);
+ }
+
+ configTrackEditor = 0;
+ QLayout* ml = new QHBoxLayout;
+ ml->setSpacing(0);
+ ml->setMargin(0);
+ setLayout(ml);
+
+ infoDock = new QDockWidget(tr("TrackInfo"));
+ infoDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+ infoDock->setFixedWidth(infoWidth);
+ infoDock->layout()->setMargin(0);
+ infoDock->layout()->setSpacing(0);
+ infoDock->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
+ infoDockAction = infoDock->toggleViewAction();
+
+ mixerDock = new QDockWidget(tr("Mix"));
+ mixerDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+ mixerDock->setFixedWidth(STRIP_WIDTH);
+ mixerDock->layout()->setMargin(0);
+ mixerDock->layout()->setSpacing(0);
+ mixerDock->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
+ mixerDockAction = mixerDock->toggleViewAction();
+
+ parent->addDockWidget(Qt::LeftDockWidgetArea, infoDock, Qt::Horizontal);
+ parent->addDockWidget(Qt::LeftDockWidgetArea, mixerDock, Qt::Horizontal);
+
+ infoView = new QScrollArea;
+ infoDock->setWidget(infoView);
+ infoView->setFixedWidth(infoWidth);
+ infoView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ trackInfo = new QStackedWidget;
+ infoView->setWidget(trackInfo);
+ infoView->setWidgetResizable(true);
+
+ trackInfoVisible = false;
+ mixerStripVisible = false;
+ infoDock->setVisible(false);
+ mixerDock->setVisible(false);
+
+ connect(infoDockAction, SIGNAL(toggled(bool)), SLOT(toggleTrackInfo(bool)));
+ connect(mixerDockAction, SIGNAL(toggled(bool)), SLOT(toggleMixerStrip(bool)));
+
+ tlsv = new TrackListWidget;
+ tlsv->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
+ tlsvLayout = new TlsvLayout;
+ tlsv->setLayout(tlsvLayout);
+ trackList = new QWidget;
+// trackList->setAttribute(Qt::WA_NoSystemBackground);
+ trackList->setAttribute(Qt::WA_StaticContents);
+ trackList->setMouseTracking(true);
+
+ tlsv->layout()->addWidget(trackList);
+ tl = new TLayout;
+ trackList->setLayout(tl);
+
+ //
+ // Toolbox
+ //
+ QWidget* ttools = new QWidget;
+ QHBoxLayout* ttoolsLayout = new QHBoxLayout;
+ ttoolsLayout->setMargin(1);
+ ttoolsLayout->setSpacing(1);
+ ttools->setLayout(ttoolsLayout);
+ ttools->setFixedHeight(rulerHeight - 2);
+
+ SimpleButton* configButton = new SimpleButton(configIcon, configIcon);
+ configButton->setAutoRaise(true);
+ configButton->setToolTip(tr("Config Tracklist"));
+ connect(configButton, SIGNAL(clicked()), SLOT(configTrackList()));
+ ttoolsLayout->addWidget(configButton);
+ ttoolsLayout->addStretch(100);
+
+ gmute = newMuteButton(ttools);
+ gmute->setFixedWidth(rulerHeight);
+ gmute->setToolTip(tr("all mute off"));
+ ttoolsLayout->addWidget(gmute);
+ setGMute();
+ connect(song, SIGNAL(muteChanged(Track*,bool)), SLOT(setGMute()));
+ connect(gmute, SIGNAL(clicked(bool)), SLOT(offGMute()));
+
+ gsolo = newSoloButton(ttools);
+ gsolo->setFixedWidth(rulerHeight);
+ gsolo->setToolTip(tr("all solo off"));
+ ttoolsLayout->addWidget(gsolo);
+ setGSolo();
+ connect(song, SIGNAL(soloChanged(Track*,bool)), SLOT(setGSolo()));
+ connect(gsolo, SIGNAL(clicked(bool)), SLOT(offGSolo()));
+
+ gar = newAutoReadButton(ttools);
+ gar->setFixedWidth(rulerHeight);
+ gar->setToolTip(tr("all autoRead off"));
+ ttoolsLayout->addWidget(gar);
+ setGar();
+ connect(song, SIGNAL(autoReadChanged(Track*,bool)), SLOT(setGar()));
+ connect(gar, SIGNAL(clicked(bool)), SLOT(offGar()));
+
+ gaw = newAutoWriteButton(ttools);
+ gaw->setFixedWidth(rulerHeight);
+ gaw->setToolTip(tr("all autoWrite off"));
+ ttoolsLayout->addWidget(gaw);
+ setGaw();
+ connect(song, SIGNAL(autoWriteChanged(Track*,bool)), SLOT(setGaw()));
+ connect(gaw, SIGNAL(clicked(bool)), SLOT(offGaw()));
+
+ QHBoxLayout* infoboxLayout = new QHBoxLayout;
+ infoboxLayout->setMargin(1);
+ infoboxLayout->setSpacing(1);
+
+ SimpleButton* tifButton = new SimpleButton(QString());
+ tifButton->setCheckable(true);
+ tifButton->setFixedSize(infoHeight-2, infoHeight);
+ tifButton->setDefaultAction(infoDockAction);
+ infoDockAction->setText(tr("i"));
+ infoDockAction->setToolTip(tr("Show Track Info"));
+ infoboxLayout->addWidget(tifButton);
+
+ SimpleButton* mstButton = new SimpleButton(QString());
+ mstButton->setCheckable(true);
+ mstButton->setFixedSize(infoHeight-2, infoHeight);
+ mstButton->setDefaultAction(mixerDockAction);
+ mixerDockAction->setText(tr("m"));
+ mixerDockAction->setToolTip(tr("Show Mixer Strip"));
+ infoboxLayout->addWidget(mstButton);
+
+ infoboxLayout->addStretch(100);
+
+ split = new Splitter(Qt::Horizontal);
+ split->setOpaqueResize(true);
+ split->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ QWidget* tw = new QWidget;
+ split->addWidget(tw);
+ QVBoxLayout* trackListGrid = new QVBoxLayout;
+ trackListGrid->setMargin(0);
+ trackListGrid->setSpacing(0);
+ tw->setLayout(trackListGrid);
+
+ trackListGrid->addWidget(ttools);
+ trackListGrid->addWidget(tlsv, 100);
+ trackListGrid->addLayout(infoboxLayout);
+
+ //
+ // canvas widget
+ //
+ canvas = new PartCanvas;
+ canvas->setCornerWidget(new QSizeGrip(canvas));
+ split->addWidget(canvas);
+ split->setStretchFactor(1, 100);
+ canvas->setTool(tool);
+ canvas->verticalScrollBar()->setSingleStep(minTrackHeight/2);
+
+ connect(tlsv, SIGNAL(mouseWheel(QWheelEvent*)), SLOT(mouseWheel(QWheelEvent*)));
+ connect(song, SIGNAL(posChanged(int,const AL::Pos&,bool)), canvas, SLOT(setLocatorPos(int,const AL::Pos&,bool)));
+ connect(song, SIGNAL(lenChanged(const AL::Pos&)), canvas, SLOT(setEndPos(const AL::Pos&)));
+ connect(song, SIGNAL(tempoChanged()), canvas, SLOT(tempoChanged()));
+ connect(canvas, SIGNAL(kbdMovementUpdate(Track*, Part*)), SLOT(kbdMovementUpdate(Track*, Part*)));
+ connect(muse, SIGNAL(rasterChanged(int)), canvas, SLOT(setRaster(int)));
+ connect(canvas, SIGNAL(cursorPos(const AL::Pos&,bool)), SIGNAL(cursorPos(const AL::Pos&,bool)));
+ connect(canvas, SIGNAL(contentsMoving(int,int)), SLOT(setTLViewPos(int,int)));
+ connect(canvas, SIGNAL(posChanged(int,const AL::Pos&)), SLOT(setPos(int,const AL::Pos&)));
+
+ connect(canvas, SIGNAL(createLRPart(Track*)), song, SLOT(createLRPart(Track*)));
+ connect(canvas, SIGNAL(doubleClickPart(Part*)), SIGNAL(editPart(Part*)));
+ connect(canvas, SIGNAL(startEditor(Part*,int)), muse, SLOT(startEditor(Part*,int)));
+ connect(canvas, SIGNAL(partChanged(Part*,unsigned,unsigned)),
+ song, SLOT(changePart(Part*,unsigned,unsigned)));
+ connect(canvas, SIGNAL(addMarker(const AL::Pos&)), SLOT(addMarker(const AL::Pos&)));
+ connect(canvas, SIGNAL(removeMarker(const AL::Pos&)), SLOT(removeMarker(const AL::Pos&)));
+
+ layout()->addWidget(split);
+
+ connect(muse, SIGNAL(configChanged()), SLOT(updateConfiguration()));
+ connect(song, SIGNAL(trackSelectionChanged(Track*)), SLOT(setSelectedTrack(Track*)));
+ connect(song, SIGNAL(trackRemoved(Track*)), SLOT(removeTrack(Track*)));
+ connect(song, SIGNAL(trackAdded(Track*,int)), SLOT(insertTrack(Track*)));
+ connect(muse, SIGNAL(startLoadSong()), SLOT(startLoadSong()));
+ }
+
+//---------------------------------------------------------
+// setPos
+//---------------------------------------------------------
+
+void Arranger::setPos(int idx, const AL::Pos& pos)
+ {
+ song->setPos(idx, pos.snaped(muse->raster()));
+ }
+
+//---------------------------------------------------------
+// setTLViewPos
+//---------------------------------------------------------
+
+void Arranger::setTLViewPos(int /*x*/, int y)
+ {
+#if 1
+ int dy = y + trackList->y();
+ tlsv->scroll(0, -dy);
+#else
+ trackList->setGeometry(0, -y, trackList->width(), trackList->height());
+#endif
+ tlsvLayout->setOffset(0, -y);
+ }
+
+//---------------------------------------------------------
+// tlIndex
+//---------------------------------------------------------
+
+int Arranger::tlIndex(Track* t) const
+ {
+ const TrackList* stl = song->tracks();
+
+ int idx = 0;
+ for (ciTrack i = stl->begin(); i != stl->end(); ++i, ++idx) {
+ if (*i == t)
+ break;
+ ArrangerTrack* at = &(*i)->arrangerTrack;
+ if (at->tw == 0)
+ continue;
+ idx += (*i)->subtracks.size();
+ }
+ return idx;
+ }
+
+int Arranger::tlIndex(ArrangerTrack* t) const
+ {
+ TrackList* stl = song->tracks();
+
+ int idx = 0;
+ for (ciTrack i = stl->begin(); i != stl->end(); ++i, ++idx) {
+ ArrangerTrack* at = &(*i)->arrangerTrack;
+ if (at->tw == 0)
+ continue;
+ ArrangerTrackList& atl = (*i)->subtracks;
+ for (iArrangerTrack k = atl.begin(); k != atl.end(); ++k) {
+ ++idx;
+ if (*k == t)
+ return idx;
+ }
+ }
+ return -1; // crash
+ }
+
+//---------------------------------------------------------
+// insertTrack
+//---------------------------------------------------------
+
+void Arranger::insertTrack1(Track* t)
+ {
+ int idx = tlIndex(t);
+ //-------------------------
+ // track list widget
+ //-------------------------
+
+ TLWidget* tw = new TLWidget(t, &glist[t->type()]);
+ tw->setFixedHeight(t->arrangerTrack.h);
+ tl->insertWidget(idx, tw);
+ tw->show(); // needed if song is reloaded
+
+ connect(tw, SIGNAL(plusClicked(TLWidget*)), SLOT(appendSubtrack(TLWidget*)));
+ connect(tw, SIGNAL(moveTrack(Track*,Track*)), SLOT(moveTrack(Track*,Track*)));
+ connect(this, SIGNAL(configChanged()), tw, SLOT(configChanged()));
+ connect(tw, SIGNAL(drag(int, int)), SLOT(drag(int,int)));
+ connect(tw, SIGNAL(startDrag(int)), SLOT(startDrag(int)));
+ connect(t, SIGNAL(partsChanged()), canvas->widget(), SLOT(update()));
+
+ ArrangerTrack* at = &(t->arrangerTrack);
+ at->tw = tw;
+ }
+
+void Arranger::insertTrack(Track* t)
+ {
+ insertTrack1(t);
+ t->arrangerTrack.tw->show();
+ updateIndex();
+ if (_curTrack == 0)
+ setSelectedTrack(_curTrack);
+ }
+
+//---------------------------------------------------------
+// removeTrack
+//---------------------------------------------------------
+
+void Arranger::removeTrack(Track* t)
+ {
+ ArrangerTrack* at = &t->arrangerTrack;
+ if (at->tw == 0)
+ return;
+
+ tl->removeWidget(at->tw);
+
+ at->tw->close();
+ at->tw = 0;
+
+ for (iArrangerTrack i = t->subtracks.begin(); i != t->subtracks.end(); ++i) {
+ ArrangerTrack* at = &t->arrangerTrack;
+ tl->removeWidget(at->tw);
+ at->tw->close();
+ }
+ t->subtracks.clear();
+
+ if (t == _curTrack) {
+ setSelectedTrack(song->tracks()->front());
+ }
+ updateIndex();
+ }
+
+//---------------------------------------------------------
+// drag
+//---------------------------------------------------------
+
+void Arranger::drag(int trackIdx, int delta)
+ {
+ int h = startH + delta;
+ if (h < minTrackHeight)
+ h = minTrackHeight;
+ ArrangerTrack* at = atrack(trackIdx);
+ at->tw->setFixedHeight(h);
+ updateIndex();
+ }
+
+//---------------------------------------------------------
+// startDrag
+//---------------------------------------------------------
+
+void Arranger::startDrag(int trackIdx)
+ {
+ ArrangerTrack* at = atrack(trackIdx);
+ startH = at->tw->height();
+ }
+
+//---------------------------------------------------------
+// TrackListWidget
+//---------------------------------------------------------
+
+TrackListWidget::TrackListWidget(QWidget* parent)
+ : QWidget(parent)
+ {
+ setAttribute(Qt::WA_NoSystemBackground);
+ setAttribute(Qt::WA_StaticContents);
+ }
+
+//---------------------------------------------------------
+// paintEvent
+//---------------------------------------------------------
+
+void TrackListWidget::paintEvent(QPaintEvent* ev)
+ {
+ QPainter p(this);
+ p.eraseRect(ev->rect());
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void TrackListWidget::mousePressEvent(QMouseEvent* ev)
+ {
+ if (ev->button() == Qt::RightButton) {
+ QMenu* menu = newAddTrackMenu(this);
+ menu->exec(ev->globalPos());
+ }
+ }
+
+//---------------------------------------------------------
+// wheelEvent
+//---------------------------------------------------------
+
+void TrackListWidget::wheelEvent(QWheelEvent* e)
+ {
+ emit mouseWheel(e);
+ }
+
+//---------------------------------------------------------
+// mouseWheel
+// get redirected mouse wheel events from TrackListWidget
+//---------------------------------------------------------
+
+void Arranger::mouseWheel(QWheelEvent* e)
+ {
+ if (e->orientation() != Qt::Vertical)
+ return;
+ QScrollBar* sb = canvas->verticalScrollBar();
+ int step = qMin(QApplication::wheelScrollLines() * sb->singleStep(), sb->pageStep());
+ if ((e->modifiers() & Qt::ControlModifier) || (e->modifiers() & Qt::ShiftModifier))
+ step = sb->pageStep();
+ int offset = e->delta() * step / 120;
+ if (sb->invertedControls())
+ offset = -offset;
+ if (qAbs(offset) < 1)
+ return;
+ sb->setValue(sb->value() + offset);
+ e->accept();
+ }
+
+//---------------------------------------------------------
+// appendSubtrack
+//---------------------------------------------------------
+
+void Arranger::appendSubtrack(TLWidget* trackWidget)
+ {
+ appendSubtrack(trackWidget->track());
+ }
+
+void Arranger::appendSubtrack(Track* t)
+ {
+ ArrangerTrack* at = new ArrangerTrack;
+ at->h = minTrackHeight;
+ at->ctrl = CTRL_OTHER;
+ t->subtracks.push_back(at);
+ initSubtrack(t, at);
+ updateIndex();
+ }
+
+//---------------------------------------------------------
+// initSubtrack
+//---------------------------------------------------------
+
+void Arranger::initSubtrack(Track* t, ArrangerTrack* at)
+ {
+ TLSWidget* tw = new TLSWidget(t, at, canvas);
+ tw->setFixedHeight(at->h);
+ tl->insertWidget(tlIndex(at), tw);
+
+ tw->setCtrl(at->ctrl);
+ at->tw = tw;
+ connect(tw, SIGNAL(minusClicked(TLSWidget*)), SLOT(removeSubtrack(TLSWidget*)));
+ connect(tw, SIGNAL(controllerChanged(int)), canvas->widget(), SLOT(update()));
+ connect(tw, SIGNAL(drag(int, int)), SLOT(drag(int,int)));
+ connect(tw, SIGNAL(startDrag(int)), SLOT(startDrag(int)));
+ tw->show();
+ }
+
+//---------------------------------------------------------
+// removeSubtrack
+//---------------------------------------------------------
+
+void Arranger::removeSubtrack(TLSWidget* w)
+ {
+ Track* t = w->track();
+ for (iArrangerTrack it = t->subtracks.begin(); it != t->subtracks.end(); ++it) {
+ ArrangerTrack* at = *it;
+ if (at->tw == w) {
+ tl->removeWidget(at->tw);
+// at->tw->close();
+ delete at->tw;
+ t->subtracks.erase(it);
+ delete at;
+ break;
+ }
+ }
+ updateIndex();
+ }
+
+//---------------------------------------------------------
+// configTrackList
+//---------------------------------------------------------
+
+void Arranger::configTrackList()
+ {
+ if (configTrackEditor == 0) {
+ configTrackEditor = new ConfigTrackList(this);
+ connect(configTrackEditor, SIGNAL(trackConfigChanged()), SIGNAL(configChanged()));
+ }
+ configTrackEditor->show();
+ }
+
+//---------------------------------------------------------
+// atrack
+//---------------------------------------------------------
+
+ArrangerTrack* Arranger::atrack(int idx)
+ {
+ int k = 0;
+ TrackList* stl = song->tracks();
+ for (iTrack i = stl->begin(); i != stl->end(); ++i) {
+ ArrangerTrack* at = &(*i)->arrangerTrack;
+ if (idx == k)
+ return at;
+ ++k;
+ for (iArrangerTrack it = (*i)->subtracks.begin(); it != (*i)->subtracks.end(); ++it) {
+ ArrangerTrack* t = *it;
+ if (idx == k)
+ return t;
+ ++k;
+ }
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// updateIndex
+// update vertical scrollbar & index values
+//---------------------------------------------------------
+
+void Arranger::updateIndex()
+ {
+ int idx = 0;
+ int h = 2 * defaultTrackHeight; // always show room for at least two
+ // tracks at end of list
+
+ TrackList* stl = song->tracks();
+ for (iTrack i = stl->begin(); i != stl->end(); ++i) {
+ ArrangerTrack* at = &(*i)->arrangerTrack;
+ if (at->tw == 0)
+ continue;
+ ((TLWidget*)at->tw)->setIdx(idx);
+ h += at->tw->height();
+ ++idx;
+ for (iArrangerTrack it = (*i)->subtracks.begin(); it != (*i)->subtracks.end(); ++it) {
+ ArrangerTrack* t = *it;
+ if (t->tw == 0)
+ continue;
+ ((TLSWidget*)t->tw)->setIdx(idx);
+ h += t->tw->height();
+ ++idx;
+ }
+ }
+ setGMute();
+ setGSolo();
+ setGar();
+ setGaw();
+ canvas->setVSize(h);
+ trackList->setFixedHeight(h + 32);
+ canvas->widget()->update();
+ }
+
+//---------------------------------------------------------
+// toggleTrackInfo
+//---------------------------------------------------------
+
+void Arranger::toggleTrackInfo(bool val)
+ {
+ trackInfoVisible = val;
+ if (_curTrack == 0)
+ return;
+ if (trackInfoVisible) {
+ Track::TrackType t = _curTrack->type();
+ TrackInfo* w = trackInfos[t];
+ if (w == 0) {
+ w = trackInfos[t] = createTrackInfo();
+ trackInfo->addWidget(w);
+ }
+ w->init(_curTrack);
+ trackInfo->setCurrentWidget(w);
+ }
+ }
+
+//---------------------------------------------------------
+// toggleMixerStrip
+//---------------------------------------------------------
+
+void Arranger::toggleMixerStrip(bool val)
+ {
+ mixerStripVisible = val;
+ if (mixerStripVisible && _curTrack) {
+ if (strip && _curTrack != strip->getTrack()) {
+ strip->close();
+ strip = 0;
+ }
+ if (!strip) {
+ switch(_curTrack->type()) {
+ case Track::MIDI_IN:
+ strip = new MidiInPortStrip(0, (MidiInPort*)_curTrack, false);
+ break;
+ case Track::MIDI_OUT:
+ strip = new MidiOutPortStrip(0, (MidiOutPort*)_curTrack, false);
+ break;
+ case Track::MIDI_CHANNEL:
+ strip = new MidiChannelStrip(0, (MidiChannel*)_curTrack, false);
+ break;
+ case Track::MIDI_SYNTI:
+ strip = new MidiSyntiStrip(0, (MidiSynti*)_curTrack, false);
+ break;
+ case Track::MIDI:
+ strip = new MidiStrip(0, (MidiTrack*)_curTrack, false);
+ break;
+ default:
+ strip = new AudioStrip(0, (AudioTrack*)_curTrack, false);
+ break;
+ }
+ mixerDock->setWidget(strip);
+ }
+ }
+ else {
+ if (strip) {
+ strip->close();
+ strip = 0;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// startLoadSong
+//---------------------------------------------------------
+
+void Arranger::startLoadSong()
+ {
+ if (strip)
+ strip->close();
+ strip = 0;
+
+ TrackList* stl = song->tracks();
+ for (iTrack i = stl->begin(); i != stl->end(); ++i) {
+ ArrangerTrack* at = &(*i)->arrangerTrack;
+ tl->removeWidget(at->tw);
+ at->tw->close();
+ at->tw = 0;
+ for (iArrangerTrack it = (*i)->subtracks.begin(); it != (*i)->subtracks.end(); ++it) {
+ ArrangerTrack* at = *it;
+ tl->removeWidget(at->tw);
+ at->tw->close();
+ }
+ (*i)->subtracks.clear();
+ }
+ }
+
+//---------------------------------------------------------
+// endLoadSong
+// create track list widgets
+//---------------------------------------------------------
+
+void Arranger::endLoadSong()
+ {
+ TrackList* stl = song->tracks();
+
+ for (iTrack i = stl->begin(); i != stl->end(); ++i) {
+ Track* t = *i;
+ insertTrack1(t);
+ for (iArrangerTrack i = t->subtracks.begin(); i != t->subtracks.end(); ++i) {
+ initSubtrack(t, *i);
+ }
+ }
+ updateIndex();
+ _curTrack = song->selectedTrack();
+ infoDock->setVisible(trackInfoVisible);
+ mixerDock->setVisible(mixerStripVisible);
+ }
+
+//---------------------------------------------------------
+// updateConfiguration
+//---------------------------------------------------------
+
+void Arranger::updateConfiguration()
+ {
+ if (config.canvasUseBgPixmap) {
+ canvas->setCanvasBackground(QPixmap(config.canvasBgPixmap));
+ }
+ else
+ canvas->setCanvasBackground(config.canvasBgColor);
+//TD canvas->setShowGrid(config.canvasShowGrid);
+//TD update();
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void Arranger::readStatus(QDomNode node)
+ {
+ TrackList* tl = song->tracks();
+ iTrack it = tl->begin();
+
+ QPoint wpos;
+ double xmag = 0.05;
+ double ymag = 1.0;
+
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "info")
+ trackInfoVisible = i;
+ else if (tag == "strip")
+ mixerStripVisible = i;
+ else if (tag == "TrackConf") {
+ }
+ else if (tag == "hmag")
+ xmag = s.toDouble();
+ else if (tag == "vmag")
+ ymag = s.toDouble();
+ else if (tag == "hpos")
+ wpos.setX(i);
+ else if (tag == "vpos")
+ wpos.setY(i);
+ else if (tag == "namesize") {
+ Arranger::trackNameWidth = i;
+ }
+ else if (tag == "splitter") {
+ split->readStatus(node);
+ QList<int> sizes = split->sizes();
+ split->setSizes(sizes);
+ }
+ else
+ printf("Arranger: unknown tag %s\n", tag.toLatin1().data());
+ }
+ canvas->setMag(xmag, ymag);
+ canvas->setWPos(wpos);
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void Arranger::writeStatus(Xml& xml)
+ {
+ xml.tag("arranger");
+
+ for (int i = 0; i < Track::TRACK_TYPES; ++i) {
+ TrGroupList* gl = &glist[i];
+ xml.tag("TrackConf type=\"%d\"", i);
+ for (iTrGroup ig = gl->begin(); ig != gl->end(); ++ig) {
+ TrElementList& el = *ig;
+ xml.tag("group");
+ for (iTrElement ie = el.begin(); ie != el.end(); ++ie)
+ xml.tagE("element id=\"%d\"", (*ie)->id);
+ xml.etag("group");
+ }
+ xml.etag("TrackConf");
+ }
+ xml.intTag("info", trackInfoVisible);
+ xml.intTag("strip", mixerStripVisible);
+ xml.doubleTag("hmag", canvas->xmag());
+ xml.doubleTag("vmag", canvas->ymag());
+ xml.intTag("hpos", canvas->getWPos().x());
+ xml.intTag("vpos", canvas->getWPos().y());
+ split->writeStatus("splitter", xml);
+ xml.etag("arranger");
+ }
+
+//---------------------------------------------------------
+// setGMute
+//---------------------------------------------------------
+
+void Arranger::setGMute()
+ {
+ TrackList* tl = song->tracks();
+ bool mute = false;
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ if ((*i)->mute()) {
+ mute = true;
+ break;
+ }
+ }
+ gmute->setChecked(mute);
+ }
+
+//---------------------------------------------------------
+// setGSolo
+//---------------------------------------------------------
+
+void Arranger::setGSolo()
+ {
+ TrackList* tl = song->tracks();
+ bool solo = false;
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ if ((*i)->solo()) {
+ solo = true;
+ break;
+ }
+ }
+ gsolo->setChecked(solo);
+ }
+
+//---------------------------------------------------------
+// setGar
+//---------------------------------------------------------
+
+void Arranger::setGar()
+ {
+ TrackList* tl = song->tracks();
+ bool ar = false;
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ if ((*i)->autoRead()) {
+ ar = true;
+ break;
+ }
+ }
+ if (ar == false) {
+ MidiChannelList* cl = song->midiChannel();
+ for (iMidiChannel i = cl->begin(); i != cl->end(); ++i) {
+ if ((*i)->autoRead()) {
+ ar = true;
+ break;
+ }
+ }
+ }
+ gar->setChecked(ar);
+ }
+
+//---------------------------------------------------------
+// setGaw
+//---------------------------------------------------------
+
+void Arranger::setGaw()
+ {
+ TrackList*tl = song->tracks();
+ bool aw = false;
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ if ((*i)->autoWrite())
+ aw = true;
+ }
+ if (aw == false) {
+ MidiChannelList* cl = song->midiChannel();
+ for (iMidiChannel i = cl->begin(); i != cl->end(); ++i) {
+ if ((*i)->autoWrite()) {
+ aw = true;
+ break;
+ }
+ }
+ }
+ gaw->setChecked(aw);
+ }
+
+//---------------------------------------------------------
+// offGMute
+//---------------------------------------------------------
+
+void Arranger::offGMute()
+ {
+ TrackList*tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i)
+ song->setMute(*i,false);
+ gmute->setChecked(false);
+ }
+
+//---------------------------------------------------------
+// offGSolo
+//---------------------------------------------------------
+
+void Arranger::offGSolo()
+ {
+ TrackList*tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i)
+ song->setSolo(*i, false);
+ gsolo->setChecked(false);
+ }
+
+//---------------------------------------------------------
+// offGar
+//---------------------------------------------------------
+
+void Arranger::offGar()
+ {
+ TrackList*tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i)
+ song->setAutoRead(*i, false);
+ MidiChannelList* cl = song->midiChannel();
+ for (iMidiChannel i = cl->begin(); i != cl->end(); ++i)
+ song->setAutoRead(*i, false);
+ gar->setChecked(false);
+ }
+
+//---------------------------------------------------------
+// offGaw
+//---------------------------------------------------------
+
+void Arranger::offGaw()
+ {
+ TrackList*tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i)
+ song->setAutoWrite(*i, false);
+ MidiChannelList* cl = song->midiChannel();
+ for (iMidiChannel i = cl->begin(); i != cl->end(); ++i)
+ song->setAutoWrite(*i, false);
+ gaw->setChecked(false);
+ }
+
+//---------------------------------------------------------
+// setTool
+//---------------------------------------------------------
+
+void Arranger::setTool(int t)
+ {
+ tool = Tool(t);
+ canvas->setTool(tool);
+ }
+
+//---------------------------------------------------------
+// setSelectedTrack
+//---------------------------------------------------------
+
+void Arranger::setSelectedTrack(Track* t)
+ {
+ _curTrack = t;
+ toggleTrackInfo(trackInfoVisible);
+ toggleMixerStrip(mixerStripVisible);
+ }
+
+//---------------------------------------------------------
+// moveTrack
+// move src before dst
+//---------------------------------------------------------
+
+void Arranger::moveTrack(Track* src, Track* dst)
+ {
+ audio->msgMoveTrack(src, dst);
+ tl->clear();
+ TrackList* stl = song->tracks();
+ for (iTrack i = stl->begin(); i != stl->end(); ++i) {
+ tl->addWidget((*i)->arrangerTrack.tw);
+ for (iArrangerTrack it = (*i)->subtracks.begin(); it != (*i)->subtracks.end(); ++it)
+ tl->addWidget((*it)->tw);
+ }
+ tl->setGeometry(((QWidget*)tl->parent())->geometry());
+ updateIndex();
+ }
+
+//---------------------------------------------------------
+//! \fn Arranger::keyPressEvent(QKeyEvent* e)
+//! \brief Called when a key is pressed
+//! @param e The key event
+//---------------------------------------------------------
+
+void Arranger::keyPressEvent(QKeyEvent* e)
+ {
+ int key = e->key();
+ bool keypress_handled = false;
+
+ if (e->modifiers() & Qt::ShiftModifier)
+ key += Qt::SHIFT;
+ if (e->modifiers() & Qt::AltModifier)
+ key += Qt::ALT;
+ if (e->modifiers() & Qt::ControlModifier)
+ key += Qt::CTRL;
+
+ if (shortcutsKbdMovement.isValid()) {
+ if (key == shortcuts[SHRT_SEL_LEFT].key || key == shortcuts[SHRT_SEL_LEFT_ADD].key) {
+ keypress_handled = true;
+ bool add = (key == shortcuts[SHRT_SEL_LEFT_ADD].key);
+ PartList* parts = shortcutsKbdMovement.track()->parts();
+ Part* nextLeft = 0;
+
+ for (iPart i = parts->begin(); i != parts->end(); i++) {
+ Part* tmp = i->second;
+ if (!nextLeft) {
+ if (tmp->tick() < shortcutsKbdMovement.getLpos())
+ nextLeft = tmp;
+ }
+ else {
+ if (tmp->tick() > nextLeft->tick() && tmp->tick() < shortcutsKbdMovement.getLpos() )
+ nextLeft = tmp;
+ }
+ }
+ if (nextLeft) {
+ song->selectPart(nextLeft, add);
+ shortcutsKbdMovement.setPart(nextLeft);
+ shortcutsKbdMovement.setPos(nextLeft->tick(), nextLeft->tick() + nextLeft->lenTick());
+ }
+ }
+ else if (key == shortcuts[SHRT_SEL_RIGHT].key || key == shortcuts[SHRT_SEL_RIGHT_ADD].key) {
+ keypress_handled = true;
+ bool add = (key == shortcuts[SHRT_SEL_RIGHT_ADD].key);
+ PartList* parts = shortcutsKbdMovement.track()->parts();
+ Part* nextRight = 0;
+
+ for (iPart i = parts->begin(); i != parts->end(); i++) {
+ Part* tmp = i->second;
+ if (!nextRight) {
+ if (tmp->tick() > shortcutsKbdMovement.getLpos())
+ nextRight = tmp;
+ }
+ else {
+ if (tmp->tick() < nextRight->tick() && tmp->tick() > shortcutsKbdMovement.getLpos() )
+ nextRight = tmp;
+ }
+ }
+ if (nextRight) {
+ song->selectPart(nextRight, add);
+ shortcutsKbdMovement.setPart(nextRight);
+ shortcutsKbdMovement.setPos(nextRight->tick(), nextRight->tick() + nextRight->lenTick());
+ }
+ }
+ else if (key == shortcuts[SHRT_SEL_ABOVE].key) {
+ // TODO
+ }
+ else if (key == shortcuts[SHRT_SEL_BELOW].key) {
+ // TODO
+ }
+ } // -- end movement
+
+ // If we haven't dealt with the keypress, pass it along
+ if (!keypress_handled) {
+ e->ignore();
+ }
+ }
+
+
+/*!
+ \fn Arranger::kbdMovementUpdate(Track* t, Part* p)
+ \brief Slot connected to canvaswidget, called when a part is selected
+ @param t Track the selected part belongs to (null if no part selected)
+ @param p The selected Part (null if no part selected)
+ */
+void Arranger::kbdMovementUpdate(Track* t, Part* p)
+ {
+ if (t && p ) {
+ // If other track selected:
+ if (t != shortcutsKbdMovement.track()) {
+ TrackList* stl = song->tracks();
+ for (iTrack i = stl->begin(); i != stl->end(); ++i) {
+ if (*i == t) {
+ // Set focus and select current track
+ t->arrangerTrack.tw->setFocus();
+ song->selectTrack(t);
+ }
+ }
+ }
+ shortcutsKbdMovement.setTrack(t);
+ shortcutsKbdMovement.setPart(p);
+ shortcutsKbdMovement.setPos(p->tick(), p->tick() + p->lenTick());
+ }
+ else { // Deselected
+ shortcutsKbdMovement.reset();
+ }
+ }
+
+//---------------------------------------------------------
+// addMarker
+//---------------------------------------------------------
+
+void Arranger::addMarker(const AL::Pos& pos)
+ {
+ song->addMarker(QString(), pos);
+ canvas->widget()->update();
+ }
+
+//---------------------------------------------------------
+// removeMarker
+//---------------------------------------------------------
+
+void Arranger::removeMarker(const AL::Pos& pos)
+ {
+ AL::MarkerList* ml = song->marker();
+ for (AL::iMarker i = ml->begin(); i != ml->end(); ++i) {
+ AL::iMarker ni = i;
+ ++ni;
+ if (i->second <= pos && (ni == ml->end() || ni->second > pos)) {
+ song->removeMarker(&(i->second));
+ canvas->widget()->update();
+ return;
+ }
+ }
+ printf("marker not found\n");
+ }
+
diff --git a/muse/muse/arranger/arranger.h b/muse/muse/arranger/arranger.h
new file mode 100644
index 00000000..b48fdaf0
--- /dev/null
+++ b/muse/muse/arranger/arranger.h
@@ -0,0 +1,149 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: arranger.h,v 1.72 2006/02/07 16:59:35 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __ARRANGER_H__
+#define __ARRANGER_H__
+
+#include "widgets/tools.h"
+#include "track.h"
+
+namespace AL {
+ class Xml;
+ class Pos;
+ };
+using AL::Xml;
+class AL::Pos;
+
+class Track;
+class TrackInfo;
+class TLWidget;
+class TLSWidget;
+class PartCanvas;
+class Part;
+class SimpleButton;
+class Strip;
+class ArrangerTrack;
+class Splitter;
+class TlsvLayout;
+class TLayout;
+
+//---------------------------------------------------------
+// TrackListWidget
+//---------------------------------------------------------
+
+class TrackListWidget : public QWidget {
+ Q_OBJECT
+
+ void mousePressEvent(QMouseEvent*);
+ void wheelEvent(QWheelEvent*);
+ virtual void paintEvent(QPaintEvent*);
+
+ signals:
+ void mouseWheel(QWheelEvent*);
+
+ public:
+ TrackListWidget(QWidget* parent = 0);
+ };
+
+//---------------------------------------------------------
+// Arranger
+//---------------------------------------------------------
+
+class Arranger : public QWidget {
+ Q_OBJECT
+
+ QAction* infoDockAction;
+ QAction* mixerDockAction;
+
+ TrackInfo* trackInfos[Track::TRACK_TYPES];
+ Tool tool;
+ QWidget* trackList;
+ PartCanvas* canvas;
+ TLayout* tl; // tracklist layout
+ TrackListWidget* tlsv;
+ TlsvLayout* tlsvLayout;
+ QDialog* configTrackEditor;
+ QStackedWidget* trackInfo;
+ QScrollArea* infoView;
+ Track* _curTrack; // current selected track
+ SimpleButton* gmute;
+ SimpleButton* gsolo;
+ SimpleButton* gar;
+ SimpleButton* gaw;
+ Strip* strip;
+ QStackedWidget* info;
+
+ Splitter* split;
+ QDockWidget* infoDock;
+ QDockWidget* mixerDock;
+
+ int startH; // start value for resize track height
+
+ bool trackInfoVisible;
+ bool mixerStripVisible;
+
+ void updateIndex();
+ void appendSubtrack(Track*);
+ TrackInfo* createTrackInfo();
+ int tlIndex(Track*) const;
+ int tlIndex(ArrangerTrack* t) const;
+ void initSubtrack(Track* t, ArrangerTrack*);
+ ArrangerTrack* atrack(int idx);
+ void insertTrack1(Track*);
+
+ private slots:
+ void startDrag(int idx);
+ void drag(int idx, int);
+ void setTLViewPos(int, int);
+ void appendSubtrack(TLWidget*);
+ void removeSubtrack(TLSWidget*);
+ void configTrackList();
+ void toggleTrackInfo(bool);
+ void toggleMixerStrip(bool);
+ void setGMute();
+ void setGSolo();
+ void setGar();
+ void setGaw();
+ void offGMute();
+ void offGSolo();
+ void offGar();
+ void offGaw();
+ void setSelectedTrack(Track*);
+ void moveTrack(Track* src, Track* dst);
+ void kbdMovementUpdate(Track* t, Part* p);
+ void mouseWheel(QWheelEvent*);
+ void setPos(int, const AL::Pos&);
+ void addMarker(const AL::Pos&);
+ void removeMarker(const AL::Pos&);
+
+ public slots:
+ void insertTrack(Track*);
+ void removeTrack(Track*);
+ void setTool(int t);
+ void updateConfiguration();
+ void startLoadSong();
+
+ signals:
+ void configChanged();
+ void editPart(Part*);
+ void cursorPos(const AL::Pos&,bool);
+
+ public:
+ Arranger(QMainWindow* parent = 0);
+ void readStatus(QDomNode);
+ void writeStatus(Xml&);
+ Track* curTrack() const { return _curTrack; }
+ void endLoadSong();
+ static int trackNameWidth;
+
+ protected:
+ virtual void keyPressEvent(QKeyEvent* e);
+ };
+
+#endif
+
diff --git a/muse/muse/arranger/canvas.cpp b/muse/muse/arranger/canvas.cpp
new file mode 100644
index 00000000..8dfbd9b5
--- /dev/null
+++ b/muse/muse/arranger/canvas.cpp
@@ -0,0 +1,1045 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: canvas.cpp,v 1.57 2006/03/24 21:41:16 a-lin Exp $
+//
+// (C) Copyright 2004-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "canvas.h"
+#include "al/sig.h"
+#include "gconfig.h"
+#include "song.h"
+#include "icons.h"
+#include "audio.h"
+#include "partdrag.h"
+#include "muse.h"
+#include "midictrl.h"
+#include "tlswidget.h"
+#include "part.h"
+#include "gui.h"
+
+static const int partLabelHeight = 13;
+static const int handleWidth = 5;
+
+enum { HIT_NOTHING, HIT_TRACK, HIT_PART, HIT_SUBTRACK };
+
+//---------------------------------------------------------
+// PartCanvas
+//---------------------------------------------------------
+
+PartCanvas::PartCanvas()
+ : TimeCanvas(TIME_CANVAS)
+ {
+ state = S_NORMAL;
+ _drawBackground = true;
+ lselected = -1;
+ starty = -1;
+ setMarkerList(song->marker());
+ }
+
+//---------------------------------------------------------
+// drawWavePart
+// y0 - start of track
+// th - track height
+// from - x pixel coordinate start drawing
+// to - x end drawing
+//
+// redraw area is QRect(from, y0, to-from, th)
+//---------------------------------------------------------
+
+void PartCanvas::drawWavePart(QPainter& p, Part* wp, int y0, int th, int from, int to)
+ {
+ int h = th/2;
+ int y = y0 + 1 + h;
+ int cc = th % 2 ? 0 : 1;
+
+ const Pos pos(pix2pos(from));
+ EventList* el = wp->events();
+ for (iEvent e = el->begin(); e != el->end(); ++e) {
+ Event event = e->second;
+ SndFileR f = event.sndFile();
+ if (f.isNull())
+ continue;
+ unsigned channels = f.channels();
+ if (channels == 0) {
+ printf("drawWavePart: channels==0! %s\n", f.finfo()->fileName().toLatin1().data());
+ continue;
+ }
+
+ int x1 = pos2pix(event.pos() + *wp);
+ int x2 = pos2pix(event.end() + *wp);
+ int w = x2 - x1;
+ if (w == 0)
+ continue;
+
+ int samples = event.lenFrame();
+ int xScale = (samples + w/2)/w;
+ int frame = pos.frame() - wp->frame() - e->second.pos().frame();
+
+ if (h < 20) {
+ //
+ // combine multi channels into one waveform
+ //
+ for (int i = from; i < to; i++) {
+ SampleV sa[channels];
+ f.read(sa, xScale, frame);
+ frame += xScale;
+ int peak = 0;
+ int rms = 0;
+ for (unsigned k = 0; k < channels; ++k) {
+ if (sa[k].peak > peak)
+ peak = sa[k].peak;
+ rms += sa[k].rms;
+ }
+ rms /= channels;
+ peak = (peak * (th-2)) >> 9;
+ rms = (rms * (th-2)) >> 9;
+ p.setPen(QColor(Qt::darkGray));
+ p.drawLine(i, y - peak - cc, i, y + peak);
+ p.setPen(QColor(Qt::black));
+ p.drawLine(i, y - rms - cc, i, y + rms);
+ }
+ }
+ else {
+ //
+ // multi channel display
+ //
+ h = th / (channels * 2);
+ int cc = th % (channels * 2) ? 0 : 1;
+ for (int i = from; i < to; i++) {
+ y = y0 + 1 + h;
+ SampleV sa[channels];
+ f.read(sa, xScale, frame);
+ frame += xScale;
+ for (unsigned k = 0; k < channels; ++k) {
+ // peak = (sa[k].peak * h) / 256;
+ int peak = (sa[k].peak * (h - 1)) >> 8;
+ int rms = (sa[k].rms * (h - 1)) >> 8;
+ p.setPen(QColor(Qt::darkGray));
+ p.drawLine(i, y - peak - cc, i, y + peak);
+ p.setPen(QColor(Qt::black));
+ p.drawLine(i, y - rms - cc, i, y + rms);
+ y += 2 * h;
+ }
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// paint
+//---------------------------------------------------------
+
+void PartCanvas::paint(QPainter& p, QRect r)
+ {
+// printf("canvas paint %d %d %d %d\n", r.x(), r.y(), r.width(), r.height());
+ QFont f = font();
+ f.setPointSize(8);
+ p.setFont(f);
+
+ int from = r.x();
+ int to = from + r.width();
+
+ TrackList* tl = song->tracks();
+ ArrangerTrack* at = 0;
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ Track* t = *i;
+ at = &(t->arrangerTrack);
+ if (at->tw == 0)
+ continue;
+
+ int y = at->tw->y() - splitWidth/2;
+ int h = at->tw->height() - 1;
+
+ PartList* pl = t->parts();
+// p.setRenderHint(QPainter::Antialiasing, true);
+ for (iPart ip = pl->begin(); ip != pl->end(); ++ip) {
+ Part* part = ip->second;
+ int x1 = pos2pix(*part);
+ int x2 = pos2pix(part->end());
+ int len = x2 - x1;
+
+ if (x2 <= from)
+ continue;
+ if (x1 > to)
+ break;
+
+ QRect pr(x1, y+1, len, h-4);
+
+ if (part->mute()) {
+ p.setPen(QPen(Qt::red, 2));
+ p.setBrush(Qt::gray);
+ }
+ else if (part->selected()) {
+ p.setPen(QPen(config.partColors[part->colorIndex()], 2));
+ p.setBrush(config.selectPartBg);
+ }
+ else {
+ bool clone = part->events()->arefCount() > 1;
+ p.setPen(QPen(Qt::black, 2, clone ? Qt::DashLine : Qt::SolidLine));
+ p.setBrush(config.partColors[part->colorIndex()]);
+ }
+
+ //
+ // we want to draw the rectangle without transformation
+ // to get equal border width horizontal and vertical
+ //
+ QRect rr(p.matrix().mapRect(pr).adjusted(1, 0, -1, 0));
+ p.save();
+ p.resetMatrix();
+ p.drawRect(rr);
+ p.restore();
+
+ int xx1 = x1;
+ if (xx1 < from)
+ xx1 = from;
+ int xx2 = x2;
+ if (xx2 > to)
+ xx2 = to;
+ if (t->isMidiTrack())
+ drawMidiPart(p, part, y, h, xx1, xx2);
+ else if (t->type() == Track::WAVE)
+ drawWavePart(p, part, y, h, xx1, xx2);
+ int yy = y + h - partLabelHeight;
+ p.drawText(x1 + 3, yy, len - 6,
+ partLabelHeight-1, Qt::AlignVCenter | Qt::AlignLeft,
+ part->name());
+ }
+ p.setPen(QPen(Qt::lightGray, 1, Qt::SolidLine));
+ if (i != tl->begin())
+ p.drawLine(from, y-2, to, y-2);
+ for (iArrangerTrack i = t->subtracks.begin(); i != t->subtracks.end(); ++i) {
+ at = *i;
+ if (at->tw == 0)
+ continue;
+ TLSWidget* tls = (TLSWidget*)(at->tw);
+ int y = tls->y();
+ p.setPen(QPen(Qt::lightGray, 1, Qt::SolidLine));
+ p.drawLine(from, y-2, to, y-2);
+ QPoint off(0, y);
+ p.translate(off);
+ tls->paint(p, r);
+ p.translate(-off);
+ }
+ }
+ if (at && at->tw) {
+ // draw last line
+ int y = at->tw->y() + at->tw->height() - 2;
+ p.setPen(QPen(Qt::lightGray, 1, Qt::SolidLine));
+ p.drawLine(from, y-2, to, y-2);
+ }
+ if (state == S_DRAG4 || state == S_DRAG1 || state == S_DRAG2 || state == S_DRAG5) {
+ p.setBrush(Qt::NoBrush);
+ p.setPen(QPen(QColor(Qt::red), 2));
+ p.drawRect(drag);
+ }
+ }
+
+//---------------------------------------------------------
+// drawMidiSubPart
+//---------------------------------------------------------
+
+void PartCanvas::drawMidiPart(QPainter& p, Part* mp, int y, int th, int from, int to)
+ {
+ p.setPen(Qt::black);
+
+ EventList* events = mp->events();
+ // iEvent ito(events->lower_bound(to));
+
+ iEvent ito(events->end());
+// int pos = pos2pix(*mp);
+
+ if (config.canvasShowPartType & 2) { // show events
+ for (iEvent i = events->lower_bound(from); i != ito; ++i) {
+ EventType type = i->second.type();
+ if (
+ ((config.canvasShowPartEvent & 1) && (type == Note))
+ || ((config.canvasShowPartEvent & 2) && (type == PAfter))
+ || ((config.canvasShowPartEvent & 4) && (type == Controller))
+ || ((config.canvasShowPartEvent &16) && (type == CAfter))
+ || ((config.canvasShowPartEvent &64) && (type == Sysex || type == Meta))
+ ) {
+ int t = pos2pix(*mp + i->second.pos());
+ p.drawLine(t, y + 1, t, y + th - 2);
+ }
+ }
+ }
+
+ else { // show Cakewalk Style
+ for (iEvent i = events->begin(); i != ito; ++i) {
+ if (i->second.type() != Note)
+ continue;
+ int x1 = pos2pix(*mp + i->second.pos());
+ int x2 = pos2pix(*mp + i->second.end());
+
+ if (x1 > to)
+ break;
+ if (x2 < from)
+ continue;
+
+ if (x2 > to) // clip to drawing area
+ x2 = to;
+ if (x1 < from)
+ x1 = from;
+ int pitch = i->second.pitch();
+ int yy = y + th - (pitch * th / 127);
+ p.drawLine(x1, yy, x2, yy);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// searchPart
+//---------------------------------------------------------
+
+int PartCanvas::searchPart(const QPoint& pp)
+ {
+ Pos tp(pix2pos(pp.x()));
+ QPoint p(tp.tick(), pp.y() + wpos.y());
+
+// printf("searchPart %d %d\n", p.x(), p.y());
+ track = 0;
+ part = 0;
+ at = 0;
+ int yp = p.y();
+ if (yp < 0)
+ return HIT_NOTHING;
+
+ TrackList* tl = song->tracks();
+ iTrack i;
+ int y1, y2;
+ for (i = tl->begin(); i != tl->end(); ++i) {
+ track = *i;
+ QWidget* tw = track->arrangerTrack.tw;
+ if (tw == 0) {
+ printf(" invisible Track\n");
+ continue;
+ }
+ y1 = tw->y();
+ y2 = y1 + tw->height();
+ if (yp >= y1 && yp < y2) {
+// printf(" track <%s> %d - %d\n", track->name().toLatin1().data(), y1, y2);
+ break;
+ }
+ for (iArrangerTrack i = track->subtracks.begin(); i != track->subtracks.end(); ++i) {
+ at = *i;
+ if (at->tw == 0) {
+ printf("----empty subtrack?\n");
+ break;
+ }
+ y1 = at->tw->y();
+ y2 = y1 + at->tw->height();
+ if (yp >= y1 && yp < y2) {
+ return HIT_SUBTRACK;
+ }
+ }
+ }
+ if (i == tl->end()) {
+ track = 0;
+ at = 0;
+ return HIT_NOTHING;
+ }
+
+ unsigned x = p.x();
+ PartList* pl = track->parts();
+ for (iPart ip = pl->begin(); ip != pl->end(); ++ip) {
+ part = ip->second;
+ if (x >= part->tick() && x < part->endTick()) {
+ ppos = mapx(part->tick());
+ psize = rmapx(part->lenTick());
+// printf(" part\n");
+ return HIT_PART;
+ }
+ }
+ part = 0;
+ return HIT_TRACK;
+ }
+
+//---------------------------------------------------------
+// contextMenu
+//---------------------------------------------------------
+
+void PartCanvas::contextMenu(const QPoint& pos)
+ {
+ QMenu* pop = new QMenu(widget());
+ QAction* a;
+ if (part) {
+ a = pop->addAction(*editcutIconSet, tr("C&ut"));
+ a->setData(4);
+ a->setShortcut(Qt::CTRL + Qt::Key_X);
+
+ a = pop->addAction(*editcopyIconSet, tr("&Copy"));
+ a->setData(5);
+ a->setShortcut(Qt::CTRL + Qt::Key_C);
+
+ pop->addSeparator();
+
+ a = pop->addAction(tr("rename"));
+ a->setData(0);
+
+ QMenu* cp = pop->addMenu(tr("color"));
+
+ // part color selection
+ for (int i = 0; i < NUM_PARTCOLORS; ++i) {
+ a = cp->addAction(partColorNames[i]);
+ a->setData(20 + i);
+ QPixmap pm(20, 20);
+ QPainter p(&pm);
+ p.fillRect(0, 0, 20, 20, config.partColors[i]);
+ a->setIcon(QIcon(pm));
+ }
+ a = pop->addAction(*deleteIcon, tr("delete"));
+ a->setData(1);
+ a = pop->addAction(*cutIcon, tr("split"));
+ a->setData(2);
+ a = pop->addAction(*glueIcon, tr("glue"));
+ a->setData(3);
+ a = pop->addAction(tr("de-clone"));
+ a->setData(15);
+ a->setEnabled(part->events()->arefCount() > 1);
+ if (track->type() == Track::MIDI) {
+ a = pop->addAction(tr("AutoFill..."));
+ a->setData(16);
+ }
+ pop->addSeparator();
+ if (track->type() == Track::MIDI) {
+ MidiTrack* track = (MidiTrack*)part->track();
+ MidiChannel* mc = track->channel();
+ if (mc && mc->useDrumMap()) {
+ a = pop->addAction(*edit_drummsIcon, tr("drums"));
+ a->setData(13);
+ }
+ else {
+ a = pop->addAction(*pianoIconSet, tr("pianoroll"));
+ a->setData(10);
+ }
+ a = pop->addAction(*edit_listIcon, tr("soundtracker"));
+ a = pop->addAction(*edit_listIcon, tr("list"));
+ a->setData(12);
+ }
+ else {
+ a = pop->addAction(*waveIcon, tr("wave edit"));
+ a->setData(14);
+ }
+
+ a = pop->exec(mapToGlobal(pos));
+ if (a) {
+ int n = a->data().toInt();
+ switch (n) {
+ case 0:
+ renamePart(part);
+ break;
+ case 1:
+ audio->msgRemovePart(part, true);
+ track->partListChanged();
+ break;
+ case 2:
+ splitPart(part, startDrag);
+ break;
+ case 3:
+ song->cmdGluePart(part);
+ break;
+ case 4:
+ cutPart(part);
+ break;
+ case 5:
+ copyPart(part);
+ break;
+ case 10: // pianoroll edit
+ emit startEditor(part, 0);
+ break;
+ case 12: // list edit
+ emit startEditor(part, 1);
+ break;
+ case 13: // drum edit
+ emit startEditor(part, 3);
+ break;
+ case 14:
+ emit startEditor(part, 4);
+ break;
+ case 15:
+ declonePart(part);
+ break;
+ case 16:
+ // auto fill: ask for loop length
+ {
+ bool ok;
+ int ticksM = AL::sigmap.ticksMeasure(part->tick());
+ int n = QInputDialog::getInteger(this,
+ tr("MusE: Get auto fill loop len"),
+ tr("Measures: "),
+ part->fillLen() / ticksM,
+ 0, 16, 1, &ok);
+ if (ok) {
+ part->setFillLen(n * ticksM);
+ }
+ }
+ break;
+ case 20 ... NUM_PARTCOLORS+20:
+ part->setColorIndex(n - 20);
+ widget()->update();
+ break;
+ case -1:
+ break;
+ default:
+ printf("unknown action %d\n", n);
+ break;
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < TOOLS; ++i) {
+ if ((arrangerTools & (1 << i))==0)
+ continue;
+ a = pop->addAction(**toolList[i].icon, tr(toolList[i].tip));
+ int id = 1 << i;
+ a->setData(id);
+ a->setCheckable(true);
+ if (id == (int)_tool)
+ a->setChecked(true);
+ }
+ a = pop->exec(mapToGlobal(pos));
+ if (a) {
+ int n = a->data().toInt();
+ muse->setTool(n);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void PartCanvas::mousePress(QMouseEvent* me)
+ {
+ QPoint pos(me->pos().x(), me->pos().y() - rulerHeight);
+ startDrag = pos;
+ int hit = searchPart(startDrag);
+
+ if (hit == HIT_SUBTRACK) {
+ TLSWidget* w = (TLSWidget*)(at->tw);
+ int y = pos.y() - w->y() + 2;
+ w->mousePress(QPoint(pos.x(), y), button);
+ state = S_SUBTRACK;
+ return;
+ }
+
+ if (button & Qt::RightButton) {
+ contextMenu(pos);
+ return;
+ }
+
+ QRect r1,r2;
+ QPoint pos2;
+ int xpos, y, len, h;
+
+ if (hit == HIT_PART) {
+ h = track->arrangerTrack.tw->height();
+ len = rmapx(part->lenTick());
+ y = track->arrangerTrack.tw->y() - splitWidth/2;
+ xpos = mapx(part->tick());
+
+ r1 = QRect(xpos, y, handleWidth, h);
+ r2 = QRect(xpos + len - handleWidth, y, handleWidth, h);
+ pos2 = QPoint(pos.x(), pos.y() + wpos.y());
+ }
+
+ switch (_tool) {
+ case PencilTool:
+ if (r1.contains(pos2))
+ state = S_START_DRAG1;
+ else if (r2.contains(pos2))
+ state = S_START_DRAG2;
+ else
+ state = S_START_DRAG5;
+ ppos = pos2pix(pix2pos(startDrag.x()).downSnaped(raster()));
+ psize = pos2pix(pix2pos(ppos+1).upSnaped(raster())) - ppos;
+ startDragTime = QTime::currentTime();
+ setCursor();
+ break;
+ case RubberTool:
+ if (part)
+ audio->msgRemovePart(part);
+ break;
+ case GlueTool:
+ if (part)
+ song->cmdGluePart(part);
+ break;
+ case CutTool:
+ if (part)
+ splitPart(part, pos);
+ break;
+ case MuteTool:
+ if (part) {
+ part->setMute(!part->mute());
+ widget()->update();
+ }
+ break;
+ default:
+ if (hit == HIT_PART) {
+ QRect r3(xpos, y, len, h);
+
+ if (r1.contains(pos2)) {
+ state = S_START_DRAG1;
+ }
+ else if (r2.contains(pos2)) {
+ state = S_START_DRAG2;
+ }
+ else if (r3.contains(pos2)) {
+ state = S_START_DRAG3;
+ bool add = keyState & Qt::ShiftModifier;
+ song->selectPart(part, add);
+ emit kbdMovementUpdate(track, part);
+ }
+ }
+ if (state == S_NORMAL) {
+ song->selectPart(0, false); // deselect all parts
+ emit kbdMovementUpdate(0, 0); // Tell arranger nothing is selected (Keyboard movement)
+ }
+ startDragTime = QTime::currentTime();
+ setCursor();
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// mouseMove
+//---------------------------------------------------------
+
+void PartCanvas::mouseMove(QPoint pos)
+ {
+ if (state == S_SUBTRACK) {
+ TLSWidget* w = (TLSWidget*)(at->tw);
+ int y = pos.y() - w->y() + 2 - rulerHeight;
+ w->mouseMove(QPoint(pos.x(), y));
+ return;
+ }
+ pos -= rCanvasA.topLeft();
+ bool update = false;
+ int x = pos.x();
+ int delta = startDrag.x() - x;
+ int t = startDragTime.msecsTo(QTime::currentTime());
+ bool dragActive = (startDrag - pos).manhattanLength() >
+ QApplication::startDragDistance()
+ || t > QApplication::startDragTime();
+ switch (state) {
+ case S_START_DRAG1:
+ if (dragActive)
+ state = S_DRAG1;
+ break;
+ case S_START_DRAG2:
+ if (dragActive)
+ state = S_DRAG2;
+ break;
+ case S_START_DRAG3:
+ if (dragActive)
+ state = S_DRAG3;
+ break;
+ case S_START_DRAG5:
+ if (dragActive)
+ state = S_DRAG5;
+ break;
+ case S_NORMAL:
+ {
+ searchPart(pos);
+ bool found = false;
+ if (part) {
+ int h = track->arrangerTrack.tw->height();
+ int xpos = mapx(part->tick());
+ int len = rmapx(part->lenTick());
+ int y = track->arrangerTrack.tw->y();
+ QRect r1(xpos, y, handleWidth, h);
+ QRect r2(xpos + len - handleWidth, y, handleWidth, h);
+ if (r1.contains(pos) || r2.contains(pos))
+ found = true;
+ }
+ if (found) {
+ widget()->setCursor(Qt::SizeHorCursor);
+ }
+ else
+ setCursor();
+ }
+ break;
+ default:
+ break;
+ }
+ if (!track)
+ return;
+ int y = track->arrangerTrack.tw->y() - splitWidth/2;
+ int h = track->arrangerTrack.tw->height();
+ if (state == S_DRAG1) {
+ //
+ // drag left edge of part
+ //
+ Pos p(pix2pos(ppos - delta));
+ p.snap(raster());
+ int x1 = pos2pix(p);
+ int x2 = pos2pix(part->end());
+ int size = x2 - x1;
+ drag.setRect(x1, y, size, h-1);
+ update = true;
+ }
+ else if (state == S_DRAG2) {
+ //
+ // drag right edge of part
+ //
+ int size = psize - delta;
+ if (size < 10)
+ size = 10;
+ int x2 = mapx(AL::sigmap.raster(part->tick() + rmapxDev(size), raster()));
+ drag.setRect(ppos, y, x2 - ppos, h-1);
+ update = true;
+ }
+ else if (state == S_DRAG5) {
+ //
+ // draw part with pencil tool
+ //
+ int size = psize - delta;
+ if (size < 10)
+ size = 10;
+ int x2 = mapx(AL::sigmap.raster(mapxDev(ppos + size), raster()));
+ drag.setRect(ppos, y, x2 - ppos, h-1);
+ update = true;
+ }
+ else if (state == S_DRAG3) {
+ //
+ // drag whole part
+ //
+ QDrag* d = 0;
+ if (track->type() == Track::MIDI)
+ d = new MidiPartDrag(part, this);
+ else if (track->type() == Track::WAVE)
+ d = new AudioPartDrag(part, this);
+ if (d) {
+ _dragOffset = startDrag.x() - rCanvasA.x() - ppos;
+ /* Qt::DropAction da =*/ d->start(Qt::CopyAction | Qt::LinkAction | Qt::MoveAction);
+ update = true;
+ }
+ state = S_NORMAL;
+ }
+ if (update)
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// mouseRelease
+//---------------------------------------------------------
+
+void PartCanvas::mouseRelease(QMouseEvent* me)
+ {
+ if (state == S_SUBTRACK) {
+ ((TLSWidget*)(at->tw))->mouseRelease();
+ state = S_NORMAL;
+ return;
+ }
+
+ QPoint pos(me->pos());
+ int x = pos.x();
+ int delta = startDrag.x() - x;
+
+ if (state == S_DRAG1) {
+ int val = mapxDev(ppos-delta);
+ int pos = AL::sigmap.raster(val, raster());
+ int size = part->tick() + part->lenTick() - pos;
+ emit partChanged(part, pos, size);
+ }
+ else if (state == S_DRAG2) {
+ int size = psize - delta;
+ int x1 = part->tick();
+ int x2 = AL::sigmap.raster(part->tick() + rmapxDev(size), raster());
+
+ int step = AL::sigmap.rasterStep(x1, raster());
+ if (x2 - x1 < step)
+ x2 = AL::sigmap.raster(x1 + step, raster());
+ emit partChanged(part, x1, x2-x1);
+ }
+ else if (state == S_DRAG5) {
+ if (track && (track->type() == Track::MIDI || track->type() == Track::WAVE)) {
+ Part* part = track->newPart();
+ Pos p1 = pix2pos(drag.x()).snaped(raster());
+ Pos p2 = pix2pos(drag.x() + drag.width()).snaped(raster());
+ part->setPos(p1);
+ part->setLenTick(p2.tick() - p1.tick());
+ song->addPart(part);
+ }
+ else
+ widget()->update();
+ }
+ state = S_NORMAL;
+ setCursor();
+ }
+
+//---------------------------------------------------------
+// mouseDoubleClickEvent
+//---------------------------------------------------------
+
+void PartCanvas::mouseDoubleClick(QMouseEvent* me)
+ {
+ QPoint pos(me->pos().x(), me->pos().y() - rulerHeight);
+ if (_tool != PointerTool) {
+//TD mousePress(pos);
+ return;
+ }
+ searchPart(pos);
+ bool shift = keyState & Qt::ShiftModifier;
+ if (part) {
+ if (button == Qt::LeftButton && shift) {
+#if 0 //TODO1
+ editPart = (NPart*)curItem;
+ QRect r = map(curItem->bbox());
+ if (lineEditor == 0) {
+ lineEditor = new QLineEdit(this);
+ lineEditor->setFrame(true);
+ }
+ editMode = true;
+ lineEditor->setGeometry(r);
+ lineEditor->setText(editPart->name());
+ lineEditor->setFocus();
+ lineEditor->show();
+#endif
+ }
+ else if (button == Qt::LeftButton) {
+ emit doubleClickPart(part);
+ }
+ }
+ //
+ // double click creates new part between left and
+ // right mark
+
+ else if (track && track->isMidiTrack())
+ emit createLRPart(track);
+ }
+
+//---------------------------------------------------------
+// setCursor
+//---------------------------------------------------------
+
+void PartCanvas::setCursor()
+ {
+ switch(state) {
+ case S_START_DRAG1:
+ case S_START_DRAG2:
+ case S_DRAG1:
+ case S_DRAG2:
+ widget()->setCursor(Qt::SizeHorCursor);
+ return;
+ default:
+ break;
+ }
+ TimeCanvas::setCursor();
+ }
+
+//---------------------------------------------------------
+// declonePart
+//---------------------------------------------------------
+
+void PartCanvas::declonePart(Part* spart)
+ {
+ Track* track = spart->track();
+ Part* dpart = track->newPart(spart, false);
+
+ EventList* se = spart->events();
+ EventList* de = dpart->events();
+ for (iEvent i = se->begin(); i != se->end(); ++i) {
+ Event oldEvent = i->second;
+ Event ev = oldEvent.clone();
+ de->add(ev);
+ }
+ audio->msgChangePart(spart, dpart, true);
+ track->partListChanged();
+ }
+
+//---------------------------------------------------------
+// splitPart
+//---------------------------------------------------------
+
+void PartCanvas::splitPart(Part* part, const QPoint& p)
+ {
+ song->cmdSplitPart(part, pix2pos(p.x()).snaped(raster()));
+ }
+
+//---------------------------------------------------------
+// renamePart
+//---------------------------------------------------------
+
+void PartCanvas::renamePart(Part*)
+ {
+ printf("rename part: not impl.\n");
+ }
+
+//---------------------------------------------------------
+// cutPart
+//---------------------------------------------------------
+
+void PartCanvas::cutPart(Part*)
+ {
+ printf("cut part: not impl.\n");
+ }
+
+//---------------------------------------------------------
+// copyPart
+//---------------------------------------------------------
+
+void PartCanvas::copyPart(Part*)
+ {
+ printf("copy part: not impl.\n");
+ }
+
+//---------------------------------------------------------
+// dragEnter
+//---------------------------------------------------------
+
+void PartCanvas::dragEnter(QDragEnterEvent* event)
+ {
+ if (MidiPartDrag::canDecode(event)
+ || AudioPartDrag::canDecode(event)
+ || WavUriDrag::canDecode(event))
+ event->acceptProposedAction();
+ }
+
+//---------------------------------------------------------
+// dragMoveEvent
+//---------------------------------------------------------
+
+void PartCanvas::dragMove(QDragMoveEvent* event)
+ {
+ Part* srcPart = 0;
+ QString filename;
+
+ if (MidiPartDrag::canDecode(event)) {
+ MidiPartDrag::decode(event, srcPart);
+ }
+ else if (AudioPartDrag::canDecode(event)) {
+ AudioPartDrag::decode(event, srcPart);
+ }
+ else if (WavUriDrag::canDecode(event)) {
+ WavUriDrag::decode(event, &filename);
+ }
+ else {
+ state = S_NORMAL;
+ event->ignore();
+ return;
+ }
+ Track* srcTrack = srcPart ? srcPart->track() : 0;
+
+ QPoint p(event->pos() - rCanvasA.topLeft());
+ searchPart(p);
+ if (!track) {
+ if (state != S_NORMAL) {
+ state = S_NORMAL;
+ widget()->update();
+ }
+ event->ignore();
+ return;
+ }
+ if (srcTrack == 0) { // drag uri
+ if (state != S_NORMAL) {
+ state = S_NORMAL;
+ widget()->update();
+ }
+ if (track->type() == Track::WAVE)
+ event->acceptProposedAction();
+ else
+ event->ignore();
+ return;
+ }
+ if (track->type() != srcTrack->type()) {
+ if (state != S_NORMAL) {
+ state = S_NORMAL;
+ widget()->update();
+ }
+ event->ignore();
+ return;
+ }
+ event->acceptProposedAction();
+ state = S_DRAG4;
+ ArrangerTrack* at = &(track->arrangerTrack);
+ int y = at->tw->y() - splitWidth/2;
+ int h = at->tw->height();
+
+ PartCanvas* cw = (PartCanvas*)event->source();
+ QRect updateRect(drag);
+
+ Pos pos(pix2pos(p.x() - cw->dragOffset()).snaped(raster()));
+ int x = pos2pix(pos);
+ drag.setRect(
+ x,
+ y,
+ rmapx(srcPart->lenTick()),
+ h - 1
+ );
+ updateRect |= drag;
+ updateRect.adjust(-1, -1 + rCanvasA.y(), 1, 1 + rCanvasA.y());
+ widget()->update(updateRect);
+ }
+
+//---------------------------------------------------------
+// dropEvent
+//---------------------------------------------------------
+
+void PartCanvas::drop(QDropEvent* event)
+ {
+ state = S_NORMAL;
+ Part* srcPart = 0;
+ QString filename;
+
+ if (MidiPartDrag::canDecode(event)) {
+ MidiPartDrag::decode(event, srcPart);
+ }
+ else if (AudioPartDrag::canDecode(event)) {
+ AudioPartDrag::decode(event, srcPart);
+ }
+ else if (WavUriDrag::canDecode(event)) {
+ WavUriDrag::decode(event, &filename);
+ printf("drop <%s>\n", filename.toLatin1().data());
+ }
+ else
+ return;
+
+ QPoint pos(event->pos() - rCanvasA.topLeft());
+ searchPart(pos);
+ Track* srcTrack = srcPart ? srcPart->track() : 0;
+ if (track == 0 || (srcTrack && (track->type() != srcTrack->type())))
+ return;
+
+ if (srcPart == 0) {
+ printf("TODO: drop wave file <%s>\n", filename.toLatin1().data());
+ //TODO
+ }
+ else {
+ PartCanvas* cw = (PartCanvas*)event->source();
+ unsigned tick = AL::sigmap.raster(mapxDev(pos.x() - cw->dragOffset()), raster());
+ if (srcPart->tick() != tick || srcTrack != track) {
+ Qt::KeyboardModifiers keyState = event->keyboardModifiers();
+
+ if (keyState & Qt::ShiftModifier) {
+ song->copyPart(srcPart, tick, track);
+ event->setDropAction(Qt::CopyAction);
+ }
+ else if (keyState & Qt::ControlModifier) {
+ song->linkPart(srcPart, tick, track);
+ event->setDropAction(Qt::LinkAction);
+ }
+ else {
+ song->movePart(srcPart, tick, track);
+ event->setDropAction(Qt::MoveAction);
+ }
+ }
+ }
+ event->acceptProposedAction();
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// dragLeave
+//---------------------------------------------------------
+
+void PartCanvas::dragLeave(QDragLeaveEvent*)
+ {
+ if (state == S_DRAG4) {
+ state = S_NORMAL;
+ widget()->update();
+ }
+ }
+
diff --git a/muse/muse/arranger/canvas.h b/muse/muse/arranger/canvas.h
new file mode 100644
index 00000000..3abe53f4
--- /dev/null
+++ b/muse/muse/arranger/canvas.h
@@ -0,0 +1,101 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: canvas.h,v 1.21 2006/01/23 17:41:21 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CANVAS_H__
+#define __CANVAS_H__
+
+#include "awl/tcanvas.h"
+#include "widgets/tools.h"
+
+class CanvasWidget;
+class Part;
+class Track;
+class ArrangerTrack;
+
+static const int HANDLE1 = 6;
+static const int HANDLE2 = 3;
+
+//---------------------------------------------------------
+// PartCanvas
+//---------------------------------------------------------
+
+class PartCanvas : public TimeCanvas {
+ Q_OBJECT
+
+ // DRAG1 drag part head
+ // DRAG2 drag part tail
+ // DRAG3 drag whole part
+ // DRAG4 Drag&Drop drag
+ // DRAG5 draw part with pencil tool
+
+ enum { S_NORMAL, S_START_DRAG1, S_START_DRAG2, S_START_DRAG3,
+ S_DRAG1, S_DRAG2, S_DRAG3,
+ S_DRAG4,
+ S_START_DRAG5, S_DRAG5, // draw new Part
+ S_SUBTRACK
+ };
+ int state;
+ QPoint startDrag;
+ int _dragOffset;
+ QRect drag;
+ QTime startDragTime;
+ unsigned ppos, psize;
+
+ // values set by searchPart():
+ Track* track;
+ Part* part;
+ ArrangerTrack* at;
+
+ bool _drawBackground;
+ int selected;
+ int lselected; // in local coordinates
+ int starty;
+ int dragy;
+
+ virtual void paint(QPainter&, QRect);
+ void drawWavePart(QPainter& p, Part* part, int, int, int, int);
+ void drawMidiPart(QPainter& p, Part* mp, int, int, int, int);
+ virtual void mousePress(QMouseEvent*);
+ virtual void mouseMove(QPoint);
+ virtual void mouseRelease(QMouseEvent*);
+ virtual void mouseDoubleClick(QMouseEvent*);
+
+ virtual void dragEnter(QDragEnterEvent*);
+ virtual void drop(QDropEvent*);
+ virtual void dragMove(QDragMoveEvent*);
+ virtual void dragLeave(QDragLeaveEvent*);
+
+ int searchPart(const QPoint& p);
+
+ void declonePart(Part* part);
+ void renamePart(Part*);
+ void splitPart(Part*, const QPoint&);
+ void cutPart(Part*);
+ void copyPart(Part*);
+
+ void setCursor();
+ int dragOffset() const { return _dragOffset; }
+ void drawHandle(QPainter& p, int x, int y) {
+ p.fillRect(x-HANDLE2, y-HANDLE2, HANDLE1, HANDLE1, x == lselected ? Qt::red : Qt::yellow);
+ }
+ void contextMenu(const QPoint&);
+
+ signals:
+ void kbdMovementUpdate(Track* t, Part* p);
+ void startEditor(Part*, int);
+ void createLRPart(Track*);
+ void partChanged(Part*, unsigned, unsigned);
+ void doubleClickPart(Part*);
+
+ public:
+ PartCanvas();
+ void setDrawBackground(bool val) { _drawBackground = val; }
+ };
+
+#endif
+
diff --git a/muse/muse/arranger/configtrack.cpp b/muse/muse/arranger/configtrack.cpp
new file mode 100644
index 00000000..8fee2af1
--- /dev/null
+++ b/muse/muse/arranger/configtrack.cpp
@@ -0,0 +1,255 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: configtrack.cpp,v 1.10 2005/11/05 11:05:24 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "configtrack.h"
+#include "trelement.h"
+#include "arranger.h"
+
+//---------------------------------------------------------
+// ConfigTrackList
+//---------------------------------------------------------
+
+ConfigTrackList::ConfigTrackList(QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ // does not work:
+ configuredList->setSelectionMode(QAbstractItemView::SingleSelection);
+ availableList->setSelectionMode(QAbstractItemView::SingleSelection);
+
+ up->setEnabled(false);
+ down->setEnabled(false);
+ addItem->setEnabled(false);
+ removeItem->setEnabled(false);
+ dirty = false;
+ curType = 0;
+ init();
+
+ connect(trackType, SIGNAL(activated(int)), SLOT(trackTypeChanged(int)));
+ connect(availableList, SIGNAL(itemSelectionChanged()), SLOT(availableSelected()));
+ connect(configuredList, SIGNAL(itemSelectionChanged()), SLOT(configuredSelected()));
+ connect(up, SIGNAL(clicked()), SLOT(upClicked()));
+ connect(down, SIGNAL(clicked()), SLOT(downClicked()));
+ connect(addItem, SIGNAL(clicked()), SLOT(addItemClicked()));
+ connect(removeItem, SIGNAL(clicked()), SLOT(removeItemClicked()));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void ConfigTrackList::init()
+ {
+ trackType->clear();
+ for (int tt = 0; tt < Track::TRACK_TYPES; ++tt) {
+ list[tt] = glist[tt];
+ trackType->addItem(Track::_clname[tt]);
+ }
+ trackTypeChanged(curType);
+ trackNameSize->setValue(Arranger::trackNameWidth);
+ }
+
+//---------------------------------------------------------
+// done
+//---------------------------------------------------------
+
+void ConfigTrackList::done(int code)
+ {
+ if (code) {
+ // OK pressed
+ if (dirty)
+ saveTrackType();
+ for (int tt = 0; tt < Track::TRACK_TYPES; ++tt)
+ glist[tt] = list[tt];
+ Arranger::trackNameWidth = trackNameSize->value();
+ emit trackConfigChanged();
+ }
+ else {
+ dirty = false;
+ init();
+ }
+ QDialog::done(code);
+ }
+
+//---------------------------------------------------------
+// saveTrackType
+//---------------------------------------------------------
+
+void ConfigTrackList::saveTrackType()
+ {
+ dirty = false;
+ list[curType].clear();
+ int gn = 0;
+ TrElementList group;
+ int n = configuredList->count();
+ for (int i = 0; i < n; ++i) {
+ QString s = configuredList->item(i)->text();
+ int k;
+ for (k = 0; k < nTrElements; ++k)
+ if (trElements[k].name == s)
+ break;
+ if (trElements[k].grp != gn) {
+ list[curType].push_back(group);
+ group.clear();
+ gn = trElements[k].grp;
+ }
+ group.push_back(&trElements[k]);
+ }
+ if (!group.empty())
+ list[curType].push_back(group);
+ }
+
+//---------------------------------------------------------
+// trackTypeChanged
+//---------------------------------------------------------
+
+void ConfigTrackList::trackTypeChanged(int type)
+ {
+ curType = type;
+ if (dirty)
+ saveTrackType();
+
+ configuredList->clear();
+ TrGroupList& gl = list[type];
+ for (iTrGroup i = gl.begin(); i != gl.end(); ++i) {
+ for (iTrElement k = i->begin(); k != i->end(); ++k)
+ configuredList->addItem((*k)->name);
+ }
+
+ availableList->clear();
+ for (int i = 0; i < nTrElements; ++i) {
+ QString name(trElements[i].name);
+ bool f = false;
+
+ // is gui element available for this track type?
+
+ for (int i = 0; i < nTrElements; ++i) {
+ const TrElement& el = trElements[i];
+ if (el.name == name) {
+ if (el.trackMask & (1 << type)) {
+ f = true;
+ break;
+ }
+ }
+ }
+ if (!f)
+ continue;
+
+ // is gui element already configured?
+
+ for (iTrGroup i = gl.begin(); i != gl.end(); ++i) {
+ for (iTrElement k = i->begin(); k != i->end(); ++k) {
+ if (name == (*k)->name) {
+ f = false;
+ break;
+ }
+ }
+ if (!f)
+ break;
+ }
+ if (f) {
+ availableList->addItem(name);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// configuredSelected
+//---------------------------------------------------------
+
+void ConfigTrackList::configuredSelected()
+ {
+ QListWidgetItem* item = configuredList->selectedItems().at(0);
+ up->setEnabled(item != 0);
+ down->setEnabled(item != 0);
+ removeItem->setEnabled(item != 0);
+ }
+
+//---------------------------------------------------------
+// availableSelected
+//---------------------------------------------------------
+
+void ConfigTrackList::availableSelected()
+ {
+ QListWidgetItem* item = availableList->selectedItems().at(0);
+ addItem->setEnabled(item != 0);
+ }
+
+//---------------------------------------------------------
+// upClicked
+//---------------------------------------------------------
+
+void ConfigTrackList::upClicked()
+ {
+ QListWidgetItem* item = configuredList->selectedItems().at(0);
+ int n = configuredList->row(item);
+ if (n <= 0)
+ return;
+ QString s = item->text();
+ delete item;
+ configuredList->insertItem(n-1, s);
+ configuredList->setItemSelected(configuredList->item(n-1), true);
+ dirty = true;
+ }
+
+//---------------------------------------------------------
+// downClicked
+//---------------------------------------------------------
+
+void ConfigTrackList::downClicked()
+ {
+ QListWidgetItem* item = configuredList->selectedItems().at(0);
+ int n = configuredList->row(item);
+ if (n >= int(configuredList->count()-1))
+ return;
+ QString s = item->text();
+
+ delete item;
+ configuredList->insertItem(n+1, s);
+ configuredList->setItemSelected(configuredList->item(n+1), true);
+ dirty = true;
+ }
+
+//---------------------------------------------------------
+// addItemClicked
+//---------------------------------------------------------
+
+void ConfigTrackList::addItemClicked()
+ {
+ QListWidgetItem* item = availableList->selectedItems().at(0);
+ if (item == 0)
+ return;
+ QString s = item->text();
+ delete item;
+ configuredList->addItem(s);
+ configuredList->setItemSelected(configuredList->item(configuredList->count()-1), true);
+ QListWidgetItem* ci = availableList->currentItem();
+ if (ci)
+ availableList->setItemSelected(ci, true);
+ dirty = true;
+ }
+
+//---------------------------------------------------------
+// removeItemClicked
+//---------------------------------------------------------
+
+void ConfigTrackList::removeItemClicked()
+ {
+ QListWidgetItem* item = configuredList->selectedItems().at(0);
+ if (item == 0)
+ return;
+ QString s = item->text();
+ delete item;
+ availableList->addItem(s);
+ availableList->setItemSelected(availableList->item(availableList->count()-1), true);
+ QListWidgetItem* ci = configuredList->item(configuredList->currentRow());
+ if (ci)
+ configuredList->setItemSelected(ci, true);
+ dirty = true;
+ }
+
diff --git a/muse/muse/arranger/configtrack.h b/muse/muse/arranger/configtrack.h
new file mode 100644
index 00000000..72579fb6
--- /dev/null
+++ b/muse/muse/arranger/configtrack.h
@@ -0,0 +1,49 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: configtrack.h,v 1.4 2005/11/02 18:02:10 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CONFIG_TRACK_H__
+#define __CONFIG_TRACK_H__
+
+#include "ui_configtrack.h"
+#include "track.h"
+#include "trelement.h"
+
+struct TrElement;
+class TrGroupList;
+
+//---------------------------------------------------------
+// ConfigTrackList
+//---------------------------------------------------------
+
+class ConfigTrackList : public QDialog, Ui::ConfigTrackListBase {
+ Q_OBJECT
+
+ TrGroupList list[Track::TRACK_TYPES];
+ void init();
+ bool dirty;
+ void saveTrackType();
+ int curType;
+
+ private slots:
+ void trackTypeChanged(int);
+ void availableSelected();
+ void configuredSelected();
+ void upClicked();
+ void downClicked();
+ void addItemClicked();
+ void removeItemClicked();
+ virtual void done(int);
+
+ signals:
+ void trackConfigChanged();
+
+ public:
+ ConfigTrackList(QWidget*);
+ };
+
+#endif
diff --git a/muse/muse/arranger/configtrack.ui b/muse/muse/arranger/configtrack.ui
new file mode 100644
index 00000000..cf52a995
--- /dev/null
+++ b/muse/muse/arranger/configtrack.ui
@@ -0,0 +1,313 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>ConfigTrackListBase</class>
+ <widget class="QDialog" name="ConfigTrackListBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>545</width>
+ <height>352</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Config Track List</string>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1" >
+ <property name="text" >
+ <string>Track Type:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="trackType" />
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel2" >
+ <property name="text" >
+ <string>Available Items:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="availableList" >
+ <property name="selectionBehavior" >
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="modelColumn" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="addItem" >
+ <property name="text" >
+ <string>Add</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="removeItem" >
+ <property name="text" >
+ <string>Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="up" >
+ <property name="text" >
+ <string>Up</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="down" >
+ <property name="text" >
+ <string>Down</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel3" >
+ <property name="text" >
+ <string>Configured Items</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="configuredList" >
+ <property name="selectionBehavior" >
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_2" >
+ <property name="text" >
+ <string>Track Name Size:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="trackNameSize" >
+ <property name="minimum" >
+ <number>40</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="ok" >
+ <property name="text" >
+ <string>&amp;OK</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancel" >
+ <property name="text" >
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>ok</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigTrackListBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>393</x>
+ <y>321</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>259</x>
+ <y>326</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancel</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigTrackListBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>484</x>
+ <y>327</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>437</x>
+ <y>283</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/arranger/miditrackinfo.h b/muse/muse/arranger/miditrackinfo.h
new file mode 100644
index 00000000..7f5e0775
--- /dev/null
+++ b/muse/muse/arranger/miditrackinfo.h
@@ -0,0 +1,34 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: miditrackinfo.h,v 1.2 2004/10/07 17:53:47 wschweer Exp $
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MIDITRACKINFO_H__
+#define __MIDITRACKINFO_H__
+
+
+#include "mtrackinfobase.h"
+
+class MidiTrack;
+
+//---------------------------------------------------------
+// MidiTrackInfo
+//---------------------------------------------------------
+
+class MidiTrackInfo : public MidiTrackInfoBase {
+ Q_OBJECT
+
+ MidiTrack* track;
+ int volume, pan, program;
+
+ private slots:
+ void programChanged();
+
+ public:
+ MidiTrackInfo(QWidget* parent);
+ void setTrack(MidiTrack* t) { track = t; }
+ };
+
+#endif
diff --git a/muse/muse/arranger/partdrag.cpp b/muse/muse/arranger/partdrag.cpp
new file mode 100644
index 00000000..c78fbdc4
--- /dev/null
+++ b/muse/muse/arranger/partdrag.cpp
@@ -0,0 +1,142 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: partdrag.cpp,v 1.5 2006/01/25 22:25:48 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "partdrag.h"
+
+class Part;
+
+const char MidiPartDrag::type[] = "application/muse/part/midi";
+const char AudioPartDrag::type[] = "application/muse/part/audio";
+const char WavUriDrag::type[] = "text/uri-list";
+
+//---------------------------------------------------------
+// MidiPartDrag
+// does only transfer reference to part, this does
+// not allow for transfers between different apps
+// TODO: transfer content (xml representation)
+//---------------------------------------------------------
+
+MidiPartDrag::MidiPartDrag(Part* part, QWidget* src)
+ : QDrag(src)
+ {
+ QByteArray a((const char*)&part, sizeof(part));
+ QMimeData* mimeData = new QMimeData;
+ mimeData->setData(type, a);
+ setMimeData(mimeData);
+ }
+
+//---------------------------------------------------------
+// canDecode
+//---------------------------------------------------------
+
+bool MidiPartDrag::canDecode(const QMimeSource* s)
+ {
+ return !strcmp(s->format(0), type);
+ }
+
+//---------------------------------------------------------
+// decode
+//---------------------------------------------------------
+
+bool MidiPartDrag::decode(const QMimeSource* s, Part*& p)
+ {
+ QByteArray a = s->encodedData(type);
+ char* cp = (char*)(&p);
+ for (unsigned i = 0; i < sizeof(p); ++i)
+ *cp++ = a[i];
+ return true;
+ }
+
+//---------------------------------------------------------
+// PartDrag
+// does only transfer reference to part, this does
+// not allow for transfers between different apps
+// TODO: transfer content (xml representation)
+//---------------------------------------------------------
+
+AudioPartDrag::AudioPartDrag(Part* part, QWidget* src)
+ : QDrag(src)
+ {
+ QByteArray a((char*)&part, sizeof(part));
+
+ QMimeData* mimeData = new QMimeData;
+ mimeData->setData(type, a);
+ setMimeData(mimeData);
+ }
+
+//---------------------------------------------------------
+// canDecode
+//---------------------------------------------------------
+
+bool AudioPartDrag::canDecode(const QMimeSource* s)
+ {
+ return !strcmp(s->format(0), type);
+ }
+
+//---------------------------------------------------------
+// decode
+//---------------------------------------------------------
+
+bool AudioPartDrag::decode(const QMimeSource* s, Part*& p)
+ {
+ QByteArray a = s->encodedData(type);
+ char* cp = (char*)(&p);
+ for (unsigned i = 0; i < sizeof(p); ++i)
+ *cp++ = a[i];
+ return true;
+ }
+
+//---------------------------------------------------------
+// WavUriDrag
+//---------------------------------------------------------
+
+WavUriDrag::WavUriDrag(const QString& s, QWidget* src)
+ : QDrag(src)
+ {
+ QByteArray a(s.toAscii());
+ QMimeData* mimeData = new QMimeData;
+ mimeData->setData(type, a);
+ setMimeData(mimeData);
+ }
+
+//---------------------------------------------------------
+// canDecode
+//---------------------------------------------------------
+
+bool WavUriDrag::canDecode(const QMimeSource* s)
+ {
+ if (strcmp(s->format(0), type))
+ return false;
+ QByteArray data = s->encodedData("text/uri-list");
+ QUrl url(data);
+ if (url.scheme() != "file")
+ return false;
+ QFileInfo fi(url.toLocalFile().trimmed());
+ if (!fi.exists()) {
+ printf("drag file <%s> does not exist\n", fi.filePath().toLatin1().data());
+ return false;
+ }
+ if (fi.suffix() != "wav") {
+ printf("drag file <%s> has no wav suffix\n", fi.filePath().toLatin1().data());
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// decode
+//---------------------------------------------------------
+
+bool WavUriDrag::decode(const QMimeSource* s, QString* uri)
+ {
+ QByteArray data = s->encodedData("text/uri-list");
+ QUrl url(data);
+ *uri = url.toLocalFile().trimmed();
+ return true;
+ }
+
diff --git a/muse/muse/arranger/partdrag.h b/muse/muse/arranger/partdrag.h
new file mode 100644
index 00000000..8eaecc07
--- /dev/null
+++ b/muse/muse/arranger/partdrag.h
@@ -0,0 +1,59 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: partdrag.h,v 1.3 2005/11/04 12:03:35 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __PARTDRAG_H__
+#define __PARTDRAG_H__
+
+class Part;
+
+//---------------------------------------------------------
+// MidiPartDrag
+//---------------------------------------------------------
+
+class MidiPartDrag : public QDrag {
+ static const char type[];
+ Q_OBJECT
+
+ public:
+ MidiPartDrag(Part*, QWidget* src);
+ static bool canDecode(const QMimeSource*);
+ static bool decode(const QMimeSource* s, Part*& p);
+ };
+
+//---------------------------------------------------------
+// AudioPartDrag
+//---------------------------------------------------------
+
+class AudioPartDrag : public QDrag {
+ static const char type[];
+ Q_OBJECT
+
+ public:
+ AudioPartDrag(Part*, QWidget* src);
+ static bool canDecode(const QMimeSource*);
+ static bool decode(const QMimeSource* s, Part*& p);
+ };
+
+//---------------------------------------------------------
+// WavUriDrag
+//---------------------------------------------------------
+
+class WavUriDrag : public QDrag {
+ static const char type[];
+ Q_OBJECT
+
+ public:
+ WavUriDrag(const QString&, QWidget* src);
+ static bool canDecode(const QMimeSource*);
+ static bool decode(const QMimeSource* s, QString* p);
+ };
+
+
+
+#endif
+
diff --git a/muse/muse/arranger/selectfilter.h b/muse/muse/arranger/selectfilter.h
new file mode 100644
index 00000000..ee448ce1
--- /dev/null
+++ b/muse/muse/arranger/selectfilter.h
@@ -0,0 +1,39 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: selectfilter.h,v 1.1 2005/01/24 14:32:34 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __SELECTFILTER_H__
+#define __SELECTFILTER_H__
+
+//---------------------------------------------------------
+// SelectFilter
+//---------------------------------------------------------
+
+class SelectFilter :public QObject
+ {
+ QWidget* w;
+ Track* t;
+
+ protected:
+ bool eventFilter(QObject*, QEvent* ev)
+ {
+ if (ev->type() == QEvent::MouseButtonPress) {
+ w->setFocus();
+ song->selectTrack(t);
+ }
+ return false;
+ }
+ public:
+ SelectFilter(QObject* parent, QWidget* widget, Track* track)
+ : QObject(parent) {
+ w = widget;
+ t = track;
+ }
+ };
+
+#endif
+
diff --git a/muse/muse/arranger/tllineedit.cpp b/muse/muse/arranger/tllineedit.cpp
new file mode 100644
index 00000000..4d5f9b4f
--- /dev/null
+++ b/muse/muse/arranger/tllineedit.cpp
@@ -0,0 +1,58 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tllineedit.cpp,v 1.8 2006/01/12 14:49:13 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "tllineedit.h"
+
+//---------------------------------------------------------
+// TLLineEdit
+//---------------------------------------------------------
+
+TLLineEdit::TLLineEdit(const QString& contents, QWidget* parent)
+ : QLineEdit(contents, parent)
+ {
+ setReadOnly(true);
+ setFrame(false);
+ setAlignment(Qt::AlignLeft);
+ setCursorPosition(0);
+ connect(this, SIGNAL(editingFinished()), SLOT(contentHasChanged()));
+ }
+
+//---------------------------------------------------------
+// contentHasChanged
+//---------------------------------------------------------
+
+void TLLineEdit::contentHasChanged()
+ {
+ setReadOnly(true);
+ setFrame(false);
+ if (isModified())
+ emit contentChanged(text());
+ setModified(false);
+ }
+
+//---------------------------------------------------------
+// mouseDoubleClickEvent
+//---------------------------------------------------------
+
+void TLLineEdit::mouseDoubleClickEvent(QMouseEvent*)
+ {
+ setReadOnly(false);
+ setFocus();
+ setFrame(true);
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void TLLineEdit::mousePressEvent(QMouseEvent* ev)
+ {
+ QLineEdit::mousePressEvent(ev);
+ emit mousePress();
+ }
+
diff --git a/muse/muse/arranger/tllineedit.h b/muse/muse/arranger/tllineedit.h
new file mode 100644
index 00000000..b0e5fb35
--- /dev/null
+++ b/muse/muse/arranger/tllineedit.h
@@ -0,0 +1,36 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tllineedit.h,v 1.3 2006/01/06 22:48:09 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TLLINEEDIT_H__
+#define __TLLINEEDIT_H__
+
+//---------------------------------------------------------
+// TLLineEdit
+//---------------------------------------------------------
+
+class TLLineEdit : public QLineEdit {
+ Q_OBJECT
+
+ virtual void mouseDoubleClickEvent(QMouseEvent*);
+ virtual void mousePressEvent(QMouseEvent*);
+
+ private slots:
+ void contentHasChanged();
+
+ signals:
+ void contentChanged(QString s);
+ void mousePress();
+
+ public:
+ TLLineEdit(const QString& contents, QWidget* parent = 0);
+ };
+
+#endif
+
+
+
diff --git a/muse/muse/arranger/tlswidget.cpp b/muse/muse/arranger/tlswidget.cpp
new file mode 100644
index 00000000..fa86e9e3
--- /dev/null
+++ b/muse/muse/arranger/tlswidget.cpp
@@ -0,0 +1,376 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tlswidget.cpp,v 1.33 2006/01/12 14:49:13 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "song.h"
+#include "track.h"
+#include "tlswidget.h"
+#include "tlwlayout.h"
+#include "icons.h"
+#include "arranger.h"
+#include "widgets/simplebutton.h"
+#include "muse.h"
+#include "midiport.h"
+#include "ctrl/configmidictrl.h"
+#include "midictrl.h"
+#include "widgets/utils.h"
+
+static Ctrl veloList(CTRL_VELOCITY, "velocity", Ctrl::DISCRETE, 0.0, 127.0); // dummy
+
+//---------------------------------------------------------
+// TLSLayout
+//---------------------------------------------------------
+
+class TLSLayout : public QLayout {
+ QList<QLayoutItem*> itemList;
+
+ public:
+ TLSLayout() {}
+ ~TLSLayout();
+
+ void addItem(QLayoutItem* item);
+ void insertWidget(int index, QWidget* item);
+ Qt::Orientations expandingDirections() const { return 0; }
+ bool hasHeightForWidth() const { return false; }
+ int count() const { return itemList.size(); }
+ void setGeometry(const QRect &rect);
+ QSize sizeHint() const { return ((QWidget*)parent())->size(); }
+ QLayoutItem *itemAt(int index) const { return itemList.value(index); }
+ QLayoutItem *takeAt(int idx) {
+ return idx >= 0 && idx < itemList.size() ? itemList.takeAt(idx) : 0;
+ }
+ };
+
+//---------------------------------------------------------
+// TLSLayout
+//---------------------------------------------------------
+
+TLSLayout::~TLSLayout()
+ {
+ QLayoutItem* child;
+ while ((child = takeAt(0)) != 0)
+ delete child;
+ }
+
+//---------------------------------------------------------
+// insertWidget
+//---------------------------------------------------------
+
+void TLSLayout::insertWidget(int index, QWidget* item)
+ {
+ if (item->parent() == 0)
+ item->setParent((QWidget*)parent());
+ itemList.insert(index, new QWidgetItem(item));
+ update();
+ }
+
+//---------------------------------------------------------
+// addItem
+//---------------------------------------------------------
+
+void TLSLayout::addItem(QLayoutItem* item)
+ {
+ itemList.append(item);
+ update();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void TLSLayout::setGeometry(const QRect& rect)
+ {
+ static const int labelWidth = 50;
+ int x1 = rect.x() + labelWidth;
+ int y = rect.y();
+ int y2 = y + rect.height();
+
+ QLayoutItem *item = itemList.at(0);
+ QSize size(item->sizeHint());
+ item->widget()->setGeometry(QRect(x1 - 18, y2 - 18-splitWidth, 18, 18));
+
+ item = itemList.at(1);
+ size = item->sizeHint();
+ item->setGeometry(QRect(x1, rect.y(), size.width(), trackRowHeight));
+ }
+
+//---------------------------------------------------------
+// TLSWidget
+//---------------------------------------------------------
+
+TLSWidget::TLSWidget(Track* t, ArrangerTrack* atrack, TimeCanvas* timeC)
+ {
+ setAttribute(Qt::WA_NoBackground);
+ setMouseTracking(true);
+ _tc = timeC;
+ state = S_NORMAL;
+
+ at = atrack;
+ _track = t;
+ _ctrlTrack = t;
+
+ TLSLayout* l = new TLSLayout;
+ setLayout(l);
+ //
+ // track type
+ //
+ SimpleButton* minus = newMinusButton(0);
+ minus->setToolTip(tr("Remove Subtrack"));
+ l->addWidget(minus);
+
+ ctrlList = new QToolButton;
+ ctrlList->setPopupMode(QToolButton::MenuButtonPopup);
+ ctrlMenu = new QMenu;
+ connect(ctrlMenu, SIGNAL(aboutToShow()), SLOT(showController()));
+ ctrlList->setMenu(ctrlMenu);
+
+ l->addWidget(ctrlList);
+ ctrlList->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+
+ updateController();
+ connect(ctrlMenu, SIGNAL(triggered(QAction*)), SLOT(selectController(QAction*)));
+ connect(_track, SIGNAL(clChanged()), SLOT(updateController()));
+ connect(_track, SIGNAL(selectionChanged(bool)), SLOT(selectionChanged()));
+ connect(_track, SIGNAL(controllerChanged(int)), SLOT(controllerListChanged(int)));
+ connect(_track, SIGNAL(autoReadChanged(bool)), SLOT(autoReadChanged()));
+ connect(muse, SIGNAL(configChanged()), SLOT(configChanged()));
+ connect(minus, SIGNAL(clicked()), SLOT(labelMinusClicked()));
+ configChanged();
+ }
+
+//---------------------------------------------------------
+// ctrl
+//---------------------------------------------------------
+
+Ctrl* TLSWidget::ctrl() const
+ {
+ return at->controller;
+ }
+
+//---------------------------------------------------------
+// height
+//---------------------------------------------------------
+
+int TLSWidget::cheight() const
+ {
+ return at->tw->height() - 4;
+ }
+
+//---------------------------------------------------------
+// selectionChanged
+//---------------------------------------------------------
+
+void TLSWidget::selectionChanged()
+ {
+// setFrameShadow(_track->selected() ? QFrame::Sunken : QFrame::Raised);
+ }
+
+//---------------------------------------------------------
+// configChanged
+//---------------------------------------------------------
+
+void TLSWidget::configChanged()
+ {
+ QColor c(_track->ccolor());
+ QPalette p(palette());
+ p.setColor(QPalette::Background, c.light(100));
+ setPalette(p);
+ }
+
+//---------------------------------------------------------
+// updateController
+//---------------------------------------------------------
+
+void TLSWidget::updateController()
+ {
+ }
+
+//---------------------------------------------------------
+// showController
+//---------------------------------------------------------
+
+void TLSWidget::showController()
+ {
+ populateControllerMenu(ctrlMenu);
+ }
+
+//---------------------------------------------------------
+// selectController
+//---------------------------------------------------------
+
+void TLSWidget::selectController(QAction* a)
+ {
+ selectController(a->data().toInt());
+ }
+
+//---------------------------------------------------------
+// selectController
+//---------------------------------------------------------
+
+void TLSWidget::selectController(int ctrl)
+ {
+ if (ctrl == CTRL_OTHER) { // "other"
+/*??*/ ConfigMidiCtrl* mce = new ConfigMidiCtrl((MidiTrack*)_track);
+ mce->exec();
+ updateController();
+ delete mce;
+ return;
+ }
+ if (_ctrlTrack && _ctrlTrack != _track) {
+ disconnect(_ctrlTrack, SIGNAL(clChanged()), this, SLOT(updateController()));
+ disconnect(_ctrlTrack, SIGNAL(controllerChanged(int)), this, SLOT(controllerListChanged(int)));
+ }
+ if (ctrl == CTRL_VELOCITY) {
+ at->controller = &veloList;
+ at->ctrl = CTRL_VELOCITY;
+ ctrlList->setText(tr("Velocity"));
+ _ctrlTrack = _track;
+ emit controllerChanged(at->ctrl);
+ }
+ else {
+ at->ctrl = ctrl;
+ at->controller = _track->getController(ctrl);
+ if (at->controller == 0 && _track->type() == Track::MIDI) {
+ MidiChannel* mc = ((MidiTrack*)_track)->channel();
+ at->controller = mc->getController(ctrl);
+ _ctrlTrack = mc;
+ connect(_ctrlTrack, SIGNAL(clChanged()), SLOT(updateController()));
+ connect(_ctrlTrack, SIGNAL(controllerChanged(int)), SLOT(controllerListChanged(int)));
+ }
+ else
+ _ctrlTrack = _track;
+ ctrlList->setText(at->controller->name());
+ emit controllerChanged(ctrl);
+ }
+ }
+
+//---------------------------------------------------------
+// setCtrl
+//---------------------------------------------------------
+
+void TLSWidget::setCtrl(int ctrl)
+ {
+ if (ctrl == CTRL_OTHER) {
+ QList<QAction*> actions = ctrlMenu->actions();
+ if (actions.isEmpty()) {
+ if (_track->type() == Track::MIDI) {
+ selectController(CTRL_VELOCITY);
+ return;
+ }
+ ControllerNameList* cn = _track->controllerNames();
+ if (!cn->empty())
+ selectController(cn->front().id);
+ delete cn;
+ return;
+ }
+ QAction* a = actions.at(0);
+ if (a)
+ selectController(a);
+ }
+ else {
+ selectController(ctrl);
+ }
+ }
+
+//---------------------------------------------------------
+// labelMinusClicked
+//---------------------------------------------------------
+
+void TLSWidget::labelMinusClicked()
+ {
+ emit minusClicked(this);
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void TLSWidget::mousePressEvent(QMouseEvent* ev)
+ {
+ if (ev->button() == Qt::RightButton) {
+ QMenu* menu = new QMenu(this);
+ QAction* a = menu->addAction(tr("Delete Controller"));
+ a->setData(0);
+ QAction* rv = menu->exec(ev->globalPos());
+ if (rv == 0)
+ return;
+ emit minusClicked(this);
+ return;
+ }
+ song->selectTrack(_track);
+
+ int y = ev->pos().y();
+ int wh = height();
+ starty = ev->globalPos().y();
+ if (y > (wh - splitWidth)) {
+ state = S_DRAGBOTTOM;
+ emit startDrag(trackIdx);
+ }
+ }
+
+//---------------------------------------------------------
+// mouseReleaseEvent
+//---------------------------------------------------------
+
+void TLSWidget::mouseReleaseEvent(QMouseEvent*)
+ {
+ state = S_NORMAL;
+ }
+
+//---------------------------------------------------------
+// mouseMoveEvent
+//---------------------------------------------------------
+
+void TLSWidget::mouseMoveEvent(QMouseEvent* ev)
+ {
+ QPoint pos(ev->pos());
+
+ if (state == S_DRAGTOP)
+ emit drag(trackIdx-1, ev->globalPos().y() - starty);
+ else if (state == S_DRAGBOTTOM)
+ emit drag(trackIdx, ev->globalPos().y() - starty);
+ else {
+ int y = pos.y();
+ int wh = height();
+ if (y > (wh - splitWidth))
+ setCursor(Qt::SizeVerCursor);
+ else
+ setCursor(Qt::ArrowCursor);
+ }
+ }
+
+//---------------------------------------------------------
+// controllerListChanged
+// controller list for controller id changed
+//---------------------------------------------------------
+
+void TLSWidget::controllerListChanged(int id)
+ {
+ if (ctrl()->id() == id)
+ tc()->widget()->update();
+ }
+
+//---------------------------------------------------------
+// autoReadChanged
+//---------------------------------------------------------
+
+void TLSWidget::autoReadChanged()
+ {
+ tc()->widget()->update();
+ }
+
+//---------------------------------------------------------
+// paintEvent
+//---------------------------------------------------------
+
+void TLSWidget::paintEvent(QPaintEvent* ev)
+ {
+ QPainter p(this);
+ QRect r(ev->rect());
+ p.fillRect(r, _track->ccolor());
+ paintHLine(p, r.x(), r.x() + r.width(), height() - splitWidth);
+ }
diff --git a/muse/muse/arranger/tlswidget.h b/muse/muse/arranger/tlswidget.h
new file mode 100644
index 00000000..f452a626
--- /dev/null
+++ b/muse/muse/arranger/tlswidget.h
@@ -0,0 +1,77 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tlswidget.h,v 1.11 2005/11/29 20:49:13 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TLSWIDGET_H__
+#define __TLSWIDGET_H__
+
+class Track;
+class SimpleButton;
+class ArrangerTrack;
+class CtrlEdit;
+class TimeCanvas;
+
+#include "ctrl/ctrleditor.h"
+
+//---------------------------------------------------------
+// TLSWidget
+//---------------------------------------------------------
+
+class TLSWidget : public QWidget, public CtrlEditor {
+ Q_OBJECT
+
+ enum { S_NORMAL, S_DRAGTOP, S_DRAGBOTTOM, S_DRAG };
+ int state;
+
+ int trackIdx;
+ int starty;
+ Track* _track; // editor canvas is associated to this track
+ Track* _ctrlTrack; // track were ctrl belongs to
+ TimeCanvas* _tc;
+ QToolButton* ctrlList;
+ QMenu* ctrlMenu;
+ QLineEdit* nameEdit;
+ ArrangerTrack* at;
+
+ TimeCanvas* tc() const { return _tc; }
+ Ctrl* ctrl() const;
+ int cheight() const;
+
+ virtual void paintEvent(QPaintEvent*);
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void mouseReleaseEvent(QMouseEvent*);
+ virtual void mouseMoveEvent(QMouseEvent*);
+
+ void selectController(int);
+
+ private slots:
+ void labelMinusClicked();
+ void updateController();
+ void showController();
+ void selectionChanged();
+ void configChanged();
+ void controllerListChanged(int);
+ void autoReadChanged();
+ void selectController(QAction*);
+
+ signals:
+ void minusClicked(TLSWidget*);
+ void controllerChanged(int);
+ void startDrag(int idx);
+ void drag(int idx, int);
+
+ public:
+ TLSWidget(Track*, ArrangerTrack*, TimeCanvas* tc);
+ Track* track() const { return _track; }
+ Track* ctrlTrack() const { return _ctrlTrack; }
+ void setCtrl(int ctrl);
+ void setIdx(int n) { trackIdx = n; }
+ };
+
+#endif
+
+
diff --git a/muse/muse/arranger/tlwidget.cpp b/muse/muse/arranger/tlwidget.cpp
new file mode 100644
index 00000000..a6bf14c7
--- /dev/null
+++ b/muse/muse/arranger/tlwidget.cpp
@@ -0,0 +1,621 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tlwidget.cpp,v 1.58 2006/02/03 16:46:38 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "song.h"
+#include "track.h"
+#include "tlwidget.h"
+#include "tlwlayout.h"
+#include "tllineedit.h"
+#include "icons.h"
+#include "arranger.h"
+#include "widgets/simplebutton.h"
+#include "muse.h"
+#include "trelement.h"
+#include "gconfig.h"
+#include "widgets/utils.h"
+#include "trackdrag.h"
+#include "midiport.h"
+#include "synth.h"
+#include "widgets/outportcombo.h"
+#include "audio.h"
+
+//---------------------------------------------------------
+// TLWidget
+//---------------------------------------------------------
+
+TLWidget::TLWidget(Track* t, TrGroupList* tgl)
+ {
+// setAttribute(Qt::WA_OpaquePaintEvent);
+ setAttribute(Qt::WA_NoSystemBackground);
+ setAttribute(Qt::WA_StaticContents);
+ setMouseTracking(true);
+
+ state = S_NORMAL;
+ off = 0;
+ tel = tgl;
+ _track = t;
+ outPort = 0;
+
+ bgColor = _track->ccolor();
+ selectBgColor = bgColor.light();
+
+ QPalette p(palette());
+ p.setColor(QPalette::Window, bgColor);
+ p.setColor(QPalette::Base, bgColor);
+ setPalette(p);
+
+ l = new TLWidgetLayout(this);
+ configChanged();
+
+ connect(_track, SIGNAL(selectionChanged(bool)), SLOT(selectionChanged()));
+ setAcceptDrops(true);
+ connect(muse, SIGNAL(configChanged()), SLOT(configChanged()));
+ }
+
+//---------------------------------------------------------
+// selectionChanged
+//---------------------------------------------------------
+
+void TLWidget::selectionChanged()
+ {
+ update();
+ }
+
+//---------------------------------------------------------
+// nameChanged
+//---------------------------------------------------------
+
+void TLWidget::nameChanged(QString s)
+ {
+ song->changeTrackName(_track, s);
+ nameEdit->setCursorPosition(0);
+ }
+
+//---------------------------------------------------------
+// selectTL
+//---------------------------------------------------------
+
+void TLWidget::select()
+ {
+ setFocus();
+ song->selectTrack(_track);
+ }
+
+//---------------------------------------------------------
+// labelPlusClicked
+//---------------------------------------------------------
+
+void TLWidget::labelPlusClicked()
+ {
+ emit plusClicked(this);
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void TLWidget::mousePressEvent(QMouseEvent* ev)
+ {
+ int button = ev->button();
+ if (button == Qt::RightButton) {
+ QMenu* menu = new QMenu(this);
+ QAction* a;
+ a = menu->addAction(QIcon(*deleteIcon), tr("Delete Track"));
+ a->setData(0);
+ if (_track->type() == Track::MIDI || _track->type() == Track::WAVE) {
+ a = menu->addAction(tr("Copy Track"));
+ a->setData(1);
+ }
+ if (_track->type() == Track::AUDIO_SOFTSYNTH) {
+ SynthI* s = (SynthI*) _track;
+ if (s->hasGui()) {
+ menu->addSeparator();
+ a = menu->addAction(tr("Show Gui"));
+ a->setData(2);
+ a->setCheckable(true);
+ a->setChecked(s->guiVisible());
+ }
+ }
+ else if (_track->type() == Track::MIDI_SYNTI) {
+ MidiSynti* s = (MidiSynti*) _track;
+ if (s->hasGui()) {
+ menu->addSeparator();
+ a = menu->addAction(tr("Show Gui"));
+ a->setData(3);
+ a->setCheckable(true);
+ a->setChecked(s->guiVisible());
+ }
+ }
+
+ a = menu->exec(ev->globalPos());
+ if (!a)
+ return;
+ int rv = a->data().toInt();
+ switch (rv) {
+ default:
+ break;
+ case 0:
+ song->removeTrack(_track);
+ break;
+ case 1:
+ {
+ int idx = song->tracks()->index(_track);
+ if (_track->type() == Track::MIDI) {
+ MidiTrack* t = new MidiTrack;
+ t->clone((MidiTrack*)_track);
+ song->insertTrack(t, idx);
+ }
+ else {
+ WaveTrack* t = new WaveTrack;
+ t->clone((WaveTrack*)_track);
+ song->insertTrack(t, idx);
+ }
+ }
+ break;
+ case 2:
+ {
+ SynthI* s = (SynthI*) _track;
+ s->showGui(!s->guiVisible());
+ }
+ break;
+ case 3:
+ {
+ MidiSynti* s = (MidiSynti*) _track;
+ s->showGui(!s->guiVisible());
+ }
+ break;
+ }
+ return;
+ }
+ int y = ev->pos().y();
+ int wh = height();
+ starty = ev->globalPos().y();
+ if (y > (wh - splitWidth)) {
+ state = S_DRAGBOTTOM;
+ emit startDrag(trackIdx);
+ }
+ else {
+ state = S_DRAG;
+ startDragPos = ev->pos();
+ startDragTime = QTime::currentTime();
+ select();
+ }
+ }
+
+//---------------------------------------------------------
+// mouseReleaseEvent
+//---------------------------------------------------------
+
+void TLWidget::mouseReleaseEvent(QMouseEvent*)
+ {
+ state = S_NORMAL;
+ }
+
+//---------------------------------------------------------
+// mouseMoveEvent
+//---------------------------------------------------------
+
+void TLWidget::mouseMoveEvent(QMouseEvent* ev)
+ {
+ QPoint pos(ev->pos());
+
+ if (state == S_DRAGBOTTOM)
+ emit drag(trackIdx, ev->globalPos().y() - starty);
+ else if (state == S_DRAG) {
+ int t = startDragTime.msecsTo(QTime::currentTime());
+ bool dragActive = (startDragPos - pos).manhattanLength() >
+ QApplication::startDragDistance()
+ || t > QApplication::startDragTime();
+ if (dragActive) {
+ QDrag* d = new TrackDrag(_track, this);
+ d->start(Qt::MoveAction);
+ state = S_NORMAL;
+ }
+ }
+ else {
+ int y = pos.y();
+ int wh = height();
+ if (y > (wh - splitWidth))
+ setCursor(Qt::SizeVerCursor);
+ else
+ setCursor(Qt::ArrowCursor);
+ }
+ }
+
+//---------------------------------------------------------
+// configChanged
+//---------------------------------------------------------
+
+void TLWidget::configChanged()
+ {
+ l->clear();
+ wlist.clear();
+ nameEdit = 0;
+ record = 0;
+ off = 0;
+ outChannel = 0;
+ outPort = 0;
+
+ label = new QLabel;
+ l->addWidget(label);
+ label->setIndent(3);
+
+ label->setFont(*config.fonts[1]);
+ label->setText(_track->cname());
+ label->setFixedHeight(11);
+
+ plus = newPlusButton(this);
+ l->addWidget(plus);
+ plus->setToolTip(tr("Add Subtrack"));
+ connect(plus, SIGNAL(clicked()), SLOT(labelPlusClicked()));
+
+ for (iTrGroup i = tel->begin(); i != tel->end(); ++i) {
+ TrElementList& el = *i;
+ iTrElement k;
+ for (k = el.begin(); k != el.end(); ++k) {
+ int id = (*k)->id;
+ switch(id) {
+ case TR_NAME:
+ nameEdit = new TLLineEdit(_track->name(), this);
+ nameEdit->setBackgroundRole(QPalette::Window);
+ nameEdit->setFixedHeight(trackRowHeight);
+ connect(nameEdit, SIGNAL(contentChanged(QString)), SLOT(nameChanged(QString)));
+ connect(nameEdit, SIGNAL(mousePress()), SLOT(select()));
+ connect(_track, SIGNAL(nameChanged(const QString&)), nameEdit, SLOT(setText(const QString&)));
+ nameEdit->setToolTip(_track->clname() + " Name");
+ l->addWidget(nameEdit);
+ wlist.push_back(nameEdit);
+ break;
+
+ case TR_INSTRUMENT:
+ {
+ instrument = new QComboBox(this);
+ instrument->setFixedHeight(trackRowHeight);
+ MidiOutPort* op = (MidiOutPort*)_track;
+ MidiInstrument* mi = op->instrument();
+ int idx = 0;
+ int curIdx = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ instrument->addItem((*i)->iname());
+ if ((*i)->iname() == mi->iname())
+ curIdx = idx;
+ }
+ instrument->setCurrentIndex(curIdx);
+ connect(instrument, SIGNAL(activated(int)), SLOT(instrumentSelected(int)));
+ connect(op, SIGNAL(instrumentChanged()), SLOT(instrumentChanged()));
+ l->addWidget(instrument);
+ wlist.push_back(instrument);
+ }
+ break;
+
+ case TR_PATCH:
+ {
+ // Ctrl* ctrl = _track->getController(CTRL_PROGRAM);
+ }
+ break;
+
+ case TR_OFF:
+ {
+ off = newOffButton(this);
+ off->setFixedSize(trackRowHeight, trackRowHeight);
+ off->setChecked(_track->off());
+ off->setAutoFillBackground(true);
+ connect(off, SIGNAL(clicked(bool)), SLOT(offToggled(bool)));
+ connect(_track, SIGNAL(offChanged(bool)), this, SLOT(updateOffState()));
+ l->addWidget(off);
+ wlist.push_back(off);
+ }
+ break;
+
+ case TR_DRUMMAP:
+ {
+ SimpleButton* dm = newDrumMapButton(this);
+ MidiChannel* mt = (MidiChannel*)_track;
+ dm->setFixedSize(trackRowHeight, trackRowHeight);
+ dm->setChecked(mt->useDrumMap());
+ connect(dm, SIGNAL(clicked(bool)), SLOT(drumMapToggled(bool)));
+ connect(mt, SIGNAL(useDrumMapChanged(bool)), dm, SLOT(setChecked(bool)));
+ l->addWidget(dm);
+ wlist.push_back(dm);
+ }
+ break;
+
+ case TR_MUTE:
+ {
+ SimpleButton* mute = newMuteButton(this);
+ mute->setFixedSize(trackRowHeight, trackRowHeight);
+ mute->setChecked(_track->isMute());
+ connect(mute, SIGNAL(clicked(bool)), SLOT(muteToggled(bool)));
+ connect(_track, SIGNAL(muteChanged(bool)), mute, SLOT(setChecked(bool)));
+ l->addWidget(mute);
+ wlist.push_back(mute);
+ }
+ break;
+
+ case TR_SOLO:
+ {
+ SimpleButton* solo = newSoloButton(this);
+ solo->setFixedSize(trackRowHeight, trackRowHeight);
+ solo->setChecked(_track->solo());
+ connect(solo, SIGNAL(clicked(bool)), SLOT(soloToggled(bool)));
+ connect(_track, SIGNAL(soloChanged(bool)), solo, SLOT(setChecked(bool)));
+ l->addWidget(solo);
+ wlist.push_back(solo);
+ }
+ break;
+
+ case TR_MONITOR:
+ {
+ SimpleButton* monitor = newMonitorButton(this);
+ monitor->setFixedSize(trackRowHeight+4, trackRowHeight);
+ monitor->setChecked(_track->monitor());
+ connect(monitor, SIGNAL(clicked(bool)), SLOT(monitorToggled(bool)));
+ connect(_track, SIGNAL(monitorChanged(bool)), monitor, SLOT(setChecked(bool)));
+ l->addWidget(monitor);
+ wlist.push_back(monitor);
+ }
+ break;
+
+ case TR_RECORD:
+ {
+ record = newRecordButton(this);
+ record->setFixedSize(trackRowHeight, trackRowHeight);
+ record->setChecked(_track->recordFlag());
+ record->setAutoFillBackground(true);
+ connect(record, SIGNAL(clicked(bool)), SLOT(recordToggled(bool)));
+ connect(_track, SIGNAL(recordChanged(bool)), record, SLOT(setChecked(bool)));
+ l->addWidget(record);
+ wlist.push_back(record);
+ }
+ break;
+
+ case TR_AREAD:
+ {
+ SimpleButton* b = newAutoReadButton(this);
+ b->setFixedSize(trackRowHeight, trackRowHeight);
+ b->setChecked(_track->autoRead());
+ connect(b, SIGNAL(clicked(bool)), SLOT(autoReadToggled(bool)));
+ connect(_track, SIGNAL(autoReadChanged(bool)), b, SLOT(setChecked(bool)));
+ l->addWidget(b);
+ wlist.push_back(b);
+ }
+ break;
+
+ case TR_AWRITE:
+ {
+ SimpleButton* b = newAutoWriteButton(this);
+ b->setFixedSize(trackRowHeight, trackRowHeight);
+ b->setChecked(_track->autoWrite());
+ connect(b, SIGNAL(clicked(bool)), SLOT(autoWriteToggled(bool)));
+ connect(_track, SIGNAL(autoWriteChanged(bool)), b, SLOT(setChecked(bool)));
+ l->addWidget(b);
+ wlist.push_back(b);
+ }
+ break;
+
+ case TR_OCHANNEL:
+ {
+ outChannel = new QSpinBox(this);
+ outChannel->setFixedSize(45, trackRowHeight);
+ outChannel->setRange(1, 16);
+ MidiChannel* midiChannel = ((MidiTrack*)_track)->channel();
+ if (midiChannel)
+ outChannel->setValue(midiChannel->channelNo()+1);
+ outChannel->setToolTip(tr("Midi Output Channel"));
+ l->addWidget(outChannel);
+ wlist.push_back(outChannel);
+ connect(outChannel, SIGNAL(valueChanged(int)), SLOT(outChannelChanged(int)));
+//TD connect((MidiTrack*)_track, SIGNAL(outChannelChanged(int)), SLOT(setOutChannel(int)));
+ }
+ break;
+
+ default:
+ printf("TLWidget:: unknown element %d\n", id);
+ break;
+ }
+ }
+ }
+ updateOffState();
+ selectionChanged(); // update selection state
+ l->update();
+ }
+
+//---------------------------------------------------------
+// recordToggled
+//---------------------------------------------------------
+
+void TLWidget::recordToggled(bool val)
+ {
+ song->setRecordFlag(_track, !val);
+ }
+
+//---------------------------------------------------------
+// muteToggled
+//---------------------------------------------------------
+
+void TLWidget::muteToggled(bool val)
+ {
+ song->setMute(_track, val);
+ }
+
+//---------------------------------------------------------
+// monitorToggled
+//---------------------------------------------------------
+
+void TLWidget::monitorToggled(bool val)
+ {
+ _track->setMonitor(val);
+ }
+
+//---------------------------------------------------------
+// drumMapToggled
+//---------------------------------------------------------
+
+void TLWidget::drumMapToggled(bool val)
+ {
+ ((MidiChannel*)_track)->setUseDrumMap(val);
+ }
+
+//---------------------------------------------------------
+// offToggled
+//---------------------------------------------------------
+
+void TLWidget::offToggled(bool val)
+ {
+ song->setOff(_track, !val);
+ }
+
+//---------------------------------------------------------
+// soloToggled
+//---------------------------------------------------------
+
+void TLWidget::soloToggled(bool val)
+ {
+ song->setSolo(_track, val);
+ }
+
+//---------------------------------------------------------
+// autoReadToggled
+//---------------------------------------------------------
+
+void TLWidget::autoReadToggled(bool val)
+ {
+ song->setAutoRead(_track, val);
+ }
+
+//---------------------------------------------------------
+// autoWriteToggled
+//---------------------------------------------------------
+
+void TLWidget::autoWriteToggled(bool val)
+ {
+ song->setAutoWrite(_track, val);
+ }
+
+//---------------------------------------------------------
+// setOutPort
+//---------------------------------------------------------
+
+void TLWidget::setOutPort(int n)
+ {
+ outPort->setCurrentIndex(n);
+ }
+
+//---------------------------------------------------------
+// outChannelChanged
+//---------------------------------------------------------
+
+void TLWidget::outChannelChanged(int n)
+ {
+ n -= 1;
+ MidiChannel* mc = ((MidiTrack*)_track)->channel();
+ if (mc == 0) // no route to port?
+ return;
+ MidiOutPort* mp = mc->port();
+ int id = mc->channelNo();
+ if (id == n)
+ return;
+ audio->msgRemoveRoute(Route(_track, -1, Route::TRACK), Route(mc,-1, Route::TRACK));
+ audio->msgAddRoute(Route(_track, -1, Route::TRACK), Route(mp->channel(n),-1, Route::TRACK));
+ song->update(SC_ROUTE);
+ }
+
+//---------------------------------------------------------
+// setOutChannel
+//---------------------------------------------------------
+
+void TLWidget::setOutChannel(int)
+ {
+//TODO3 outChannel->setValue(n + 1);
+ }
+
+//---------------------------------------------------------
+// dragEnterEvent
+//---------------------------------------------------------
+
+void TLWidget::dragEnterEvent(QDragEnterEvent* event)
+ {
+ if (TrackDrag::canDecode(event))
+ event->acceptProposedAction();
+ }
+
+//---------------------------------------------------------
+// dropEvent
+//---------------------------------------------------------
+
+void TLWidget::dropEvent(QDropEvent* event)
+ {
+ Track* t;
+ TrackDrag::decode(event, t);
+ if (_track != t)
+ emit moveTrack(t, _track);
+ event->acceptProposedAction();
+ }
+
+//---------------------------------------------------------
+// updateOffState
+//---------------------------------------------------------
+
+void TLWidget::updateOffState()
+ {
+ bool val = !_track->off();
+ std::vector<QWidget*>::iterator i = wlist.begin();
+ for (; i != wlist.end(); ++i) {
+ if ((*i) != off)
+ (*i)->setEnabled(val);
+ }
+ if (off)
+ off->setChecked(!val);
+ }
+
+//---------------------------------------------------------
+// instrumentSelected
+//---------------------------------------------------------
+
+void TLWidget::instrumentSelected(int n)
+ {
+ MidiOutPort* op = (MidiOutPort*)_track;
+ int idx = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ if (idx == n) {
+ op->setInstrument(*i);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// instrumentChanged
+//---------------------------------------------------------
+
+void TLWidget::instrumentChanged()
+ {
+ MidiOutPort* op = (MidiOutPort*)_track;
+ MidiInstrument* mi = op->instrument();
+ int idx = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ if (*i == mi) {
+ instrument->setCurrentIndex(idx);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// paintEvent
+//---------------------------------------------------------
+
+void TLWidget::paintEvent(QPaintEvent* ev)
+ {
+ QPainter p(this);
+ QRect r(ev->rect());
+ QColor color(_track->selected() ? selectBgColor : bgColor);
+ p.fillRect(r, color);
+ paintHLine(p, r.x(), r.x() + r.width(), height() - splitWidth);
+ }
+
diff --git a/muse/muse/arranger/tlwidget.h b/muse/muse/arranger/tlwidget.h
new file mode 100644
index 00000000..5050f21c
--- /dev/null
+++ b/muse/muse/arranger/tlwidget.h
@@ -0,0 +1,93 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tlwidget.h,v 1.21 2006/02/03 16:46:38 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TLWIDGET_H__
+#define __TLWIDGET_H__
+
+class Track;
+class TrGroupList;
+class TLWidgetLayout;
+class SimpleButton;
+
+//---------------------------------------------------------
+// TLWidget
+//---------------------------------------------------------
+
+class TLWidget : public QWidget {
+ Q_OBJECT
+
+ enum { S_NORMAL, S_DRAGBOTTOM, S_DRAG };
+ int state;
+
+ int trackIdx;
+ int starty;
+ Track* _track;
+ QColor bgColor;
+ QColor selectBgColor;
+
+ QLineEdit* nameEdit;
+ TLWidgetLayout* l;
+ TrGroupList* tel;
+ QSpinBox* outChannel;
+ QComboBox* outPort;
+ SimpleButton* off;
+ SimpleButton* plus;
+ SimpleButton* record;
+ std::vector<QWidget*> wlist;
+ QComboBox* instrument;
+ QLabel* label;
+
+ QTime startDragTime;
+ QPoint startDragPos;
+
+ virtual void paintEvent(QPaintEvent*);
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void mouseReleaseEvent(QMouseEvent*);
+ virtual void mouseMoveEvent(QMouseEvent*);
+ virtual void dragEnterEvent(QDragEnterEvent*);
+ virtual void dropEvent(QDropEvent*);
+
+ signals:
+ void startDrag(int idx);
+ void drag(int idx, int);
+
+ private slots:
+ void nameChanged(QString);
+ void labelPlusClicked();
+ void configChanged();
+ void recordToggled(bool);
+ void muteToggled(bool);
+ void offToggled(bool);
+ void soloToggled(bool);
+ void monitorToggled(bool);
+ void drumMapToggled(bool);
+ void selectionChanged();
+ void outChannelChanged(int);
+ void setOutChannel(int);
+ void setOutPort(int);
+ void autoReadToggled(bool val);
+ void autoWriteToggled(bool val);
+ void instrumentSelected(int);
+ void instrumentChanged();
+ void updateOffState();
+
+ public slots:
+ void select();
+
+ signals:
+ void plusClicked(TLWidget*);
+ void moveTrack(Track* src, Track* dst);
+
+ public:
+ TLWidget(Track* t, TrGroupList*);
+ Track* track() const { return _track; }
+ void setIdx(int n) { trackIdx = n; }
+ };
+
+#endif
+
diff --git a/muse/muse/arranger/tlwlayout.cpp b/muse/muse/arranger/tlwlayout.cpp
new file mode 100644
index 00000000..ba1cd5a8
--- /dev/null
+++ b/muse/muse/arranger/tlwlayout.cpp
@@ -0,0 +1,123 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tlwlayout.cpp,v 1.21 2006/01/12 14:49:13 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "tlwlayout.h"
+#include "arranger.h"
+#include "gui.h"
+
+//---------------------------------------------------------
+// TLWidgetLayout
+//---------------------------------------------------------
+
+TLWidgetLayout::TLWidgetLayout(QWidget *parent)
+ : QLayout(parent)
+ {
+ setMargin(0);
+ setSpacing(0);
+ }
+
+TLWidgetLayout::TLWidgetLayout()
+ {
+ setMargin(0);
+ setSpacing(0);
+ }
+
+//---------------------------------------------------------
+// takeAt
+//---------------------------------------------------------
+
+QLayoutItem *TLWidgetLayout::takeAt(int index)
+ {
+ if (index >= 0 && index < itemList.size())
+ return itemList.takeAt(index);
+ else
+ return 0;
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void TLWidgetLayout::setGeometry(const QRect &rect)
+ {
+// printf("TLWidgetLayout::setGeometry\n");
+ int n = itemList.size();
+ if (n < 2)
+ return;
+
+ static const int labelWidth = 50;
+ int x1 = rect.x() + labelWidth;
+ int x2 = rect.x() + rect.width();
+ int y = rect.y() + 1;
+ int y2 = y + rect.height() - splitWidth;
+ int dh = trackRowHeight;
+
+ QLayoutItem* item = itemList.at(0);
+ QSize size(item->sizeHint());
+ item->setGeometry(QRect(rect.x(), rect.y(), size.width(), size.height()));
+
+ item = itemList.at(1);
+// size = item->sizeHint();
+ item->setGeometry(QRect(x1 - 18, y2 - 19, 18, 18));
+
+ int x = x1;
+ for (int i = 2; i < n; ++i) {
+ QLayoutItem *item = itemList.at(i);
+ QSize size(item->sizeHint());
+
+ if ((x > x1) && ((x + size.width()) > x2)) {
+ x = x1;
+ y += dh;
+ if ((y + size.height()) > y2) {
+ for (; i < n; ++i)
+ itemList.at(i)->setGeometry(QRect(-1000, -1000, 0, 0));
+ return;
+ }
+ }
+ item->setGeometry(QRect(x, y, size.width(), dh));
+ x += size.width();
+ }
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize TLWidgetLayout::sizeHint() const
+ {
+ return minimumSize();
+ }
+
+//---------------------------------------------------------
+// minimumSize
+//---------------------------------------------------------
+
+QSize TLWidgetLayout::minimumSize() const
+ {
+ QSize size;
+ QLayoutItem *item;
+ foreach (item, itemList)
+ size = size.expandedTo(item->minimumSize());
+
+ size += QSize(2*margin(), 2*margin());
+ return size;
+ }
+
+//---------------------------------------------------------
+// clear
+//---------------------------------------------------------
+
+void TLWidgetLayout::clear()
+ {
+ QLayoutItem* child;
+ while ((child = takeAt(0)) != 0) {
+ delete child->widget();
+ delete child;
+ }
+ }
+
diff --git a/muse/muse/arranger/tlwlayout.h b/muse/muse/arranger/tlwlayout.h
new file mode 100644
index 00000000..664ba449
--- /dev/null
+++ b/muse/muse/arranger/tlwlayout.h
@@ -0,0 +1,39 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tlwlayout.h,v 1.4 2005/11/01 10:00:29 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TLWLAYOUT_H__
+#define __TLWLAYOUT_H__
+
+//---------------------------------------------------------
+// TLWidgetLayout
+//---------------------------------------------------------
+
+class TLWidgetLayout : public QLayout {
+ QList<QLayoutItem*> itemList;
+
+ int doLayout(const QRect& rect, bool testOnly) const;
+
+ public:
+ TLWidgetLayout(QWidget* parent);
+ TLWidgetLayout();
+ ~TLWidgetLayout() { clear(); }
+
+ void addItem(QLayoutItem* item) { itemList.append(item); }
+ Qt::Orientations expandingDirections() const { return 0; }
+ bool hasHeightForWidth() const { return false; }
+ int count() const { return itemList.size(); }
+ QSize minimumSize() const;
+ void setGeometry(const QRect &rect);
+ QSize sizeHint() const;
+ QLayoutItem *itemAt(int index) const { return itemList.value(index); }
+ QLayoutItem *takeAt(int index);
+ void clear();
+ };
+
+#endif
+
diff --git a/muse/muse/arranger/trackdrag.cpp b/muse/muse/arranger/trackdrag.cpp
new file mode 100644
index 00000000..34da92a6
--- /dev/null
+++ b/muse/muse/arranger/trackdrag.cpp
@@ -0,0 +1,49 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: trackdrag.cpp,v 1.6 2005/11/09 09:03:51 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "trackdrag.h"
+
+class Track;
+const char TrackDrag::type[] = "application/muse/track";
+
+//---------------------------------------------------------
+// TrackDrag
+//---------------------------------------------------------
+
+TrackDrag::TrackDrag(Track* track, QWidget* src)
+ : QDrag(src)
+ {
+ QByteArray a((char*)&track, sizeof(track));
+ QMimeData* mimeData = new QMimeData;
+ mimeData->setData(type, a);
+ setMimeData(mimeData);
+ }
+
+//---------------------------------------------------------
+// canDecode
+//---------------------------------------------------------
+
+bool TrackDrag::canDecode(const QMimeSource* s)
+ {
+ return !strcmp(s->format(0), type);
+ }
+
+//---------------------------------------------------------
+// decode
+//---------------------------------------------------------
+
+bool TrackDrag::decode(const QMimeSource* s, Track*& p)
+ {
+ QByteArray a = s->encodedData(type);
+ p = (Track*)((a[0] & 0xff)
+ | (a[1] & 0xff) << 8
+ | (a[2] & 0xff) << 16
+ | (a[3] & 0xff) << 24);
+ return true;
+ }
+
diff --git a/muse/muse/arranger/trackdrag.h b/muse/muse/arranger/trackdrag.h
new file mode 100644
index 00000000..7edfdcde
--- /dev/null
+++ b/muse/muse/arranger/trackdrag.h
@@ -0,0 +1,30 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: trackdrag.h,v 1.4 2005/09/26 18:26:20 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TRACKDRAG_H__
+#define __TRACKDRAG_H__
+
+class Track;
+
+//---------------------------------------------------------
+// TrackDrag
+//---------------------------------------------------------
+
+class TrackDrag : public QDrag {
+ static const char type[];
+ Q_OBJECT
+
+ public:
+ TrackDrag(Track*, QWidget* src);
+ static bool canDecode(const QMimeSource*);
+ static bool decode(const QMimeSource* s, Track*& p);
+ };
+
+
+#endif
+
diff --git a/muse/muse/arranger/trackinfo.cpp b/muse/muse/arranger/trackinfo.cpp
new file mode 100644
index 00000000..cbf1812b
--- /dev/null
+++ b/muse/muse/arranger/trackinfo.cpp
@@ -0,0 +1,717 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: trackinfo.cpp,v 1.45 2006/01/14 17:08:48 wschweer Exp $
+// (C) Copyright 1999-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "arranger.h"
+#include "widgets/outportcombo.h"
+#include "instruments/minstrument.h"
+#include "midiedit/drummap.h"
+#include "midictrl.h"
+#include "song.h"
+#include "trackinfo.h"
+#include "synth.h"
+#include "tllineedit.h"
+#include "audio.h"
+#include "gui.h"
+
+//---------------------------------------------------------
+// createTrackInfo
+//---------------------------------------------------------
+
+TrackInfo* Arranger::createTrackInfo()
+ {
+ Track::TrackType t = _curTrack->type();
+ switch (t) {
+ case Track::MIDI: return new MidiTrackInfo();
+ case Track::AUDIO_OUTPUT: return new AudioOutputInfo();
+ case Track::AUDIO_GROUP: return new AudioGroupInfo();
+ case Track::AUDIO_AUX: return new AudioAuxInfo();
+ case Track::WAVE: return new WaveTrackInfo();
+ case Track::AUDIO_INPUT: return new AudioInputInfo();
+ case Track::AUDIO_SOFTSYNTH: return new SynthIInfo();
+ case Track::MIDI_OUT: return new MidiOutPortInfo();
+ case Track::MIDI_IN: return new MidiInPortInfo();
+ case Track::MIDI_CHANNEL: return new MidiChannelInfo();
+ case Track::MIDI_SYNTI: return new MidiSynthIInfo();
+ default:
+ printf("Arranger::createTrackInfo: type %d\n", t);
+ abort();
+ }
+ }
+
+//---------------------------------------------------------
+// TrackInfo
+//---------------------------------------------------------
+
+TrackInfo::TrackInfo()
+ {
+ label = new QLabel;
+ label->setToolTip(tr("Track Type"));
+ label->setLineWidth(2);
+ label->setFrameStyle(QFrame::Panel | QFrame::Raised);
+
+ name = new TLLineEdit("");
+ name->setToolTip(tr("Track Name"));
+
+ grid = new QGridLayout;
+ grid->setMargin(0);
+ grid->setSpacing(0);
+ setLayout(grid);
+ grid->addWidget(label, 0, 0, 1, 2);
+ grid->addWidget(name, 1, 0, 1, 2);
+ connect(name, SIGNAL(contentChanged(QString)), SLOT(nameChanged(QString)));
+ }
+
+//---------------------------------------------------------
+// nameChanged
+//---------------------------------------------------------
+
+void TrackInfo::nameChanged(QString s)
+ {
+ song->changeTrackName(track, s);
+ name->setCursorPosition(0);
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void TrackInfo::init(Track* t)
+ {
+ track = t;
+ label->setText(track->clname());
+ name->setText(track->name());
+ //
+ //TD disconnect previous tracks
+ //
+ connect(track, SIGNAL(nameChanged(const QString&)), name, SLOT(setText(const QString&)));
+ connect(song, SIGNAL(songChanged(int)), this, SLOT(songChanged(int)));
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void TrackInfo::songChanged(int val)
+ {
+ if (val & SC_ROUTE)
+ init(track);
+ }
+
+//---------------------------------------------------------
+// MidiTrackInfo
+//---------------------------------------------------------
+
+MidiTrackInfo::MidiTrackInfo()
+ : TrackInfo()
+ {
+ QLabel* l1 = new QLabel(tr("Transp."));
+ QLabel* l2 = new QLabel(tr("Delay"));
+ QLabel* l3 = new QLabel(tr("Length"));
+ QLabel* l4 = new QLabel(tr("Velocity"));
+ QLabel* l5 = new QLabel(tr("Compr."));
+
+ transposition = new QSpinBox;
+ transposition->setRange(-127, 127);
+ transposition->setToolTip(tr("Pitch Transpose"));
+
+ delay = new QSpinBox;
+ delay->setRange(-1000, 1000);
+ delay->setToolTip(tr("Track Delay (ticks)"));
+
+ length = new QSpinBox;
+ length->setRange(25, 200);
+ length->setToolTip(tr("Modify Note Length"));
+ length->setSuffix("%");
+
+ velocity = new QSpinBox;
+ velocity->setRange(-127, 127);
+ velocity->setToolTip(tr("Modify Note Velocity"));
+
+ compression = new QSpinBox;
+ compression->setRange(25, 200);
+ compression->setSuffix("%");
+ compression->setToolTip(tr("Compress Note Velocity"));
+
+ grid->addWidget(transposition, 2, 0);
+ grid->addWidget(l1, 2, 1);
+
+ grid->addWidget(delay, 3, 0);
+ grid->addWidget(l2, 3, 1);
+
+ grid->addWidget(length, 4, 0);
+ grid->addWidget(l3, 4, 1);
+
+ grid->addWidget(velocity, 5, 0);
+ grid->addWidget(l4, 5, 1);
+
+ grid->addWidget(compression, 6, 0);
+ grid->addWidget(l5, 6, 1);
+
+ //
+ // Midi Channel
+ //
+ QLabel* label = new QLabel(tr("Midi Channel"));
+ label->setLineWidth(2);
+ label->setFrameStyle(QFrame::Panel | QFrame::Raised);
+ grid->addWidget(label, 7, 0, 1, 2);
+ channel = new QComboBox;
+ grid->addWidget(channel, 8, 0, 1, 2);
+ patch = new QPushButton;
+ patch->setText("???");
+ patch->setToolTip(tr("Instrument Patch"));
+ grid->addWidget(patch, 9, 0, 1, 2);
+ pop = new QMenu(patch);
+
+ //
+ // Midi Out Port
+ //
+ label = new QLabel(tr("Midi Out Port"));
+ label->setLineWidth(2);
+ label->setFrameStyle(QFrame::Panel | QFrame::Raised);
+ grid->addWidget(label, 10, 0, 1, 2);
+ port = new QComboBox;
+ grid->addWidget(port, 11, 0, 1, 2);
+
+ instrument = new QComboBox;
+ instrument->setFixedWidth(infoWidth);
+ instrument->setToolTip(tr("Midi Instrument"));
+ grid->addWidget(instrument, 12, 0, 1, 2);
+
+ connect(transposition, SIGNAL(valueChanged(int)), SLOT(transpositionChanged(int)));
+ connect(velocity, SIGNAL(valueChanged(int)), SLOT(velocityChanged(int)));
+ connect(delay, SIGNAL(valueChanged(int)), SLOT(delayChanged(int)));
+ connect(length, SIGNAL(valueChanged(int)), SLOT(lenChanged(int)));
+ connect(compression, SIGNAL(valueChanged(int)), SLOT(iKomprChanged(int)));
+ connect(patch, SIGNAL(clicked()), SLOT(patchClicked()));
+ connect(channel, SIGNAL(activated(int)), SLOT(channelSelected(int)));
+ connect(port, SIGNAL(activated(int)), SLOT(portSelected(int)));
+ connect(instrument, SIGNAL(activated(int)), SLOT(instrumentSelected(int)));
+ connect(song, SIGNAL(autoReadChanged(Track*,bool)), SLOT(autoChanged(Track*,bool)));
+ connect(song, SIGNAL(autoWriteChanged(Track*,bool)), SLOT(autoChanged(Track*,bool)));
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void MidiTrackInfo::init(Track* t)
+ {
+ TrackInfo::init(t);
+ transposition->setValue(((MidiTrack*)track)->transposition);
+ delay->setValue(((MidiTrack*)track)->delay);
+ length->setValue(((MidiTrack*)track)->len);
+ velocity->setValue(((MidiTrack*)track)->velocity);
+ compression->setValue(((MidiTrack*)track)->compression);
+
+ instrument->clear();
+ MidiChannel* mc = ((MidiTrack*)track)->channel();
+ int portIndex = 0;
+ int channelIndex = 0;
+
+ channel->clear();
+ channel->addItem("---", -1);
+ port->clear();
+ port->addItem("---", -1);
+ MidiOutPortList* opl = song->midiOutPorts();
+ int k = 0;
+ for (iMidiOutPort i = opl->begin(); i != opl->end(); ++i, ++k) {
+ port->addItem((*i)->name(), k);
+ if (mc && mc->port() == *i)
+ portIndex = k + 1;
+ }
+ if (mc) {
+ MidiOutPort* op = mc->port();
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ MidiChannel* c = op->channel(i);
+ if (mc == c)
+ channelIndex = i + 1;
+ channel->addItem(c->name(), i);
+ }
+ connect(mc, SIGNAL(controllerChanged(int)), SLOT(controllerChanged(int)));
+ connect(op, SIGNAL(instrumentChanged()), SLOT(instrumentChanged()));
+ channel->setCurrentIndex(channelIndex);
+ port->setCurrentIndex(portIndex);
+ MidiInstrument* mi = op->instrument();
+ int idx = 0;
+ int curIdx = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ instrument->addItem((*i)->iname());
+ if ((*i)->iname() == mi->iname())
+ curIdx = idx;
+ }
+ instrument->setCurrentIndex(curIdx);
+ autoChanged(mc, false); // update enable
+ int val = mc->ctrlVal(CTRL_PROGRAM).i;
+ patch->setText(mi->getPatchName(mc->channelNo(), val));
+ }
+ else {
+ channel->setCurrentIndex(0);
+ port->setCurrentIndex(0);
+ instrument->addItem("--");
+ instrument->setCurrentIndex(0);
+ patch->setText("--");
+ }
+ }
+
+//---------------------------------------------------------
+// portSelected
+//---------------------------------------------------------
+
+void MidiTrackInfo::portSelected(int portno)
+ {
+ if (portno == 0)
+ return;
+ --portno;
+
+ Route srcRoute(track, -1, Route::TRACK);
+ MidiChannel* mc = ((MidiTrack*)track)->channel();
+ if (mc) {
+ Route odstRoute(mc, -1, Route::TRACK);
+ audio->msgRemoveRoute(srcRoute, odstRoute);
+ }
+
+ int channel = mc ? mc->channelNo() : 0;
+ MidiOutPort* mp = song->midiOutPort(portno);
+ mc = mp->channel(channel);
+
+ Route dstRoute(mc, -1, Route::TRACK);
+ audio->msgAddRoute(srcRoute, dstRoute);
+
+ song->update(SC_ROUTE);
+ }
+
+//---------------------------------------------------------
+// channelSelected
+//---------------------------------------------------------
+
+void MidiTrackInfo::channelSelected(int ch)
+ {
+ if (ch == 0)
+ return;
+ --ch;
+ Route srcRoute(track, -1, Route::TRACK);
+ MidiChannel* mc = ((MidiTrack*)track)->channel();
+ MidiOutPort* mp = mc->port();
+ if (mc) {
+ Route odstRoute(mc, -1, Route::TRACK);
+ audio->msgRemoveRoute(srcRoute, odstRoute);
+ }
+
+ mc = mp->channel(ch);
+ Route dstRoute(mc, -1, Route::TRACK);
+ audio->msgAddRoute(srcRoute, dstRoute);
+
+ song->update(SC_ROUTE);
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void MidiTrackInfo::controllerChanged(int id)
+ {
+ if (id == CTRL_PROGRAM) {
+ MidiChannel* mc = ((MidiTrack*)track)->channel();
+ if (mc) {
+ MidiOutPort* op = mc->port();
+ MidiInstrument* mi = op->instrument();
+ int val = mc->ctrlVal(id).i;
+ patch->setText(mi->getPatchName(mc->channelNo(), val));
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// instrumentChanged
+//---------------------------------------------------------
+
+void MidiTrackInfo::instrumentChanged()
+ {
+ MidiChannel* mc = ((MidiTrack*)track)->channel();
+ if (mc) {
+ MidiOutPort* op = mc->port();
+ MidiInstrument* mi = op->instrument();
+ int idx = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ if (*i == mi) {
+ instrument->setCurrentIndex(idx);
+ break;
+ }
+ }
+ }
+ else {
+ instrument->clear();
+ instrument->setCurrentIndex(0);
+ }
+ }
+
+//---------------------------------------------------------
+// autoChanged
+//---------------------------------------------------------
+
+void MidiTrackInfo::autoChanged(Track* t, bool)
+ {
+ MidiChannel* mc = ((MidiTrack*)track)->channel();
+ if (mc != t)
+ return;
+ bool ar = t->autoRead();
+ bool aw = t->autoWrite();
+ bool en = !ar || (ar && aw);
+ patch->setEnabled(en);
+ }
+
+//---------------------------------------------------------
+// transpositionChanged
+//---------------------------------------------------------
+
+void MidiTrackInfo::transpositionChanged(int val)
+ {
+ ((MidiTrack*)track)->transposition = val;
+ }
+
+//---------------------------------------------------------
+// patchClicked
+//---------------------------------------------------------
+
+void MidiTrackInfo::patchClicked()
+ {
+ MidiChannel* mc = ((MidiTrack*)track)->channel();
+ if (!mc)
+ return;
+
+ MidiOutPort* op = mc->port();
+ MidiInstrument* mi = op->instrument();
+ mi->populatePatchPopup(pop, 0);
+
+ QAction* rv = pop->exec(patch->mapToGlobal(QPoint(10,5)));
+ if (rv != 0) {
+ CVal cval;
+ cval.i = rv->data().toInt();
+ song->setControllerVal(mc, CTRL_PROGRAM, cval);
+ }
+ }
+
+//---------------------------------------------------------
+// instrumentSelected
+//---------------------------------------------------------
+
+void MidiTrackInfo::instrumentSelected(int n)
+ {
+ MidiChannel* mc = ((MidiTrack*)track)->channel();
+ if (mc == 0)
+ return;
+ MidiOutPort* op = mc->port();
+ op->setInstrument(midiInstruments[n]);
+ }
+
+//---------------------------------------------------------
+// velocityChanged
+//---------------------------------------------------------
+
+void MidiTrackInfo::velocityChanged(int val)
+ {
+ ((MidiTrack*)track)->velocity = val;
+ }
+
+//---------------------------------------------------------
+// delayChanged
+//---------------------------------------------------------
+
+void MidiTrackInfo::delayChanged(int val)
+ {
+ ((MidiTrack*)track)->delay = val;
+ }
+
+//---------------------------------------------------------
+// lenChanged
+//---------------------------------------------------------
+
+void MidiTrackInfo::lenChanged(int val)
+ {
+ ((MidiTrack*)track)->len = val;
+ }
+
+//---------------------------------------------------------
+// iKomprChanged
+//---------------------------------------------------------
+
+void MidiTrackInfo::iKomprChanged(int val)
+ {
+ ((MidiTrack*)track)->compression = val;
+ }
+
+//---------------------------------------------------------
+// AudioOutputInfo
+//---------------------------------------------------------
+
+AudioOutputInfo::AudioOutputInfo()
+ : TrackInfo()
+ {
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// AudioInputInfo
+//---------------------------------------------------------
+
+AudioInputInfo::AudioInputInfo()
+ : TrackInfo()
+ {
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// AudioGroupInfo
+//---------------------------------------------------------
+
+AudioGroupInfo::AudioGroupInfo()
+ : TrackInfo()
+ {
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// AudioAuxInfo
+//---------------------------------------------------------
+
+AudioAuxInfo::AudioAuxInfo()
+ : TrackInfo()
+ {
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// WaveTrackInfo
+//---------------------------------------------------------
+
+WaveTrackInfo::WaveTrackInfo()
+ : TrackInfo()
+ {
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// SynthIInfo
+//---------------------------------------------------------
+
+SynthIInfo::SynthIInfo()
+ : TrackInfo()
+ {
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// MidiSynthIInfo
+//---------------------------------------------------------
+
+MidiSynthIInfo::MidiSynthIInfo()
+ : TrackInfo()
+ {
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// MidiOutPortInfo
+//---------------------------------------------------------
+
+MidiOutPortInfo::MidiOutPortInfo()
+ : TrackInfo()
+ {
+ instrument = new QComboBox(this);
+ instrument->setFixedWidth(infoWidth);
+ instrument->setToolTip(tr("Midi Device"));
+ grid->addWidget(instrument, 2, 0, 1, 2);
+
+ grid->setRowStretch(grid->rowCount(), 100);
+
+ connect(instrument, SIGNAL(activated(int)), SLOT(instrumentSelected(int)));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void MidiOutPortInfo::init(Track* t)
+ {
+ TrackInfo::init(t);
+
+ MidiOutPort* op = (MidiOutPort*)track;
+ MidiInstrument* mi = op->instrument();
+ int idx = 0;
+ int curIdx = 0;
+ instrument->clear();
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ instrument->addItem((*i)->iname());
+ if ((*i)->iname() == mi->iname())
+ curIdx = idx;
+ }
+ instrument->setCurrentIndex(curIdx);
+ connect(t, SIGNAL(instrumentChanged()), SLOT(instrumentChanged()));
+ }
+
+//---------------------------------------------------------
+// instrumentChanged
+//---------------------------------------------------------
+
+void MidiOutPortInfo::instrumentChanged()
+ {
+ MidiOutPort* op = (MidiOutPort*)track;
+ MidiInstrument* mi = op->instrument();
+ int idx = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ if (*i == mi) {
+ instrument->setCurrentIndex(idx);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// instrumentSelected
+//---------------------------------------------------------
+
+void MidiOutPortInfo::instrumentSelected(int n)
+ {
+ MidiOutPort* op = (MidiOutPort*)track;
+ int idx = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ if (idx == n) {
+ op->setInstrument(*i);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// MidiInPortInfo
+//---------------------------------------------------------
+
+MidiInPortInfo::MidiInPortInfo()
+ : TrackInfo()
+ {
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// MidiChannelInfo
+//---------------------------------------------------------
+
+MidiChannelInfo::MidiChannelInfo()
+ : TrackInfo()
+ {
+ patch = new QPushButton;
+ patch->setText("???");
+ patch->setToolTip(tr("Instrument Patch"));
+ grid->addWidget(patch, 2, 0, 1, 2);
+ pop = new QMenu(patch);
+ //
+ // Midi Out Port
+ //
+ QLabel* label = new QLabel(tr("Midi Out Port"));
+ label->setLineWidth(2);
+ label->setFrameStyle(QFrame::Panel | QFrame::Raised);
+ grid->addWidget(label, 3, 0, 1, 2);
+ portName = new TLLineEdit("??");
+ grid->addWidget(portName, 4, 0, 1, 2);
+
+ instrument = new QComboBox;
+ instrument->setFixedWidth(infoWidth);
+ instrument->setToolTip(tr("Midi Instrument"));
+ grid->addWidget(instrument, 5, 0, 1, 2);
+
+ connect(instrument, SIGNAL(activated(int)), SLOT(instrumentSelected(int)));
+ connect(patch, SIGNAL(clicked()), SLOT(patchClicked()));
+
+ grid->setRowStretch(grid->rowCount(), 100);
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void MidiChannelInfo::init(Track* t)
+ {
+ TrackInfo::init(t);
+ MidiChannel* mc = (MidiChannel*)t;
+ MidiOutPort* op = mc->port();
+ connect(op, SIGNAL(instrumentChanged()), SLOT(instrumentChanged()));
+ connect(mc, SIGNAL(controllerChanged(int)), SLOT(controllerChanged(int)));
+ portName->setText(op->name());
+ MidiInstrument* mi = op->instrument();
+ int idx = 0;
+ int curIdx = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ instrument->addItem((*i)->iname());
+ if ((*i)->iname() == mi->iname())
+ curIdx = idx;
+ }
+ instrument->setCurrentIndex(curIdx);
+ }
+
+//---------------------------------------------------------
+// instrumentSelected
+//---------------------------------------------------------
+
+void MidiChannelInfo::instrumentSelected(int n)
+ {
+ MidiChannel* mc = (MidiChannel*)track;
+ MidiOutPort* op = mc->port();
+ op->setInstrument(midiInstruments[n]);
+ }
+
+//---------------------------------------------------------
+// instrumentChanged
+//---------------------------------------------------------
+
+void MidiChannelInfo::instrumentChanged()
+ {
+ MidiChannel* mc = (MidiChannel*)track;
+ MidiOutPort* op = mc->port();
+ MidiInstrument* mi = op->instrument();
+ int idx = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) {
+ if (*i == mi) {
+ instrument->setCurrentIndex(idx);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// patchClicked
+//---------------------------------------------------------
+
+void MidiChannelInfo::patchClicked()
+ {
+ MidiChannel* mc = (MidiChannel*)track;
+ MidiOutPort* op = mc->port();
+ MidiInstrument* mi = op->instrument();
+ mi->populatePatchPopup(pop, 0);
+
+ QAction* rv = pop->exec(patch->mapToGlobal(QPoint(10,5)));
+ if (rv != 0) {
+ CVal cval;
+ cval.i = rv->data().toInt();
+ song->setControllerVal(mc, CTRL_PROGRAM, cval);
+ }
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void MidiChannelInfo::controllerChanged(int id)
+ {
+ if (id == CTRL_PROGRAM) {
+ MidiChannel* mc = (MidiChannel*)track;
+ MidiOutPort* op = mc->port();
+ MidiInstrument* mi = op->instrument();
+ int val = mc->ctrlVal(id).i;
+ patch->setText(mi->getPatchName(mc->channelNo(), val));
+ }
+ }
diff --git a/muse/muse/arranger/trackinfo.h b/muse/muse/arranger/trackinfo.h
new file mode 100644
index 00000000..656c8e11
--- /dev/null
+++ b/muse/muse/arranger/trackinfo.h
@@ -0,0 +1,214 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: trackinfo.h,v 1.14 2006/01/11 16:14:28 wschweer Exp $
+// (C) Copyright 1999-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TRACKINFO_H__
+#define __TRACKINFO_H__
+
+class Track;
+class MidiTrack;
+class AudioOutput;
+class AudioInput;
+class AudioGroup;
+class AudioAux;
+class SynthI;
+class MidiInPort;
+class MidiOutPort;
+class MidiChannel;
+class WaveTrack;
+class TLLineEdit;
+
+//---------------------------------------------------------
+// TrackInfo
+//---------------------------------------------------------
+
+class TrackInfo : public QWidget {
+ Q_OBJECT
+
+ QLabel* label;
+ TLLineEdit* name;
+
+ protected:
+ QGridLayout* grid;
+ Track* track;
+
+ private slots:
+ void nameChanged(QString s);
+ void songChanged(int);
+
+ public:
+ TrackInfo();
+ virtual void init(Track*);
+ };
+
+//---------------------------------------------------------
+// MidiTrackInfo
+//---------------------------------------------------------
+
+class MidiTrackInfo : public TrackInfo {
+ Q_OBJECT
+
+ QSpinBox* transposition;
+ QSpinBox* delay;
+ QSpinBox* length;
+ QSpinBox* velocity;
+ QSpinBox* compression;
+ QComboBox* channel;
+ QPushButton* patch;
+ QComboBox* port;
+ QComboBox* instrument;
+ QMenu* pop;
+
+ private slots:
+ void transpositionChanged(int val);
+ void velocityChanged(int val);
+ void delayChanged(int val);
+ void lenChanged(int val);
+ void iKomprChanged(int val);
+ void patchClicked();
+ void instrumentSelected(int);
+ void instrumentChanged();
+ void autoChanged(Track*,bool);
+ void controllerChanged(int);
+ void portSelected(int);
+ void channelSelected(int);
+
+ public:
+ MidiTrackInfo();
+ virtual void init(Track*);
+ };
+
+//---------------------------------------------------------
+// AudioOutputInfo
+//---------------------------------------------------------
+
+class AudioOutputInfo : public TrackInfo {
+ Q_OBJECT
+
+ public:
+ AudioOutputInfo();
+ };
+
+//---------------------------------------------------------
+// AudioInputInfo
+//---------------------------------------------------------
+
+class AudioInputInfo : public TrackInfo {
+ Q_OBJECT
+
+ public:
+ AudioInputInfo();
+ };
+
+//---------------------------------------------------------
+// AudioGroupInfo
+//---------------------------------------------------------
+
+class AudioGroupInfo : public TrackInfo {
+ Q_OBJECT
+
+ public:
+ AudioGroupInfo();
+ };
+
+//---------------------------------------------------------
+// AudioAuxInfo
+//---------------------------------------------------------
+
+class AudioAuxInfo : public TrackInfo {
+ Q_OBJECT
+
+ public:
+ AudioAuxInfo();
+ };
+
+//---------------------------------------------------------
+// WaveTrackInfo
+//---------------------------------------------------------
+
+class WaveTrackInfo : public TrackInfo {
+ Q_OBJECT
+
+ public:
+ WaveTrackInfo();
+ };
+
+//---------------------------------------------------------
+// SynthIInfo
+//---------------------------------------------------------
+
+class SynthIInfo : public TrackInfo {
+ Q_OBJECT
+
+ public:
+ SynthIInfo();
+ };
+
+//---------------------------------------------------------
+// MidiSynthIInfo
+//---------------------------------------------------------
+
+class MidiSynthIInfo : public TrackInfo {
+ Q_OBJECT
+
+ public:
+ MidiSynthIInfo();
+ };
+
+//---------------------------------------------------------
+// MidiOutPortInfo
+//---------------------------------------------------------
+
+class MidiOutPortInfo : public TrackInfo {
+ Q_OBJECT
+
+ QComboBox* instrument;
+
+ private slots:
+ void instrumentSelected(int);
+ void instrumentChanged();
+
+ public:
+ MidiOutPortInfo();
+ virtual void init(Track*);
+ };
+
+//---------------------------------------------------------
+// MidiInPortInfo
+//---------------------------------------------------------
+
+class MidiInPortInfo : public TrackInfo {
+ Q_OBJECT
+
+ public:
+ MidiInPortInfo();
+ };
+
+//---------------------------------------------------------
+// MidiChannelInfo
+//---------------------------------------------------------
+
+class MidiChannelInfo : public TrackInfo {
+ Q_OBJECT
+
+ TLLineEdit* portName;
+ QComboBox* instrument;
+ QPushButton* patch;
+ QMenu* pop;
+
+ private slots:
+ void instrumentSelected(int);
+ void instrumentChanged();
+ void controllerChanged(int);
+ void patchClicked();
+
+ public:
+ MidiChannelInfo();
+ virtual void init(Track*);
+ };
+
+#endif
+
diff --git a/muse/muse/arranger/trelement.h b/muse/muse/arranger/trelement.h
new file mode 100644
index 00000000..fe2e2f1a
--- /dev/null
+++ b/muse/muse/arranger/trelement.h
@@ -0,0 +1,52 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: trelement.h,v 1.6 2005/05/17 15:07:57 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TR_ELEMENT_H__
+#define __TR_ELEMENT_H__
+
+#include "track.h"
+
+//---------------------------------------------------------
+// TrElement
+// describes a configurable gui element of the
+// track list
+//---------------------------------------------------------
+
+enum {
+ TR_NAME, TR_MUTE, TR_OFF, TR_SOLO, TR_RECORD, TR_AREAD, TR_AWRITE,
+ TR_OCHANNEL, TR_MONITOR, TR_DRUMMAP, TR_INSTRUMENT, TR_PATCH
+ };
+
+struct TrElement {
+ int id;
+ int grp; // default group
+ char* name;
+ int trackMask;
+
+ TrElement(int i, int g, char* s, int m)
+ : id(i), grp(g), name(s), trackMask(m) {}
+ };
+
+//---------------------------------------------------------
+// TrGroup
+// TrElements are grouped
+//---------------------------------------------------------
+
+typedef std::list<const TrElement*> TrElementList;
+typedef TrElementList::iterator iTrElement;
+
+class TrGroupList : public std::list<TrElementList> {
+ };
+typedef TrGroupList::iterator iTrGroup;
+
+extern const TrElement trElements[];
+extern const int nTrElements;
+extern TrGroupList glist[Track::TRACK_TYPES];
+
+#endif
+
diff --git a/muse/muse/audio.cpp b/muse/muse/audio.cpp
new file mode 100644
index 00000000..b5bda655
--- /dev/null
+++ b/muse/muse/audio.cpp
@@ -0,0 +1,735 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include <fcntl.h>
+
+#include "al/al.h"
+#include "muse.h"
+#include "globals.h"
+#include "song.h"
+#include "driver/audiodev.h"
+#include "audioprefetch.h"
+#include "audiowriteback.h"
+#include "audio.h"
+#include "midiseq.h"
+#include "sync.h"
+#include "midi.h"
+#include "gconfig.h"
+#include "al/sig.h"
+#include "al/tempo.h"
+#include "widgets/utils.h"
+#include "synth.h"
+
+extern double curTime();
+extern bool initJackAudio();
+
+Audio* audio;
+AudioDriver* audioDriver; // current audio device in use
+
+const char* seqMsgList[] = {
+ "SEQM_ADD_TRACK",
+ "SEQM_REMOVE_TRACK",
+ "SEQM_MOVE_TRACK",
+ "SEQM_ADD_PART",
+ "SEQM_REMOVE_PART",
+ "SEQM_CHANGE_PART",
+ "SEQM_ADD_EVENT",
+ "SEQM_REMOVE_EVENT",
+ "SEQM_CHANGE_EVENT",
+ "SEQM_ADD_TEMPO",
+/*10*/"SEQM_SET_TEMPO",
+ "SEQM_REMOVE_TEMPO",
+ "SEQM_ADD_SIG",
+ "SEQM_REMOVE_SIG",
+ "SEQM_SET_GLOBAL_TEMPO",
+ "SEQM_UNDO",
+ "SEQM_REDO",
+ "SEQM_RESET_DEVICES",
+ "SEQM_INIT_DEVICES",
+ "AUDIO_ROUTEADD",
+ "AUDIO_ROUTEREMOVE",
+/*20*/"AUDIO_ADDPLUGIN",
+ "AUDIO_ADDMIDIPLUGIN",
+ "AUDIO_SET_SEG_SIZE",
+ "AUDIO_SET_PREFADER",
+ "AUDIO_SET_CHANNELS",
+ "MS_PROCESS",
+ "MS_START",
+ "MS_STOP",
+ "MS_SET_RTC",
+ "SEQM_IDLE",
+ "SEQM_SEEK",
+ "SEQM_ADD_CTRL",
+ "SEQM_REMOVE_CTRL"
+ };
+
+const char* audioStates[] = {
+ "STOP", "START_PLAY", "PLAY", "LOOP1", "LOOP2", "SYNC", "PRECOUNT"
+ };
+
+
+//---------------------------------------------------------
+// Audio
+//---------------------------------------------------------
+
+Audio::Audio()
+ {
+ recording = false;
+ idle = false;
+ _freewheel = false;
+ _bounce = 0;
+ loopPassed = false;
+
+ _pos.setType(AL::FRAMES);
+ _pos.setFrame(~0); // make sure first seek is not optimized away
+
+ curTickPos = 0;
+ nextTickPos = 0;
+
+ midiClick = 0;
+ clickno = 0;
+ clicksMeasure = 0;
+ ticksBeat = 0;
+
+ syncTime = 0.0;
+ syncFrame = 0;
+ frameOffset = 0;
+
+ state = STOP;
+ lmark = 0; // left loop position
+ rmark = 0; // right loop position
+ msg = 0;
+
+ startRecordPos.setType(AL::TICKS);
+ endRecordPos.setType(AL::TICKS);
+
+ //---------------------------------------------------
+ // establish pipes/sockets
+ //---------------------------------------------------
+
+ int filedes[2]; // 0 - reading 1 - writing
+ if (pipe(filedes) == -1) {
+ perror("creating pipe0");
+ fatalError("cannot create pipe0");
+ }
+ fromThreadFdw = filedes[1];
+ fromThreadFdr = filedes[0];
+ int rv = fcntl(fromThreadFdw, F_SETFL, O_NONBLOCK);
+ if (rv == -1)
+ perror("set pipe O_NONBLOCK");
+
+ if (pipe(filedes) == -1) {
+ perror("creating pipe1");
+ fatalError("cannot create pipe1");
+ }
+ sigFd = filedes[1];
+ QSocketNotifier* ss = new QSocketNotifier(filedes[0], QSocketNotifier::Read);
+ song->connect(ss, SIGNAL(activated(int)), song, SLOT(seqSignal(int)));
+ }
+
+//---------------------------------------------------------
+// start
+// start audio processing
+//---------------------------------------------------------
+
+bool Audio::start()
+ {
+ TrackList* tl = song->tracks();
+
+ //
+ // init marker for synchronous loop processing
+ //
+ lmark = song->lPos().frame();
+ rmark = song->rPos().frame();
+ state = STOP;
+ muse->setHeartBeat();
+
+ if (audioDriver) {
+ //
+ // allocate ports
+ //
+ for (iTrack i = tl->begin(); i != tl->end(); ++i)
+ (*i)->activate1();
+ seek(song->cpos());
+ process(segmentSize); // warm up caches; audio must be stopped
+ audioDriver->start(realTimePriority);
+ }
+ else {
+
+ // if audio device has disappeared it probably
+ // means jack has performed a shutdown
+ // try to restart and reconnect everything
+
+ if (false == initJackAudio()) {
+ //
+ // allocate ports, first resetting the old connection
+ //
+ InputList* itl = song->inputs();
+ for (iAudioInput i = itl->begin(); i != itl->end(); ++i) {
+// printf("reconnecting input %s\n", (*i)->name().toLatin1().data());
+ for (int x=0; x < (*i)->channels();x++)
+ (*i)->setJackPort(x,0); // zero out the old connection
+ (*i)->activate1();
+ }
+
+ OutputList* otl = song->outputs();
+ for (iAudioOutput i = otl->begin(); i != otl->end(); ++i) {
+// printf("reconnecting output %s\n", (*i)->name().toLatin1().data());
+ for (int x=0; x < (*i)->channels();x++)
+ (*i)->setJackPort(x,0); // zero out the old connection
+ (*i)->activate1();
+ }
+ audioDriver->start(realTimePriority);
+ }
+ else {
+ printf("Failed to init audio!\n");
+ return false;
+ }
+ }
+ audioDriver->stopTransport();
+
+ //
+ // do connections
+ //
+// done in seqStart
+// for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+// (*i)->activate2();
+// }
+ return true;
+ }
+
+//---------------------------------------------------------
+// stop
+// stop audio processing
+//---------------------------------------------------------
+
+void Audio::stop(bool)
+ {
+ if (audioDriver)
+ audioDriver->stop();
+
+ MidiOutPortList* opl = song->midiOutPorts();
+ for (iMidiOutPort i = opl->begin(); i != opl->end(); ++i)
+ (*i)->deactivate();
+ MidiInPortList* ipl = song->midiInPorts();
+ for (iMidiInPort i = ipl->begin(); i != ipl->end(); ++i)
+ (*i)->deactivate();
+ }
+
+//---------------------------------------------------------
+// sync
+// return true if sync is completed
+//---------------------------------------------------------
+
+bool Audio::sync(int jackState, unsigned frame)
+ {
+// printf("Audio::sync() state %s jackState %s frame 0x%x\n", audioStates[state], audioStates[jackState], frame);
+ bool done = true;
+ if (state == LOOP1)
+ state = LOOP2;
+ else {
+ State s = State(jackState);
+ //
+ // STOP -> START_PLAY start rolling
+ // STOP -> STOP seek in stop state
+ // PLAY -> START_PLAY seek in play state
+
+ if (state != START_PLAY) {
+ Pos p(frame, AL::FRAMES);
+// printf(" sync seek\n");
+ seek(p);
+ if (!_freewheel)
+ done = audioPrefetch->seekDone();
+ if (s == START_PLAY)
+ state = START_PLAY;
+ }
+ else {
+ if (frame != _pos.frame()) {
+ // seek during seek
+ seek(Pos(frame, AL::FRAMES));
+ }
+ done = audioPrefetch->seekDone();
+ }
+ }
+// printf(" sync %s\n", done ? "done" : "busy");
+ return done;
+ }
+
+//---------------------------------------------------------
+// setFreewheel
+//---------------------------------------------------------
+
+void Audio::setFreewheel(bool val)
+ {
+// printf("JACK: freewheel callback %d\n", val);
+ _freewheel = val;
+ }
+
+//---------------------------------------------------------
+// shutdown
+//---------------------------------------------------------
+
+void Audio::shutdown()
+ {
+ audioState = AUDIO_STOP;
+printf("JACK: shutdown callback\n");
+ sendMsgToGui(MSG_JACK_SHUTDOWN);
+ }
+
+//---------------------------------------------------------
+// process
+// process one audio buffer at position "_pos "
+// of size "frames"
+//---------------------------------------------------------
+
+void Audio::process(unsigned frames)
+ {
+// printf("process %d\n", frames);
+ bool updateController = false;
+ extern int watchAudio;
+ ++watchAudio; // make a simple watchdog happy
+
+ if (msg) {
+// printf("msg\n");
+ processMsg(msg);
+ int sn = msg->serialNo;
+ msg = 0; // dont process again
+ int rv = write(fromThreadFdw, &sn, sizeof(int));
+ if (rv != sizeof(int)) {
+ fprintf(stderr, "audio: write(%d) pipe failed: %s\n",
+ fromThreadFdw, strerror(errno));
+ }
+ }
+
+ int jackState = audioDriver->getState();
+ if (jackState != state) {
+// printf("process %s %s\n", audioStates[state], audioStates[jackState]);
+ if (state == START_PLAY && jackState == PLAY) {
+ startRolling();
+ if (_bounce)
+ sendMsgToGui(MSG_START_BOUNCE);
+ }
+ else if (state == LOOP2 && jackState == PLAY) {
+ Pos newPos(loopFrame, AL::FRAMES);
+ seek(newPos);
+ startRolling();
+ }
+ else if (isPlaying() && jackState == STOP) {
+ stopRolling();
+ }
+ else if (state == START_PLAY && jackState == STOP) {
+ state = STOP;
+ updateController = true;
+ if (_bounce) {
+ audioDriver->startTransport();
+ }
+ else {
+ sendMsgToGui(MSG_STOP);
+ }
+ }
+ else if (state == STOP && jackState == PLAY) {
+ startRolling();
+ }
+ else if (state == LOOP1 && jackState == PLAY)
+ ; // treat as play
+ else if (state == LOOP2 && jackState == START_PLAY)
+ ; // sync cycle, treat as play
+ else
+ printf("JACK: state transition %s -> %s ?\n",
+ audioStates[state], audioStates[jackState]);
+ }
+
+ OutputList* ol = song->outputs();
+ if (idle || state == START_PLAY) {
+ // deliver no audio
+ for (iAudioOutput i = ol->begin(); i != ol->end(); ++i)
+ (*i)->silence(frames);
+ return;
+ }
+
+ unsigned framePos = _pos.frame();
+
+ if (state == PLAY) { // TODO: only when looping?
+ unsigned llmark = song->lPos().frame();
+ unsigned rrmark = song->rPos().frame();
+
+ if (lmark != llmark || rmark != rrmark) {
+ //
+ // invalidate audio prefetch buffer
+ //
+#if 0
+ WaveTrackList* tl = song->waves();
+ for (iWaveTrack it = tl->begin(); it != tl->end(); ++it) {
+ WaveTrack* track = *it;
+ track->clearPrefetchFifo();
+ }
+#endif
+ audioPrefetch->msgSeek(framePos);
+ lmark = llmark;
+ rmark = rrmark;
+ }
+ }
+
+ if (isPlaying()) {
+ if (_bounce == 1 && _pos >= song->rPos()) {
+ _bounce = 2;
+ sendMsgToGui(MSG_STOP_BOUNCE);
+ }
+ //
+ // check for end of song
+ //
+ if ((curTickPos >= song->len())
+ && !(song->record() || _bounce || song->loop())) {
+ audioDriver->stopTransport();
+ return;
+ }
+
+ //
+ // check for loop end
+ //
+ if (state == PLAY && song->loop() && !_bounce && !extSyncFlag) {
+ unsigned n = rmark - framePos - (3 * frames);
+ if (n < frames) {
+ // loop end in current cycle
+ // adjust loop start so we get exact loop len
+ if (n > lmark)
+ n = 0;
+ state = LOOP1;
+ loopFrame = lmark - n;
+ audioDriver->seekTransport(loopFrame);
+ }
+ }
+
+ Pos ppp(_pos);
+ ppp += frames;
+ nextTickPos = ppp.tick();
+ }
+
+ //
+ // resync with audio interface
+ // syncFrame - free running JACK frame counter
+ // syncTime - corresponding wall clock time
+ //
+ syncFrame = audioDriver->framePos();
+ syncTime = curTime();
+ frameOffset = syncFrame - framePos;
+
+ //
+ // compute current controller values
+ // (automation)
+ //
+ TrackList* tl = song->tracks();
+ if (state == PLAY || updateController) {
+ updateController = false;
+ for (iTrack it = tl->begin(); it != tl->end(); ++it) {
+ if ((*it)->isMidiTrack())
+ continue;
+ AudioTrack* track = (AudioTrack*)(*it);
+ if (!track->autoRead())
+ continue;
+ CtrlList* cl = track->controller();
+ for (iCtrl i = cl->begin(); i != cl->end(); ++i) {
+ Ctrl* c = i->second;
+ float val = c->value(framePos).f;
+ if (val != c->curVal().f) {
+ c->setCurVal(val);
+ c->setChanged(true);
+ }
+ }
+ }
+ }
+
+ midiSeq->msgProcess(frames);
+
+ GroupList* gl = song->groups();
+ AuxList* al = song->auxs();
+ SynthIList* sl = song->syntis();
+ InputList* il = song->inputs();
+ WaveTrackList* wl = song->waves();
+
+ for (iAudioInput i = il->begin(); i != il->end(); ++i)
+ (*i)->process();
+ for (iSynthI i = sl->begin(); i != sl->end(); ++i)
+ (*i)->process();
+
+ _curReadIndex = -1;
+ if (isPlaying() && !wl->empty()) {
+ Fifo1* fifo = audioPrefetch->getFifo();
+// printf("process %3d\n", fifo->count());
+ if (fifo->count() == 0) {
+ printf("MusE::Audio: fifo underflow at 0x%x\n", curTickPos);
+ }
+ else {
+ bool msg = true;
+ do {
+ unsigned fifoPos = fifo->readPos();
+ if (fifoPos != framePos) {
+// if (msg) {
+ printf("Muse::Audio: wrong prefetch data 0x%x, expected 0x%x\n",
+ fifoPos, framePos);
+ msg = false;
+// }
+ fifo->get();
+ }
+ else {
+ _curReadIndex = fifo->ridx;
+ break;
+ }
+ } while (fifo->count());
+ if (_curReadIndex == -1) {
+ seek(_pos);
+ }
+ }
+ }
+ for (iWaveTrack i = wl->begin(); i != wl->end(); ++i) {
+ if (song->bounceTrack != *i)
+ (*i)->process();
+ }
+ for (iAudioGroup i = gl->begin(); i != gl->end(); ++i)
+ (*i)->process();
+ for (iAudioAux i = al->begin(); i != al->end(); ++i)
+ (*i)->process();
+
+ for (iAudioOutput i = ol->begin(); i != ol->end(); ++i) {
+ AudioOutput* ao = *i;
+ ao->process();
+ int och = ao->channels();
+ float* buffer[och];
+ for (int i = 0; i < och; ++i) {
+ void* port = ao->jackPort(i);
+ if (port)
+ buffer[i] = audioDriver->getBuffer(port, frames);
+ else
+ printf("PANIC: process(): no buffer from audio driver\n");
+ }
+ if (!ao->multiplyCopy(och, buffer)) {
+ for (int i = 0; i < och; ++i)
+ memset(buffer[i], 0, sizeof(float) * frames);
+ }
+ }
+ if (_bounce == 1 && song->bounceTrack && song->bounceTrack->type() == Track::WAVE)
+ song->bounceTrack->process();
+
+ if (isPlaying()) {
+ if (!freewheel())
+ audioPrefetch->msgTick(framePos);
+ if (recording && (_bounce == 0 || _bounce == 1))
+ audioWriteback->trigger();
+ _pos += frames;
+ curTickPos = nextTickPos;
+ }
+
+ //
+ // consume prefetch buffer
+ //
+ if (_curReadIndex != -1)
+ audioPrefetch->getFifo()->get();
+ }
+
+//---------------------------------------------------------
+// processMsg
+//---------------------------------------------------------
+
+void Audio::processMsg(AudioMsg* msg)
+ {
+// if (_running)
+// printf("audio process %d\n", msg->id);
+
+ switch(msg->id) {
+ case AUDIO_ROUTEADD:
+ addRoute(msg->sroute, msg->droute);
+ break;
+ case AUDIO_ROUTEREMOVE:
+ removeRoute(msg->sroute, msg->droute);
+ break;
+ case AUDIO_SET_PREFADER:
+ ((AudioTrack*)msg->track)->setPrefader(msg->ival);
+ break;
+ case AUDIO_SET_CHANNELS:
+ msg->track->setChannels(msg->ival);
+ break;
+ case AUDIO_ADDPLUGIN:
+ ((AudioTrack*)msg->track)->addPlugin(msg->plugin, msg->ival);
+ break;
+
+ case AUDIO_SET_SEG_SIZE:
+ segmentSize = msg->ival;
+ AL::sampleRate = msg->iival;
+#if 0 //TODO
+ audioOutput.segmentSizeChanged();
+ for (int i = 0; i < mixerGroups; ++i)
+ audioGroups[i].segmentSizeChanged();
+ for (iSynthI ii = synthiInstances.begin(); ii != synthiInstances.end();++ii)
+ (*ii)->segmentSizeChanged();
+#endif
+ break;
+
+ case SEQM_INIT_DEVICES:
+ initDevices();
+ break;
+ case SEQM_ADD_TEMPO:
+ case SEQM_REMOVE_TEMPO:
+ case SEQM_SET_GLOBAL_TEMPO:
+ case SEQM_SET_TEMPO:
+ song->processMsg(msg);
+ if (isPlaying()) {
+ _pos.setTick(curTickPos);
+ int framePos = _pos.frame();
+ syncFrame = audioDriver->framePos();
+ syncTime = curTime();
+ frameOffset = syncFrame - framePos;
+ }
+ break;
+
+ case SEQM_IDLE:
+ idle = msg->a;
+ // fall through
+ default:
+ midiSeq->sendMsg(msg);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// seek
+// - called before start play
+// - initiated from gui
+//---------------------------------------------------------
+
+void Audio::seek(const Pos& p)
+ {
+ _pos.setFrame(p.frame());
+ syncFrame = audioDriver->framePos();
+ frameOffset = syncFrame - _pos.frame();
+ curTickPos = _pos.tick();
+ nextTickPos = curTickPos;
+
+ loopPassed = true; // for record loop mode
+ if (state != LOOP2 && !freewheel())
+ audioPrefetch->msgSeek(_pos.frame());
+
+ midiSeq->msgSeek(); // handle stuck notes and set
+ // controller for new position
+ sendMsgToGui(MSG_SEEK);
+ }
+
+//---------------------------------------------------------
+// startRolling
+//---------------------------------------------------------
+
+void Audio::startRolling()
+ {
+ startRecordPos = _pos;
+ if (song->record()) {
+ startRecordPos = _pos;
+ recording = true;
+ TrackList* tracks = song->tracks();
+ for (iTrack i = tracks->begin(); i != tracks->end(); ++i) {
+ if ((*i)->isMidiTrack())
+ continue;
+ if ((*i)->type() == Track::WAVE)
+ ((WaveTrack*)(*i))->resetMeter();
+ ((AudioTrack*)(*i))->recEvents()->clear();
+ }
+ }
+ state = PLAY;
+ sendMsgToGui(MSG_PLAY);
+
+ midiSeq->msgStart();
+
+ if (precountEnableFlag
+ && song->click()
+ && !extSyncFlag
+ && song->record()) {
+#if 0
+ state = PRECOUNT;
+ int z, n;
+ if (precountFromMastertrackFlag)
+ AL::sigmap.timesig(playTickPos, z, n);
+ else {
+ z = precountSigZ;
+ n = precountSigN;
+ }
+ clickno = z * preMeasures;
+ clicksMeasure = z;
+ ticksBeat = (division * 4)/n;
+#endif
+ }
+ else {
+ //
+ // compute next midi metronome click position
+ //
+ int bar, beat;
+ unsigned tick;
+ AL::sigmap.tickValues(curTickPos, &bar, &beat, &tick);
+ if (tick)
+ beat += 1;
+ midiClick = AL::sigmap.bar2tick(bar, beat, 0);
+ }
+ }
+
+//---------------------------------------------------------
+// stopRolling
+// execution environment: realtime thread
+//---------------------------------------------------------
+
+void Audio::stopRolling()
+ {
+ state = STOP;
+ midiSeq->msgStop();
+ recording = false;
+ endRecordPos = _pos;
+ _bounce = 0;
+ sendMsgToGui(MSG_STOP);
+ seek(_pos);
+ }
+
+//---------------------------------------------------------
+// curFrame
+// extrapolates current play frame on syncTime/syncFrame
+//---------------------------------------------------------
+
+unsigned int Audio::curFrame() const
+ {
+// return lrint((curTime() - syncTime) * AL::sampleRate) + syncFrame;
+ //
+ // this should be the same:
+ //
+ return audioDriver->framePos();
+ }
+
+//---------------------------------------------------------
+// timestamp
+// timestamp has only meaning when rolling
+//---------------------------------------------------------
+
+int Audio::timestamp() const
+ {
+ return (state == PLAY) ? (audioDriver->framePos() - frameOffset) : 0;
+ }
+
+//---------------------------------------------------------
+// sendMsgToGui
+//---------------------------------------------------------
+
+void Audio::sendMsgToGui(char c)
+ {
+ write(sigFd, &c, 1);
+ }
diff --git a/muse/muse/audio.h b/muse/muse/audio.h
new file mode 100644
index 00000000..0e436227
--- /dev/null
+++ b/muse/muse/audio.h
@@ -0,0 +1,289 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AUDIO_H__
+#define __AUDIO_H__
+
+#include "thread.h"
+#include "mpevent.h"
+#include "route.h"
+#include "al/pos.h"
+#include "event.h"
+#include "ctrl.h"
+
+namespace AL {
+ class TimeSignature;
+ };
+
+using AL::Xml;
+class SndFile;
+class PluginI;
+class MidiPluginI;
+class SynthI;
+class AudioDriver;
+class Track;
+class AudioTrack;
+class Part;
+class Event;
+class MidiEvent;
+class Event;
+class EventList;
+class MidiInstrument;
+class MidiTrack;
+class MidiSeq;
+class MidiTrackBase;
+
+//---------------------------------------------------------
+// GuiMessages
+// messages from sequencer to GUI
+// used in Audio::sendMsgToGui(char c)
+//---------------------------------------------------------
+
+#define MSG_STOP '0'
+#define MSG_PLAY '1'
+#define MSG_RECORD '2'
+#define MSG_SEEK 'G'
+#define MSG_JACK_SHUTDOWN 'S'
+#define MSG_START_BOUNCE 'f'
+#define MSG_STOP_BOUNCE 'F'
+#define MSG_GRAPH_CHANGED 'C'
+#define MSG_ALSA_CHANGED 'P'
+
+//---------------------------------------------------------
+// AudioMsgId
+// this are the messages send from the GUI thread to
+// the midi thread
+//---------------------------------------------------------
+
+enum {
+ SEQM_ADD_TRACK,
+ SEQM_REMOVE_TRACK,
+ SEQM_MOVE_TRACK,
+ SEQM_ADD_PART,
+ SEQM_REMOVE_PART,
+ SEQM_CHANGE_PART,
+ SEQM_ADD_EVENT,
+ SEQM_REMOVE_EVENT,
+ SEQM_CHANGE_EVENT,
+ SEQM_ADD_TEMPO,
+ SEQM_SET_TEMPO,
+ SEQM_REMOVE_TEMPO,
+ SEQM_ADD_SIG,
+ SEQM_REMOVE_SIG,
+ SEQM_SET_GLOBAL_TEMPO,
+ SEQM_UNDO,
+ SEQM_REDO,
+ SEQM_RESET_DEVICES,
+ SEQM_INIT_DEVICES,
+ //
+ AUDIO_ROUTEADD,
+ AUDIO_ROUTEREMOVE,
+ AUDIO_ADDPLUGIN,
+ AUDIO_ADDMIDIPLUGIN,
+ AUDIO_SET_SEG_SIZE,
+ AUDIO_SET_PREFADER,
+ AUDIO_SET_CHANNELS,
+
+ MS_PROCESS,
+ MS_START,
+ MS_STOP,
+ MS_SET_RTC,
+
+ SEQM_IDLE,
+ SEQM_SEEK,
+ SEQM_ADD_CTRL,
+ SEQM_REMOVE_CTRL
+ };
+
+extern const char* seqMsgList[]; // for debug
+
+//---------------------------------------------------------
+// Msg
+//---------------------------------------------------------
+
+struct AudioMsg : public ThreadMsg { // this should be an union
+ int serialNo;
+ SndFile* downmix;
+ Route sroute, droute;
+ int ival;
+ int iival;
+ CVal cval1, cval2;
+ PluginI* plugin;
+ MidiPluginI* mplugin;
+ SynthI* synth;
+ Part* spart;
+ Part* dpart;
+ Track* track;
+
+ const void *p1, *p2, *p3;
+ Event ev1, ev2;
+ char port, channel, ctrl;
+ int a, b, c;
+ Pos pos;
+ unsigned time;
+ };
+
+class AudioOutput;
+
+//---------------------------------------------------------
+// Audio
+//---------------------------------------------------------
+
+class Audio {
+ public:
+ enum State {STOP, START_PLAY, PLAY, LOOP1, LOOP2, SYNC, PRECOUNT};
+
+ private:
+ bool recording; // recording is active
+ bool idle; // do nothing in idle mode
+ bool _freewheel;
+ int _bounce;
+ bool loopPassed;
+ unsigned loopFrame; // startframe of loop if in LOOP mode
+ unsigned lmark; // left loop position
+ unsigned rmark; // right loop position
+
+ Pos _pos; // current play position
+
+ unsigned curTickPos; // pos at start of frame during play/record
+ unsigned nextTickPos; // pos at start of next frame during play/record
+ int _curReadIndex;
+
+ //metronome values
+ unsigned midiClick;
+ int clickno; // precount values
+ int clicksMeasure;
+ int ticksBeat;
+
+ double syncTime; // wall clock at last sync point
+ unsigned syncFrame; // corresponding frame no. to syncTime
+ unsigned frameOffset; // offset to free running hw frame counter
+
+ State state;
+
+ AudioMsg* msg;
+ int fromThreadFdw, fromThreadFdr; // message pipe
+
+ int sigFd; // pipe fd for messages to gui
+
+ bool filterEvent(const MidiEvent* event, int type, bool thru);
+
+ void startRolling();
+ void stopRolling();
+
+ void processMsg(AudioMsg* msg);
+ void collectEvents(MidiTrack*, unsigned startTick, unsigned endTick);
+
+ public:
+ Audio();
+ virtual ~Audio() {}
+
+ Pos startRecordPos;
+ Pos endRecordPos;
+
+ void process(unsigned frames);
+ void processMidi(unsigned frames);
+ bool sync(int state, unsigned frame);
+ void shutdown();
+
+ // transport:
+ bool start();
+ void stop(bool);
+ void seek(const Pos& pos);
+
+ bool isPlaying() const { return state == PLAY || state == LOOP1 || state == LOOP2; }
+ bool isRecording() const { return state == PLAY && recording; }
+
+ //-----------------------------------------
+ // message interface
+ //-----------------------------------------
+
+ void msgSeek(const Pos&);
+ void msgPlay(bool val);
+
+ void msgRemoveTrack(Track*);
+ void msgRemoveTracks();
+ void msgMoveTrack(Track*, Track*);
+ void msgAddPart(Part*, bool u = true);
+ void msgRemovePart(Part*, bool u = true);
+ void msgChangePart(Part* oldPart, Part* newPart, bool u = true);
+ void msgAddEvent(const Event&, Part*, bool u = true);
+ void msgDeleteEvent(const Event&, Part*, bool u = true);
+ void msgChangeEvent(const Event&, const Event&, Part*, bool u = true);
+ void msgAddTempo(int tick, int tempo, bool doUndoFlag = true);
+ void msgSetTempo(int tick, int tempo, bool doUndoFlag = true);
+ void msgSetGlobalTempo(int val);
+ void msgDeleteTempo(int tick, int tempo, bool doUndoFlag = true);
+ void msgAddSig(int tick, const AL::TimeSignature&, bool doUndoFlag = true);
+ void msgRemoveSig(int tick, int z, int n, bool doUndoFlag = true);
+ void msgPanic();
+ void sendMsg(AudioMsg*);
+ bool sendMessage(AudioMsg* m, bool doUndo);
+ void msgRemoveRoute(Route, Route);
+ void msgRemoveRoute1(Route, Route);
+ void msgAddRoute(Route, Route);
+ void msgAddRoute1(Route, Route);
+ void msgAddPlugin(AudioTrack*, int idx, PluginI* plugin);
+ void msgAddMidiPlugin(MidiTrackBase*, int idx, MidiPluginI* plugin);
+ void msgSetMute(AudioTrack*, bool val);
+ void msgAddSynthI(SynthI* synth);
+ void msgRemoveSynthI(SynthI* synth);
+ void msgSetSegSize(int, int);
+ void msgSetPrefader(AudioTrack*, int);
+ void msgSetChannels(AudioTrack*, int);
+ void msgSetOff(AudioTrack*, bool);
+ void msgUndo();
+ void msgRedo();
+ void msgLocalOff();
+ void msgInitMidiDevices();
+ void msgResetMidiDevices();
+ void msgIdle(bool);
+ void msgBounce();
+ void msgAddController(Track*, int id, unsigned time, CVal);
+ void msgRemoveController(Track*, int id, unsigned time);
+ void msgSetRtc();
+
+ const Pos& pos() const { return _pos; }
+ const Pos& getStartRecordPos() const { return startRecordPos; }
+ const Pos& getEndRecordPos() const { return endRecordPos; }
+
+ int tickPos() const { return curTickPos; }
+ int timestamp() const;
+ unsigned curFrame() const;
+ bool freewheel() const { return _freewheel; }
+ void setFreewheel(bool val);
+ int getFrameOffset() const { return frameOffset; }
+ void initDevices();
+
+ void sendMsgToGui(char c);
+ bool bounce() const { return _bounce != 0; }
+ MidiEvent* getMidiEvent();
+ void popMidiEvent();
+ int curReadIndex() const { return _curReadIndex; }
+ };
+
+extern int processAudio(unsigned long, void*);
+extern void processAudio1(void*, void*);
+
+extern Audio* audio;
+class AudioDriver;
+extern AudioDriver* audioDriver; // current audio device in use
+#endif
+
diff --git a/muse/muse/audioaux.cpp b/muse/muse/audioaux.cpp
new file mode 100644
index 00000000..1f1903f4
--- /dev/null
+++ b/muse/muse/audioaux.cpp
@@ -0,0 +1,115 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "globals.h"
+#include "audioaux.h"
+#include "al/xml.h"
+#include "song.h"
+
+//---------------------------------------------------------
+// AudioAux
+//---------------------------------------------------------
+
+AudioAux::AudioAux()
+ : AudioTrack(AUDIO_AUX)
+ {
+ _channels = 0;
+ setChannels(2);
+ }
+
+//---------------------------------------------------------
+// AudioAux
+//---------------------------------------------------------
+
+AudioAux::~AudioAux()
+ {
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void AudioAux::read(QDomNode node)
+ {
+ while (!node.isNull()) {
+ AudioTrack::readProperties(node);
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void AudioAux::write(Xml& xml) const
+ {
+ xml.tag("AudioAux");
+ AudioTrack::writeProperties(xml);
+ xml.etag("AudioAux");
+ }
+
+//---------------------------------------------------------
+// setChannels
+//---------------------------------------------------------
+
+void AudioAux::setChannels(int n)
+ {
+ AudioTrack::setChannels(n);
+ }
+
+//---------------------------------------------------------
+// collectInputData
+//---------------------------------------------------------
+
+void AudioAux::collectInputData()
+ {
+ bufferEmpty = false;
+ int ctrl = AC_AUX;
+ AuxList* al = song->auxs(); // aux sends
+ int idx = 0;
+ for (iAudioAux i = al->begin(); i != al->end(); ++i, ++idx) {
+ if (*i == this) {
+ ctrl += idx;
+ break;
+ }
+ }
+ RouteList* rl = inRoutes();
+ bool copy = true;
+
+ TrackList* tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ if ((*i)->isMidiTrack())
+ continue;
+ AudioTrack* track = (AudioTrack*)(*i);
+ if (!track->hasAuxSend() || track->off() || song->bounceTrack == track)
+ continue;
+ if (copy) {
+ copy = !track->multiplyCopy(channels(), buffer, ctrl);
+ }
+ else
+ track->multiplyAdd(channels(), buffer, ctrl);
+ }
+ if (copy) {
+ for (int i = 0; i < channels(); ++i)
+ memset(buffer[i], 0, sizeof(float) * segmentSize);
+ bufferEmpty = true;
+ }
+ }
+
diff --git a/muse/muse/audioaux.h b/muse/muse/audioaux.h
new file mode 100644
index 00000000..d0a3cbc9
--- /dev/null
+++ b/muse/muse/audioaux.h
@@ -0,0 +1,50 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AUDIOAUX_H__
+#define __AUDIOAUX_H__
+
+#include "audiotrack.h"
+
+//---------------------------------------------------------
+// AudioAux
+//---------------------------------------------------------
+
+class AudioAux : public AudioTrack {
+ Q_OBJECT
+
+ protected:
+ virtual void collectInputData();
+
+ public:
+ AudioAux();
+ ~AudioAux();
+ virtual AudioAux* newTrack() const { return new AudioAux(); }
+ virtual void read(QDomNode);
+ virtual void write(Xml&) const;
+ virtual void setChannels(int n);
+ };
+
+typedef tracklist<AudioAux*>::iterator iAudioAux;
+typedef tracklist<AudioAux*>::const_iterator ciAudioAux;
+typedef tracklist<AudioAux*> AuxList;
+
+#endif
+
diff --git a/muse/muse/audiogroup.cpp b/muse/muse/audiogroup.cpp
new file mode 100644
index 00000000..c979331e
--- /dev/null
+++ b/muse/muse/audiogroup.cpp
@@ -0,0 +1,47 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "audiogroup.h"
+#include "al/xml.h"
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void AudioGroup::read(QDomNode node)
+ {
+ while (!node.isNull()) {
+ AudioTrack::readProperties(node);
+ node = node.nextSibling();
+ }
+ }
+
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void AudioGroup::write(Xml& xml) const
+ {
+ xml.tag("AudioGroup");
+ AudioTrack::writeProperties(xml);
+ xml.etag("AudioGroup");
+ }
+
diff --git a/muse/muse/audiogroup.h b/muse/muse/audiogroup.h
new file mode 100644
index 00000000..89b7fc93
--- /dev/null
+++ b/muse/muse/audiogroup.h
@@ -0,0 +1,46 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AUDIOGROUP_H__
+#define __AUDIOGROUP_H__
+
+#include "audiotrack.h"
+
+//---------------------------------------------------------
+// AudioGroup
+//---------------------------------------------------------
+
+class AudioGroup : public AudioTrack {
+ Q_OBJECT
+
+ public:
+ AudioGroup() : AudioTrack(AUDIO_GROUP) {}
+ virtual AudioGroup* newTrack() const { return new AudioGroup(); }
+ virtual void read(QDomNode);
+ virtual void write(Xml&) const;
+ virtual bool hasAuxSend() const { return true; }
+ };
+
+typedef tracklist<AudioGroup*>::iterator iAudioGroup;
+typedef tracklist<AudioGroup*>::const_iterator ciAudioGroup;
+typedef tracklist<AudioGroup*> GroupList;
+
+#endif
+
diff --git a/muse/muse/audioinput.cpp b/muse/muse/audioinput.cpp
new file mode 100644
index 00000000..fe19d1ab
--- /dev/null
+++ b/muse/muse/audioinput.cpp
@@ -0,0 +1,188 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "globals.h"
+#include "audioinput.h"
+#include "driver/jackaudio.h"
+#include "audio.h"
+
+//---------------------------------------------------------
+// AudioInput
+//---------------------------------------------------------
+
+AudioInput::AudioInput()
+ : AudioTrack(AUDIO_INPUT)
+ {
+ // set Default for Input Ports:
+ _mute = true;
+//TODO setVolume(0.0);
+ for (int i = 0; i < MAX_CHANNELS; ++i)
+ jackPorts[i] = 0;
+ _channels = 0;
+ setChannels(2);
+ //
+ // buffer pointer are filled in collectInputData()
+ // (pointer to jack buffer)
+
+ for (int i = 0; i < MAX_CHANNELS; ++i) {
+ delete[] buffer[i];
+ buffer[i] = 0;
+ }
+ }
+
+//---------------------------------------------------------
+// ~AudioInput
+//---------------------------------------------------------
+
+AudioInput::~AudioInput()
+ {
+ for (int i = 0; i < _channels; ++i)
+ audioDriver->unregisterPort(jackPorts[i]);
+ //
+ // buffers belong to JACK: zero pointer so they are
+ // not free'd by AudioTrack destructor
+ //
+ for (int i = 0; i < MAX_CHANNELS; ++i)
+ buffer[i] = 0;
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void AudioInput::write(Xml& xml) const
+ {
+ xml.tag("AudioInput");
+ AudioTrack::writeProperties(xml);
+ xml.etag("AudioInput");
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void AudioInput::read(QDomNode node)
+ {
+ for (;!node.isNull(); node = node.nextSibling()) {
+ AudioTrack::readProperties(node);
+ }
+ setName(name()); // allocate jack ports
+ }
+
+//---------------------------------------------------------
+// activate1
+// register jack port for every channel of this track
+//---------------------------------------------------------
+
+void AudioInput::activate1()
+ {
+ for (int i = 0; i < channels(); ++i) {
+ char buffer[128];
+ snprintf(buffer, 128, "%s-%d", _name.toLatin1().data(), i);
+ if (jackPorts[i])
+ printf("AudioInput::activate(): already active!\n");
+ else
+ jackPorts[i] = audioDriver->registerInPort(buffer);
+ }
+ }
+
+//---------------------------------------------------------
+// activate2
+// connect all routes to jack; can only be done if
+// jack is activ running
+//---------------------------------------------------------
+
+void AudioInput::activate2()
+ {
+ if (audioState != AUDIO_RUNNING) {
+ printf("AudioInput::activate2(): no audio running !\n");
+ abort();
+ }
+ for (iRoute i = _inRoutes.begin(); i != _inRoutes.end(); ++i) {
+ audioDriver->connect(i->port, jackPorts[i->channel]);
+ }
+ }
+
+//---------------------------------------------------------
+// deactivate
+//---------------------------------------------------------
+
+void AudioInput::deactivate()
+ {
+ for (iRoute i = _inRoutes.begin(); i != _inRoutes.end(); ++i)
+ audioDriver->disconnect(i->port, jackPorts[i->channel]);
+ for (int i = 0; i < channels(); ++i) {
+ if (jackPorts[i]) {
+ audioDriver->unregisterPort(jackPorts[i]);
+ jackPorts[i] = 0;
+ }
+ else
+ printf("AudioOutput::deactivate(): not active!\n");
+ }
+ }
+
+//---------------------------------------------------------
+// setChannels
+//---------------------------------------------------------
+
+void AudioInput::setChannels(int n)
+ {
+ if (n == _channels)
+ return;
+ AudioTrack::setChannels(n);
+ }
+
+//---------------------------------------------------------
+// setName
+//---------------------------------------------------------
+
+void AudioInput::setName(const QString& s)
+ {
+ Track::setName(s);
+ for (int i = 0; i < channels(); ++i) {
+ if (jackPorts[i]) {
+ char buffer[128];
+ snprintf(buffer, 128, "%s-%d", _name.toLatin1().data(), i);
+ if (jackPorts[i])
+ audioDriver->setPortName(jackPorts[i], buffer);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// collectInputData
+// return true if data
+//---------------------------------------------------------
+
+void AudioInput::collectInputData()
+ {
+ bufferEmpty = false;
+ for (int ch = 0; ch < channels(); ++ch) {
+ void* jackPort = jackPorts[ch];
+ if (jackPort)
+ buffer[ch] = audioDriver->getBuffer(jackPort, segmentSize);
+ else {
+ //TODO: this should crash
+ printf("NO JACK PORT\n");
+ memset(buffer[ch], 0, segmentSize * sizeof(float));
+ }
+ }
+ }
+
diff --git a/muse/muse/audioinput.h b/muse/muse/audioinput.h
new file mode 100644
index 00000000..8d22f2a7
--- /dev/null
+++ b/muse/muse/audioinput.h
@@ -0,0 +1,59 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AUDIOINPUT_H__
+#define __AUDIOINPUT_H__
+
+#include "audiotrack.h"
+
+//---------------------------------------------------------
+// AudioInput
+//---------------------------------------------------------
+
+class AudioInput : public AudioTrack {
+ Q_OBJECT
+
+ void* jackPorts[MAX_CHANNELS];
+ virtual void collectInputData();
+
+ public:
+ AudioInput();
+ virtual ~AudioInput();
+ virtual AudioInput* newTrack() const { return new AudioInput(); }
+
+ virtual void activate1();
+ virtual void activate2();
+ virtual void deactivate();
+
+ virtual void read(QDomNode);
+ virtual void write(Xml&) const;
+ virtual void setName(const QString& s);
+ void* jackPort(int channel) { return jackPorts[channel]; }
+ void setJackPort(int channel, void*p) { jackPorts[channel] = p; }
+ virtual void setChannels(int n);
+ virtual bool hasAuxSend() const { return true; }
+ };
+
+typedef tracklist<AudioInput*>::iterator iAudioInput;
+typedef tracklist<AudioInput*>::const_iterator ciAudioInput;
+typedef tracklist<AudioInput*> InputList;
+
+#endif
+
diff --git a/muse/muse/audiooutput.cpp b/muse/muse/audiooutput.cpp
new file mode 100644
index 00000000..fbaac33c
--- /dev/null
+++ b/muse/muse/audiooutput.cpp
@@ -0,0 +1,222 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "audiooutput.h"
+// #include "driver/alsamidi.h"
+#include "driver/jackaudio.h"
+#include "audio.h"
+#include "globals.h"
+#include "song.h"
+#include "ticksynth.h"
+
+//---------------------------------------------------------
+// AudioOutput
+//---------------------------------------------------------
+
+AudioOutput::AudioOutput()
+ : AudioTrack(AUDIO_OUTPUT)
+ {
+ for (int i = 0; i < MAX_CHANNELS; ++i)
+ jackPorts[i] = 0;
+ _channels = 0;
+ setChannels(2);
+ }
+
+//---------------------------------------------------------
+// ~AudioOutput
+//---------------------------------------------------------
+
+AudioOutput::~AudioOutput()
+ {
+ for (int i = 0; i < _channels; ++i)
+ audioDriver->unregisterPort(jackPorts[i]);
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void AudioOutput::write(Xml& xml) const
+ {
+ xml.tag("AudioOutput");
+ AudioTrack::writeProperties(xml);
+ xml.etag("AudioOutput");
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void AudioOutput::read(QDomNode node)
+ {
+ while (!node.isNull()) {
+ AudioTrack::readProperties(node);
+ node = node.nextSibling();
+ }
+ setName(name()); // allocate jack ports
+ }
+
+
+//---------------------------------------------------------
+// setChannels
+//---------------------------------------------------------
+
+void AudioOutput::setChannels(int n)
+ {
+ if (n == _channels)
+ return;
+ AudioTrack::setChannels(n);
+ }
+
+//---------------------------------------------------------
+// silence
+//---------------------------------------------------------
+
+void AudioOutput::silence(unsigned n)
+ {
+ for (int i = 0; i < channels(); ++i) {
+ if (jackPorts[i])
+ buffer[i] = audioDriver->getBuffer(jackPorts[i], n);
+ else {
+ printf("PANIC: silence(): no buffer from audio driver\n");
+ abort();
+ return;
+ }
+ }
+ for (int i = 0; i < channels(); ++i)
+ memset(buffer[i], 0, n * sizeof(float));
+ }
+
+//---------------------------------------------------------
+// setName
+//---------------------------------------------------------
+
+void AudioOutput::setName(const QString& s)
+ {
+ Track::setName(s);
+ for (int i = 0; i < channels(); ++i) {
+ if (jackPorts[i]) {
+ char buffer[128];
+ snprintf(buffer, 128, "%s-%d", _name.toLatin1().data(), i);
+ audioDriver->setPortName(jackPorts[i], buffer);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// activate1
+//---------------------------------------------------------
+
+void AudioOutput::activate1()
+ {
+ for (int i = 0; i < channels(); ++i) {
+ char buffer[128];
+ snprintf(buffer, 128, "%s-%d", _name.toLatin1().data(), i);
+ if (jackPorts[i]) {
+ printf("AudioOutput::activate(): already active!\n");
+ }
+ else
+ jackPorts[i] = audioDriver->registerOutPort(QString(buffer));
+ }
+ }
+
+//---------------------------------------------------------
+// activate2
+//---------------------------------------------------------
+
+void AudioOutput::activate2()
+ {
+ if (audioState != AUDIO_RUNNING) {
+ printf("AudioOutput::activate2(): no audio running !\n");
+ abort();
+ }
+ for (iRoute i = _outRoutes.begin(); i != _outRoutes.end(); ++i) {
+ i->port = audioDriver->findPort(i->name());
+ audioDriver->connect(jackPorts[i->channel], i->port);
+ }
+ }
+
+//---------------------------------------------------------
+// deactivate
+//---------------------------------------------------------
+
+void AudioOutput::deactivate()
+ {
+ for (iRoute i = _outRoutes.begin(); i != _outRoutes.end(); ++i) {
+ Route r = *i;
+ audioDriver->disconnect(jackPorts[i->channel], i->port);
+ }
+ for (int i = 0; i < channels(); ++i) {
+ if (jackPorts[i]) {
+ audioDriver->unregisterPort(jackPorts[i]);
+ jackPorts[i] = 0;
+ }
+ else
+ printf("AudioOutput::deactivate(): not active!\n");
+ }
+ }
+
+//---------------------------------------------------------
+// stopRecording
+// gui context
+//---------------------------------------------------------
+
+void AudioOutput::stopRecording(const Pos& s, const Pos& e)
+ {
+ SndFile* sf = recFile();
+ if (sf)
+ delete sf; // close
+ setRecFile(0);
+ setRecordFlag(false);
+ }
+
+//---------------------------------------------------------
+// process
+// synthesize "n" frames at buffer offset "offset"
+// current frame position is "pos"
+//---------------------------------------------------------
+
+void AudioOutput::process()
+ {
+ AudioTrack::process();
+
+ int n = segmentSize;
+ if (audio->isRecording() && recordFlag() && _recFile) {
+ // bounce to file
+ if (audio->freewheel())
+ _recFile->write(channels(), buffer, n);
+ else
+ putFifo(channels(), n, buffer);
+ }
+#if 0
+ if (audioClickFlag && song->click() && metronome) {
+ float b[n];
+ float* bp[1];
+ bp[0] = b;
+ metronome->getData(pos, 1, n, bp);
+ for (unsigned i = 0; i < n; ++i) {
+ for (int k = 0; k < channels(); ++k)
+ buffer[k][i] += b[i] * audioClickVolume;
+ }
+ }
+#endif
+ }
+
+
diff --git a/muse/muse/audiooutput.h b/muse/muse/audiooutput.h
new file mode 100644
index 00000000..ca4a9792
--- /dev/null
+++ b/muse/muse/audiooutput.h
@@ -0,0 +1,68 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AUDIOOUTPUT_H__
+#define __AUDIOOUTPUT_H__
+
+#include "audiotrack.h"
+
+//---------------------------------------------------------
+// AudioOutput
+//---------------------------------------------------------
+
+class AudioOutput : public AudioTrack {
+ Q_OBJECT
+
+ void* jackPorts[MAX_CHANNELS];
+ float* buffer[MAX_CHANNELS];
+ unsigned long _nframes;
+
+ float* _monitorBuffer[MAX_CHANNELS];
+
+ public:
+ AudioOutput();
+ virtual ~AudioOutput();
+ virtual AudioOutput* newTrack() const { return new AudioOutput(); }
+
+ virtual void activate1();
+ virtual void activate2();
+ virtual void deactivate();
+
+ virtual void read(QDomNode);
+ virtual void write(Xml&) const;
+ virtual void setName(const QString& s);
+ void* jackPort(int channel) { return jackPorts[channel]; }
+ void setJackPort(int channel, void*p) { jackPorts[channel] = p; }
+ virtual void setChannels(int n);
+
+ virtual bool canRecord() const { return true; }
+ virtual void stopRecording(const AL::Pos&, const AL::Pos&);
+
+ float** monitorBuffer() { return _monitorBuffer; }
+ void silence(unsigned);
+ virtual void process();
+ };
+
+typedef tracklist<AudioOutput*>::iterator iAudioOutput;
+typedef tracklist<AudioOutput*>::const_iterator ciAudioOutput;
+typedef tracklist<AudioOutput*> OutputList;
+
+#endif
+
diff --git a/muse/muse/audioprefetch.cpp b/muse/muse/audioprefetch.cpp
new file mode 100644
index 00000000..23f895f7
--- /dev/null
+++ b/muse/muse/audioprefetch.cpp
@@ -0,0 +1,201 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include <poll.h>
+
+#include "audioprefetch.h"
+#include "globals.h"
+#include "track.h"
+#include "song.h"
+#include "audio.h"
+#include "sync.h"
+#include "fifo.h"
+
+enum { PREFETCH_TICK, PREFETCH_SEEK };
+
+//---------------------------------------------------------
+// PrefetchMsg
+//---------------------------------------------------------
+
+struct PrefetchMsg : public ThreadMsg {
+ int pos;
+ };
+
+AudioPrefetch* audioPrefetch;
+
+//---------------------------------------------------------
+// AudioPrefetch
+//---------------------------------------------------------
+
+AudioPrefetch::AudioPrefetch(const char* name)
+ : Thread(name)
+ {
+ seekPos = ~0;
+ writePos = ~0;
+ seekCount = 0;
+ }
+
+//---------------------------------------------------------
+// readMsg
+//---------------------------------------------------------
+
+static void readMsgP(void* p, void*)
+ {
+ AudioPrefetch* at = (AudioPrefetch*)p;
+ at->readMsg1(sizeof(PrefetchMsg));
+ }
+
+//---------------------------------------------------------
+// start
+//---------------------------------------------------------
+
+void AudioPrefetch::start(int priority)
+ {
+ clearPollFd();
+ addPollFd(toThreadFdr, POLLIN, ::readMsgP, this, 0);
+ Thread::start(priority);
+ }
+
+//---------------------------------------------------------
+// ~AudioPrefetch
+//---------------------------------------------------------
+
+AudioPrefetch::~AudioPrefetch()
+ {
+ }
+
+//---------------------------------------------------------
+// processMsg
+//---------------------------------------------------------
+
+void AudioPrefetch::processMsg1(const void* m)
+ {
+ const PrefetchMsg* msg = (PrefetchMsg*)m;
+ switch(msg->id) {
+ case PREFETCH_TICK:
+// printf("!");fflush(stdout);
+ prefetch(false);
+ seekPos = ~0; // invalidate cached last seek position
+ break;
+
+ case PREFETCH_SEEK:
+ // process seek in background
+ seek(msg->pos);
+ break;
+
+ default:
+ printf("AudioPrefetch::processMsg1: unknown message\n");
+ }
+ }
+
+//---------------------------------------------------------
+// msgTick
+// trigger audio prefetch with next buffer position
+//---------------------------------------------------------
+
+void AudioPrefetch::msgTick(unsigned pos)
+ {
+ PrefetchMsg msg;
+ msg.id = PREFETCH_TICK;
+// msg.pos = pos;
+// msg.serialNo = 0;
+ if (fifo.count() < FIFO_BUFFER/3) {
+ while (sendMsg1(&msg, sizeof(msg))) {
+ printf("AudioPrefetch::msgTick(): send failed!\n");
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// msgSeek
+// called from audio RT context
+//---------------------------------------------------------
+
+void AudioPrefetch::msgSeek(unsigned samplePos)
+ {
+ //
+ // optimize unecessary seeks; seekPos is invalidated on
+ // first prefetch tick
+ //
+ if (samplePos == seekPos)
+ return;
+
+ q_atomic_increment(&seekCount);
+ PrefetchMsg msg;
+ msg.id = PREFETCH_SEEK;
+ msg.pos = samplePos;
+ msg.serialNo = 0;
+ while (sendMsg1(&msg, sizeof(msg))) {
+ printf("AudioPrefetch::msgSeek::sleep(1)\n");
+ sleep(1);
+ }
+ }
+
+//---------------------------------------------------------
+// prefetch
+//---------------------------------------------------------
+
+void AudioPrefetch::prefetch(bool seekFlag)
+ {
+ WaveTrackList* tl = song->waves();
+ if (tl->empty())
+ return;
+ while (fifo.count() < FIFO_BUFFER) {
+ if (song->loop() && !audio->bounce() && !extSyncFlag) {
+ unsigned rpos = song->rPos().frame();
+ unsigned n = rpos - writePos;
+ //
+ // dont loop if we are beyond right marker
+ //
+ if (writePos <= rpos && (n < segmentSize)) {
+ unsigned lpos = song->lPos().frame();
+ // adjust loop start so we get exact loop len
+ if (n > lpos)
+ n = 0;
+ writePos = lpos - n;
+ }
+ }
+ int widx = fifo.setWritePos(writePos);
+ for (iWaveTrack it = tl->begin(); it != tl->end(); ++it) {
+ WaveTrack* track = *it;
+ if (!seekFlag && ((audio->isRecording() && track->recordFlag()) || !audio->isPlaying()))
+ continue;
+ int ch = track->channels();
+ float** bpp = track->prefetchBuffer(widx);
+ track->fetchData(writePos, segmentSize, bpp);
+ }
+ writePos += segmentSize;
+ fifo.put();
+ }
+ }
+
+//---------------------------------------------------------
+// seek
+//---------------------------------------------------------
+
+void AudioPrefetch::seek(unsigned seekTo)
+ {
+ fifo.clear();
+ writePos = seekTo;
+ prefetch(true);
+ seekPos = seekTo;
+ q_atomic_decrement(&seekCount);
+ }
+
diff --git a/muse/muse/audioprefetch.h b/muse/muse/audioprefetch.h
new file mode 100644
index 00000000..b456989a
--- /dev/null
+++ b/muse/muse/audioprefetch.h
@@ -0,0 +1,54 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AUDIOPREFETCH_H__
+#define __AUDIOPREFETCH_H__
+
+#include "thread.h"
+#include "fifo.h"
+
+//---------------------------------------------------------
+// AudioPrefetch
+//---------------------------------------------------------
+
+class AudioPrefetch : public Thread {
+ Fifo1 fifo;
+ unsigned writePos;
+ unsigned seekPos; // remember last seek to optimize seeks
+
+ virtual void processMsg1(const void*);
+ void prefetch(bool seekFlag);
+ void seek(unsigned pos);
+ volatile int seekCount;
+
+ public:
+ AudioPrefetch(const char* name);
+ ~AudioPrefetch();
+ virtual void start(int);
+
+ void msgTick(unsigned pos);
+ void msgSeek(unsigned pos);
+ bool seekDone() const { return seekCount == 0; }
+ Fifo1* getFifo() { return &fifo; }
+ };
+
+extern AudioPrefetch* audioPrefetch;
+
+#endif
diff --git a/muse/muse/audiotrack.cpp b/muse/muse/audiotrack.cpp
new file mode 100644
index 00000000..fdeffafc
--- /dev/null
+++ b/muse/muse/audiotrack.cpp
@@ -0,0 +1,565 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al/al.h"
+#include "track.h"
+#include "event.h"
+#include "song.h"
+#include "audio.h"
+#include "wave.h"
+#include "al/xml.h"
+#include "plugin.h"
+#include "driver/audiodev.h"
+#include "gconfig.h"
+
+//---------------------------------------------------------
+// AudioTrack
+//---------------------------------------------------------
+
+AudioTrack::AudioTrack(TrackType t)
+ : Track(t)
+ {
+ _tt = AL::FRAMES;
+ _prefader = false;
+ _efxPipe = new Pipeline();
+ _recFile = 0;
+ _channels = 0;
+ bufferEmpty = false;
+ setChannels(1);
+
+ //
+ // add two managed standard controller:
+ // volume and pan
+ //
+ Ctrl* c;
+ c = new Ctrl(AC_VOLUME, "Volume");
+ c->setType(Ctrl::INTERPOLATE | Ctrl::LOG);
+ c->setRange(pow(10.0f, config.minSlider*0.05f), 2.0f);
+
+ addController(c);
+ c = new Ctrl(AC_PAN, "Pan");
+ c->setRange(-1.0f, +1.0f);
+ addController(c);
+
+ buffer = new float*[MAX_CHANNELS];
+ for (int i = 0; i < MAX_CHANNELS; ++i)
+ buffer[i] = new float[segmentSize];
+ }
+
+//---------------------------------------------------------
+// ~AudioTrack
+//---------------------------------------------------------
+
+AudioTrack::~AudioTrack()
+ {
+ delete _efxPipe;
+ for (int i = 0; i < MAX_CHANNELS; ++i) {
+ if (buffer[i])
+ delete[] buffer[i];
+ }
+ delete[] buffer;
+ }
+
+//---------------------------------------------------------
+// newPart
+//---------------------------------------------------------
+
+Part* AudioTrack::newPart(Part*, bool /*clone*/)
+ {
+ return 0;
+ }
+
+//---------------------------------------------------------
+// addPlugin
+// idx = -1 insert into first free slot
+//---------------------------------------------------------
+
+void AudioTrack::addPlugin(PluginI* plugin, int idx)
+ {
+ if (plugin == 0) {
+ PluginI* oldPlugin = (*_efxPipe)[idx];
+ if (oldPlugin) {
+ int controller = oldPlugin->plugin()->parameter();
+ for (int i = 0; i < controller; ++i) {
+ int id = (idx + 1) * 0x1000 + i;
+ removeController(id);
+ }
+ }
+ }
+ if (idx == -1) {
+ idx = 0;
+ for (; idx < 4; ++idx) {
+ if ((*_efxPipe)[idx] == 0)
+ break;
+ }
+ if (idx == 4) {
+ printf("internal error: too many plugins\n");
+ return;
+ }
+ }
+
+ efxPipe()->insert(plugin, idx);
+ if (plugin) {
+ int ncontroller = plugin->plugin()->parameter();
+ for (int i = 0; i < ncontroller; ++i) {
+ int id = (idx + 1) * 0x1000 + i;
+ QString name(plugin->getParameterName(i));
+ float min, max;
+ plugin->range(i, &min, &max);
+ Ctrl* cl = getController(id);
+ if (cl == 0) {
+ cl = new Ctrl(id, name);
+ cl->setRange(min, max);
+ float defaultValue = plugin->defaultValue(i);
+ cl->setDefault(defaultValue);
+ cl->setCurVal(defaultValue);
+ addController(cl);
+ }
+ plugin->setParam(i, cl->schedVal().f);
+ plugin->setControllerList(cl);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// plugin
+//---------------------------------------------------------
+
+PluginI* AudioTrack::plugin(int idx) const
+ {
+ return (*_efxPipe)[idx];
+ }
+
+//---------------------------------------------------------
+// addAuxSend
+//---------------------------------------------------------
+
+void AudioTrack::addAuxSend(int n)
+ {
+ if (n >= NUM_AUX) {
+ printf("too many aux sends (>%d)\n", n);
+ n = NUM_AUX;
+ }
+ for (int i = 0; i < n; ++i) {
+ Ctrl* c = getController(AC_AUX + i);
+ if (c)
+ continue;
+ QString s("AuxSend-");
+ s += QString("%1").arg(i+1);
+ Ctrl* ctrl = new Ctrl(AC_AUX + i, s);
+ addController(ctrl);
+ }
+ }
+
+//---------------------------------------------------------
+// AudioTrack::writeProperties
+//---------------------------------------------------------
+
+void AudioTrack::writeProperties(Xml& xml) const
+ {
+ Track::writeProperties(xml);
+ xml.intTag("prefader", prefader());
+ for (ciPluginI ip = _efxPipe->begin(); ip != _efxPipe->end(); ++ip) {
+ if (*ip)
+ (*ip)->writeConfiguration(xml);
+ }
+ }
+
+//---------------------------------------------------------
+// AudioTrack::readProperties
+//---------------------------------------------------------
+
+bool AudioTrack::readProperties(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ if (tag == "plugin") {
+ PluginI* pi = new PluginI(this);
+ if (pi->readConfiguration(node)) {
+ delete pi;
+ }
+ else {
+ // insert plugin into first free slot
+ // of plugin rack
+ addPlugin(pi, -1);
+ }
+ }
+ else if (tag == "prefader")
+ _prefader = e.text().toInt();
+ else if (tag == "recfile")
+ readRecfile(node.firstChild());
+ else
+ return Track::readProperties(node);
+ return false;
+ }
+
+//---------------------------------------------------------
+// setAutoRead
+//---------------------------------------------------------
+
+void AudioTrack::setAutoRead(bool val)
+ {
+ if (_autoRead != val) {
+ _autoRead = val;
+ emit autoReadChanged(_autoRead);
+ }
+ }
+
+//---------------------------------------------------------
+// setAutoWrite
+//---------------------------------------------------------
+
+void AudioTrack::setAutoWrite(bool val)
+ {
+ if (_autoWrite != val) {
+ _autoWrite = val;
+ emit autoWriteChanged(_autoWrite);
+ }
+ }
+
+//---------------------------------------------------------
+// isMute
+//---------------------------------------------------------
+
+bool AudioTrack::isMute() const
+ {
+ if (_solo)
+ return false;
+ if (song->solo())
+ return true;
+ return _mute;
+ }
+
+//---------------------------------------------------------
+// setSolo
+//---------------------------------------------------------
+
+bool AudioTrack::setSolo(bool val)
+ {
+ if (Track::setSolo(val)) {
+ if (mute())
+ resetMeter();
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// readRecfile
+//---------------------------------------------------------
+
+void AudioTrack::readRecfile(QDomNode node)
+ {
+ QString path;
+ int channels = 2;
+ int format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag(e.nodeName());
+ if (tag == "path")
+ path = e.text();
+ else if (tag == "channels")
+ channels = e.text().toInt();
+ else if (tag == "format")
+ format = e.text().toInt();
+ else
+ printf("MusE:readRecfile: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ if (QFile::exists(path)) {
+ setRecFile(SndFile::getWave(path, true));
+ }
+ else {
+ setRecFile(new SndFile(path));
+ recFile()->setFormat(format, channels, AL::sampleRate);
+ if (recFile()->openWrite()) {
+ fprintf(stderr, "create wave file(%s) failed: %s\n",
+ path.toLatin1().data(), recFile()->strerror().toLatin1().data());
+ delete _recFile;
+ _recFile = 0;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// putFifo
+//---------------------------------------------------------
+
+void AudioTrack::putFifo(int channels, unsigned long n, float** bp)
+ {
+ if (fifo.put(channels, n, bp, audio->pos().frame())) {
+ printf("AudioTrack(%s)::putFifo(): overrun\n", name().toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// setMute
+//---------------------------------------------------------
+
+bool AudioTrack::setMute(bool f)
+ {
+ if (Track::setMute(f)) {
+ resetAllMeter();
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// setOff
+//---------------------------------------------------------
+
+bool AudioTrack::setOff(bool val)
+ {
+ if (Track::setOff(val)) {
+ resetAllMeter();
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// setPrefader
+//---------------------------------------------------------
+
+void AudioTrack::setPrefader(bool val)
+ {
+ _prefader = val;
+ if (!_prefader && isMute())
+ resetAllMeter();
+ }
+
+//---------------------------------------------------------
+// record
+// called from audio writeback task
+//---------------------------------------------------------
+
+void AudioTrack::record()
+ {
+ float* recBuffer[_channels];
+
+ if (fifo.get(_channels, segmentSize, recBuffer)) {
+ printf("AudioTrack(%s)::record():: fifo underflow\n",
+ name().toLatin1().data());
+ return;
+ }
+ if (_recFile) {
+ _recFile->write(_channels, recBuffer, segmentSize);
+ }
+ else {
+ printf("AudioTrack(%s)::record(): no recFile\n",
+ name().toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// setChannels
+//---------------------------------------------------------
+
+void AudioTrack::setChannels(int n)
+ {
+ Track::setChannels(n);
+ if (_efxPipe)
+ _efxPipe->setChannels(n);
+ }
+
+//---------------------------------------------------------
+// startRecording
+//---------------------------------------------------------
+
+void AudioTrack::startRecording()
+ {
+ if (!recordFlag())
+ return;
+ if (!_recFile)
+ _recFile = SndFile::createRecFile(_channels);
+ _recFile->openWrite();
+ if (debugMsg)
+ printf("AudioTrack::startRecording: create internal file %s\n",
+ _recFile->finfo()->filePath().toLatin1().data());
+ }
+
+//---------------------------------------------------------
+// process
+// this is called only once per cycle
+//---------------------------------------------------------
+
+void AudioTrack::process()
+ {
+ if (_off) {
+ bufferEmpty = true;
+ return;
+ }
+ collectInputData();
+
+ //---------------------------------------------------
+ // apply plugin chain
+ //---------------------------------------------------
+
+ _efxPipe->apply(channels(), segmentSize, buffer);
+
+ //---------------------------------------------------
+ // metering
+ //---------------------------------------------------
+
+ double vol[2];
+ double _volume = ctrlVal(AC_VOLUME).f;
+ if (_volume == 0.0 || bufferEmpty) {
+ for (int i = 0; i < channels(); ++i)
+ setMeter(i, 0.0);
+ }
+ else {
+ double _pan = ctrlVal(AC_PAN).f;
+ vol[0] = _volume * (1.0 - _pan);
+ vol[1] = _volume * (1.0 + _pan);
+
+ for (int i = 0; i < channels(); ++i) {
+ float* p = buffer[i];
+ float meter = 0.0;
+ for (unsigned k = 0; k < segmentSize; ++k) {
+ double f = fabs(*p);
+ if (f > meter)
+ meter = f;
+ ++p;
+ }
+ if (!_prefader)
+ meter *= (vol[i] * (_mute ? 0.0 : 1.0));
+ setMeter(i, meter);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// multiplyAdd
+//---------------------------------------------------------
+
+void AudioTrack::multiplyAdd(int dstChannels, float** dstBuffer, int ctrl)
+ {
+ double _volume = ctrlVal(ctrl).f;
+ if (_mute || bufferEmpty || _volume == 0.0)
+ return;
+ int srcChannels = channels();
+ double vol[2];
+ double _pan = ctrlVal(AC_PAN).f;
+ vol[0] = _volume * (1.0 - _pan);
+ vol[1] = _volume * (1.0 + _pan);
+
+ if (srcChannels == dstChannels) {
+ for (int c = 0; c < dstChannels; ++c) {
+ float* sp = buffer[c];
+ float* dp = dstBuffer[c];
+ float v = vol[c];
+ for (unsigned k = 0; k < segmentSize; ++k)
+ dp[k] += (sp[k] * v);
+ }
+ }
+ else if (srcChannels == 1 && dstChannels == 2) {
+ for (int c = 0; c < dstChannels; ++c) {
+ float* dp = dstBuffer[c];
+ float* sp = buffer[0];
+ float v = vol[c];
+ for (unsigned k = 0; k < segmentSize; ++k)
+ dp[k] += (sp[k] * v);
+ }
+ }
+ else if (srcChannels == 2 && dstChannels == 1) {
+ float* sp1 = buffer[0];
+ float* sp2 = buffer[1];
+ float* dp = dstBuffer[0];
+ for (unsigned k = 0; k < segmentSize; ++k)
+ dp[k] += (sp1[k] * vol[0] + sp2[k] * vol[1]);
+ }
+ }
+
+//---------------------------------------------------------
+// multiplyCopy
+// return false if multiply by zero
+//---------------------------------------------------------
+
+bool AudioTrack::multiplyCopy(int dstChannels, float** dstBuffer, int ctrl)
+ {
+ double _volume = ctrlVal(ctrl).f;
+ if (_mute || bufferEmpty || _volume == 0.0)
+ return false;
+ int srcChannels = channels();
+ double vol[2];
+ double _pan = ctrlVal(AC_PAN).f;
+ vol[0] = _volume * (1.0 - _pan);
+ vol[1] = _volume * (1.0 + _pan);
+
+ if (srcChannels == dstChannels) {
+ for (int c = 0; c < dstChannels; ++c) {
+ float* sp = buffer[c];
+ float* dp = dstBuffer[c];
+ for (unsigned k = 0; k < segmentSize; ++k) {
+ *dp++ = *sp++ * vol[c];
+ }
+ }
+ }
+ else if (srcChannels == 1 && dstChannels == 2) {
+ float* sp = buffer[0];
+ for (unsigned k = 0; k < segmentSize; ++k) {
+ float val = *sp++;
+ *(dstBuffer[0] + k) = val * vol[0];
+ *(dstBuffer[1] + k) = val * vol[1];
+ }
+ }
+ else if (srcChannels == 2 && dstChannels == 1) {
+ float* sp1 = buffer[0];
+ float* sp2 = buffer[1];
+ float* dp = dstBuffer[0];
+ for (unsigned k = 0; k < segmentSize; ++k) {
+ float val1 = *sp1++ * vol[0];
+ float val2 = *sp2++ * vol[1];
+ *dp++ = (val1 + val2);
+ }
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// collectInputData
+//---------------------------------------------------------
+
+void AudioTrack::collectInputData()
+ {
+ bufferEmpty = false;
+ RouteList* rl = inRoutes();
+ bool copy = true;
+ for (iRoute ir = rl->begin(); ir != rl->end(); ++ir) {
+ AudioTrack* track = (AudioTrack*)ir->track;
+ if (track->off() || song->bounceTrack == track)
+ continue;
+ if (copy)
+ copy = !track->multiplyCopy(channels(), buffer);
+ else
+ track->multiplyAdd(channels(), buffer);
+ }
+ if (copy) {
+ //
+ // no input,
+ // fill with silence
+ //
+ for (int i = 0; i < channels(); ++i)
+ memset(buffer[i], 0, sizeof(float) * segmentSize);
+ bufferEmpty = true;
+ }
+ }
+
diff --git a/muse/muse/audiotrack.h b/muse/muse/audiotrack.h
new file mode 100644
index 00000000..312a9127
--- /dev/null
+++ b/muse/muse/audiotrack.h
@@ -0,0 +1,94 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AUDIOTRACK_H__
+#define __AUDIOTRACK_H__
+
+#include "fifo.h"
+#include "track.h"
+
+class PluginI;
+
+//---------------------------------------------------------
+// AudioTrack
+//---------------------------------------------------------
+
+class AudioTrack : public Track {
+ Q_OBJECT
+
+ bool _prefader; // prefader metering
+ Pipeline* _efxPipe;
+
+ void readRecfile(QDomNode);
+
+ protected:
+ float** buffer;
+ bool bufferEmpty; // set by process() to optimize
+ // data flow
+
+ SndFile* _recFile;
+ Fifo fifo; // fifo -> _recFile
+
+ virtual bool setMute(bool val);
+ virtual bool setOff(bool val);
+ virtual bool setSolo(bool val);
+ virtual void collectInputData();
+
+ private slots:
+ virtual void setAutoRead(bool);
+ virtual void setAutoWrite(bool);
+
+ public:
+ AudioTrack(TrackType t);
+ virtual ~AudioTrack();
+
+ bool readProperties(QDomNode);
+ void writeProperties(Xml&) const;
+
+ virtual Part* newPart(Part*p=0, bool clone=false);
+
+ SndFile* recFile() const { return _recFile; }
+ void setRecFile(SndFile* sf) { _recFile = sf; }
+
+ virtual void setChannels(int n);
+
+ virtual bool isMute() const;
+
+ void putFifo(int channels, unsigned long n, float** bp);
+
+ void record();
+ virtual void startRecording();
+ virtual void stopRecording(const AL::Pos&, const AL::Pos&) {}
+
+ bool prefader() const { return _prefader; }
+ void addAuxSend(int n);
+
+ void setPrefader(bool val);
+ Pipeline* efxPipe() { return _efxPipe; }
+ void addPlugin(PluginI* plugin, int idx);
+ PluginI* plugin(int idx) const;
+
+ virtual bool hasAuxSend() const { return false; }
+ virtual void process();
+ void multiplyAdd(int channel, float**, int ctrl = AC_VOLUME);
+ bool multiplyCopy(int channel, float**, int ctrl = AC_VOLUME);
+ };
+
+#endif
diff --git a/muse/muse/audiowriteback.cpp b/muse/muse/audiowriteback.cpp
new file mode 100644
index 00000000..0b54e253
--- /dev/null
+++ b/muse/muse/audiowriteback.cpp
@@ -0,0 +1,98 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include <poll.h>
+
+#include "audiowriteback.h"
+#include "globals.h"
+#include "audio.h"
+#include "song.h"
+
+AudioWriteback* audioWriteback;
+
+//---------------------------------------------------------
+// AudioWriteback
+//---------------------------------------------------------
+
+AudioWriteback::AudioWriteback(const char* name)
+ : Thread(name)
+ {
+ counter = 0;
+ }
+
+//---------------------------------------------------------
+// readMsg
+//---------------------------------------------------------
+
+static void readMsgP(void* p, void*)
+ {
+ AudioWriteback* at = (AudioWriteback*)p;
+ at->readMsg1(1);
+ }
+
+//---------------------------------------------------------
+// start
+//---------------------------------------------------------
+
+void AudioWriteback::start(int priority)
+ {
+ clearPollFd();
+ addPollFd(toThreadFdr, POLLIN, ::readMsgP, this, 0);
+ Thread::start(priority);
+ }
+
+//---------------------------------------------------------
+// processMsg
+//---------------------------------------------------------
+
+void AudioWriteback::processMsg1(const void* m)
+ {
+ while (counter) {
+ q_atomic_decrement(&counter);
+ OutputList* ol = song->outputs();
+ if (!ol->empty()) {
+ AudioOutput* ao = ol->front();
+ if (ao->recordFlag())
+ ao->record();
+ }
+ WaveTrackList* tl = song->waves();
+ for (iWaveTrack t = tl->begin(); t != tl->end(); ++t) {
+ WaveTrack* track = *t;
+ if (track->recordFlag())
+ track->record();
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// trigger
+// trigger audio writeback loop
+//---------------------------------------------------------
+
+void AudioWriteback::trigger()
+ {
+ q_atomic_increment(&counter);
+ if (counter < 2) {
+ if (sendMsg1("0", 1)) {
+ printf("AudioWriteback::msgTick(): send failed!\n");
+ }
+ }
+ }
+
diff --git a/muse/muse/audiowriteback.h b/muse/muse/audiowriteback.h
new file mode 100644
index 00000000..000ff2f1
--- /dev/null
+++ b/muse/muse/audiowriteback.h
@@ -0,0 +1,44 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AUDIOWRITEBACK_H__
+#define __AUDIOWRITEBACK_H__
+
+#include "thread.h"
+
+//---------------------------------------------------------
+// AudioWriteback
+//---------------------------------------------------------
+
+class AudioWriteback : public Thread {
+ virtual void processMsg1(const void*);
+ volatile int counter;
+
+ public:
+ AudioWriteback(const char* name);
+ ~AudioWriteback() {}
+ virtual void start(int);
+ void trigger();
+ bool active() const { return counter > 0; }
+ };
+
+extern AudioWriteback* audioWriteback;
+
+#endif
diff --git a/muse/muse/bench b/muse/muse/bench
new file mode 100644
index 00000000..0ddfce52
--- /dev/null
+++ b/muse/muse/bench
@@ -0,0 +1,4 @@
+ text data bss dec hex filename
+1818913 47752 13576 1880241 1cb0b1 muse
+ text data bss dec hex filename
+1820129 47520 13576 1881225 1cb489 muse
diff --git a/muse/muse/cliplist/cliplist.cpp b/muse/muse/cliplist/cliplist.cpp
new file mode 100644
index 00000000..b39fa367
--- /dev/null
+++ b/muse/muse/cliplist/cliplist.cpp
@@ -0,0 +1,251 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: cliplist.cpp,v 1.10 2005/09/22 20:12:59 wschweer Exp $
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "cliplist.h"
+#include "song.h"
+#include "globals.h"
+#include "wave.h"
+#include "xml.h"
+// #include "posedit.h"
+#include "cliplisteditorbase.h"
+//Added by qt3to4:
+#include <QCloseEvent>
+
+extern int mtcType;
+enum { COL_NAME=0, COL_REFS, COL_POS, COL_LEN };
+
+//---------------------------------------------------------
+// ClipItem
+//---------------------------------------------------------
+
+class ClipItem : public Q3ListViewItem {
+ SndFileR _wf;
+
+ virtual QString text(int) const;
+
+ public:
+ ClipItem(Q3ListView*, const SndFileR&);
+ SndFileR* wf() { return &_wf; }
+ };
+
+ClipItem::ClipItem(Q3ListView* parent, const SndFileR& w)
+ : Q3ListViewItem(parent), _wf(w)
+ {
+ }
+
+//---------------------------------------------------------
+// samples2smpte
+//---------------------------------------------------------
+
+#if 0
+static QString samples2smpte(int samples)
+ {
+ double time = double(samples) / double(sampleRate);
+ int min = int(time) / 60;
+ int sec = int(time) % 60;
+ double rest = time - (min * 60 + sec);
+ switch(mtcType) {
+ case 0: // 24 frames sec
+ rest *= 24;
+ break;
+ case 1: // 25
+ rest *= 25;
+ break;
+ case 2: // 30 drop frame
+ rest *= 30;
+ break;
+ case 3: // 30 non drop frame
+ rest *= 30;
+ break;
+ }
+ int frame = int(rest);
+ int subframe = int((rest-frame)*100);
+ QString s;
+ s.sprintf("%03d:%02d:%02d:%02d", min, sec, frame, subframe);
+ return s;
+ }
+#endif
+
+//---------------------------------------------------------
+// text
+//---------------------------------------------------------
+
+QString ClipItem::text(int col) const
+ {
+ QString s("");
+ switch(col) {
+ case COL_NAME:
+ s = _wf.name();
+ break;
+ case COL_POS:
+ case COL_LEN:
+ break;
+ case COL_REFS:
+ s.setNum(_wf.getRefCount());
+ break;
+ }
+ return s;
+ }
+
+//---------------------------------------------------------
+// ClipListEdit
+//---------------------------------------------------------
+
+ClipListEdit::ClipListEdit()
+ : TopWin(0, "cliplist", Qt::WType_TopLevel /*|WDestructiveClose*/)
+ {
+ setCaption(tr("MusE: Clip List Editor"));
+
+ editor = new ClipListEditorBase(this, "edit");
+ setCentralWidget(editor);
+
+ editor->view->setColumnAlignment(COL_REFS, AlignRight);
+
+ QFontMetrics fm(editor->view->font());
+ int fw = style().pixelMetric(QStyle::PM_DefaultFrameWidth, this);
+ int w = 2 + fm.width('9') * 9 + fm.width(':') * 3 + fw * 4;
+ editor->view->setColumnAlignment(COL_POS, AlignRight);
+ editor->view->setColumnWidth(COL_POS, w);
+ editor->view->setColumnAlignment(COL_LEN, AlignRight);
+ editor->view->setColumnWidth(COL_LEN, w);
+
+ connect(editor->view, SIGNAL(selectionChanged()), SLOT(clipSelectionChanged()));
+ connect(editor->view, SIGNAL(clicked(Q3ListViewItem*)), SLOT(clicked(Q3ListViewItem*)));
+
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(editor->start, SIGNAL(valueChanged(const Pos&)), SLOT(startChanged(const Pos&)));
+ connect(editor->len, SIGNAL(valueChanged(const Pos&)), SLOT(lenChanged(const Pos&)));
+
+ updateList();
+ }
+
+//---------------------------------------------------------
+// updateList
+//---------------------------------------------------------
+
+void ClipListEdit::updateList()
+ {
+ editor->view->clear();
+ for (iSndFile f = SndFile::sndFiles.begin(); f != SndFile::sndFiles.end(); ++f) {
+ new ClipItem(editor->view, *f);
+ }
+ clipSelectionChanged();
+ }
+
+//---------------------------------------------------------
+// closeEvent
+//---------------------------------------------------------
+
+void ClipListEdit::closeEvent(QCloseEvent* e)
+ {
+ emit deleted((int)this);
+ e->accept();
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void ClipListEdit::songChanged(int)
+ {
+ updateList();
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void ClipListEdit::readStatus(QDomNode node)
+ {
+#if 0 //TODO2
+ for (;;) {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+ switch (token) {
+ case Xml::TagStart:
+ if (tag == "topwin")
+ TopWin::readStatus(xml);
+ else
+ xml.unknown("CliplistEdit");
+ break;
+ case Xml::TagEnd:
+ if (tag == "cliplist")
+ return;
+ default:
+ break;
+ }
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void ClipListEdit::writeStatus(Xml& xml) const
+ {
+ xml.tag("cliplist");
+ TopWin::writeStatus(xml);
+ xml.etag("cliplist");
+ }
+
+//---------------------------------------------------------
+// startChanged
+//---------------------------------------------------------
+
+void ClipListEdit::startChanged(const Pos& pos)
+ {
+// editor->view->triggerUpdate();
+ }
+
+//---------------------------------------------------------
+// lenChanged
+//---------------------------------------------------------
+
+void ClipListEdit::lenChanged(const Pos& pos)
+ {
+// curClip.setLenFrame(pos.frame());
+// editor->view->triggerUpdate();
+ }
+
+//---------------------------------------------------------
+// clipSelectionChanged
+//---------------------------------------------------------
+
+void ClipListEdit::clipSelectionChanged()
+ {
+ ClipItem* item = (ClipItem*)(editor->view->selectedItem());
+// if (item == 0) {
+ editor->start->setEnabled(false);
+ editor->len->setEnabled(false);
+ return;
+#if 0
+ }
+ editor->start->setEnabled(true);
+ editor->len->setEnabled(true);
+ Pos pos, len;
+ pos.setType(Pos::FRAMES);
+ len.setType(Pos::FRAMES);
+ pos.setFrame(curClip.spos());
+ len.setFrame(curClip.lenFrame());
+ editor->start->setValue(pos);
+ editor->len->setValue(len);
+#endif
+ }
+
+//---------------------------------------------------------
+// clicked
+//---------------------------------------------------------
+
+void ClipListEdit::clicked(Q3ListViewItem*)
+ {
+// printf("clicked\n");
+ }
+
diff --git a/muse/muse/cliplist/cliplist.h b/muse/muse/cliplist/cliplist.h
new file mode 100644
index 00000000..c3a6d5aa
--- /dev/null
+++ b/muse/muse/cliplist/cliplist.h
@@ -0,0 +1,47 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: cliplist.h,v 1.7 2006/01/06 22:48:09 wschweer Exp $
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CLIPLIST_H__
+#define __CLIPLIST_H__
+
+#include "../cobject.h"
+#include "event.h"
+
+class Xml;
+class Pos;
+class ClipListEditorBase;
+
+//---------------------------------------------------------
+// ClipListEdit
+//---------------------------------------------------------
+
+class ClipListEdit : public TopWin {
+ Q_OBJECT
+ ClipListEditorBase* editor;
+
+ virtual void closeEvent(QCloseEvent*);
+ void updateList();
+
+ private slots:
+ void songChanged(int);
+ void startChanged(const Pos&);
+ void lenChanged(const Pos&);
+ void clipSelectionChanged();
+ void clicked(Q3ListViewItem*);
+
+ signals:
+ void deleted(int);
+
+ public:
+ ClipListEdit();
+ virtual void readStatus(QDomNode);
+ virtual void writeStatus(Xml&) const;
+ };
+
+#endif
+
diff --git a/muse/muse/cobject.cpp b/muse/muse/cobject.cpp
new file mode 100644
index 00000000..6ba7e7fb
--- /dev/null
+++ b/muse/muse/cobject.cpp
@@ -0,0 +1,55 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "cobject.h"
+#include "al/xml.h"
+#include "gui.h"
+
+//---------------------------------------------------------
+// TopWin
+//---------------------------------------------------------
+
+TopWin::TopWin()
+ : QMainWindow()
+ {
+ setIconSize(ICON_SIZE);
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void TopWin::read(QDomNode node)
+ {
+ for (node = node.firstChild(); !node.isNull(); node = node.nextSibling())
+ AL::readProperties(this, node);
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void TopWin::write(Xml& xml) const
+ {
+ xml.tag(metaObject()->className());
+ xml.writeProperties(this);
+ xml.etag(metaObject()->className());
+ }
+
diff --git a/muse/muse/cobject.h b/muse/muse/cobject.h
new file mode 100644
index 00000000..89e725e6
--- /dev/null
+++ b/muse/muse/cobject.h
@@ -0,0 +1,46 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __COBJECT_H__
+#define __COBJECT_H__
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+//---------------------------------------------------------
+// TopWin
+//---------------------------------------------------------
+
+class TopWin : public QMainWindow
+ {
+ Q_OBJECT
+ Q_PROPERTY(bool muse)
+ Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)
+
+ public:
+ virtual void read(QDomNode);
+ virtual void write(Xml& xml) const;
+ TopWin();
+ };
+
+#endif
+
diff --git a/muse/muse/conf.cpp b/muse/muse/conf.cpp
new file mode 100644
index 00000000..980e0c68
--- /dev/null
+++ b/muse/muse/conf.cpp
@@ -0,0 +1,716 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al/al.h"
+#include "muse.h"
+#include "shortcuts.h"
+#include "transport.h"
+#include "widgets/bigtime.h"
+#include "conf.h"
+#include "gconfig.h"
+#include "al/xml.h"
+#include "widgets/midisync.h"
+#include "genset.h"
+#include "sync.h"
+#include "mixer/mixer.h"
+#include "globals.h"
+#include "midirc.h"
+#include "awl/tcanvas.h"
+#include "midiedit/pianoroll.h"
+#include "midiedit/drumedit.h"
+
+extern void writeMidiTransforms(Xml& xml);
+extern void readMidiTransform(QDomNode);
+
+//---------------------------------------------------------
+// readColor
+//---------------------------------------------------------
+
+QColor readColor(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ int r = e.attribute("r","0").toInt();
+ int g = e.attribute("g","0").toInt();
+ int b = e.attribute("b","0").toInt();
+ return QColor(r, g, b);
+ }
+
+//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+void readConfiguration(QDomNode node)
+ {
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ QString s(e.text());
+ int i = s.toInt();
+ if (tag == "theme")
+ config.style = s;
+ else if (tag == "font0")
+ config.fonts[0]->fromString(s);
+ else if (tag == "font1")
+ config.fonts[1]->fromString(s);
+ else if (tag == "font2")
+ config.fonts[2]->fromString(s);
+ else if (tag == "font3")
+ config.fonts[3]->fromString(s);
+ else if (tag == "font4")
+ config.fonts[4]->fromString(s);
+ else if (tag == "font5")
+ config.fonts[5]->fromString(s);
+ else if (tag == "palette0")
+ config.palette[0] = readColor(node);
+ else if (tag == "palette1")
+ config.palette[1] = readColor(node);
+ else if (tag == "palette2")
+ config.palette[2] = readColor(node);
+ else if (tag == "palette3")
+ config.palette[3] = readColor(node);
+ else if (tag == "palette4")
+ config.palette[4] = readColor(node);
+ else if (tag == "palette5")
+ config.palette[5] = readColor(node);
+ else if (tag == "palette6")
+ config.palette[6] = readColor(node);
+ else if (tag == "palette7")
+ config.palette[7] = readColor(node);
+ else if (tag == "palette8")
+ config.palette[8] = readColor(node);
+ else if (tag == "palette9")
+ config.palette[9] = readColor(node);
+ else if (tag == "palette10")
+ config.palette[10] = readColor(node);
+ else if (tag == "palette11")
+ config.palette[11] = readColor(node);
+ else if (tag == "palette12")
+ config.palette[12] = readColor(node);
+ else if (tag == "palette13")
+ config.palette[13] = readColor(node);
+ else if (tag == "palette14")
+ config.palette[14] = readColor(node);
+ else if (tag == "palette15")
+ config.palette[15] = readColor(node);
+ else if (tag == "palette16")
+ config.palette[16] = readColor(node);
+ else if (tag == "selectPartBg")
+ config.selectPartBg = readColor(node);
+ else if (tag == "outputTrackBg")
+ config.trackBg[Track::AUDIO_OUTPUT] = readColor(node);
+ else if (tag == "groupTrackBg")
+ config.trackBg[Track::AUDIO_GROUP] = readColor(node);
+ else if (tag == "auxTrackBg")
+ config.trackBg[Track::AUDIO_AUX] = readColor(node);
+ else if (tag == "waveTrackBg")
+ config.trackBg[Track::WAVE] = readColor(node);
+ else if (tag == "inputTrackBg")
+ config.trackBg[Track::AUDIO_INPUT] = readColor(node);
+ else if (tag == "synthTrackBg")
+ config.trackBg[Track::AUDIO_SOFTSYNTH] = readColor(node);
+ else if (tag == "midiTrackBg")
+ config.trackBg[Track::MIDI] = readColor(node);
+ else if (tag == "midiOutputBg")
+ config.trackBg[Track::MIDI_OUT] = readColor(node);
+ else if (tag == "midiInputBg")
+ config.trackBg[Track::MIDI_IN] = readColor(node);
+ else if (tag == "midiChannelBg")
+ config.trackBg[Track::MIDI_CHANNEL] = readColor(node);
+ else if (tag == "midiSyntiBg")
+ config.trackBg[Track::MIDI_SYNTI] = readColor(node);
+ else if (tag == "extendedMidi")
+ config.extendedMidi = i;
+ else if (tag == "midiExportDivision")
+ config.midiDivision = i;
+ else if (tag == "copyright")
+ config.copyright = s;
+ else if (tag == "smfFormat")
+ config.smfFormat = i;
+ else if (tag == "bigtimeVisible")
+ config.bigTimeVisible = i;
+ else if (tag == "transportVisible")
+ config.transportVisible = i;
+ else if (tag == "mixer1Visible")
+ config.mixer1Visible = i;
+ else if (tag == "mixer2Visible")
+ config.mixer2Visible = i;
+ else if (tag == "showSplashScreen")
+ config.showSplashScreen = i;
+ else if (tag == "canvasShowPartType")
+ config.canvasShowPartType = i;
+ else if (tag == "canvasShowPartEvent")
+ config.canvasShowPartEvent = i;
+ else if (tag == "canvasShowGrid")
+ config.canvasShowGrid = i;
+ else if (tag == "canvasBgPixmap")
+ config.canvasBgPixmap = s;
+ else if (tag == "canvasUsePixmap")
+ config.canvasUseBgPixmap = i;
+ else if (tag == "geometryMain")
+ config.geometryMain = AL::readGeometry(node);
+ else if (tag == "geometryTransport")
+ config.geometryTransport = AL::readGeometry(node);
+ else if (tag == "geometryBigTime")
+ config.geometryBigTime = AL::readGeometry(node);
+ else if (tag == "geometryPianoroll")
+ config.geometryPianoroll = AL::readGeometry(node);
+ else if (tag == "geometryDrumedit")
+ config.geometryDrumedit = AL::readGeometry(node);
+ else if (tag == "mixer1")
+ config.mixer1.read(node);
+ else if (tag == "mixer2")
+ config.mixer2.read(node);
+ else if (tag == "bigtimeForegroundcolor")
+ config.bigTimeForegroundColor = readColor(node);
+ else if (tag == "bigtimeBackgroundcolor")
+ config.bigTimeBackgroundColor = readColor(node);
+// else if (tag == "transportHandleColor")
+// config.transportHandleColor = readColor(node);
+ else if (tag == "freewheelMode")
+ config.useJackFreewheelMode = i;
+ else if (tag == "txDeviceId")
+ txDeviceId = i;
+ else if (tag == "rxDeviceId")
+ rxDeviceId = i;
+ else if (tag == "mtctype")
+ AL::mtcType = i;
+ else if (tag == "extSync")
+ extSyncFlag = i;
+ else if (tag == "syncgentype") {
+ // for compatibility
+ int syncGenType= i;
+ genMTCSync = syncGenType == 1;
+ genMCSync = syncGenType == 2;
+ }
+ else if (tag == "genMTCSync")
+ genMTCSync = i;
+ else if (tag == "genMCSync")
+ genMCSync = i;
+ else if (tag == "genMMC")
+ genMMC = i;
+ else if (tag == "acceptMTC")
+ acceptMTC = i;
+ else if (tag == "acceptMMC")
+ acceptMMC = i;
+ else if (tag == "acceptMC")
+ acceptMC = i;
+ else if (tag == "mtcoffset") {
+ QStringList l = s.simplified().split(":", QString::SkipEmptyParts);
+ if (l.size() != 5) {
+ printf("cannot convert mtcoffset <%s>n\n", s.toLatin1().data());
+ }
+ else {
+ int h = l.at(0).toInt();
+ int m = l.at(0).toInt();
+ int s = l.at(0).toInt();
+ int f = l.at(0).toInt();
+ int sf = l.at(0).toInt();
+ mtcOffset = MTC(h, m, s, f, sf);
+ }
+ }
+ else if (tag == "shortcuts")
+ readShortCuts(node.firstChild());
+ else if (tag == "midiRC")
+ midiRCList.read(node);
+ else if (tag == "division")
+ config.division = i;
+ else if (tag == "guiDivision")
+ config.guiDivision = i;
+ else if (tag == "rtcTicks")
+ config.rtcTicks = i;
+ else if (tag == "minMeter")
+ config.minMeter = i;
+ else if (tag == "minSlider")
+ config.minSlider = s.toFloat();
+ else if (tag == "guiRefresh")
+ config.guiRefresh = i;
+ else if (tag == "peakHoldTime")
+ config.peakHoldTime = i;
+ else if (tag == "helpBrowser")
+ config.helpBrowser = s;
+//TD else if (tag == "midiTransform")
+// readMidiTransform(node.firstChild());
+ else if (tag == "startMode")
+ config.startMode = i;
+ else if (tag == "startSong")
+ config.startSong = s;
+ else if (tag == "followMode")
+ TimeCanvas::followMode = (FollowMode)i;
+ else if (tag == "defaultMidiInputDevice")
+ config.defaultMidiInputDevice = s;
+ else if (tag == "defaultMidiOutputDevice")
+ config.defaultMidiOutputDevice = s;
+ else if (tag == "defaultMidiInstrument")
+ config.defaultMidiInstrument = s;
+ else if (tag == "connectToAllMidiDevices")
+ config.connectToAllMidiDevices = i;
+ else if (tag == "connectToAllMidiTracks")
+ config.connectToAllMidiTracks = i;
+ else if (tag == "createDefaultMidiInput")
+ config.createDefaultMidiInput = i;
+ else if (tag == "PianoRoll")
+ PianoRoll::readConfiguration(node);
+ else if (tag == "DrumEdit")
+ DrumEdit::readConfiguration(node);
+ else {
+ printf("MusE:readConfiguration(): unknown tag %s\n",
+ e.tagName().toLatin1().data());
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// probeMachineSpecificConfiguration
+//---------------------------------------------------------
+
+static void probeMachineSpecificConfiguration()
+ {
+ // set a default help browser (crude way to find out)
+ if (!system("which konqueror &>/dev/null")) {
+ config.helpBrowser = QString("konqueror");
+ }
+ else if (!system("which opera &>/dev/null")) {
+ config.helpBrowser = QString("opera");
+ }
+ else if (!system("which firebird &>/dev/null")) {
+ config.helpBrowser = QString("firebird");
+ }
+ else if (!system("which mozilla &>/dev/null")) {
+ config.helpBrowser = QString("mozilla");
+ }
+ else {
+ // was not able to find a browser
+ }
+ // More preconfiguration
+ }
+
+//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+bool readConfiguration()
+ {
+ if (debugMsg)
+ printf("readConfiguration <%s>\n", configName.toLatin1().data());
+
+ QFile qf(configName);
+ if (!qf.open(QIODevice::ReadOnly)) {
+ if (debugMsg || debugMode)
+ fprintf(stderr, "NO Config File <%s> found\n", configName.toLatin1().data());
+
+ // if the config file does not exist launch probeMachineSpecificConfiguration
+ probeMachineSpecificConfiguration();
+ return true;
+ }
+ if (debugMsg)
+ printf("readConfiguration <%s>\n", configName.toLatin1().data());
+
+ QDomDocument doc;
+ int line, column;
+ QString err;
+ if (!doc.setContent(&qf, false, &err, &line, &column)) {
+ QString col, ln, error;
+ col.setNum(column);
+ ln.setNum(line);
+ error = err + "\n at line: " + ln + " col: " + col;
+ printf("error reading med file: %s\n", error.toLatin1().data());
+ return true;
+ }
+ QDomNode node = doc.documentElement();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "muse") {
+ node = node.firstChild();
+ // QString version = e.attribute(QString("version"));
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.tagName() == "configuration")
+ readConfiguration(node.firstChild());
+ else
+ printf("MusE:readConfiguration(): unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+ else
+ printf("MusE:readConfiguration() %s not supported\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// writeGlobalConfiguration
+//---------------------------------------------------------
+
+void MusE::writeGlobalConfiguration() const
+ {
+ QFile f(configName);
+ if (!f.open(QIODevice::WriteOnly)) {
+ printf("save configuration to <%s> failed: %s\n",
+ configName.toLatin1().data(), strerror(errno));
+ return;
+ }
+ Xml xml(&f);
+ xml.header();
+ xml.tag("muse version=\"2.0\"");
+ writeGlobalConfiguration(xml);
+ xml.etag("muse");
+ f.close();
+ }
+
+void MusE::writeGlobalConfiguration(Xml& xml) const
+ {
+ xml.tag("configuration");
+
+ xml.intTag("division", config.division);
+ xml.intTag("rtcTicks", config.rtcTicks);
+ xml.intTag("minMeter", config.minMeter);
+ xml.doubleTag("minSlider", config.minSlider);
+ xml.intTag("guiRefresh", config.guiRefresh);
+ xml.intTag("peakHoldTime", config.peakHoldTime);
+ xml.strTag("helpBrowser", config.helpBrowser);
+ xml.intTag("extendedMidi", config.extendedMidi);
+ xml.intTag("midiExportDivision", config.midiDivision);
+ xml.intTag("guiDivision", config.guiDivision);
+ xml.strTag("copyright", config.copyright);
+ xml.intTag("smfFormat", config.smfFormat);
+ xml.intTag("startMode", config.startMode);
+ xml.strTag("startSong", config.startSong);
+ xml.intTag("freewheelMode", config.useJackFreewheelMode);
+
+ xml.intTag("txDeviceId", txDeviceId);
+ xml.intTag("rxDeviceId", rxDeviceId);
+ xml.strTag("theme", config.style);
+
+ for (int i = 0; i < 6; ++i) {
+ char buffer[32];
+ sprintf(buffer, "font%d", i);
+ xml.strTag(buffer, config.fonts[i]->toString());
+ }
+ for (int i = 0; i < 16; ++i) {
+ char buffer[32];
+ sprintf(buffer, "palette%d", i);
+ xml.colorTag(buffer, config.palette[i]);
+ }
+
+ xml.colorTag("selectPartBg", config.selectPartBg);
+
+ static const char* colorNames[Track::TRACK_TYPES] = {
+ "outputTrackBg",
+ "groupTrackBg",
+ "auxTrackBg",
+ "waveTrackBg",
+ "inputTrackBg",
+ "synthTrackBg",
+ "midiTrackBg",
+ "midiOutputBg",
+ "midiInputBg",
+ "midiChannelBg",
+ "midiSyntiBg"
+ };
+ for (int i = 0; i < Track::TRACK_TYPES; ++i)
+ xml.colorTag(colorNames[i], config.trackBg[i]);
+
+ xml.intTag("mtctype", AL::mtcType);
+
+ xml.tag("mtcoffset");
+ xml.put("%02d:%02d:%02d:%02d:%02d",
+ mtcOffset.h(), mtcOffset.m(), mtcOffset.s(),
+ mtcOffset.f(), mtcOffset.sf());
+ xml.etag("mtcoffset");
+
+ xml.intTag("extSync", extSyncFlag);
+ xml.intTag("genMTCSync", genMTCSync);
+ xml.intTag("genMCSync", genMCSync);
+ xml.intTag("genMMC", genMMC);
+ xml.intTag("acceptMTC", acceptMTC);
+ xml.intTag("acceptMMC", acceptMMC);
+ xml.intTag("acceptMC", acceptMC);
+
+ xml.qrectTag("geometryMain", config.geometryMain);
+ xml.qrectTag("geometryTransport", config.geometryTransport);
+ xml.qrectTag("geometryBigTime", config.geometryBigTime);
+ xml.qrectTag("geometryPianoroll", config.geometryPianoroll);
+ xml.qrectTag("geometryDrumedit", config.geometryDrumedit);
+
+ xml.intTag("bigtimeVisible", config.bigTimeVisible);
+ xml.intTag("transportVisible", config.transportVisible);
+
+ xml.intTag("mixer1Visible", config.mixer1Visible);
+ xml.intTag("mixer2Visible", config.mixer2Visible);
+
+ config.mixer1.write(xml, "mixer1");
+ config.mixer2.write(xml, "mixer2");
+
+ xml.intTag("showSplashScreen", config.showSplashScreen);
+ xml.intTag("canvasShowPartType", config.canvasShowPartType);
+ xml.intTag("canvasShowPartEvent", config.canvasShowPartEvent);
+ xml.intTag("canvasShowGrid", config.canvasShowGrid);
+ xml.intTag("canvasUsePixmap", config.canvasUseBgPixmap);
+ xml.strTag("canvasBgPixmap", config.canvasBgPixmap);
+
+// xml.colorTag("transportHandleColor", config.transportHandleColor);
+ xml.colorTag("bigtimeForegroundcolor", config.bigTimeForegroundColor);
+ xml.colorTag("bigtimeBackgroundcolor", config.bigTimeBackgroundColor);
+
+ writeShortCuts(xml);
+ midiRCList.write(xml);
+ xml.intTag("followMode", TimeCanvas::followMode);
+
+ xml.strTag("defaultMidiInputDevice", config.defaultMidiInputDevice);
+ xml.strTag("defaultMidiOutputDevice", config.defaultMidiOutputDevice);
+ xml.strTag("defaultMidiInstrument", config.defaultMidiInstrument);
+ xml.intTag("connectToAllMidiDevices", config.connectToAllMidiDevices);
+ xml.intTag("connectToAllMidiTracks", config.connectToAllMidiTracks);
+ xml.intTag("createDefaultMidiInput", config.createDefaultMidiInput);
+
+ PianoRoll::writeConfiguration(xml);
+ DrumEdit::writeConfiguration(xml);
+ xml.etag("configuration");
+ }
+
+//---------------------------------------------------------
+// writeConfiguration
+// write song specific configuration
+//---------------------------------------------------------
+
+void MusE::writeConfiguration(Xml& xml) const
+ {
+ xml.tag("configuration");
+
+ xml.intTag("txDeviceId", txDeviceId);
+ xml.intTag("rxDeviceId", rxDeviceId);
+
+ xml.intTag("mtctype", AL::mtcType);
+ xml.tag("mtcoffset");
+ xml.put("%02d:%02d:%02d:%02d:%02d",
+ mtcOffset.h(), mtcOffset.m(), mtcOffset.s(),
+ mtcOffset.f(), mtcOffset.sf());
+ xml.etag("mtcoffset");
+ xml.intTag("extSync", extSyncFlag);
+ xml.intTag("genMTCSync", genMTCSync);
+ xml.intTag("genMCSync", genMCSync);
+ xml.intTag("genMMC", genMMC);
+ xml.intTag("acceptMTC", acceptMTC);
+ xml.intTag("acceptMMC", acceptMMC);
+ xml.intTag("acceptMC", acceptMC);
+
+ xml.intTag("bigtimeVisible", bt_id->isChecked());
+ xml.intTag("transportVisible", tr_id->isChecked());
+
+ xml.geometryTag("geometryMain", this);
+ if (transport)
+ xml.geometryTag("geometryTransport", transport);
+ if (bigtime)
+ xml.geometryTag("geometryBigTime", bigtime);
+
+ xml.intTag("mixer1Visible", aid1a->isChecked());
+ xml.intTag("mixer2Visible", aid1b->isChecked());
+ if (mixer1)
+ mixer1->write(xml, "mixer1");
+ if (mixer2)
+ mixer2->write(xml, "mixer2");
+
+//TD writeMidiTransforms(xml);
+ xml.etag("configuration");
+ }
+
+//---------------------------------------------------------
+// configMidiSync
+//---------------------------------------------------------
+
+void MusE::configMidiSync()
+ {
+ if (!midiSyncConfig) {
+ midiSyncConfig = new MidiSyncConfig(this);
+ connect(midiSyncConfig, SIGNAL(syncChanged()), SLOT(syncChanged()));
+ }
+ midiSyncConfig->raise();
+ midiSyncConfig->show();
+ }
+
+//---------------------------------------------------------
+// syncChanged
+//---------------------------------------------------------
+
+void MusE::syncChanged()
+ {
+ transport->syncChanged();
+ }
+
+//---------------------------------------------------------
+// configMidiFile
+//---------------------------------------------------------
+
+void MusE::configMidiFile()
+ {
+ if (!midiFileConfig)
+ midiFileConfig = new MidiFileConfig();
+ midiFileConfig->updateValues();
+
+ if (midiFileConfig->isVisible()) {
+ midiFileConfig->raise();
+//TD midiFileConfig->setActiveWindow();
+ }
+ else
+ midiFileConfig->show();
+ }
+
+//---------------------------------------------------------
+// MidiFileConfig
+// config properties of exported midi files
+//---------------------------------------------------------
+
+MidiFileConfig::MidiFileConfig()
+ : ConfigMidiFileBase()
+ {
+ setupUi(this);
+ connect(buttonOk, SIGNAL(clicked()), SLOT(okClicked()));
+ connect(buttonCancel, SIGNAL(clicked()), SLOT(cancelClicked()));
+ }
+
+//---------------------------------------------------------
+// updateValues
+//---------------------------------------------------------
+
+void MidiFileConfig::updateValues()
+ {
+ int divisionIdx = 2;
+ switch(config.midiDivision) {
+ case 96: divisionIdx = 0; break;
+ case 192: divisionIdx = 1; break;
+ case 384: divisionIdx = 2; break;
+ }
+ divisionCombo->setCurrentIndex(divisionIdx);
+ formatCombo->setCurrentIndex(config.smfFormat);
+ extendedFormat->setChecked(config.extendedMidi);
+ copyrightEdit->setText(config.copyright);
+ }
+
+//---------------------------------------------------------
+// okClicked
+//---------------------------------------------------------
+
+void MidiFileConfig::okClicked()
+ {
+ int divisionIdx = divisionCombo->currentIndex();
+
+ int divisions[3] = { 96, 192, 384 };
+ if (divisionIdx >= 0 && divisionIdx < 3)
+ config.midiDivision = divisions[divisionIdx];
+ config.extendedMidi = extendedFormat->isChecked();
+ config.smfFormat = formatCombo->currentIndex();
+ config.copyright = copyrightEdit->text();
+
+ muse->changeConfig(true); // write config file
+ close();
+ }
+
+//---------------------------------------------------------
+// cancelClicked
+//---------------------------------------------------------
+
+void MidiFileConfig::cancelClicked()
+ {
+ close();
+ }
+
+//---------------------------------------------------------
+// configGlobalSettings
+//---------------------------------------------------------
+
+void MusE::configGlobalSettings()
+ {
+ if (!globalSettingsConfig)
+ globalSettingsConfig = new GlobalSettingsConfig();
+
+ if (globalSettingsConfig->isVisible()) {
+ globalSettingsConfig->raise();
+//TD globalSettingsConfig->setActiveWindow();
+ }
+ else
+ globalSettingsConfig->show();
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void MixerConfig::write(Xml& xml, const char* name)
+ {
+ xml.tag("%s", name);
+ xml.qrectTag("geometry", geometry);
+ xml.intTag("showMidiTracks", showMidiTracks);
+ xml.intTag("showMidiSyntiPorts", showMidiSyntiPorts);
+ xml.intTag("showMidiTracks", showMidiTracks);
+ xml.intTag("showOutputTracks", showOutputTracks);
+ xml.intTag("showWaveTracks", showWaveTracks);
+ xml.intTag("showGroupTracks", showGroupTracks);
+ xml.intTag("showInputTracks", showInputTracks);
+ xml.intTag("showAuxTracks", showAuxTracks);
+ xml.intTag("showSyntiTracks", showSyntiTracks);
+ xml.intTag("showMidiInPorts", showMidiInPorts);
+ xml.intTag("showMidiOutPorts", showMidiOutPorts);
+ xml.intTag("showMidiChannels", showMidiChannels);
+ xml.etag("%s", name);
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void MixerConfig::read(QDomNode node)
+ {
+ for (node = node.firstChild(); !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "geometry")
+ geometry = AL::readGeometry(node);
+ else if (tag == "showMidiTracks")
+ showMidiTracks = i;
+ else if (tag == "showMidiSyntiPorts")
+ showMidiSyntiPorts = i;
+ else if (tag == "showOutputTracks")
+ showOutputTracks = i;
+ else if (tag == "showWaveTracks")
+ showWaveTracks = i;
+ else if (tag == "showGroupTracks")
+ showGroupTracks = i;
+ else if (tag == "showInputTracks")
+ showInputTracks = i;
+ else if (tag == "showAuxTracks")
+ showAuxTracks = i;
+ else if (tag == "showSyntiTracks")
+ showSyntiTracks = i;
+ else if (tag == "showMidiInPorts")
+ showMidiInPorts = i;
+ else if (tag == "showMidiOutPorts")
+ showMidiOutPorts = i;
+ else if (tag == "showMidiChannels")
+ showMidiChannels = i;
+ else
+ printf("MusE:MixerConfig: unknown tag %s\n", e.tagName().toLatin1().data());
+ }
+ }
+
diff --git a/muse/muse/conf.h b/muse/muse/conf.h
new file mode 100644
index 00000000..b026c080
--- /dev/null
+++ b/muse/muse/conf.h
@@ -0,0 +1,46 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __CONF_H__
+#define __CONF_H__
+
+#include "ui_configmidifile.h"
+
+//---------------------------------------------------------
+// MidiFileConfig
+// config properties of exported midi files
+//---------------------------------------------------------
+
+class MidiFileConfig : public QDialog, public Ui::ConfigMidiFileBase {
+ Q_OBJECT
+
+ private slots:
+ void okClicked();
+ void cancelClicked();
+
+ public:
+ MidiFileConfig();
+ void updateValues();
+ };
+
+extern bool readConfiguration();
+extern void readConfiguration(QDomNode);
+#endif
+
diff --git a/muse/muse/configmidifile.ui b/muse/muse/configmidifile.ui
new file mode 100644
index 00000000..ca96f3f5
--- /dev/null
+++ b/muse/muse/configmidifile.ui
@@ -0,0 +1,153 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>ConfigMidiFileBase</class>
+ <widget class="QDialog" name="ConfigMidiFileBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>541</width>
+ <height>280</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Config Midi File Export</string>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="4" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonOk" >
+ <property name="text" >
+ <string>&amp;OK</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonCancel" >
+ <property name="text" >
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QComboBox" name="formatCombo" >
+ <item>
+ <property name="text" >
+ <string>0 (single track)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>1 (multiple tracks)</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabel3" >
+ <property name="text" >
+ <string>Format:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="divisionCombo" >
+ <item>
+ <property name="text" >
+ <string>96</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>192</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>384</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="textLabel1" >
+ <property name="text" >
+ <string>Division:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="textLabel2" >
+ <property name="text" >
+ <string>Copyright:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLineEdit" name="copyrightEdit" />
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <widget class="QCheckBox" name="extendedFormat" >
+ <property name="text" >
+ <string>Enable extended smf format</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/ctrl.cpp b/muse/muse/ctrl.cpp
new file mode 100644
index 00000000..4fc2514d
--- /dev/null
+++ b/muse/muse/ctrl.cpp
@@ -0,0 +1,399 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fastlog.h"
+#include "globals.h"
+#include "ctrl.h"
+#include "al/xml.h"
+#include "midictrl.h"
+
+//---------------------------------------------------------
+// Ctrl
+//---------------------------------------------------------
+
+Ctrl::Ctrl(int id, const QString& s, int t)
+ : _id(id), _name(s), _type(t)
+ {
+ setRange(.0f, 1.f);
+ _default.f = 0.0f;
+ _curVal.f = 0.0f;
+ _schedVal.f = 0.0f;
+ _schedValRaw.f = 0.0f;
+ _touched = false;
+ _changed = false;
+ }
+
+Ctrl::Ctrl(int id, const QString& s, int t, float a, float b)
+ : _id(id), _name(s), _type(t)
+ {
+ if (_type & INT)
+ setRange(int(a), int(b));
+ else
+ setRange(a, b);
+ _default.f = 0.0f;
+ _curVal.f = 0.0f;
+ _schedValRaw.f = 0.0f;
+ _touched = false;
+ _changed = false;
+ }
+
+Ctrl::Ctrl()
+ {
+ _type = INTERPOLATE;
+ setRange(0.0f, 1.0f);
+ _id = 0;
+ _default.f = 0.0f;
+ _curVal.f = 0.0f;
+ _schedValRaw.f = 0.0f;
+ _touched = false;
+ _changed = false;
+ }
+
+Ctrl::Ctrl(const MidiController* mc)
+ {
+ _type = DISCRETE | INT;
+ setRange(mc->minVal(), mc->maxVal());
+ _id = mc->num();
+ _default.i = mc->initVal();
+ _curVal.i = CTRL_VAL_UNKNOWN;
+ _schedValRaw.i = CTRL_VAL_UNKNOWN;
+ _name = mc->name();
+ _touched = false;
+ _changed = false;
+ }
+
+//---------------------------------------------------------
+// value
+//---------------------------------------------------------
+
+CVal Ctrl::value(unsigned time)
+ {
+ CVal rv;
+
+ if (empty() || _touched)
+ return _curVal;
+ if (_type & DISCRETE) {
+ //
+ // midi controller
+ //
+ ciCtrlVal i = upper_bound(time);
+ if (i == end()) {
+ --i;
+ rv = i->second;
+ }
+ else if (i == begin()) {
+ if (i->first == time)
+ rv = i->second;
+ else
+ return _curVal;
+ }
+ else {
+ --i;
+ rv = i->second;
+ }
+ }
+ else {
+ ciCtrlVal i = upper_bound(time);
+ if (i == end()) {
+ --i;
+ return i->second;
+ }
+ int frame2 = i->first;
+ CVal val2 = i->second;
+ int frame1;
+ CVal val1;
+ if (i == begin()) {
+ frame1 = 0;
+ val1 = _default;
+ }
+ else {
+ --i;
+ frame1 = i->first;
+ val1 = i->second;
+ }
+ time -= frame1;
+ frame2 -= frame1;
+ if (_type & INT) {
+ val2.i -= val1.i;
+ rv.i = val1.i + (time * val2.i)/frame2;
+ }
+ else {
+ val2.f -= val1.f;
+ rv.f = val1.f + (time * val2.f)/frame2;
+ }
+ }
+ if (_type & LOG) {
+ if (rv.f == -1000.0f)
+ rv.f = 0.0f;
+ else
+ rv.f = pow(10.0f, rv.f);
+ }
+ return rv;
+ }
+
+//---------------------------------------------------------
+// add
+// return true if new value added
+//---------------------------------------------------------
+
+bool Ctrl::add(unsigned frame, CVal val)
+ {
+ if (_type & LOG) {
+ if (val.f <= 0.0)
+ val.f = -1000.0f;
+ else
+ val.f = fast_log10(val.f);
+ }
+ iCtrlVal e = find(frame);
+ if (e != end()) {
+ e->second = val;
+ return false;
+ }
+ insert(std::pair<const int, CVal> (frame, val));
+ return true;
+ }
+
+//---------------------------------------------------------
+// setSchedVal
+//---------------------------------------------------------
+
+void Ctrl::setSchedVal(CVal val)
+ {
+ if (_type & LOG) {
+ if (val.f <= 0.0)
+ _schedValRaw.f = -1000.0f;
+ else
+ _schedValRaw.f = fast_log10(val.f);
+ }
+ else {
+ _schedValRaw = val;
+ }
+ _schedVal = val;
+ }
+
+//---------------------------------------------------------
+// del
+//---------------------------------------------------------
+
+void Ctrl::del(unsigned frame)
+ {
+ iCtrlVal e = find(frame);
+ erase(e);
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void Ctrl::read(QDomNode node, bool midi)
+ {
+ QDomElement e = node.toElement();
+ _id = e.attribute("id").toInt();
+ _name = e.attribute("name");
+ _type = e.attribute("type","0").toInt();
+
+ char* minS = "0.0f";
+ char* maxS = "1.0f";
+
+ if (_type & INT) {
+ minS = "0";
+ maxS = "127";
+ _curVal.i = e.attribute("cur","-1").toInt();
+ _default.i = e.attribute("default","-1").toInt();
+ }
+ else {
+ minS = "0.0f";
+ maxS = "1.0f";
+ if (_id == AC_PAN) {
+ minS = "-1.0f";
+ maxS = "+1.0f";
+ }
+ _curVal.f = e.attribute("cur","0.0").toFloat();
+ _default.f = e.attribute("default","0.0").toFloat();
+ }
+ setSchedVal(_curVal);
+ if (_type & INT) {
+ min.i = e.attribute("min", minS).toInt();
+ max.i = e.attribute("max", maxS).toInt();
+ }
+ else {
+ min.f = e.attribute("min", minS).toFloat();
+ max.f = e.attribute("max", maxS).toFloat();
+ }
+
+ QStringList vp = e.text().simplified().split(",", QString::SkipEmptyParts);
+ int n = vp.size();
+ for (int i = 0; i < n; ++i) {
+ QStringList sl = vp.at(i).simplified().split(" ");
+ bool ok;
+ int frame = sl.at(0).toInt(&ok, 0);
+ if (!ok) {
+ printf("Ctrl::read(1): conversion <%s><%s> to int failed\n",
+ vp.at(i).simplified().toLatin1().data(),
+ sl.at(0).toLatin1().data());
+ break;
+ }
+ CVal val;
+ if (_type & INT)
+ val.i = sl.at(1).toInt(&ok, 0);
+ else
+ val.f = sl.at(1).toDouble(&ok);
+ if (!ok) {
+ printf("Ctrl::read(2): conversion <%s><%s> failed\n",
+ vp.at(i).simplified().toLatin1().data(),
+ sl.at(1).toLatin1().data());
+ break;
+ }
+ add(frame, val);
+ }
+ }
+
+//---------------------------------------------------------
+// add
+//---------------------------------------------------------
+
+void CtrlList::add(Ctrl* vl)
+ {
+ insert(std::pair<const int, Ctrl*>(vl->id(), vl));
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void Ctrl::write(Xml& xml)
+ {
+ QString s("controller id=\"%1\" name=\"%2\" cur=\"%3\" type=\"%4\" min=\"%5\" max=\"%6\" default=\"%7\"");
+
+ if (empty()) {
+ if (_type & INT)
+ xml.tagE(s.arg(id()).arg(_name).arg(curVal().i).arg(_type).arg(min.i).arg(max.i).arg(_default.i).toLatin1().data());
+ else
+ xml.tagE(s.arg(id()).arg(_name).arg(curVal().f).arg(_type).arg(min.f).arg(max.f).arg(_default.f).toLatin1().data());
+ return;
+ }
+ if (_type & INT)
+ xml.tag(s.arg(id()).arg(_name).arg(curVal().i).arg(_type).arg(min.i).arg(max.i).arg(_default.i).toLatin1().data());
+ else
+ xml.tag(s.arg(id()).arg(_name).arg(curVal().f).arg(_type).arg(min.f).arg(max.f).arg(_default.f).toLatin1().data());
+
+ int i = 0;
+ for (ciCtrlVal ic = begin(); ic != end(); ++ic) {
+ if (i == 0)
+ xml.putLevel();
+ int time = ic->first;
+ CVal val = ic->second;
+ if (_type & LOG)
+ val.f = (val.f == -1000.0) ? 0.0f : pow(10.0f, val.f);
+ if (_type & INT) {
+ xml.nput("%d %d,", time, val.i);
+ }
+ else {
+ QString fval,ttime;
+ fval.setNum(val.f);
+ ttime.setNum(time);
+ QString str=ttime + " "+ fval + ",";
+ xml.nput(str.toLatin1().data());
+ }
+ ++i;
+ if (i >= 4) {
+ xml.nput("\n");
+ i = 0;
+ }
+ }
+ if (i)
+ xml.nput("\n");
+ xml.etag("controller");
+ }
+
+//---------------------------------------------------------
+// val2pixelR
+// input val is "raw" data
+//---------------------------------------------------------
+
+int Ctrl::val2pixelR(CVal val, int maxpixel)
+ {
+ if (_type & INT)
+ return maxpixel - (maxpixel * (val.i - min.i) / (max.i-min.i));
+ else
+ return maxpixel - lrint(float(maxpixel) * (val.f - min.f) / (max.f-min.f));
+ }
+
+int Ctrl::val2pixelR(int val, int maxpixel)
+ {
+ if (_type & INT)
+ return maxpixel - (maxpixel * (val - min.i) / (max.i-min.i));
+ else
+ return maxpixel - lrint(float(maxpixel) * (val - min.f) / (max.f-min.f));
+ }
+
+//---------------------------------------------------------
+// pixel2val
+//---------------------------------------------------------
+
+CVal Ctrl::pixel2val(int pixel, int maxpixel)
+ {
+ pixel = maxpixel - pixel;
+
+// printf("pixel2val %d(%d) int %d, min %d, max %d\n",
+// pixel, maxpixel, _type & INT, min.i, max.i);
+ CVal rv;
+ if (_type & INT) {
+ rv.i = pixel * (max.i - min.i) / maxpixel + min.i;
+ if (rv.i < min.i)
+ rv.i = min.i;
+ else if (rv.i > max.i)
+ rv.i = max.i;
+ }
+ else {
+ rv.f = float(pixel) * (max.f - min.f) / float(maxpixel) + min.f;
+ if (rv.f < min.f)
+ rv.f = min.f;
+ else if (rv.f > max.f)
+ rv.f = max.f;
+ }
+
+ if (_type & LOG)
+ rv.f = pow(10.0f, rv.f);
+ return rv;
+ }
+
+//---------------------------------------------------------
+// setRange
+//---------------------------------------------------------
+
+void Ctrl::setRange(float _min, float _max)
+ {
+ if (_type & LOG) {
+ min.f = fast_log10(_min);
+ max.f = fast_log10(_max);
+ }
+ else {
+ min.f = _min;
+ max.f = _max;
+ }
+ }
+
+void Ctrl::setRange(int _min, int _max)
+ {
+ min.i = _min;
+ max.i = _max;
+ }
+
diff --git a/muse/muse/ctrl.h b/muse/muse/ctrl.h
new file mode 100644
index 00000000..7c4148c8
--- /dev/null
+++ b/muse/muse/ctrl.h
@@ -0,0 +1,221 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __CTRL_H__
+#define __CTRL_H__
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+class MidiController;
+
+//
+// predefined audio controller id's:
+//
+const int AC_VOLUME = 0;
+const int AC_PAN = 1;
+const int AC_MUTE = 2;
+const int AC_AUX = 3; // 3 -- 3+NUM_AUX
+
+const int NUM_AUX = 32; // max number of aux channels
+
+inline int genACnum(int plugin, int ctrl) { return plugin * 0x10000 + ctrl; }
+
+//---------------------------------------------------------
+// ControllerName
+//---------------------------------------------------------
+
+struct ControllerName {
+ QString name;
+ int id;
+ ControllerName(const QString& s, int i) : name(s), id(i) {}
+ };
+
+typedef std::vector<ControllerName> ControllerNameList;
+typedef ControllerNameList::iterator iControllerName;
+typedef ControllerNameList::const_iterator ciControllerName;
+
+//---------------------------------------------------------
+// CVal
+// Controller value, either float for audio or
+// int for midi.
+//
+//---------------------------------------------------------
+
+struct CVal {
+ union {
+ float f;
+ int i;
+ };
+ };
+
+//---------------------------------------------------------
+// CtrlVal
+// This structure represents a controller event. Time
+// is a midi tick value or a frame value depending on
+// then containing controller list Ctrl
+//---------------------------------------------------------
+
+struct CtrlVal {
+ int time;
+ CVal val;
+ CtrlVal(int f, CVal v) {
+ time = f;
+ val = v;
+ }
+ CtrlVal(int f) {
+ time = f;
+ }
+ };
+
+//---------------------------------------------------------
+// CtrlRecVal
+// recorded controller event, mixer automation
+//---------------------------------------------------------
+
+struct CtrlRecVal : public CtrlVal {
+ int id;
+ int type; // 0 - ctrlVal, 1 - start, 2 - end
+ CtrlRecVal(int f, int n, CVal v) : CtrlVal(f, v), id(n), type(0) {}
+ CtrlRecVal(int f, int n, int t) : CtrlVal(f), id(n), type(t) {}
+ };
+
+//---------------------------------------------------------
+// CtrlRecList
+//---------------------------------------------------------
+
+class CtrlRecList : public std::list<CtrlRecVal> {
+ public:
+ };
+
+typedef CtrlRecList::iterator iCtrlRec;
+typedef std::map<unsigned, CVal, std::less<unsigned> > CTRL;
+
+typedef CTRL::iterator iCtrlVal;
+typedef CTRL::const_iterator ciCtrlVal;
+
+
+//---------------------------------------------------------
+// Ctrl
+// this is a controller list
+//---------------------------------------------------------
+
+class Ctrl : public CTRL {
+ public:
+ enum CtrlType {
+ INTERPOLATE = 0, // values are linear interpolated
+ DISCRETE = 1, // midi controller events
+ LINEAR = 0,
+ LOG = 2,
+ INT = 4
+ };
+
+ private:
+ int _id;
+ QString _name;
+ int _type; // bitmask of CtrlType
+ CVal _default;
+ CVal _curVal; // used to optimize controller events send to
+ // midi devices
+ CVal _schedVal; // used by gui to determine "current" value
+ CVal _schedValRaw;
+ CVal min, max;
+ bool _changed;
+ bool _touched;
+
+ public:
+ Ctrl();
+ Ctrl(const MidiController*);
+ Ctrl(int id, const QString& name, int t=INTERPOLATE);
+ Ctrl(int id, const QString& name, int t, float a, float b);
+ int type() const { return _type; }
+ void setType(int t) { _type = t; }
+ CVal getDefault() const { return _default; }
+ void setDefault(float val) { _default.f = val; }
+ void setDefault(CVal val) { _default = val; }
+ void setDefault(int val) { _default.i = val; }
+
+ CVal curVal() const { return _curVal; }
+ void setCurVal(CVal v) {
+ _curVal = v;
+ setSchedVal(v);
+ }
+ void setCurVal(float v) {
+ _curVal.f = v;
+ CVal val;
+ val.f = v;
+ setSchedVal(val);
+ }
+ void setCurVal(int v) {
+ _curVal.i = v;
+ _schedVal.i = v;
+ _schedValRaw.i = v;
+ }
+
+ void setSchedVal(int v) {
+ _schedVal.i = v;
+ _schedValRaw.i = v;
+ }
+ void setSchedVal(CVal v);
+ CVal schedVal() const { return _schedVal; }
+ CVal schedValRaw() const { return _schedValRaw; }
+
+ int id() const { return _id; }
+ void setId(int i) { _id = i; }
+ QString name() const { return _name; }
+ void setName(const QString& s) { _name = s; }
+ CVal value(unsigned);
+ bool add(unsigned, CVal);
+ void del(unsigned);
+ void setChanged(bool val) { _changed = val; }
+ bool changed() const { return _changed; }
+ void setTouched(bool val) { _touched = val; }
+ bool touched() const { return _touched; }
+ void setRange(float min, float max);
+ void setRange(int min, int max);
+ CVal minVal() const { return min; }
+ CVal maxVal() const { return max; }
+ void read(QDomNode node, bool midi);
+ void write(Xml&);
+ int val2pixelR(CVal, int maxpixel);
+ int val2pixelR(int, int maxpixel);
+ CVal pixel2val(int pixel, int maxpixel);
+ };
+
+//---------------------------------------------------------
+// CtrlList
+// List of controller value lists.
+// This list represents the controller state of a
+// mixer strip
+//---------------------------------------------------------
+
+typedef std::map<unsigned, Ctrl*, std::less<unsigned> > CLIST;
+typedef CLIST::iterator iCtrl;
+typedef CLIST::const_iterator ciCtrl;
+
+class CtrlList : public CLIST {
+ public:
+ void add(Ctrl* vl);
+ };
+
+#endif
+
diff --git a/muse/muse/ctrl/CMakeLists.txt b/muse/muse/ctrl/CMakeLists.txt
new file mode 100644
index 00000000..bf771caf
--- /dev/null
+++ b/muse/muse/ctrl/CMakeLists.txt
@@ -0,0 +1,35 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+QT4_WRAP_CPP (ctrl_mocs configmidictrl.h ctrleditor.h)
+QT4_WRAP_UI (ctrl_ui_headers configmidictrl.ui)
+
+add_library ( ctrl STATIC
+ configmidictrl.cpp
+ ctrleditor.cpp
+ configmidictrl.h
+ ctrleditor.h
+ ${ctrl_mocs}
+ ${ctrl_ui_headers}
+ )
+set_target_properties( ctrl
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_SOURCE_DIR}/all.h"
+ )
+
diff --git a/muse/muse/ctrl/configmidictrl.cpp b/muse/muse/ctrl/configmidictrl.cpp
new file mode 100644
index 00000000..1a7f652e
--- /dev/null
+++ b/muse/muse/ctrl/configmidictrl.cpp
@@ -0,0 +1,183 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: configmidictrl.cpp,v 1.3 2005/10/31 14:55:04 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "configmidictrl.h"
+#include "track.h"
+#include "miditrack.h"
+#include "midictrl.h"
+#include "instruments/minstrument.h"
+
+//---------------------------------------------------------
+// ConfigMidiCtrl
+//---------------------------------------------------------
+
+ConfigMidiCtrl::ConfigMidiCtrl(MidiTrack* t)
+ {
+ setupUi(this);
+ track = t;
+
+ //---------------------------------------------------
+ // populate list of managed controllers
+ //---------------------------------------------------
+
+ ControllerNameList* cn = track->controllerNames();
+ for (iControllerName i = cn->begin(); i != cn->end(); ++i)
+ managedController->addItem(i->name);
+
+ //---------------------------------------------------
+ // populate list of available controllers
+ //---------------------------------------------------
+
+ MidiChannel* mc = 0;
+ if (track->type() == Track::MIDI)
+ mc = track->channel();
+ else if (track->type() == Track::MIDI_CHANNEL)
+ mc = (MidiChannel*)track;
+ if (mc) {
+ MidiOutPort* mp = mc->port();
+ portName->setText(mp->name());
+ //
+ // populate popup with all controllers available for
+ // current instrument
+ //
+ MidiControllerList* mcl = mp->instrument()->controller();
+ for (iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci) {
+ iControllerName i;
+ for (i = cn->begin(); i != cn->end(); ++i) {
+ if (i->name == (*ci)->name())
+ break;
+ }
+ if (i == cn->end())
+ availableController->addItem((*ci)->name());
+ }
+ }
+ delete cn;
+ buttonAdd->setEnabled(false);
+ buttonRemove->setEnabled(false);
+ connect(buttonAdd, SIGNAL(clicked()), SLOT(addClicked()));
+ connect(buttonRemove, SIGNAL(clicked()), SLOT(removeClicked()));
+ connect(availableController, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), SLOT(availableSelected(QListWidgetItem*)));
+ connect(managedController, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), SLOT(managedSelected(QListWidgetItem*)));
+ }
+
+//---------------------------------------------------------
+// addClicked
+//---------------------------------------------------------
+
+void ConfigMidiCtrl::addClicked()
+ {
+ QListWidgetItem* n = availableController->currentItem();
+ if (n == 0)
+ return;
+ QString s(n->text());
+ for (int i = 0; i < managedController->count(); ++i) {
+ if (s == managedController->item(i)->text())
+ return;
+ }
+ managedController->addItem(s);
+ managedController->setCurrentItem(managedController->item(managedController->count()-1));
+ delete n;
+ buttonAdd->setEnabled(false);
+ }
+
+//---------------------------------------------------------
+// removeClicked
+//---------------------------------------------------------
+
+void ConfigMidiCtrl::removeClicked()
+ {
+ QListWidgetItem* n = managedController->currentItem();
+ if (n == 0)
+ return;
+ availableController->addItem(n->text());
+ delete n;
+ buttonRemove->setEnabled(false);
+ }
+
+//---------------------------------------------------------
+// availableSelected
+//---------------------------------------------------------
+
+void ConfigMidiCtrl::availableSelected(QListWidgetItem* item)
+ {
+ buttonAdd->setEnabled(item != 0);
+ }
+
+//---------------------------------------------------------
+// managedSelected
+//---------------------------------------------------------
+
+void ConfigMidiCtrl::managedSelected(QListWidgetItem* item)
+ {
+ buttonRemove->setEnabled(item != 0);
+ }
+
+//---------------------------------------------------------
+// done
+//---------------------------------------------------------
+
+void ConfigMidiCtrl::done(int code)
+ {
+ if (!code) {
+ QDialog::done(code);
+ return;
+ }
+
+ MidiChannel* mc = 0;
+ if (track->type() == Track::MIDI)
+ mc = track->channel();
+ else if (track->type() == Track::MIDI_CHANNEL)
+ mc = (MidiChannel*)track;
+
+ if (mc) {
+ MidiOutPort* port = mc->port();
+ ControllerNameList* cn = track->controllerNames();
+ MidiInstrument* instr = port->instrument();
+ MidiControllerList* mcl = instr->controller();
+
+ //
+ // search for new, added controller
+ //
+ int n = managedController->count();
+ for (int i = 0; i < n; ++i) {
+ QString name(managedController->item(i)->text());
+ iControllerName ii = cn->begin();
+ for (; ii != cn->end(); ++ii) {
+ if (ii->name == name)
+ break;
+ }
+ if (ii == cn->end()) {
+ // add controller "name" to list of managed controller
+ //
+ for (iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci) {
+ if ((*ci)->name() == name) {
+ Ctrl* ctrl = new Ctrl(*ci);
+ track->addController(ctrl);
+ break;
+ }
+ }
+ }
+ }
+
+ //
+ // search for removed controller
+ //
+ for (iControllerName ii = cn->begin(); ii != cn->end(); ++ii) {
+ int i;
+ for (i = 0; i < n; ++i) {
+ if (managedController->item(i)->text() == ii->name)
+ break;
+ }
+ if (i == n)
+ track->removeController(ii->id);
+ }
+ delete cn;
+ }
+ QDialog::done(code);
+ }
+
diff --git a/muse/muse/ctrl/configmidictrl.h b/muse/muse/ctrl/configmidictrl.h
new file mode 100644
index 00000000..f3adcc2f
--- /dev/null
+++ b/muse/muse/ctrl/configmidictrl.h
@@ -0,0 +1,38 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: configmidictrl.h,v 1.1 2005/10/24 20:38:56 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CONFIGMIDICTRL_H__
+#define __CONFIGMIDICTRL_H__
+
+#include "ui_configmidictrl.h"
+
+class MidiTrack;
+
+//---------------------------------------------------------
+// ConfigMidiCtrl
+//---------------------------------------------------------
+
+class ConfigMidiCtrl : public QDialog, public Ui::ConfigMidiCtrlBase {
+ Q_OBJECT
+
+ MidiTrack* track;
+
+ private slots:
+ void addClicked();
+ void removeClicked();
+ void availableSelected(QListWidgetItem*);
+ void managedSelected(QListWidgetItem*);
+ virtual void done(int);
+
+ public:
+ ConfigMidiCtrl(MidiTrack*);
+ };
+
+#endif
+
+
diff --git a/muse/muse/ctrl/configmidictrl.ui b/muse/muse/ctrl/configmidictrl.ui
new file mode 100644
index 00000000..d76fe457
--- /dev/null
+++ b/muse/muse/ctrl/configmidictrl.ui
@@ -0,0 +1,228 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>ConfigMidiCtrlBase</class>
+ <widget class="QDialog" name="ConfigMidiCtrlBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>463</width>
+ <height>448</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Config Midi Controller</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; />&lt;/head>&lt;body style=&quot; white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;>Midi Port:&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="portName" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="text" >
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; />&lt;/head>&lt;body style=&quot; white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;>Available Controller:&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="availableController" />
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonAdd" >
+ <property name="text" >
+ <string>Add</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonRemove" >
+ <property name="text" >
+ <string>Remove</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; />&lt;/head>&lt;body style=&quot; white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;>Automated Controller:&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="managedController" />
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>131</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonOk" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonCancel" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigMidiCtrlBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>278</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>96</x>
+ <y>254</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>ConfigMidiCtrlBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>369</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>179</x>
+ <y>282</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/ctrl/ctrleditor.cpp b/muse/muse/ctrl/ctrleditor.cpp
new file mode 100644
index 00000000..f1906cdc
--- /dev/null
+++ b/muse/muse/ctrl/ctrleditor.cpp
@@ -0,0 +1,412 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrleditor.cpp,v 1.12 2006/01/28 19:11:20 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "ctrleditor.h"
+#include "track.h"
+#include "awl/tcanvas.h"
+#include "ctrl.h"
+#include "midictrl.h"
+#include "gconfig.h"
+#include "song.h"
+#include "part.h"
+
+static const int HANDLE1 = 6;
+static const int HANDLE2 = 3;
+static const int veloWidth = 3;
+
+//---------------------------------------------------------
+// CtrlEditor
+//---------------------------------------------------------
+
+CtrlEditor::CtrlEditor()
+ {
+ _drawCtrlName = false;
+ dragy = -1;
+ lselected = 0;
+ dragy = -1;
+ singlePitch = -1;
+ drawRuler = false;
+ }
+
+//---------------------------------------------------------
+// drawHandle
+//---------------------------------------------------------
+
+inline static void drawHandle(QPainter& p, int x, int y, int lselected)
+ {
+ p.fillRect(x-HANDLE2, y-HANDLE2, HANDLE1, HANDLE1,
+ x == lselected ? Qt::red : Qt::yellow);
+ }
+
+//---------------------------------------------------------
+// paint
+//---------------------------------------------------------
+
+void CtrlEditor::paint(QPainter& p, const QRect& r)
+ {
+ if (!ctrl())
+ return;
+ int from = r.x() - HANDLE1;
+ if (from < 0)
+ from = 0;
+ int to = r.x() + r.width() + HANDLE1;
+ int th = cheight();
+
+ bool aR = ctrlTrack()->autoRead();
+ p.setPen(QPen(aR ? Qt::white : Qt::gray, 2));
+
+ TType tt = track()->timeType();
+
+ MidiController::ControllerType type = midiControllerType(ctrl()->id());
+ if (type == MidiController::Velo) {
+ p.setPen(QPen(Qt::blue, veloWidth));
+ PartList* pl = track()->parts();
+ for (iPart ip = pl->begin(); ip != pl->end(); ++ip) {
+ Part* part = ip->second;
+ int pos1 = tc()->pos2pix(*part);
+ int pos2 = tc()->pos2pix(part->end());
+
+ if (pos2 <= from)
+ continue;
+ if (pos1 > to)
+ break;
+
+ EventList* events = part->events();
+ for (iEvent e = events->begin(); e != events->end(); ++e) {
+ if (e->second.type() != Note)
+ continue;
+ int pos = tc()->pos2pix(e->second.pos() + *part);
+ if (pos <= from)
+ continue;
+ if (pos > to)
+ break;
+ int id = ctrl()->id();
+ if (id == CTRL_VELOCITY ||
+ (CTRL_SVELOCITY && e->second.pitch() == singlePitch)) {
+ int y1 = ctrl()->val2pixelR(e->second.velo(), th);
+ p.drawLine(pos, th, pos, y1);
+ }
+ }
+ }
+ }
+ else {
+ if (!ctrl()->empty()) {
+ int x1 = from, y1, x2, y2;
+ ciCtrlVal i = ctrl()->begin();
+ if (i != ctrl()->end()) {
+ x1 = tc()->pos2pix(Pos(i->first, tt));
+ if (dragy != -1 && lselected == x1)
+ y1 = dragy;
+ else
+ y1 = ctrl()->val2pixelR(i->second, th);
+ if (x1 >= from)
+ drawHandle(p, x1, y1, lselected);
+ }
+ for (; i != ctrl()->end(); ++i) {
+ x2 = tc()->pos2pix(Pos(i->first, tt));
+ if (dragy != -1 && lselected == x2)
+ y2 = dragy;
+ else {
+ y2 = ctrl()->val2pixelR(i->second, th);
+ }
+ if (x2 >= to)
+ break;
+ if (x2 >= from) {
+ if (ctrl()->type() & Ctrl::DISCRETE) {
+ p.drawLine(x1, y1, x2, y1);
+ p.drawLine(x2, y1, x2, y2);
+ }
+ else
+ p.drawLine(x1, y1, x2, y2);
+ drawHandle(p, x1, y1, lselected);
+ }
+ x1 = x2;
+ y1 = y2;
+ }
+ if (x1 < to) {
+ drawHandle(p, x1, y1, lselected);
+ if (i == ctrl()->end())
+ x2 = to;
+ if (ctrl()->type() & Ctrl::DISCRETE)
+ y2 = y1;
+ p.drawLine(x1, y1, x2, y2);
+ }
+ }
+ if (!aR) {
+ p.setPen(QPen(Qt::white, 2));
+ int y = ctrl()->val2pixelR(ctrl()->schedValRaw(), th);
+ p.drawLine(r.x(), y, r.x() + r.width(), y);
+ }
+ }
+
+ if (drawRuler) {
+ p.setPen(QPen(Qt::white, 2));
+ p.setRenderHint(QPainter::Antialiasing, true);
+ p.drawLine(ruler1, ruler2);
+ }
+ //
+ // this does not work well a.t.m:
+ //
+ if (_drawCtrlName) {
+ QString s(ctrl()->name());
+ p.setFont(*config.fonts[3]);
+ p.setPen(Qt::black);
+ QFontMetrics fm(*config.fonts[3]);
+ int ly = fm.lineSpacing() + 2;
+ p.drawText(2, ly, s);
+ }
+ }
+
+//---------------------------------------------------------
+// mousePress
+//---------------------------------------------------------
+
+void CtrlEditor::mousePress(const QPoint& pos, int button)
+ {
+ int wh = cheight();
+ int y = pos.y();
+ int x = pos.x();
+
+ if (tc()->tool() == PencilTool) {
+ CVal val = ctrl()->pixel2val(y, wh);
+ selected = tc()->pix2pos(x);
+ if (ctrl()->id() == CTRL_VELOCITY || ctrl()->id() == CTRL_SVELOCITY)
+ song->startUndo();
+ else {
+ song->addControllerVal(ctrlTrack(), ctrl(), selected, val);
+ tc()->widget()->update();
+ }
+ lselected = x;
+ dragy = y;
+ dragx = x;
+ }
+ else if (tc()->tool() == PointerTool) {
+ if (ctrl()->id() == CTRL_VELOCITY || ctrl()->id() == CTRL_SVELOCITY) {
+ dragx = x;
+ song->startUndo();
+ return;
+ }
+
+ Pos pos1(tc()->pix2pos(x - HANDLE2));
+ Pos pos2(tc()->pix2pos(x + HANDLE2));
+
+ TType tt = track()->timeType();
+ ciCtrlVal s = ctrl()->upper_bound(pos1.time(tt));
+ ciCtrlVal e = ctrl()->upper_bound(pos2.time(tt));
+ for (ciCtrlVal i = s; i != e; ++i) {
+ int yy = ctrl()->val2pixelR(i->second, wh);
+ if ((yy >= (y-HANDLE2)) && (yy < (y + HANDLE2))) {
+ if (tt == AL::TICKS)
+ selected.setTick(i->first);
+ else
+ selected.setFrame(i->first);
+ lselected = tc()->pos2pix(selected);
+ if (button == Qt::RightButton) {
+ song->removeControllerVal(ctrlTrack(), ctrl()->id(), i->first);
+ dragy = -1;
+ }
+ else
+ dragy = yy;
+ tc()->widget()->update();
+ break;
+ }
+ }
+ }
+ else if (tc()->tool() == DrawTool) {
+ ruler1 = ruler2 = pos;
+ drawRuler = true;
+ }
+ }
+
+//---------------------------------------------------------
+// mouseRelease
+//---------------------------------------------------------
+
+void CtrlEditor::mouseRelease()
+ {
+ if (tc()->tool() == DrawTool) {
+ song->startUndo();
+ drawRuler = false;
+ int from, to, y1, y2;
+ if (ruler1.x() > ruler2.x()) {
+ from = ruler2.x();
+ to = ruler1.x();
+ y1 = ruler2.y();
+ y2 = ruler1.y();
+ }
+ else {
+ from = ruler1.x();
+ to = ruler2.x();
+ y1 = ruler1.y();
+ y2 = ruler2.y();
+ }
+ MidiController::ControllerType type = midiControllerType(ctrl()->id());
+ if (type == MidiController::Velo) {
+ PartList* pl = track()->parts();
+ for (iPart ip = pl->begin(); ip != pl->end(); ++ip) {
+ Part* part = ip->second;
+ int pos1 = tc()->pos2pix(*part);
+ int pos2 = tc()->pos2pix(part->end());
+
+ if (pos2 <= from)
+ continue;
+ if (pos1 > to)
+ break;
+
+ EventList* events = part->events();
+ for (iEvent e = events->begin(); e != events->end(); ++e) {
+ if (e->second.type() != Note)
+ continue;
+ int pos = tc()->pos2pix(e->second.pos() + *part);
+ if (pos <= from)
+ continue;
+ if (pos > to)
+ break;
+ int id = ctrl()->id();
+ if (id == CTRL_VELOCITY ||
+ (CTRL_SVELOCITY && e->second.pitch() == singlePitch)) {
+ int y = y1 + (y2 - y1) * (pos - from) / (to - from);
+ int val = (ctrl()->pixel2val(y, cheight())).i;
+ Event clone = e->second.clone();
+ clone.setB(val);
+ song->changeEvent(e->second, clone, part);
+ song->undoOp(UndoOp::ModifyEvent, clone, e->second, part);
+ }
+ }
+ }
+ }
+ else {
+ printf("ctrleditor:: not implemented\n");
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ tc()->widget()->update();
+ return;
+ }
+ if (ctrl()->id() == CTRL_VELOCITY || ctrl()->id() == CTRL_SVELOCITY)
+ song->endUndo(SC_EVENT_MODIFIED);
+ else {
+ if (dragy != -1) {
+ int wh = cheight();
+ CVal val = ctrl()->pixel2val(dragy, wh);
+ // modify controller:
+ song->addControllerVal(ctrlTrack(), ctrl(), selected, val);
+ dragy = -1;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// mouseMove
+// called only with mouse button pressed
+//---------------------------------------------------------
+
+void CtrlEditor::mouseMove(const QPoint& pos)
+ {
+ if (tc()->tool() == DrawTool) {
+ ruler2 = pos;
+ tc()->widget()->update();
+ return;
+ }
+ if (ctrl()->id() == CTRL_VELOCITY || ctrl()->id() == CTRL_SVELOCITY) {
+ AL::Pos p1(tc()->pix2pos(dragx));
+ AL::Pos p2(tc()->pix2pos(pos.x()));
+ dragx = pos.x();
+
+ int wh = cheight();
+ int val = (ctrl()->pixel2val(pos.y(), wh)).i;
+ unsigned tick1 = p1.tick();
+ Part* part = track()->parts()->findPart(tick1);
+ if (part == 0)
+ return;
+ unsigned tick2 = p2.tick();
+ if (tick1 > tick2) {
+ int tmp = tick2;
+ tick2 = tick1;
+ tick1 = tmp;
+ }
+ if (part->tick() > tick1)
+ tick1 = 0;
+ else
+ tick1 -= part->tick(); // event time is relative to part
+ if (part->tick() > tick2)
+ tick2 = 0;
+ else
+ tick2 -= part->tick();
+
+ //
+ // change velocity for all notes at tick time
+ //
+ EventList* el = part->events();
+ EventList tel;
+ for (iEvent ie = el->lower_bound(tick1); ie != el->lower_bound(tick2); ie++) {
+ Event e = ie->second;
+ if (!e.isNote() || e.dataB() == val)
+ continue;
+ tel.add(e);
+ }
+ for (iEvent ie = tel.begin(); ie != tel.end(); ++ie) {
+ Event e = ie->second;
+ Event clone = e.clone();
+ clone.setB(val);
+ song->changeEvent(e, clone, part);
+ song->undoOp(UndoOp::ModifyEvent, clone, e, part);
+ }
+ }
+ else {
+ if (dragy != -1)
+ dragy = pos.y();
+ }
+ tc()->widget()->update();
+ }
+
+//---------------------------------------------------------
+// populateControllerMenu
+//---------------------------------------------------------
+
+void CtrlEditor::populateControllerMenu(QMenu* ctrlMenu)
+ {
+ ctrlMenu->clear();
+ int idx = 0;
+
+ QAction* a;
+ if (track()->type() == Track::MIDI) {
+ a = ctrlMenu->addAction("Velocity");
+ a->setData(CTRL_VELOCITY);
+ if (CTRL_VELOCITY == ctrl()->id())
+ ctrlMenu->setActiveAction(a);
+ if (((MidiTrack*)(track()))->drumMap()) {
+ a = ctrlMenu->addAction("Single Velocity");
+ a->setData(CTRL_SVELOCITY);
+ if (CTRL_SVELOCITY == ctrl()->id())
+ ctrlMenu->setActiveAction(a);
+ }
+ }
+
+ ControllerNameList* cn = track()->controllerNames();
+ for (iControllerName i = cn->begin(); i != cn->end(); ++i, ++idx) {
+ a = ctrlMenu->addAction(i->name);
+ a->setData(i->id);
+ if (i->id == ctrl()->id())
+ ctrlMenu->setActiveAction(a);
+ }
+ if (track()->type() == Track::MIDI) {
+ MidiChannel* mc = ((MidiTrack*)track())->channel();
+ if (mc) {
+ ControllerNameList* cn = mc->controllerNames();
+ for (iControllerName i = cn->begin(); i != cn->end(); ++i, ++idx) {
+ a = ctrlMenu->addAction(i->name);
+ a->setData(i->id);
+ if (i->id == ctrl()->id())
+ ctrlMenu->setActiveAction(a);
+ }
+ }
+ }
+ a = ctrlMenu->addAction("other");
+ a->setData(CTRL_OTHER);
+ delete cn;
+ }
+
diff --git a/muse/muse/ctrl/ctrleditor.h b/muse/muse/ctrl/ctrleditor.h
new file mode 100644
index 00000000..9fa9d02a
--- /dev/null
+++ b/muse/muse/ctrl/ctrleditor.h
@@ -0,0 +1,52 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrleditor.h,v 1.5 2006/01/28 19:11:20 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CTRL_EDITOR_H__
+#define __CTRL_EDITOR_H__
+
+#include "al/pos.h"
+
+class Ctrl;
+class TimeCanvas;
+class Track;
+
+//---------------------------------------------------------
+// CtrlEditor
+//---------------------------------------------------------
+
+class CtrlEditor {
+ bool _drawCtrlName;
+ int dragx, dragy;
+ int lselected; // cached pixel position of current value
+ AL::Pos selected; // current selected controller value
+
+ bool drawRuler;
+ QPoint ruler1;
+ QPoint ruler2;
+
+ virtual Ctrl* ctrl() const = 0;
+ virtual TimeCanvas* tc() const = 0;
+ virtual int cheight() const = 0;
+ virtual Track* track() const = 0;
+ virtual Track* ctrlTrack() const = 0;
+
+ protected:
+ int singlePitch;
+ void populateControllerMenu(QMenu* ctrlMenu);
+
+ public:
+ CtrlEditor();
+ virtual ~CtrlEditor() {}
+ void paint(QPainter& p, const QRect& r);
+ void setDrawCtrlName(bool val) { _drawCtrlName = val; }
+ void mousePress(const QPoint&, int);
+ void mouseRelease();
+ void mouseMove(const QPoint& pos);
+ };
+
+#endif
+
diff --git a/muse/muse/debug.h b/muse/muse/debug.h
new file mode 100644
index 00000000..0820fef3
--- /dev/null
+++ b/muse/muse/debug.h
@@ -0,0 +1,44 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MUSE_DEBUG_H__
+#define __MUSE_DEBUG_H__
+
+#include "globals.h"
+
+#ifdef DEBUG_1
+#define M_REPORT(string) printf("%s:%d:%s: " string "\n", __FILE__, __LINE__, __PRETTY_FUNCTION__);
+#define M_REPORTARG(format, args...) printf("%s:%d:%s: " format "\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, ##args);
+#define M_DEBUG(string) if (debugMsg) fprintf(stderr, "%s:%d:%s: " string "\n", __FILE__, __LINE__, __PRETTY_FUNCTION__);
+#define M_DEBUGARG(format, args...) if (debugMsg) fprintf(stderr, "%s:%d:%s: " format "\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, ##args);
+#define M_ERROR(string) fprintf(stderr, "%s:%d:%s: " string "\n", __FILE__, __LINE__, __PRETTY_FUNCTION__);
+#define M_ERRORARG(format, args...) fprintf(stderr, "%s:%d:%s: " format "\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, ##args);
+#else
+#define M_REPORT(string)
+#define M_REPORTARG(format, args...)
+#define M_DEBUG(string)
+#define M_DEBUGARG(format, args...)
+#define M_ERROR(string)
+#define M_ERRORARG(format, args...)
+#endif
+
+#define DEBUG_ARGS __FILE__ << ":" << __LINE__ << ":" << __PRETTY_FUNCTION__ << ": "
+
+#endif /* __MUSE_DEBUG_H__ */
diff --git a/muse/muse/default_click.h b/muse/muse/default_click.h
new file mode 100644
index 00000000..d6907c80
--- /dev/null
+++ b/muse/muse/default_click.h
@@ -0,0 +1,1213 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 20002 Paul Davis
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+static const float defaultClick[] = {
+ -0.0019836426, 0.0097045898, 0.019165039, 0.028594971, 0.036102295,
+ 0.040679932, 0.040649414, 0.036560059, 0.029693604, 0.016967773,
+ 0.0057067871, -0.008026123, -0.021453857, -0.026153564,
+ -0.031921387, -0.036834717, -0.04397583, -0.046844482,
+ -0.045349121, -0.041748047, -0.032623291, -0.026611328,
+ -0.026702881, -0.025482178, -0.013092041, 0.0055847168,
+ 0.023040771, 0.027435303, 0.043426514, 0.07925415, 0.1086731,
+ 0.09463501, 0.039154053, -0.027832031, -0.081542969, -0.099090576,
+ -0.089385986, -0.051055908, -0.0023803711, 0.031951904,
+ 0.044128418, 0.029998779, 0.0086669922, 0.0022888184, 0.0082092285,
+ 0.0085144043, -0.0057983398, -0.027496338, -0.036834717,
+ -0.021759033, -0.020721436, -0.024078369, -0.025360107,
+ -0.090698242, -0.16491699, -0.16052246, -0.090454102, 0.0031433105,
+ 0.013031006, 0.034790039, 0.30599976, 0.58151245, 0.5078125,
+ 0.32858276, 0.21975708, -0.050018311, -0.34790039, -0.46588135,
+ -0.26513672, 0.12893677, 0.19259644, 0.11685181, 0.095825195,
+ -0.039154053, -0.041473389, 0.0069274902, -0.14685059, -0.32232666,
+ -0.21795654, 0.051086426, 0.18112183, 0.30905151, 0.47305298,
+ 0.60980225, 0.59518433, 0.46920776, 0.51705933, 0.47116089,
+ 0.31832886, 0.20901489, 0.059539795, -0.10055542, -0.23834229,
+ -0.26708984, -0.27468872, -0.29516602, -0.22879028, -0.12854004,
+ -0.064300537, -0.0068664551, 0.060211182, 0.10339355, 0.12594604,
+ 0.12954712, 0.063568115, -0.041046143, -0.1184082, -0.19332886,
+ -0.27337646, -0.34906006, -0.40966797, -0.46533203, -0.45361328,
+ -0.39672852, -0.32958984, -0.15246582, 0.086853027, 0.23678589,
+ 0.24838257, 0.13034058, -0.15222168, -0.5199585, -0.80224609,
+ -0.9397583, -0.89654541, -0.71923828, -0.47998047, -0.14666748,
+ 0.26187134, 0.54995728, 0.69186401, 0.84616089, 0.79928589,
+ 0.53170776, 0.39968872, 0.32455444, 0.2137146, 0.19454956,
+ 0.24069214, 0.22750854, 0.14596558, 0.047058105, -0.04876709,
+ -0.13095093, -0.19775391, -0.16293335, -0.059265137, 0.027526855,
+ 0.13961792, 0.26803589, 0.35470581, 0.37600708, 0.34085083,
+ 0.2572937, 0.13265991, -0.008026123, -0.12841797, -0.22216797,
+ -0.30899048, -0.37841797, -0.4251709, -0.45947266, -0.48376465,
+ -0.50341797, -0.52294922, -0.54516602, -0.58447266, -0.62121582,
+ -0.63989258, -0.64990234, -0.63037109, -0.568573, -0.46630859,
+ -0.36468506, -0.27618408, -0.18487549, -0.11065674, -0.070404053,
+ -0.066101074, -0.049835205, -0.026611328, -0.013061523,
+ 0.011444092, 0.034576416, 0.046112061, 0.052215576, 0.045501709,
+ 0.030059814, 0.011657715, 0.026489258, 0.056121826, 0.10122681,
+ 0.20016479, 0.33053589, 0.45944214, 0.54830933, 0.57751465, 0.5625,
+ 0.55612183, 0.55319214, 0.5697937, 0.64987183, 0.73553467,
+ 0.78170776, 0.84420776, 0.89987183, 0.90475464, 0.85861206,
+ 0.75338745, 0.57077026, 0.3354187, 0.067779541, -0.1741333,
+ -0.36557007, -0.47802734, -0.51281738, -0.47766113, -0.36865234,
+ -0.22381592, -0.065765381, 0.066680908, 0.12365723, 0.098114014,
+ 0.020965576, -0.10775757, -0.27294922, -0.41845703, -0.50146484,
+ -0.52563477, -0.48291016, -0.38186646, -0.27264404, -0.16925049,
+ -0.07043457, 0.003326416, 0.025085449, -0.028320312, -0.11358643,
+ -0.18164062, -0.21984863, -0.21286011, -0.16635132, -0.12728882,
+ -0.088104248, 0.016693115, 0.18893433, 0.40280151, 0.59127808,
+ 0.67233276, 0.64682007, 0.54733276, 0.4213562, 0.30703735,
+ 0.19845581, 0.12661743, 0.095611572, 0.10531616, 0.17950439,
+ 0.29904175, 0.41726685, 0.47506714, 0.48678589, 0.48873901,
+ 0.46694946, 0.42233276, 0.38088989, 0.34689331, 0.30709839,
+ 0.26022339, 0.18258667, 0.064544678, -0.09085083, -0.25634766,
+ -0.41540527, -0.54693604, -0.62731934, -0.6809082, -0.70849609,
+ -0.71044922, -0.68469238, -0.64886475, -0.62115479, -0.6104126,
+ -0.62451172, -0.65185547, -0.67504883, -0.68969727, -0.70257568,
+ -0.71337891, -0.68994141, -0.61865234, -0.49755859, -0.32177734,
+ -0.10437012, 0.11209106, 0.30691528, 0.46789551, 0.51602173,
+ 0.44674683, 0.32055664, 0.1769104, 0.06072998, 0.0075378418,
+ -0.013641357, -0.0038146973, 0.082244873, 0.22116089, 0.35787964,
+ 0.47689819, 0.60266113, 0.71801758, 0.81747437, 0.91799927,
+ 0.97079468, 0.97677612, 0.93850708, 0.83322144, 0.65866089,
+ 0.42324829, 0.14834595, -0.10574341, -0.31484985, -0.46813965,
+ -0.54833984, -0.55517578, -0.51220703, -0.43115234, -0.34613037,
+ -0.29052734, -0.2699585, -0.29443359, -0.33349609, -0.38720703,
+ -0.45751953, -0.51318359, -0.54800415, -0.55706787, -0.5402832,
+ -0.48666382, -0.41162109, -0.32958984, -0.24560547, -0.19873047,
+ -0.18457031, -0.19171143, -0.21240234, -0.23876953, -0.25823975,
+ -0.26184082, -0.24902344, -0.21612549, -0.16552734, -0.11083984,
+ -0.058349609, -0.0034179688, 0.053283691, 0.12722778, 0.23052979,
+ 0.35769653, 0.51147461, 0.68243408, 0.85015869, 0.96902466,
+ 0.99908447, 0.99899292, 0.99453735, 0.87936401, 0.72964478,
+ 0.59124756, 0.45162964, 0.29949951, 0.18435669, 0.087219238,
+ 0.0085754395, -0.031677246, -0.057434082, -0.06338501,
+ -0.050262451, -0.021179199, 0.010986328, 0.035095215, 0.041900635,
+ 0.026275635, -0.008972168, -0.067260742, -0.14938354, -0.24298096,
+ -0.33901978, -0.44342041, -0.53179932, -0.59924316, -0.64294434,
+ -0.66220093, -0.65362549, -0.61437988, -0.56277466, -0.48764038,
+ -0.41287231, -0.3420105, -0.25909424, -0.17782593, -0.10604858,
+ -0.033355713, 0.037872314, 0.097198486, 0.15203857, 0.19644165,
+ 0.23324585, 0.2668457, 0.29403687, 0.31442261, 0.33148193,
+ 0.33639526, 0.32794189, 0.31109619, 0.30651855, 0.30456543,
+ 0.31005859, 0.32266235, 0.34017944, 0.36062622, 0.37988281,
+ 0.39459229, 0.40344238, 0.41464233, 0.41500854, 0.41091919,
+ 0.40512085, 0.39819336, 0.3843689, 0.36633301, 0.33621216,
+ 0.28076172, 0.19436646, 0.083892822, -0.056732178, -0.21832275,
+ -0.38809204, -0.55502319, -0.70330811, -0.82672119, -0.909729,
+ -0.93505859, -0.9085083, -0.84347534, -0.74786377, -0.63342285,
+ -0.52468872, -0.42883301, -0.35321045, -0.29504395, -0.26339722,
+ -0.23782349, -0.21252441, -0.19006348, -0.16159058, -0.12472534,
+ -0.075958252, -0.012115479, 0.056091309, 0.11953735, 0.17373657,
+ 0.22116089, 0.25097656, 0.25982666, 0.2539978, 0.24578857,
+ 0.24325562, 0.25292969, 0.28744507, 0.34677124, 0.42510986,
+ 0.51596069, 0.60205078, 0.67550659, 0.71774292, 0.728302,
+ 0.70874023, 0.6612854, 0.59188843, 0.49536133, 0.37322998,
+ 0.23904419, 0.10256958, -0.030303955, -0.15093994, -0.24526978,
+ -0.31253052, -0.3414917, -0.33178711, -0.29302979, -0.23806763,
+ -0.17816162, -0.13470459, -0.12387085, -0.15142822, -0.20706177,
+ -0.28427124, -0.37112427, -0.44927979, -0.50619507, -0.53219604,
+ -0.53118896, -0.49990845, -0.45379639, -0.39599609, -0.31643677,
+ -0.22329712, -0.15414429, -0.1050415, -0.075592041, -0.0753479,
+ -0.088775635, -0.099090576, -0.086639404, -0.035797119,
+ 0.052154541, 0.1661377, 0.28082275, 0.39169312, 0.50491333,
+ 0.59762573, 0.67288208, 0.71621704, 0.73251343, 0.71405029,
+ 0.66171265, 0.60040283, 0.53762817, 0.46520996, 0.3727417,
+ 0.26971436, 0.17245483, 0.092346191, 0.034851074, 0.0072937012,
+ 0.007232666, 0.017547607, 0.01852417, 0.020172119, 0.023345947,
+ 0.014434814, -0.013946533, -0.054168701, -0.094726562, -0.14425659,
+ -0.20623779, -0.27316284, -0.34069824, -0.40481567, -0.4647522,
+ -0.51278687, -0.55215454, -0.57962036, -0.58953857, -0.59140015,
+ -0.57885742, -0.55456543, -0.51055908, -0.45095825, -0.37948608,
+ -0.29974365, -0.22027588, -0.13543701, -0.047271729, 0.033721924,
+ 0.1005249, 0.14877319, 0.18429565, 0.20465088, 0.21621704,
+ 0.2272644, 0.23416138, 0.24511719, 0.26138306, 0.2805481,
+ 0.3006897, 0.32943726, 0.36660767, 0.40802002, 0.44424438,
+ 0.47698975, 0.50256348, 0.52005005, 0.5267334, 0.52258301,
+ 0.50723267, 0.47485352, 0.42205811, 0.34805298, 0.26202393,
+ 0.16522217, 0.067749023, -0.024169922, -0.1060791, -0.18280029,
+ -0.25424194, -0.31921387, -0.37774658, -0.43612671, -0.50094604,
+ -0.56121826, -0.61495972, -0.66091919, -0.69436646, -0.70004272,
+ -0.67868042, -0.63104248, -0.56182861, -0.48074341, -0.39840698,
+ -0.31900024, -0.24609375, -0.18695068, -0.1461792, -0.11993408,
+ -0.11032104, -0.10159302, -0.091918945, -0.076904297, -0.069580078,
+ -0.058898926, -0.038146973, -0.012542725, 0.014831543, 0.043304443,
+ 0.082824707, 0.13180542, 0.1895752, 0.25256348, 0.32229614,
+ 0.38531494, 0.43493652, 0.4697876, 0.48736572, 0.48733521,
+ 0.46533203, 0.42901611, 0.38223267, 0.33636475, 0.2819519,
+ 0.22467041, 0.16455078, 0.10604858, 0.047485352, -0.010040283,
+ -0.057098389, -0.093933105, -0.12252808, -0.14291382, -0.15545654,
+ -0.16064453, -0.16348267, -0.16918945, -0.17095947, -0.17773438,
+ -0.19436646, -0.21868896, -0.25158691, -0.2890625, -0.33297729,
+ -0.37677002, -0.41171265, -0.43563843, -0.44619751, -0.44320679,
+ -0.42520142, -0.39151001, -0.34609985, -0.29324341, -0.23846436,
+ -0.18026733, -0.12319946, -0.068023682, -0.017944336, 0.033691406,
+ 0.08416748, 0.13388062, 0.18310547, 0.23513794, 0.28579712,
+ 0.3314209, 0.37133789, 0.40841675, 0.44143677, 0.46252441,
+ 0.47073364, 0.46435547, 0.44342041, 0.40725708, 0.35971069,
+ 0.30911255, 0.26272583, 0.22372437, 0.19876099, 0.18948364,
+ 0.18948364, 0.19799805, 0.21658325, 0.23733521, 0.25439453,
+ 0.26513672, 0.26702881, 0.25582886, 0.2338562, 0.19677734,
+ 0.15100098, 0.097106934, 0.036804199, -0.02456665, -0.087005615,
+ -0.14819336, -0.20632935, -0.26040649, -0.30117798, -0.33422852,
+ -0.35610962, -0.36178589, -0.3522644, -0.3237915, -0.28857422,
+ -0.24789429, -0.20108032, -0.14822388, -0.097442627, -0.055877686,
+ -0.019500732, 0.0064086914, 0.024627686, 0.033721924, 0.042114258,
+ 0.052032471, 0.069763184, 0.094207764, 0.12030029, 0.14993286,
+ 0.18215942, 0.22003174, 0.26171875, 0.30029297, 0.33355713,
+ 0.35992432, 0.3833313, 0.40148926, 0.41094971, 0.40899658,
+ 0.39849854, 0.37387085, 0.34091187, 0.30215454, 0.26016235,
+ 0.2170105, 0.17681885, 0.13604736, 0.093658447, 0.049316406,
+ 0.0074462891, -0.037322998, -0.086120605, -0.13262939, -0.18286133,
+ -0.22872925, -0.26879883, -0.3026123, -0.33206177, -0.35943604,
+ -0.37924194, -0.39431763, -0.40466309, -0.40936279, -0.40270996,
+ -0.38815308, -0.36676025, -0.3421936, -0.31149292, -0.27597046,
+ -0.24679565, -0.22177124, -0.20294189, -0.19259644, -0.18527222,
+ -0.18157959, -0.17645264, -0.16998291, -0.1524353, -0.12554932,
+ -0.086669922, -0.03894043, 0.016204834, 0.075744629, 0.13665771,
+ 0.18896484, 0.23040771, 0.26107788, 0.28408813, 0.29443359,
+ 0.29440308, 0.28460693, 0.27456665, 0.26107788, 0.24020386,
+ 0.21322632, 0.18551636, 0.15698242, 0.12554932, 0.095855713,
+ 0.069152832, 0.045501709, 0.020141602, -0.0030517578, -0.026702881,
+ -0.0496521, -0.071960449, -0.098327637, -0.12268066, -0.14907837,
+ -0.17523193, -0.20068359, -0.22494507, -0.2482605, -0.27352905,
+ -0.29666138, -0.31420898, -0.32751465, -0.33670044, -0.33874512,
+ -0.32943726, -0.31417847, -0.29504395, -0.26898193, -0.23904419,
+ -0.20245361, -0.16390991, -0.1210022, -0.078308105, -0.039337158,
+ -0.0037231445, 0.029174805, 0.05847168, 0.084106445, 0.1078186,
+ 0.13174438, 0.15719604, 0.17941284, 0.20126343, 0.22348022,
+ 0.2432251, 0.2578125, 0.2640686, 0.26593018, 0.25933838,
+ 0.24685669, 0.2288208, 0.21047974, 0.19494629, 0.18075562,
+ 0.17199707, 0.17199707, 0.17175293, 0.1729126, 0.17126465,
+ 0.16873169, 0.16256714, 0.15036011, 0.1355896, 0.11254883,
+ 0.083465576, 0.050079346, 0.01159668, -0.030029297, -0.074707031,
+ -0.11532593, -0.15432739, -0.18942261, -0.21673584, -0.23681641,
+ -0.24554443, -0.24703979, -0.24472046, -0.23815918, -0.22784424,
+ -0.21243286, -0.19384766, -0.17596436, -0.15844727, -0.14089966,
+ -0.12030029, -0.099395752, -0.076538086, -0.058746338,
+ -0.034484863, -0.0097351074, 0.015625, 0.037445068, 0.063079834,
+ 0.087738037, 0.11401367, 0.13973999, 0.16848755, 0.19680786,
+ 0.2244873, 0.25567627, 0.28305054, 0.30465698, 0.31854248,
+ 0.32287598, 0.31808472, 0.30102539, 0.27633667, 0.24591064,
+ 0.20962524, 0.17144775, 0.13021851, 0.09487915, 0.057861328,
+ 0.023651123, -0.014129639, -0.051239014, -0.086639404, -0.12316895,
+ -0.15304565, -0.18545532, -0.21154785, -0.23434448, -0.25100708,
+ -0.26113892, -0.26712036, -0.26678467, -0.26687622, -0.262146,
+ -0.25656128, -0.24734497, -0.23501587, -0.22433472, -0.20773315,
+ -0.19207764, -0.17459106, -0.15997314, -0.14196777, -0.12670898,
+ -0.1166687, -0.10726929, -0.099243164, -0.090179443, -0.078521729,
+ -0.062225342, -0.038360596, -0.0068054199, 0.031402588,
+ 0.072143555, 0.11181641, 0.15362549, 0.19085693, 0.22195435,
+ 0.24661255, 0.26379395, 0.27166748, 0.27072144, 0.26507568,
+ 0.25247192, 0.2348938, 0.21447754, 0.18756104, 0.15771484,
+ 0.13241577, 0.10873413, 0.087036133, 0.065460205, 0.046875,
+ 0.029754639, 0.013153076, -0.0065917969, -0.024993896,
+ -0.046051025, -0.067810059, -0.092285156, -0.11779785, -0.14529419,
+ -0.17376709, -0.19503784, -0.21487427, -0.23205566, -0.24533081,
+ -0.25128174, -0.2522583, -0.24685669, -0.23486328, -0.21954346,
+ -0.19946289, -0.1786499, -0.15280151, -0.12744141, -0.098022461,
+ -0.069091797, -0.038146973, -0.0079040527, 0.024719238,
+ 0.054351807, 0.082275391, 0.11019897, 0.13510132, 0.15545654,
+ 0.17276001, 0.1854248, 0.19042969, 0.19281006, 0.1930542,
+ 0.19232178, 0.18795776, 0.17938232, 0.17156982, 0.16223145,
+ 0.15603638, 0.15182495, 0.15118408, 0.14651489, 0.14263916,
+ 0.13916016, 0.1343689, 0.12649536, 0.11480713, 0.10400391,
+ 0.091766357, 0.079589844, 0.063781738, 0.04776001, 0.029510498,
+ 0.013061523, -0.0087890625, -0.034454346, -0.06362915,
+ -0.097381592, -0.12896729, -0.15893555, -0.18429565, -0.20910645,
+ -0.22930908, -0.2411499, -0.25009155, -0.2505188, -0.24719238,
+ -0.23956299, -0.22445679, -0.20892334, -0.18774414, -0.16699219,
+ -0.14205933, -0.12145996, -0.10317993, -0.085449219, -0.066101074,
+ -0.050048828, -0.03326416, -0.014404297, 0.0099182129, 0.041809082,
+ 0.077087402, 0.11599731, 0.14718628, 0.18060303, 0.20654297,
+ 0.23117065, 0.25247192, 0.27026367, 0.28042603, 0.27871704,
+ 0.27175903, 0.25527954, 0.2315979, 0.20584106, 0.17654419,
+ 0.1446228, 0.1086731, 0.073699951, 0.040588379, 0.011627197,
+ -0.016143799, -0.044189453, -0.071838379, -0.098449707,
+ -0.12316895, -0.14602661, -0.16595459, -0.17871094, -0.18606567,
+ -0.19488525, -0.20278931, -0.209198, -0.21121216, -0.21276855,
+ -0.21395874, -0.21328735, -0.21072388, -0.20718384, -0.20404053,
+ -0.19812012, -0.19073486, -0.17901611, -0.16781616, -0.15267944,
+ -0.13824463, -0.12042236, -0.098999023, -0.077453613, -0.053497314,
+ -0.029022217, -0.001373291, 0.022583008, 0.050720215, 0.077026367,
+ 0.10748291, 0.13626099, 0.16424561, 0.18908691, 0.21191406,
+ 0.2300415, 0.2428894, 0.25292969, 0.25643921, 0.25924683,
+ 0.25518799, 0.24127197, 0.22161865, 0.19989014, 0.17800903,
+ 0.14935303, 0.12268066, 0.094787598, 0.068878174, 0.041046143,
+ 0.018585205, 0.0020141602, -0.0094604492, -0.01651001, -0.02243042,
+ -0.031860352, -0.049102783, -0.072113037, -0.098083496,
+ -0.12472534, -0.14935303, -0.17062378, -0.18566895, -0.19500732,
+ -0.19784546, -0.19299316, -0.18365479, -0.17153931, -0.1555481,
+ -0.13491821, -0.11233521, -0.090209961, -0.063781738, -0.038879395,
+ -0.017089844, 0.0027770996, 0.021697998, 0.041046143, 0.059844971,
+ 0.078674316, 0.093536377, 0.10656738, 0.11816406, 0.12698364,
+ 0.13323975, 0.13742065, 0.14559937, 0.1522522, 0.15563965,
+ 0.15548706, 0.1583252, 0.15756226, 0.15576172, 0.15216064,
+ 0.1479187, 0.14260864, 0.13577271, 0.1272583, 0.11904907,
+ 0.10968018, 0.10412598, 0.096618652, 0.087615967, 0.07522583,
+ 0.059265137, 0.039978027, 0.017852783, -0.0061950684, -0.029510498,
+ -0.05065918, -0.075500488, -0.099395752, -0.12225342, -0.1418457,
+ -0.16101074, -0.17797852, -0.1932373, -0.20556641, -0.20901489,
+ -0.21026611, -0.20684814, -0.20016479, -0.18768311, -0.17312622,
+ -0.15994263, -0.14834595, -0.13482666, -0.11865234, -0.10229492,
+ -0.083404541, -0.063079834, -0.039276123, -0.014129639,
+ 0.011199951, 0.035583496, 0.059417725, 0.079925537, 0.098571777,
+ 0.11416626, 0.1270752, 0.14013672, 0.15286255, 0.16619873,
+ 0.17810059, 0.18783569, 0.19454956, 0.19598389, 0.19143677,
+ 0.18264771, 0.16867065, 0.15258789, 0.13143921, 0.10482788,
+ 0.075073242, 0.045928955, 0.018371582, -0.0075683594, -0.032928467,
+ -0.054992676, -0.072662354, -0.089813232, -0.10479736, -0.12127686,
+ -0.13748169, -0.15161133, -0.16473389, -0.17370605, -0.18240356,
+ -0.18569946, -0.18682861, -0.18756104, -0.18310547, -0.18099976,
+ -0.17584229, -0.17102051, -0.16162109, -0.15145874, -0.1421814,
+ -0.12973022, -0.11398315, -0.096557617, -0.078460693, -0.061035156,
+ -0.042541504, -0.023590088, -0.0029296875, 0.020996094,
+ 0.044403076, 0.068237305, 0.092926025, 0.11682129, 0.13772583,
+ 0.15460205, 0.17050171, 0.18438721, 0.19360352, 0.19952393,
+ 0.20303345, 0.2048645, 0.20132446, 0.1930542, 0.18280029,
+ 0.16989136, 0.1546936, 0.13711548, 0.12115479, 0.10336304,
+ 0.087890625, 0.068023682, 0.049804688, 0.028320312, 0.0081787109,
+ -0.012664795, -0.030334473, -0.046783447, -0.061584473,
+ -0.073883057, -0.084655762, -0.093719482, -0.10314941, -0.11251831,
+ -0.12094116, -0.1300354, -0.13421631, -0.13647461, -0.13491821,
+ -0.13186646, -0.12530518, -0.11520386, -0.10275269, -0.088775635,
+ -0.074310303, -0.061462402, -0.046875, -0.032409668, -0.014892578,
+ 0.00057983398, 0.016967773, 0.031738281, 0.0440979, 0.054656982,
+ 0.063659668, 0.073791504, 0.081176758, 0.088562012, 0.095916748,
+ 0.10043335, 0.10443115, 0.10519409, 0.1076355, 0.1071167,
+ 0.10748291, 0.10601807, 0.1026001, 0.10031128, 0.095123291,
+ 0.08972168, 0.082763672, 0.075164795, 0.06729126, 0.057922363,
+ 0.049865723, 0.042144775, 0.035125732, 0.026367188, 0.016571045,
+ 0.0040893555, -0.0084228516, -0.025054932, -0.042053223,
+ -0.060974121, -0.077178955, -0.093902588, -0.10845947, -0.1229248,
+ -0.13531494, -0.14489746, -0.15274048, -0.15701294, -0.15966797,
+ -0.15670776, -0.15130615, -0.140625, -0.12561035, -0.10900879,
+ -0.091644287, -0.077362061, -0.063690186, -0.051879883,
+ -0.04083252, -0.028869629, -0.017059326, -0.0053710938,
+ 0.0051574707, 0.020172119, 0.034484863, 0.051361084, 0.067810059,
+ 0.085540771, 0.10223389, 0.11761475, 0.13146973, 0.14044189,
+ 0.1468811, 0.14923096, 0.14846802, 0.14407349, 0.13641357,
+ 0.12796021, 0.11773682, 0.1076355, 0.09463501, 0.081207275,
+ 0.065124512, 0.050323486, 0.035552979, 0.020965576, 0.0063476562,
+ -0.0094299316, -0.024810791, -0.040008545, -0.054534912,
+ -0.0703125, -0.084228516, -0.096862793, -0.10809326, -0.1171875,
+ -0.12515259, -0.13067627, -0.13568115, -0.13632202, -0.13449097,
+ -0.131073, -0.12503052, -0.11868286, -0.11099243, -0.10317993,
+ -0.095306396, -0.087158203, -0.077667236, -0.068115234,
+ -0.059082031, -0.047241211, -0.033966064, -0.019805908,
+ -0.0041503906, 0.012573242, 0.030029297, 0.047637939, 0.063751221,
+ 0.079162598, 0.092987061, 0.1055603, 0.11737061, 0.12628174,
+ 0.13504028, 0.14266968, 0.14840698, 0.1519165, 0.15158081,
+ 0.14685059, 0.14041138, 0.13082886, 0.11962891, 0.10525513,
+ 0.089599609, 0.072784424, 0.057556152, 0.044464111, 0.032470703,
+ 0.02053833, 0.0086364746, -0.0019226074, -0.013336182,
+ -0.026184082, -0.039398193, -0.052368164, -0.064605713,
+ -0.076293945, -0.086303711, -0.09475708, -0.10128784, -0.10568237,
+ -0.10748291, -0.10894775, -0.10787964, -0.10577393, -0.10229492,
+ -0.097198486, -0.090087891, -0.081695557, -0.07244873,
+ -0.062927246, -0.051940918, -0.041748047, -0.028839111,
+ -0.015960693, -0.0022277832, 0.011779785, 0.024932861, 0.038482666,
+ 0.048614502, 0.059326172, 0.066925049, 0.072021484, 0.077026367,
+ 0.079681396, 0.082733154, 0.082855225, 0.081481934, 0.08001709,
+ 0.079833984, 0.079345703, 0.079162598, 0.078582764, 0.078521729,
+ 0.078582764, 0.077575684, 0.073059082, 0.065612793, 0.055480957,
+ 0.044189453, 0.031768799, 0.019744873, 0.008972168, -0.00094604492,
+ -0.0081176758, -0.013885498, -0.018463135, -0.025634766,
+ -0.032623291, -0.041442871, -0.05279541, -0.0652771, -0.078399658,
+ -0.088256836, -0.098297119, -0.10681152, -0.112854, -0.11355591,
+ -0.11132812, -0.10617065, -0.098449707, -0.087738037, -0.077606201,
+ -0.068054199, -0.059051514, -0.051330566, -0.041503906,
+ -0.031066895, -0.019470215, -0.0077514648, 0.0030517578,
+ 0.014892578, 0.026062012, 0.038879395, 0.050079346, 0.060028076,
+ 0.069793701, 0.076568604, 0.082611084, 0.088989258, 0.094360352,
+ 0.098754883, 0.10293579, 0.10635376, 0.10720825, 0.10586548,
+ 0.10314941, 0.0987854, 0.093475342, 0.087432861, 0.079406738,
+ 0.070159912, 0.059204102, 0.048095703, 0.036529541, 0.023071289,
+ 0.010406494, -0.0024719238, -0.01361084, -0.026184082,
+ -0.036682129, -0.047180176, -0.056213379, -0.065765381,
+ -0.07510376, -0.082702637, -0.091064453, -0.09677124, -0.10232544,
+ -0.10546875, -0.1072998, -0.10693359, -0.10385132, -0.10055542,
+ -0.093078613, -0.085235596, -0.075439453, -0.065643311,
+ -0.054138184, -0.042449951, -0.029785156, -0.017822266,
+ -0.0068359375, 0.0038452148, 0.01373291, 0.023773193, 0.033081055,
+ 0.042053223, 0.049560547, 0.057952881, 0.066223145, 0.075775146,
+ 0.083190918, 0.08984375, 0.096191406, 0.10202026, 0.10595703,
+ 0.10742188, 0.10778809, 0.10528564, 0.1020813, 0.096069336,
+ 0.08883667, 0.07925415, 0.069458008, 0.057952881, 0.047454834,
+ 0.036804199, 0.026397705, 0.015777588, 0.004119873, -0.0077819824,
+ -0.019927979, -0.030822754, -0.040405273, -0.048980713,
+ -0.056610107, -0.062805176, -0.069366455, -0.074035645,
+ -0.077026367, -0.079406738, -0.079986572, -0.080322266,
+ -0.078338623, -0.07598877, -0.072479248, -0.067230225,
+ -0.061218262, -0.055847168, -0.050048828, -0.043823242,
+ -0.037536621, -0.030792236, -0.02230835, -0.012634277,
+ -0.0030822754, 0.0069580078, 0.016204834, 0.023040771, 0.03024292,
+ 0.036865234, 0.043518066, 0.051025391, 0.056396484, 0.061645508,
+ 0.063720703, 0.065185547, 0.065032959, 0.0652771, 0.06439209,
+ 0.06451416, 0.063598633, 0.062011719, 0.058654785, 0.055297852,
+ 0.053131104, 0.051208496, 0.048950195, 0.046905518, 0.042175293,
+ 0.035675049, 0.028411865, 0.019622803, 0.0091247559, -0.0016174316,
+ -0.012207031, -0.022521973, -0.031616211, -0.040618896,
+ -0.047302246, -0.052734375, -0.057098389, -0.060455322,
+ -0.064849854, -0.068664551, -0.07321167, -0.074829102, -0.07623291,
+ -0.075378418, -0.072814941, -0.069152832, -0.064819336,
+ -0.059417725, -0.052368164, -0.044769287, -0.036712646,
+ -0.027679443, -0.018005371, -0.0093383789, 0.0010375977,
+ 0.011474609, 0.022399902, 0.03125, 0.03793335, 0.042449951,
+ 0.045379639, 0.048065186, 0.050567627, 0.054260254, 0.058166504,
+ 0.062316895, 0.066436768, 0.068786621, 0.072113037, 0.074707031,
+ 0.077453613, 0.076507568, 0.074523926, 0.071838379, 0.06729126,
+ 0.061126709, 0.053771973, 0.045410156, 0.037078857, 0.027862549,
+ 0.019134521, 0.0096435547, 0.00079345703, -0.0076293945,
+ -0.016296387, -0.024810791, -0.034454346, -0.043334961,
+ -0.052703857, -0.06048584, -0.066101074, -0.070739746, -0.07220459,
+ -0.073394775, -0.072967529, -0.072509766, -0.072296143,
+ -0.070404053, -0.06842041, -0.064819336, -0.062072754,
+ -0.058624268, -0.05380249, -0.048400879, -0.039764404,
+ -0.031280518, -0.021881104, -0.012786865, -0.0053100586,
+ 0.0022888184, 0.0081176758, 0.014038086, 0.020568848, 0.026885986,
+ 0.032867432, 0.037628174, 0.042999268, 0.046722412, 0.052276611,
+ 0.056884766, 0.061584473, 0.065124512, 0.066955566, 0.068054199,
+ 0.067565918, 0.066589355, 0.06362915, 0.058410645, 0.052764893,
+ 0.045349121, 0.036987305, 0.029144287, 0.021606445, 0.015197754,
+ 0.0087280273, 0.0020446777, -0.004699707, -0.012115479,
+ -0.018920898, -0.02633667, -0.032897949, -0.037841797,
+ -0.042205811, -0.046783447, -0.050567627, -0.055114746,
+ -0.05847168, -0.061004639, -0.061401367, -0.059173584,
+ -0.056915283, -0.053955078, -0.049255371, -0.043121338,
+ -0.037384033, -0.032501221, -0.027709961, -0.023468018,
+ -0.018951416, -0.01385498, -0.0096740723, -0.005279541,
+ -0.0010986328, 0.0033874512, 0.0088806152, 0.01348877, 0.01953125,
+ 0.025024414, 0.031097412, 0.036895752, 0.0418396, 0.045837402,
+ 0.048492432, 0.050231934, 0.051208496, 0.052490234, 0.052856445,
+ 0.053344727, 0.052581787, 0.051452637, 0.049224854, 0.046356201,
+ 0.042938232, 0.038543701, 0.034362793, 0.029602051, 0.025726318,
+ 0.021606445, 0.017272949, 0.013641357, 0.009185791, 0.0037841797,
+ -0.0022888184, -0.0105896, -0.019439697, -0.027709961,
+ -0.034454346, -0.039642334, -0.044464111, -0.046569824,
+ -0.048400879, -0.047546387, -0.046142578, -0.043395996,
+ -0.040405273, -0.037994385, -0.035217285, -0.03414917,
+ -0.031890869, -0.029205322, -0.026306152, -0.021820068,
+ -0.018035889, -0.01361084, -0.0084228516, -0.001373291,
+ 0.0057067871, 0.011962891, 0.018157959, 0.022766113, 0.02722168,
+ 0.030090332, 0.032928467, 0.03503418, 0.036895752, 0.039001465,
+ 0.04107666, 0.042816162, 0.04397583, 0.045074463, 0.045562744,
+ 0.045654297, 0.045532227, 0.045135498, 0.043518066, 0.040618896,
+ 0.036437988, 0.032012939, 0.027099609, 0.021911621, 0.016296387,
+ 0.010955811, 0.006072998, 0.00048828125, -0.0053100586,
+ -0.011535645, -0.017303467, -0.023529053, -0.028717041,
+ -0.03427124, -0.038604736, -0.042572021, -0.045074463,
+ -0.046661377, -0.047851562, -0.04776001, -0.047668457,
+ -0.046691895, -0.045379639, -0.04385376, -0.042297363,
+ -0.040435791, -0.037322998, -0.033691406, -0.029205322,
+ -0.024749756, -0.019775391, -0.014556885, -0.0090942383,
+ -0.0034790039, 0.0011901855, 0.0063171387, 0.0095214844,
+ 0.013519287, 0.016174316, 0.019622803, 0.022094727, 0.024627686,
+ 0.027435303, 0.029876709, 0.032958984, 0.035858154, 0.038208008,
+ 0.039398193, 0.040374756, 0.040222168, 0.039978027, 0.039154053,
+ 0.037811279, 0.034820557, 0.030822754, 0.025695801, 0.020721436,
+ 0.015991211, 0.010864258, 0.006439209, 0.0018005371, -0.002166748,
+ -0.0062561035, -0.0096740723, -0.013244629, -0.01663208,
+ -0.019927979, -0.023742676, -0.026611328, -0.029907227,
+ -0.032684326, -0.035064697, -0.037261963, -0.037811279,
+ -0.037902832, -0.036437988, -0.033233643, -0.029876709,
+ -0.026031494, -0.021759033, -0.017456055, -0.014251709,
+ -0.011566162, -0.0094909668, -0.0071105957, -0.0048217773,
+ -0.0027770996, 0.00036621094, 0.0036010742, 0.0076904297,
+ 0.01159668, 0.015350342, 0.019226074, 0.021697998, 0.024749756,
+ 0.026947021, 0.029266357, 0.030853271, 0.032104492, 0.032470703,
+ 0.032165527, 0.03225708, 0.031860352, 0.03213501, 0.032104492,
+ 0.03213501, 0.031860352, 0.031005859, 0.029205322, 0.026550293,
+ 0.023406982, 0.01940918, 0.015258789, 0.010437012, 0.005859375,
+ 0.0013122559, -0.003112793, -0.0067443848, -0.010040283,
+ -0.01361084, -0.016662598, -0.020324707, -0.023193359,
+ -0.026062012, -0.028503418, -0.029663086, -0.030487061,
+ -0.030059814, -0.029418945, -0.027374268, -0.025024414,
+ -0.022857666, -0.0206604, -0.018585205, -0.016113281, -0.013397217,
+ -0.010192871, -0.0072021484, -0.0043029785, -0.002166748, 0,
+ 0.0024414062, 0.005065918, 0.0079345703, 0.01071167, 0.012878418,
+ 0.015380859, 0.017669678, 0.019958496, 0.021575928, 0.023284912,
+ 0.024078369, 0.024719238, 0.025024414, 0.02557373, 0.02633667,
+ 0.026275635, 0.02520752, 0.024017334, 0.022369385, 0.021057129,
+ 0.019622803, 0.017578125, 0.015258789, 0.012054443, 0.0086975098,
+ 0.0051269531, 0.0020141602, -0.00082397461, -0.00390625,
+ -0.0068054199, -0.010406494, -0.014129639, -0.017425537,
+ -0.020385742, -0.02230835, -0.025054932, -0.026916504,
+ -0.028961182, -0.029724121, -0.029937744, -0.029907227,
+ -0.02911377, -0.027770996, -0.025238037, -0.023010254,
+ -0.019714355, -0.016540527, -0.013641357, -0.011077881,
+ -0.008605957, -0.0062866211, -0.0043945312, -0.0021972656,
+ -0.00067138672, 0.0012512207, 0.0020751953, 0.0036315918,
+ 0.0053405762, 0.0081481934, 0.011352539, 0.014709473, 0.017944336,
+ 0.020202637, 0.022003174, 0.023742676, 0.02520752, 0.026031494,
+ 0.026062012, 0.025421143, 0.024261475, 0.022766113, 0.020904541,
+ 0.019287109, 0.017852783, 0.017333984, 0.017181396, 0.016357422,
+ 0.014770508, 0.012298584, 0.0095825195, 0.0057373047, 0.0017089844,
+ -0.0032043457, -0.0075073242, -0.011260986, -0.014068604,
+ -0.016021729, -0.017608643, -0.0184021, -0.019104004, -0.019775391,
+ -0.020507812, -0.020721436, -0.020355225, -0.019348145,
+ -0.017974854, -0.016235352, -0.014648438, -0.013183594,
+ -0.011657715, -0.010498047, -0.0097961426, -0.0091552734,
+ -0.0082702637, -0.0070800781, -0.0055236816, -0.003112793,
+ -0.00054931641, 0.0024719238, 0.0049743652, 0.0075073242,
+ 0.0095825195, 0.011352539, 0.012512207, 0.013580322, 0.014251709,
+ 0.015045166, 0.016113281, 0.017089844, 0.018096924, 0.018890381,
+ 0.019897461, 0.020629883, 0.020965576, 0.020782471, 0.019744873,
+ 0.018371582, 0.016113281, 0.014068604, 0.011260986, 0.0094604492,
+ 0.0072631836, 0.0054016113, 0.0033874512, 0.0014343262,
+ -0.0007019043, -0.0032958984, -0.0055847168, -0.0082397461,
+ -0.010650635, -0.013275146, -0.015167236, -0.016662598,
+ -0.017852783, -0.018218994, -0.018157959, -0.017486572,
+ -0.017181396, -0.01675415, -0.01651001, -0.015808105, -0.015014648,
+ -0.01385498, -0.012390137, -0.01083374, -0.0090332031,
+ -0.0072937012, -0.0054626465, -0.0038757324, -0.0022888184,
+ -0.00051879883, 0.0011901855, 0.0027770996, 0.0043334961,
+ 0.0057067871, 0.0071716309, 0.0084533691, 0.010101318, 0.011047363,
+ 0.011993408, 0.012969971, 0.013092041, 0.013427734, 0.013641357,
+ 0.013946533, 0.014221191, 0.014099121, 0.01385498, 0.012756348,
+ 0.012054443, 0.011322021, 0.010162354, 0.0087280273, 0.0073547363,
+ 0.0061950684, 0.0046386719, 0.0029602051, 0.0014953613,
+ -0.00033569336, -0.0021362305, -0.0043640137, -0.0064086914,
+ -0.0086975098, -0.010498047, -0.012023926, -0.013092041,
+ -0.013366699, -0.01348877, -0.013793945, -0.013763428,
+ -0.013977051, -0.013824463, -0.013519287, -0.013305664,
+ -0.012878418, -0.012390137, -0.011352539, -0.010131836,
+ -0.0085144043, -0.0065307617, -0.0048217773, -0.0028076172,
+ -0.00094604492, 0.00082397461, 0.0019836426, 0.0028991699,
+ 0.0037841797, 0.0042114258, 0.0050048828, 0.0057067871,
+ 0.0067443848, 0.0078735352, 0.0088195801, 0.0099182129,
+ 0.010986328, 0.011657715, 0.012145996, 0.012573242, 0.012969971,
+ 0.013000488, 0.0128479, 0.012481689, 0.011993408, 0.011352539,
+ 0.010498047, 0.0093688965, 0.0081176758, 0.0067749023,
+ 0.0054931641, 0.0044250488, 0.0032958984, 0.001953125,
+ 0.00054931641, -0.00085449219, -0.0026855469, -0.0042114258,
+ -0.0060119629, -0.0071716309, -0.0086364746, -0.0095825195,
+ -0.010284424, -0.010528564, -0.010498047, -0.010284424,
+ -0.0096740723, -0.0094299316, -0.0088195801, -0.0082092285,
+ -0.0076599121, -0.007232666, -0.0068359375, -0.0063171387,
+ -0.0056152344, -0.0047607422, -0.0038146973, -0.0027770996,
+ -0.0015563965, -0.00061035156, 0.00057983398, 0.0016174316,
+ 0.002532959, 0.0032348633, 0.0037536621, 0.0041503906,
+ 0.0043945312, 0.0048217773, 0.0053405762, 0.0060119629,
+ 0.0067443848, 0.0075073242, 0.0080566406, 0.0084228516,
+ 0.008392334, 0.0083618164, 0.0080566406, 0.0076293945,
+ 0.0071411133, 0.0067749023, 0.0062255859, 0.0054626465,
+ 0.0046081543, 0.0036315918, 0.0026550293, 0.0014648438,
+ 0.0002746582, -0.00076293945, -0.0018615723, -0.0027160645,
+ -0.0035400391, -0.0041809082, -0.0048522949, -0.0054626465,
+ -0.0061035156, -0.0067138672, -0.0072021484, -0.0072937012,
+ -0.0072937012, -0.0069885254, -0.0065002441, -0.0059204102,
+ -0.0051269531, -0.0045471191, -0.0039672852, -0.0036010742,
+ -0.0031738281, -0.0027770996, -0.0023803711, -0.0018310547,
+ -0.0012817383, -0.00064086914, -3.0517578e-05, 0.00064086914,
+ 0.0011901855, 0.0017700195, 0.0021972656, 0.002532959,
+ 0.0028381348, 0.003112793, 0.0034484863, 0.0038146973,
+ 0.0040893555, 0.0043334961, 0.0044250488, 0.0044555664,
+ 0.0045776367, 0.0046691895, 0.0047302246, 0.0046691895,
+ 0.0045471191, 0.0042724609, 0.00390625, 0.0035095215, 0.0029296875,
+ 0.0024414062, 0.001953125, 0.0014343262, 0.00085449219,
+ 0.00021362305, -0.00018310547, -0.00073242188, -0.0012207031,
+ -0.001739502, -0.002166748, 0
+ };
+
+static const unsigned defaultClickLength = sizeof(defaultClick) / sizeof(*defaultClick);
+
+static const float defaultClickEmphasis[] = {
+ 0.002166748, 0.0023193359, 0.001739502, 0.002166748, 0.0021362305,
+ 0.0018615723, 0.0020446777, 0.002166748, 0.0019836426, 0.0022277832,
+ 0.0018310547, 0.0023803711, 0.0022277832, 0.001953125, 0.0022888184,
+ 0.0018005371, 0.0025024414, 0.0018310547, 0.0019836426, 0.001953125,
+ 0.0020446777, 0.0017700195, 0.0021057129, 0.0020751953,
+ 0.0019836426, 0.0014343262, 0.0024414062, 0.0015869141,
+ 0.0022888184, 0.0016784668, 0.0025024414, 0.0017089844,
+ 0.0024719238, 0.0020141602, 0.0026855469, 0.0013427734,
+ 0.0028381348, 0.0015563965, 0.0020446777, 0.0018615723, 0.002532959,
+ 0.0015258789, 0.0021972656, 0.0016784668, 0.002166748, 0.0016479492,
+ 0.0021362305, 0.0018920898, 0.0021362305, 0.0017700195,
+ 0.0020141602, 0.0022277832, 0.001739502, 0.0022583008, 0.001953125,
+ 0.0021362305, 0.0018920898, 0.0020446777, 0.001953125, 0.0026550293,
+ 0.0014953613, 0.0023803711, 0.001953125, 0.0021972656, 0.0015869141,
+ 0.0017700195, 0.0020141602, 0.0022277832, 0.0015258789,
+ 0.0015869141, -0.0045471191, -0.011230469, -0.009185791,
+ -0.0038757324, -0.020690918, -0.030731201, -0.0088806152,
+ 0.0032958984, -0.0068664551, -0.0024719238, 0.024688721,
+ 0.035400391, 0.014892578, 0.0047607422, 0.011779785, 0.0035095215,
+ -0.012573242, -0.0059814453, 0.0065612793, 0.0039672852,
+ 0.0014343262, 0.010406494, 0.027374268, 0.021942139, 0.0065612793,
+ 0.010681152, 0.024688721, 0.024291992, 0.012451172, 0.023590088,
+ 0.033203125, 0.024139404, 0.010375977, 0.016662598, 0.026885986,
+ 0.039215088, 0.038330078, 0.039703369, 0.048309326, 0.046447754,
+ 0.029937744, 0.031311035, 0.066497803, 0.052856445, -0.0074768066,
+ -0.016998291, 0.016784668, 0.039428711, 0.021759033, 0.0040893555,
+ -0.0016174316, 0.012451172, 0.052215576, 0.047485352, 0.017150879,
+ 0.015075684, 0.013397217, 0.024475098, 0.035247803, 0.039978027,
+ 0.06137085, 0.080108643, 0.078521729, 0.054779053, 0.0625,
+ 0.1076355, 0.10934448, 0.079803467, 0.056945801, 0.056182861,
+ 0.047851562, 0.028503418, 0.022979736, 0.010803223, -0.015686035,
+ -0.050811768, -0.072509766, -0.057891846, -0.032073975,
+ -0.051300049, -0.078887939, -0.069366455, -0.038146973,
+ -0.0099182129, 0.010528564, 0.048492432, 0.082305908, 0.084838867,
+ 0.059753418, 0.0043029785, -0.087158203, -0.18395996, -0.2911377,
+ -0.37133789, -0.33422852, -0.28649902, -0.31976318, -0.33630371,
+ -0.22824097, 0.020385742, 0.24456787, 0.31582642, 0.37380981,
+ 0.40820312, 0.40539551, 0.41415405, 0.34210205, 0.20877075,
+ 0.010498047, -0.17623901, -0.22705078, -0.15548706, -0.039855957,
+ 0.0067443848, -0.0022277832, -0.050048828, -0.10186768, -0.11407471,
+ -0.1050415, -0.067352295, 0.0018615723, 0.079742432, 0.11517334,
+ 0.12005615, 0.14709473, 0.19543457, 0.2015686, 0.150177,
+ 0.052703857, -0.029602051, -0.084838867, -0.14590454, -0.18951416,
+ -0.18814087, -0.15014648, -0.11505127, -0.094360352, -0.076721191,
+ -0.037872314, 0.011749268, 0.034851074, 0.060791016, 0.11419678,
+ 0.14096069, 0.13140869, 0.1277771, 0.12313843, 0.10934448,
+ 0.055541992, -0.026397705, -0.07144165, -0.050262451, -0.0097961426,
+ -0.02822876, -0.15008545, -0.28927612, -0.32809448, -0.2772522,
+ -0.15994263, 0.016448975, 0.13085938, 0.12866211, 0.1072998,
+ 0.094177246, 0.036346436, -0.026245117, -0.040496826, -0.01348877,
+ 0.0085144043, 0.0070800781, -0.0086669922, -0.0038452148,
+ 0.040252686, 0.077026367, 0.071960449, 0.032470703, 0.002166748,
+ 0.0065612793, 0.0053100586, -0.025115967, -0.058532715,
+ -0.060699463, -0.015563965, 0.048278809, 0.086273193, 0.078582764,
+ 0.031524658, -0.026580811, -0.077911377, -0.11288452, -0.13244629,
+ -0.15325928, -0.14471436, -0.095672607, -0.048858643, -0.012115479,
+ 0.023132324, 0.051544189, 0.046691895, 0.01373291, -0.0097961426,
+ -0.016143799, -0.022460938, -0.025726318, 0.0075378418, 0.091522217,
+ 0.19741821, 0.23269653, 0.16726685, 0.12173462, 0.12973022,
+ 0.064300537, -0.12158203, -0.29794312, -0.33813477, -0.27990723,
+ -0.19500732, -0.063903809, 0.10449219, 0.23712158, 0.34381104,
+ 0.41766357, 0.37658691, 0.22747803, 0.056365967, -0.088317871,
+ -0.19509888, -0.21295166, -0.15499878, -0.1114502, -0.093597412,
+ -0.071289062, -0.034606934, 0.009552002, 0.068084717, 0.12075806,
+ 0.13098145, 0.11383057, 0.08291626, 0.037322998, -0.017211914,
+ -0.05456543, -0.074829102, -0.087768555, -0.076202393, -0.022735596,
+ 0.032653809, 0.045623779, 0.045806885, 0.040496826, 0.016845703,
+ -0.023712158, -0.057769775, -0.07232666, -0.055145264,
+ -0.00091552734, 0.063201904, 0.11480713, 0.13497925, 0.11572266,
+ 0.030731201, -0.11346436, -0.23406982, -0.27478027, -0.23690796,
+ -0.13735962, -0.016479492, 0.076904297, 0.09487915, 0.070220947,
+ 0.058074951, 0.05355835, 0.017181396, -0.096893311, -0.21951294,
+ -0.26168823, -0.20983887, -0.093109131, 0.051879883, 0.15631104,
+ 0.18319702, 0.15551758, 0.078826904, -0.012084961, -0.083007812,
+ -0.10766602, -0.085479736, -0.059906006, -0.040039062, -0.031646729,
+ -0.046142578, -0.065551758, -0.03414917, 0.025482178, 0.046325684,
+ 0.054473877, 0.073303223, 0.073791504, 0.068786621, 0.082366943,
+ 0.080596924, 0.052215576, 0.015594482, -0.0053405762, 0.0040588379,
+ 0.032501221, 0.065551758, 0.093322754, 0.1199646, 0.13677979,
+ 0.14523315, 0.1401062, 0.12902832, 0.11553955, 0.09664917,
+ 0.091278076, 0.13305664, 0.24594116, 0.38180542, 0.45907593,
+ 0.45343018, 0.4213562, 0.36801147, 0.31027222, 0.30541992,
+ 0.33691406, 0.35479736, 0.3321228, 0.27334595, 0.25701904,
+ 0.23641968, 0.18139648, 0.16793823, 0.17538452, 0.17803955,
+ 0.19009399, 0.25280762, 0.38833618, 0.54940796, 0.70336914,
+ 0.74789429, 0.64334106, 0.49359131, 0.30703735, 0.071624756,
+ -0.075897217, -0.096191406, -0.076568604, 0.023406982, 0.15078735,
+ 0.21612549, 0.30493164, 0.39697266, 0.41009521, 0.32348633,
+ 0.24707031, 0.20645142, 0.11102295, 0.0075073242, -0.046325684,
+ -0.038085938, 0.014251709, 0.096618652, 0.1842041, 0.21417236,
+ 0.15905762, 0.0016174316, -0.25387573, -0.57302856, -0.85641479,
+ -0.99038696, -0.99038696, -0.99038696, -0.99038696, -0.99038696,
+ -0.90664673, -0.64364624, -0.42892456, -0.32131958, -0.23550415,
+ -0.25338745, -0.32595825, -0.44995117, -0.57858276, -0.68716431,
+ -0.80804443, -0.90670776, -0.9654541, -0.97409058, -0.95211792,
+ -0.90264893, -0.85357666, -0.80429077, -0.7482605, -0.69125366,
+ -0.60876465, -0.46228027, -0.23776245, -0.049041748, 0.019989014,
+ 0.048950195, 0.033172607, -0.02142334, -0.084259033, -0.15020752,
+ -0.16220093, -0.14608765, -0.14526367, -0.16497803, -0.1781311,
+ -0.19717407, -0.24871826, -0.26089478, -0.21688843, -0.19818115,
+ -0.23718262, -0.2824707, -0.32797241, -0.36758423, -0.3258667,
+ -0.18960571, -0.082885742, -0.056365967, -0.054534912, -0.10766602,
+ -0.26501465, -0.44006348, -0.58209229, -0.71032715, -0.77719116,
+ -0.76467896, -0.68914795, -0.51403809, -0.27841187, -0.092163086,
+ 0.056030273, 0.16799927, 0.19827271, 0.18478394, 0.17562866,
+ 0.15100098, 0.066619873, -0.040313721, -0.15875244, -0.27044678,
+ -0.35754395, -0.39682007, -0.34078979, -0.22293091, -0.13269043,
+ -0.048034668, 0.0730896, 0.19732666, 0.30789185, 0.39804077,
+ 0.44244385, 0.41928101, 0.35534668, 0.29177856, 0.22891235,
+ 0.18084717, 0.15231323, 0.13360596, 0.13049316, 0.13156128,
+ 0.1293335, 0.11477661, 0.12258911, 0.1824646, 0.26675415,
+ 0.35171509, 0.43341064, 0.49163818, 0.51086426, 0.50985718,
+ 0.49337769, 0.45962524, 0.43182373, 0.42025757, 0.4161377,
+ 0.40631104, 0.40435791, 0.42172241, 0.44003296, 0.45986938,
+ 0.47451782, 0.47540283, 0.48825073, 0.51907349, 0.5612793,
+ 0.62319946, 0.7109375, 0.79650879, 0.86904907, 0.92111206,
+ 0.96124268, 0.96994019, 0.92593384, 0.83483887, 0.70803833,
+ 0.57583618, 0.45834351, 0.3828125, 0.35479736, 0.35110474,
+ 0.38894653, 0.45022583, 0.49264526, 0.48919678, 0.45336914,
+ 0.40823364, 0.35009766, 0.28097534, 0.22503662, 0.18313599,
+ 0.14697266, 0.11010742, 0.07019043, 0.023956299, -0.024658203,
+ -0.087219238, -0.14846802, -0.19796753, -0.23556519, -0.25576782,
+ -0.25366211, -0.2333374, -0.19955444, -0.13546753, -0.052581787,
+ 0.018371582, 0.079620361, 0.14343262, 0.20013428, 0.2388916,
+ 0.25930786, 0.26889038, 0.26208496, 0.24691772, 0.22842407,
+ 0.19110107, 0.14624023, 0.093017578, 0.034301758, -0.044189453,
+ -0.1378479, -0.22967529, -0.29983521, -0.32650757, -0.31271362,
+ -0.26196289, -0.19345093, -0.11380005, -0.032806396, 0.038330078,
+ 0.087677002, 0.10690308, 0.092254639, 0.035766602, -0.057952881,
+ -0.17190552, -0.28945923, -0.40023804, -0.49761963, -0.5635376,
+ -0.59222412, -0.60348511, -0.61352539, -0.60958862, -0.57702637,
+ -0.53674316, -0.49453735, -0.45465088, -0.42507935, -0.40863037,
+ -0.4095459, -0.42730713, -0.45852661, -0.49362183, -0.53048706,
+ -0.55499268, -0.5526123, -0.52798462, -0.49053955, -0.44320679,
+ -0.38500977, -0.30548096, -0.2182312, -0.14306641, -0.073547363,
+ -0.0094299316, 0.045196533, 0.083312988, 0.11129761, 0.14489746,
+ 0.19921875, 0.24578857, 0.25418091, 0.23397827, 0.20111084,
+ 0.14822388, 0.078582764, 0.020812988, -0.012390137, -0.02520752,
+ -0.010559082, 0.026947021, 0.081542969, 0.13687134, 0.18441772,
+ 0.21426392, 0.22711182, 0.21377563, 0.17559814, 0.12246704,
+ 0.060882568, -0.0017089844, -0.067504883, -0.12475586, -0.16159058,
+ -0.16809082, -0.15145874, -0.12081909, -0.077362061, -0.03012085,
+ 0.011444092, 0.044189453, 0.075256348, 0.1050415, 0.13238525,
+ 0.15667725, 0.17337036, 0.17050171, 0.14389038, 0.10055542,
+ 0.057220459, 0.016204834, -0.012664795, -0.025024414, -0.014221191,
+ 0.012939453, 0.063781738, 0.12664795, 0.19824219, 0.26501465,
+ 0.32858276, 0.3782959, 0.40698242, 0.42160034, 0.42788696,
+ 0.43948364, 0.46075439, 0.48413086, 0.49819946, 0.50167847,
+ 0.49963379, 0.48529053, 0.45324707, 0.40890503, 0.36273193,
+ 0.31619263, 0.27200317, 0.23919678, 0.21868896, 0.2046814,
+ 0.18276978, 0.15286255, 0.11727905, 0.071807861, 0.015777588,
+ -0.054199219, -0.12478638, -0.19580078, -0.25622559, -0.30892944,
+ -0.34820557, -0.37606812, -0.39535522, -0.40704346, -0.42147827,
+ -0.43313599, -0.4447937, -0.44998169, -0.44503784, -0.431427,
+ -0.40750122, -0.37838745, -0.34109497, -0.29644775, -0.24822998,
+ -0.1991272, -0.15881348, -0.12728882, -0.10827637, -0.09979248,
+ -0.094055176, -0.091125488, -0.089508057, -0.087646484, -0.0809021,
+ -0.072387695, -0.055328369, -0.035583496, -0.0079956055,
+ 0.018188477, 0.04309082, 0.060577393, 0.073272705, 0.080413818,
+ 0.084503174, 0.083343506, 0.07522583, 0.071136475, 0.076141357,
+ 0.088348389, 0.10449219, 0.12374878, 0.14376831, 0.1534729,
+ 0.14807129, 0.1255188, 0.092559814, 0.047485352, -0.0028076172,
+ -0.062286377, -0.12301636, -0.17855835, -0.22631836, -0.26260376,
+ -0.28588867, -0.29559326, -0.29629517, -0.287323, -0.27877808,
+ -0.26751709, -0.25668335, -0.24749756, -0.24139404, -0.24041748,
+ -0.23944092, -0.23544312, -0.22592163, -0.20898438, -0.184021,
+ -0.15014648, -0.11633301, -0.082702637, -0.0496521, -0.017944336,
+ 0.017486572, 0.052581787, 0.092041016, 0.13427734, 0.18481445,
+ 0.24057007, 0.29467773, 0.33944702, 0.37042236, 0.38433838,
+ 0.38241577, 0.36376953, 0.33966064, 0.31497192, 0.29443359,
+ 0.27792358, 0.2600708, 0.24700928, 0.23727417, 0.23452759,
+ 0.23358154, 0.23257446, 0.23406982, 0.23239136, 0.23312378,
+ 0.22958374, 0.22579956, 0.21710205, 0.20043945, 0.17419434,
+ 0.13870239, 0.096466064, 0.051971436, 0.010437012, -0.024963379,
+ -0.052490234, -0.066467285, -0.068969727, -0.058563232,
+ -0.044616699, -0.030029297, -0.017486572, -0.0077209473,
+ -0.0032043457, -0.0048217773, -0.012481689, -0.027801514,
+ -0.042724609, -0.060211182, -0.072937012, -0.081756592,
+ -0.082977295, -0.07800293, -0.064605713, -0.043792725, -0.013031006,
+ 0.028625488, 0.077667236, 0.13046265, 0.18130493, 0.22851562,
+ 0.26617432, 0.29119873, 0.3039856, 0.30383301, 0.2925415,
+ 0.27261353, 0.24078369, 0.20632935, 0.16989136, 0.13552856,
+ 0.1038208, 0.074462891, 0.045898438, 0.013061523, -0.021087646,
+ -0.06072998, -0.099700928, -0.14016724, -0.17874146, -0.21130371,
+ -0.23596191, -0.25204468, -0.26132202, -0.26803589, -0.27981567,
+ -0.29934692, -0.32730103, -0.36425781, -0.40698242, -0.45092773,
+ -0.48971558, -0.51776123, -0.53198242, -0.5333252, -0.52218628,
+ -0.50076294, -0.47000122, -0.43017578, -0.38583374, -0.33612061,
+ -0.28347778, -0.23306274, -0.18682861, -0.14859009, -0.11853027,
+ -0.099853516, -0.09072876, -0.088562012, -0.091369629, -0.098022461,
+ -0.10787964, -0.11395264, -0.11013794, -0.093841553, -0.069274902,
+ -0.035369873, 0.0026245117, 0.046783447, 0.090698242, 0.1315918,
+ 0.16296387, 0.18664551, 0.2038269, 0.2154541, 0.22036743,
+ 0.21444702, 0.20489502, 0.18753052, 0.16650391, 0.13882446,
+ 0.10861206, 0.078735352, 0.049346924, 0.024078369, 0.0013427734,
+ -0.017974854, -0.032165527, -0.043243408, -0.050262451, -0.05670166,
+ -0.061157227, -0.068695068, -0.078918457, -0.085601807,
+ -0.090698242, -0.093658447, -0.095581055, -0.092529297, -0.08404541,
+ -0.068939209, -0.053649902, -0.037017822, -0.016448975,
+ 0.0096740723, 0.041687012, 0.074798584, 0.10549927, 0.13494873,
+ 0.16445923, 0.1937561, 0.2208252, 0.24539185, 0.26721191,
+ 0.28359985, 0.29733276, 0.30651855, 0.31622314, 0.32266235,
+ 0.31842041, 0.31008911, 0.29681396, 0.2819519, 0.26678467,
+ 0.25457764, 0.24642944, 0.24273682, 0.23709106, 0.22891235,
+ 0.2197876, 0.21051025, 0.20257568, 0.19024658, 0.17764282,
+ 0.1607666, 0.14309692, 0.12210083, 0.096893311, 0.073150635,
+ 0.049530029, 0.028045654, 0.0048522949, -0.017669678, -0.036224365,
+ -0.050506592, -0.059112549, -0.066345215, -0.068939209,
+ -0.070495605, -0.073059082, -0.073028564, -0.076812744,
+ -0.080963135, -0.092010498, -0.10275269, -0.11016846, -0.11907959,
+ -0.12677002, -0.13555908, -0.13842773, -0.13674927, -0.13088989,
+ -0.11846924, -0.099334717, -0.072784424, -0.042541504,
+ -0.0082702637, 0.031524658, 0.072387695, 0.10968018, 0.13861084,
+ 0.15847778, 0.16812134, 0.16650391, 0.15774536, 0.14169312,
+ 0.12005615, 0.092895508, 0.061737061, 0.02923584, -0.0022277832,
+ -0.032836914, -0.05670166, -0.075439453, -0.093322754, -0.1121521,
+ -0.13204956, -0.15255737, -0.17541504, -0.19900513, -0.21817017,
+ -0.23519897, -0.25091553, -0.27148438, -0.29296875, -0.31069946,
+ -0.3243103, -0.33599854, -0.34689331, -0.35461426, -0.3598938,
+ -0.36212158, -0.36105347, -0.35699463, -0.34725952, -0.33319092,
+ -0.31484985, -0.29327393, -0.26959229, -0.24423218, -0.21859741,
+ -0.18777466, -0.15194702, -0.11468506, -0.079498291, -0.0496521,
+ -0.023529053, 0.001159668, 0.025848389, 0.044494629, 0.054168701,
+ 0.058135986, 0.059844971, 0.066894531, 0.075195312, 0.087585449,
+ 0.10009766, 0.11755371, 0.13864136, 0.16278076, 0.18545532,
+ 0.20370483, 0.22076416, 0.23773193, 0.25531006, 0.26928711,
+ 0.27508545, 0.27371216, 0.26660156, 0.25100708, 0.2260437,
+ 0.1942749, 0.16079712, 0.12878418, 0.10110474, 0.07244873,
+ 0.046051025, 0.024993896, 0.010284424, -0.0010070801, -0.0082397461,
+ -0.011383057, -0.0072937012, -0.0034179688, 0.0040893555,
+ 0.013519287, 0.022583008, 0.031219482, 0.032714844, 0.034851074,
+ 0.033508301, 0.033935547, 0.030975342, 0.031982422, 0.039794922,
+ 0.05569458, 0.077392578, 0.10113525, 0.1277771, 0.15429688,
+ 0.18026733, 0.20275879, 0.21591187, 0.22341919, 0.224823,
+ 0.22775269, 0.22766113, 0.22491455, 0.2170105, 0.20431519,
+ 0.19171143, 0.17459106, 0.15859985, 0.14315796, 0.12554932,
+ 0.10998535, 0.09463501, 0.083435059, 0.070465088, 0.057983398,
+ 0.048278809, 0.041351318, 0.036224365, 0.030639648, 0.021850586,
+ 0.012176514, -0.0034484863, -0.022735596, -0.045166016,
+ -0.068908691, -0.094421387, -0.11810303, -0.13882446, -0.15774536,
+ -0.17269897, -0.18533325, -0.19125366, -0.19116211, -0.18655396,
+ -0.18423462, -0.18267822, -0.17877197, -0.17248535, -0.16625977,
+ -0.16271973, -0.16104126, -0.16125488, -0.16192627, -0.16333008,
+ -0.16461182, -0.16616821, -0.16235352, -0.15325928, -0.13644409,
+ -0.11523438, -0.090240479, -0.058013916, -0.024383545, 0.0089111328,
+ 0.039093018, 0.067749023, 0.096221924, 0.11837769, 0.13458252,
+ 0.13946533, 0.13269043, 0.12045288, 0.099212646, 0.073608398,
+ 0.042266846, 0.011627197, -0.019042969, -0.04876709, -0.07409668,
+ -0.096038818, -0.11062622, -0.1239624, -0.1340332, -0.14199829,
+ -0.14428711, -0.14074707, -0.13641357, -0.13253784, -0.13400269,
+ -0.13830566, -0.1505127, -0.16162109, -0.17391968, -0.1847229,
+ -0.19418335, -0.2019043, -0.20770264, -0.21234131, -0.21121216,
+ -0.20510864, -0.19058228, -0.16986084, -0.14498901, -0.11407471,
+ -0.082061768, -0.048492432, -0.015533447, 0.018341064, 0.052185059,
+ 0.078826904, 0.10336304, 0.12106323, 0.1315918, 0.13513184,
+ 0.13653564, 0.13986206, 0.14501953, 0.14926147, 0.15634155,
+ 0.16189575, 0.16915894, 0.17584229, 0.18264771, 0.19329834,
+ 0.20681763, 0.22433472, 0.24029541, 0.25708008, 0.27435303,
+ 0.28552246, 0.28768921, 0.2796936, 0.26013184, 0.23287964,
+ 0.20193481, 0.17483521, 0.14996338, 0.12689209, 0.10336304,
+ 0.081939697, 0.063842773, 0.047302246, 0.031677246, 0.01953125,
+ 0.010559082, 0.0013427734, -0.0082397461, -0.016357422,
+ -0.019348145, -0.023223877, -0.023406982, -0.023895264,
+ -0.022155762, -0.020477295, -0.017089844, -0.013031006,
+ -0.0098571777, -0.0046691895, 6.1035156e-05, 0.0072937012,
+ 0.0128479, 0.025878906, 0.040618896, 0.055908203, 0.066558838,
+ 0.072021484, 0.076965332, 0.080383301, 0.081237793, 0.077575684,
+ 0.072113037, 0.067443848, 0.064880371, 0.063720703, 0.058959961,
+ 0.054534912, 0.047576904, 0.039276123, 0.025390625, 0.010986328,
+ -0.0061645508, -0.018859863, -0.028900146, -0.036376953,
+ -0.041473389, -0.047241211, -0.054260254, -0.063049316, -0.0730896,
+ -0.081085205, -0.090118408, -0.10089111, -0.11264038, -0.12442017,
+ -0.1350708, -0.14535522, -0.15383911, -0.16052246, -0.16329956,
+ -0.1668396, -0.17166138, -0.17819214, -0.18157959, -0.18133545,
+ -0.17935181, -0.1758728, -0.17181396, -0.16687012, -0.16067505,
+ -0.15344238, -0.14562988, -0.13626099, -0.12780762, -0.11743164,
+ -0.10961914, -0.098510742, -0.085601807, -0.071716309, -0.05758667,
+ -0.041412354, -0.024078369, -0.0043640137, 0.015960693, 0.037567139,
+ 0.060455322, 0.082855225, 0.10211182, 0.11419678, 0.12088013,
+ 0.12197876, 0.12145996, 0.11743164, 0.11026001, 0.096984863,
+ 0.077789307, 0.054504395, 0.031890869, 0.010986328, -0.0061340332,
+ -0.020507812, -0.032836914, -0.042541504, -0.050476074,
+ -0.056762695, -0.06137085, -0.065032959, -0.064727783, -0.064147949,
+ -0.060119629, -0.05770874, -0.056549072, -0.057098389, -0.059692383,
+ -0.063140869, -0.067321777, -0.072021484, -0.075439453,
+ -0.078033447, -0.077575684, -0.073059082, -0.063995361,
+ -0.049560547, -0.030212402, -0.008605957, 0.015930176, 0.039794922,
+ 0.065917969, 0.090820312, 0.11099243, 0.12619019, 0.13739014,
+ 0.1472168, 0.15374756, 0.15893555, 0.16152954, 0.16671753,
+ 0.17425537, 0.17889404, 0.18060303, 0.17886353, 0.17861938,
+ 0.17984009, 0.18179321, 0.18499756, 0.18548584, 0.18609619,
+ 0.18521118, 0.18234253, 0.17956543, 0.17547607, 0.1690979,
+ 0.16101074, 0.15505981, 0.14837646, 0.13739014, 0.12255859,
+ 0.10522461, 0.082397461, 0.05770874, 0.030609131, 0.0046691895,
+ -0.018676758, -0.037872314, -0.054779053, -0.069458008,
+ -0.078826904, -0.084136963, -0.085479736, -0.083404541,
+ -0.076324463, -0.066314697, -0.056060791, -0.049926758,
+ -0.043182373, -0.040252686, -0.037811279, -0.038543701,
+ -0.039276123, -0.040771484, -0.041687012, -0.042053223,
+ -0.043548584, -0.040161133, -0.034637451, -0.024841309,
+ -0.015197754, -0.0059509277, 0.001159668, 0.0042114258,
+ 0.0062866211, 0.0049438477, 0.0047302246, 0.0028686523,
+ -0.00082397461, -0.0034790039, -0.0077514648, -0.01260376,
+ -0.019500732, -0.02645874, -0.032409668, -0.041351318, -0.049163818,
+ -0.058532715, -0.068603516, -0.078948975, -0.088897705,
+ -0.094543457, -0.097167969, -0.095581055, -0.094726562,
+ -0.095001221, -0.095336914, -0.094726562, -0.096160889, -0.09866333,
+ -0.10427856, -0.1104126, -0.11727905, -0.12301636, -0.13006592,
+ -0.13479614, -0.13574219, -0.13119507, -0.12451172, -0.11630249,
+ -0.10476685, -0.094543457, -0.08416748, -0.074066162, -0.061767578,
+ -0.050415039, -0.040557861, -0.031402588, -0.023834229, -0.01361084,
+ -0.0036010742, 0.0055236816, 0.013122559, 0.02142334, 0.029418945,
+ 0.041717529, 0.056518555, 0.075714111, 0.095062256, 0.11523438,
+ 0.13363647, 0.146698, 0.15646362, 0.16061401, 0.16043091,
+ 0.15634155, 0.14889526, 0.13769531, 0.12127686, 0.10272217,
+ 0.085418701, 0.070739746, 0.055541992, 0.040405273, 0.024200439,
+ 0.010803223, -0.00048828125, -0.0087890625, -0.012481689,
+ -0.014404297, -0.014068604, -0.011230469, -0.0081787109,
+ -0.0049438477, -0.0041809082, -0.0060119629, -0.012237549,
+ -0.020355225, -0.027832031, -0.034759521, -0.042053223, -0.04675293,
+ -0.045349121, -0.042297363, -0.03604126, -0.027862549, -0.015777588,
+ -0.0011291504, 0.013397217, 0.030212402, 0.04598999, 0.061401367,
+ 0.074615479, 0.086242676, 0.094238281, 0.09979248, 0.10458374,
+ 0.10662842, 0.10894775, 0.11077881, 0.11056519, 0.11022949,
+ 0.10903931, 0.1072998, 0.10266113, 0.098999023, 0.095977783,
+ 0.095916748, 0.095611572, 0.094909668, 0.093963623, 0.092895508,
+ 0.092559814, 0.090423584, 0.084014893, 0.073852539, 0.059020996,
+ 0.044830322, 0.02822876, 0.012023926, -0.0049743652, -0.020050049,
+ -0.036193848, -0.052398682, -0.066253662, -0.078796387,
+ -0.089019775, -0.098083496, -0.10592651, -0.11224365, -0.11618042,
+ -0.11715698, -0.11807251, -0.11676025, -0.11459351, -0.11108398,
+ -0.10748291, -0.10400391, -0.10064697, -0.096923828, -0.092163086,
+ -0.086639404, -0.08114624, -0.075531006, -0.071838379, -0.06854248,
+ -0.064971924, -0.061035156, -0.054382324, -0.047393799,
+ -0.043518066, -0.04095459, -0.041351318, -0.041259766, -0.041931152,
+ -0.04095459, -0.037841797, -0.034210205, -0.029541016, -0.026550293,
+ -0.02444458, -0.024139404, -0.026397705, -0.03036499, -0.035675049,
+ -0.041046143, -0.04675293, -0.054168701, -0.061218262, -0.065704346,
+ -0.066650391, -0.066650391, -0.063537598, -0.06048584, -0.055664062,
+ -0.053375244, -0.052642822, -0.052764893, -0.054718018,
+ -0.053955078, -0.05355835, -0.052764893, -0.053405762, -0.056213379,
+ -0.06036377, -0.062744141, -0.063110352, -0.06072998, -0.054504395,
+ -0.044647217, -0.034057617, -0.022949219, -0.011810303, 0.002532959,
+ 0.015594482, 0.024383545, 0.032165527, 0.03894043, 0.047302246,
+ 0.055236816, 0.064605713, 0.072387695, 0.081115723, 0.088348389,
+ 0.094940186, 0.10223389, 0.11135864, 0.12249756, 0.13082886,
+ 0.13803101, 0.14520264, 0.14993286, 0.15118408, 0.14987183,
+ 0.14846802, 0.14581299, 0.13851929, 0.12878418, 0.11639404,
+ 0.10375977, 0.09173584, 0.078796387, 0.063842773, 0.048980713,
+ 0.034576416, 0.022338867, 0.011932373, 0.0039672852, 0.0011291504,
+ -0.00094604492, -0.0015563965, -0.0034484863, -0.0050354004,
+ -0.0083312988, -0.012390137, -0.01651001, -0.019683838,
+ -0.022003174, -0.024414062, -0.027557373, -0.03137207, -0.03314209,
+ -0.030700684, -0.028045654, -0.025482178, -0.022247314,
+ -0.018737793, -0.013275146, -0.0074157715, 0.0010070801,
+ 0.0093078613, 0.01763916, 0.027404785, 0.035583496, 0.043151855,
+ 0.047485352, 0.051239014, 0.053649902, 0.054626465, 0.054382324,
+ 0.053039551, 0.050323486, 0.046691895, 0.044158936, 0.041534424,
+ 0.039794922, 0.035797119, 0.031494141, 0.026580811, 0.021575928,
+ 0.017944336, 0.014038086, 0.0093688965, 0.0051574707,
+ -0.00067138672, -0.0070495605, -0.014984131, -0.021728516,
+ -0.030151367, -0.037719727, -0.049804688, -0.062255859,
+ -0.073791504, -0.08416748, -0.089599609, -0.096496582, -0.10055542,
+ -0.10531616, -0.10870361, -0.11083984, -0.11102295, -0.10925293,
+ -0.10610962, -0.10125732, -0.094848633, -0.086700439, -0.07925415,
+ -0.074005127, -0.070770264, -0.068511963, -0.065643311,
+ -0.060577393, -0.054595947, -0.049407959, -0.043914795,
+ -0.039794922, -0.033813477, -0.027923584, -0.022674561,
+ -0.017791748, -0.01260376, -0.008972168, -0.0076293945,
+ -0.0053100586, -0.0030517578, -0.0024719238, -0.0032043457,
+ -0.0035705566, -0.002746582, -0.0013427734, -0.0011901855,
+ -0.0012817383, -0.0016479492, -0.0030212402, -0.0040588379,
+ -0.0071411133, -0.0085449219, -0.010375977, -0.01171875,
+ -0.011230469, -0.012512207, -0.013305664, -0.014190674,
+ -0.014099121, -0.015625, -0.01763916, -0.020202637, -0.020172119,
+ -0.017730713, -0.014068604, -0.0097351074, -0.0065917969,
+ -0.0020751953, 0.0018310547, 0.0045471191, 0.0046691895,
+ 0.003326416, 0.0018615723, -0.00021362305, 0.0010986328,
+ 0.0056152344, 0.011962891, 0.019866943, 0.029846191, 0.040130615,
+ 0.050811768, 0.058746338, 0.068267822, 0.076721191, 0.083862305,
+ 0.091491699, 0.096008301, 0.10150146, 0.1036377, 0.10562134,
+ 0.10449219, 0.1026001, 0.10076904, 0.099822998, 0.098297119,
+ 0.095245361, 0.094207764, 0.091949463, 0.092773438, 0.093048096,
+ 0.093658447, 0.090881348, 0.084747314, 0.078186035, 0.068328857,
+ 0.058197021, 0.044403076, 0.031768799, 0.019866943, 0.010345459,
+ 0.0029602051, -0.0044555664, -0.011932373, -0.018920898,
+ -0.024993896, -0.029205322, -0.031768799, -0.034790039,
+ -0.036773682, -0.037841797, -0.04019165, -0.042785645, -0.045928955,
+ -0.045776367, -0.044006348, -0.040649414, -0.037902832,
+ -0.036834717, -0.035308838, -0.033569336, -0.030090332,
+ -0.025543213, -0.020263672, -0.014678955, -0.0094604492,
+ -0.0042114258, -0.00067138672, 0.0016784668, 0.0021362305,
+ 0.0038452148, 0.007598877, 0.0099487305, 0.013793945, 0.015838623,
+ 0.01852417, 0.019958496, 0.021087646, 0.021270752, 0.021911621,
+ 0.021789551, 0.020965576, 0.01776123, 0.013275146, 0.0070495605,
+ 0.00076293945, -0.004119873, -0.007232666, -0.009552002,
+ -0.012695312, -0.016052246, -0.019226074, -0.02331543, -0.028625488,
+ -0.032348633, -0.035736084, -0.038909912, -0.044372559,
+ -0.050354004, -0.056610107, -0.061309814, -0.065704346,
+ -0.065948486, -0.067230225, -0.06652832, -0.0652771, -0.061981201,
+ -0.057128906, -0.052185059, -0.046112061, -0.041595459,
+ -0.035461426, -0.031097412, -0.025970459, -0.022979736,
+ -0.019836426, -0.015899658, -0.01260376, -0.0087585449,
+ -0.0061950684, -0.0028991699, -0.0014953613, 0.0018615723,
+ 0.0055847168, 0.008605957, 0.011871338, 0.015594482, 0.020629883,
+ 0.025970459, 0.030212402, 0.034973145, 0.037322998, 0.037597656,
+ 0.036254883, 0.034698486, 0.032440186, 0.029937744, 0.026062012,
+ 0.021972656, 0.018432617, 0.013397217, 0.010528564, 0.0077514648,
+ 0.0076904297, 0.0078430176, 0.0095825195, 0.012512207, 0.01550293,
+ 0.017486572, 0.017150879, 0.015563965, 0.013031006, 0.010070801,
+ 0.0068969727, 0.0039367676, 0.0021057129, 0.0018920898,
+ 0.0032653809, 0.0064697266, 0.0092163086, 0.010437012, 0.0097961426,
+ 0.0078125, 0.0053405762, 0.0048828125, 0.0055236816, 0.0086669922,
+ 0.013061523, 0.019897461, 0.027252197, 0.035675049, 0.043518066,
+ 0.050018311, 0.056427002, 0.06072998, 0.062011719, 0.061859131,
+ 0.060546875, 0.060577393, 0.059173584, 0.056945801, 0.054138184,
+ 0.053283691, 0.053131104, 0.052764893, 0.050811768, 0.04864502,
+ 0.046295166, 0.044921875, 0.043182373, 0.040161133, 0.036529541,
+ 0.032287598, 0.028411865, 0.022247314, 0.015960693, 0.0095825195,
+ 0.0032958984, -0.0028991699, -0.01159668, -0.018249512, -0.02532959,
+ -0.03137207, -0.035919189, -0.040710449, -0.044006348, -0.049163818,
+ -0.052246094, -0.055969238, -0.056396484, -0.055511475,
+ -0.052825928, -0.049194336, -0.046844482, -0.04598999, -0.045227051,
+ -0.044586182, -0.042388916, -0.039611816, -0.037719727,
+ -0.035766602, -0.032806396, -0.030700684, -0.027313232, -0.02444458,
+ -0.020019531, -0.015533447, -0.012145996, -0.0091552734,
+ -0.0064697266, -0.0040893555, -0.00048828125, 0.001953125,
+ 0.0048522949, 0.0061950684, 0.007019043, 0.0083007812, 0.0091247559,
+ 0.0094909668, 0.0098876953, 0.010894775, 0.011566162, 0.0105896,
+ 0.0083007812, 0.0047607422, 0.0010986328, -0.0036621094,
+ -0.0073242188, -0.010223389, -0.011505127, -0.011993408,
+ -0.012786865, -0.015350342, -0.017669678, -0.019500732,
+ -0.022613525, -0.025115967, -0.027862549, -0.027832031,
+ -0.028320312, -0.029602051, -0.030761719, -0.033111572,
+ -0.033630371, -0.032592773, -0.030914307, -0.027008057, -0.02355957,
+ -0.020507812, -0.017211914, -0.014709473, -0.0097351074,
+ -0.0033874512, 0.0032958984, 0.010284424, 0.014007568, 0.017272949,
+ 0.017791748, 0.018371582, 0.018096924, 0.017272949, 0.016326904,
+ 0.016021729, 0.017028809, 0.020507812, 0.025238037, 0.031280518,
+ 0.036834717, 0.040283203, 0.04284668, 0.045410156, 0.048339844,
+ 0.050109863, 0.04800415, 0.044311523, 0.040557861, 0.036010742,
+ 0.031982422, 0.026977539, 0.022766113, 0.018829346, 0.015411377,
+ 0.012359619, 0.010925293, 0.0095214844, 0.010498047, 0.012054443,
+ 0.014221191, 0.016326904, 0.017150879, 0.016784668, 0.01473999,
+ 0.012481689, 0.0090026855, 0.0057678223, 0.002746582,
+ -0.00024414062, -6.1035156e-05, -0.00042724609, -0.00039672852,
+ -0.0024414062, -0.0037841797, -0.0043334961, -0.0034790039,
+ -0.0015563965, 0.0011901855, 0.0047302246, 0.0079345703,
+ 0.011108398, 0.013885498, 0.017150879, 0.020874023, 0.024139404,
+ 0.028411865, 0.031860352, 0.036010742, 0.038330078, 0.038574219,
+ 0.03805542, 0.035980225, 0.033905029, 0.03112793, 0.027496338,
+ 0.024414062, 0.020690918, 0.017791748, 0.013549805, 0.0098876953,
+ 0.0071105957, 0.0046081543, 0.0029296875, 0.0013122559,
+ 0.0002746582, -0.0014343262, -0.0029907227, -0.0065307617,
+ -0.009979248, -0.014831543, -0.02041626, -0.027008057, -0.036132812,
+ -0.043670654, -0.049591064, -0.053894043, -0.057312012,
+ -0.059570312, -0.059051514, -0.057617188, -0.05581665, -0.054962158,
+ -0.053283691, -0.051300049, -0.049591064, -0.049407959,
+ -0.049560547, -0.0496521, -0.04788208, -0.044830322, -0.040771484,
+ -0.03616333, -0.031066895, -0.024902344, -0.019226074, -0.014312744,
+ -0.010925293, -0.0085754395, -0.0065612793, -0.0048217773,
+ -0.0020141602, -0.00039672852, 0.0014648438, 0.003326416,
+ 0.0067749023, 0.009979248, 0.014068604, 0.016052246, 0.017486572,
+ 0.017700195, 0.018127441, 0.018066406, 0.017608643, 0.016845703,
+ 0.015838623, 0.014404297, 0.013214111, 0.011901855, 0.010650635,
+ 0.0085754395, 0.0069885254, 0.0051269531, 0.0030212402,
+ 0.00015258789, -0.0031738281, -0.0065307617, -0.0090637207,
+ -0.010498047, -0.011505127, -0.012023926, -0.01260376, -0.012115479,
+ -0.010406494, -0.0086975098, -0.0063781738, -0.005859375,
+ -0.0042114258, -0.0034179688, -0.0012207031, 0.00057983398,
+ 0.0030822754, 0.0048828125, 0.0070800781, 0.010040283, 0.013793945,
+ 0.01763916, 0.020935059, 0.024047852, 0.026245117, 0.02822876,
+ 0.028381348, 0.028015137, 0.027618408, 0.027496338, 0.0284729,
+ 0.029174805, 0.029815674, 0.030670166, 0.033081055, 0.035797119,
+ 0.037445068, 0.039154053, 0.039825439, 0.040283203, 0.03918457,
+ 0.036987305, 0.033874512, 0.02935791, 0.025177002, 0.020507812,
+ 0.016479492, 0.013031006, 0.010070801, 0.0077209473, 0.0056152344,
+ 0.003326416, 0.00048828125, -0.0017089844, -0.0030517578,
+ -0.0029602051, -0.003112793, -0.0025024414, -0.0024414062,
+ -0.0021362305, -0.0023498535, -0.0029907227, -0.0043029785,
+ -0.0059814453, -0.0078735352, -0.01083374, -0.013397217,
+ -0.016448975, -0.018890381, -0.020568848, -0.020080566, -0.01852417,
+ -0.016845703, -0.014007568, -0.0105896, -0.0066833496,
+ -0.0030517578, 0.0014953613, 0.0065002441, 0.0098571777,
+ 0.013122559, 0.014404297, 0.015472412, 0.016571045, 0.018035889,
+ 0.018585205, 0.018371582, 0.016540527, 0.014099121, 0.011413574,
+ 0.009185791, 0.0065917969, 0.0032653809, 0.00054931641,
+ -0.0018005371, -0.0024719238, -0.0046081543, -0.0062255859,
+ -0.0078430176, -0.009979248, -0.011627197, -0.015289307,
+ -0.017456055, -0.019897461, -0.022918701, -0.025543213,
+ -0.028747559, -0.031524658, -0.036865234, -0.041534424,
+ -0.045410156, -0.046875, -0.048126221, -0.049499512, -0.049163818,
+ -0.048828125, -0.047790527, -0.04574585, -0.043579102, -0.040924072,
+ -0.040222168, -0.038360596, -0.036895752, -0.034210205,
+ -0.031616211, -0.028289795, -0.024200439, -0.020294189,
+ -0.015838623, -0.011993408, -0.007598877, -0.0036010742,
+ 0.00054931641, 0.004486084, 0.0074157715, 0.0098571777, 0.012054443,
+ 0.01473999, 0.017700195, 0.019744873, 0.022399902, 0.02432251,
+ 0.025817871, 0.027130127, 0.027709961, 0.0284729, 0.027893066,
+ 0.027496338, 0.026580811, 0.025634766, 0.023681641, 0.021972656,
+ 0.019775391, 0.017730713, 0.016052246, 0.014556885, 0.014434814,
+ 0.013763428, 0.012268066, 0.0105896, 0.0091247559, 0.0077819824,
+ 0.0054626465, 0.0030822754, 0.00067138672, -0.0012207031,
+ -0.0028686523, -0.0048217773, -0.0047912598, -0.004486084,
+ -0.002746582, -0.00067138672, 0.0012512207, 0.0037231445,
+ 0.0054321289, 0.0074157715, 0.010192871, 0.013214111, 0.016448975,
+ 0.018005371, 0.019134521, 0.018463135, 0.017944336, 0.016723633,
+ 0.016448975, 0.01651001, 0.01651001, 0.017669678, 0.019622803,
+ 0.022064209, 0.024017334, 0.025909424, 0.026977539, 0.027008057,
+ 0.026733398, 0.025634766, 0.024261475, 0.022247314, 0.020202637,
+ 0.017730713, 0.01663208, 0.015319824, 0.014404297, 0.013092041,
+ 0.0098266602, 0.0065307617, 0.0032653809, 0.00061035156,
+ -0.0028076172, -0.0061340332, -0.0094909668, -0.012115479,
+ -0.013244629, -0.014251709, -0.015075684, -0.015808105,
+ -0.015991211, -0.016418457, -0.016601562, -0.01663208, -0.01675415,
+ -0.017333984, -0.018615723, -0.019775391, -0.02053833, -0.020721436,
+ -0.021820068, -0.022918701, -0.023651123, -0.023895264,
+ -0.023590088, -0.02331543, -0.022338867, -0.020141602, -0.017669678,
+ -0.014068604, -0.010528564, -0.0055236816, 0, 0.0051574707,
+ 0.008972168, 0.011291504, 0.012207031, 0.012420654, 0.01159668,
+ 0.0105896, 0.009185791, 0.0078735352, 0.0067749023, 0.0052490234,
+ 0.0040588379, 0.0025024414, 0.0013427734, 0.0014038086,
+ 0.0009765625, 0.00076293945, -0.00079345703, -0.0029907227,
+ -0.0054626465, -0.0073547363, -0.0095825195, -0.011383057,
+ -0.012237549, -0.013000488, -0.014373779, -0.016448975,
+ -0.018341064, -0.020446777, -0.02331543, -0.025909424, -0.02835083,
+ -0.028869629, -0.028839111, -0.028686523, -0.028106689,
+ -0.027740479, -0.027435303, -0.027313232, -0.026672363,
+ -0.025604248, -0.02355957, -0.020263672, -0.016204834, -0.011383057,
+ -0.0068359375, -0.0024719238, 0.00021362305, 0.0022583008,
+ 0.0036621094, 0.0053710938, 0.0079040527, 0.010162354, 0.013214111,
+ 0.016052246, 0.019042969, 0.022064209, 0.024871826, 0.027618408,
+ 0.029205322, 0.030761719, 0.031921387, 0.032012939, 0.032562256,
+ 0.032714844, 0.032958984, 0.032318115, 0.031860352, 0.030822754,
+ 0.03024292, 0.029510498, 0.028167725, 0.027099609, 0.024810791,
+ 0.022674561, 0.019958496, 0.018218994, 0.016143799, 0.014373779,
+ 0.012145996, 0.010101318, 0.0079345703, 0.0063476562, 0.0045471191,
+ 0.003112793, 0.00085449219, -0.00088500977, -0.002532959,
+ -0.0035095215, -0.0039672852, -0.0041503906, -0.0031433105,
+ -0.0017700195, -3.0517578e-05, 0.0010681152, 0.0033874512,
+ 0.0053405762, 0.0074768066, 0.0082397461, 0.0075683594, 0.007019043,
+ 0.005279541, 0.004486084, 0.0035400391, 0.0035400391, 0.0047607422,
+ 0.0061645508, 0.0079345703, 0.0090332031, 0.010314941, 0.010681152,
+ 0.010467529, 0.010467529, 0.009979248, 0.009765625, 0.0090637207,
+ 0.0083007812, 0.0075683594, 0.0065917969, 0.0066223145,
+ 0.0054626465, 0.0040893555, 0.0021362305, -3.0517578e-05,
+ -0.0024719238, -0.0052490234, -0.008026123, -0.010375977,
+ -0.012573242, -0.01461792, -0.01651001, -0.017822266, -0.018981934,
+ -0.019622803, -0.019592285, -0.020172119, -0.020751953,
+ -0.021728516, -0.022186279, -0.02230835, -0.02230835, -0.022155762,
+ -0.022583008, -0.022338867, -0.023193359, -0.023284912,
+ -0.023406982, -0.022766113, -0.022216797, -0.022094727,
+ -0.021484375, -0.021026611, -0.019836426, -0.018005371,
+ -0.015533447, -0.012512207, -0.0092773438, -0.0061340332,
+ -0.0029907227, 0.00076293945, 0.00390625, 0.0065002441,
+ 0.0084228516, 0.010070801, 0.011566162, 0.012054443, 0.012573242,
+ 0.011779785, 0.011077881, 0.010131836, 0.0088500977, 0.0075073242,
+ 0.0054321289, 0.0044555664, 0.003692627, 0.0032348633, 0.0028991699,
+ 0.0022583008, 0.0026245117, 0.0021972656, 0.001953125,
+ 0.00079345703, -0.001159668, -0.0028381348, -0.0046386719,
+ -0.0059814453, -0.0075378418, -0.0087890625, -0.010192871,
+ -0.01083374, -0.011993408, -0.012695312, -0.012756348, -0.012908936,
+ -0.012695312, -0.013061523, -0.012756348, -0.012145996,
+ -0.011352539, -0.010253906, -0.0094909668, -0.0081787109,
+ -0.0067138672, -0.0047912598, -0.0016784668, 0.00085449219,
+ 0.0041809082, 0.0070495605, 0.0098571777, 0.013061523, 0.016052246,
+ 0.019012451, 0.020965576, 0.022613525, 0.023590088, 0.024169922,
+ 0.02432251, 0.024078369, 0.024261475, 0.023681641, 0.024291992,
+ 0.024475098, 0.025390625, 0.026306152, 0.026641846, 0.027008057,
+ 0.026672363, 0.026641846, 0.026153564, 0.025482178, 0.024108887,
+ 0.022155762, 0.020050049, 0.017578125, 0.01461792, 0.011932373,
+ 0.0090332031, 0.0069580078, 0.0048828125, 0.0032653809, 0.001953125,
+ 0.0007019043, -0.00036621094, -0.0019226074, -0.0037536621,
+ -0.0056152344, -0.0076904297, -0.0087280273, -0.0090942383,
+ -0.0088195801, -0.0081481934, -0.0072937012, -0.006439209,
+ -0.005279541, -0.0043640137, -0.0034179688, -0.003112793,
+ -0.0025024414, -0.0022888184, -0.0019226074, -0.0015869141,
+ -0.0015869141, -0.0015258789, -0.0016784668, -0.0017700195,
+ -0.0016784668, -0.0013427734, -0.0011291504, -0.00061035156, 0,
+ 0.00079345703, 0.0012207031, 0.0015869141, 0.0016479492,
+ 0.0015258789, 0.0012817383, 0.00094604492, 0.00045776367,
+ -0.0002746582, -0.00088500977, -0.0016479492, -0.0024108887,
+ -0.0036621094, -0.0050354004, -0.0063476562, -0.0079956055,
+ -0.0096435547, -0.011535645, -0.013458252, -0.014953613,
+ -0.016296387, -0.017364502, -0.01776123, -0.018280029, -0.018371582,
+ -0.018035889, -0.017456055, -0.016479492, -0.015838623,
+ -0.015167236, -0.015228271, -0.015380859, -0.015625, -0.015716553,
+ -0.015411377, -0.015197754, -0.015106201, -0.01473999, -0.014221191,
+ -0.013092041, -0.012054443, -0.010742188, -0.008605957,
+ -0.006439209, -0.0038757324, -0.0016479492, 0.00079345703,
+ 0.0026550293, 0.0045471191, 0.0065612793, 0.009185791, 0.011566162,
+ 0.013427734, 0.014404297, 0.015075684, 0.015411377, 0.015319824,
+ 0.014801025, 0.013977051, 0.013305664, 0.012634277, 0.011932373,
+ 0.010864258, 0.0099182129, 0.0098571777, 0.0093994141, 0.0091247559,
+ 0.0080566406, 0.0068359375, 0.0056762695, 0.0043640137,
+ 0.0037841797, 0.0027770996, 0.0023803711, 0.0017700195,
+ 0.0010375977, 0, -0.0011901855, -0.0020446777, -0.0028991699,
+ -0.0037841797, -0.0050964355, -0.0057983398, -0.0063476562,
+ -0.0065917969, -0.0063781738, -0.0061950684, -0.0056152344,
+ -0.0050354004, -0.0045471191, -0.0035705566, -0.0025939941,
+ -0.00091552734, 0.00082397461, 0.0028076172, 0.0045471191,
+ 0.0061950684, 0.0078430176, 0.0096435547, 0.010742188, 0.011474609,
+ 0.012176514, 0.01260376, 0.013153076, 0.013458252, 0.014129639,
+ 0.014801025, 0.015228271, 0.015991211, 0.016204834, 0.01663208,
+ 0.016601562, 0.016357422, 0.015808105, 0.014770508, 0.014007568,
+ 0.012939453, 0.012268066, 0.011444092, 0.01071167, 0.010070801,
+ 0.0086975098, 0.0075683594, 0.0058288574, 0.0040588379,
+ 0.0018615723, 6.1035156e-05, -0.0015258789, -0.0029602051,
+ -0.0040283203, -0.0055236816, -0.0065307617, -0.0078735352,
+ -0.0090942383, -0.010131836, -0.010925293, -0.011260986,
+ -0.011322021, -0.011199951, -0.010955811, -0.010925293, -0.0105896,
+ -0.010375977, -0.0097351074, -0.0092163086, -0.0085754395,
+ -0.0077819824, -0.007232666, -0.0067443848, -0.0063171387,
+ -0.0060119629, -0.0053405762, -0.0050048828, -0.0045166016,
+ -0.0040588379, -0.0035400391, -0.0030517578, -0.0029907227,
+ -0.0027160645, -0.0028076172, -0.0025024414, -0.0021972656,
+ -0.001953125, -0.0013122559, -0.00091552734, -0.00033569336,
+ -0.00012207031, -0.00024414062, -0.00054931641, -0.0010375977,
+ -0.0018615723, -0.0028686523, -0.0036010742, -0.0042724609,
+ -0.0046691895, -0.0052490234, -0.0056152344, -0.0061035156,
+ -0.0066833496, -0.0074768066, -0.0083007812, -0.0089111328,
+ -0.0093688965, -0.0096435547, -0.0096740723, -0.0093994141,
+ -0.0086669922, -0.0079040527, -0.0073242188, -0.007019043,
+ -0.0067749023, -0.0067138672, -0.0064697266, -0.0060424805,
+ -0.0054931641, -0.0048828125, -0.0044250488, -0.0039367676,
+ -0.0031738281, -0.0024414062, -0.0014953613, -0.00039672852,
+ 0.0007019043, 0.001739502, 0.0028991699, 0.0042724609, 0.005645752,
+ 0.0072021484, 0.0087585449, 0.010192871, 0.011627197, 0.012542725,
+ 0.013244629, 0.01361084, 0.013671875, 0.013580322, 0.013122559,
+ 0.012512207, 0.012145996, 0.011993408, 0.011932373, 0.011779785,
+ 0.011352539, 0.010742188, 0.0099487305, 0.0090942383, 0.0079956055,
+ 0.0068054199, 0.0057373047, 0.0047912598, 0.004119873, 0.003326416,
+ 0.0027770996, 0.0021057129, 0.0015869141, 0.0010375977,
+ 0.00024414062, -0.00030517578, -0.00085449219, -0.0012512207,
+ -0.0015869141, -0.002166748, -0.0025939941, -0.0032043457,
+ -0.0038757324, -0.0043640137, -0.0044250488, -0.004486084,
+ -0.004119873, -0.0036621094, -0.0028381348, -0.0020751953,
+ -0.0012817383, -0.00064086914, -0.00012207031, 0.00051879883,
+ 0.0012512207, 0.002166748, 0.0032653809, 0.0042419434, 0.0049743652,
+ 0.0056152344, 0.0059509277, 0.0061645508, 0.0062866211,
+ 0.0061035156, 0.0059204102, 0.005645752, 0.005645752, 0.0054016113,
+ 0.0051879883, 0.0050354004, 0.0049133301, 0.0049133301, 0.004699707,
+ 0.0045776367, 0.0043640137, 0.0040283203, 0.0033569336,
+ 0.0025024414, 0.0013122559, 6.1035156e-05, -0.0009765625,
+ -0.0021972656, -0.0028076172, -0.0036010742, -0.0038452148,
+ -0.0042419434, -0.004699707, -0.0052185059, -0.0058898926,
+ -0.0064697266, -0.0073242188, -0.0082397461, -0.0091552734,
+ -0.0096740723, -0.0099182129, -0.0096435547, -0.0091552734,
+ -0.0085449219, -0.0079040527, -0.0074768066, -0.0068969727,
+ -0.0066223145, -0.0062561035, -0.005859375, -0.0055236816,
+ -0.0049438477, -0.0045471191, -0.0039672852, -0.0035095215,
+ -0.0030822754, -0.002746582, -0.0026245117, -0.0025939941,
+ -0.002532959, -0.0024414062, -0.0020141602, -0.0015869141,
+ -0.001159668, -0.00067138672, -0.0002746582, 0.00021362305,
+ 0.00033569336, 0.00045776367, 0.00051879883, 0.00064086914,
+ 0.00079345703, 0.00088500977, 0.00094604492, 0.00082397461,
+ 0.00064086914, 0.00030517578, 0.00015258789, -0.00024414062,
+ -0.00061035156, -0.0011901855, -0.0016174316, -0.0020446777,
+ -0.0022888184, -0.0023803711, -0.0023803711, -0.0023803711,
+ -0.0023498535, -0.0022888184, -0.0020446777, -0.0018005371,
+ -0.0014343262, -0.0011901855, -0.00088500977, -0.00064086914,
+ -0.00045776367, -0.00039672852, -0.00033569336, -0.00015258789, 0,
+ 0.00030517578, 0.00054931641, 0.0010375977, 0.001373291,
+ 0.0016784668, 0.001953125, 0.0023193359, 0.0028381348, 0.0035095215,
+ 0.0043334961, 0.0049133301, 0.0056152344, 0.006072998, 0.0065917969,
+ 0.0068664551, 0.0072021484, 0.0073547363, 0.0074768066,
+ 0.0075378418, 0.0073547363, 0.0070800781, 0.0066223145,
+ 0.0062866211, 0.005859375, 0.0054321289, 0.0050048828, 0.0045776367,
+ 0.0043334961, 0.0039978027, 0.003692627, 0.0032958984, 0.0029602051,
+ 0.0024108887, 0.0019226074, 0.0014343262, 0.00088500977,
+ 0.00054931641, 0.00012207031, -0.00015258789, -0.00045776367,
+ -0.00067138672, -0.0009765625, -0.0012512207, -0.0015869141,
+ -0.001953125, -0.0022888184, -3.0517578e-05, -3.0517578e-05,
+ -3.0517578e-05, -3.0517578e-05, -3.0517578e-05, -3.0517578e-05,
+ -3.0517578e-05, -3.0517578e-05, -3.0517578e-05, -6.1035156e-05,
+ -3.0517578e-05, -6.1035156e-05, -3.0517578e-05, -6.1035156e-05,
+ -6.1035156e-05, -3.0517578e-05, -3.0517578e-05, -3.0517578e-05,
+ -3.0517578e-05, -3.0517578e-05, -3.0517578e-05, -3.0517578e-05,
+ -3.0517578e-05, -3.0517578e-05, -3.0517578e-05, -3.0517578e-05,
+ -3.0517578e-05, -3.0517578e-05, 0,
+ };
+
+static const unsigned defaultClickEmphasisLength = sizeof(defaultClickEmphasis) / sizeof(*defaultClickEmphasis);
+
diff --git a/muse/muse/device.h b/muse/muse/device.h
new file mode 100644
index 00000000..6ccf13cf
--- /dev/null
+++ b/muse/muse/device.h
@@ -0,0 +1,56 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __DEVICE_H__
+#define __DEVICE_H__
+
+//---------------------------------------------------------
+// Device
+//---------------------------------------------------------
+
+class Device {
+
+ public:
+ enum DeviceType { MidiDevice, WaveDevice };
+
+ protected:
+ QString _name;
+ DeviceType _type;
+ int _port;
+
+ public:
+ Device() {}
+ virtual ~Device() {}
+ Device(const QString& name, DeviceType t = MidiDevice)
+ : _name(name), _type(t) {}
+
+ virtual QString open(int) = 0;
+ virtual void close() = 0;
+
+ const QString& name() const { return _name; }
+ void setName(const QString& s) { _name = s; }
+ const DeviceType type() const { return _type; }
+ void setDeviceType(DeviceType t) { _type = t; }
+ int port() const { return _port; }
+ void setPort(int p) { _port = p; }
+ };
+
+#endif
+
diff --git a/muse/muse/driver/CMakeLists.txt b/muse/muse/driver/CMakeLists.txt
new file mode 100644
index 00000000..f75c9810
--- /dev/null
+++ b/muse/muse/driver/CMakeLists.txt
@@ -0,0 +1,15 @@
+#
+#
+#
+#
+
+set ( driver_src
+ alsamidi.cpp jack.cpp dummyaudio.cpp alsatimer.cpp
+ rtctimer.cpp posixtimer.cpp
+ )
+
+add_library ( driver STATIC ${driver_src} )
+set_target_properties( driver
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_SOURCE_DIR}/all.h"
+ )
+
diff --git a/muse/muse/driver/alsamidi.cpp b/muse/muse/driver/alsamidi.cpp
new file mode 100644
index 00000000..94f46cff
--- /dev/null
+++ b/muse/muse/driver/alsamidi.cpp
@@ -0,0 +1,698 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: alsamidi.cpp,v 1.35 2006/04/20 10:07:34 wschweer Exp $
+// (C) Copyright 2000-2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "alsamidi.h"
+#include "globals.h"
+#include "midi.h"
+#include "../midiseq.h"
+#include "../song.h"
+#include "al/pos.h"
+
+static const unsigned int inCap = SND_SEQ_PORT_CAP_SUBS_READ;
+static const unsigned int outCap = SND_SEQ_PORT_CAP_SUBS_WRITE;
+
+AlsaMidi alsaMidi;
+AlsaMidi* midiDriver;
+
+//---------------------------------------------------------
+// AlsaMidi
+//---------------------------------------------------------
+
+AlsaMidi::AlsaMidi()
+ {
+ alsaSeq = 0;
+ }
+
+//---------------------------------------------------------
+// init
+// return true on error
+//---------------------------------------------------------
+
+bool AlsaMidi::init()
+ {
+ if (debugMsg)
+ printf("init AlsaMidi\n");
+ int error = snd_seq_open(&alsaSeq, "hw", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK);
+ if (error < 0) {
+ fprintf(stderr, "open ALSA sequencer failed: %s\n",
+ snd_strerror(error));
+ return true;
+ }
+
+ snd_seq_set_client_name(alsaSeq, "MusE Sequencer");
+
+ //-----------------------------------------
+ // subscribe to "Announce"
+ // this enables callbacks for any
+ // alsa port changes
+ //-----------------------------------------
+
+ snd_seq_addr_t src, dst;
+ int rv = snd_seq_create_simple_port(alsaSeq, "MusE Port 0",
+ inCap | outCap | SND_SEQ_PORT_CAP_READ
+ | SND_SEQ_PORT_CAP_WRITE
+ | SND_SEQ_PORT_CAP_NO_EXPORT,
+ SND_SEQ_PORT_TYPE_APPLICATION);
+ if (rv < 0) {
+ fprintf(stderr, "Alsa: create MusE port failed: %s\n", snd_strerror(error));
+ exit(1);
+ }
+ dst.port = rv;
+ dst.client = snd_seq_client_id(alsaSeq);
+ src.port = SND_SEQ_PORT_SYSTEM_ANNOUNCE;
+ src.client = SND_SEQ_CLIENT_SYSTEM;
+
+ snd_seq_port_subscribe_t* subs;
+ snd_seq_port_subscribe_alloca(&subs);
+ snd_seq_port_subscribe_set_dest(subs, &dst);
+ snd_seq_port_subscribe_set_sender(subs, &src);
+ error = snd_seq_subscribe_port(alsaSeq, subs);
+ if (error < 0) {
+ fprintf(stderr, "Alsa: Subscribe System failed: %s\n", snd_strerror(error));
+ return true;
+ }
+
+ return false;
+ }
+
+//---------------------------------------------------------
+// outputPorts
+//---------------------------------------------------------
+
+std::list<PortName>* AlsaMidi::outputPorts()
+ {
+ std::list<PortName>* clientList = new std::list<PortName>;
+ snd_seq_client_info_t* cinfo;
+ snd_seq_client_info_alloca(&cinfo);
+ snd_seq_client_info_set_client(cinfo, 0);
+
+ while (snd_seq_query_next_client(alsaSeq, cinfo) >= 0) {
+ snd_seq_port_info_t *pinfo;
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
+ snd_seq_port_info_set_port(pinfo, -1);
+ while (snd_seq_query_next_port(alsaSeq, pinfo) >= 0) {
+ unsigned int capability = snd_seq_port_info_get_capability(pinfo);
+ if (((capability & outCap) == outCap)
+ && !(capability & SND_SEQ_PORT_CAP_NO_EXPORT)) {
+ int client = snd_seq_port_info_get_client(pinfo);
+ if (client != snd_seq_client_id(alsaSeq)) {
+ PortName pn;
+ pn.name = QString(snd_seq_port_info_get_name(pinfo));
+ snd_seq_addr_t* adr = new snd_seq_addr_t;
+ adr->port = snd_seq_port_info_get_port(pinfo);
+ adr->client = client;
+ pn.port = adr;
+ clientList->push_back(pn);
+ }
+ }
+ }
+ }
+ return clientList;
+ }
+
+//---------------------------------------------------------
+// inputPorts
+//---------------------------------------------------------
+
+std::list<PortName>* AlsaMidi::inputPorts()
+ {
+ std::list<PortName>* clientList = new std::list<PortName>;
+
+ snd_seq_client_info_t* cinfo;
+ snd_seq_client_info_alloca(&cinfo);
+ snd_seq_client_info_set_client(cinfo, 0);
+
+ while (snd_seq_query_next_client(alsaSeq, cinfo) >= 0) {
+ snd_seq_port_info_t *pinfo;
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
+ snd_seq_port_info_set_port(pinfo, -1);
+ while (snd_seq_query_next_port(alsaSeq, pinfo) >= 0) {
+ unsigned int capability = snd_seq_port_info_get_capability(pinfo);
+ if (((capability & inCap) == inCap)
+ && !(capability & SND_SEQ_PORT_CAP_NO_EXPORT)) {
+ int client = snd_seq_port_info_get_client(pinfo);
+ if (client != snd_seq_client_id(alsaSeq)) {
+ PortName pn;
+ pn.name = QString(snd_seq_port_info_get_name(pinfo));
+ snd_seq_addr_t* adr = new snd_seq_addr_t;
+ adr->port = snd_seq_port_info_get_port(pinfo);
+ adr->client = client;
+ pn.port = adr;
+ clientList->push_back(pn);
+ }
+ }
+ }
+ }
+ return clientList;
+ }
+
+//---------------------------------------------------------
+// registerOutPort
+//---------------------------------------------------------
+
+Port AlsaMidi::registerOutPort(const QString& name)
+ {
+ int port = snd_seq_create_simple_port(alsaSeq, name.toLatin1().data(),
+ outCap | SND_SEQ_PORT_CAP_WRITE, SND_SEQ_PORT_TYPE_APPLICATION);
+ if (port < 0) {
+ perror("create port");
+ exit(1);
+ }
+ snd_seq_addr_t* adr = new snd_seq_addr_t;
+ adr->port = port;
+ adr->client = snd_seq_client_id(alsaSeq);
+ return adr;
+ }
+
+//---------------------------------------------------------
+// equal
+//---------------------------------------------------------
+
+bool AlsaMidi::equal(Port p1, Port p2)
+ {
+ snd_seq_addr_t* a1 = (snd_seq_addr_t*)(p1);
+ snd_seq_addr_t* a2 = (snd_seq_addr_t*)(p2);
+ return (a1->port == a2->port) && (a1->client == a2->client);
+ }
+
+//---------------------------------------------------------
+// registerInPort
+//---------------------------------------------------------
+
+Port AlsaMidi::registerInPort(const QString& name)
+ {
+ int port = snd_seq_create_simple_port(alsaSeq, name.toLatin1().data(),
+ inCap | SND_SEQ_PORT_CAP_READ, SND_SEQ_PORT_TYPE_APPLICATION);
+ if (port < 0) {
+ perror("create port");
+ exit(1);
+ }
+ snd_seq_addr_t* adr = new snd_seq_addr_t;
+ adr->port = port;
+ adr->client = snd_seq_client_id(alsaSeq);
+ return adr;
+ }
+
+//---------------------------------------------------------
+// unregisterPort
+//---------------------------------------------------------
+
+void AlsaMidi::unregisterPort(Port port)
+ {
+ snd_seq_delete_simple_port(alsaSeq, AlsaPort(port)->port);
+ delete (snd_seq_addr_t*)port;
+ }
+
+//---------------------------------------------------------
+// setPortName
+//---------------------------------------------------------
+
+void AlsaMidi::setPortName(Port, const QString& name)
+ {
+ printf("AlsaMidi::setPortName(%s): not impl.\n", name.toLatin1().data());
+ }
+
+//---------------------------------------------------------
+// portName
+//---------------------------------------------------------
+
+QString AlsaMidi::portName(Port p)
+ {
+ snd_seq_port_info_t* pinfo;
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_get_any_port_info(alsaSeq, AlsaPort(p)->client, AlsaPort(p)->port, pinfo);
+ return QString(snd_seq_port_info_get_name(pinfo));
+ }
+
+//---------------------------------------------------------
+// findPort
+//---------------------------------------------------------
+
+Port AlsaMidi::findPort(const QString& name)
+ {
+ snd_seq_addr_t* adr = new snd_seq_addr_t;
+ adr->port = 0;
+ adr->client = 0;
+
+ snd_seq_client_info_t* cinfo;
+ snd_seq_client_info_alloca(&cinfo);
+ snd_seq_client_info_set_client(cinfo, 0);
+
+ while (snd_seq_query_next_client(alsaSeq, cinfo) >= 0) {
+ snd_seq_port_info_t *pinfo;
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
+ snd_seq_port_info_set_port(pinfo, -1);
+ while (snd_seq_query_next_port(alsaSeq, pinfo) >= 0) {
+ const char* pn = snd_seq_port_info_get_name(pinfo);
+ if (name == pn) {
+ snd_seq_addr_t* adr = new snd_seq_addr_t;
+ *adr = *snd_seq_port_info_get_addr(pinfo);
+ return adr;
+ }
+ }
+ }
+ printf("AlsaMidi: port <%s> not found\n", name.toLatin1().data());
+ return 0;
+ }
+
+//---------------------------------------------------------
+// connect
+// return false if connect fails
+//---------------------------------------------------------
+
+bool AlsaMidi::connect(Port src, Port dst)
+ {
+ if (((AlsaPort)dst) == 0) {
+ printf("AlsaMidi::connect failed: invalid alsa port\n");
+ return false;
+ }
+ snd_seq_port_subscribe_t* sub;
+ snd_seq_port_subscribe_alloca(&sub);
+
+ snd_seq_port_subscribe_set_sender(sub, (AlsaPort)src);
+ snd_seq_port_subscribe_set_dest(sub, (AlsaPort)dst);
+ int rv = snd_seq_subscribe_port(alsaSeq, sub);
+ if (rv < 0) {
+ printf("AlsaMidi::connect(%d:%d, %d:%d) failed: %s\n",
+ ((AlsaPort)src)->client, ((AlsaPort)src)->port,
+ ((AlsaPort)dst)->client, ((AlsaPort)dst)->port,
+ snd_strerror(rv));
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// disconnect
+// return false if disconnect fails
+//---------------------------------------------------------
+
+bool AlsaMidi::disconnect(Port src, Port dst)
+ {
+ snd_seq_port_subscribe_t* sub;
+ snd_seq_port_subscribe_alloca(&sub);
+ snd_seq_port_subscribe_set_sender(sub, (AlsaPort)src);
+ snd_seq_port_subscribe_set_dest(sub, (AlsaPort)dst);
+ int rv = snd_seq_unsubscribe_port(alsaSeq, sub);
+ if (rv < 0)
+ printf("AlsaMidi::disconnect() failed: %s\n",
+ snd_strerror(rv));
+ return rv >= 0;
+ }
+
+//---------------------------------------------------------
+// getInputPollFd
+//---------------------------------------------------------
+
+void AlsaMidi::getInputPollFd(struct pollfd** p, int* n)
+ {
+ int npfdi = snd_seq_poll_descriptors_count(alsaSeq, POLLIN);
+ struct pollfd* pfdi = new struct pollfd[npfdi];
+ snd_seq_poll_descriptors(alsaSeq, pfdi, npfdi, POLLIN);
+ *p = pfdi;
+ *n = npfdi;
+ }
+
+//---------------------------------------------------------
+// getOutputPollFd
+//---------------------------------------------------------
+
+void AlsaMidi::getOutputPollFd(struct pollfd** p, int* n)
+ {
+ int npfdo = snd_seq_poll_descriptors_count(alsaSeq, POLLOUT);
+ struct pollfd* pfdo = new struct pollfd[npfdo];
+ snd_seq_poll_descriptors(alsaSeq, pfdo, npfdo, POLLOUT);
+ *p = pfdo;
+ *n = npfdo;
+ }
+
+//---------------------------------------------------------
+// addConnection
+// a new connection was added
+//---------------------------------------------------------
+
+void AlsaMidi::addConnection(snd_seq_connect_t* ev)
+ {
+ Port rs = Port(&ev->sender);
+ Port rd = Port(&ev->dest);
+
+ MidiOutPortList* opl = song->midiOutPorts();
+ for (iMidiOutPort i = opl->begin(); i != opl->end(); ++i) {
+ MidiOutPort* oport = *i;
+ Port src = oport->port();
+
+ if (equal(src, rs)) {
+ RouteList* orl = oport->outRoutes();
+ iRoute ir;
+ for (ir = orl->begin(); ir != orl->end(); ++ir) {
+ Port dst = ir->port;
+ if (equal(dst, rd))
+ break;
+ }
+ if (ir == orl->end()) {
+ snd_seq_addr_t* adr = new snd_seq_addr_t(ev->dest);
+ orl->push_back(Route(Port(adr), Route::MIDIPORT));
+ }
+ break;
+ }
+ }
+
+ MidiInPortList* ipl = song->midiInPorts();
+ for (iMidiInPort i = ipl->begin(); i != ipl->end(); ++i) {
+ MidiInPort* iport = *i;
+ Port dst = iport->port();
+
+ if (equal(dst, rd)) {
+ RouteList* irl = iport->inRoutes();
+ iRoute ir;
+ for (ir = irl->begin(); ir != irl->end(); ++ir) {
+ Port src = ir->port;
+ if (equal(src, rs))
+ break;
+ }
+ if (ir == irl->end()) {
+ snd_seq_addr_t* adr = new snd_seq_addr_t(ev->sender);
+ irl->push_back(Route(Port(adr), Route::MIDIPORT));
+ }
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// removeConnection
+// a connection was removed
+//---------------------------------------------------------
+
+void AlsaMidi::removeConnection(snd_seq_connect_t* ev)
+ {
+ Port rs = Port(&ev->sender);
+ Port rd = Port(&ev->dest);
+
+ MidiInPortList* ipl = song->midiInPorts();
+ for (iMidiInPort i = ipl->begin(); i != ipl->end(); ++i) {
+ MidiInPort* iport = *i;
+ Port dst = iport->port();
+
+ if (equal(dst, rd)) {
+ RouteList* irl = iport->inRoutes();
+ for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) {
+ Port src = ir->port;
+
+ if (equal(src, rs)) {
+ irl->erase(ir);
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ MidiOutPortList* opl = song->midiOutPorts();
+ for (iMidiOutPort i = opl->begin(); i != opl->end(); ++i) {
+ MidiOutPort* oport = *i;
+ Port src = oport->port();
+
+ if (equal(src, rs)) {
+ RouteList* orl = oport->outRoutes();
+ for (iRoute r = orl->begin(); r != orl->end(); ++r) {
+ Port dst = r->port;
+
+ if (equal(dst, rd)) {
+ orl->erase(r);
+printf("REMOVE OUT connection\n");
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// read
+// read ALSA midi events
+// This is called by the high priority RT MidiSeq
+// thread.
+//---------------------------------------------------------
+
+void AlsaMidi::read(MidiSeq* seq)
+ {
+ snd_seq_event_t* ev;
+ for (int i = 0;; ++i) {
+ int rv = snd_seq_event_input(alsaSeq, &ev);
+ if (rv <= 0) {
+ if (rv < 0 && rv != -11) // Resource temporarily unavailable
+ printf("AlsaMidi: read error 0x%x %s\n", rv, snd_strerror(rv));
+ break;
+ }
+// printf("Alsa midi event %d %d\n", rv, ev->type);
+
+ switch(ev->type) {
+ case SND_SEQ_EVENT_PORT_SUBSCRIBED:
+ // printf("subscribe\n");
+ addConnection((snd_seq_connect_t*)(&ev->data));
+ break;
+ case SND_SEQ_EVENT_PORT_UNSUBSCRIBED:
+ // printf("unsubscribe\n");
+ removeConnection((snd_seq_connect_t*)(&ev->data));
+ break;
+ case SND_SEQ_EVENT_CLIENT_START:
+ // printf("client start\n");
+ break;
+ case SND_SEQ_EVENT_CLIENT_EXIT:
+ // printf("client exit\n");
+ break;
+ case SND_SEQ_EVENT_PORT_START:
+ // printf("port start\n");
+ break;
+ case SND_SEQ_EVENT_PORT_EXIT:
+ // printf("port exit\n");
+ break;
+ case SND_SEQ_EVENT_SYSEX:
+ {
+ //
+ // look for Midi Machine Control events (MMC)
+ //
+ unsigned char* data = ((unsigned char*)ev->data.ext.ptr) + 1;
+ int len = ev->data.ext.len - 2;
+ if ((len == 4) && (data[0] == 0x7f) && (data[2] == 0x06)) {
+ seq->mmcInput(data[1], data[3], 0);
+ break;
+ }
+ if ((len == 11) && (data[0] == 0x7f)
+ && (data[2] == 0x06)
+ && (data[3] == 0x44) && (data[4] == 0x06)
+ && (data[5] == 0x1)) {
+ int h = data[6];
+ int m = data[7];
+ int s = data[8];
+ int f = data[9];
+ int sf = data[10];
+ AL::Pos pos(h * 60 + m, s, f, sf);
+ seq->mmcInput(data[1], data[3], pos);
+ break;
+ }
+ }
+
+ case SND_SEQ_EVENT_KEYPRESS:
+ case SND_SEQ_EVENT_CHANPRESS:
+ case SND_SEQ_EVENT_NOTEON:
+ case SND_SEQ_EVENT_NOTEOFF:
+ case SND_SEQ_EVENT_PGMCHANGE:
+ case SND_SEQ_EVENT_PITCHBEND:
+ case SND_SEQ_EVENT_CONTROLLER:
+ {
+ Port port = &ev->dest;
+ MidiInPortList* mpl = song->midiInPorts();
+ for (iMidiInPort i = mpl->begin(); i != mpl->end(); ++i) {
+ MidiInPort* inPort = *i;
+ if (equal(port, inPort->port())) {
+ inPort->eventReceived(ev);
+ }
+ }
+ }
+ break;
+
+ case SND_SEQ_EVENT_CLOCK:
+ seq->realtimeSystemInput(0, 0xf8);
+ break;
+ case SND_SEQ_EVENT_START:
+ seq->realtimeSystemInput(0, 0xfa);
+ break;
+ case SND_SEQ_EVENT_CONTINUE:
+ seq->realtimeSystemInput(0, 0xfb);
+ break;
+ case SND_SEQ_EVENT_STOP:
+ seq->realtimeSystemInput(0, 0xfc);
+ break;
+ case SND_SEQ_EVENT_TICK:
+ seq->realtimeSystemInput(0, 0xf9);
+ break;
+ case SND_SEQ_EVENT_SONGPOS:
+ seq->setSongPosition(0, ev->data.control.value);
+ break;
+ case SND_SEQ_EVENT_SENSING:
+ break;
+ case SND_SEQ_EVENT_QFRAME:
+ seq->mtcInputQuarter(0, ev->data.control.value);
+ break;
+ // case SND_SEQ_EVENT_CLIENT_START:
+ // case SND_SEQ_EVENT_CLIENT_EXIT:
+ // case SND_SEQ_EVENT_CLIENT_CHANGE:
+ // case SND_SEQ_EVENT_PORT_CHANGE:
+ // case SND_SEQ_EVENT_SONGSEL:
+ // case SND_SEQ_EVENT_TIMESIGN:
+ // case SND_SEQ_EVENT_KEYSIGN:
+ // case SND_SEQ_EVENT_SETPOS_TICK:
+ // case SND_SEQ_EVENT_SETPOS_TIME:
+ // case SND_SEQ_EVENT_TEMPO:
+ // case SND_SEQ_EVENT_TUNE_REQUEST:
+ // case SND_SEQ_EVENT_RESET:
+ // case SND_SEQ_EVENT_NOTE:
+ // case SND_SEQ_EVENT_CONTROL14:
+ // case SND_SEQ_EVENT_NONREGPARAM:
+ // case SND_SEQ_EVENT_REGPARAM:
+ default:
+ printf("ALSA Midi input: type %d not handled\n", ev->type);
+ break;
+ }
+ snd_seq_free_event(ev);
+ }
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void AlsaMidi::write()
+ {
+ }
+
+//---------------------------------------------------------
+// putEvent
+//---------------------------------------------------------
+
+void AlsaMidi::putEvent(Port p, const MidiEvent& e)
+ {
+ if (midiOutputTrace) {
+ printf("MidiOut<%s>: midiAlsa: ", portName(p).toLatin1().data());
+ e.dump();
+ }
+ int chn = e.channel();
+ int a = e.dataA();
+ int b = e.dataB();
+
+ snd_seq_event_t event;
+ memset(&event, 0, sizeof(event));
+ snd_seq_ev_set_direct(&event);
+ snd_seq_ev_set_source(&event, ((snd_seq_addr_t*)p)->port);
+ snd_seq_ev_set_dest(&event, SND_SEQ_ADDRESS_SUBSCRIBERS, 0);
+
+ switch(e.type()) {
+ case ME_NOTEON:
+ snd_seq_ev_set_noteon(&event, chn, a, b);
+ break;
+ case ME_NOTEOFF:
+ snd_seq_ev_set_noteoff(&event, chn, a, 0);
+ break;
+ case ME_PROGRAM:
+ snd_seq_ev_set_pgmchange(&event, chn, a);
+ break;
+ case ME_CONTROLLER:
+ snd_seq_ev_set_controller(&event, chn, a, b);
+ break;
+ case ME_PITCHBEND:
+ snd_seq_ev_set_pitchbend(&event, chn, a);
+ break;
+ case ME_POLYAFTER:
+ // chnEvent2(chn, 0xa0, a, b);
+ break;
+ case ME_AFTERTOUCH:
+ snd_seq_ev_set_chanpress(&event, chn, a);
+ break;
+ case ME_SYSEX:
+ {
+ const unsigned char* p = e.data();
+ int n = e.len();
+ int len = n + sizeof(event) + 2;
+ char buf[len];
+ event.type = SND_SEQ_EVENT_SYSEX;
+ event.flags = SND_SEQ_EVENT_LENGTH_VARIABLE;
+ event.data.ext.len = n + 2;
+ event.data.ext.ptr = (void*)(buf + sizeof(event));
+ memcpy(buf, &event, sizeof(event));
+ char* pp = buf + sizeof(event);
+ *pp++ = 0xf0;
+ memcpy(pp, p, n);
+ pp += n;
+ *pp = 0xf7;
+ putEvent(&event);
+ return;
+ }
+ case ME_SONGPOS:
+ event.data.control.value = a;
+ event.type = SND_SEQ_EVENT_SONGPOS;
+ break;
+ case ME_CLOCK:
+ event.type = SND_SEQ_EVENT_CLOCK;
+ break;
+ case ME_START:
+ event.type = SND_SEQ_EVENT_START;
+ break;
+ case ME_CONTINUE:
+ event.type = SND_SEQ_EVENT_CONTINUE;
+ break;
+ case ME_STOP:
+ event.type = SND_SEQ_EVENT_STOP;
+ break;
+ default:
+ printf("MidiAlsaDevice::putEvent(): event type %d not implemented\n",
+ e.type());
+ return;
+ }
+ putEvent(&event);
+ }
+
+//---------------------------------------------------------
+// putEvent
+// return false if event is delivered
+//---------------------------------------------------------
+
+bool AlsaMidi::putEvent(snd_seq_event_t* event)
+ {
+ int error;
+
+ do {
+ error = snd_seq_event_output_direct(alsaSeq, event);
+ int len = snd_seq_event_length(event);
+ if (error == len) {
+// printf(".");fflush(stdout);
+ return false;
+ }
+ if (error < 0) {
+ if (error == -12) {
+// printf("?");fflush(stdout);
+ return true;
+ }
+ else {
+ fprintf(stderr, "MidiAlsaDevice::%p putEvent(): midi write error: %s\n",
+ this, snd_strerror(error));
+ //exit(-1);
+ }
+ }
+ else
+ fprintf(stderr, "MidiAlsaDevice::putEvent(): midi write returns %d, expected %d: %s\n",
+ error, len, snd_strerror(error));
+ } while (error == -12);
+ return true;
+ }
+
+
diff --git a/muse/muse/driver/alsamidi.h b/muse/muse/driver/alsamidi.h
new file mode 100644
index 00000000..02beb29c
--- /dev/null
+++ b/muse/muse/driver/alsamidi.h
@@ -0,0 +1,62 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: alsamidi.h,v 1.10 2005/12/19 16:16:27 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __ALSAMIDI_H__
+#define __ALSAMIDI_H__
+
+// #include <config.h>
+#include <alsa/asoundlib.h>
+
+#include "driver.h"
+
+class MidiSeq;
+class MidiEvent;
+
+typedef snd_seq_addr_t* AlsaPort;
+
+//---------------------------------------------------------
+// AlsaMidi
+//---------------------------------------------------------
+
+class AlsaMidi : public Driver {
+ snd_seq_t* alsaSeq;
+
+ void removeConnection(snd_seq_connect_t* ev);
+ void addConnection(snd_seq_connect_t* ev);
+
+ public:
+ AlsaMidi();
+ virtual bool init();
+
+ virtual std::list<PortName>* outputPorts();
+ virtual std::list<PortName>* inputPorts();
+
+ virtual Port registerOutPort(const QString& name);
+ virtual Port registerInPort(const QString& name);
+ virtual void unregisterPort(Port);
+ virtual void setPortName(Port p, const QString& n);
+ virtual QString portName(Port);
+ virtual Port findPort(const QString& name);
+ virtual bool equal(Port, Port);
+
+ virtual bool connect(Port, Port);
+ virtual bool disconnect(Port, Port);
+
+ void getInputPollFd(struct pollfd**, int* n);
+ void getOutputPollFd(struct pollfd**, int* n);
+
+ void read(MidiSeq*); // process events
+ void write();
+
+ void putEvent(Port, const MidiEvent&);
+ bool putEvent(snd_seq_event_t* event);
+ };
+
+extern AlsaMidi alsaMidi;
+extern AlsaMidi* midiDriver;
+#endif
+
diff --git a/muse/muse/driver/alsatimer.cpp b/muse/muse/driver/alsatimer.cpp
new file mode 100644
index 00000000..40d8902d
--- /dev/null
+++ b/muse/muse/driver/alsatimer.cpp
@@ -0,0 +1,188 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: alsatimer.cpp,v 1.4 2006/01/13 18:23:39 spamatica Exp $
+//
+// Plenty of code borrowed from timer.c example in
+// alsalib 1.0.7
+//
+// (C) Copyright 2004 Robert Jonsson (rj@spamatica.se)
+//=========================================================
+
+#include "alsatimer.h"
+
+
+AlsaTimer::AlsaTimer()
+ {
+ handle = 0;
+ id = 0;
+ info = 0;
+ params = 0;
+ }
+
+//---------------------------------------------------------
+// ~AlsaTimer
+//---------------------------------------------------------
+
+AlsaTimer::~AlsaTimer()
+ {
+ if (handle)
+ snd_timer_close(handle);
+ if (id)
+ free(id);
+ if (info)
+ free(info);
+ if (params)
+ free(params);
+ }
+
+//---------------------------------------------------------
+// initTimer
+//---------------------------------------------------------
+
+bool AlsaTimer::initTimer()
+ {
+ int err;
+ int devclass = SND_TIMER_CLASS_GLOBAL;
+ int sclass = SND_TIMER_CLASS_NONE;
+ int card = 0;
+ int device = SND_TIMER_GLOBAL_SYSTEM;
+ int subdevice = 0;
+
+ if (id || info || params)
+ return true;
+
+ snd_timer_id_malloc(&id);
+ snd_timer_info_malloc(&info);
+ snd_timer_params_malloc(&params);
+
+
+ sprintf(timername, "hw:CLASS=%i,SCLASS=%i,CARD=%i,DEV=%i,SUBDEV=%i", devclass, sclass, card, device, subdevice);
+ if ((err = snd_timer_open(&handle, timername, SND_TIMER_OPEN_NONBLOCK))<0) {
+ fprintf(stderr, "AlsaTimer::initTimer(): timer open %i (%s)\n", err, snd_strerror(err));
+ }
+
+ if ((err = snd_timer_info(handle, info)) < 0) {
+ fprintf(stderr, "AlsaTimer::initTimer(): timer info %i (%s)\n", err, snd_strerror(err));
+ return false;
+ }
+
+ snd_timer_params_set_auto_start(params, 1);
+ snd_timer_params_set_ticks(params, 1);
+
+ if ((err = snd_timer_params(handle, params)) < 0) {
+ fprintf(stderr, "AlsaTimer::initTimer(): timer params %i (%s)\n", err, snd_strerror(err));
+ return false;
+ }
+
+ count = snd_timer_poll_descriptors_count(handle);
+ fds = (pollfd *)calloc(count, sizeof(pollfd));
+ if (fds == 0) {
+ fprintf(stderr, "mAlsaTimer::initTimer(): alloc error\n");
+ return false;
+ }
+ if ((err = snd_timer_poll_descriptors(handle, fds, count)) < 0) {
+ fprintf(stderr, "AlsaTimer::initTimer(): snd_timer_poll_descriptors error: %s\n", snd_strerror(err));
+ return false;
+ }
+ return true;
+ }
+
+
+//---------------------------------------------------------
+// setTimerTicks
+//---------------------------------------------------------
+
+bool AlsaTimer::setTimerFreq(unsigned int freq)
+ {
+ signed int err;
+ unsigned int setTick, actFreq;
+
+ if(TIMER_DEBUG)
+ printf("AlsaTimer::setTimerFreq(this=%p)\n",this);
+
+ setTick = (1000000000 / snd_timer_info_get_resolution(info)) / freq;
+
+ if (setTick == 0) {
+ fprintf(stderr,"AlsaTimer::setTimerTicks(): requested freq %u Hz too high for timer (max is %g)\n",
+ freq, 1000000000.0 / snd_timer_info_get_resolution(info));
+ fprintf(stderr," freq stays at %ld Hz\n",(1000000000 / snd_timer_info_get_resolution(info)) / snd_timer_params_get_ticks(params));
+
+ return true;
+ }
+ actFreq = (1000000000 / snd_timer_info_get_resolution(info)) / setTick;
+ if (actFreq != freq) {
+ fprintf(stderr,"AlsaTimer::setTimerTicks(): warning: requested %u Hz, actual freq is %u Hz\n",
+ freq, actFreq);
+ }
+ if(TIMER_DEBUG)
+ printf("AlsaTimer::setTimerFreq(): Setting ticks (period) to %d ticks\n", setTick);
+ snd_timer_params_set_auto_start(params, 1);
+ snd_timer_params_set_ticks(params, setTick);
+ if ((err = snd_timer_params(handle, params)) < 0) {
+ fprintf(stderr, "AlsaTimer::setTimerFreq(): timer params %i (%s)\n", err, snd_strerror(err));
+ return false;
+ }
+
+ return true;
+ }
+
+//---------------------------------------------------------
+// getTimerResolution
+//---------------------------------------------------------
+
+int AlsaTimer::getTimerResolution()
+ {
+ return snd_timer_info_get_resolution(info);
+ }
+
+//---------------------------------------------------------
+// getTimerFreq
+//---------------------------------------------------------
+
+unsigned int AlsaTimer::getTimerFreq()
+ {
+ return (1000000000 / snd_timer_info_get_resolution(info)) / snd_timer_params_get_ticks(params);
+ }
+
+//---------------------------------------------------------
+// startTimer
+//---------------------------------------------------------
+
+bool AlsaTimer::startTimer()
+ {
+ int err;
+ if ((err = snd_timer_start(handle)) < 0) {
+ fprintf(stderr, "AlsaTimer::startTimer(): timer start %i (%s)\n", err, snd_strerror(err));
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// stopTimer
+//---------------------------------------------------------
+
+bool AlsaTimer::stopTimer()
+ {
+ int err;
+ if ((err = snd_timer_stop(handle)) < 0) {
+ fprintf(stderr, "AlsaTimer::startTimer(): timer stop %i (%s)\n", err, snd_strerror(err));
+ return false;
+ }
+ snd_timer_close(handle);
+ return true;
+ }
+
+//---------------------------------------------------------
+// getTimerTicks
+//---------------------------------------------------------
+
+unsigned long AlsaTimer::getTimerTicks()
+ {
+ snd_timer_read_t tr;
+ if (snd_timer_read(handle, &tr, sizeof(tr)) == sizeof(tr)) {
+ return tr.ticks; //(tr.ticks - 1) * 1024; //??
+ }
+ return 0;
+ }
diff --git a/muse/muse/driver/alsatimer.h b/muse/muse/driver/alsatimer.h
new file mode 100644
index 00000000..9a1632f6
--- /dev/null
+++ b/muse/muse/driver/alsatimer.h
@@ -0,0 +1,46 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: alsatimer.h,v 1.4 2006/01/13 18:23:39 spamatica Exp $
+//
+// Plenty of code borrowed from timer.c example in
+// alsalib 1.0.7
+//
+// (C) Copyright 2004 Robert Jonsson (rj@spamatica.se)
+//=========================================================
+
+#ifndef __ALSATIMER_H__
+#define __ALSATIMER_H__
+
+#include "alsa/asoundlib.h"
+#include "timerdev.h"
+
+//---------------------------------------------------------
+// AlsaTimer
+//---------------------------------------------------------
+
+class AlsaTimer : public Timer {
+ snd_timer_t *handle;
+ snd_timer_id_t *id;
+ snd_timer_info_t *info;
+ snd_timer_params_t *params;
+ struct pollfd *fds;
+ char timername[64];
+ int count;
+ int ticks;
+
+ public:
+ AlsaTimer();
+ virtual ~AlsaTimer();
+
+ virtual bool initTimer();
+ virtual int getTimerResolution();
+ virtual bool setTimerFreq(unsigned int tick);
+ virtual unsigned int getTimerFreq();
+ virtual bool startTimer();
+ virtual bool stopTimer();
+ virtual unsigned long getTimerTicks();
+ virtual int getFd() const { return fds->fd; }
+ };
+
+#endif //__ALSATIMER_H__
diff --git a/muse/muse/driver/audiodev.h b/muse/muse/driver/audiodev.h
new file mode 100644
index 00000000..92ef8c76
--- /dev/null
+++ b/muse/muse/driver/audiodev.h
@@ -0,0 +1,42 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: audiodev.h,v 1.10 2006/01/17 17:18:07 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __AUDIODEV_H__
+#define __AUDIODEV_H__
+
+#include "driver.h"
+
+//---------------------------------------------------------
+// AudioDevice
+//---------------------------------------------------------
+
+class AudioDriver : public Driver {
+
+ public:
+ AudioDriver() {}
+ virtual ~AudioDriver() {}
+
+ virtual void start(int priority) = 0;
+ virtual void stop () = 0;
+ virtual unsigned framePos() const = 0;
+ virtual float* getBuffer(void* port, unsigned long nframes) = 0;
+ virtual void registerClient() = 0;
+ virtual Port registerOutPort(const QString& name) = 0;
+ virtual Port registerInPort(const QString& name) = 0;
+ virtual int getState() = 0;
+ virtual unsigned getCurFrame() = 0;
+ virtual int realtimePriority() const = 0; // return zero if not realtime
+ virtual void startTransport() = 0;
+ virtual void stopTransport() = 0;
+ virtual void seekTransport(unsigned frame) = 0;
+ virtual void setFreewheel(bool f) = 0;
+ virtual void graphChanged() {}
+ };
+
+#endif
+
diff --git a/muse/muse/driver/driver.h b/muse/muse/driver/driver.h
new file mode 100644
index 00000000..835cac58
--- /dev/null
+++ b/muse/muse/driver/driver.h
@@ -0,0 +1,47 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: driver.h,v 1.4 2005/12/19 16:16:27 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __DRIVER_H__
+#define __DRIVER_H__
+
+typedef void* Port;
+
+struct PortName {
+ Port port;
+ QString name;
+ };
+
+//---------------------------------------------------------
+// Driver
+// abstract driver base class; used for midi and
+// audio
+//---------------------------------------------------------
+
+class Driver {
+
+ public:
+ Driver() {}
+ virtual ~Driver() {}
+ virtual bool init() = 0;
+
+ virtual std::list<PortName>* outputPorts() = 0;
+ virtual std::list<PortName>* inputPorts() = 0;
+
+ virtual Port registerOutPort(const QString&) = 0;
+ virtual Port registerInPort(const QString&) = 0;
+ virtual void unregisterPort(Port) = 0;
+ virtual void setPortName(Port p, const QString&) = 0;
+ virtual QString portName(Port) = 0;
+ virtual Port findPort(const QString&) = 0;
+
+ virtual bool connect(Port, Port) = 0;
+ virtual bool disconnect(Port, Port) = 0;
+ virtual bool equal(Port, Port) = 0;
+ };
+
+#endif
+
diff --git a/muse/muse/driver/dummyaudio.cpp b/muse/muse/driver/dummyaudio.cpp
new file mode 100644
index 00000000..54f4adfe
--- /dev/null
+++ b/muse/muse/driver/dummyaudio.cpp
@@ -0,0 +1,269 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: dummyaudio.cpp,v 1.20 2006/01/17 17:18:07 wschweer Exp $
+// (C) Copyright 2002-2003 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "al/al.h"
+#include "widgets/utils.h"
+#include "audio.h"
+#include "audiodev.h"
+#include "globals.h"
+#include "song.h"
+
+static const unsigned dummyFrames = 1024;
+static double startTime;
+
+//---------------------------------------------------------
+// DummyAudio
+//---------------------------------------------------------
+
+class DummyAudio : public AudioDriver {
+ pthread_t dummyThread;
+ float buffer[dummyFrames];
+ int state;
+ std::vector<QString> oPorts;
+ std::vector<QString> iPorts;
+ int realTimePriority;
+
+ public:
+ bool seekflag;
+ unsigned pos;
+
+ DummyAudio() {
+ state = Audio::STOP;
+ seekflag = false;
+ startTime = curTime();
+ }
+ virtual ~DummyAudio() {}
+
+ virtual bool init() { return true; }
+ virtual void start(int);
+ virtual void stop ();
+ virtual unsigned framePos() const {
+ return lrint((curTime()-startTime) * AL::sampleRate);
+ }
+
+ virtual float* getBuffer(void* /*port*/, unsigned long nframes)
+ {
+ if (nframes > dummyFrames) {
+ fprintf(stderr, "error: segment size > %d\n", dummyFrames);
+ exit(-1);
+ }
+ memset(buffer, 0, nframes * sizeof(float));
+ return buffer;
+ }
+
+ virtual std::list<PortName>* outputPorts();
+ virtual std::list<PortName>* inputPorts();
+
+ virtual void registerClient() {}
+
+ virtual void* registerOutPort(const QString& s) {
+ iPorts.push_back(QString(s));
+ return (void*)(iPorts.size() + 3000);
+ }
+ virtual void* registerInPort(const QString& s) {
+ oPorts.push_back(QString(s));
+ return (void*)(oPorts.size() + 4000);
+ }
+ virtual void unregisterPort(void*) {
+/* if (long(p) >= 100)
+ oPorts.erase(oPorts.begin() + (long(p)-4000));
+ else
+ iPorts.erase(iPorts.begin() + long(p)-3000);
+*/
+ }
+ virtual bool connect(void*, void*) { return true; }
+ virtual bool disconnect(void*, void*) { return true; }
+ virtual void setPortName(void*, const QString&) {}
+ virtual void* findPort(const QString& s) {
+ if (s == "input1")
+ return (void*)1000;
+ if (s == "input2")
+ return (void*)1001;
+ if (s == "output1")
+ return (void*)2000;
+ if (s == "output2")
+ return (void*)2001;
+ int k = 0;
+ for (std::vector<QString>::const_iterator i = iPorts.begin(); i != iPorts.end(); ++i, ++k) {
+ if (s == *i)
+ return (void*)(3000+k);
+ }
+ k = 0;
+ for (std::vector<QString>::const_iterator i = oPorts.begin(); i != oPorts.end(); ++i, ++k) {
+ if (s == *i)
+ return (void*)(4000+k);
+ }
+ return 0;
+ }
+ virtual QString portName(void* p) {
+ if (long(p) == 1000)
+ return QString("input1");
+ if (long(p) == 1001)
+ return QString("input2");
+ if (long(p) == 2000)
+ return QString("output1");
+ if (long(p) == 2001)
+ return QString("output2");
+ if (long(p) >= 4000)
+ return QString(oPorts[long(p)-4000]);
+ else
+ return QString(iPorts[long(p)-3000]);
+ }
+ virtual int getState() { return state; }
+ virtual unsigned getCurFrame() { return pos; }
+ virtual int realtimePriority() const { return 40; }
+ virtual void startTransport() {
+ state = Audio::PLAY;
+ }
+ virtual void stopTransport() {
+ state = Audio::STOP;
+ }
+ virtual void seekTransport(unsigned n) {
+ seekflag = true;
+ pos = n;
+ }
+ virtual void setFreewheel(bool) {}
+ virtual bool equal(Port a, Port b) {
+ return a == b;
+ }
+ };
+
+DummyAudio* dummyAudio;
+
+//---------------------------------------------------------
+// initDummyAudio
+//---------------------------------------------------------
+
+bool initDummyAudio()
+ {
+ dummyAudio = new DummyAudio();
+ audioDriver = dummyAudio;
+ return false;
+ }
+
+//---------------------------------------------------------
+// outputPorts
+//---------------------------------------------------------
+
+std::list<PortName>* DummyAudio::outputPorts()
+ {
+ std::list<PortName>* clientList = new std::list<PortName>;
+ PortName p1;
+ p1.name = QString("output1");
+ p1.port = (void*)100;
+ PortName p2;
+ p2.name = QString("output2");
+ p2.port = (void*)101;
+ clientList->push_back(p1);
+ clientList->push_back(p2);
+ return clientList;
+ }
+
+//---------------------------------------------------------
+// inputPorts
+//---------------------------------------------------------
+
+std::list<PortName>* DummyAudio::inputPorts()
+ {
+ std::list<PortName>* clientList = new std::list<PortName>;
+ PortName p1;
+ p1.name = QString("input1");
+ p1.port = (void*)0;
+ PortName p2;
+ p2.name = QString("input2");
+ p2.port = (void*)1;
+ clientList->push_back(p1);
+ clientList->push_back(p2);
+ return clientList;
+ }
+
+//---------------------------------------------------------
+// dummyLoop
+//---------------------------------------------------------
+
+static void* dummyLoop(void*)
+ {
+ if (realTimePriority) {
+ //
+ // check if we really got realtime priviledges
+ //
+ int policy;
+ if ((policy = sched_getscheduler (0)) < 0) {
+ printf("cannot get current client scheduler for audio dummy thread: %s!\n", strerror(errno));
+ }
+ else {
+ if (policy != SCHED_FIFO)
+ printf("audio dummy thread _NOT_ running SCHED_FIFO\n");
+ else if (debugMsg) {
+ struct sched_param rt_param;
+ memset(&rt_param, 0, sizeof(sched_param));
+ int type;
+ int rv = pthread_getschedparam(pthread_self(), &type, &rt_param);
+ if (rv == -1)
+ perror("get scheduler parameter");
+ printf("audio dummy thread running SCHED_FIFO priority %d\n",
+ rt_param.sched_priority);
+ }
+ }
+ }
+
+ for (;;) {
+ if (audioState == AUDIO_RUNNING)
+ audio->process(segmentSize);
+ else if (audioState == AUDIO_START1)
+ audioState = AUDIO_START2;
+ usleep(dummyFrames*1000000/AL::sampleRate);
+ if (dummyAudio->seekflag) {
+ audio->sync(Audio::STOP, dummyAudio->pos);
+ dummyAudio->seekflag = false;
+ }
+ if (dummyAudio->getState() == Audio::PLAY) {
+ dummyAudio->pos += dummyFrames;
+ }
+ }
+ pthread_exit(0);
+ }
+
+//---------------------------------------------------------
+// start
+//---------------------------------------------------------
+
+void DummyAudio::start(int priority)
+ {
+ realTimePriority = priority;
+ pthread_attr_t* attributes = 0;
+
+ if (priority) {
+ attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t));
+ pthread_attr_init(attributes);
+
+ if (pthread_attr_setschedpolicy(attributes, SCHED_FIFO)) {
+ printf("cannot set FIFO scheduling class for RT thread\n");
+ }
+ if (pthread_attr_setscope (attributes, PTHREAD_SCOPE_SYSTEM)) {
+ printf("Cannot set scheduling scope for RT thread\n");
+ }
+ struct sched_param rt_param;
+ memset(&rt_param, 0, sizeof(rt_param));
+ rt_param.sched_priority = priority;
+ if (pthread_attr_setschedparam (attributes, &rt_param)) {
+ printf("Cannot set scheduling priority %d for RT thread (%s)\n",
+ priority, strerror(errno));
+ }
+ }
+ if (pthread_create(&dummyThread, attributes, ::dummyLoop, this))
+ perror("creating thread failed:");
+ if (priority)
+ pthread_attr_destroy(attributes);
+ }
+
+void DummyAudio::stop ()
+ {
+ pthread_cancel(dummyThread);
+ pthread_join(dummyThread, 0);
+ }
+
diff --git a/muse/muse/driver/jack.cpp b/muse/muse/driver/jack.cpp
new file mode 100644
index 00000000..d5dbfc3c
--- /dev/null
+++ b/muse/muse/driver/jack.cpp
@@ -0,0 +1,754 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: jack.cpp,v 1.51 2006/01/26 16:11:22 wschweer Exp $
+// (C) Copyright 2002-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "al/al.h"
+#include "al/tempo.h"
+#include "audio.h"
+#include "globals.h"
+#include "song.h"
+#include "jackaudio.h"
+#include "track.h"
+
+#ifdef VST_SUPPORT
+#include <fst.h>
+#endif
+
+JackAudio* jackAudio;
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool JackAudio::init()
+ {
+ return true;
+ }
+
+//---------------------------------------------------------
+// jack_thread_init
+//---------------------------------------------------------
+
+static void jack_thread_init (void* /*data*/)
+ {
+#ifdef VST_SUPPORT
+ if (loadVST)
+ fst_adopt_thread();
+#endif
+ }
+
+//---------------------------------------------------------
+// timebase_callback
+//---------------------------------------------------------
+
+static void timebase_callback(jack_transport_state_t /* state */,
+ jack_nframes_t /* nframes */,
+ jack_position_t* pos,
+ int /* new_pos */,
+ void*)
+ {
+ AL::Pos p(pos->frame, AL::FRAMES);
+ pos->valid = JackPositionBBT;
+ p.mbt(&pos->bar, &pos->beat, &pos->tick);
+ pos->bar++;
+ pos->beat++;
+ pos->bar_start_tick = Pos(pos->bar, 0, 0).tick();
+ //
+ // dummy:
+ //
+ pos->beats_per_bar = 4;
+ pos->beat_type = 4;
+ pos->ticks_per_beat = 384;
+ int tempo = AL::tempomap.tempo(p.tick());
+ pos->beats_per_minute = (60000000.0 / tempo) * AL::tempomap.globalTempo()/100.0;
+ }
+
+//---------------------------------------------------------
+// processAudio
+// JACK callback
+//---------------------------------------------------------
+
+static int processAudio(jack_nframes_t frames, void*)
+ {
+ segmentSize = frames;
+ if (audioState == AUDIO_RUNNING)
+ audio->process((unsigned long)frames);
+ else if (audioState == AUDIO_STOP) {
+ if (debugMsg)
+ puts("jack calling when audio is stopped!\n");
+ }
+ else if (audioState == AUDIO_START1)
+ audioState = AUDIO_START2;
+ return 0;
+ }
+
+//---------------------------------------------------------
+// processSync
+// return TRUE (non-zero) when ready to roll.
+//---------------------------------------------------------
+
+static int processSync(jack_transport_state_t state, jack_position_t* pos, void*)
+ {
+ int audioState = Audio::STOP;
+ switch (state) {
+ case JackTransportStopped:
+ audioState = Audio::STOP;
+ break;
+ case JackTransportLooping:
+ case JackTransportRolling:
+ audioState = Audio::PLAY;
+ break;
+ case JackTransportStarting:
+ audioState = Audio::START_PLAY;
+ break;
+ }
+ unsigned frame = pos->frame;
+ return audio->sync(audioState, frame);
+ }
+
+//---------------------------------------------------------
+// processShutdown
+//---------------------------------------------------------
+
+static void processShutdown(void*)
+ {
+ audio->shutdown();
+
+ for (int i = 0; i < 10; ++i) {
+ if (audioState == AUDIO_STOP)
+ break;
+ sleep(1);
+ }
+ if (audioState == AUDIO_RUNNING)
+ fprintf(stderr, "MusE: sequencer still running, something is very wrong.\n");
+ jackAudio->zeroClientPtr(); // jack disconnect client no longer valid
+ delete jackAudio;
+ jackAudio = 0;
+ audioDriver = 0;
+ }
+
+//---------------------------------------------------------
+// jackError
+//---------------------------------------------------------
+
+static void jackError(const char* s)
+ {
+ fprintf(stderr, "JACK ERROR: %s\n", s);
+ }
+
+//---------------------------------------------------------
+// noJackError
+//---------------------------------------------------------
+
+static void noJackError(const char* /* s */)
+ {
+ }
+
+//---------------------------------------------------------
+// JackAudio
+//---------------------------------------------------------
+
+JackAudio::JackAudio(jack_client_t* cl, char * name)
+ : AudioDriver()
+ {
+ strcpy(jackRegisteredName, name);
+ _client = cl;
+ }
+
+//---------------------------------------------------------
+// ~JackAudio
+//---------------------------------------------------------
+
+JackAudio::~JackAudio()
+ {
+ if (_client) {
+ if (jack_client_close(_client)) {
+ fprintf(stderr, "jack_client_close() failed: %s\n",
+ strerror(errno));
+ }
+ }
+ _client = 0;
+ }
+//---------------------------------------------------------
+// getJackName()
+//---------------------------------------------------------
+
+char* JackAudio::getJackName()
+ {
+ return jackRegisteredName;
+ }
+
+//---------------------------------------------------------
+// initJackAudio
+// return true if JACK not found
+//---------------------------------------------------------
+
+bool initJackAudio()
+ {
+ if (debugMsg) {
+ fprintf(stderr, "init Jack Audio\n");
+ jack_set_error_function(jackError);
+ }
+ else
+ jack_set_error_function(noJackError);
+
+ jack_client_t* client = 0;
+ int i = 0;
+ char jackIdString[8];
+ for (i = 0; i < 5; ++i) {
+ sprintf(jackIdString, "MusE-%d", i+1);
+ client = jack_client_new(jackIdString);
+ if (client)
+ break;
+ }
+
+ if (i == 5)
+ return true;
+
+ if (debugMsg)
+ fprintf(stderr, "init Jack Audio: register device\n");
+ if (client) {
+ jack_set_error_function(jackError);
+ if (debugMsg)
+ fprintf(stderr, "init Jack Audio: register device\n");
+
+ jackAudio = new JackAudio(client, jackIdString);
+ if (debugMsg)
+ fprintf(stderr, "init Jack Audio: register client\n");
+ jackAudio->registerClient();
+ AL::sampleRate = jack_get_sample_rate(client);
+ segmentSize = jack_get_buffer_size(client);
+ }
+ if (client) {
+ audioDriver = jackAudio;
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// bufsize_callback
+//---------------------------------------------------------
+
+static int bufsize_callback(jack_nframes_t n, void*)
+ {
+ printf("JACK: buffersize changed %d\n", n);
+ return 0;
+ }
+
+//---------------------------------------------------------
+// freewheel_callback
+//---------------------------------------------------------
+
+static void freewheel_callback(int starting, void*)
+ {
+ audio->setFreewheel(starting);
+ }
+
+//---------------------------------------------------------
+// srate_callback
+//---------------------------------------------------------
+
+static int srate_callback(jack_nframes_t n, void*)
+ {
+ if (debugMsg)
+ printf("JACK: sample rate changed: %d\n", n);
+ return 0;
+ }
+
+//---------------------------------------------------------
+// registration_callback
+//---------------------------------------------------------
+
+static void registration_callback(jack_port_id_t, int, void*)
+ {
+ if (debugMsg)
+ printf("JACK: registration changed\n");
+ }
+
+//---------------------------------------------------------
+// graph_callback
+// this is called from jack when the connections
+// changed
+//---------------------------------------------------------
+
+static int graph_callback(void*)
+ {
+ // we cannot call JackAudio::graphChanged() from this
+ // context, so we send a message to the gui thread which in turn
+ // calls graphChanged()
+
+ audio->sendMsgToGui(MSG_GRAPH_CHANGED);
+ if (debugMsg)
+ printf("JACK: graph changed!\n");
+ return 0;
+ }
+
+//---------------------------------------------------------
+// JackAudio::graphChanged
+// this is called from song in gui context triggered
+// by graph_callback()
+//---------------------------------------------------------
+
+void JackAudio::graphChanged()
+ {
+ InputList* il = song->inputs();
+ for (iAudioInput ii = il->begin(); ii != il->end(); ++ii) {
+ AudioInput* it = *ii;
+ int channels = it->channels();
+ for (int channel = 0; channel < channels; ++channel) {
+ jack_port_t* port = (jack_port_t*)(it->jackPort(channel));
+ if (port == 0)
+ continue;
+ const char** ports = jack_port_get_all_connections(_client, port);
+ RouteList* rl = it->inRoutes();
+
+ //---------------------------------------
+ // check for disconnects
+ //---------------------------------------
+
+ bool erased;
+ for (;;) {
+ erased = false;
+ for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) {
+ if (irl->channel != channel)
+ continue;
+ QString name = irl->name();
+ const char* portName = name.toLatin1().data();
+ bool found = false;
+ const char** pn = ports;
+ while (pn && *pn) {
+ if (strcmp(*pn, portName) == 0) {
+ found = true;
+ break;
+ }
+ ++pn;
+ }
+ if (!found) {
+ audio->msgRemoveRoute1(
+ Route(portName, channel, Route::AUDIOPORT),
+ Route(it, channel, Route::TRACK)
+ );
+ erased = true;
+ break;
+ }
+ }
+ if (!erased)
+ break;
+ }
+
+ //---------------------------------------
+ // check for connects
+ //---------------------------------------
+
+ if (ports) {
+ const char** pn = ports;
+ while (*pn) {
+ bool found = false;
+ for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) {
+ if (irl->channel != channel)
+ continue;
+ QString name = irl->name();
+ const char* portName = name.toLatin1().data();
+ if (strcmp(*pn, portName) == 0) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ audio->msgAddRoute1(
+ Route(*pn, channel, Route::AUDIOPORT),
+ Route(it, channel, Route::TRACK)
+ );
+ }
+ ++pn;
+ }
+
+ delete ports;
+ }
+ }
+ }
+ OutputList* ol = song->outputs();
+ for (iAudioOutput ii = ol->begin(); ii != ol->end(); ++ii) {
+ AudioOutput* it = *ii;
+ int channels = it->channels();
+ for (int channel = 0; channel < channels; ++channel) {
+ jack_port_t* port = (jack_port_t*)(it->jackPort(channel));
+ if (port == 0)
+ continue;
+ const char** ports = jack_port_get_all_connections(_client, port);
+ RouteList* rl = it->outRoutes();
+
+ //---------------------------------------
+ // check for disconnects
+ //---------------------------------------
+
+ bool erased;
+ for (;;) {
+ erased = false;
+ for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) {
+ if (irl->channel != channel)
+ continue;
+ QString name = irl->name();
+ const char* portName = name.toLatin1().data();
+ bool found = false;
+ const char** pn = ports;
+ while (pn && *pn) {
+ if (strcmp(*pn, portName) == 0) {
+ found = true;
+ break;
+ }
+ ++pn;
+ }
+ if (!found) {
+ audio->msgRemoveRoute1(
+ Route(it, channel, Route::TRACK),
+ Route(portName, channel, Route::AUDIOPORT)
+ );
+ erased = true;
+ break;
+ }
+ }
+ if (!erased)
+ break;
+ }
+
+ //---------------------------------------
+ // check for connects
+ //---------------------------------------
+
+ if (ports) {
+ const char** pn = ports;
+ while (*pn) {
+ bool found = false;
+ for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) {
+ if (irl->channel != channel)
+ continue;
+ QString name = irl->name();
+ const char* portName = name.toLatin1().data();
+ if (strcmp(*pn, portName) == 0) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ audio->msgAddRoute1(
+ Route(it, channel, Route::TRACK),
+ Route(*pn, channel, Route::AUDIOPORT)
+ );
+ }
+ ++pn;
+ }
+
+ delete ports;
+ }
+ }
+ }
+ }
+
+//static int xrun_callback(void*)
+// {
+// printf("JACK: xrun\n");
+// return 0;
+// }
+
+//---------------------------------------------------------
+// register
+//---------------------------------------------------------
+
+void JackAudio::registerClient()
+ {
+ jack_set_process_callback(_client, processAudio, 0);
+ jack_set_sync_callback(_client, processSync, 0);
+ jack_on_shutdown(_client, processShutdown, 0);
+ jack_set_buffer_size_callback(_client, bufsize_callback, 0);
+ jack_set_sample_rate_callback(_client, srate_callback, 0);
+ jack_set_port_registration_callback(_client, registration_callback, 0);
+ jack_set_graph_order_callback(_client, graph_callback, 0);
+// jack_set_xrun_callback(_client, xrun_callback, 0);
+ jack_set_freewheel_callback (_client, freewheel_callback, 0);
+ jack_set_thread_init_callback(_client, (JackThreadInitCallback) jack_thread_init, 0);
+ jack_set_timebase_callback(_client, 0, timebase_callback, 0);
+ }
+
+//---------------------------------------------------------
+// registerInPort
+//---------------------------------------------------------
+
+Port JackAudio::registerInPort(const QString& name)
+ {
+ void* p = jack_port_register(_client, name.toLatin1().data(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
+ //printf("JACK: registerInPort: <%s> %p\n", name.toLatin1().data(), p);
+ return p;
+ }
+
+//---------------------------------------------------------
+// registerOutPort
+//---------------------------------------------------------
+
+Port JackAudio::registerOutPort(const QString& name)
+ {
+ void* p = jack_port_register(_client, name.toLatin1().data(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+ //printf("JACK: registerOutPort: <%s> %p\n", name.toLatin1().data(), p);
+ return p;
+ }
+
+//---------------------------------------------------------
+// exitJackAudio
+//---------------------------------------------------------
+
+void exitJackAudio()
+ {
+ if (jackAudio)
+ delete jackAudio;
+ }
+
+//---------------------------------------------------------
+// connect
+// return false on error
+//---------------------------------------------------------
+
+bool JackAudio::connect(Port src, Port dst)
+ {
+ const char* sn = jack_port_name((jack_port_t*) src);
+ const char* dn = jack_port_name((jack_port_t*) dst);
+
+// printf("jack connect <%s>%p - <%s>%p\n", sn, src, dn, dst);
+
+ if (sn == 0 || dn == 0) {
+ fprintf(stderr, "JackAudio::connect: unknown jack ports\n");
+ return false;
+ }
+ int rv = jack_connect(_client, sn, dn);
+ if (rv) {
+ fprintf(stderr, "%d: jack connect <%s>%p - <%s>%p failed\n",
+ rv, sn, src, dn, dst);
+ if (rv == EEXIST)
+ fprintf(stderr, " connection already made\n");
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// disconnect
+//---------------------------------------------------------
+
+bool JackAudio::disconnect(Port src, Port dst)
+ {
+ const char* sn = jack_port_name((jack_port_t*) src);
+ const char* dn = jack_port_name((jack_port_t*) dst);
+
+// printf("jack disconnect <%s>%p - <%s>%p\n", sn, src, dn, dst);
+
+ if (sn == 0 || dn == 0) {
+ fprintf(stderr, "JackAudio::disconnect: unknown jack ports\n");
+ return false;
+ }
+ if (jack_disconnect(_client, sn, dn)) {
+ fprintf(stderr, "jack disconnect <%s> - <%s> failed\n",
+ sn, dn);
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// start
+//---------------------------------------------------------
+
+void JackAudio::start(int)
+ {
+ if (jack_activate(_client)) {
+ fprintf (stderr, "JACK: cannot activate client\n");
+ exit(-1);
+ }
+ }
+
+//---------------------------------------------------------
+// stop
+//---------------------------------------------------------
+
+void JackAudio::stop()
+ {
+ if (jack_deactivate(_client)) {
+ fprintf (stderr, "JACK: cannot deactivate client");
+ }
+ //printf("JackAudio::stop() %p\n", _client);
+ }
+
+//---------------------------------------------------------
+// framePos
+//---------------------------------------------------------
+
+unsigned JackAudio::framePos() const
+ {
+ jack_nframes_t n = jack_frame_time(_client);
+ return n;
+ }
+
+//---------------------------------------------------------
+// outputPorts
+//---------------------------------------------------------
+
+std::list<PortName>* JackAudio::outputPorts()
+ {
+ const char** ports = jack_get_ports(_client, 0, 0, 0);
+ std::list<PortName>* clientList = new std::list<PortName>;
+ for (const char** p = ports; p && *p; ++p) {
+ jack_port_t* port = jack_port_by_name(_client, *p);
+ int flags = jack_port_flags(port);
+ if (!(flags & JackPortIsOutput))
+ continue;
+ char buffer[128];
+ strncpy(buffer, *p, 128);
+ if (strncmp(buffer, "MusE", 4) == 0)
+ continue;
+ PortName pn;
+ pn.name = QString(buffer);
+ clientList->push_back(pn);
+ }
+ return clientList;
+ }
+
+//---------------------------------------------------------
+// inputPorts
+//---------------------------------------------------------
+
+std::list<PortName>* JackAudio::inputPorts()
+ {
+ const char** ports = jack_get_ports(_client, 0, 0, 0);
+ std::list<PortName>* clientList = new std::list<PortName>;
+ for (const char** p = ports; p && *p; ++p) {
+ jack_port_t* port = jack_port_by_name(_client, *p);
+ int flags = jack_port_flags(port);
+ if (!(flags & JackPortIsInput))
+ continue;
+ char buffer[128];
+ strncpy(buffer, *p, 128);
+ if (strncmp(buffer, "MusE", 4) == 0)
+ continue;
+ PortName pn;
+ pn.name = QString(buffer);
+ clientList->push_back(pn);
+ }
+ return clientList;
+ }
+
+//---------------------------------------------------------
+// portName
+//---------------------------------------------------------
+
+QString JackAudio::portName(void* port)
+ {
+ const char *nameStrPtr = jack_port_name((jack_port_t*)port);
+ QString s(nameStrPtr);
+ return s;
+ }
+
+//---------------------------------------------------------
+// unregisterPort
+//---------------------------------------------------------
+
+void JackAudio::unregisterPort(Port p)
+ {
+ //printf("JACK: unregister Port %p\n", p);
+ jack_port_unregister(_client, (jack_port_t*)p);
+ }
+
+//---------------------------------------------------------
+// getState
+//---------------------------------------------------------
+
+int JackAudio::getState()
+ {
+ transportState = jack_transport_query(_client, &pos);
+ switch (transportState) {
+ case JackTransportStopped: return Audio::STOP;
+ case JackTransportLooping:
+ case JackTransportRolling: return Audio::PLAY;
+ case JackTransportStarting: return Audio::START_PLAY;
+ default:
+ return Audio::STOP;
+ }
+ }
+
+//---------------------------------------------------------
+// setFreewheel
+//---------------------------------------------------------
+
+void JackAudio::setFreewheel(bool f)
+ {
+// printf("JACK: setFreewheel %d\n", f);
+ jack_set_freewheel(_client, f);
+ }
+
+//---------------------------------------------------------
+// startTransport
+//---------------------------------------------------------
+
+void JackAudio::startTransport()
+ {
+// printf("JACK: startTransport\n");
+ jack_transport_start(_client);
+ }
+
+//---------------------------------------------------------
+// stopTransport
+//---------------------------------------------------------
+
+void JackAudio::stopTransport()
+ {
+// printf("JACK: stopTransport\n");
+ jack_transport_stop(_client);
+ }
+
+//---------------------------------------------------------
+// seekTransport
+//---------------------------------------------------------
+
+void JackAudio::seekTransport(unsigned frame)
+ {
+// printf("JACK: seekTransport %d\n", frame);
+ jack_transport_locate(_client, frame);
+ }
+
+//---------------------------------------------------------
+// findPort
+//---------------------------------------------------------
+
+Port JackAudio::findPort(const QString& name)
+ {
+ void* p = jack_port_by_name(_client, name.toLatin1().data());
+// printf("Jack::findPort <%s>, %p\n", name.toLatin1().data(), p);
+ return p;
+ }
+
+//---------------------------------------------------------
+// realtimePriority
+// return zero if not running realtime
+// can only be called if JACK client thread is already
+// running
+//---------------------------------------------------------
+
+int JackAudio::realtimePriority() const
+ {
+ pthread_t t = jack_client_thread_id(_client);
+ int policy;
+ struct sched_param param;
+ memset(&param, 0, sizeof(param));
+ int rv = pthread_getschedparam(t, &policy, &param);
+ if (rv) {
+ perror("MusE: get jack schedule parameter");
+ return 0;
+ }
+ if (policy != SCHED_FIFO) {
+ printf("JACK is not running realtime\n");
+ return 0;
+ }
+ return param.sched_priority;
+ }
+
diff --git a/muse/muse/driver/jackaudio.h b/muse/muse/driver/jackaudio.h
new file mode 100644
index 00000000..b0d1c527
--- /dev/null
+++ b/muse/muse/driver/jackaudio.h
@@ -0,0 +1,70 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: jackaudio.h,v 1.29 2006/01/17 17:18:07 wschweer Exp $
+// (C) Copyright 2002 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __JACKAUDIO_H__
+#define __JACKAUDIO_H__
+
+#include <jack/jack.h>
+#include "audiodev.h"
+
+//---------------------------------------------------------
+// JackAudio
+//---------------------------------------------------------
+
+class JackAudio : public AudioDriver {
+ jack_client_t* _client;
+ jack_transport_state_t transportState;
+ jack_position_t pos;
+ char jackRegisteredName[8];
+
+ public:
+ JackAudio(jack_client_t* cl, char * jack_id_string);
+ virtual ~JackAudio();
+ virtual bool init();
+ virtual void start(int);
+ virtual void stop ();
+ virtual void zeroClientPtr() { _client = 0; }
+ virtual unsigned framePos() const;
+
+ virtual float* getBuffer(void* port, unsigned long nframes) {
+ return (float*)jack_port_get_buffer((jack_port_t*)port, nframes);
+ }
+
+ virtual std::list<PortName>* outputPorts();
+ virtual std::list<PortName>* inputPorts();
+
+ virtual void registerClient();
+
+ virtual Port registerOutPort(const QString& name);
+ virtual Port registerInPort(const QString& name);
+
+ virtual char* getJackName();
+
+ virtual void unregisterPort(Port);
+ virtual bool connect(Port, Port);
+ virtual bool disconnect(Port, Port);
+ virtual void setPortName(Port p, const QString& n) {
+ jack_port_set_name((jack_port_t*)p, n.toLatin1().data());
+ }
+ virtual Port findPort(const QString& name);
+ virtual QString portName(Port);
+ virtual int getState();
+ virtual unsigned int getCurFrame() { return pos.frame; }
+ virtual int realtimePriority() const;
+ virtual void startTransport();
+ virtual void stopTransport();
+ virtual void seekTransport(unsigned frame);
+ virtual void setFreewheel(bool f);
+ jack_transport_state_t transportQuery(jack_position_t* pos) {
+ return jack_transport_query(_client, pos);
+ }
+ void graphChanged();
+ virtual bool equal(Port a, Port b) { return a == b; }
+ };
+
+#endif
+
diff --git a/muse/muse/driver/posixtimer.cpp b/muse/muse/driver/posixtimer.cpp
new file mode 100644
index 00000000..e8601063
--- /dev/null
+++ b/muse/muse/driver/posixtimer.cpp
@@ -0,0 +1,179 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: posixtimer.cpp,v 1.2 2005/11/23 13:55:32 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (werner@seh.de)
+//=========================================================
+
+//
+// support posix high resolution timers
+// http://sourceforge.net/projects/high-res-timers
+//
+#include <signal.h>
+#include <memory.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "posixtimer.h"
+
+extern bool debugMsg;
+
+static int fd[2];
+
+//---------------------------------------------------------
+// getFd
+//---------------------------------------------------------
+
+int PosixTimer::getFd() const
+ {
+ return fd[0];
+ }
+
+//---------------------------------------------------------
+// sigalarm
+//---------------------------------------------------------
+
+static void sigalarm(int /*signo*/)
+ {
+ write(fd[1], ".", 1);
+ }
+
+//---------------------------------------------------------
+// PosixTimer
+//---------------------------------------------------------
+
+PosixTimer::PosixTimer()
+ {
+ timerId = 0;
+ }
+
+PosixTimer::~PosixTimer()
+ {
+ if (timerId != 0)
+ timer_delete(timerId);
+ }
+
+//---------------------------------------------------------
+// initTimer
+// return -1 on error
+//---------------------------------------------------------
+
+bool PosixTimer::initTimer()
+ {
+ pthread_t tid = pthread_self();
+printf("tid %p\n", (void*)tid);
+ struct sigevent se;
+ memset(&se, 0, sizeof(se));
+ se.sigev_notify = SIGEV_THREAD_ID;
+ se.sigev_signo = SIGRTMAX;
+// se.sigev_value.sival_ptr = this;
+ se._sigev_un._tid = tid;
+
+ // allocate timer
+ int rv;
+ clock = CLOCK_REALTIME;
+ rv = timer_create(clock, &se, &timerId);
+
+ if (rv < 0) {
+ perror("posix timer create");
+ fprintf(stderr, "no posix timer available\n");
+ return false;
+ }
+ else if (debugMsg) {
+ if (clock == CLOCK_REALTIME)
+ printf("created CLOCK_REALTIME posix timer\n");
+ }
+
+ // Set up signal handler:
+
+ struct sigaction act;
+ sigfillset(&act.sa_mask);
+ act.sa_flags = 0;
+ act.sa_handler = sigalarm;
+ sigaction(SIGRTMAX, &act, 0);
+
+ if (pipe(fd) < 0) {
+ perror("PosixTimer::initTimer: create pipe");
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// getTimerResolution
+// return timer resolution in microseconds
+//---------------------------------------------------------
+
+int PosixTimer::getTimerResolution()
+ {
+ struct timespec spec;
+ int rv = clock_getres(clock, &spec);
+ if (rv != -1)
+ return spec.tv_nsec / 1000;
+ return 0;
+ }
+
+//---------------------------------------------------------
+// setTimerTicks
+// return false on error
+//---------------------------------------------------------
+
+bool PosixTimer::setTimerTicks(int tick)
+ {
+ double nsec = (1000.0*1000.0*1000.0) / tick;
+ ts.it_interval.tv_sec = 0;
+ ts.it_interval.tv_nsec = int(nsec);
+ ts.it_value = ts.it_interval;
+ return true;
+ }
+
+//---------------------------------------------------------
+// startTimer
+//---------------------------------------------------------
+
+bool PosixTimer::startTimer()
+ {
+ int rv = timer_settime(timerId, 0, &ts, 0);
+ if (rv < 0) {
+ perror("PosixTimer::startTimer: timer_settime");
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// stopTimer
+//---------------------------------------------------------
+
+bool PosixTimer::stopTimer()
+ {
+ struct itimerspec s;
+ s.it_interval.tv_sec = 0;
+ s.it_interval.tv_nsec = 0;
+ s.it_value.tv_sec = 0;
+ s.it_value.tv_nsec = 0;
+
+ int rv = timer_settime(timerId, 0, &s, 0);
+ if (rv < 0) {
+ perror("PosixTimer::stopTimer: timer_settime");
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// getTimerTicks
+//---------------------------------------------------------
+
+unsigned long PosixTimer::getTimerTicks()
+ {
+ char buffer[16];
+ int n = read(fd[0], buffer, 16);
+if (n != 1)
+ printf("getTimerTicks %d\n", n);
+ return n;
+// int n = timer_getoverrun(timerId);
+// return n;
+ }
+
diff --git a/muse/muse/driver/posixtimer.h b/muse/muse/driver/posixtimer.h
new file mode 100644
index 00000000..62bd483a
--- /dev/null
+++ b/muse/muse/driver/posixtimer.h
@@ -0,0 +1,39 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: posixtimer.h,v 1.1 2005/11/14 20:05:36 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (werner@seh.de)
+//=========================================================
+
+#ifndef __POSIXTIMER_H__
+#define __POSIXTIMER_H__
+
+#include <time.h>
+#include "timerdev.h"
+
+//---------------------------------------------------------
+// PosixTimer
+//---------------------------------------------------------
+
+class PosixTimer : public Timer{
+ timer_t timerId;
+ struct itimerspec ts;
+ clock_t clock;
+
+ public:
+ PosixTimer();
+ virtual ~PosixTimer();
+
+ virtual bool initTimer();
+ virtual int getTimerResolution();
+ virtual bool setTimerTicks(int tick);
+
+ virtual bool startTimer();
+ virtual bool stopTimer();
+ virtual unsigned long getTimerTicks();
+ virtual int getFd() const;
+ };
+
+#endif //__POSIXTIMER_H__
+
diff --git a/muse/muse/driver/rtctimer.cpp b/muse/muse/driver/rtctimer.cpp
new file mode 100644
index 00000000..2e33cb02
--- /dev/null
+++ b/muse/muse/driver/rtctimer.cpp
@@ -0,0 +1,190 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: rtctimer.cpp,v 1.9 2006/01/13 18:23:39 spamatica Exp $
+//
+// Most code moved from midiseq.cpp by Werner Schweer.
+//
+// (C) Copyright 2004 Robert Jonsson (rj@spamatica.se)
+// (C) Copyright -2004 Werner Schweer (werner@seh.de)
+//=========================================================
+
+#include <linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
+#include <linux/spinlock.h>
+#include <linux/mc146818rtc.h>
+#else
+#include <linux/rtc.h>
+#endif
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <poll.h>
+
+
+#include "rtctimer.h"
+#include "globals.h"
+#include "gconfig.h"
+#include "widgets/utils.h"
+
+
+//---------------------------------------------------------
+// RtcTimer
+//---------------------------------------------------------
+
+RtcTimer::RtcTimer()
+ {
+ timerFd = -1;
+ }
+
+//---------------------------------------------------------
+// ~RtcTimer
+//---------------------------------------------------------
+RtcTimer::~RtcTimer()
+ {
+ if (timerFd != -1)
+ close(timerFd);
+ }
+
+//---------------------------------------------------------
+// initTimer
+// return false on error
+//---------------------------------------------------------
+
+bool RtcTimer::initTimer()
+ {
+ if(TIMER_DEBUG)
+ printf("RtcTimer::initTimer()\n");
+ if (timerFd != -1) {
+ fprintf(stderr,"RtcTimer::initTimer(): called on initialised timer!\n");
+ return false;
+ }
+ timerFd = ::open("/dev/rtc", O_RDONLY);
+ if (timerFd == -1) {
+ fprintf(stderr, "RtcTimer:: fatal error: open /dev/rtc failed: %s\n",
+ strerror(errno));
+ return false;
+ }
+ if (!setTimerFreq(config.rtcTicks)) {
+ // unable to set timer frequency
+ timerFd = -1;
+ return false;
+ }
+ // check if timer really works, start and stop it once.
+ if (!startTimer()) {
+ timerFd = -1;
+ return false;
+ }
+ if (!stopTimer()) {
+ timerFd = -1;
+ return false;
+ }
+ // stop has closed the device, open it again
+ timerFd = ::open("/dev/rtc", O_RDONLY);
+ return true;
+ }
+
+
+//---------------------------------------------------------
+// setTimerFreq
+// return false on error
+//---------------------------------------------------------
+
+bool RtcTimer::setTimerFreq(unsigned int tick)
+ {
+ int rc = ioctl(timerFd, RTC_IRQP_SET, tick);
+ if (rc == -1) {
+ fprintf(stderr, "RtcTimer::setTimerFreq(): cannot set ticks %d on /dev/rtc: %s\n",
+ config.rtcTicks, strerror(errno));
+ fprintf(stderr, " precise timer not available\n");
+ close(timerFd);
+ //if (!debugMode)
+ // fatalError("set timer ticks failed");
+ timerFd = -1;
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// getTimerResolution
+//---------------------------------------------------------
+
+int RtcTimer::getTimerResolution()
+ {
+ /* The RTC doesn't really work with a set resolution as such.
+ * Not sure how this fits into things yet.
+ */
+ return 0;
+ }
+
+//---------------------------------------------------------
+// getTimerFreq
+//---------------------------------------------------------
+
+unsigned int RtcTimer::getTimerFreq()
+ {
+ unsigned int freq;
+ int rv = ioctl(timerFd, RTC_IRQP_READ, &freq);
+ if (rv < 1)
+ return 0;
+ return freq;
+ }
+//---------------------------------------------------------
+// startTimer
+//---------------------------------------------------------
+
+bool RtcTimer::startTimer()
+ {
+ if (TIMER_DEBUG)
+ printf("RtcTimer::startTimer\n");
+ if (timerFd == -1) {
+ if (!debugMode)
+ fprintf(stderr, "RtcTimer::startTimer(): no timer to start.\n");
+ return false;
+ }
+ if (ioctl(timerFd, RTC_PIE_ON, 0) == -1) {
+ perror("RtcTimer::startTimer(): start: RTC_PIE_ON failed");
+ ::close(timerFd);
+ timerFd = -1;
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// stopTimer
+//---------------------------------------------------------
+
+bool RtcTimer::stopTimer()
+ {
+ if (TIMER_DEBUG)
+ printf("RtcTimer::stopTimer\n");
+ if (timerFd != -1) {
+ ioctl(timerFd, RTC_PIE_OFF, 0);
+ ::close(timerFd);
+ timerFd = -1;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// getTimerTicks
+//---------------------------------------------------------
+
+unsigned long RtcTimer::getTimerTicks()
+ {
+ if (TIMER_DEBUG)
+ printf("getTimerTicks()\n");
+ if (timerFd==-1) {
+ fprintf(stderr,"RtcTimer::getTimerTicks(): no RTC open to read!\n");
+ return 0;
+ }
+ unsigned long nn;
+ if (read(timerFd, &nn, sizeof(unsigned long)) != sizeof(unsigned long)) {
+ perror("rtc timer read error");
+ fatalError("RtcTimer::getTimerTicks(): error reading RTC");
+ }
+ return nn;
+ }
+
diff --git a/muse/muse/driver/rtctimer.h b/muse/muse/driver/rtctimer.h
new file mode 100644
index 00000000..c699439c
--- /dev/null
+++ b/muse/muse/driver/rtctimer.h
@@ -0,0 +1,39 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: rtctimer.h,v 1.5 2006/01/13 18:23:39 spamatica Exp $
+//
+// Most code moved from midiseq.cpp
+//
+// (C) Copyright 2004 Robert Jonsson (rj@spamatica.se)
+// (C) Copyright 2004 Werner Schweer (werner@seh.de)
+//=========================================================
+
+#ifndef __RTCTIMER_H__
+#define __RTCTIMER_H__
+
+#include "timerdev.h"
+
+//---------------------------------------------------------
+// RtcTimer
+//---------------------------------------------------------
+
+class RtcTimer : public Timer{
+ int timerFd;
+
+ public:
+ RtcTimer();
+ virtual ~RtcTimer();
+
+ virtual bool initTimer();
+ virtual int getTimerResolution();
+ virtual bool setTimerFreq(unsigned int tick);
+ virtual unsigned int getTimerFreq();
+
+ virtual bool startTimer();
+ virtual bool stopTimer();
+ virtual unsigned long getTimerTicks();
+ virtual int getFd() const { return timerFd; }
+ };
+
+#endif //__ALSATIMER_H__
diff --git a/muse/muse/driver/timerdev.h b/muse/muse/driver/timerdev.h
new file mode 100644
index 00000000..f791372f
--- /dev/null
+++ b/muse/muse/driver/timerdev.h
@@ -0,0 +1,39 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: timerdev.h,v 1.6 2006/01/13 18:23:39 spamatica Exp $
+//
+// Plenty of code borrowed from timer.c example in
+// alsalib 1.0.7
+//
+// (C) Copyright 2004 Robert Jonsson (rj@spamatica.se)
+//=========================================================
+
+#ifndef __TIMERDEV_H__
+#define __TIMERDEV_H__
+
+#include <pthread.h>
+
+#define TIMER_DEBUG 0
+
+//---------------------------------------------------------
+// Timer
+//---------------------------------------------------------
+
+class Timer {
+
+ public:
+ Timer() {};
+ virtual ~Timer() {};
+
+ virtual bool initTimer() = 0;
+ virtual int getTimerResolution() = 0;
+ virtual bool setTimerFreq(unsigned int freq) = 0;
+
+ virtual bool startTimer() = 0;
+ virtual bool stopTimer() = 0;
+ virtual unsigned long getTimerTicks() = 0;
+ virtual int getFd() const { return -1; }
+ };
+
+#endif //__TIMERDEV_H__
diff --git a/muse/muse/dssihost.cpp b/muse/muse/dssihost.cpp
new file mode 100644
index 00000000..1e8ab542
--- /dev/null
+++ b/muse/muse/dssihost.cpp
@@ -0,0 +1,863 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "config.h"
+
+#ifdef DSSI_SUPPORT
+
+#include <signal.h>
+#include <dlfcn.h>
+#include <dssi.h>
+#include <alsa/asoundlib.h>
+
+#include "dssihost.h"
+#include "synth.h"
+#include "driver/jackaudio.h"
+#include "midi.h"
+#include "al/al.h"
+#include "al/xml.h"
+#include "song.h"
+#include "midictrl.h"
+
+static lo_server_thread serverThread;
+static char osc_path_tmp[1024];
+static char* url;
+
+//---------------------------------------------------------
+// oscError
+//---------------------------------------------------------
+
+static void oscError(int num, const char *msg, const char *path)
+ {
+ fprintf(stderr, "MusE: liblo server error %d in path %s: %s\n",
+ num, path, msg);
+ }
+
+//---------------------------------------------------------
+// oscDebugHandler
+//---------------------------------------------------------
+
+static int oscDebugHandler(const char* path, const char* types, lo_arg** argv,
+ int argc, void*, void*)
+ {
+ printf("MusE: got unhandled OSC message:\n path: <%s>\n", path);
+ for (int i = 0; i < argc; i++) {
+ printf(" arg %d '%c' ", i, types[i]);
+ lo_arg_pp(lo_type(types[i]), argv[i]);
+ printf("\n");
+ }
+ return 1;
+ }
+
+//---------------------------------------------------------
+// oscUpdate
+//---------------------------------------------------------
+
+int DssiSynthIF::oscUpdate(lo_arg **argv)
+ {
+ const char *url = (char *)&argv[0]->s;
+
+ if (uiTarget)
+ lo_address_free(uiTarget);
+ char* host = lo_url_get_hostname(url);
+ char* port = lo_url_get_port(url);
+ uiTarget = lo_address_new(host, port);
+ free(host);
+ free(port);
+
+ if (uiOscPath)
+ free(uiOscPath);
+ uiOscPath = lo_url_get_path(url);
+ int pl = strlen(uiOscPath);
+
+ if (uiOscControlPath)
+ free(uiOscControlPath);
+ uiOscControlPath = (char *)malloc(pl + 10);
+ sprintf(uiOscControlPath, "%s/control", uiOscPath);
+
+ if (uiOscConfigurePath)
+ free(uiOscConfigurePath);
+ uiOscConfigurePath = (char *)malloc(pl + 12);
+ sprintf(uiOscConfigurePath, "%s/configure", uiOscPath);
+
+ if (uiOscProgramPath)
+ free(uiOscProgramPath);
+ uiOscProgramPath = (char *)malloc(pl + 10);
+ sprintf(uiOscProgramPath, "%s/program", uiOscPath);
+
+ if (uiOscShowPath)
+ free(uiOscShowPath);
+ uiOscShowPath = (char *)malloc(pl + 10);
+ sprintf(uiOscShowPath, "%s/show", uiOscPath);
+
+ /* At this point a more substantial host might also call
+ * configure() on the UI to set any state that it had remembered
+ * for the plugin instance. But we don't remember state for
+ * plugin instances (see our own configure() implementation in
+ * osc_configure_handler), and so we have nothing to send except
+ * the optional project directory.
+ */
+
+ lo_send(uiTarget, uiOscConfigurePath, "ss",
+ DSSI_PROJECT_DIRECTORY_KEY, museProject.toLatin1().data());
+
+#if 0
+ /* Send current bank/program (-FIX- another race...) */
+ if (instance->pendingProgramChange < 0) {
+ unsigned long bank = instance->currentBank;
+ unsigned long program = instance->currentProgram;
+ instance->uiNeedsProgramUpdate = 0;
+ if (instance->uiTarget) {
+ lo_send(instance->uiTarget, instance->ui_osc_program_path, "ii", bank, program);
+ }
+ }
+
+ /* Send control ports */
+ for (i = 0; i < instance->plugin->controlIns; i++) {
+ int in = i + instance->firstControlIn;
+ int port = pluginControlInPortNumbers[in];
+ lo_send(instance->uiTarget, instance->ui_osc_control_path, "if", port,
+ pluginControlIns[in]);
+ /* Avoid overloading the GUI if there are lots and lots of ports */
+ if ((i+1) % 50 == 0)
+ usleep(300000);
+ }
+#endif
+ return 0;
+ }
+
+//---------------------------------------------------------
+// oscMessageHandler
+//---------------------------------------------------------
+
+int oscMessageHandler(const char* path, const char* types, lo_arg** argv,
+ int argc, void* data, void* user_data)
+ {
+ const char* p = path;
+ if (strncmp(p, "/dssi/", 6))
+ return oscDebugHandler(path, types, argv, argc, data, user_data);
+
+ p += 6;
+
+ SynthIList* sl = song->syntis();
+ DssiSynthIF* instance = 0;
+ SynthI* synti = 0;
+
+ for (iSynthI si = sl->begin(); si != sl->end(); ++si) {
+ int l = strlen((*si)->name().toLatin1().data());
+ if (!strncmp(p, (*si)->name().toLatin1().data(), l)) {
+ synti = *si;
+ instance = (DssiSynthIF*)(synti->sif());
+ p += l;
+ break;
+ }
+ }
+ if (!instance)
+ return oscDebugHandler(path, types, argv, argc, data, user_data);
+
+ if (*p != '/' || *(p + 1) == 0)
+ return oscDebugHandler(path, types, argv, argc, data, user_data);
+ ++p;
+
+ if (!strcmp(p, "configure") && argc == 2 && !strcmp(types, "ss"))
+ return instance->oscConfigure(argv);
+ else if (!strcmp(p, "control") && argc == 2 && !strcmp(types, "if"))
+ return instance->oscControl(argv);
+ else if (!strcmp(p, "midi") && argc == 1 && !strcmp(types, "m"))
+ return instance->oscMidi(argv);
+ else if (!strcmp(p, "program") && argc == 2 && !strcmp(types, "ii"))
+ return instance->oscProgram(argv);
+ else if (!strcmp(p, "update") && argc == 1 && !strcmp(types, "s"))
+ return instance->oscUpdate(argv);
+ else if (!strcmp(p, "exiting") && argc == 0)
+ return instance->oscExiting(argv);
+ return oscDebugHandler(path, types, argv, argc, data, user_data);
+ }
+
+//---------------------------------------------------------
+// scanDSSILib
+//---------------------------------------------------------
+
+static void scanDSSILib(const QFileInfo& fi)
+ {
+ void* handle = dlopen(fi.filePath().toLatin1().data(), RTLD_NOW);
+ if (handle == 0) {
+ fprintf(stderr, "dlopen(%s) failed: %s\n",
+ fi.filePath().toAscii().data(), dlerror());
+ return;
+ }
+ DSSI_Descriptor_Function dssi = (DSSI_Descriptor_Function)dlsym(handle, "dssi_descriptor");
+
+ if (!dssi) {
+ const char *txt = dlerror();
+ if (txt) {
+ fprintf(stderr,
+ "Unable to find dssi_descriptor() function in plugin "
+ "library file \"%s\": %s.\n"
+ "Are you sure this is a DSSI plugin file?\n",
+ fi.filePath().toAscii().data(),
+ txt);
+ exit(1);
+ }
+ }
+ const DSSI_Descriptor* descr;
+ for (int i = 0;; ++i) {
+ descr = dssi(i);
+ if (descr == 0)
+ break;
+ QString label(descr->LADSPA_Plugin->Label);
+ DssiSynth* s = new DssiSynth(&fi, label);
+ synthis.push_back(s);
+ }
+ dlclose(handle);
+ }
+
+//---------------------------------------------------------
+// scanVstDir
+//---------------------------------------------------------
+
+static void scanDSSIDir(const QString& s)
+ {
+ if (debugMsg)
+ printf("scan dssi plugin dir <%s>\n", s.toLatin1().data());
+
+ QDir pluginDir(s, QString("*.so"), QDir::Unsorted, QDir::Files);
+ if (!pluginDir.exists())
+ return;
+
+ const QFileInfoList list = pluginDir.entryInfoList();
+ for (int i = 0; i < list.size(); ++i) {
+ QFileInfo fi = list.at(i);
+ scanDSSILib(fi);
+ }
+ }
+
+//---------------------------------------------------------
+// initDSSI
+//---------------------------------------------------------
+
+void initDSSI()
+ {
+ char* dssiPath = getenv("DSSI_PATH");
+ if (dssiPath == 0)
+ dssiPath = "/usr/lib/dssi:/usr/local/lib/dssi";
+
+ char* p = dssiPath;
+ while (*p != '\0') {
+ char* pe = p;
+ while (*pe != ':' && *pe != '\0')
+ pe++;
+
+ int n = pe - p;
+ if (n) {
+ char* buffer = new char[n + 1];
+ strncpy(buffer, p, n);
+ buffer[n] = '\0';
+ scanDSSIDir(QString(buffer));
+ delete[] buffer;
+ }
+ p = pe;
+ if (*p == ':')
+ p++;
+ }
+ // Create OSC thread
+
+ serverThread = lo_server_thread_new(0, oscError);
+ snprintf(osc_path_tmp, 31, "/dssi");
+ char* tmp = lo_server_thread_get_url(serverThread);
+ url = (char *)malloc(strlen(tmp) + strlen(osc_path_tmp));
+ sprintf(url, "%s%s", tmp, osc_path_tmp + 1);
+ free(tmp);
+
+ lo_server_thread_add_method(serverThread, 0, 0, oscMessageHandler, 0);
+ lo_server_thread_start(serverThread);
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool DssiSynthIF::guiVisible() const
+ {
+ return _guiVisible;
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void DssiSynthIF::showGui(bool v)
+ {
+ if (v == guiVisible())
+ return;
+ if (uiOscPath == 0) {
+ printf("no uiOscPath\n");
+ return;
+ }
+ char uiOscGuiPath[strlen(uiOscPath)+6];
+ sprintf(uiOscGuiPath, "%s/%s", uiOscPath, v ? "show" : "hide");
+ lo_send(uiTarget, uiOscGuiPath, "");
+ _guiVisible = v;
+ }
+
+//---------------------------------------------------------
+// receiveEvent
+//---------------------------------------------------------
+
+MidiEvent DssiSynthIF::receiveEvent()
+ {
+ return MidiEvent();
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool DssiSynthIF::init(DssiSynth* s)
+ {
+ synth = s;
+ const DSSI_Descriptor* dssi = synth->dssi;
+ const LADSPA_Descriptor* ld = dssi->LADSPA_Plugin;
+ handle = ld->instantiate(ld, AL::sampleRate);
+ if (ld->activate)
+ ld->activate(handle);
+
+ queryPrograms();
+ int controlPorts = synth->_controller;
+ controls = new LadspaPort[controlPorts];
+
+ for (int k = 0; k < controlPorts; ++k) {
+ int i = synth->pIdx[k];
+ controls[k].val = ladspaDefaultValue(ld, i);
+ ld->connect_port(handle, i, &controls[k].val);
+ }
+ if (dssi->configure) {
+ char *rv = dssi->configure(handle, DSSI_PROJECT_DIRECTORY_KEY,
+ museProject.toLatin1().data());
+ if (rv)
+ fprintf(stderr, "MusE: Warning: plugin doesn't like project directory: \"%s\"\n", rv);
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// ~DssiSynthIF
+//---------------------------------------------------------
+
+DssiSynthIF::~DssiSynthIF()
+ {
+ const DSSI_Descriptor* dssi = synth->dssi;
+ const LADSPA_Descriptor* descr = dssi->LADSPA_Plugin;
+
+ if (descr->cleanup)
+ descr->cleanup(handle);
+ if (guiPid != -1)
+ kill(guiPid, SIGHUP);
+ }
+
+//---------------------------------------------------------
+// setParameter
+//---------------------------------------------------------
+
+void DssiSynthIF::setParameter(int, float)
+ {
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void DssiSynthIF::write(Xml&) const
+ {
+ }
+
+//---------------------------------------------------------
+// getData
+//---------------------------------------------------------
+
+iMPEvent DssiSynthIF::getData(MPEventList* el, iMPEvent i, unsigned, int ch, unsigned samples, float** data)
+ {
+ const DSSI_Descriptor* dssi = synth->dssi;
+ const LADSPA_Descriptor* descr = dssi->LADSPA_Plugin;
+
+ unsigned long nevents = 0;
+ for (iMPEvent ii = i; ii != el->end(); ++ii, ++nevents)
+ ;
+ snd_seq_event_t events[nevents];
+ memset(events, 0, sizeof(events));
+
+ nevents = 0;
+ for (; i != el->end(); ++i, ++nevents) {
+ MidiEvent e = *i;
+ int chn = e.channel();
+ int a = e.dataA();
+ int b = e.dataB();
+
+ snd_seq_event_t* event = &events[nevents];
+ event->queue = SND_SEQ_QUEUE_DIRECT;
+
+ switch(e.type()) {
+ case ME_NOTEON:
+ if (b)
+ snd_seq_ev_set_noteon(event, chn, a, b);
+ else
+ snd_seq_ev_set_noteoff(event, chn, a, 0);
+ break;
+ case ME_NOTEOFF:
+ snd_seq_ev_set_noteoff(event, chn, a, 0);
+ break;
+ case ME_CONTROLLER:
+ if (a == CTRL_PROGRAM) {
+ int bank = b >> 8;
+ int prog = b & 0xff;
+ if (dssi->select_program)
+ dssi->select_program(handle, bank, prog);
+ break;
+ }
+//printf("ctrl %x %d = %d\n", a, a, b);
+// snd_seq_ev_set_controller(event, chn, a, b);
+ break;
+ case ME_PITCHBEND:
+ snd_seq_ev_set_pitchbend(event, chn, a);
+ break;
+ case ME_AFTERTOUCH:
+ snd_seq_ev_set_chanpress(event, chn, a);
+ break;
+ default:
+ --nevents;
+ break;
+ }
+ }
+
+ for (int k = 0; k < ch; ++k)
+ descr->connect_port(handle, synth->oIdx[k], data[k]);
+
+ if (synth->dssi->run_synth)
+ synth->dssi->run_synth(handle, samples, events, nevents);
+ else if (synth->dssi->run_multiple_synths) {
+ snd_seq_event_t* ev = events;
+ synth->dssi->run_multiple_synths(1, &handle, samples, &ev, &nevents);
+ }
+ return i;
+ }
+
+//---------------------------------------------------------
+// putEvent
+//---------------------------------------------------------
+
+bool DssiSynthIF::putEvent(const MidiEvent& ev)
+ {
+ if (midiOutputTrace)
+ ev.dump();
+ return false;
+ }
+
+//---------------------------------------------------------
+// incInstances
+//---------------------------------------------------------
+
+void DssiSynth::incInstances(int val)
+ {
+ _instances += val;
+ if (_instances == 0) {
+ if (handle)
+ dlclose(handle);
+ dssi = 0;
+ df = 0;
+ }
+ }
+
+//---------------------------------------------------------
+// createSIF
+//---------------------------------------------------------
+
+SynthIF* DssiSynth::createSIF(SynthI* synti)
+ {
+ if (_instances == 0) {
+ handle = dlopen(info.filePath().toAscii().data(), RTLD_NOW);
+ if (handle == 0) {
+ fprintf(stderr, "dlopen(%s) failed: %s\n",
+ info.filePath().toAscii().data(), dlerror());
+ return 0;
+ }
+ df = (DSSI_Descriptor_Function)dlsym(handle, "dssi_descriptor");
+
+ if (!df) {
+ const char *txt = dlerror();
+ fprintf(stderr,
+ "Unable to find dssi_descriptor() function in plugin "
+ "library file \"%s\": %s.\n"
+ "Are you sure this is a DSSI plugin file?\n",
+ info.filePath().toAscii().data(),
+ txt ? txt : "?");
+ dlclose(handle);
+ handle = 0;
+ return 0;
+ }
+ for (int i = 0;; ++i) {
+ dssi = df(i);
+ if (dssi == 0)
+ break;
+ QString label(dssi->LADSPA_Plugin->Label);
+ if (label == _name)
+ break;
+ }
+
+ _inports = 0;
+ _outports = 0;
+ _controller = 0;
+ const LADSPA_Descriptor* d = dssi->LADSPA_Plugin;
+ for (unsigned k = 0; k < d->PortCount; ++k) {
+ LADSPA_PortDescriptor pd = d->PortDescriptors[k];
+ static const int CI = LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT;
+ if ((pd & CI) == CI) {
+ ++_controller;
+ pIdx.push_back(k);
+ }
+ else if (pd & LADSPA_PORT_INPUT) {
+ ++_inports;
+ iIdx.push_back(k);
+ }
+ else if (pd & LADSPA_PORT_OUTPUT) {
+ ++_outports;
+ oIdx.push_back(k);
+ }
+ }
+ }
+ if (dssi == 0) {
+ fprintf(stderr, "cannot found DSSI synti %s\n", _name.toLatin1().data());
+ dlclose(handle);
+ handle = 0;
+ df = 0;
+ return 0;
+ }
+ DssiSynthIF* sif = new DssiSynthIF(synti);
+ ++_instances;
+ sif->init(this);
+
+ //
+ // start gui
+ //
+ static char oscUrl[1024];
+ snprintf(oscUrl, 1024, "%s/%s", url, synti->name().toLatin1().data());
+
+ QString guiPath(info.path() + "/" + info.baseName());
+ QDir guiDir(guiPath, "*", QDir::Unsorted, QDir::Files);
+ if (guiDir.exists()) {
+ const QFileInfoList list = guiDir.entryInfoList();
+ for (int i = 0; i < list.size(); ++i) {
+ QFileInfo fi = list.at(i);
+ QString gui(fi.filePath());
+ if (gui.contains('_') == 0)
+ continue;
+ struct stat buf;
+ if (stat(gui.toLatin1().data(), &buf)) {
+ perror("stat failed");
+ continue;
+ }
+
+ if ((S_ISREG(buf.st_mode) || S_ISLNK(buf.st_mode)) &&
+ (buf.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) {
+ if ((sif->guiPid = fork()) == 0) {
+ execlp(
+ fi.filePath().toLatin1().data(),
+ fi.fileName().toLatin1().data(),
+ oscUrl,
+ info.filePath().toLatin1().data(),
+ name().toLatin1().data(),
+ "channel 1", (void*)0);
+ fprintf(stderr, "exec %s %s %s %s failed: %s\n",
+ fi.filePath().toLatin1().data(),
+ fi.fileName().toLatin1().data(),
+ oscUrl,
+ name().toLatin1().data(),
+ strerror(errno));
+ exit(1);
+ }
+ }
+ }
+ _hasGui = true;
+ }
+ else {
+ printf("%s: no dir for dssi gui found: %s\n",
+ name().toLatin1().data(), guiPath.toLatin1().data());
+ _hasGui = false;
+ }
+ return sif;
+ }
+
+//---------------------------------------------------------
+// oscProgram
+//---------------------------------------------------------
+
+int DssiSynthIF::oscProgram(lo_arg** argv)
+ {
+ int bank = argv[0]->i;
+ int program = argv[1]->i;
+ CVal cval;
+ cval.i = (bank << 8) + program;
+
+printf("received oscProgram\n");
+#if 0 //TD
+ MidiTrackList* tl = song->midis();
+ for (iMidiTrack i = tl->begin(); i != tl->end(); ++i) {
+ MidiTrack* t = *i;
+ MidiPort* port = &midiPorts[t->outPort()];
+ MidiDevice* dev = port->device();
+ if (dev == synti) {
+ song->setControllerVal(t, CTRL_PROGRAM, cval);
+ break;
+ }
+ }
+#endif
+ return 0;
+ }
+
+//---------------------------------------------------------
+// oscControl
+//---------------------------------------------------------
+
+int DssiSynthIF::oscControl(lo_arg**)
+ {
+printf("received oscControl\n");
+#if 0
+ int port = argv[0]->i;
+ LADSPA_Data value = argv[1]->f;
+
+ if (port < 0 || port > instance->plugin->descriptor->LADSPA_Plugin->PortCount) {
+ fprintf(stderr, "MusE: OSC: %s port number (%d) is out of range\n",
+ instance->friendly_name, port);
+ return 0;
+ }
+ if (instance->pluginPortControlInNumbers[port] == -1) {
+ fprintf(stderr, "MusE: OSC: %s port %d is not a control in\n",
+ instance->friendly_name, port);
+ return 0;
+ }
+ pluginControlIns[instance->pluginPortControlInNumbers[port]] = value;
+ if (verbose) {
+ printf("MusE: OSC: %s port %d = %f\n",
+ instance->friendly_name, port, value);
+ }
+#endif
+ return 0;
+ }
+
+//---------------------------------------------------------
+// oscExiting
+//---------------------------------------------------------
+
+int DssiSynthIF::oscExiting(lo_arg**)
+ {
+ printf("not impl.: oscExiting\n");
+#if 0
+ int i;
+
+ if (verbose) {
+ printf("MusE: OSC: got exiting notification for instance %d\n",
+ instance->number);
+ }
+
+ if (instance->plugin) {
+
+ /*!!! No, this isn't safe -- plugins deactivated in this way
+ would still be included in a run_multiple_synths call unless
+ we re-jigged the instance array at the same time -- leave it
+ for now
+ if (instance->plugin->descriptor->LADSPA_Plugin->deactivate) {
+ instance->plugin->descriptor->LADSPA_Plugin->deactivate
+ (instanceHandles[instance->number]);
+ }
+ */
+ /* Leave this flag though, as we need it to determine when to exit */
+ instance->inactive = 1;
+ }
+
+ /* Do we have any plugins left running? */
+
+ for (i = 0; i < instance_count; ++i) {
+ if (!instances[i].inactive)
+ return 0;
+ }
+
+ if (verbose) {
+ printf("MusE: That was the last remaining plugin, exiting...\n");
+ }
+ exiting = 1;
+#endif
+ return 0;
+ }
+
+//---------------------------------------------------------
+// oscMidi
+//---------------------------------------------------------
+
+int DssiSynthIF::oscMidi(lo_arg** /*argv*/)
+ {
+printf("received oscMidi\n");
+ MidiTrackList* tl = song->midis();
+ for (iMidiTrack i = tl->begin(); i != tl->end(); ++i) {
+#if 0 //TD
+ MidiTrack* t = *i;
+ MidiChannel* mc = t->channel();
+ MidiPort* port = &midiPorts[t->outPort()];
+ MidiDevice* dev = port->device();
+ if (dev == synti) {
+ int a = argv[0]->m[1];
+ int b = argv[0]->m[2];
+ int c = argv[0]->m[3];
+ if (a == ME_NOTEOFF) {
+ a = ME_NOTEON;
+ c = 0;
+ }
+ MidiEvent event(0, t->outPort(), t->outChannel(), a, b, c);
+ // dev->recordEvent(event);
+ audio->msgPlayMidiEvent(&event);
+ break;
+ }
+#endif
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// oscConfigure
+//---------------------------------------------------------
+
+int DssiSynthIF::oscConfigure(lo_arg** argv)
+ {
+ if (!synth->dssi->configure)
+ return 0;
+
+ const char *key = (const char *)&argv[0]->s;
+ const char *value = (const char *)&argv[1]->s;
+
+ /* This is pretty much the simplest legal implementation of
+ * configure in a DSSI host. */
+
+ /* The host has the option to remember the set of (key,value)
+ * pairs associated with a particular instance, so that if it
+ * wants to restore the "same" instance on another occasion it can
+ * just call configure() on it for each of those pairs and so
+ * restore state without any input from a GUI. Any real-world GUI
+ * host will probably want to do that. This host doesn't have any
+ * concept of restoring an instance from one run to the next, so
+ * we don't bother remembering these at all. */
+
+ if (!strncmp(key, DSSI_RESERVED_CONFIGURE_PREFIX,
+ strlen(DSSI_RESERVED_CONFIGURE_PREFIX))) {
+ fprintf(stderr, "MusE: OSC: UI for plugin '%s' attempted to use reserved configure key \"%s\", ignoring\n",
+ synti->name().toLatin1().data(), key);
+ return 0;
+ }
+
+ char* message = synth->dssi->configure(handle, key, value);
+ if (message) {
+ printf("MusE: on configure '%s' '%s', plugin '%s' returned error '%s'\n",
+ key, value, synti->name().toLatin1().data(), message);
+ free(message);
+ }
+
+ // also call back on UIs for plugins other than the one
+ // that requested this:
+ // if (n != instance->number && instances[n].uiTarget) {
+ // lo_send(instances[n].uiTarget,
+ // instances[n].ui_osc_configure_path, "ss", key, value);
+ // }
+
+ /* configure invalidates bank and program information, so
+ we should do this again now: */
+ queryPrograms();
+ return 0;
+ }
+
+//---------------------------------------------------------
+// queryPrograms
+//---------------------------------------------------------
+
+void DssiSynthIF::queryPrograms()
+ {
+ for (std::vector<DSSI_Program_Descriptor>::const_iterator i = programs.begin();
+ i != programs.end(); ++i) {
+ free((void*)(i->Name));
+ }
+ programs.clear();
+
+ if (!(synth->dssi->get_program && synth->dssi->select_program))
+ return;
+
+ for (int i = 0;; ++i) {
+ const DSSI_Program_Descriptor* pd = synth->dssi->get_program(handle, i);
+ if (pd == 0)
+ break;
+ DSSI_Program_Descriptor d;
+ d.Name = strdup(pd->Name);
+ d.Program = pd->Program;
+ d.Bank = pd->Bank;
+ programs.push_back(d);
+ }
+ }
+
+//---------------------------------------------------------
+// getPatchName
+//---------------------------------------------------------
+
+QString DssiSynthIF::getPatchName(int, int prog)
+ {
+ unsigned program = prog & 0x7f;
+ int lbank = (prog >> 8) & 0xff;
+ int hbank = (prog >> 16) & 0xff;
+
+ if (lbank == 0xff)
+ lbank = 0;
+ if (hbank == 0xff)
+ hbank = 0;
+ unsigned bank = (hbank << 8) + lbank;
+
+ for (std::vector<DSSI_Program_Descriptor>::const_iterator i = programs.begin();
+ i != programs.end(); ++i) {
+ if (i->Bank == bank && i->Program ==program)
+ return i->Name;
+ }
+ return "?";
+ }
+
+//---------------------------------------------------------
+// populatePatchPopup
+//---------------------------------------------------------
+
+void DssiSynthIF::populatePatchPopup(QMenu* menu, int)
+ {
+ menu->clear();
+
+ for (std::vector<DSSI_Program_Descriptor>::const_iterator i = programs.begin();
+ i != programs.end(); ++i) {
+ int bank = i->Bank;
+ int prog = i->Program;
+ int id = (bank << 16) + prog;
+ QAction* a = menu->addAction(QString(i->Name));
+ a->setData(id);
+ }
+ }
+
+#else
+void initDSSI() {}
+#endif
+
diff --git a/muse/muse/dssihost.h b/muse/muse/dssihost.h
new file mode 100644
index 00000000..fecc833a
--- /dev/null
+++ b/muse/muse/dssihost.h
@@ -0,0 +1,129 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __DSSIHOST_H__
+#define __DSSIHOST_H__
+
+#include <lo/lo.h>
+#include "synth.h"
+#include "plugin.h"
+
+struct _DSSI;
+class DssiPluginIF;
+
+//---------------------------------------------------------
+// DssiSynth
+//---------------------------------------------------------
+
+class DssiSynth : public Synth {
+ protected:
+ char* label;
+ void* handle;
+ const DSSI_Descriptor* dssi;
+ DSSI_Descriptor_Function df;
+ std::vector<int> pIdx;
+ std::vector<int> iIdx;
+ std::vector<int> oIdx;
+ int _inports, _outports, _controller;
+ bool _hasGui;
+
+ public:
+ DssiSynth(const QFileInfo* fi, QString l) : Synth(fi, l) {
+ df = 0;
+ handle = 0;
+ dssi = 0;
+ _hasGui = false;
+ }
+ virtual ~DssiSynth() {
+ delete label;
+ }
+ virtual void incInstances(int val);
+ virtual SynthIF* createSIF(SynthI*);
+ friend class DssiSynthIF;
+ float defaultValue(int);
+ };
+
+//---------------------------------------------------------
+// DssiSynthIF
+// VSTi synthesizer instance
+//---------------------------------------------------------
+
+class DssiSynthIF : public SynthIF
+ {
+ bool _guiVisible;
+ DssiSynth* synth;
+ LADSPA_Handle handle;
+ LadspaPort* controls;
+ void* uiTarget;
+ char* uiOscShowPath;
+ char* uiOscControlPath;
+ char* uiOscConfigurePath;
+ char* uiOscProgramPath;
+ char* uiOscPath;
+
+ std::vector<DSSI_Program_Descriptor> programs;
+ void queryPrograms();
+
+ protected:
+ int guiPid;
+
+ public:
+ DssiSynthIF(SynthI* s) : SynthIF(s) {
+ _guiVisible = false;
+ uiTarget = 0;
+ uiOscShowPath = 0;
+ uiOscControlPath = 0;
+ uiOscConfigurePath = 0;
+ uiOscProgramPath = 0;
+ uiOscPath = 0;
+ guiPid = -1;
+ }
+ virtual ~DssiSynthIF();
+
+ virtual bool guiVisible() const;
+ virtual void showGui(bool v);
+ virtual bool hasGui() const { return synth->_hasGui; }
+ virtual void getGeometry(int*, int*, int*, int*) const {}
+ virtual void setGeometry(int, int, int, int) {}
+ virtual iMPEvent getData(MPEventList*, iMPEvent, unsigned pos, int ports, unsigned n, float** buffer) ;
+ virtual bool putEvent(const MidiEvent& ev);
+ virtual MidiEvent receiveEvent();
+ virtual int eventsPending() const { return 0; }
+ virtual int channels() const { return synth->_outports; }
+ virtual void deactivate3() {}
+ virtual QString getPatchName(int, int);
+ virtual void populatePatchPopup(QMenu*, int);
+ virtual void write(Xml& xml) const;
+ virtual void setParameter(int idx, float value);
+ virtual int getControllerInfo(int, const char**, int*, int*, int*) { return 0; }
+ bool init(DssiSynth* s);
+
+ int oscUpdate(lo_arg**);
+ int oscProgram(lo_arg**);
+ int oscControl(lo_arg**);
+ int oscExiting(lo_arg**);
+ int oscMidi(lo_arg**);
+ int oscConfigure(lo_arg**);
+
+ friend class DssiSynth;
+ };
+
+#endif
+
diff --git a/muse/muse/editor.cpp b/muse/muse/editor.cpp
new file mode 100644
index 00000000..a37e1baa
--- /dev/null
+++ b/muse/muse/editor.cpp
@@ -0,0 +1,38 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "editor.h"
+
+//---------------------------------------------------------
+// Editor
+//---------------------------------------------------------
+
+Editor::Editor()
+ {
+ tcanvas = 0;
+ }
+
+//---------------------------------------------------------
+// MidiEditor
+//---------------------------------------------------------
+
+Editor::~Editor()
+ {
+ }
diff --git a/muse/muse/editor.h b/muse/muse/editor.h
new file mode 100644
index 00000000..7de2d9e4
--- /dev/null
+++ b/muse/muse/editor.h
@@ -0,0 +1,44 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __EDITOR_H__
+#define __EDITOR_H__
+
+#include "cobject.h"
+
+class TimeCanvas;
+
+//---------------------------------------------------------
+// Editor
+//---------------------------------------------------------
+
+class Editor : public TopWin {
+ Q_OBJECT
+
+ protected:
+ TimeCanvas* tcanvas;
+
+ public:
+ Editor();
+ virtual ~Editor();
+ };
+
+#endif
+
diff --git a/muse/muse/esettings.cpp b/muse/muse/esettings.cpp
new file mode 100644
index 00000000..9372d0c6
--- /dev/null
+++ b/muse/muse/esettings.cpp
@@ -0,0 +1,773 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2004 Mathias Lundgren <lunar_shuttle@users.sourceforge.net>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "esettings.h"
+#include "al/xml.h"
+#include "midieditor.h" //only for debug prints
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void CtrlEditSettings::readStatus(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "controller")
+ controller = i;
+ else if (tag == "height")
+ height = i;
+ else
+ printf("MusE:CtrlEditSettings: unknown tag: %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void CtrlEditSettings::writeStatus(Xml& xml)
+ {
+ xml.tag("ctrleditsettings");
+ xml.intTag("height", height);
+ xml.intTag("controller", controller);
+ xml.etag("ctrleditsettings");
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void EditorSettings::readStatus(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "width")
+ _width = i;
+ else if (tag == "height")
+ _height = i;
+ else if (tag == "x")
+ _x = i;
+ else if (tag == "y")
+ _y = i;
+ else if (tag == "raster")
+ _raster = i;
+ else
+ printf("MusE:EditorSettings: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void EditorSettings::writeStatus(Xml& xml) const
+ {
+ xml.tag("editorsettings");
+ xml.intTag("width", _width);
+ xml.intTag("height", _height);
+ xml.intTag("x", _x);
+ xml.intTag("y", _y);
+ xml.intTag("raster", _raster);
+ xml.etag("editorsettings");
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void GraphEditorSettings::readStatus(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "editorsettings") {
+ EditorSettings::readStatus(node.firstChild());
+ }
+ else if (tag == "xmag")
+ _xmag = s.toDouble();
+ else if (tag == "ymag")
+ _ymag = s.toDouble();
+ else if (tag == "xpos")
+ _pos.setX(i);
+ else if (tag == "ypos")
+ _pos.setY(i);
+ else
+ printf("MusE:GraphEditorSettings: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void GraphEditorSettings::writeStatus(Xml& xml) const
+ {
+ xml.tag("grapheditorsettings");
+ EditorSettings::writeStatus(xml);
+ xml.doubleTag("xmag", _xmag);
+ xml.doubleTag("ymag", _ymag);
+ xml.intTag("xpos", _pos.x());
+ xml.intTag("ypos", _pos.y());
+ xml.etag("grapheditorsettings");
+ }
+
+bool ExtEditorSettings::_steprec = false;
+bool ExtEditorSettings::_midiin = false;
+
+
+//---------------------------------------------------------
+// ExtEditorSettings constructor
+//---------------------------------------------------------
+
+ExtEditorSettings::ExtEditorSettings(int r, int w, int h, int x, int y, double xm, double ym, QPoint pos, int q, int apply)
+ : GraphEditorSettings(r, w, h, x, y, xm, ym, pos), _quant(q), _applyTo(apply)
+ {
+ for (int i=0; i<MAXNOOFCTRLEDITSETTINGS; i++)
+ ctrlEdits[i] = 0;
+ _numOfCtrlEdits = 0;
+ }
+
+//---------------------------------------------------------
+// ExtEditorSettings destructor
+//---------------------------------------------------------
+ExtEditorSettings::~ExtEditorSettings()
+ {
+ for (int i=0; i<MAXNOOFCTRLEDITSETTINGS; i++) {
+ if (this->ctrlEdits[i])
+ delete ctrlEdits[i];
+ }
+ }
+
+//---------------------------------------------------------
+// setControlEditSettings
+//---------------------------------------------------------
+
+void ExtEditorSettings::setControlEditSettings(int pos, CtrlEditSettings* c)
+ {
+ if (ctrlEdits[pos])
+ delete ctrlEdits[pos];
+
+ ctrlEdits[pos] = c;
+ }
+//---------------------------------------------------------
+// clone
+//---------------------------------------------------------
+
+EditorSettings* ExtEditorSettings::clone()
+ {
+ ExtEditorSettings* newSettings = new ExtEditorSettings(_raster, _width, _height, _x, _y, _xmag, _ymag, _pos, _quant, _applyTo);
+ CtrlEditSettings* c;
+ for (int i=0; i<_numOfCtrlEdits; i++) {
+ c = new CtrlEditSettings();
+ *c = *(ctrlEdits[i]); //copy
+ newSettings->setControlEditSettings(i, c);
+ }
+ newSettings->setControlEditSize(_numOfCtrlEdits);
+ return (EditorSettings*) newSettings;
+ }
+
+//---------------------------------------------------------
+// readStatic
+//---------------------------------------------------------
+
+void ExtEditorSettings::readStatic(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "steprec")
+ _steprec = i;
+ else if (tag == "midiin")
+ _midiin = i;
+ else
+ printf("MusE:ExtEditorSettings Static: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// writeStatic
+//---------------------------------------------------------
+
+void ExtEditorSettings::writeStatic(Xml& xml)
+ {
+ xml.tag("exteditorstatic");
+ xml.intTag("steprec", _steprec);
+ xml.intTag("midiin", _midiin);
+ xml.etag("exteditorstatic");
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void ExtEditorSettings::readStatus(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "grapheditorsettings")
+ GraphEditorSettings::readStatus(node.firstChild());
+ else if (tag == "quant")
+ _quant = i;
+ else if (tag == "applyTo")
+ _applyTo = i;
+ else if (tag == "steprec")
+ _steprec = i;
+ else if (tag == "midiin")
+ _midiin = i;
+ else if (tag == "ctrleditsettings") {
+ ctrlEdits[_numOfCtrlEdits] = new CtrlEditSettings();
+ ctrlEdits[_numOfCtrlEdits]->readStatus(node.firstChild());
+ _numOfCtrlEdits++;
+ }
+ else
+ printf("MusE:ExtEditorSettings: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void ExtEditorSettings::writeStatus(Xml& xml) const
+ {
+ //TODO: The ctrlEdits need to be updated (created) before trying to write status of ctrlEdits...
+ xml.tag("exteditorsettings");
+ GraphEditorSettings::writeStatus(xml);
+ xml.intTag("quant", _quant);
+ xml.intTag("applyTo", _applyTo);
+ xml.intTag("steprec", _steprec);
+ xml.intTag("midiin", _midiin);
+ for (int i=0; i<_numOfCtrlEdits; i++) {
+ ctrlEdits[i]->writeStatus(xml);
+ }
+ xml.etag("exteditorsettings");
+ }
+
+//
+// DrumEditorSettings static init default values:
+//
+int DrumEditorSettings::_quantInit = 96;
+int DrumEditorSettings::_rasterInit = 96;
+int DrumEditorSettings::_widthInit = 600;
+int DrumEditorSettings::_heightInit = 400;
+
+//---------------------------------------------------------
+// DrumEditorSettings
+//---------------------------------------------------------
+
+DrumEditorSettings::DrumEditorSettings(int r, int w, int h, int x, int y,
+ double xm, double ym, QPoint pos, int q, int apply, int dl, int dw)
+ : ExtEditorSettings(r, w, h, x, y, xm, ym, pos, q, apply),
+ _dlistWidth(dl), _dcanvasWidth(dw)
+ {
+ // For uninitialized values, go with static default values instead
+ if (w == ES_UNINIT)
+ _width = _widthInit;
+ if (h == ES_UNINIT)
+ _height = _heightInit;
+ if (r == ES_UNINIT)
+ _raster = _rasterInit;
+ if (q == ES_UNINIT)
+ _quant = _quantInit;
+ }
+
+//---------------------------------------------------------
+// clone
+//---------------------------------------------------------
+
+EditorSettings* DrumEditorSettings::clone()
+ {
+ DrumEditorSettings* newSettings = new DrumEditorSettings(_raster, _width, _height, _x, _y, _xmag, _ymag, _pos, _quant, _applyTo, _dlistWidth, _dcanvasWidth);
+ for (int i=0; i<_numOfCtrlEdits; i++) {
+ CtrlEditSettings* c = new CtrlEditSettings();
+ *c = *(ctrlEdits[i]); //copy
+ newSettings->setControlEditSettings(i, c);
+ }
+ newSettings->setControlEditSize(_numOfCtrlEdits);
+ return (EditorSettings*) newSettings;
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void DrumEditorSettings::readStatus(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "exteditorsettings")
+ ExtEditorSettings::readStatus(node.firstChild());
+ else if (tag == "dlistwidth")
+ _dlistWidth = i;
+ else if (tag == "dcanvaswidth")
+ _dcanvasWidth = i;
+ else
+ printf("MusE:DrumEditorSettings: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void DrumEditorSettings::writeStatus(Xml& xml) const
+ {
+ xml.tag("drumeditorsettings");
+ ExtEditorSettings::writeStatus(xml);
+ xml.intTag("dlistwidth", _dlistWidth);
+ xml.intTag("dcanvaswidth", _dcanvasWidth);
+ xml.etag("drumeditorsettings");
+ }
+
+//---------------------------------------------------------
+// setStaticInitValues
+//---------------------------------------------------------
+void DrumEditorSettings::setStaticInitValues(int widthinit, int heightinit, int rasterinit, int quantinit)
+ {
+ _widthInit = widthinit;
+ _heightInit = heightinit;
+ _rasterInit = rasterinit;
+ _quantInit = quantinit;
+ }
+
+//---------------------------------------------------------
+// writeStatic
+//! write static configuration values for pianoroll
+//---------------------------------------------------------
+
+void DrumEditorSettings::writeStatic(Xml& xml)
+ {
+ xml.tag("drumeditorstatic");
+ xml.intTag("quantDefault", _quantInit);
+ xml.intTag("rasterDefault", _rasterInit);
+ xml.intTag("widthDefault", _widthInit);
+ xml.intTag("heightDefault", _heightInit);
+ xml.etag("drumeditorstatic");
+ }
+
+//---------------------------------------------------------
+// readStatic
+//---------------------------------------------------------
+
+void DrumEditorSettings::readStatic(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "quantDefault")
+ _quantInit = i;
+ else if (tag == "rasterDefault")
+ _rasterInit = i;
+ else if (tag == "widthDefault")
+ _widthInit = i;
+ else if (tag == "heightDefault")
+ _heightInit = i;
+ else
+ printf("MusE:DrumEditorSettings Static: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void DrumEditorSettings::dump()
+ {
+// printf("%x: DrumEditorSettings: q=%d r=%d w=%d h=%d dlw=%d dcw=%d xmag: %d pos: %d ypos: %d\n", this, _quant, _raster, _width, _height, _dlistWidth, _dcanvasWidth, _xmag, _pos, _ypos);
+ }
+
+//
+// PianorollSettings static init default values:
+//
+int PianorollSettings::_quantInit = 96;
+int PianorollSettings::_rasterInit = 96;
+int PianorollSettings::_widthInit = 600;
+int PianorollSettings::_heightInit = 400;
+
+PianorollSettings::PianorollSettings(int r, int w, int h, int x, int y,
+ double xm, double ym, QPoint pos, int q, int apply,
+ int qs, int qlim, int cmode, bool qlen, int pw)
+ : ExtEditorSettings(r, w, h, x, y, xm, ym, pos, q, apply),
+ _quantStrength(qs), _quantLimit(qlim), _colorMode(cmode),
+ _quantLen(qlen), _pianoWidth(pw)
+ {
+ // For uninitialized values, go with static default values instead
+ if (w == ES_UNINIT)
+ _width = _widthInit;
+ if (h == ES_UNINIT)
+ _height = _heightInit;
+ if (r == ES_UNINIT)
+ _raster = _rasterInit;
+ if (q == ES_UNINIT)
+ _quant = _quantInit;
+ }
+
+//---------------------------------------------------------
+// clone
+//---------------------------------------------------------
+
+EditorSettings* PianorollSettings::clone()
+ {
+ PianorollSettings* newSettings = new PianorollSettings(_raster, _width,
+ _height, _x, _y, _xmag, _ymag, _pos, _quant, _applyTo, _quantStrength, _quantLimit, _colorMode, _quantLen, _pianoWidth);
+ CtrlEditSettings* c;
+ for (int i=0; i<_numOfCtrlEdits; i++) {
+ c = new CtrlEditSettings();
+ *c = *(ctrlEdits[i]); //copy
+ newSettings->setControlEditSettings(i, c);
+ }
+ newSettings->setControlEditSize(_numOfCtrlEdits);
+ return (EditorSettings*) newSettings;
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void PianorollSettings::readStatus(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "exteditorsettings")
+ ExtEditorSettings::readStatus(node.firstChild());
+ else if (tag == "quantstrength")
+ _quantStrength = i;
+ else if (tag == "quantlimit")
+ _quantLimit = i;
+ else if (tag == "colormode")
+ _colorMode = i;
+ else if (tag == "quantLen")
+ _quantLen = i;
+ else if (tag == "pianowidth")
+ _pianoWidth = i;
+ else
+ printf("MusE:PianorollSettings: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void PianorollSettings::writeStatus(Xml& xml) const
+ {
+ xml.tag("prollsettings");
+ ExtEditorSettings::writeStatus(xml);
+ xml.intTag("quantstrength", _quantStrength);
+ xml.intTag("quantlimit", _quantLimit);
+ xml.intTag("colormode", _colorMode);
+ xml.intTag("quantLen", _quantLen);
+ xml.intTag("pianowidth", _pianoWidth);
+ xml.etag("prollsettings");
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void PianorollSettings::dump()
+ {
+// printf("%x: PianorollSettings: q=%d r=%d w=%d h=%d x:%d y:%d xmag: %d pos:%d ypos:%d qs:%d ql:%d cm:%d at:%d ql:%d pw:%d\n", this, _quant, _raster, _width, _height, _x, _y, _xmag, _pos, _ypos, _quantStrength, _quantLimit, _colorMode, _applyTo, _quantLen, _pianoWidth);
+ }
+
+
+//---------------------------------------------------------
+// setStaticInitValues
+//! set static initialization values
+//---------------------------------------------------------
+void PianorollSettings::setStaticInitValues(int widthinit, int heightinit, int rasterinit, int quantinit)
+ {
+ _widthInit = widthinit;
+ _heightInit = heightinit;
+ _rasterInit = rasterinit;
+ _quantInit = quantinit;
+ }
+
+//---------------------------------------------------------
+// writeStatic
+//! write static configuration values for pianoroll
+//---------------------------------------------------------
+
+void PianorollSettings::writeStatic(Xml& xml)
+ {
+ xml.tag("pianorollstatic");
+ xml.intTag("quantDefault", _quantInit);
+ xml.intTag("rasterDefault", _rasterInit);
+ xml.intTag("widthDefault", _widthInit);
+ xml.intTag("heightDefault", _heightInit);
+ xml.etag("pianorollstatic");
+ }
+
+//---------------------------------------------------------
+// readStatic
+//---------------------------------------------------------
+
+void PianorollSettings::readStatic(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "quantDefault")
+ _quantInit = i;
+ else if (tag == "rasterDefault")
+ _rasterInit = i;
+ else if (tag == "widthDefault")
+ _widthInit = i;
+ else if (tag == "heightDefault")
+ _heightInit = i;
+ else
+ printf("MusE:PianorollSettings Static: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// SettingsList
+//---------------------------------------------------------
+
+SettingsList::SettingsList()
+ {
+ //_default = d;
+ //dump();
+ }
+
+//---------------------------------------------------------
+// ~SettingsList
+//---------------------------------------------------------
+
+SettingsList::~SettingsList()
+ {
+ for(iSettingsList i = begin(); i!=end(); i++)
+ delete(i->second);
+ }
+
+//---------------------------------------------------------
+// set
+//---------------------------------------------------------
+
+void SettingsList::set(unsigned id, EditorSettings* e)
+ {
+ iSettingsList i = find(id);
+ if (i == end()) {
+ //Create a new item
+ EditorSettings* newItem = e->clone();
+ if (DBG_ESETTINGS)
+ printf("SettingsList::set - storing item with id=%d, "
+ "object at %p, cloned object at: %p.\n", id, e, newItem);
+ insert(std::pair<unsigned, EditorSettings*>(id, newItem));
+ }
+ else {
+ EditorSettings* newItem = e->clone();
+ if (DBG_ESETTINGS)
+ printf("SettingsList::set - Cloning item with id=%d, object at %p to obj at %p\n", id, e, newItem);
+ printf("SettingsList::set - deleting settings at: %p\n", i->second);
+ delete(i->second); //Hmmm, hehhh... Perhaps better to use copy-constructor instead of deletion in different places, but then it's difficult to create object of correct subclass (in a neat way)... (ml)
+ i->second = newItem;
+ }
+ }
+
+//---------------------------------------------------------
+// get
+//---------------------------------------------------------
+
+EditorSettings* SettingsList::get(unsigned id)
+ {
+ iSettingsList i = find(id);
+
+ if (i == end()) {
+ if (DBG_ESETTINGS)
+ printf("SettingsList::get - no match for id=%d\n", id);
+ return 0;
+ }
+ else
+ return i->second;
+ }
+
+//---------------------------------------------------------
+// removeSettings
+// remove settings for parts that don't exist anymore
+//---------------------------------------------------------
+
+void SettingsList::removeSettings(unsigned id)
+ {
+ for(iSettingsList i = begin(); i!=end(); i++) {
+ int bc = i->first;
+ bc&= ~(0xf0000000);
+ if (unsigned(bc) == id) {
+ if (DBG_ESETTINGS)
+ printf("SettingsList::removeSettings, deleting obj at %p\n", i->second);
+ delete i->second;
+ erase(i);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void SettingsList::dump()
+ {
+#if 0
+ printf("-------SettingsList-DUMP------\n");
+ for(iSettingsList i = begin(); i!=end(); i++) {
+ //printf("i=%x ",i);
+ printf("PART NO: %x ", i->first);
+ printf("- i->second at %x\n", i->second);
+
+ i->second->dump();
+ }
+ printf("---END-SettingsList-DUMP------\n");
+#endif
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//! writes out the settings for all editors and parts
+//---------------------------------------------------------
+
+void SettingsList::writeStatus(Xml& xml) const
+ {
+ xml.tag("settingslist");
+ // Write static
+ ExtEditorSettings::writeStatic(xml);
+ PianorollSettings::writeStatic(xml);
+ DrumEditorSettings::writeStatic(xml);
+
+ //Write all nodes
+ for (ciSettingsList i = begin(); i != end(); i++) {
+ xml.tag("elem");
+ xml.intTag("id", i->first);
+ i->second->writeStatus(xml);
+ xml.etag("elem");
+ }
+ xml.etag("settingslist");
+ }
+
+//---------------------------------------------------------
+// readStatus
+//! reads the settings for all editors and parts
+//---------------------------------------------------------
+
+void SettingsList::readStatus(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ if (tag == "elem")
+ readElem(node.firstChild());
+ else if (tag == "exteditorstatic")
+ ExtEditorSettings::readStatic(node.firstChild());
+ else if (tag == "pianorollstatic")
+ PianorollSettings::readStatic(node.firstChild());
+ else if (tag == "drumeditorstatic")
+ DrumEditorSettings::readStatic(node.firstChild());
+ else
+ printf("MusE:SettingsList: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// readElem
+//---------------------------------------------------------
+
+void SettingsList::readElem(QDomNode node)
+ {
+ int id = 0;
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "grapheditorsettings") {
+ GraphEditorSettings* temp = new GraphEditorSettings();
+ temp->readStatus(node.firstChild());
+ insert(std::pair<unsigned, EditorSettings*>(id, temp));
+ }
+ else if (tag == "editorsettings") {
+ EditorSettings* temp = new EditorSettings();
+ temp->readStatus(node.firstChild());
+ insert(std::pair<unsigned, EditorSettings*>(id, temp));
+ }
+ else if (tag == "drumeditorsettings") {
+ DrumEditorSettings* temp = new DrumEditorSettings();
+ temp->readStatus(node.firstChild());
+ insert(std::pair<unsigned, EditorSettings*>(id, temp));
+ }
+ else if (tag == "prollsettings") {
+ PianorollSettings* temp = new PianorollSettings();
+ temp->readStatus(node.firstChild());
+ insert(std::pair<unsigned, EditorSettings*>(id, temp));
+ }
+ else if (tag == "id")
+ id = i;
+ else
+ printf("MusE:SettingsList element: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+
+//---------------------------------------------------------
+/*!
+ \fn SettingsList::reset()
+ \brief Remove all previous settings and clean up
+ */
+//---------------------------------------------------------
+void SettingsList::reset()
+ {
+ for (iSettingsList i = begin(); i != end(); i++) {
+ delete i->second;
+ }
+ clear();
+ }
diff --git a/muse/muse/esettings.h b/muse/muse/esettings.h
new file mode 100644
index 00000000..292c02c7
--- /dev/null
+++ b/muse/muse/esettings.h
@@ -0,0 +1,361 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Description:
+// Configuration settings for the midi-editors.
+//
+// Copyright (C) 2004 Mathias Lundgren <lunar_shuttle@users.sourceforge.net>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __ESETTINGS_H__
+#define __ESETTINGS_H__
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#define ET_LISTEDIT 0x1000000
+#define ET_MASTEREDIT 0x4000000
+#define ET_PIANO_ROLL 0x10000000
+#define ET_DRUMEDIT 0x20000000
+#define ET_WAVEEDIT 0x40000000
+
+#define MAXNOOFCTRLEDITSETTINGS 16
+
+#define ES_UNINIT -1 /* Uninitialized parameter */
+
+#define ESETTINGS_DEBUG 0
+
+#include "debug.h"
+#define DBG_ESETTINGS_ON 0
+#define DBG_ESETTINGS debugMsg && DBG_ESETTINGS_ON
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+class CtrlEdit;
+
+//-----------------------------------------------
+// CtrlEditSettings class
+// stores ctrleditsettings
+//-----------------------------------------------
+class CtrlEditSettings
+ {
+ private:
+ int height;
+ int controller;
+
+ public:
+ //const MidiController* controller;
+ CtrlEditSettings() {}
+ CtrlEditSettings(int h, int c) { height = h; controller = c; }
+ CtrlEditSettings(const CtrlEditSettings& c) { height = c.height; controller = c.controller; }
+ int getHeight() { return height; }
+ int getController() { return controller; }
+ void readStatus(QDomNode);
+ void writeStatus(Xml& xml);
+
+ bool operator==(const CtrlEditSettings& c) const { return (c.height == height && c.controller == controller); }
+ bool operator!=(const CtrlEditSettings& c) const { return !(c == *this); }
+ };
+
+//-----------------------------------------------
+// EditorSettings
+// base class for midieditorsettings
+//-----------------------------------------------
+class EditorSettings
+ {
+ protected:
+ int _raster;
+ int _width, _height, _x, _y;
+
+ public:
+ EditorSettings(int r=96, int w=600, int h=400, int x=-1, int y=-1) : _raster(r), _width(w), _height(h), _x(x), _y(y) { }
+ virtual ~EditorSettings() {}
+ int raster() const { return _raster; }
+ void setRaster(int r) { _raster = r; }
+ int* rasterPtr() { return &_raster; }
+ int width() const { return _width; }
+ int height() const { return _height; }
+ void setWidth(int w) { _width = w; }
+ void setHeight(int h) { _height = h; }
+ int x() const { return _x; }
+ void setX(int x) { _x = x; }
+ int y() const { return _y; }
+ void setY(int y) { _y = y; }
+
+ virtual void readStatus(QDomNode);
+ virtual void writeStatus(Xml&) const;
+ virtual bool operator==(const EditorSettings& e) const {
+ return ((e._raster == _raster) && (e._width == _width) && (e._height == _height)/* && (e._x == _x) && (e._y == _y)*/);
+ }
+ virtual bool operator!=(const EditorSettings& e) const { return !(e == *this); }
+ virtual EditorSettings* clone() { return new EditorSettings(_raster, _width, _height, _x, _y); }
+ virtual void dump() { printf("%p: EditorSettings: r:%d w:%d h:%d x:%d y:%d\n", this, _raster, _width, _height, _x, _y); }
+ };
+
+//---------------------------------------------------------
+// GraphEditorSettings
+//---------------------------------------------------------
+class GraphEditorSettings : public EditorSettings
+ {
+ protected:
+ //Values considering scroll + zoom
+ double _xmag, _ymag;
+ QPoint _pos;
+
+ public:
+ GraphEditorSettings(int r=96, int w=600, int h=400, int x=-1, int y=-1,
+ double xmag=0.05, double ymag=1.0, QPoint pos = QPoint(0, 0))
+ : EditorSettings(r, w, h, x, y), _xmag(xmag), _ymag(ymag), _pos(pos)
+ {
+ }
+ virtual ~GraphEditorSettings() {}
+
+ double xmag() const { return _xmag; }
+ double ymag() const { return _ymag; }
+ void setXmag(double x) { _xmag = x; }
+ void setYmag(double y) { _xmag = y; }
+ QPoint pos() const { return _pos; }
+ void setPos(const QPoint& p) { _pos = p; }
+ int ypos() const { return _pos.y(); }
+ void setYpos(int y) { _pos.setY(y); }
+
+ virtual bool operator==(const EditorSettings& e) const {
+ const GraphEditorSettings& f = (GraphEditorSettings&) e;
+ return ((f._raster == _raster) && (f._width == _width) && (f._height == _height)// && (f._x == _x) && (f._y == _y)
+ && (f._xmag == _xmag)
+ && (f._ymag == _ymag)
+ && (f._pos == _pos));
+ }
+ virtual bool operator!=(const EditorSettings& e) const { return !(e == *this); }
+ virtual EditorSettings* clone() { return new GraphEditorSettings(_raster, _width, _height, _x, _y, _xmag, _ymag, _pos); }
+ virtual void readStatus(QDomNode);
+ virtual void writeStatus(Xml&) const;
+ virtual void dump() {
+ printf("%p: GraphEditorSettings: r:%d w:%d h:%d x:%d y:%d mag:%f:%f pos:%d ypos:%d\n",
+ this, _raster, _width, _height, _x, _y, _xmag, _ymag, _pos.x(), _pos.y());
+ }
+ };
+
+//---------------------------------------------------------
+// ExtEditorSettings
+// Common settings for drumeditor and pianoroll
+//---------------------------------------------------------
+
+class ExtEditorSettings : public GraphEditorSettings
+ {
+ private:
+
+ protected:
+ int _quant;
+ int _applyTo;
+ static bool _steprec;
+ static bool _midiin;
+ int _numOfCtrlEdits;
+
+ public:
+ ExtEditorSettings(int r=96, int w=600, int h=400, int x=-1, int y=-1, double xm=0.05, double ym=1.0, QPoint pos = QPoint(0,0), int q=96, int apply=0);
+ virtual ~ExtEditorSettings();
+ //ExtEditorSettings(const ExtEditorSettings& e) : EditorSettings(e._raster) , _quant(e._quant) { }
+ static void readStatic(QDomNode);
+ static void writeStatic(Xml& xml);
+ CtrlEditSettings* ctrlEdits[MAXNOOFCTRLEDITSETTINGS];
+
+ virtual bool operator==(const EditorSettings& e) const { //örk...
+ const ExtEditorSettings& f = (ExtEditorSettings&) e;
+ bool ctrlEditsEqual = true;
+ for (int i=0; i<MAXNOOFCTRLEDITSETTINGS; i++) {
+ if (ctrlEdits[i] != f.ctrlEdits[i])
+ ctrlEditsEqual = false;
+ }
+ return ((f._raster == _raster) && (f._width == _width) && (f._height == _height)// && (f._x == _x) && (f._y == _y)
+ && (f._xmag == _xmag)
+ && (f._ymag == _ymag)
+ && (f._pos == _pos)
+ && (f._quant == _quant) && (f._applyTo == _applyTo)
+ && (ctrlEditsEqual));
+ };
+ virtual bool operator!=(const EditorSettings& e) const { const ExtEditorSettings& f = (ExtEditorSettings&) e; return !(f == *this); }
+
+ virtual EditorSettings* clone();
+ virtual void readStatus(QDomNode);
+ virtual void writeStatus(Xml&) const;
+ virtual void dump() {
+ printf("%p: ExtEditorSettings: r:%d q:%d w:%d h:%d x:%d y:%d mag=%f:%f xpos=%d ypos=%d applyTo=%d\n",
+ this, _raster, _quant, _width, _height, _x, _y, _xmag, _ymag, _pos.x(), _pos.y(), _applyTo);
+ }
+ void setControlEditSettings(int pos, CtrlEditSettings* c);
+ void setControlEditSize(int s) { _numOfCtrlEdits = s; }
+ int getControlEditSize() { return _numOfCtrlEdits; }
+ CtrlEditSettings* getControlEditSettings(int pos) { return ctrlEdits[pos]; }
+
+ int quant() const { return _quant; }
+ void setQuant(int q) { _quant = q; }
+
+ static bool steprec() { return _steprec; }
+ static void setSteprec(bool b) { _steprec = b; }
+ static bool midiin() { return _midiin; }
+ static void setMidiin(bool b) { _midiin = b; }
+ };
+
+
+//---------------------------------------------------------
+// DrumEditorSettings
+// Settings for drumeditor
+//---------------------------------------------------------
+class DrumEditorSettings : public ExtEditorSettings
+ {
+ int _dlistWidth, _dcanvasWidth;
+
+ // Default initialization values
+ static int _quantInit, _rasterInit;
+ static int _widthInit, _heightInit;
+
+ public:
+ DrumEditorSettings(int r=ES_UNINIT, int w=ES_UNINIT, int h=ES_UNINIT,
+ int x=-1, int y=-1,
+ double xm=0.05, double ym=1.0, QPoint pos=QPoint(0,0), int q=ES_UNINIT, int apply=0, int dl=50, int dw=300);
+ virtual ~DrumEditorSettings() {}
+
+ static void readStatic(QDomNode);
+ static void writeStatic(Xml& xml);
+ int dlistWidth() const { return _dlistWidth; }
+ int dcanvasWidth() const { return _dcanvasWidth; }
+ void setdlistWidth(int d) { _dlistWidth = d; }
+ void setdcanvasWidth(int d) { _dcanvasWidth = d; }
+
+ virtual bool operator==(const EditorSettings& e) const { //öööörk...
+ DrumEditorSettings& f = (DrumEditorSettings&) e;
+ bool ctrlEditsEqual = true;
+ for (int i=0; i<MAXNOOFCTRLEDITSETTINGS; i++) {
+ if (ctrlEdits[i] != f.ctrlEdits[i])
+ ctrlEditsEqual = false;
+ }
+ return ((f._raster == _raster) && (f._width == _width) && (f._height == _height)// && (f._x == _x) && (f._y == _y)
+ && (f._xmag == _xmag)
+ && (f._ymag == _ymag)
+ && (f._pos == _pos)
+ && (f._quant == _quant) && (f._applyTo == _applyTo)
+ && (ctrlEditsEqual)
+ && (f._dlistWidth == _dlistWidth) && (f._dcanvasWidth == _dcanvasWidth));
+ }
+ virtual bool operator!=(const EditorSettings& e) const { DrumEditorSettings& f = (DrumEditorSettings&) e; return !(f==*this); }
+ virtual EditorSettings* clone();
+ virtual void readStatus(QDomNode);
+ virtual void writeStatus(Xml&) const;
+ virtual void dump();
+
+ static void setStaticInitValues(int widthinit, int heightinit, int rasterinit, int quantinit);
+ };
+
+
+//---------------------------------------------------------
+// PianorollSettings
+// Settings for pianoroll
+//---------------------------------------------------------
+class PianorollSettings : public ExtEditorSettings
+ {
+ int _quantStrength, _quantLimit, _colorMode;
+ bool _quantLen;
+ int _pianoWidth;
+
+ // Default initialization values
+ static int _quantInit;
+ static int _rasterInit;
+ static int _widthInit;
+ static int _heightInit;
+
+ public:
+ PianorollSettings(int r=ES_UNINIT, int w=ES_UNINIT, int h=ES_UNINIT,
+ int x=-1, int y=-1, double xm=0.05, double ym = 1.0,
+ QPoint pos = QPoint(0, 245), int q=ES_UNINIT, int apply=0,
+ int qs=80, int qlim=50, int cmode=0, bool qlen=false, int pw=40);
+ virtual ~PianorollSettings() {}
+
+ static void readStatic(QDomNode);
+ static void writeStatic(Xml& xml);
+ int quantStrength() const { return _quantStrength; }
+ void setQuantStrength(int c) { _quantStrength = c; }
+ int quantLimit() const { return _quantLimit; }
+ void setQuantLimit(int q) { _quantLimit = q; }
+ int colorMode() const { return _colorMode; }
+ void setColorMode(int c) { _colorMode = c; }
+ int applyTo() const { return _applyTo; }
+ void setApplyTo(int a) { _applyTo = a; }
+ bool quantLen() const { return _quantLen; }
+ void setQuantLen(bool b) { _quantLen = b; }
+ int pianoWidth() const { return _pianoWidth; }
+ void setPianoWidth(int w) { _pianoWidth = w; }
+
+ virtual bool operator==(const EditorSettings& e) const { //öööörkk...
+ PianorollSettings& f = (PianorollSettings&) e;
+ bool ctrlEditsEqual = true;
+ for (int i=0; i<MAXNOOFCTRLEDITSETTINGS; i++) {
+ if (ctrlEdits[i] != f.ctrlEdits[i])
+ ctrlEditsEqual = false;
+ }
+ return ((f._raster == _raster) && (f._width == _width) && (f._height == _height)// && (f._x == _x) && (f._y == _y)
+ && (f._xmag == _xmag)
+ && (f._ymag == _ymag)
+ && (f._pos == _pos)
+ && (f._quant == _quant) && (f._applyTo == _applyTo)
+ && (ctrlEditsEqual)
+ && (f._quantStrength == _quantStrength) && (f._quantLimit == _quantLimit) && (f._colorMode == _colorMode)
+ && (f._quantLen == _quantLen) && (f._pianoWidth == _pianoWidth));
+ }
+ virtual bool operator!=(const EditorSettings& e) const { PianorollSettings& f = (PianorollSettings&) e; return !(f==*this); }
+ virtual void readStatus(QDomNode);
+ virtual void writeStatus(Xml&) const;
+ virtual EditorSettings* clone();
+ virtual void dump();
+
+ static void setStaticInitValues(int widthinit, int heightinit, int rasterinit, int quantinit);
+ };
+
+//---------------------------------------------------------
+// SettingsList
+//
+// Multimap containing a list of editor settings
+// There is one big list with settings for all editors and
+// different parts. When opening an editor for a specific
+// part, the part-id is matched against the correct editortype
+// If one exists, the editor gets when calling getSettings(),
+// otherwise, a new one is created.
+// The setting has a final update on destruction, and if it
+// has changed, it is stored to the settingslist
+//---------------------------------------------------------
+typedef std::multimap<unsigned, EditorSettings*>::iterator iSettingsList;
+typedef std::multimap<unsigned, EditorSettings*>::const_iterator ciSettingsList;
+
+class SettingsList : public std::multimap<unsigned, EditorSettings*>
+ {
+ public:
+ SettingsList();
+ ~SettingsList();
+ void set(unsigned id, EditorSettings* e);
+ EditorSettings* get(unsigned);
+ void removeSettings(unsigned id);
+ void readElem(QDomNode);
+ void readStatus(QDomNode);
+ void writeStatus(Xml&) const;
+ void dump();
+ void reset();
+ };
+
+#endif
diff --git a/muse/muse/evdata.h b/muse/muse/evdata.h
new file mode 100644
index 00000000..8e7ae643
--- /dev/null
+++ b/muse/muse/evdata.h
@@ -0,0 +1,76 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __EVDATA_H__
+#define __EVDATA_H__
+
+//---------------------------------------------------------
+// EvData
+// variable len event data (sysex, meta etc.)
+//---------------------------------------------------------
+
+class EvData {
+ int* refCount;
+
+ public:
+ unsigned char* data;
+ int dataLen;
+
+ EvData() {
+ data = 0;
+ dataLen = 0;
+ refCount = new int(1);
+ }
+ EvData(const EvData& ed) {
+ data = ed.data;
+ dataLen = ed.dataLen;
+ refCount = ed.refCount;
+ (*refCount)++;
+ }
+
+ EvData& operator=(const EvData& ed) {
+ if (data == ed.data)
+ return *this;
+ if (--(*refCount) == 0) {
+ delete refCount;
+ delete[] data;
+ }
+ data = ed.data;
+ dataLen = ed.dataLen;
+ refCount = ed.refCount;
+ (*refCount)++;
+ return *this;
+ }
+
+ ~EvData() {
+ if (--(*refCount) == 0) {
+ delete[] data;
+ delete refCount;
+ }
+ }
+ void setData(const unsigned char* p, int l) {
+ data = new unsigned char[l];
+ memcpy(data, p, l);
+ dataLen = l;
+ }
+ };
+
+#endif
+
diff --git a/muse/muse/event.cpp b/muse/muse/event.cpp
new file mode 100644
index 00000000..e7c529cd
--- /dev/null
+++ b/muse/muse/event.cpp
@@ -0,0 +1,198 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "event.h"
+#include "eventbase.h"
+#include "waveevent.h"
+#include "midievent.h"
+
+using AL::Pos;
+
+//---------------------------------------------------------
+// Event
+//---------------------------------------------------------
+
+EventBase::EventBase(EventType t)
+ {
+ _type = t;
+ Pos::setType(_type == Wave ? AL::FRAMES : AL::TICKS);
+ refCount = 0;
+ _selected = false;
+ }
+
+EventBase::EventBase(const EventBase& ev)
+ : PosLen(ev)
+ {
+ refCount = 0;
+ _selected = ev._selected;
+ _type = ev._type;
+ }
+
+//---------------------------------------------------------
+// move
+//---------------------------------------------------------
+
+void EventBase::move(int tickOffset)
+ {
+ setTick(tick() + tickOffset);
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void EventBase::dump(int n) const
+ {
+ for (int i = 0; i < n; ++i)
+ putchar(' ');
+ printf("Event %p refs:%d ", this, refCount);
+ PosLen::dump(n+2);
+ }
+
+//---------------------------------------------------------
+// clone
+//---------------------------------------------------------
+
+Event Event::clone()
+ {
+ return Event(ev->clone());
+ }
+
+Event::Event(EventType t)
+ {
+ if (t == Wave)
+ ev = new WaveEventBase(t);
+ else
+ ev = new MidiEventBase(t);
+ ++(ev->refCount);
+ }
+
+Event::Event(const Event& e)
+ {
+ ev = e.ev;
+ if (ev)
+ ++(ev->refCount);
+ }
+
+Event::Event(EventBase* eb)
+ {
+ ev = eb;
+ ++(ev->refCount);
+ }
+
+Event::~Event()
+ {
+ if (ev && --(ev->refCount) == 0)
+ delete ev;
+ }
+
+bool Event::empty() const
+ {
+ return ev == 0;
+ }
+
+EventType Event::type() const
+ {
+ return ev ? ev->type() : Note;
+ }
+
+void Event::setType(EventType t)
+ {
+ if (ev && --(ev->refCount) == 0)
+ delete ev;
+ if (t == Wave)
+ ev = new WaveEventBase(t);
+ else
+ ev = new MidiEventBase(t);
+ ++(ev->refCount);
+ }
+
+Event& Event::operator=(const Event& e)
+ {
+ if (ev == e.ev)
+ return *this;
+ if (ev && --(ev->refCount) == 0)
+ delete ev;
+ ev = e.ev;
+ if (ev)
+ ++(ev->refCount);
+ return *this;
+ }
+
+bool Event::operator==(const Event& e) const {
+ return ev == e.ev;
+ }
+
+int Event::getRefCount() const { return ev->getRefCount(); }
+bool Event::selected() const { return ev->_selected; }
+void Event::setSelected(bool val) { ev->_selected = val; }
+void Event::move(int offset) { ev->move(offset); }
+
+void Event::read(QDomNode node) { ev->read(node); }
+void Event::write(Xml& xml, const Pos& o) const { ev->write(xml, o); }
+void Event::dump(int n) const { ev->dump(n); }
+Event Event::mid(unsigned a, unsigned b) { return Event(ev->mid(a, b)); }
+
+bool Event::isNote() const { return ev->isNote(); }
+bool Event::isNoteOff() const { return ev->isNoteOff(); }
+bool Event::isNoteOff(const Event& e) const { return ev->isNoteOff(e); }
+int Event::dataA() const { return ev->dataA(); }
+int Event::pitch() const { return ev->dataA(); }
+void Event::setA(int val) { ev->setA(val); }
+void Event::setPitch(int val) { ev->setA(val); }
+int Event::dataB() const { return ev->dataB(); }
+int Event::velo() const { return ev->dataB(); }
+void Event::setB(int val) { ev->setB(val); }
+void Event::setVelo(int val) { ev->setB(val); }
+int Event::dataC() const { return ev->dataC(); }
+int Event::veloOff() const { return ev->dataC(); }
+void Event::setC(int val) { ev->setC(val); }
+void Event::setVeloOff(int val) { ev->setC(val); }
+
+const unsigned char* Event::data() const { return ev->data(); }
+int Event::dataLen() const { return ev->dataLen(); }
+void Event::setData(const unsigned char* data, int len) { ev->setData(data, len); }
+const EvData Event::eventData() const { return ev->eventData(); }
+
+const QString Event::name() const { return ev->name(); }
+void Event::setName(const QString& s) { ev->setName(s); }
+int Event::spos() const { return ev->spos(); }
+void Event::setSpos(int s) { ev->setSpos(s); }
+SndFileR Event::sndFile() const { return ev->sndFile(); }
+void Event::setSndFile(SndFileR& sf) { ev->setSndFile(sf); }
+void Event::read(unsigned offset, float** bpp, int channels, int nn)
+ {
+ ev->read(offset, bpp, channels, nn);
+ }
+
+void Event::setTick(unsigned val) { ev->setTick(val); }
+unsigned Event::tick() const { return ev->tick(); }
+Pos Event::pos() const { return *ev; }
+unsigned Event::frame() const { return ev->frame(); }
+void Event::setFrame(unsigned val) { ev->setFrame(val); }
+void Event::setLenTick(unsigned val) { ev->setLenTick(val); }
+void Event::setLenFrame(unsigned val) { ev->setLenFrame(val); }
+unsigned Event::lenTick() const { return ev->lenTick(); }
+unsigned Event::lenFrame() const { return ev->lenFrame(); }
+Pos Event::end() const { return ev->end(); }
+unsigned Event::endTick() const { return ev->end().tick(); }
+unsigned Event::endFrame() const { return ev->end().frame(); }
+void Event::setPos(const Pos& p) { ev->setPos(p); }
+
diff --git a/muse/muse/event.h b/muse/muse/event.h
new file mode 100644
index 00000000..9352eb38
--- /dev/null
+++ b/muse/muse/event.h
@@ -0,0 +1,146 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __EVENT_H__
+#define __EVENT_H__
+
+#include "wave.h" // wg. SndFile
+#include "al/xml.h"
+#include "al/pos.h"
+#include "evdata.h"
+
+using AL::Xml;
+using AL::Pos;
+
+enum EventType { Note, Controller, Sysex, PAfter, CAfter, Meta, Wave };
+class EventBase;
+
+//---------------------------------------------------------
+// Event
+//---------------------------------------------------------
+
+class Event {
+ EventBase* ev;
+
+ public:
+ Event() { ev = 0; }
+ Event(EventType t);
+ Event(const Event& e);
+ Event(EventBase* eb);
+ virtual ~Event();
+
+ bool empty() const;
+ EventType type() const;
+
+ void setType(EventType t);
+ Event& operator=(const Event& e);
+ bool operator==(const Event& e) const;
+
+ int getRefCount() const;
+ bool selected() const;
+ void setSelected(bool val);
+ void move(int offset);
+
+ void read(QDomNode);
+ void write(AL::Xml& xml, const Pos& offset) const;
+ void dump(int n = 0) const;
+ Event clone();
+ Event mid(unsigned a, unsigned b);
+
+ bool isNote() const;
+ bool isNoteOff() const;
+ bool isNoteOff(const Event& e) const;
+ int dataA() const;
+ int pitch() const;
+ void setA(int val);
+ void setPitch(int val);
+ int dataB() const;
+ int velo() const;
+ void setB(int val);
+ void setVelo(int val);
+ int dataC() const;
+ int veloOff() const;
+ void setC(int val);
+ void setVeloOff(int val);
+
+ const unsigned char* data() const;
+ int dataLen() const;
+ void setData(const unsigned char* data, int len);
+ const EvData eventData() const;
+
+ const QString name() const;
+ void setName(const QString& s);
+ int spos() const;
+ void setSpos(int s);
+ SndFileR sndFile() const;
+ virtual void setSndFile(SndFileR& sf);
+ virtual void read(unsigned offset, float** bpp, int channels, int nn);
+
+ Pos pos() const;
+ Pos end() const;
+
+ void setTick(unsigned val);
+ unsigned tick() const;
+ unsigned frame() const;
+ void setFrame(unsigned val);
+ void setLenTick(unsigned val);
+ void setLenFrame(unsigned val);
+ unsigned lenTick() const;
+ unsigned lenFrame() const;
+ unsigned endTick() const;
+ unsigned endFrame() const;
+ void setPos(const Pos& p);
+ };
+
+typedef std::multimap<unsigned, Event, std::less<unsigned> > EL;
+typedef EL::iterator iEvent;
+typedef EL::reverse_iterator riEvent;
+typedef EL::const_iterator ciEvent;
+typedef std::pair <iEvent, iEvent> EventRange;
+
+//---------------------------------------------------------
+// EventList
+// tick sorted list of events
+//---------------------------------------------------------
+
+class EventList : public EL {
+ int ref; // number of references to this EventList
+ int aref; // number of active references (exclude undo list)
+ void deselect();
+
+ public:
+ EventList() { ref = 0; aref = 0; }
+ ~EventList() {}
+
+ void incRef(int n) { ref += n; }
+ int refCount() const { return ref; }
+ void incARef(int n) { aref += n; }
+ int arefCount() const { return aref; }
+
+ iEvent find(const Event&);
+ iEvent add(Event& event);
+ iEvent add(Event& event, unsigned tick);
+ void move(Event& event, unsigned tick);
+ void dump() const;
+ void read(QDomNode, bool midi);
+ };
+
+#endif
+
diff --git a/muse/muse/eventbase.h b/muse/muse/eventbase.h
new file mode 100644
index 00000000..80019a74
--- /dev/null
+++ b/muse/muse/eventbase.h
@@ -0,0 +1,94 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __EVENTBASE_H__
+#define __EVENTBASE_H__
+
+#include "al/pos.h"
+
+//---------------------------------------------------------
+// EventBase
+//---------------------------------------------------------
+
+class EventBase : public AL::PosLen {
+ EventType _type;
+
+ protected:
+ int refCount;
+ bool _selected;
+
+ public:
+ EventBase(EventType t);
+ EventBase(const EventBase& ev);
+
+ virtual ~EventBase() {}
+
+ int getRefCount() const { return refCount; }
+ EventType type() const { return _type; }
+ void setType(EventType t) { _type = t; }
+ bool selected() const { return _selected; }
+ void setSelected(bool val) { _selected = val; }
+
+ void move(int offset);
+
+ virtual void read(QDomNode) = 0;
+ virtual void write(Xml&, const Pos& offset) const = 0;
+ virtual void dump(int n = 0) const;
+ virtual EventBase* mid(unsigned, unsigned) = 0;
+ friend class Event;
+
+ virtual bool isNote() const { return false; }
+ virtual bool isNoteOff() const { return false; }
+ virtual bool isNoteOff(const Event&) const { return false; }
+ virtual int pitch() const { return 0; }
+ virtual int program() const { return 0; }
+ virtual int cntrl() const { return 0; }
+ virtual int dataA() const { return 0; }
+ virtual void setA(int) { }
+ virtual void setPitch(int) { }
+
+ virtual int cntrlVal() const { return 0; }
+ virtual int dataB() const { return 0; }
+ virtual int velo() const { return 0; }
+ virtual void setB(int) { }
+ virtual void setVelo(int) { }
+
+ virtual int veloOff() const { return 0; }
+ virtual int dataC() const { return 0; }
+ virtual void setC(int) { }
+ virtual void setVeloOff(int) { }
+
+ virtual const unsigned char* data() const { return 0; }
+ virtual int dataLen() const { return 0; }
+ virtual void setData(const unsigned char*, int) { }
+ virtual const EvData eventData() const { return EvData(); }
+
+ virtual const QString name() const { return QString("?"); }
+ virtual void setName(const QString&) { }
+ virtual int spos() const { return 0; }
+ virtual void setSpos(int) { }
+ virtual SndFileR sndFile() const { return 0; }
+ virtual void setSndFile(SndFileR&) { }
+ virtual EventBase* clone() = 0;
+ virtual void read(unsigned /*offset*/, float** /*bpp*/, int /*channels*/, int /*nn*/) {}
+ };
+
+#endif
+
diff --git a/muse/muse/eventlist.cpp b/muse/muse/eventlist.cpp
new file mode 100644
index 00000000..374c07ff
--- /dev/null
+++ b/muse/muse/eventlist.cpp
@@ -0,0 +1,93 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "event.h"
+#include "al/xml.h"
+
+//---------------------------------------------------------
+// readEventList
+//---------------------------------------------------------
+
+void EventList::read(QDomNode node, bool midi)
+ {
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ if (tag.isEmpty())
+ continue;
+ if (tag == "event") {
+ Event e(midi ? Note : Wave);
+ e.read(node);
+ add(e);
+ }
+ else
+ printf("EventList:read(): unknown tag %s\n", tag.toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// add
+//---------------------------------------------------------
+
+iEvent EventList::add(Event& event, unsigned tick)
+ {
+ return std::multimap<unsigned, Event, std::less<unsigned> >::insert(std::pair<const unsigned, Event> (tick, event));
+ }
+
+iEvent EventList::add(Event& event)
+ {
+ return add(event, event.tick());
+ }
+
+//---------------------------------------------------------
+// move
+//---------------------------------------------------------
+
+void EventList::move(Event& event, unsigned tick)
+ {
+ iEvent i = find(event);
+ erase(i);
+ std::multimap<unsigned, Event, std::less<unsigned> >::insert(std::pair<const unsigned, Event> (tick, event));
+ }
+
+//---------------------------------------------------------
+// find
+//---------------------------------------------------------
+
+iEvent EventList::find(const Event& event)
+ {
+ EventRange range = equal_range(event.tick());
+ for (iEvent i = range.first; i != range.second; ++i) {
+ if (i->second == event)
+ return i;
+ }
+ return end();
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void EventList::dump() const
+ {
+ for (ciEvent i = begin(); i != end(); ++i)
+ i->second.dump();
+ }
+
diff --git a/muse/muse/exportmidi.cpp b/muse/muse/exportmidi.cpp
new file mode 100644
index 00000000..d1713a35
--- /dev/null
+++ b/muse/muse/exportmidi.cpp
@@ -0,0 +1,379 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "muse.h"
+#include "midifile.h"
+#include "midi.h"
+#include "midictrl.h"
+#include "globals.h"
+#include "widgets/filedialog.h"
+#include "track.h"
+#include "song.h"
+#include "mpevent.h"
+#include "event.h"
+#include "midiedit/drummap.h"
+#include "gconfig.h"
+#include "al/sig.h"
+#include "al/tempo.h"
+#include "al/marker.h"
+#include "part.h"
+#include "exportmidi.h"
+
+//---------------------------------------------------------
+// addController
+//---------------------------------------------------------
+
+static void addController(MPEventList* l, int tick, int port, int channel, int a, int b)
+ {
+ if (a < 0x1000) { // 7 Bit Controller
+ l->add(MidiEvent(tick, channel, ME_CONTROLLER, a, b));
+ }
+ else if (a < 0x20000) { // 14 Bit Controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ int dataH = (b >> 7) & 0x7f;
+ int dataL = b & 0x7f;
+ l->add(MidiEvent(tick, channel, ME_CONTROLLER, ctrlH, dataH));
+ l->add(MidiEvent(tick+1, channel, ME_CONTROLLER, ctrlL, dataL));
+ }
+ else if (a < 0x30000) { // RPN 7-Bit Controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ l->add(MidiEvent(tick, channel, ME_CONTROLLER, CTRL_HRPN, ctrlH));
+ l->add(MidiEvent(tick+1, channel, ME_CONTROLLER, CTRL_LRPN, ctrlL));
+ l->add(MidiEvent(tick+2, channel, ME_CONTROLLER, CTRL_HDATA, b));
+ }
+ else if (a < 0x40000) { // NRPN 7-Bit Controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ l->add(MidiEvent(tick, channel, ME_CONTROLLER, CTRL_HNRPN, ctrlH));
+ l->add(MidiEvent(tick+1, channel, ME_CONTROLLER, CTRL_LNRPN, ctrlL));
+ l->add(MidiEvent(tick+2, channel, ME_CONTROLLER, CTRL_HDATA, b));
+ }
+ else if (a == CTRL_PITCH) {
+ int a = b + 8192;
+ int b = a >> 7;
+ l->add(MidiEvent(tick, channel, ME_PITCHBEND, a & 0x7f, b & 0x7f));
+ }
+ else if (a == CTRL_PROGRAM) {
+ int hb = (b >> 16) & 0xff;
+ int lb = (b >> 8) & 0xff;
+ int pr = b & 0x7f;
+ int tickoffset = 0;
+ if (hb != 0xff) {
+ l->add(MidiEvent(tick, channel, ME_CONTROLLER, CTRL_HBANK, hb));
+ ++tickoffset;
+ }
+ if (lb != 0xff) {
+ l->add(MidiEvent(tick+tickoffset, channel, ME_CONTROLLER, CTRL_LBANK, lb));
+ ++tickoffset;
+ }
+ l->add(MidiEvent(tick+tickoffset, channel, ME_PROGRAM, pr, 0));
+ }
+ else if (a < 0x60000) { // RPN14 Controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ int dataH = (b >> 7) & 0x7f;
+ int dataL = b & 0x7f;
+ l->add(MidiEvent(tick, channel, ME_CONTROLLER, CTRL_HRPN, ctrlH));
+ l->add(MidiEvent(tick+1, channel, ME_CONTROLLER, CTRL_LRPN, ctrlL));
+ l->add(MidiEvent(tick+2, channel, ME_CONTROLLER, CTRL_HDATA, dataH));
+ l->add(MidiEvent(tick+3, channel, ME_CONTROLLER, CTRL_LDATA, dataL));
+ }
+ else if (a < 0x70000) { // NRPN14 Controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ int dataH = (b >> 7) & 0x7f;
+ int dataL = b & 0x7f;
+ l->add(MidiEvent(tick, channel, ME_CONTROLLER, CTRL_HNRPN, ctrlH));
+ l->add(MidiEvent(tick+1, channel, ME_CONTROLLER, CTRL_LNRPN, ctrlL));
+ l->add(MidiEvent(tick+2, channel, ME_CONTROLLER, CTRL_HDATA, dataH));
+ l->add(MidiEvent(tick+3, channel, ME_CONTROLLER, CTRL_LDATA, dataL));
+ }
+ }
+
+//---------------------------------------------------------
+// exportMidi
+//---------------------------------------------------------
+
+void MusE::exportMidi()
+ {
+ if (exportMidiDialog == 0)
+ exportMidiDialog = new ExportMidiDialog(project.filePath());
+ int rv = exportMidiDialog->exec();
+ if (rv == 0)
+ return;
+ QString name = exportMidiDialog->filename->text();
+ QFile fp(name);
+ if (fp.exists()) {
+ QString s(QWidget::tr("File\n") + name + QWidget::tr("\nexists"));
+ int rv = QMessageBox::warning(this,
+ QWidget::tr("MusE: export midi file:"),
+ s,
+ QWidget::tr("Overwrite"),
+ QWidget::tr("Quit"), QString::null, 0, 1);
+ if (rv == 1)
+ return;
+ }
+
+ MidiFile mf;
+ int format = exportMidiDialog->smf0->isChecked() ? 0 : 1;
+ mf.setFormat(format);
+
+ MidiFileTrackList* mtl = new MidiFileTrackList;
+
+ MidiTrackList* mt = song->midis();
+ for (iMidiTrack im = mt->begin(); im != mt->end(); ++im) {
+ MidiTrack* track = *im;
+
+ MidiFileTrack* mft = new MidiFileTrack;
+ mtl->push_back(mft);
+
+ MPEventList* l = &(mft->events);
+ int port = 0; // track->channel()->port();
+ int channel = 0;
+ if (track->channel())
+ channel = track->channel()->channelNo();
+
+ //-----------------------------------
+ // managed controller
+ //-----------------------------------
+
+ CtrlList* cll = track->controller();
+ for (iCtrl ivl = cll->begin(); ivl != cll->end(); ++ivl) {
+ Ctrl* c = ivl->second;
+ int id = c->id();
+ for (iCtrlVal iv = c->begin(); iv != c->end(); ++iv) {
+ int tick = ivl->first;
+ int val = iv->second.i;
+ addController(l, tick, port, channel, id, val);
+ }
+ }
+
+ //-----------------------------------
+ // track name
+ //-----------------------------------
+
+ if (!track->name().isEmpty()) {
+ const char* name = track->name().toLatin1().data();
+ int len = strlen(name);
+ MidiEvent ev(0, ME_META, (unsigned char*)name, len+1);
+ ev.setA(0x3); // Meta Sequence/Track Name
+ l->add(ev);
+ }
+
+ //-----------------------------------
+ // track comment
+ //-----------------------------------
+
+ if (!track->comment().isEmpty()) {
+ const char* comment = track->comment().toLatin1().data();
+ int len = strlen(comment);
+ MidiEvent ev(0, ME_META, (unsigned char*)comment, len+1);
+ ev.setA(0xf); // Meta Text
+ l->add(ev);
+ }
+ PartList* parts = track->parts();
+ for (iPart p = parts->begin(); p != parts->end(); ++p) {
+ Part* part = p->second;
+ EventList* evlist = part->events();
+ for (iEvent i = evlist->begin(); i != evlist->end(); ++i) {
+ Event ev = i->second;
+ int tick = ev.tick() + part->tick();
+
+ switch (ev.type()) {
+ case Note:
+ {
+ if (ev.velo() == 0) {
+ printf("Warning: midi note has velocity 0, (ignored)\n");
+ continue;
+ }
+ int pitch = ev.pitch();
+ int velo = ev.velo();
+ int len = ev.lenTick();
+
+ //---------------------------------------
+ // apply trackinfo values
+ //---------------------------------------
+
+ if (track->transposition
+ || track->velocity
+ || track->compression != 100
+ || track->len != 100) {
+ pitch += track->transposition;
+ if (pitch > 127)
+ pitch = 127;
+ if (pitch < 0)
+ pitch = 0;
+
+ velo += track->velocity;
+ velo = (velo * track->compression) / 100;
+ if (velo > 127)
+ velo = 127;
+ if (velo < 1) // no off event
+ velo = 1;
+ len = (len * track->len) / 100;
+ }
+ if (len <= 0)
+ len = 1;
+ l->add(MidiEvent(tick, channel, ME_NOTEON, pitch, velo));
+ l->add(MidiEvent(tick+len, channel, ME_NOTEON, pitch, 0));
+ }
+ break;
+
+ case Controller:
+ addController(l, tick, port, channel, ev.dataA(), ev.dataB());
+ break;
+
+ case Sysex:
+ l->add(MidiEvent(tick, ME_SYSEX, ev.eventData()));
+ break;
+
+ case PAfter:
+ l->add(MidiEvent(tick, channel, ME_AFTERTOUCH, ev.dataA(), ev.dataB()));
+ break;
+
+ case CAfter:
+ l->add(MidiEvent(tick, channel, ME_POLYAFTER, ev.dataA(), ev.dataB()));
+ break;
+
+ case Meta:
+ {
+ MidiEvent mpev(tick, ME_META, ev.eventData());
+ mpev.setA(ev.dataA());
+ l->add(mpev);
+ }
+ break;
+ case Wave:
+ break;
+ }
+ }
+ }
+ }
+
+ MidiFileTrack* mft = mtl->front();
+ MPEventList* l = &(mft->events);
+
+ //---------------------------------------------------
+ // Write Track Marker
+ //
+ AL::MarkerList* ml = song->marker();
+ for (AL::ciMarker m = ml->begin(); m != ml->end(); ++m) {
+ const char* name = m->second.name().toLatin1().data();
+ int len = strlen(name);
+ MidiEvent ev(m->first, ME_META, (unsigned char*)name, len);
+ ev.setA(0x6);
+ l->add(ev);
+ }
+
+ //---------------------------------------------------
+ // Write Copyright
+ //
+ const char* copyright = config.copyright.toLatin1().data();
+ if (copyright && *copyright) {
+ int len = strlen(copyright);
+ MidiEvent ev(0, ME_META, (unsigned char*)copyright, len);
+ ev.setA(0x2);
+ l->add(ev);
+ }
+
+ //---------------------------------------------------
+ // Write Tempomap
+ //
+ AL::TempoList* tl = &AL::tempomap;
+ for (AL::ciTEvent e = tl->begin(); e != tl->end(); ++e) {
+ AL::TEvent* event = e->second;
+ unsigned char data[3];
+ int tempo = event->tempo;
+ data[2] = tempo & 0xff;
+ data[1] = (tempo >> 8) & 0xff;
+ data[0] = (tempo >> 16) & 0xff;
+ MidiEvent ev(event->tick, ME_META, data, 3);
+ ev.setA(0x51);
+ l->add(ev);
+ }
+
+ //---------------------------------------------------
+ // Write Signatures
+ //
+ const AL::SigList* sl = &AL::sigmap;
+ for (AL::ciSigEvent e = sl->begin(); e != sl->end(); ++e) {
+ AL::SigEvent* event = e->second;
+ unsigned char data[2];
+ data[0] = event->sig.z;
+ switch(event->sig.n) {
+ case 1: data[1] = 0; break;
+ case 2: data[1] = 1; break;
+ case 4: data[1] = 2; break;
+ case 8: data[1] = 3; break;
+ case 16: data[1] = 4; break;
+ case 32: data[1] = 5; break;
+ case 64: data[1] = 6; break;
+ default:
+ fprintf(stderr, "falsche Signatur; nenner %d\n", event->sig.n);
+ break;
+ }
+ MidiEvent ev(event->tick, ME_META, data, 2);
+ ev.setA(0x58);
+ l->add(ev);
+ }
+
+ mf.setDivision(config.midiDivision);
+ mf.setTrackList(mtl);
+ fp.open(QIODevice::WriteOnly);
+ mf.write(&fp);
+ fp.close();
+ }
+
+//---------------------------------------------------------
+// ExportMidiDialog
+//---------------------------------------------------------
+
+ExportMidiDialog::ExportMidiDialog(const QString& name, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+
+ smf0->setChecked(config.smfFormat == 0);
+ smf1->setChecked(config.smfFormat == 1);
+ QFileInfo fi(name);
+ QString s(fi.path() + "/" + fi.baseName() + ".mid");
+ label->setText(tr("Save ") + fi.baseName() + tr(" as smf midi file"));
+ filename->setText(s);
+ connect(fileButton, SIGNAL(clicked()), SLOT(startFileBrowser()));
+ }
+
+//---------------------------------------------------------
+// startFileBrowser
+//---------------------------------------------------------
+
+void ExportMidiDialog::startFileBrowser()
+ {
+ QString s = QFileDialog::getSaveFileName(
+ (QWidget*)this,
+ tr("MusE: export midi smf file"),
+ QFileInfo(filename->text()).path(),
+ QString("Midi Files (*.mid *.kar *.MID)"),
+ 0,
+ QFileDialog::DontConfirmOverwrite);
+ if (!s.isEmpty())
+ filename->setText(s);
+ }
+
diff --git a/muse/muse/exportmidi.h b/muse/muse/exportmidi.h
new file mode 100644
index 00000000..0a4fa071
--- /dev/null
+++ b/muse/muse/exportmidi.h
@@ -0,0 +1,41 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __EXPORTMIDI_H__
+#define __EXPORTMIDI_H__
+
+#include "ui_exportmididialog.h"
+
+//---------------------------------------------------------
+// ExportMidiDialog
+//---------------------------------------------------------
+
+class ExportMidiDialog : public QDialog, public Ui::ExportMidiDialogBase {
+ Q_OBJECT
+
+ private slots:
+ void startFileBrowser();
+
+ public:
+ ExportMidiDialog(const QString&, QWidget* parent = 0);
+ };
+
+#endif
+
diff --git a/muse/muse/exportmididialog.ui b/muse/muse/exportmididialog.ui
new file mode 100644
index 00000000..69d35da1
--- /dev/null
+++ b/muse/muse/exportmididialog.ui
@@ -0,0 +1,176 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>ExportMidiDialogBase</class>
+ <widget class="QDialog" name="ExportMidiDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>425</width>
+ <height>316</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Export Midi</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="smf0" >
+ <property name="text" >
+ <string>SMF Typ 0 (single track)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="smf1" >
+ <property name="text" >
+ <string>SMF Typ 1 (multiple tracks)</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Save As:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="filename" />
+ </item>
+ <item>
+ <widget class="QToolButton" name="fileButton" >
+ <property name="text" >
+ <string>...</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/filenew.png</iconset>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>131</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources>
+ <include location="../muse.qrc" />
+ </resources>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ExportMidiDialogBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>321</x>
+ <y>274</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>96</x>
+ <y>254</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>ExportMidiDialogBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>414</x>
+ <y>274</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>179</x>
+ <y>282</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/extmidieditor.cpp b/muse/muse/extmidieditor.cpp
new file mode 100644
index 00000000..04c7ee73
--- /dev/null
+++ b/muse/muse/extmidieditor.cpp
@@ -0,0 +1,422 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2004 Mathias Lundgren <lunar_shuttle@users.sourceforge.net>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __EXTMIDIEDITOR_CPP__
+#define __EXTMIDIEDITOR_CPP__
+
+#include "extmidieditor.h"
+#include "part.h"
+#include "al/xml.h"
+#include "al/pos.h"
+#include "song.h"
+#include "midiedit/ecanvas.h"
+#include "waveedit/waveview.h"
+#include "esettings.h"
+// #include "../ctrl/ctrledit.h"
+
+//---------------------------------------------------------
+// GraphMidiEditor
+//---------------------------------------------------------
+
+GraphMidiEditor::GraphMidiEditor(PartList* pl)
+ : MidiEditor(pl)
+ {
+ setIconSize(QSize(18, 18));
+ _followSong = true;
+ }
+
+//---------------------------------------------------------
+// ~GraphMidiEditor
+//---------------------------------------------------------
+
+GraphMidiEditor::~GraphMidiEditor()
+ {
+ refreshSettings();
+ }
+
+//---------------------------------------------------------
+// newDefaultSettings
+//---------------------------------------------------------
+
+EditorSettings* GraphMidiEditor::newDefaultSettings()
+ {
+ return new GraphEditorSettings();
+ }
+
+//---------------------------------------------------------
+// initSettings
+//---------------------------------------------------------
+
+void GraphMidiEditor::initSettings()
+ {
+ MidiEditor::initSettings();
+#if 0 //TD
+ GraphEditorSettings* s = ((GraphEditorSettings*)(settings));
+ hscroll->setXmag(s->xmag()); //horizontal zoom
+ hscroll->setPos(s->pos());
+
+ if (editorType != ET_WAVEEDIT)
+ vscroll->setPos(((GraphEditorSettings*)settings)->ypos());
+#endif
+ }
+
+
+//---------------------------------------------------------
+// refreshSettings
+//---------------------------------------------------------
+void GraphMidiEditor::refreshSettings() const
+ {
+ MidiEditor::refreshSettings();
+// if (editorType != ET_WAVEEDIT) //hACK! TODO: Separate waveedit class
+// ((GraphEditorSettings*)settings)->setYpos(vscroll->pos());
+ }
+
+//---------------------------------------------------------
+// raster
+//---------------------------------------------------------
+int GraphMidiEditor::raster() const
+ {
+ return settings->raster();
+ }
+
+//---------------------------------------------------------
+// setRaster
+//---------------------------------------------------------
+void GraphMidiEditor::setRaster(int val)
+ {
+ settings->setRaster(val);
+// canvas->setFocus(); // give back focus after kb input
+ //_raster = val;
+ }
+
+//---------------------------------------------------------
+// rasterStep
+//---------------------------------------------------------
+int GraphMidiEditor::rasterStep(unsigned tick) const
+ {
+ return AL::sigmap.rasterStep(tick, settings->raster());
+ }
+
+//---------------------------------------------------------
+// rasterVal
+//---------------------------------------------------------
+unsigned GraphMidiEditor::rasterVal(unsigned v) const
+ {
+ return AL::sigmap.raster(v, settings->raster());
+ }
+
+//---------------------------------------------------------
+// rasterVal1
+//---------------------------------------------------------
+unsigned GraphMidiEditor::rasterVal1(unsigned v) const
+ {
+ return AL::sigmap.raster1(v, settings->raster());
+ }
+
+//---------------------------------------------------------
+// rasterVal2
+//---------------------------------------------------------
+unsigned GraphMidiEditor::rasterVal2(unsigned v) const
+ {
+ return AL::sigmap.raster2(v, settings->raster());
+ }
+
+
+//---------------------------------------------------------
+// ExtMidiEditor
+//---------------------------------------------------------
+
+ExtMidiEditor::ExtMidiEditor(PartList* pl)
+ : GraphMidiEditor(pl)
+ {
+ _curDrumInstrument = -1;
+ //printf("ExtMidiEditor, defaultSettings: %x\n",&defaultSettings);
+ }
+
+//---------------------------------------------------------
+// ~ExtMidiEditor
+//---------------------------------------------------------
+
+ExtMidiEditor::~ExtMidiEditor()
+ {
+ refreshSettings();
+ }
+
+//---------------------------------------------------------
+// updateCtrlEdits
+//---------------------------------------------------------
+
+void ExtMidiEditor::updateCtrlEdits() const
+ {
+#if 0 //TD
+ ExtEditorSettings* s = (ExtEditorSettings*) settings;
+ int j=0;
+ for (std::list<CtrlEdit*>::const_iterator i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i, j++) {
+ CtrlEdit* ctrlEdit = (*i);
+ int ctrlid = ctrlEdit->controllerId();
+ CtrlEditSettings* ctrl = new CtrlEditSettings(ctrlEdit->getPanelHeight(), ctrlid);
+ s->setControlEditSettings(j, ctrl);
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// newDefaultSettings
+//---------------------------------------------------------
+EditorSettings* ExtMidiEditor::newDefaultSettings()
+ {
+ return (EditorSettings*) new ExtEditorSettings();
+ }
+
+//---------------------------------------------------------
+// initSettings
+//---------------------------------------------------------
+
+void ExtMidiEditor::initSettings()
+ {
+ GraphMidiEditor::initSettings();
+
+ ExtEditorSettings* s = (ExtEditorSettings*) settings;
+ srec->setChecked(s->steprec()); //set steprec
+ midiin->setChecked(s->midiin()); //set midiin
+ int ctrlsize = s->getControlEditSize();
+ //Set to 0 again to not get the double amount of ctrledits:
+ s->setControlEditSize(0);
+ for (int i=0; i< ctrlsize; i++) {
+ CtrlEditSettings* settings = s->getControlEditSettings(i);
+ CtrlEdit* ctrlEdit = addCtrl();
+//TD ctrlEdit->setController(settings->getController());
+ }
+ QList<int> vl;
+ vl.push_back(400); // dummy: canvas height
+ for (int i = 0; i < ctrlsize; i++) {
+ CtrlEditSettings* settings = s->getControlEditSettings(i);
+ vl.push_back(settings->getHeight());
+ }
+//TD splitter->setSizes(vl);
+ }
+
+//---------------------------------------------------------
+// quantVal
+//---------------------------------------------------------
+
+int ExtMidiEditor::quantVal(int v) const
+ {
+ ExtEditorSettings* s = (ExtEditorSettings*) settings;
+ //int val = ((v+_quant/2)/_quant)*_quant;
+ int q = s->quant();
+ int val = ((v+q/2)/q)*q;
+ if (val == 0)
+ val = q;
+ return val;
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+/*
+void ExtMidiEditor::readStatus(Xml& xml)
+ {
+ if (_pl == 0)
+ _pl = new PartList;
+
+ for (;;) {
+ Xml::Token token = xml.parse();
+ QString tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ if (tag == "quant")
+ _quant = xml.parseInt();
+ else if (tag == "raster")
+ _raster = xml.parseInt();
+ else if (tag == "topwin")
+ TopWin::readStatus(xml);
+ else
+ xml.unknown("MidiEditor");
+ break;
+ case Xml::TagEnd:
+ if (tag == "midieditor")
+ return;
+ default:
+ break;
+ }
+ }
+ }
+*/
+
+//---------------------------------------------------------
+// setCurDrumInstrument
+//---------------------------------------------------------
+
+void ExtMidiEditor::setCurDrumInstrument(int instr)
+ {
+ _curDrumInstrument = instr;
+ emit curDrumInstrumentChanged(_curDrumInstrument);
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+/*
+void ExtMidiEditor::writeStatus(int level, Xml& xml) const
+ {
+ xml.tag(level++, "midieditor");
+ TopWin::writeStatus(level, xml);
+ xml.intTag(level, "quant", _quant);
+ xml.intTag(level, "raster", _raster);
+ xml.tag(level, "/midieditor");
+ }
+*/
+
+//---------------------------------------------------------
+// quant
+//---------------------------------------------------------
+int ExtMidiEditor::quant() const
+ {
+ ExtEditorSettings* s = (ExtEditorSettings*) settings;
+ return s->quant();
+ }
+
+//---------------------------------------------------------
+// setQuant
+//---------------------------------------------------------
+
+void ExtMidiEditor::setQuant(int val)
+ {
+ ExtEditorSettings* s = (ExtEditorSettings*) settings;
+ s->setQuant(val);
+ canvas->setQuant(val);
+ canvas->setFocus();
+ }
+
+
+//---------------------------------------------------------
+// follow
+//---------------------------------------------------------
+
+void ExtMidiEditor::follow(int pos)
+ {
+ int s, e;
+ canvas->range(&s, &e);
+
+// if (pos < e && pos >= s)
+// hscroll->setOffset(pos);
+// if (pos < s)
+// hscroll->setOffset(s);
+ }
+
+//---------------------------------------------------------
+// removeCtrl
+//---------------------------------------------------------
+
+void ExtMidiEditor::removeCtrl(CtrlEdit* ctrl)
+ {
+ for (std::list<CtrlEdit*>::iterator i = ctrlEditList.begin();
+ i != ctrlEditList.end(); ++i) {
+ if (*i == ctrl) {
+ ctrlEditList.erase(i);
+ break;
+ }
+ }
+ ExtEditorSettings* s = (ExtEditorSettings*)settings;
+ int n = s->getControlEditSize();
+ n--;
+ s->setControlEditSize(n);
+ }
+
+//---------------------------------------------------------
+// addCtrl
+//---------------------------------------------------------
+
+CtrlEdit* ExtMidiEditor::addCtrl()
+ {
+#if 0 //TD
+ bool expanding = editorType == ET_DRUMEDIT ? true : false;
+
+ CtrlEdit* ctrlEdit = new CtrlEdit(splitter, this, EXTMIDIEDITOR_XSCALE, expanding, "extMidiEditorCtrlEdit");
+ splitter->setResizeMode(ctrlEdit, QSplitter::KeepSize);
+
+ // Calculate sizes:
+ QList<int> sizes = splitter->sizes();
+ QList<int> newSizes;
+ QListIterator<int> i = sizes.begin();
+
+ int editorHeight = *i - EXTMIDIEDITOR_DEFAULT_CTRLHEIGHT;
+ int ctrlHeight = EXTMIDIEDITOR_DEFAULT_CTRLHEIGHT;
+ if (editorHeight < 0) {
+ ctrlHeight = EXTMIDIEDITOR_DEFAULT_CTRLHEIGHT + editorHeight;
+ editorHeight = *i - ctrlHeight;
+ }
+ if (editorHeight < 0) {
+ editorHeight = 5;
+ }
+
+ newSizes.append(editorHeight);
+ for (i++; i != sizes.end(); i++) {
+ newSizes.append(*i);
+ }
+ newSizes.pop_back();
+ newSizes.append(ctrlHeight);
+ splitter->setSizes(newSizes);
+
+ ctrlEdit->blockSignals(true);
+ connect(tools2, SIGNAL(toolChanged(int)), ctrlEdit, SLOT(setTool(int)));
+// connect(hscroll, SIGNAL(scrollChanged(int)), ctrlEdit, SLOT(setXPos(int)));
+// connect(hscroll, SIGNAL(scaleChanged(int)), ctrlEdit, SLOT(setXMag(int)));
+ connect(ctrlEdit, SIGNAL(timeChanged(unsigned)), SLOT(setTime(unsigned)));
+ connect(ctrlEdit, SIGNAL(destroyedCtrl(CtrlEdit*)), SLOT(removeCtrl(CtrlEdit*)));
+// connect(ctrlEdit, SIGNAL(yposChanged(int)), toolbar, SLOT(setInt(int)));
+
+ ctrlEdit->setTool(tools2->curTool());
+// ctrlEdit->setXPos(hscroll->pos());
+// ctrlEdit->setXMag(hscroll->getScaleValue());
+ ctrlEdit->setController(CTRL_VELOCITY);
+
+ ctrlEdit->show();
+ ctrlEditList.push_back(ctrlEdit);
+ ctrlEdit->blockSignals(false);
+ ExtEditorSettings* s = (ExtEditorSettings*)settings;
+ int n = s->getControlEditSize();
+ n++;
+ s->setControlEditSize(n);
+ return ctrlEdit;
+#endif
+ return 0;
+ }
+
+//---------------------------------------------------------
+// refreshSettings
+//---------------------------------------------------------
+void ExtMidiEditor::refreshSettings() const
+ {
+ GraphMidiEditor::refreshSettings();
+ ExtEditorSettings* s = (ExtEditorSettings*) settings;
+ s->setSteprec(canvas->steprec());
+ s->setMidiin(canvas->midiin());
+// s->setXmag(hscroll->xmag());
+// s->setPos(hscroll->pos());
+ updateCtrlEdits();
+ }
+
+#endif
diff --git a/muse/muse/extmidieditor.h b/muse/muse/extmidieditor.h
new file mode 100644
index 00000000..b02ac730
--- /dev/null
+++ b/muse/muse/extmidieditor.h
@@ -0,0 +1,120 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2004 Mathias Lundgren <lunar_shuttle@users.sourceforge.net>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __EXTMIDIEDITOR_H__
+#define __EXTMIDIEDITOR_H__
+
+#include "midiedit/midieditor.h"
+#include "esettings.h"
+
+namespace AL {
+ class Pos;
+ };
+
+class EditToolBar;
+class NoteInfo;
+class PartList;
+class CtrlEdit;
+class Toolbar1;
+class Part;
+
+//---------------------------------------------------------
+// GraphMidiEditor
+//
+// Base class for graphical editors
+// Currently used by WaveEdit and MasterEdit
+//---------------------------------------------------------
+
+class GraphMidiEditor : public MidiEditor {
+ Q_OBJECT
+
+ protected:
+ virtual EditorSettings* newDefaultSettings(); //TODO: = 0
+ virtual void initSettings();
+ virtual void refreshSettings() const;
+ QAction* srec;
+ QAction* midiin;
+ bool _followSong;
+ EditToolBar* tools2;
+
+ protected slots:
+ void setRaster(int val);
+
+ public:
+ GraphMidiEditor(PartList*);
+ virtual ~GraphMidiEditor();
+ int rasterStep(unsigned tick) const;
+ unsigned rasterVal(unsigned v) const;
+ unsigned rasterVal1(unsigned v) const;
+ unsigned rasterVal2(unsigned v) const;
+ int raster() const;
+ bool followSong() const { return _followSong; }
+ };
+
+
+//---------------------------------------------------------
+// ExtMidiEditor
+//
+// Inherited by Drumeditor and Pianoroll
+// Not instantiated directly - virtual
+//---------------------------------------------------------
+
+class ExtMidiEditor : public GraphMidiEditor {
+ Q_OBJECT
+ int _curDrumInstrument; // currently selected instrument if drum
+ // editor
+
+ protected:
+ std::list<CtrlEdit*> ctrlEditList;
+ virtual EditorSettings* newDefaultSettings();
+ virtual void initSettings();
+ virtual void refreshSettings() const;
+ Toolbar1* toolbar;
+ Part* selPart;
+ NoteInfo* info;
+ QToolBar* tools;
+ EventCanvas* canvas;
+ WaveView* wview;
+
+ void updateCtrlEdits() const;
+
+ signals:
+ void curDrumInstrumentChanged(int); //hACK!
+
+ protected slots:
+ void setQuant(int val);
+ void follow(int pos);
+ void removeCtrl(CtrlEdit* ctrl);
+ virtual CtrlEdit* addCtrl();
+
+ public slots:
+ void setCurDrumInstrument(int instr); //hACK!
+
+ public:
+ ExtMidiEditor(PartList*);
+ virtual ~ExtMidiEditor();
+ int quantVal(int v) const;
+ int quant() const;
+
+ int curDrumInstrument() const { return _curDrumInstrument; }
+ };
+
+#endif
+
diff --git a/muse/muse/fastlog.h b/muse/muse/fastlog.h
new file mode 100644
index 00000000..23710a8b
--- /dev/null
+++ b/muse/muse/fastlog.h
@@ -0,0 +1,38 @@
+/* Copyright unknown. Code by Laurent de Soras <laurent@ohmforce.com>.
+ */
+
+#ifndef __pbd_fastlog_h__
+#define __pbd_fastlog_h__
+
+#include <math.h> /* for HUGE_VAL */
+
+static inline float fast_log2 (float val)
+ {
+ /* don't use reinterpret_cast<> because that prevents this
+ from being used by pure C code (for example, GnomeCanvasItems)
+ */
+ union {float f; int i;} t;
+ t.f = val;
+ int* const exp_ptr = &t.i;
+ int x = *exp_ptr;
+ const int log_2 = ((x >> 23) & 255) - 128;
+ x &= ~(255 << 23);
+ x += 127 << 23;
+ *exp_ptr = x;
+ val = ((-1.0f/3) * t.f + 2) * t.f - 2.0f/3;
+ return (val + log_2);
+ }
+
+static inline float fast_log (const float val)
+ {
+ return (fast_log2 (val) * 0.69314718f);
+ }
+
+static inline float fast_log10 (const float val)
+ {
+ return fast_log2(val) / 3.312500f;
+ }
+
+static inline float minus_infinity() { return -HUGE_VAL; }
+
+#endif /* __pbd_fastlog_h__ */
diff --git a/muse/muse/fifo.cpp b/muse/muse/fifo.cpp
new file mode 100644
index 00000000..fbad5544
--- /dev/null
+++ b/muse/muse/fifo.cpp
@@ -0,0 +1,223 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "fifo.h"
+#include "globals.h"
+
+//---------------------------------------------------------
+// Fifo
+//---------------------------------------------------------
+
+Fifo::Fifo()
+ {
+ nbuffer = FIFO_BUFFER;
+ buffer = new FifoBuffer*[nbuffer];
+ for (int i = 0; i < nbuffer; ++i)
+ buffer[i] = new FifoBuffer;
+ clear();
+ }
+
+Fifo::~Fifo()
+ {
+ for (int i = 0; i < nbuffer; ++i)
+ delete buffer[i];
+ delete[] buffer;
+ }
+
+//---------------------------------------------------------
+// clear
+//---------------------------------------------------------
+
+void Fifo::clear()
+ {
+ ridx = 0;
+ widx = 0;
+ counter = 0;
+ }
+
+//---------------------------------------------------------
+// put
+// return true if fifo full
+//---------------------------------------------------------
+
+bool Fifo::put(int segs, unsigned long samples, float** src, unsigned pos)
+ {
+ if (counter == nbuffer) {
+ printf("FIFO %p overrun at 0x%x\n", this, pos);
+ return true;
+ }
+ FifoBuffer* b = buffer[widx];
+ int n = segs * samples;
+ if (b->maxSize < n) {
+ if (b->buffer)
+ delete[] b->buffer;
+ b->buffer = new float[n];
+ b->maxSize = n;
+ }
+ b->size = samples;
+ b->segs = segs;
+ b->pos = pos;
+ for (int i = 0; i < segs; ++i)
+ memcpy(b->buffer + i * samples, src[i], samples * sizeof(float));
+ add();
+ return false;
+ }
+
+//---------------------------------------------------------
+// get
+// return true if fifo empty
+//---------------------------------------------------------
+
+bool Fifo::get(int segs, unsigned long samples, float** dst, unsigned pos)
+ {
+ FifoBuffer* b;
+ bool errMsg = true;
+ for (;;) {
+ if (counter == 0) {
+ printf("FIFO %p underrun at 0x%x\n", this, pos);
+ return true;
+ }
+ b = buffer[ridx];
+ if (pos == b->pos)
+ break;
+ //
+ // skip all buffer until we get the rigth one or the
+ // fifo is empty
+ //
+// if (errMsg)
+ printf("Fifo %p::get(0x%x) n=%d, discard wrong prefetch block(s) 0x%x\n",
+ this, pos, counter, b->pos);
+ remove();
+ errMsg = false;
+ }
+ for (int i = 0; i < segs; ++i)
+ dst[i] = b->buffer + samples * (i % b->segs);
+ remove();
+ return false;
+ }
+
+//---------------------------------------------------------
+// get
+// return true if fifo empty
+//---------------------------------------------------------
+
+bool Fifo::get(int segs, unsigned long samples, float** dst)
+ {
+ FifoBuffer* b;
+ if (counter == 0) {
+ printf("FIFO %p underrun --cannot happen!\n", this);
+ return true;
+ }
+ b = buffer[ridx];
+ for (int i = 0; i < segs; ++i)
+ dst[i] = b->buffer + samples * (i % b->segs);
+ remove();
+ return false;
+ }
+
+//---------------------------------------------------------
+// remove
+//---------------------------------------------------------
+
+void Fifo::remove()
+ {
+ ridx = (ridx + 1) % nbuffer;
+ q_atomic_decrement(&counter);
+ }
+
+//---------------------------------------------------------
+// getWriteBuffer
+// return true, if no more buffer available
+// (overflow)
+//---------------------------------------------------------
+
+bool Fifo::getWriteBuffer(int segs, unsigned long samples, float** buf, unsigned pos)
+ {
+ if (counter == nbuffer)
+ return true;
+ FifoBuffer* b = buffer[widx];
+ int n = segs * samples;
+ if (b->maxSize < n) {
+ if (b->buffer)
+ delete[] b->buffer;
+ b->buffer = new float[n];
+ b->maxSize = n;
+ }
+ for (int i = 0; i < segs; ++i)
+ buf[i] = b->buffer + i * samples;
+ b->size = samples;
+ b->segs = segs;
+ b->pos = pos;
+ return false;
+ }
+
+//---------------------------------------------------------
+// add
+//---------------------------------------------------------
+
+void Fifo::add()
+ {
+ widx = (widx + 1) % nbuffer;
+ q_atomic_increment(&counter);
+ }
+
+//---------------------------------------------------------
+// Fifo1
+//---------------------------------------------------------
+
+Fifo1::Fifo1()
+ {
+ clear();
+ }
+
+Fifo1::~Fifo1()
+ {
+ }
+
+//---------------------------------------------------------
+// clear
+//---------------------------------------------------------
+
+void Fifo1::clear()
+ {
+ ridx = 0;
+ widx = 0;
+ counter = 0;
+ }
+
+//---------------------------------------------------------
+// put
+//---------------------------------------------------------
+
+void Fifo1::put()
+ {
+ widx = (widx + 1) % FIFO_BUFFER;
+ q_atomic_increment(&counter);
+ }
+
+//---------------------------------------------------------
+// get
+//---------------------------------------------------------
+
+void Fifo1::get()
+ {
+ ridx = (ridx + 1) % FIFO_BUFFER;
+ q_atomic_decrement(&counter);
+ }
diff --git a/muse/muse/fifo.h b/muse/muse/fifo.h
new file mode 100644
index 00000000..ed6d27e5
--- /dev/null
+++ b/muse/muse/fifo.h
@@ -0,0 +1,93 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __AUDIONODE_H__
+#define __AUDIONODE_H__
+
+class Pipeline;
+class SndFile;
+
+const int FIFO_BUFFER = 256;
+
+//---------------------------------------------------------
+// Fifo
+//---------------------------------------------------------
+
+struct FifoBuffer {
+ float* buffer;
+ int size;
+ int maxSize;
+ unsigned pos;
+ int segs;
+
+ FifoBuffer() {
+ buffer = 0;
+ size = 0;
+ maxSize = 0;
+ }
+ };
+
+class Fifo {
+ int nbuffer;
+ int ridx; // read index; only touched by reader
+ int widx; // write index; only touched by writer
+ volatile int counter; // buffer count; writer increments, reader decrements
+ FifoBuffer** buffer;
+
+ public:
+ Fifo();
+ ~Fifo();
+ void clear();
+ bool put(int, unsigned long, float** buffer, unsigned pos);
+ bool getWriteBuffer(int, unsigned long, float** buffer, unsigned pos);
+ void add();
+ bool get(int, unsigned long, float** buffer, unsigned pos);
+ bool get(int, unsigned long, float** buffer);
+ void remove();
+ int count() const { return counter; }
+ };
+
+
+//---------------------------------------------------------
+// Fifo1
+//---------------------------------------------------------
+
+class Fifo1 {
+ public:
+ unsigned positions[FIFO_BUFFER];
+ int ridx; // read index; only touched by reader
+ int widx; // write index; only touched by writer
+ volatile int counter; // buffer count; writer increments, reader decrements
+
+ Fifo1();
+ ~Fifo1();
+ void clear();
+ int setWritePos(unsigned pos) {
+ positions[widx] = pos;
+ return widx;
+ }
+ int count() const { return counter; }
+ unsigned readPos() const { return positions[ridx]; }
+ void put();
+ void get();
+ };
+
+#endif
+
diff --git a/muse/muse/gconfig.cpp b/muse/muse/gconfig.cpp
new file mode 100644
index 00000000..25d6013b
--- /dev/null
+++ b/muse/muse/gconfig.cpp
@@ -0,0 +1,139 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "gconfig.h"
+
+GlobalConfigValues config = {
+ {
+ QColor(0xff, 0xff, 0xff), // palette
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0xff, 0xff, 0xff),
+ },
+ {
+ QColor(255, 232, 140), // part colors
+ QColor(0xff, 0x00, 0x00),
+ QColor(0x00, 0xff, 0x00),
+ QColor(0x00, 0x00, 0xff),
+ QColor(0xff, 0xff, 0x00),
+ QColor(0x00, 0xff, 0xff),
+ QColor(0xff, 0x00, 0xff),
+ QColor(0x9f, 0xc7, 0xef),
+ QColor(0x00, 0xff, 0x7f),
+ QColor(0x7f, 0x00, 0x00),
+ QColor(0x00, 0x7f, 0x00),
+ QColor(0x00, 0x00, 0x7f),
+ QColor(0x7f, 0x7f, 0x3f),
+ QColor(0x00, 0x7f, 0x7f),
+ QColor(0x7f, 0x00, 0x7f),
+ QColor(0x00, 0x7f, 0xff),
+ QColor(0x00, 0x3f, 0x3f)
+ },
+ QColor(100, 100, 100), // selected Part Bg
+ QColor(0, 0, 255), // transportHandleColor;
+ QColor(255, 0, 0), // bigTimeForegroundColor;
+ QColor(0, 0, 0), // bigTimeBackgroundColor;
+ QColor(200, 200, 200), // waveEditBackgroundColor;
+ {
+ 0, 0, 0, 0, 0, 0
+ },
+ {
+ QColor(Qt::white), // outputTrackBg;
+ QColor(Qt::yellow), // groupTrackBg;
+ QColor(Qt::cyan), // auxTrackBg;
+ QColor(Qt::green), // waveTrackBg;
+ QColor(Qt::red), // inputTrackBg;
+ QColor(Qt::blue), // synthTrackBg;
+ QColor(Qt::gray), // midi;
+ QColor(Qt::gray), // midiOut;
+ QColor(Qt::gray), // midiIn;
+ QColor(Qt::gray), // midiChannel;
+ QColor(Qt::gray), // midiSynti;
+ },
+
+ QColor(0, 0, 0), // mixerBg;
+
+ 384, // division;
+ 1024, // rtcTicks
+ -60, // int minMeter;
+ -60.0, // double minSlider;
+ 20, // int guiRefresh;
+ 2000, // peak hold time (ms)
+ QString(""), // helpBrowser
+ true, // extendedMidi
+ 384, // division for smf export
+ QString(""), // copyright string for smf export
+ 1, // smf export file format
+ 1, // startMode
+ QString(""), // start song path
+ 384, // gui division
+ QRect(0, 0, 800, 560), // GeometryMain;
+ QRect(0, 0, 200, 100), // GeometryTransport;
+ QRect(0, 0, 600, 200), // GeometryBigTime;
+ QRect(100, 100, 600, 400), // GeometryPianoroll;
+ QRect(0, 0, 600, 400), // GeometryDrumedit;
+ {
+ QRect(0, 0, 300, 500), // Mixer1
+ false, true, true, true, true,
+ true, true, true, true, true, true
+ },
+ {
+ QRect(200, 200, 300, 500), // Mixer2
+ false, true, true, true, true,
+ true, true, true, true, true, true
+ },
+ false, // TransportVisible
+ false, // BigTimeVisible;
+ false, // mixerVisible1;
+ false, // mixerVisible2;
+
+ true, // showSplashScreen
+
+ QColor(0x71, 0x8d, 0xbe), // canvasBgColor
+ QString(""), // canvasBgPixmap;
+ false, // canvasUseBgPixmap;
+ 1, // canvasShowPartType 1 - names, 2 events
+ 5, // canvasShowPartEvent
+ false, // canvasShowGrid;
+
+ QString(""), // style
+ false, // use JACK freewheel mode
+ QString("sweep"), // externalWavEditor shell command
+
+ QString(""), // defaultMidiInputDevice
+ QString(""), // defaultMidiOutputDevice
+ QString(""), // defaultMidiInstrument
+ true, // connectToAllMidiDevices
+ true, // connectToAllMidiTracks
+ true, // createDefaultMidiInput
+ };
+
diff --git a/muse/muse/gconfig.h b/muse/muse/gconfig.h
new file mode 100644
index 00000000..328d2810
--- /dev/null
+++ b/muse/muse/gconfig.h
@@ -0,0 +1,127 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __CONFIG_H__
+#define __CONFIG_H__
+
+#define NUM_PARTCOLORS 17
+
+#include "track.h"
+#include "al/xml.h"
+using AL::Xml;
+
+//---------------------------------------------------------
+// MixerConfig
+//---------------------------------------------------------
+
+struct MixerConfig {
+ QRect geometry;
+ bool showMidiTracks;
+ bool showMidiInPorts;
+ bool showMidiSyntiPorts;
+ bool showMidiOutPorts;
+ bool showMidiChannels;
+ bool showOutputTracks;
+ bool showWaveTracks;
+ bool showGroupTracks;
+ bool showInputTracks;
+ bool showAuxTracks;
+ bool showSyntiTracks;
+
+ void write(Xml&, const char* name);
+ void read(QDomNode);
+ };
+
+//---------------------------------------------------------
+// GlobalConfigValues
+//---------------------------------------------------------
+
+struct GlobalConfigValues {
+ QColor palette[16];
+ QColor partColors[NUM_PARTCOLORS];
+ QColor selectPartBg;
+ QColor transportHandleColor;
+ QColor bigTimeForegroundColor;
+ QColor bigTimeBackgroundColor;
+ QColor waveEditBackgroundColor;
+ QFont* fonts[6];
+
+ QColor trackBg[Track::TRACK_TYPES];
+
+ QColor mixerBg;
+
+ int division;
+ int rtcTicks;
+ int minMeter;
+ double minSlider;
+ int guiRefresh;
+ int peakHoldTime; // peak meter hold time (ms)
+ QString helpBrowser;
+
+ bool extendedMidi; // extended smf format
+ int midiDivision; // division for smf export
+ QString copyright; // copyright string for smf export
+ int smfFormat; // smf export file type
+
+ int startMode; // 0 - start with last song
+ // 1 - start with default template
+ // 2 - start with song
+ QString startSong; // path for start song
+ int guiDivision; // division for tick display
+
+ QRect geometryMain;
+ QRect geometryTransport;
+ QRect geometryBigTime;
+ QRect geometryPianoroll;
+ QRect geometryDrumedit;
+ MixerConfig mixer1;
+ MixerConfig mixer2;
+ bool transportVisible;
+ bool bigTimeVisible;
+ bool mixer1Visible;
+ bool mixer2Visible;
+
+ bool showSplashScreen;
+
+ QColor canvasBgColor;
+ QString canvasBgPixmap;
+ bool canvasUseBgPixmap;
+
+ int canvasShowPartType; // 1 - names, 2 events
+ int canvasShowPartEvent; //
+ bool canvasShowGrid;
+
+ QString style;
+
+ bool useJackFreewheelMode;
+ QString externalWavEditor;
+
+ QString defaultMidiInputDevice;
+ QString defaultMidiOutputDevice;
+ QString defaultMidiInstrument;
+ bool connectToAllMidiDevices;
+ bool connectToAllMidiTracks;
+ bool createDefaultMidiInput;
+ };
+
+extern GlobalConfigValues config;
+
+#endif
+
diff --git a/muse/muse/genset.cpp b/muse/muse/genset.cpp
new file mode 100644
index 00000000..49950694
--- /dev/null
+++ b/muse/muse/genset.cpp
@@ -0,0 +1,475 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "genset.h"
+#include "muse.h"
+#include "gconfig.h"
+#include "audio.h"
+#include "globals.h"
+#include "mixer/mixer.h"
+#include "icons.h"
+#include "song.h"
+#include "midirc.h"
+#include "driver/alsamidi.h"
+#include "instruments/minstrument.h"
+#include "midiedit/pianoroll.h"
+#include "midiedit/drumedit.h"
+
+static int rtcResolutions[] = {
+ 1024, 2048, 4096, 8192
+ };
+static int divisions[] = {
+ 48, 96, 192, 384, 768, 1536, 3072, 6144, 12288
+ };
+
+//---------------------------------------------------------
+// GlobalSettingsConfig
+//---------------------------------------------------------
+
+GlobalSettingsConfig::GlobalSettingsConfig(QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ for (unsigned i = 0; i < sizeof(rtcResolutions)/sizeof(*rtcResolutions); ++i) {
+ if (rtcResolutions[i] == config.rtcTicks) {
+ rtcResolutionSelect->setCurrentIndex(i);
+ break;
+ }
+ }
+ for (unsigned i = 0; i < sizeof(divisions)/sizeof(*divisions); ++i) {
+ if (divisions[i] == config.division) {
+ midiDivisionSelect->setCurrentIndex(i);
+ break;
+ }
+ }
+ std::list<PortName>* ol = midiDriver->inputPorts();
+ int i = 0;
+ for (std::list<PortName>::iterator ip = ol->begin(); ip != ol->end(); ++ip, ++i) {
+ preferredInput->addItem(ip->name);
+ if (ip->name == config.defaultMidiInputDevice)
+ preferredInput->setCurrentIndex(i);
+ }
+ ol = midiDriver->outputPorts();
+ i = 0;
+ for (std::list<PortName>::iterator ip = ol->begin(); ip != ol->end(); ++ip, ++i) {
+ preferredOutput->addItem(ip->name);
+ if (ip->name == config.defaultMidiOutputDevice)
+ preferredOutput->setCurrentIndex(i);
+ }
+
+ i = 0;
+ for (iMidiInstrument mi = midiInstruments.begin(); mi != midiInstruments.end(); ++mi, ++i) {
+ preferredInstrument->addItem((*mi)->iname());
+ if ((*mi)->iname() == config.defaultMidiInstrument)
+ preferredInstrument->setCurrentIndex(i);
+ }
+
+ connectToAllDevices->setChecked(config.connectToAllMidiDevices);
+ connectToAllTracks->setChecked(config.connectToAllMidiTracks);
+ createDefaultInput->setChecked(config.createDefaultMidiInput);
+
+ guiRefreshSelect->setValue(config.guiRefresh);
+ minSliderSelect->setValue(int(config.minSlider));
+ minMeterSelect->setValue(config.minMeter);
+ peakHoldTime->setValue(config.peakHoldTime);
+ helpBrowser->setText(config.helpBrowser);
+ startSongEntry->setText(config.startSong);
+
+ startSongGroup = new QButtonGroup(this);
+ startSongGroup->addButton(startLast);
+ startSongGroup->addButton(startTemplate);
+ startSongGroup->addButton(startSong);
+
+ switch(config.startMode) {
+ case 0: startLast->setChecked(true); break;
+ case 1: startTemplate->setChecked(true); break;
+ case 2: startSong->setChecked(true); break;
+ }
+
+ showTransport->setChecked(config.transportVisible);
+ showBigtime->setChecked(config.bigTimeVisible);
+ showMixer1->setChecked(config.mixer1Visible);
+ showMixer2->setChecked(config.mixer2Visible);
+
+ arrangerX->setValue(config.geometryMain.x());
+ arrangerY->setValue(config.geometryMain.y());
+ arrangerW->setValue(config.geometryMain.width());
+ arrangerH->setValue(config.geometryMain.height());
+
+ transportX->setValue(config.geometryTransport.x());
+ transportY->setValue(config.geometryTransport.y());
+
+ bigtimeX->setValue(config.geometryBigTime.x());
+ bigtimeY->setValue(config.geometryBigTime.y());
+ bigtimeW->setValue(config.geometryBigTime.width());
+ bigtimeH->setValue(config.geometryBigTime.height());
+
+ mixerX1->setValue(config.mixer1.geometry.x());
+ mixerY1->setValue(config.mixer1.geometry.y());
+ mixerW1->setValue(config.mixer1.geometry.width());
+ mixerH1->setValue(config.mixer1.geometry.height());
+
+ mixerX2->setValue(config.mixer2.geometry.x());
+ mixerY2->setValue(config.mixer2.geometry.y());
+ mixerW2->setValue(config.mixer2.geometry.width());
+ mixerH2->setValue(config.mixer2.geometry.height());
+
+ setMixerCurrent1->setEnabled(muse->mixer1Window());
+ setMixerCurrent1->setEnabled(muse->mixer2Window());
+
+ setBigtimeCurrent->setEnabled(muse->bigtimeWindow());
+ setTransportCurrent->setEnabled(muse->transportWindow());
+ freewheelMode->setChecked(config.useJackFreewheelMode);
+ showSplash->setChecked(config.showSplashScreen);
+
+ stopActive->setChecked(midiRCList.isActive(RC_STOP));
+ playActive->setChecked(midiRCList.isActive(RC_PLAY));
+ gotoLeftMarkActive->setChecked(midiRCList.isActive(RC_GOTO_LEFT_MARK));
+ recordActive->setChecked(midiRCList.isActive(RC_RECORD));
+
+ connect(applyButton, SIGNAL(clicked()), SLOT(apply()));
+ connect(okButton, SIGNAL(clicked()), SLOT(ok()));
+ connect(cancelButton, SIGNAL(clicked()), SLOT(cancel()));
+ connect(setMixerCurrent1, SIGNAL(clicked()), SLOT(mixerCurrent1()));
+ connect(setMixerCurrent2, SIGNAL(clicked()), SLOT(mixerCurrent2()));
+ connect(setBigtimeCurrent, SIGNAL(clicked()), SLOT(bigtimeCurrent()));
+ connect(setArrangerCurrent, SIGNAL(clicked()), SLOT(arrangerCurrent()));
+ connect(setTransportCurrent, SIGNAL(clicked()), SLOT(transportCurrent()));
+
+ recordStop->setChecked(false);
+ recordRecord->setChecked(false);
+ recordGotoLeftMark->setChecked(false);
+ recordPlay->setChecked(false);
+ rcGroup->setChecked(rcEnable);
+
+ pianorollWidth->setValue(PianoRoll::initWidth);
+ pianorollHeight->setValue(PianoRoll::initHeight);
+ pianorollRaster->setRaster(PianoRoll::initRaster);
+ pianorollQuant->setQuant(PianoRoll::initQuant);
+
+ drumEditorWidth->setValue(DrumEdit::initWidth);
+ drumEditorHeight->setValue(DrumEdit::initHeight);
+
+ connect(recordStop, SIGNAL(clicked(bool)), SLOT(recordStopToggled(bool)));
+ connect(recordRecord, SIGNAL(clicked(bool)), SLOT(recordRecordToggled(bool)));
+ connect(recordGotoLeftMark, SIGNAL(clicked(bool)), SLOT(recordGotoLeftMarkToggled(bool)));
+ connect(recordPlay, SIGNAL(clicked(bool)), SLOT(recordPlayToggled(bool)));
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::apply()
+ {
+ rcEnable = rcGroup->isChecked();
+ int rtcticks = rtcResolutionSelect->currentIndex();
+ int div = midiDivisionSelect->currentIndex();
+
+ config.connectToAllMidiDevices = connectToAllDevices->isChecked();
+ config.connectToAllMidiTracks = connectToAllTracks->isChecked();
+ config.createDefaultMidiInput = createDefaultInput->isChecked();
+ config.defaultMidiInputDevice = preferredInput->currentText();
+ config.defaultMidiOutputDevice = preferredOutput->currentText();
+ config.defaultMidiInstrument = preferredInstrument->currentText();
+
+ config.guiRefresh = guiRefreshSelect->value();
+ config.minSlider = minSliderSelect->value();
+ config.minMeter = minMeterSelect->value();
+ config.peakHoldTime = peakHoldTime->value();
+ config.rtcTicks = rtcResolutions[rtcticks];
+ config.guiDivision = divisions[div];
+ config.helpBrowser = helpBrowser->text();
+ config.startSong = startSongEntry->text();
+
+ if (startLast->isChecked())
+ config.startMode = 0;
+ else if (startTemplate->isChecked())
+ config.startMode = 1;
+ else if (startSong->isChecked())
+ config.startMode = 2;
+
+ config.transportVisible = showTransport->isChecked();
+ config.bigTimeVisible = showBigtime->isChecked();
+ config.mixer1Visible = showMixer1->isChecked();
+ config.mixer2Visible = showMixer2->isChecked();
+
+ config.geometryMain.setX(arrangerX->value());
+ config.geometryMain.setY(arrangerY->value());
+ config.geometryMain.setWidth(arrangerW->value());
+ config.geometryMain.setHeight(arrangerH->value());
+
+ config.geometryTransport.setX(transportX->value());
+ config.geometryTransport.setY(transportY->value());
+ config.geometryTransport.setWidth(0);
+ config.geometryTransport.setHeight(0);
+
+ config.geometryBigTime.setX(bigtimeX->value());
+ config.geometryBigTime.setY(bigtimeY->value());
+ config.geometryBigTime.setWidth(bigtimeW->value());
+ config.geometryBigTime.setHeight(bigtimeH->value());
+
+ config.mixer1.geometry.setX(mixerX1->value());
+ config.mixer1.geometry.setY(mixerY1->value());
+ config.mixer1.geometry.setWidth(mixerW1->value());
+ config.mixer1.geometry.setHeight(mixerH1->value());
+
+ config.mixer2.geometry.setX(mixerX2->value());
+ config.mixer2.geometry.setY(mixerY2->value());
+ config.mixer2.geometry.setWidth(mixerW2->value());
+ config.mixer2.geometry.setHeight(mixerH2->value());
+
+ config.useJackFreewheelMode = freewheelMode->isChecked();
+ config.showSplashScreen = showSplash->isChecked();
+
+ PianoRoll::initWidth = pianorollWidth->value();
+ PianoRoll::initHeight = pianorollHeight->value();
+ PianoRoll::initRaster = pianorollRaster->raster();
+ PianoRoll::initQuant = pianorollQuant->quant();
+
+ DrumEdit::initWidth = drumEditorWidth->value();
+ DrumEdit::initHeight = drumEditorHeight->value();
+
+ muse->showMixer1(config.mixer1Visible);
+ muse->showMixer2(config.mixer2Visible);
+ muse->showBigtime(config.bigTimeVisible);
+ muse->showTransport(config.transportVisible);
+ QWidget* w = muse->transportWindow();
+ if (w) {
+ w->resize(config.geometryTransport.size());
+ w->move(config.geometryTransport.topLeft());
+ }
+ w = muse->mixer1Window();
+ if (w) {
+ w->resize(config.mixer1.geometry.size());
+ w->move(config.mixer1.geometry.topLeft());
+ }
+ w = muse->mixer2Window();
+ if (w) {
+ w->resize(config.mixer2.geometry.size());
+ w->move(config.mixer2.geometry.topLeft());
+ }
+ w = muse->bigtimeWindow();
+ if (w) {
+ w->resize(config.geometryBigTime.size());
+ w->move(config.geometryBigTime.topLeft());
+ }
+
+ muse->resize(config.geometryMain.size());
+ muse->move(config.geometryMain.topLeft());
+
+ muse->setHeartBeat(); // set guiRefresh
+ audio->msgSetRtc(); // set midi tick rate
+ muse->changeConfig(true); // save settings
+ }
+
+//---------------------------------------------------------
+// ok
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::ok()
+ {
+ apply();
+ close();
+ }
+
+//---------------------------------------------------------
+// cancel
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::cancel()
+ {
+ close();
+ }
+
+//---------------------------------------------------------
+// mixerCurrent1
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::mixerCurrent1()
+ {
+ QWidget* w = muse->mixer1Window();
+ if (!w)
+ return;
+ QRect r(w->frameGeometry());
+ mixerX1->setValue(r.x());
+ mixerY1->setValue(r.y());
+ mixerW1->setValue(r.width());
+ mixerH1->setValue(r.height());
+ }
+
+//---------------------------------------------------------
+// mixerCurrent2
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::mixerCurrent2()
+ {
+ QWidget* w = muse->mixer2Window();
+ if (!w)
+ return;
+ QRect r(w->frameGeometry());
+ mixerX2->setValue(r.x());
+ mixerY2->setValue(r.y());
+ mixerW2->setValue(r.width());
+ mixerH2->setValue(r.height());
+ }
+
+//---------------------------------------------------------
+// bigtimeCurrent
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::bigtimeCurrent()
+ {
+ QWidget* w = muse->bigtimeWindow();
+ if (!w)
+ return;
+ QRect r(w->frameGeometry());
+ bigtimeX->setValue(r.x());
+ bigtimeY->setValue(r.y());
+ bigtimeW->setValue(r.width());
+ bigtimeH->setValue(r.height());
+ }
+
+//---------------------------------------------------------
+// arrangerCurrent
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::arrangerCurrent()
+ {
+ QRect r(muse->frameGeometry());
+ arrangerX->setValue(r.x());
+ arrangerY->setValue(r.y());
+ arrangerW->setValue(r.width());
+ arrangerH->setValue(r.height());
+ }
+
+//---------------------------------------------------------
+// transportCurrent
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::transportCurrent()
+ {
+ QWidget* w = muse->transportWindow();
+ if (!w)
+ return;
+ QRect r(w->frameGeometry());
+ transportX->setValue(r.x());
+ transportY->setValue(r.y());
+ }
+
+//---------------------------------------------------------
+// recordStopToggled
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::recordStopToggled(bool f)
+ {
+ recordStop->setChecked(!f);
+ if (!f) {
+ recordRecord->setChecked(false);
+ recordGotoLeftMark->setChecked(false);
+ recordPlay->setChecked(false);
+ connect(song, SIGNAL(midiEvent(MidiEvent)), SLOT(midiEventReceived(MidiEvent)));
+ }
+ else
+ disconnect(song, SIGNAL(midiEvent(MidiEvent)), this, SLOT(midiEventReceived(MidiEvent)));
+ }
+
+//---------------------------------------------------------
+// recordRecordToggled
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::recordRecordToggled(bool f)
+ {
+ recordRecord->setChecked(!f);
+ if (!f) {
+ recordStop->setChecked(false);
+ recordGotoLeftMark->setChecked(false);
+ recordPlay->setChecked(false);
+ connect(song, SIGNAL(midiEvent(MidiEvent)), SLOT(midiEventReceived(MidiEvent)));
+ }
+ else
+ disconnect(song, SIGNAL(midiEvent(MidiEvent)), this, SLOT(midiEventReceived(MidiEvent)));
+ }
+
+//---------------------------------------------------------
+// recordGotoLeftMarkToggled
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::recordGotoLeftMarkToggled(bool f)
+ {
+ recordGotoLeftMark->setChecked(!f);
+ if (!f) {
+ recordStop->setChecked(false);
+ recordRecord->setChecked(false);
+ recordPlay->setChecked(false);
+ connect(song, SIGNAL(midiEvent(MidiEvent)), SLOT(midiEventReceived(MidiEvent)));
+ }
+ else
+ disconnect(song, SIGNAL(midiEvent(MidiEvent)), this, SLOT(midiEventReceived(MidiEvent)));
+ }
+
+//---------------------------------------------------------
+// recordPlayToggled
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::recordPlayToggled(bool f)
+ {
+ recordPlay->setChecked(!f);
+ if (!f) {
+ recordStop->setChecked(false);
+ recordRecord->setChecked(false);
+ recordGotoLeftMark->setChecked(false);
+ connect(song, SIGNAL(midiEvent(MidiEvent)), SLOT(midiEventReceived(MidiEvent)));
+ }
+ else
+ disconnect(song, SIGNAL(midiEvent(MidiEvent)), this, SLOT(midiEventReceived(MidiEvent)));
+ }
+
+//---------------------------------------------------------
+// midiEventReceived
+//---------------------------------------------------------
+
+void GlobalSettingsConfig::midiEventReceived(MidiEvent event)
+ {
+ printf("event received\n");
+ if (recordPlay->isChecked()) {
+ recordPlay->setChecked(false);
+ playActive->setChecked(true);
+ midiRCList.setAction(event, RC_PLAY);
+ }
+ else if (recordStop->isChecked()) {
+ recordStop->setChecked(false);
+ stopActive->setChecked(true);
+ midiRCList.setAction(event, RC_STOP);
+ }
+ else if (recordRecord->isChecked()) {
+ recordRecord->setChecked(false);
+ recordActive->setChecked(true);
+ midiRCList.setAction(event, RC_RECORD);
+ }
+ else if (recordGotoLeftMark->isChecked()) {
+ recordGotoLeftMark->setChecked(false);
+ gotoLeftMarkActive->setChecked(true);
+ midiRCList.setAction(event, RC_GOTO_LEFT_MARK);
+ }
+ // only one shot
+ disconnect(song, SIGNAL(midiEvent(MidiEvent)), this, SLOT(midiEventReceived(MidiEvent)));
+ }
+
diff --git a/muse/muse/genset.h b/muse/muse/genset.h
new file mode 100644
index 00000000..6eb602f0
--- /dev/null
+++ b/muse/muse/genset.h
@@ -0,0 +1,56 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __GENSET_H__
+#define __GENSET_H__
+
+#include "ui_genset.h"
+#include "event.h"
+#include "mpevent.h"
+
+//---------------------------------------------------------
+// GlobalSettingsConfig
+//---------------------------------------------------------
+
+class GlobalSettingsConfig : public QDialog, Ui::GlobalSettingsDialogBase {
+ Q_OBJECT
+
+ QButtonGroup* startSongGroup;
+
+ private slots:
+ void apply();
+ void ok();
+ void cancel();
+ void mixerCurrent1();
+ void mixerCurrent2();
+ void bigtimeCurrent();
+ void arrangerCurrent();
+ void transportCurrent();
+ void recordStopToggled(bool);
+ void recordRecordToggled(bool);
+ void recordGotoLeftMarkToggled(bool);
+ void recordPlayToggled(bool);
+ void midiEventReceived(MidiEvent);
+
+ public:
+ GlobalSettingsConfig(QWidget* parent=0);
+ };
+
+#endif
diff --git a/muse/muse/genset.ui b/muse/muse/genset.ui
new file mode 100644
index 00000000..c391fb05
--- /dev/null
+++ b/muse/muse/genset.ui
@@ -0,0 +1,1320 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>GlobalSettingsDialogBase</class>
+ <widget class="QDialog" name="GlobalSettingsDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>596</width>
+ <height>562</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Dialog</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget" >
+ <widget class="QWidget" name="tab" >
+ <attribute name="title" >
+ <string>Application</string>
+ </attribute>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string>Start MusE</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>start song</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="startSongEntry" />
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="startSongGroup" >
+ <property name="title" >
+ <string/>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="startLast" >
+ <property name="text" >
+ <string>start with last song</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="startTemplate" >
+ <property name="text" >
+ <string>start with template: default.med</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="startSong" >
+ <property name="text" >
+ <string>start with song</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="showSplash" >
+ <property name="text" >
+ <string>show splash screen</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2" >
+ <property name="title" >
+ <string>Views</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="3" column="6" >
+ <widget class="QPushButton" name="setMixerCurrent1" >
+ <property name="text" >
+ <string>Cur</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QCheckBox" name="showMixer1" >
+ <property name="text" >
+ <string>show</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>Mixer 1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="text" >
+ <string>Big Time</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="6" >
+ <widget class="QPushButton" name="setTransportCurrent" >
+ <property name="text" >
+ <string>Cur</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="6" >
+ <widget class="QPushButton" name="setMixerCurrent2" >
+ <property name="text" >
+ <string>Cur</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="6" >
+ <widget class="QPushButton" name="setArrangerCurrent" >
+ <property name="text" >
+ <string>Cur</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="5" >
+ <widget class="QSpinBox" name="mixerH2" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="4" >
+ <widget class="QSpinBox" name="mixerW2" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="5" >
+ <widget class="QSpinBox" name="mixerH1" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4" >
+ <widget class="QSpinBox" name="mixerW1" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="5" >
+ <widget class="QSpinBox" name="bigtimeH" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4" >
+ <widget class="QSpinBox" name="bigtimeW" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5" >
+ <widget class="QSpinBox" name="arrangerH" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="arrangerW" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3" >
+ <widget class="QSpinBox" name="mixerY2" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" >
+ <widget class="QSpinBox" name="mixerY1" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QSpinBox" name="bigtimeY" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QSpinBox" name="transportY" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="arrangerY" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2" >
+ <widget class="QSpinBox" name="mixerX1" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="mixerX2" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="bigtimeX" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSpinBox" name="transportX" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="arrangerX" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QCheckBox" name="showMixer2" >
+ <property name="text" >
+ <string>show</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QCheckBox" name="showTransport" >
+ <property name="text" >
+ <string>show</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="label_6" >
+ <property name="text" >
+ <string>Mixer 2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>Transport</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Arranger</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QCheckBox" name="showBigtime" >
+ <property name="text" >
+ <string>show</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="6" >
+ <widget class="QPushButton" name="setBigtimeCurrent" >
+ <property name="text" >
+ <string>Cur</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_5" >
+ <attribute name="title" >
+ <string>Editors</string>
+ </attribute>
+ <widget class="QTabWidget" name="tabWidget2" >
+ <property name="geometry" >
+ <rect>
+ <x>9</x>
+ <y>9</y>
+ <width>556</width>
+ <height>457</height>
+ </rect>
+ </property>
+ <widget class="QWidget" name="tab_6" >
+ <attribute name="title" >
+ <string>Pianoroll</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="3" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>211</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_25" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Quant&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_24" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Raster&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_21" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Geometry&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="label_23" >
+ <property name="text" >
+ <string>height:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="label_22" >
+ <property name="text" >
+ <string>width:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="pianorollHeight" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ <property name="minimum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="pianorollWidth" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ <property name="minimum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QuantCombo" name="pianorollQuant" />
+ </item>
+ <item row="1" column="1" >
+ <widget class="RasterCombo" name="pianorollRaster" />
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_7" >
+ <attribute name="title" >
+ <string>DrumEditor</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>351</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_27" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Geometry&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="drumEditorWidth" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ <property name="minimum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="label_28" >
+ <property name="text" >
+ <string>width:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="drumEditorHeight" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ <property name="minimum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="label_26" >
+ <property name="text" >
+ <string>height:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_8" >
+ <attribute name="title" >
+ <string>MasterEditor</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>331</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="masterEditorHeight" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ <property name="minimum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="label_30" >
+ <property name="text" >
+ <string>height:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="masterEditorWidth" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ <property name="minimum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="label_29" >
+ <property name="text" >
+ <string>width:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_31" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Geometry&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_9" >
+ <attribute name="title" >
+ <string>WaveEditor</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="waveEditorHeight" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ <property name="minimum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="label_34" >
+ <property name="text" >
+ <string>height:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="label_32" >
+ <property name="text" >
+ <string>width:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_33" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;">Geometry&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="waveEditorWidth" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ <property name="minimum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>351</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QWidget" name="tab_1" >
+ <attribute name="title" >
+ <string>Audio</string>
+ </attribute>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="groupBox_4" >
+ <property name="title" >
+ <string>Mixer</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="peakHoldTime" >
+ <property name="suffix" >
+ <string>ms</string>
+ </property>
+ <property name="maximum" >
+ <number>5000</number>
+ </property>
+ <property name="minimum" >
+ <number>20</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="label_20" >
+ <property name="text" >
+ <string>Peak Hold Time:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="minMeterSelect" >
+ <property name="suffix" >
+ <string>dB</string>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-100</number>
+ </property>
+ <property name="singleStep" >
+ <number>10</number>
+ </property>
+ <property name="value" >
+ <number>-60</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="minSliderSelect" >
+ <property name="suffix" >
+ <string>dB</string>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-100</number>
+ </property>
+ <property name="value" >
+ <number>-60</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_8" >
+ <property name="text" >
+ <string>min. Meter Val</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_7" >
+ <property name="text" >
+ <string>min. Slider Val</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="freewheelMode" >
+ <property name="text" >
+ <string>use JACK freewheel mode if possible</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_2" >
+ <attribute name="title" >
+ <string>Midi</string>
+ </attribute>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="groupBox_5" >
+ <property name="title" >
+ <string>Ticks</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_10" >
+ <property name="text" >
+ <string>Displayed Resolution
+(Ticks/Quarternote)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_9" >
+ <property name="text" >
+ <string>RTC Resolution
+(Ticks/Sec)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QComboBox" name="rtcResolutionSelect" >
+ <item>
+ <property name="text" >
+ <string>1024</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>2048</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>4096</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>8172</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="midiDivisionSelect" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <item>
+ <property name="text" >
+ <string>48</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>96</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>192</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>384</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>768</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>1536</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>3072</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>6144</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>12288</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_3" >
+ <property name="title" >
+ <string>Input Routing</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="1" >
+ <widget class="QCheckBox" name="connectToAllTracks" >
+ <property name="text" >
+ <string>Connect to all Tracks</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QCheckBox" name="connectToAllDevices" >
+ <property name="text" >
+ <string>Connect to all Input Devices</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_17" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Preferred Input Device:&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QComboBox" name="preferredInput" />
+ </item>
+ <item row="0" column="0" >
+ <widget class="QCheckBox" name="createDefaultInput" >
+ <property name="text" >
+ <string>Create Default Input Strip</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_6" >
+ <property name="title" >
+ <string>Output Routing</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>8</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_18" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Preferred Output Device:&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2" >
+ <widget class="QComboBox" name="preferredInstrument" />
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="label_19" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Preferred Instrument:&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QComboBox" name="preferredOutput" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_3" >
+ <attribute name="title" >
+ <string>GUI</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLineEdit" name="helpBrowser" />
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_12" >
+ <property name="text" >
+ <string>Help Browser</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="guiRefreshSelect" >
+ <property name="suffix" >
+ <string>/sec</string>
+ </property>
+ <property name="maximum" >
+ <number>100</number>
+ </property>
+ <property name="minimum" >
+ <number>2</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_11" >
+ <property name="text" >
+ <string>GUI Refresh Rate:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_4" >
+ <attribute name="title" >
+ <string>RemoteControl</string>
+ </attribute>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="rcGroup" >
+ <property name="title" >
+ <string>Midi Remote Control</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_14" >
+ <property name="text" >
+ <string>Record</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_15" >
+ <property name="text" >
+ <string>Goto Left Mark</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_13" >
+ <property name="text" >
+ <string>Stop</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_16" >
+ <property name="text" >
+ <string>Play</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="RecordButton" name="recordStop" />
+ </item>
+ <item row="1" column="2" >
+ <widget class="RecordButton" name="recordRecord" />
+ </item>
+ <item row="2" column="2" >
+ <widget class="RecordButton" name="recordGotoLeftMark" />
+ </item>
+ <item row="3" column="2" >
+ <widget class="RecordButton" name="recordPlay" />
+ </item>
+ <item row="0" column="1" >
+ <widget class="GreendotButton" name="stopActive" />
+ </item>
+ <item row="1" column="1" >
+ <widget class="GreendotButton" name="recordActive" />
+ </item>
+ <item row="2" column="1" >
+ <widget class="GreendotButton" name="gotoLeftMarkActive" />
+ </item>
+ <item row="3" column="1" >
+ <widget class="GreendotButton" name="playActive" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>131</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="applyButton" >
+ <property name="text" >
+ <string>Apply</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>RecordButton</class>
+ <extends>QToolButton</extends>
+ <header>recordbutton.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>GreendotButton</class>
+ <extends>QToolButton</extends>
+ <header>greendotbutton.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>RasterCombo</class>
+ <extends>QComboBox</extends>
+ <header>rastercombo.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>QuantCombo</class>
+ <extends>QComboBox</extends>
+ <header>quantcombo.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GlobalSettingsDialogBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>278</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>96</x>
+ <y>254</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GlobalSettingsDialogBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>369</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>179</x>
+ <y>282</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/globaldefs.h b/muse/muse/globaldefs.h
new file mode 100644
index 00000000..0215859a
--- /dev/null
+++ b/muse/muse/globaldefs.h
@@ -0,0 +1,39 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __GLOBALDEFS_H__
+#define __GLOBALDEFS_H__
+
+const int MAX_CHANNELS = 2; // max audio channels
+const int MAX_PLUGINS = 4; // plugins in mixer rack
+
+const int MIDI_PORTS = 16; // max Number of Midi Ports
+
+#ifndef MIDI_CHANNELS
+#define MIDI_CHANNELS 16 // Channels per Port
+
+enum MidiInstrumentType {
+ MT_GENERIC, MT_GM, MT_GS, MT_XG
+ };
+
+#endif
+
+#endif
+
diff --git a/muse/muse/globals.cpp b/muse/muse/globals.cpp
new file mode 100644
index 00000000..54f3665f
--- /dev/null
+++ b/muse/muse/globals.cpp
@@ -0,0 +1,147 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "globals.h"
+enum AudioState audioState;
+
+unsigned segmentSize = 1024U; // segmentSize in frames (set by JACK)
+int segmentCount = 2;
+
+bool overrideAudioOutput = false;
+bool overrideAudioInput = false;
+
+QTimer* heartBeatTimer;
+
+const signed char sharpTab[14][7] = {
+ { 0, 3, -1, 2, 5, 1, 4 },
+ { 0, 3, -1, 2, 5, 1, 4 },
+ { 0, 3, -1, 2, 5, 1, 4 },
+ { 0, 3, -1, 2, 5, 1, 4 },
+ { 2, 5, 1, 4, 7, 3, 6 },
+ { 2, 5, 1, 4, 7, 3, 6 },
+ { 2, 5, 1, 4, 7, 3, 6 },
+ { 4, 0, 3, -1, 2, 5, 1 },
+ { 7, 3, 6, 2, 5, 1, 4 },
+ { 5, 8, 4, 7, 3, 6, 2 },
+ { 3, 6, 2, 5, 1, 4, 7 },
+ { 1, 4, 0, 3, 6, 2, 5 },
+ { 6, 2, 5, 1, 4, 0, 3 },
+ { 0, 3, -1, 2, 5, 1, 4 },
+ };
+const signed char flatTab[14][7] = {
+ { 4, 1, 5, 2, 6, 3, 7 },
+ { 4, 1, 5, 2, 6, 3, 7 },
+ { 4, 1, 5, 2, 6, 3, 7 },
+ { 4, 1, 5, 2, 6, 3, 7 },
+ { 6, 3, 7, 4, 8, 5, 9 },
+ { 6, 3, 7, 4, 8, 5, 9 },
+ { 6, 3, 7, 4, 8, 5, 9 },
+
+ { 1, 5, 2, 6, 3, 7, 4 },
+ { 4, 1, 5, 2, 6, 3, 7 },
+ { 2, 6, 3, 7, 4, 8, 5 },
+ { 7, 4, 1, 5, 2, 6, 3 },
+ { 5, 2, 6, 3, 7, 4, 8 },
+ { 3, 0, 4, 1, 5, 2, 6 },
+ { 4, 1, 5, 2, 6, 3, 7 },
+ };
+
+QString museGlobalLib;
+QString museGlobalShare;
+QString museUser;
+QString museProject;
+QString museProjectInitPath("./");
+QString configName;
+
+QString lastWavePath(".");
+QString lastMidiPath(".");
+
+bool debugMode = false;
+bool debugMsg = false;
+bool midiInputTrace = false;
+bool midiOutputTrace = false;
+int realTimePriority = 50;
+bool loadPlugins = true;
+bool loadVST = true;
+bool loadDSSI = true;
+bool midiOnly = false;
+
+const char* midi_file_pattern[] = {
+ "Midi/Kar (*.mid *.MID *.kar *.KAR *.mid.gz *.mid.bz2)",
+ "Midi (*.mid *.MID *.mid.gz *.mid.bz2)",
+ "Karaoke (*.kar *.KAR *.kar.gz *.kar.bz2)",
+ "All Files (*)",
+ 0
+ };
+QString medFilePattern =
+ "med Files (*.med *.med.gz *.med.bz2);;"
+ "All Files (*)";
+
+const char* med_midi_file_pattern[] = {
+ "med Files (*.med *.med.gz *.med.bz2)",
+ "Midi/Kar (*.mid *.kar *.mid.gz *.mid.bz2)",
+ "Midi (*.mid *.mid.gz *.mid.bz2)",
+ "Karaoke (*.kar *.kar.gz *.kar.bz2)",
+ "All Files (*)",
+ 0
+ };
+const char* med_file_pattern[] = {
+ "med Files (*.med *.med.gz *.med.bz2)",
+ "All Files (*)",
+ 0
+ };
+const char* image_file_pattern[] = {
+ "(*.jpg *.gif *.png)",
+ "(*.jpg)",
+ "(*.gif)",
+ "(*.png)",
+ "All Files (*)",
+ 0
+ };
+
+const char* ctrl_file_pattern[] = {
+ "ctrl Files (*.ctrl *.ctrl.gz *.ctrl.bz2)",
+ "All Files (*)",
+ 0
+ };
+
+QAction* undoAction;
+QAction* redoAction;
+
+QAction* loopAction;
+QAction* punchinAction;
+QAction* punchoutAction;
+QAction* recordAction;
+QAction* panicAction;
+
+int preMeasures = 2;
+bool precountEnableFlag = false;
+bool precountFromMastertrackFlag = false;
+int precountSigZ = 4;
+int precountSigN = 4;
+bool precountPrerecord = false;
+bool precountPreroll = false;
+bool midiClickFlag = true;
+bool audioClickFlag = true;
+float audioClickVolume = 0.1f;
+
+bool rcEnable = false;
+bool midiSeqRunning = false;
+
diff --git a/muse/muse/globals.h b/muse/muse/globals.h
new file mode 100644
index 00000000..ddd1a377
--- /dev/null
+++ b/muse/muse/globals.h
@@ -0,0 +1,101 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef GLOBALS_H
+#define GLOBALS_H
+
+#include <sys/types.h>
+#include "mtc.h"
+
+enum AudioState {
+ AUDIO_STOP,
+ AUDIO_START1,
+ AUDIO_START2,
+ AUDIO_RUNNING
+ };
+extern enum AudioState audioState;
+
+extern unsigned segmentSize;
+extern int segmentCount;
+
+extern bool overrideAudioOutput;
+extern bool overrideAudioInput;
+
+class QTimer;
+extern QTimer* heartBeatTimer;
+
+extern const signed char sharpTab[14][7];
+extern const signed char flatTab[14][7];
+
+extern QString museGlobalLib;
+extern QString museGlobalShare;
+extern QString museUser;
+extern QString museProject; // current project directory
+extern QString museProjectInitPath;
+extern QString configName;
+
+extern QString lastWavePath;
+extern QString lastMidiPath;
+
+extern bool debugMode;
+extern bool midiInputTrace;
+extern bool midiOutputTrace;
+extern bool debugMsg;
+extern bool debugSync;
+extern bool loadPlugins;
+extern bool loadVST;
+extern bool loadDSSI;
+extern bool midiOnly;
+
+extern int realTimePriority;
+extern const char* midi_file_pattern[];
+extern QString medFilePattern;
+extern const char* med_file_pattern[];
+extern const char* med_midi_file_pattern[];
+extern const char* image_file_pattern[];
+extern const char* ctrl_file_pattern[];
+
+#define CMD_RANGE_ALL 0
+#define CMD_RANGE_SELECTED 1
+#define CMD_RANGE_LOOP 2
+
+extern QAction* undoAction;
+extern QAction* redoAction;
+
+extern QAction* loopAction;
+extern QAction* punchinAction;
+extern QAction* punchoutAction;
+extern QAction* recordAction;
+extern QAction* panicAction;
+
+extern int preMeasures;
+extern bool precountEnableFlag;
+extern bool precountFromMastertrackFlag;
+extern int precountSigZ;
+extern int precountSigN;
+extern bool precountPrerecord;
+extern bool precountPreroll;
+extern bool midiClickFlag;
+extern bool audioClickFlag;
+extern float audioClickVolume;
+
+extern bool rcEnable;
+#endif
+
diff --git a/muse/muse/gui.h b/muse/muse/gui.h
new file mode 100644
index 00000000..2c5fca3c
--- /dev/null
+++ b/muse/muse/gui.h
@@ -0,0 +1,49 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __GUI_H__
+#define __GUI_H__
+
+//
+// GUI constants
+// central point of tweaking the gui
+//
+
+// size of horizontal and vertical splitter
+//
+static const int splitWidth = 6;
+
+// arranger:
+static const int trackRowHeight = 24;
+static const int minTrackHeight = trackRowHeight + splitWidth + 1;
+static const int defaultTrackHeight = minTrackHeight;
+static const int infoHeight = 20;
+static const int infoWidth = 140;
+
+// mixer:
+static const int STRIP_WIDTH = 66;
+static const int LABEL_HEIGHT = 20;
+
+static const QSize ICON_SIZE(18, 18);
+
+#endif
+
+
+
diff --git a/muse/muse/help.cpp b/muse/muse/help.cpp
new file mode 100644
index 00000000..6dd13e01
--- /dev/null
+++ b/muse/muse/help.cpp
@@ -0,0 +1,112 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "muse.h"
+#include "globals.h"
+#include "gconfig.h"
+#include "icons.h"
+#include "help.h"
+
+//---------------------------------------------------------
+// startHelpBrowser
+//---------------------------------------------------------
+
+void MusE::startHelpBrowser()
+ {
+ QString lang(getenv("LANG"));
+ QString museHelp = museGlobalShare + QString("/html/index_") + lang + QString(".html");
+ if (access(museHelp.toLatin1().data(), R_OK) != 0) {
+ museHelp = museGlobalShare + QString("/html/index.html");
+ if (access(museHelp.toLatin1().data(), R_OK) != 0) {
+ QString info(tr("no help found at: "));
+ info += museHelp;
+ QMessageBox::critical(this, tr("MusE: Open Help"), info);
+ return;
+ }
+ }
+ launchBrowser(museHelp);
+ }
+
+//---------------------------------------------------------
+// startHelpBrowser
+//---------------------------------------------------------
+
+void MusE::startHomepageBrowser()
+ {
+ QString museHome = QString("http://lmuse.sourceforge.net");
+
+ launchBrowser(museHome);
+ }
+
+//---------------------------------------------------------
+// startBugBrowser
+//---------------------------------------------------------
+
+void MusE::startBugBrowser()
+ {
+ QString museBugPage("http://lmuse.sourceforge.net/bugs.html");
+ launchBrowser(museBugPage);
+ }
+
+//---------------------------------------------------------
+// about
+//---------------------------------------------------------
+
+void MusE::about()
+ {
+ AboutBoxDialog ab;
+ ab.show();
+ ab.exec();
+ }
+
+//---------------------------------------------------------
+// aboutQt
+//---------------------------------------------------------
+
+void MusE::aboutQt()
+ {
+ QMessageBox::aboutQt(this, QString("MusE"));
+ }
+
+//---------------------------------------------------------
+// launchBrowser
+//---------------------------------------------------------
+
+void MusE::launchBrowser(QString &whereTo)
+ {
+ char testStr[40];
+ strcpy(testStr, "which ");
+ strcat(testStr, config.helpBrowser.toLatin1().data());
+ if (config.helpBrowser == "" || system(testStr)) {
+ QMessageBox::information(this,
+ tr("Unable to launch help"),
+ tr("For some reason MusE has failed to detect or launch\n"
+ "a browser on your machine. Please go to Settings->Global Settings->GUI\n"
+ "and insert the program name of your favourite browser."),
+ tr("Ok"),
+ 0 );
+ return;
+ }
+ QStringList sl;
+ sl.append("-c");
+ sl.append(config.helpBrowser + " " + whereTo);
+ QProcess::startDetached("/bin/sh", sl);
+ }
+
diff --git a/muse/muse/help.h b/muse/muse/help.h
new file mode 100644
index 00000000..a97bf4f5
--- /dev/null
+++ b/muse/muse/help.h
@@ -0,0 +1,38 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __HELP_H__
+#define __HELP_H__
+
+#include "ui_aboutbox.h"
+
+//---------------------------------------------------------
+// AboutBoxDialog
+//---------------------------------------------------------
+
+class AboutBoxDialog : public QDialog, Ui::AboutBox {
+ public:
+ AboutBoxDialog() {
+ setupUi(this);
+ }
+ };
+
+#endif
+
diff --git a/muse/muse/helper.cpp b/muse/muse/helper.cpp
new file mode 100644
index 00000000..6b534a6d
--- /dev/null
+++ b/muse/muse/helper.cpp
@@ -0,0 +1,47 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "helper.h"
+
+extern bool hIsB;
+static const char* vall[] = {
+ "c","c#","d","d#","e","f","f#","g","g#","a","a#","h"
+ };
+static const char* valu[] = {
+ "C","C#","D","D#","E","F","F#","G","G#","A","A#","H"
+ };
+
+//---------------------------------------------------------
+// pitch2string
+//---------------------------------------------------------
+
+QString pitch2string(int v)
+ {
+ if (v < 0 || v > 127)
+ return QString("----");
+ int octave = (v / 12) - 2;
+ QString o;
+ o.sprintf("%d", octave);
+ int i = v % 12;
+ QString s(octave < 0 ? valu[i] : vall[i]);
+ return s + o;
+ }
+
+
diff --git a/muse/muse/helper.h b/muse/muse/helper.h
new file mode 100644
index 00000000..3f255393
--- /dev/null
+++ b/muse/muse/helper.h
@@ -0,0 +1,27 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __HELPER_H__
+#define __HELPER_H__
+
+extern QString pitch2string(int v);
+
+#endif
+
diff --git a/muse/muse/icons.cpp b/muse/muse/icons.cpp
new file mode 100644
index 00000000..8c4f05c6
--- /dev/null
+++ b/muse/muse/icons.cpp
@@ -0,0 +1,555 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "globals.h"
+
+#include "xpm/audio_bounce_to_file.xpm"
+#include "xpm/audio_bounce_to_track.xpm"
+#include "xpm/audio_restartaudio.xpm"
+#include "xpm/automation_clear_data.xpm"
+#include "xpm/automation_mixer.xpm"
+#include "xpm/automation_take_snapshot.xpm"
+#include "xpm/edit_midi.xpm"
+#include "xpm/midi_edit_instrument.xpm"
+#include "xpm/midi_init_instr.xpm"
+#include "xpm/midi_inputplugins.xpm"
+#include "xpm/midi_inputplugins_midi_input_filter.xpm"
+#include "xpm/midi_inputplugins_midi_input_transform.xpm"
+#include "xpm/midi_inputplugins_remote_control.xpm"
+#include "xpm/midi_inputplugins_transpose.xpm"
+#include "xpm/midi_local_off.xpm"
+#include "xpm/midi_reset_instr.xpm"
+#include "xpm/settings_appearance_settings.xpm"
+#include "xpm/settings_configureshortcuts.xpm"
+#include "xpm/settings_follow_song.xpm"
+#include "xpm/settings_globalsettings.xpm"
+#include "xpm/settings_metronome.xpm"
+#include "xpm/settings_midifileexport.xpm"
+#include "xpm/settings_midiport_softsynths.xpm"
+#include "xpm/settings_midisync.xpm"
+#include "xpm/view_bigtime_window.xpm"
+#include "xpm/view_cliplist.xpm"
+#include "xpm/view_marker.xpm"
+#include "xpm/view_mixer.xpm"
+#include "xpm/view_transport_window.xpm"
+
+#include "xpm/pointer.xpm"
+#include "xpm/pencil.xpm"
+#include "xpm/delete.xpm"
+#include "xpm/play.xpm"
+
+#include "xpm/record_on.xpm"
+#include "xpm/record_off.xpm"
+#include "xpm/punchin1.xpm"
+#include "xpm/punchout1.xpm"
+#include "xpm/loop1.xpm"
+#include "xpm/dot.xpm"
+#include "xpm/doth.xpm"
+#include "xpm/dot1.xpm"
+#include "xpm/note.xpm"
+#include "xpm/note1.xpm"
+#include "xpm/stick.xpm"
+#include "xpm/wave.xpm"
+#include "xpm/cmark.xpm"
+#include "xpm/lmark.xpm"
+#include "xpm/rmark.xpm"
+#include "xpm/cut.xpm"
+#include "xpm/steprec.xpm"
+#include "xpm/glue.xpm"
+#include "xpm/draw.xpm"
+#include "xpm/quant.xpm"
+// #include "xpm/fileprint.xpm"
+// #include "xpm/filesave.xpm"
+// #include "xpm/fileopen.xpm"
+// #include "xpm/fileprintS.xpm"
+#include "xpm/filesaveS.xpm"
+#include "xpm/fileopenS.xpm"
+#include "xpm/master.xpm"
+// #include "xpm/filenew.xpm"
+#include "xpm/filenewS.xpm"
+#include "xpm/home.xpm"
+#include "xpm/back.xpm"
+#include "xpm/forward.xpm"
+
+// #include "xpm/mute.xpm"
+#include "xpm/solobutton_on.xpm"
+#include "xpm/solobutton_off.xpm"
+#include "xpm/mutebutton_on.xpm"
+#include "xpm/mutebutton_off.xpm"
+
+#include "xpm/up.xpm"
+#include "xpm/down.xpm"
+#include "xpm/bold.xpm"
+#include "xpm/italic.xpm"
+#include "xpm/underlined.xpm"
+#include "xpm/gv.xpm"
+#include "xpm/midiin.xpm"
+#include "xpm/sysex.xpm"
+#include "xpm/ctrl.xpm"
+#include "xpm/meta.xpm"
+#include "xpm/pitch.xpm"
+#include "xpm/cafter.xpm"
+#include "xpm/pafter.xpm"
+#include "xpm/flag.xpm"
+#include "xpm/flagS.xpm"
+#include "xpm/lock.xpm"
+#include "xpm/toc.xpm"
+#include "xpm/piano.xpm"
+// #include "xpm/pianoS.xpm"
+#include "xpm/exitS.xpm"
+
+#include "xpm/undo.xpm"
+#include "xpm/redo.xpm"
+#include "xpm/editcut.xpm"
+#include "xpm/editcopy.xpm"
+#include "xpm/editpaste.xpm"
+#include "xpm/undoS.xpm"
+#include "xpm/redoS.xpm"
+#include "xpm/editcutS.xpm"
+#include "xpm/editcopyS.xpm"
+#include "xpm/editpasteS.xpm"
+#include "xpm/editmute.xpm"
+#include "xpm/editmuteS.xpm"
+
+#include "xpm/speaker.xpm"
+#include "xpm/buttondown.xpm"
+#include "xpm/configure.xpm"
+#include "xpm/panic.xpm"
+
+
+// next two lines will vanish soon
+#include "xpm/solobutton.xpm"
+#include "xpm/newmutebutton.xpm"
+#include "xpm/exit.xpm"
+#include "xpm/exit1.xpm"
+
+#include "xpm/greendot.xpm"
+#include "xpm/darkgreendot.xpm"
+#include "xpm/bluedot.xpm"
+#include "xpm/graydot.xpm"
+#include "xpm/off.xpm"
+
+#include "xpm/mastertrackS.xpm"
+#include "xpm/localoffS.xpm"
+#include "xpm/miditransformS.xpm"
+#include "xpm/midi_plugS.xpm"
+#include "xpm/miditransposeS.xpm"
+#include "xpm/mixerS.xpm"
+#include "xpm/mustangS.xpm"
+#include "xpm/resetS.xpm"
+#include "xpm/track_add.xpm"
+#include "xpm/track_delete.xpm"
+#include "xpm/listS.xpm"
+#include "xpm/inputpluginS.xpm"
+#include "xpm/cliplistS.xpm"
+#include "xpm/mixeraudioS.xpm"
+#include "xpm/initS.xpm"
+
+#include "xpm/addtrack_addmiditrack.xpm"
+#include "xpm/addtrack_audiogroup.xpm"
+#include "xpm/addtrack_audioinput.xpm"
+#include "xpm/addtrack_audiooutput.xpm"
+#include "xpm/addtrack_auxsend.xpm"
+#include "xpm/addtrack_drumtrack.xpm"
+#include "xpm/addtrack_wavetrack.xpm"
+#include "xpm/edit_drumms.xpm"
+#include "xpm/edit_list.xpm"
+#include "xpm/edit_mastertrack.xpm"
+#include "xpm/edit_pianoroll.xpm"
+#include "xpm/edit_score.xpm"
+#include "xpm/edit_track_add.xpm"
+#include "xpm/edit_track_del.xpm"
+#include "xpm/mastertrack_graphic.xpm"
+#include "xpm/mastertrack_list.xpm"
+#include "xpm/midi_transform.xpm"
+#include "xpm/midi_transpose.xpm"
+#include "xpm/select.xpm"
+#include "xpm/select_all.xpm"
+#include "xpm/select_all_parts_on_track.xpm"
+#include "xpm/select_deselect_all.xpm"
+#include "xpm/select_inside_loop.xpm"
+#include "xpm/select_invert_selection.xpm"
+#include "xpm/select_outside_loop.xpm"
+
+#include "xpm/mono.xpm"
+#include "xpm/stereo.xpm"
+#include "xpm/muse_icon.xpm"
+#include "xpm/config.xpm"
+#include "xpm/minus.xpm"
+#include "xpm/plus.xpm"
+
+QPixmap* mastertrackSIcon;
+QPixmap* localoffSIcon;
+QPixmap* miditransformSIcon;
+QPixmap* midi_plugSIcon;
+QPixmap* miditransposeSIcon;
+QPixmap* mixerSIcon;
+QPixmap* mustangSIcon;
+QPixmap* resetSIcon;
+QPixmap* track_addIcon;
+QPixmap* track_deleteIcon;
+QPixmap* listSIcon;
+QPixmap* inputpluginSIcon;
+QPixmap* cliplistSIcon;
+QPixmap* mixerAudioSIcon;
+QPixmap* initSIcon;
+
+QPixmap* exitIcon;
+QPixmap* exit1Icon;
+QPixmap* newmuteIcon;
+QPixmap* soloIcon;
+
+QPixmap* pointerIcon;
+QPixmap* pencilIcon;
+QPixmap* deleteIcon;
+QPixmap* punchin1Icon;
+QPixmap* punchout1Icon;
+QPixmap* loop1Icon;
+QPixmap* playIcon;
+
+QPixmap* record_on_Icon;
+QPixmap* record_off_Icon;
+QIcon* recordIcon;
+
+QPixmap* stopIcon;
+QPixmap* fforwardIcon;
+QPixmap* frewindIcon;
+QPixmap* dotIcon;
+QPixmap* dothIcon;
+QPixmap* dot1Icon;
+QPixmap* note1Icon;
+QPixmap* noteIcon;
+QPixmap* stickIcon;
+QPixmap* waveIcon;
+QPixmap* markIcon[3];
+QPixmap* cutIcon;
+QPixmap* steprecIcon;
+QPixmap* glueIcon;
+QPixmap* drawIcon;
+QPixmap* quantIcon;
+// QPixmap* printIcon;
+// QPixmap* printIconS;
+QPixmap* openIcon;
+QPixmap* saveIcon;
+QPixmap* openIconS;
+QPixmap* saveIconS;
+QPixmap* masterIcon;
+QPixmap* filenewIcon;
+QPixmap* filenewIconS;
+QPixmap* homeIcon;
+QPixmap* backIcon;
+QPixmap* forwardIcon;
+QPixmap* muteIcon;
+QPixmap* upIcon;
+QPixmap* downIcon;
+QPixmap* boldIcon;
+QPixmap* italicIcon;
+QPixmap* underlinedIcon;
+QPixmap* gvIcon;
+QPixmap* midiinIcon;
+QPixmap* sysexIcon;
+QPixmap* ctrlIcon;
+QPixmap* metaIcon;
+QPixmap* pitchIcon;
+QPixmap* cafterIcon;
+QPixmap* pafterIcon;
+QPixmap* flagIcon;
+QPixmap* flagIconS;
+QPixmap* lockIcon;
+QPixmap* tocIcon;
+QPixmap* exitIconS;
+
+QPixmap* undoIcon;
+QPixmap* redoIcon;
+QPixmap* undoIconS;
+QPixmap* redoIconS;
+
+QPixmap* speakerIcon;
+QPixmap* buttondownIcon;
+QPixmap* configureIcon;
+
+QPixmap* muteIconOn;
+QPixmap* muteIconOff;
+QPixmap* soloIconOn;
+QPixmap* soloIconOff;
+
+QPixmap* editmuteIcon;
+QPixmap* editmuteSIcon;
+QPixmap* panicIcon;
+
+QIcon* pianoIconSet;
+QIcon* scoreIconSet;
+QIcon* editcutIconSet;
+QIcon* editmuteIconSet;
+QIcon* editcopyIconSet;
+QIcon* editpasteIconSet;
+
+QPixmap* greendotIcon;
+QPixmap* darkgreendotIcon;
+QPixmap* graydotIcon;
+QPixmap* bluedotIcon;
+QPixmap* offIcon;
+
+QPixmap* addtrack_addmiditrackIcon;
+QPixmap* addtrack_audiogroupIcon;
+QPixmap* addtrack_audioinputIcon;
+QPixmap* addtrack_audiooutputIcon;
+QPixmap* addtrack_auxsendIcon;
+QPixmap* addtrack_drumtrackIcon;
+QPixmap* addtrack_wavetrackIcon;
+QPixmap* edit_drummsIcon;
+QPixmap* edit_listIcon;
+QPixmap* edit_mastertrackIcon;
+QPixmap* edit_pianorollIcon;
+QPixmap* edit_scoreIcon;
+QPixmap* edit_track_addIcon;
+QPixmap* edit_track_delIcon;
+QPixmap* mastertrack_graphicIcon;
+QPixmap* mastertrack_listIcon;
+QPixmap* midi_transformIcon;
+QPixmap* midi_transposeIcon;
+QPixmap* selectIcon;
+QPixmap* select_allIcon;
+QPixmap* select_all_parts_on_trackIcon;
+QPixmap* select_deselect_allIcon;
+QPixmap* select_inside_loopIcon;
+QPixmap* select_invert_selectionIcon;
+QPixmap* select_outside_loopIcon;
+
+QPixmap* audio_bounce_to_fileIcon;
+QPixmap* audio_bounce_to_trackIcon;
+QPixmap* audio_restartaudioIcon;
+QPixmap* automation_clear_dataIcon;
+QPixmap* automation_mixerIcon;
+QPixmap* automation_take_snapshotIcon;
+QPixmap* edit_midiIcon;
+QPixmap* midi_edit_instrumentIcon;
+QPixmap* midi_init_instrIcon;
+QPixmap* midi_inputpluginsIcon;
+QPixmap* midi_inputplugins_midi_input_filterIcon;
+QPixmap* midi_inputplugins_midi_input_transformIcon;
+QPixmap* midi_inputplugins_remote_controlIcon;
+QPixmap* midi_inputplugins_transposeIcon;
+QPixmap* midi_local_offIcon;
+QPixmap* midi_reset_instrIcon;
+QPixmap* settings_appearance_settingsIcon;
+QPixmap* settings_configureshortcutsIcon;
+QPixmap* settings_follow_songIcon;
+QPixmap* settings_globalsettingsIcon;
+QPixmap* settings_metronomeIcon;
+QPixmap* settings_midifileexportIcon;
+QPixmap* settings_midiport_softsynthsIcon;
+QPixmap* settings_midisyncIcon;
+QPixmap* view_bigtime_windowIcon;
+QPixmap* view_cliplistIcon;
+QPixmap* view_markerIcon;
+QPixmap* view_mixerIcon;
+QPixmap* view_transport_windowIcon;
+
+QPixmap* monoIcon;
+QPixmap* stereoIcon;
+QPixmap* museIcon;
+QPixmap* museIcon64;
+QPixmap* configIcon;
+QPixmap* minusIcon;
+QPixmap* plusIcon;
+
+//---------------------------------------------------------
+// initIcons
+//---------------------------------------------------------
+
+void initIcons()
+ {
+ pointerIcon = new QPixmap(pointer_xpm);
+ pencilIcon = new QPixmap(pencil_xpm);
+ deleteIcon = new QPixmap(delete_xpm);
+ punchin1Icon = new QPixmap(punchin1_xpm);
+ punchout1Icon = new QPixmap(punchout1_xpm);
+ loop1Icon = new QPixmap(loop1_xpm);
+ playIcon = new QPixmap(play_xpm);
+
+ record_on_Icon= new QPixmap(record_on_xpm);
+ record_off_Icon= new QPixmap(record_off_xpm);
+
+ recordIcon = new QIcon(*record_off_Icon);
+ recordIcon->addPixmap(*record_on_Icon, QIcon::Normal, QIcon::On);
+
+ dotIcon = new QPixmap(dot_xpm);
+ dothIcon = new QPixmap(doth_xpm);
+ dot1Icon = new QPixmap(dot1_xpm);
+ noteIcon = new QPixmap(note_xpm);
+ note1Icon = new QPixmap(note1_xpm);
+ stickIcon = new QPixmap(stick_xpm);
+ waveIcon = new QPixmap(wave_xpm);
+ markIcon[0] = new QPixmap(cmark_xpm);
+ markIcon[1] = new QPixmap(lmark_xpm);
+ markIcon[2] = new QPixmap(rmark_xpm);
+ cutIcon = new QPixmap(cut_xpm);
+ steprecIcon = new QPixmap(steprec_xpm);
+ glueIcon = new QPixmap(glue_xpm);
+ drawIcon = new QPixmap(draw_xpm);
+ quantIcon = new QPixmap(quant_xpm);
+ saveIcon = new QPixmap(":/xpm/filesave.png");
+ openIcon = new QPixmap(":/xpm/fileopen.png");
+ saveIconS = new QPixmap(filesaveS_xpm);
+ openIconS = new QPixmap(fileopenS_xpm);
+ masterIcon = new QPixmap(master_xpm);
+ filenewIcon = new QPixmap(":/xpm/filenew.png");
+ filenewIconS = new QPixmap(filenewS_xpm);
+ homeIcon = new QPixmap(home_xpm);
+ backIcon = new QPixmap(back_xpm);
+ forwardIcon = new QPixmap(forward_xpm);
+ muteIcon = new QPixmap(editmuteS_xpm);
+ upIcon = new QPixmap(up_xpm);
+ downIcon = new QPixmap(down_xpm);
+ boldIcon = new QPixmap(bold_xpm);
+ italicIcon = new QPixmap(italic_xpm);
+ underlinedIcon = new QPixmap(underlined_xpm);
+ gvIcon = new QPixmap(gv_xpm);
+ midiinIcon = new QPixmap(midiin_xpm);
+ sysexIcon = new QPixmap(sysex_xpm);
+ ctrlIcon = new QPixmap(ctrl_xpm);
+ metaIcon = new QPixmap(meta_xpm);
+ pitchIcon = new QPixmap(pitch_xpm);
+ cafterIcon = new QPixmap(cafter_xpm);
+ pafterIcon = new QPixmap(pafter_xpm);
+ flagIcon = new QPixmap(flag_xpm);
+ flagIconS = new QPixmap(flagS_xpm);
+ lockIcon = new QPixmap(lock_xpm);
+ tocIcon = new QPixmap(toc_xpm);
+ exitIconS = new QPixmap(exitS_xpm);
+
+ undoIcon = new QPixmap(undo_xpm);
+ redoIcon = new QPixmap(redo_xpm);
+ undoIconS = new QPixmap(undoS_xpm);
+ redoIconS = new QPixmap(redoS_xpm);
+
+ speakerIcon = new QPixmap(speaker_xpm);
+ buttondownIcon = new QPixmap(buttondown_xpm);
+ configureIcon = new QPixmap(configure_xpm);
+
+ editmuteIcon = new QPixmap(editmute_xpm);
+ editmuteSIcon = new QPixmap(editmuteS_xpm);
+ panicIcon = new QPixmap(panic_xpm);
+
+ editcutIconSet = new QIcon(QPixmap(editcut_xpm));
+ editcopyIconSet = new QIcon(QPixmap(editcopy_xpm));
+ editpasteIconSet = new QIcon(QPixmap(editpaste_xpm));
+ editmuteIconSet = new QIcon(QPixmap(editmute_xpm));
+
+ exitIcon = new QPixmap(exit_xpm);
+ exit1Icon = new QPixmap(exit1_xpm);
+
+ // 2 lines odd code
+ newmuteIcon = new QPixmap(newmutebutton_xpm);
+ soloIcon = new QPixmap(solobutton_xpm);
+
+ muteIconOn = new QPixmap(mutebutton_on_xpm);
+ muteIconOff = new QPixmap(mutebutton_off_xpm);
+ soloIconOn = new QPixmap(solobutton_on_xpm);
+ soloIconOff = new QPixmap(solobutton_off_xpm);
+ greendotIcon = new QPixmap(greendot_xpm);
+ darkgreendotIcon = new QPixmap(darkgreendot_xpm);
+ bluedotIcon = new QPixmap(bluedot_xpm);
+ graydotIcon = new QPixmap(graydot_xpm);
+ offIcon = new QPixmap(off_xpm);
+
+ mastertrackSIcon = new QPixmap(mastertrackS_xpm);
+ localoffSIcon = new QPixmap(localoffS_xpm);
+ miditransformSIcon = new QPixmap(miditransformS_xpm);
+ midi_plugSIcon = new QPixmap(midi_plugS_xpm);
+ miditransposeSIcon = new QPixmap(miditransposeS_xpm);
+ mixerSIcon = new QPixmap(mixerS_xpm);
+ mustangSIcon = new QPixmap(mustangS_xpm);
+ resetSIcon = new QPixmap(resetS_xpm);
+ track_addIcon = new QPixmap(track_add_xpm);
+ track_deleteIcon = new QPixmap(track_delete_xpm);
+ listSIcon = new QPixmap(listS_xpm);
+ inputpluginSIcon = new QPixmap(inputpluginS_xpm);
+ cliplistSIcon = new QPixmap(cliplistS_xpm);
+ mixerAudioSIcon = new QPixmap(mixerAudioS_xpm);
+ initSIcon = new QPixmap(initS_xpm);
+
+ addtrack_addmiditrackIcon = new QPixmap(addtrack_addmiditrack_xpm);
+ addtrack_audiogroupIcon = new QPixmap(addtrack_audiogroup_xpm);
+ addtrack_audioinputIcon = new QPixmap(addtrack_audioinput_xpm);
+ addtrack_audiooutputIcon = new QPixmap(addtrack_audiooutput_xpm);
+ addtrack_auxsendIcon = new QPixmap(addtrack_auxsend_xpm);
+ addtrack_drumtrackIcon = new QPixmap(addtrack_drumtrack_xpm);
+ addtrack_wavetrackIcon = new QPixmap(addtrack_wavetrack_xpm);
+ edit_drummsIcon = new QPixmap(edit_drumms_xpm);
+ edit_listIcon = new QPixmap(edit_list_xpm);
+ edit_mastertrackIcon = new QPixmap(edit_mastertrack_xpm);
+ edit_pianorollIcon = new QPixmap(edit_pianoroll_xpm);
+ edit_scoreIcon = new QPixmap(edit_score_xpm);
+ edit_track_addIcon = new QPixmap(edit_track_add_xpm);
+ edit_track_delIcon = new QPixmap(edit_track_del_xpm);
+ mastertrack_graphicIcon = new QPixmap(mastertrack_graphic_xpm);
+ mastertrack_listIcon = new QPixmap(mastertrack_list_xpm);
+ midi_transformIcon = new QPixmap(midi_transform_xpm);
+ midi_transposeIcon = new QPixmap(midi_transpose_xpm);
+ selectIcon = new QPixmap(select_xpm);
+ select_allIcon = new QPixmap(select_all_xpm);
+ select_all_parts_on_trackIcon = new QPixmap(select_all_parts_on_track_xpm);
+ select_deselect_allIcon = new QPixmap(select_deselect_all);
+ select_inside_loopIcon = new QPixmap(select_inside_loop_xpm);
+ select_invert_selectionIcon = new QPixmap(select_invert_selection);
+ select_outside_loopIcon = new QPixmap(select_outside_loop_xpm);
+ pianoIconSet = new QIcon(QPixmap(piano_xpm));
+
+ audio_bounce_to_fileIcon = new QPixmap(audio_bounce_to_file_xpm);
+ audio_bounce_to_trackIcon = new QPixmap(audio_bounce_to_track_xpm);
+ audio_restartaudioIcon = new QPixmap(audio_restartaudio_xpm);
+ automation_clear_dataIcon = new QPixmap(automation_clear_data_xpm);
+ automation_mixerIcon = new QPixmap(automation_mixer_xpm);
+ automation_take_snapshotIcon = new QPixmap(automation_take_snapshot_xpm);
+ edit_midiIcon = new QPixmap(edit_midi_xpm);
+ midi_edit_instrumentIcon = new QPixmap(midi_edit_instrument_xpm);
+ midi_init_instrIcon = new QPixmap(midi_init_instr_xpm);
+ midi_inputpluginsIcon = new QPixmap(midi_inputplugins_xpm);
+ midi_inputplugins_midi_input_filterIcon = new QPixmap(midi_inputplugins_midi_input_filter_xpm);
+ midi_inputplugins_midi_input_transformIcon = new QPixmap(midi_inputplugins_midi_input_transform_xpm);
+ midi_inputplugins_remote_controlIcon = new QPixmap(midi_inputplugins_remote_control_xpm);
+ midi_inputplugins_transposeIcon = new QPixmap(midi_inputplugins_transpose_xpm);
+ midi_local_offIcon = new QPixmap(midi_local_off_xpm);
+ midi_reset_instrIcon = new QPixmap(midi_reset_instr_xpm);
+ settings_appearance_settingsIcon = new QPixmap(settings_appearance_settings_xpm);
+ settings_configureshortcutsIcon = new QPixmap(settings_configureshortcuts_xpm);
+ settings_follow_songIcon = new QPixmap(settings_follow_song_xpm);
+ settings_globalsettingsIcon = new QPixmap(settings_globalsettings_xpm);
+ settings_metronomeIcon = new QPixmap(settings_metronome_xpm);
+ settings_midifileexportIcon = new QPixmap(settings_midifileexport_xpm);
+ settings_midiport_softsynthsIcon = new QPixmap(settings_midiport_softsynths_xpm);
+ settings_midisyncIcon = new QPixmap(settings_midisync_xpm);
+ view_bigtime_windowIcon = new QPixmap(view_bigtime_window_xpm);
+ view_cliplistIcon = new QPixmap(view_cliplist_xpm);
+ view_markerIcon = new QPixmap(view_marker_xpm);
+ view_mixerIcon = new QPixmap(view_mixer_xpm);
+ view_transport_windowIcon = new QPixmap(view_transport_window_xpm);
+
+ monoIcon = new QPixmap(mono_xpm);
+ stereoIcon = new QPixmap(stereo_xpm);
+
+ museIcon = new QPixmap(muse_icon_xpm);
+ configIcon = new QPixmap(config_xpm);
+ minusIcon = new QPixmap(minus_xpm);
+ plusIcon = new QPixmap(plus_xpm);
+ }
+
diff --git a/muse/muse/icons.h b/muse/muse/icons.h
new file mode 100644
index 00000000..dbbce357
--- /dev/null
+++ b/muse/muse/icons.h
@@ -0,0 +1,204 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef ICONS_H
+#define ICONS_H
+
+extern QPixmap* pointerIcon;
+extern QPixmap* pencilIcon;
+extern QPixmap* deleteIcon;
+extern QPixmap* punchin1Icon;
+extern QPixmap* punchout1Icon;
+extern QPixmap* loop1Icon;
+extern QPixmap* playIcon;
+extern QPixmap* dotIcon;
+extern QPixmap* dothIcon;
+extern QPixmap* dot1Icon;
+extern QPixmap* noteIcon;
+extern QPixmap* note1Icon;
+extern QPixmap* stickIcon;
+extern QPixmap* waveIcon;
+extern QPixmap* markIcon[3];
+
+extern QPixmap* muteIconOn;
+extern QPixmap* muteIconOff;
+extern QPixmap* soloIconOn;
+extern QPixmap* soloIconOff;
+
+extern QPixmap* cutIcon;
+extern QPixmap* steprecIcon;
+extern QPixmap* glueIcon;
+extern QPixmap* drawIcon;
+
+extern QPixmap* quantIcon;
+// extern QPixmap* printIcon;
+// extern QPixmap* printIconS;
+extern QPixmap* openIcon;
+extern QPixmap* saveIcon;
+extern QPixmap* openIconS;
+extern QPixmap* saveIconS;
+extern QPixmap* archiveIcon;
+extern QPixmap* findIcon;
+extern QPixmap* masterIcon;
+extern QPixmap* filenewIcon;
+extern QPixmap* filenewIconS;
+extern QPixmap* homeIcon;
+extern QPixmap* backIcon;
+extern QPixmap* forwardIcon;
+extern QPixmap* muteIcon;
+extern QPixmap* upIcon;
+extern QPixmap* downIcon;
+extern QPixmap* boldIcon;
+extern QPixmap* italicIcon;
+extern QPixmap* underlinedIcon;
+extern QPixmap* gvIcon;
+extern QPixmap* midiinIcon;
+extern QPixmap* sysexIcon;
+extern QPixmap* ctrlIcon;
+extern QPixmap* metaIcon;
+extern QPixmap* pitchIcon;
+extern QPixmap* cafterIcon;
+extern QPixmap* pafterIcon;
+extern QPixmap* flagIcon;
+extern QPixmap* flagIconS;
+extern QPixmap* lockIcon;
+extern QPixmap* tocIcon;
+extern QPixmap* exitIconS;
+
+extern QPixmap* undoIcon;
+extern QPixmap* redoIcon;
+extern QPixmap* undoIconS;
+extern QPixmap* redoIconS;
+
+extern QPixmap* speakerIcon;
+extern QPixmap* buttondownIcon;
+extern QPixmap* configureIcon;
+
+extern QPixmap* editmuteIcon;
+extern QPixmap* editmuteSIcon;
+extern QPixmap* panicIcon;
+
+extern QIcon* pianoIconSet;
+extern QIcon* scoreIconSet;
+extern QIcon* editcutIconSet;
+extern QIcon* editmuteIconSet;
+extern QIcon* editcopyIconSet;
+extern QIcon* editpasteIconSet;
+
+extern QPixmap* exitIcon;
+extern QPixmap* exit1Icon;
+extern QPixmap* record_on_Icon;
+extern QPixmap* record_off_Icon;
+extern QIcon* recordIcon;
+extern QPixmap* newmuteIcon;
+extern QPixmap* soloIcon;
+
+extern QPixmap* muteIconOn;
+extern QPixmap* muteIconOff;
+extern QPixmap* soloIconOn;
+extern QPixmap* soloIconOff;
+
+extern QPixmap* greendotIcon;
+extern QPixmap* darkgreendotIcon;
+extern QPixmap* graydotIcon;
+extern QPixmap* bluedotIcon;
+extern QPixmap* offIcon;
+
+extern QPixmap* mastertrackSIcon;
+extern QPixmap* localoffSIcon;
+extern QPixmap* miditransformSIcon;
+extern QPixmap* midi_plugSIcon;
+extern QPixmap* miditransposeSIcon;
+extern QPixmap* mixerSIcon;
+// extern QPixmap* mustangSIcon;
+extern QPixmap* resetSIcon;
+extern QPixmap* track_addIcon;
+extern QPixmap* track_deleteIcon;
+extern QPixmap* listSIcon;
+extern QPixmap* inputpluginSIcon;
+extern QPixmap* cliplistSIcon;
+extern QPixmap* mixerAudioSIcon;
+extern QPixmap* initSIcon;
+
+extern QPixmap* addtrack_addmiditrackIcon;
+extern QPixmap* addtrack_audiogroupIcon;
+extern QPixmap* addtrack_audioinputIcon;
+extern QPixmap* addtrack_audiooutputIcon;
+extern QPixmap* addtrack_auxsendIcon;
+extern QPixmap* addtrack_drumtrackIcon;
+extern QPixmap* addtrack_wavetrackIcon;
+extern QPixmap* edit_drummsIcon;
+extern QPixmap* edit_listIcon;
+extern QPixmap* edit_mastertrackIcon;
+extern QPixmap* edit_pianorollIcon;
+extern QPixmap* edit_scoreIcon;
+extern QPixmap* edit_track_addIcon;
+extern QPixmap* edit_track_delIcon;
+extern QPixmap* mastertrack_graphicIcon;
+extern QPixmap* mastertrack_listIcon;
+extern QPixmap* midi_transformIcon;
+extern QPixmap* midi_transposeIcon;
+extern QPixmap* selectIcon;
+extern QPixmap* select_allIcon;
+extern QPixmap* select_all_parts_on_trackIcon;
+extern QPixmap* select_deselect_allIcon;
+extern QPixmap* select_inside_loopIcon;
+extern QPixmap* select_invert_selectionIcon;
+extern QPixmap* select_outside_loopIcon;
+
+extern QPixmap* audio_bounce_to_fileIcon;
+extern QPixmap* audio_bounce_to_trackIcon;
+extern QPixmap* audio_restartaudioIcon;
+extern QPixmap* automation_clear_dataIcon;
+extern QPixmap* automation_mixerIcon;
+extern QPixmap* automation_take_snapshotIcon;
+extern QPixmap* edit_midiIcon;
+extern QPixmap* midi_edit_instrumentIcon;
+extern QPixmap* midi_init_instrIcon;
+extern QPixmap* midi_inputpluginsIcon;
+extern QPixmap* midi_inputplugins_midi_input_filterIcon;
+extern QPixmap* midi_inputplugins_midi_input_transformIcon;
+extern QPixmap* midi_inputplugins_remote_controlIcon;
+extern QPixmap* midi_inputplugins_transposeIcon;
+extern QPixmap* midi_local_offIcon;
+extern QPixmap* midi_reset_instrIcon;
+extern QPixmap* settings_appearance_settingsIcon;
+extern QPixmap* settings_configureshortcutsIcon;
+extern QPixmap* settings_follow_songIcon;
+extern QPixmap* settings_globalsettingsIcon;
+extern QPixmap* settings_metronomeIcon;
+extern QPixmap* settings_midifileexportIcon;
+extern QPixmap* settings_midiport_softsynthsIcon;
+extern QPixmap* settings_midisyncIcon;
+extern QPixmap* view_bigtime_windowIcon;
+extern QPixmap* view_cliplistIcon;
+extern QPixmap* view_markerIcon;
+extern QPixmap* view_mixerIcon;
+extern QPixmap* view_transport_windowIcon;
+
+extern QPixmap* monoIcon;
+extern QPixmap* stereoIcon;
+
+extern QPixmap* museIcon;
+extern QPixmap* configIcon;
+extern QPixmap* minusIcon;
+extern QPixmap* plusIcon;
+#endif
+
diff --git a/muse/muse/importmidi.cpp b/muse/muse/importmidi.cpp
new file mode 100644
index 00000000..928fc078
--- /dev/null
+++ b/muse/muse/importmidi.cpp
@@ -0,0 +1,437 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "globals.h"
+#include "muse.h"
+#include "song.h"
+#include "widgets/filedialog.h"
+#include "midi.h"
+#include "midifile.h"
+#include "transport.h"
+#include "midiedit/drummap.h"
+#include "al/sig.h"
+#include "al/tempo.h"
+#include "instruments/minstrument.h"
+#include "gconfig.h"
+#include "driver/alsamidi.h"
+#include "part.h"
+
+//---------------------------------------------------------
+// importMidi
+//---------------------------------------------------------
+
+void MusE::importMidi()
+ {
+ QString empty("");
+ importMidi(empty);
+ }
+
+void MusE::importMidi(const QString &file)
+ {
+ QString fn;
+ QStringList pattern;
+
+ const char** s = midi_file_pattern;
+ while (*s)
+ pattern << *s++;
+
+ if (file.isEmpty()) {
+ fn = getOpenFileName(lastMidiPath, pattern, this,
+ tr("MusE: Import Midi"));
+ if (fn.isEmpty())
+ return;
+ lastMidiPath = fn;
+ }
+ else
+ fn = file;
+
+ int n = QMessageBox::question(this, appName,
+ tr("Add midi file to current project?\n"),
+ tr("&Add to Project"),
+ tr("&Replace"),
+ tr("&Abort"), 0, 2);
+
+ switch (n) {
+ case 0:
+ importMidi(fn, true);
+ song->update(-1);
+ break;
+ case 1:
+ loadProjectFile(fn, false, false); // replace
+ break;
+ default:
+ return;
+ }
+ }
+
+//---------------------------------------------------------
+// importMidi
+// return true on error
+//---------------------------------------------------------
+
+bool MusE::importMidi(const QString name, bool merge)
+ {
+ QFile* fp = fileOpen(this, name, QString(".mid"), QIODevice::ReadOnly);
+ if (fp == 0)
+ return true;
+ MidiFile mf;
+ bool rv = mf.read(fp);
+ fp->close();
+ delete fp;
+
+ if (rv) {
+ QString s(tr("reading midifile\n "));
+ s += name;
+ s += tr("\nfailed: ");
+ s += mf.error();
+ QMessageBox::critical(this, QString("MusE"), s);
+ return rv;
+ }
+ MidiFileTrackList* etl = mf.trackList();
+ int division = mf.division();
+
+ MidiOutPort* outPort = 0;
+ MidiInPort* inPort = 0;
+
+ if (!merge || song->midiOutPorts()->empty()) {
+ outPort = new MidiOutPort();
+ outPort->setDefaultName();
+ song->insertTrack0(outPort, -1);
+
+ //
+ // route output to preferred midi device
+ //
+ if (!config.defaultMidiOutputDevice.isEmpty()) {
+ Route dst(config.defaultMidiOutputDevice, 0, Route::MIDIPORT);
+ outPort->outRoutes()->push_back(dst);
+ }
+ //
+ // set preferred instrument
+ //
+ MidiInstrument* instr = 0; // genericMidiInstrument;
+ for (iMidiInstrument mi = midiInstruments.begin(); mi != midiInstruments.end(); ++mi) {
+ if ((*mi)->iname() == config.defaultMidiInstrument) {
+ instr = *mi;
+ break;
+ }
+ }
+
+ if (config.createDefaultMidiInput) {
+ inPort = new MidiInPort();
+ inPort->setDefaultName();
+ song->insertTrack0(inPort, -1);
+ if (config.connectToAllMidiDevices) {
+ std::list<PortName>* ol = midiDriver->inputPorts();
+ for (std::list<PortName>::iterator ip = ol->begin(); ip != ol->end(); ++ip) {
+ Route src(ip->name, 0, Route::MIDIPORT);
+ inPort->inRoutes()->push_back(src);
+ }
+ }
+ else if (!config.defaultMidiInputDevice.isEmpty()) {
+ Route src(config.defaultMidiInputDevice, 0, Route::MIDIPORT);
+ inPort->inRoutes()->push_back(src);
+ }
+ }
+
+ //
+ // if midi file is GM/GS/XG this overrides the preferred
+ // instrument setting
+
+ if (mf.midiType() != MT_GENERIC) {
+ MidiInstrument* instr2 = 0;
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i) {
+ MidiInstrument* mi = *i;
+ switch(mf.midiType()) {
+ case MT_GM:
+ if (mi->iname() == "GM")
+ instr2 = mi;
+ break;
+ case MT_GS:
+ if (mi->iname() == "GS")
+ instr2 = mi;
+ break;
+ case MT_XG:
+ if (mi->iname() == "XG")
+ instr2 = mi;
+ break;
+ case MT_GENERIC: // cannot happen
+ break;
+ }
+ if (instr2)
+ break;
+ }
+ if (instr2)
+ instr = instr2;
+ }
+ if (instr == 0)
+ instr = genericMidiInstrument;
+ outPort->setInstrument(instr);
+ }
+ else
+ outPort = song->midiOutPorts()->front();
+
+ //
+ // create MidiTrack and copy events to ->events()
+ // - combine note on/off events
+ // - calculate tick value for internal resolution
+ //
+ for (iMidiFileTrack t = etl->begin(); t != etl->end(); ++t) {
+ MPEventList* el = &((*t)->events);
+ if (el->empty())
+ continue;
+ //
+ // if we split the track, SYSEX and META events go into
+ // the first target track
+
+ bool first = true;
+ for (int channel = 0; channel < MIDI_CHANNELS; ++channel) {
+ //
+ // check if there are any events for channel in track:
+ //
+ iMPEvent i;
+ for (i = el->begin(); i != el->end(); ++i) {
+ MidiEvent ev = *i;
+ if (ev.type() != ME_SYSEX
+ && ev.type() != ME_META
+ && ev.channel() == channel)
+ break;
+ }
+ if (i == el->end())
+ continue;
+
+ MidiTrack* track = new MidiTrack();
+//TODO3 if ((*t)->isDrumTrack)
+// track->setUseDrumMap(true);
+ track->outRoutes()->push_back(Route(outPort->channel(channel), -1, Route::TRACK));
+ if (inPort && config.connectToAllMidiTracks) {
+ for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
+ Route src(inPort, ch, Route::TRACK);
+ track->inRoutes()->push_back(src);
+ }
+ }
+
+ EventList* mel = track->events();
+ buildMidiEventList(mel, el, track, division, first);
+ first = false;
+
+ for (iEvent i = mel->begin(); i != mel->end(); ++i) {
+ Event event = i->second;
+ if (event.type() == Controller) {
+ int ctrl = event.dataA();
+ MidiInstrument* instr = outPort->instrument();
+ MidiChannel* mc = outPort->channel(channel);
+ mc->addMidiController(instr, ctrl);
+ CVal val;
+ val.i = event.dataB();
+ mc->addControllerVal(ctrl, event.tick(), val);
+ }
+ }
+#if 0 //TODO3
+ if (channel == 9) {
+ track->setUseDrumMap(true);
+ //
+ // remap drum pitch with drumInmap
+ //
+ EventList* tevents = track->events();
+ for (iEvent i = tevents->begin(); i != tevents->end(); ++i) {
+ Event ev = i->second;
+ if (ev.isNote()) {
+ int pitch = drumInmap[ev.pitch()];
+ ev.setPitch(pitch);
+ }
+ }
+ }
+#endif
+ processTrack(track);
+ if (track->name().isEmpty())
+ track->setDefaultName();
+ song->insertTrack0(track, -1);
+ }
+ if (first) {
+ //
+ // track does only contain non-channel messages
+ // (SYSEX or META)
+ //
+ MidiTrack* track = new MidiTrack();
+ addRoute(Route(track, -1, Route::TRACK), Route(outPort->channel(0), -1, Route::TRACK));
+ EventList* mel = track->events();
+ buildMidiEventList(mel, el, track, division, true);
+ processTrack(track);
+ if (track->name().isEmpty())
+ track->setDefaultName();
+ song->insertTrack0(track, -1);
+ }
+ }
+
+ if (!merge) {
+ TrackList* tl = song->tracks();
+ if (!tl->empty()) {
+ Track* track = tl->front();
+ track->setSelected(true);
+ }
+ unsigned int l = 1;
+ MidiTrackList* mtl = song->midis();
+ for (iMidiTrack t = mtl->begin(); t != mtl->end(); ++t) {
+ MidiTrack* track = *t;
+ PartList* parts = track->parts();
+ for (iPart p = parts->begin(); p != parts->end(); ++p) {
+ unsigned last = p->second->tick() + p->second->lenTick();
+ if (last > l)
+ l = last;
+ }
+ }
+ song->setLen(l);
+
+ AL::TimeSignature sig = AL::sigmap.timesig(0);
+ int z = sig.z;
+ int n = sig.n;
+
+ int tempo = AL::tempomap.tempo(0);
+ transport->setTimesig(z, n);
+//TD transport->setTempo(tempo);
+
+ bool masterF = !AL::tempomap.empty();
+ song->setMasterFlag(masterF);
+ transport->setMasterFlag(masterF);
+
+ song->updatePos();
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// processTrack
+// divide events into parts
+//---------------------------------------------------------
+
+void MusE::processTrack(MidiTrack* track)
+ {
+ EventList* tevents = track->events();
+ if (tevents->empty())
+ return;
+
+ //---------------------------------------------------
+ // Parts ermitteln
+ // die Midi-Spuren werden in Parts aufgebrochen;
+ // ein neuer Part wird bei einer Lücke von einem
+ // Takt gebildet; die Länge wird jeweils auf
+ // Takte aufgerundet und aligned
+ //---------------------------------------------------
+
+ PartList* pl = track->parts();
+
+ int lastTick = 0;
+ for (iEvent i = tevents->begin(); i != tevents->end(); ++i) {
+ Event event = i->second;
+ int epos = event.tick() + event.lenTick();
+ if (epos > lastTick)
+ lastTick = epos;
+ }
+
+ int len = song->roundUpBar(lastTick+1);
+ int bar2, beat;
+ unsigned tick;
+ AL::sigmap.tickValues(len, &bar2, &beat, &tick);
+
+ QString partname = track->name();
+
+ int lastOff = 0;
+ int st = -1; // start tick current part
+ int x1 = 0; // start tick current measure
+ int x2 = 0; // end tick current measure
+
+ for (int bar = 0; bar < bar2; ++bar, x1 = x2) {
+ x2 = AL::sigmap.bar2tick(bar+1, 0, 0);
+ if (lastOff > x2) {
+ // this measure is busy!
+ continue;
+ }
+ iEvent i1 = tevents->lower_bound(x1);
+ iEvent i2 = tevents->lower_bound(x2);
+
+ if (i1 == i2) { // empty?
+ if (st != -1) {
+ Part* part = new Part(track);
+ part->setType(AL::TICKS);
+ part->setTick(st);
+ part->setLenTick(x1-st);
+// printf("new part %d len: %d\n", st, x1-st);
+ part->setName(partname);
+ pl->add(part);
+ st = -1;
+ }
+ }
+ else {
+ if (st == -1)
+ st = x1; // begin new part
+ //HACK:
+ //lastOff:
+ for (iEvent i = i1; i != i2; ++i) {
+ Event event = i->second;
+ if (event.type() == Note) {
+ int off = event.tick() + event.lenTick();
+ if (off > lastOff)
+ lastOff = off;
+ }
+ }
+ }
+ }
+ if (st != -1) {
+ Part* part = new Part(track);
+ part->setType(AL::TICKS);
+ part->setTick(st);
+// printf("new part %d len: %d\n", st, x2-st);
+ part->setLenTick(x2-st);
+ part->setName(partname);
+ pl->add(part);
+ }
+
+ //-------------------------------------------------------------
+ // assign events to parts
+ //-------------------------------------------------------------
+
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ Part* part = p->second;
+ int stick = part->tick();
+ int etick = part->tick() + part->lenTick();
+ iEvent r1 = tevents->lower_bound(stick);
+ iEvent r2 = tevents->lower_bound(etick);
+ int startTick = part->tick();
+
+ EventList* el = part->events();
+ for (iEvent i = r1; i != r2; ++i) {
+ Event ev = i->second;
+ int ntick = ev.tick() - startTick;
+ ev.setTick(ntick);
+ el->add(ev, ntick);
+ }
+ tevents->erase(r1, r2);
+ }
+
+ if (tevents->size())
+ printf("-----------events left: %ld\n", tevents->size());
+ for (iEvent i = tevents->begin(); i != tevents->end(); ++i) {
+ printf("%d===\n", i->first);
+ i->second.dump();
+ }
+ // all events should be processed:
+ assert(tevents->empty());
+ }
+
diff --git a/muse/muse/instruments/CMakeLists.txt b/muse/muse/instruments/CMakeLists.txt
new file mode 100644
index 00000000..87a691c5
--- /dev/null
+++ b/muse/muse/instruments/CMakeLists.txt
@@ -0,0 +1,46 @@
+#
+#
+#
+#
+
+MACRO(WRAP_CPP outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.cpp)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_CPP)
+
+MACRO(WRAP_H outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.h)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_H)
+
+MACRO(WRAP_UI outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.ui)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_UI)
+
+set(mocs
+ minstrument editinstrument
+ )
+
+WRAP_H(mocH ${mocs})
+WRAP_CPP(mocCPP ${mocs})
+
+QT4_WRAP_CPP (moc_headers ${mocH})
+
+set (uics
+ editinstrument
+ )
+
+WRAP_UI(uiUI ${uics})
+QT4_WRAP_UI (ui_headers ${uiUI})
+
+set ( instruments_src ${mocCPP} ${moc_headers})
+
+add_library ( instruments STATIC ${instruments_src})
+set_target_properties( instruments
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_SOURCE_DIR}/all.h"
+ )
+
diff --git a/muse/muse/instruments/editinstrument.cpp b/muse/muse/instruments/editinstrument.cpp
new file mode 100644
index 00000000..9b06c78f
--- /dev/null
+++ b/muse/muse/instruments/editinstrument.cpp
@@ -0,0 +1,119 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: editinstrument.cpp,v 1.6 2005/12/12 22:03:44 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "editinstrument.h"
+#include "minstrument.h"
+
+//---------------------------------------------------------
+// EditInstrument
+//---------------------------------------------------------
+
+EditInstrument::EditInstrument(QWidget* parent)
+ : QMainWindow(parent)
+ {
+ setupUi(this);
+ // populate instrument list
+ for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i)
+ instrumentList->addItem((*i)->iname());
+ instrumentList->setItemSelected(instrumentList->item(0), true);
+ connect(instrumentList, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
+ SLOT(instrumentChanged(QListWidgetItem*)));
+ connect(patchView, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
+ SLOT(patchChanged(QTreeWidgetItem*)));
+ instrumentChanged(instrumentList->item(0));
+ }
+
+//---------------------------------------------------------
+// instrumentChanged
+//---------------------------------------------------------
+
+void EditInstrument::instrumentChanged(QListWidgetItem* sel)
+ {
+ if (sel == 0)
+ return;
+ QString iname = sel->text();
+ iMidiInstrument i = midiInstruments.begin();
+ for (; i != midiInstruments.end(); ++i) {
+ if ((*i)->iname() == iname)
+ break;
+ }
+ patchView->clear();
+ if (i == midiInstruments.end())
+ return;
+ // populate patch list
+ std::vector<PatchGroup>* pg = (*i)->groups();
+ for (std::vector<PatchGroup>::iterator g = pg->begin(); g != pg->end(); ++g) {
+ QTreeWidgetItem* item = new QTreeWidgetItem;
+ item->setText(0, g->name);
+ patchView->addTopLevelItem(item);
+ for (iPatch p = g->patches.begin(); p != g->patches.end(); ++p) {
+ QTreeWidgetItem* sitem = new QTreeWidgetItem;
+ sitem->setText(0, (*p)->name);
+ item->addChild(sitem);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// patchChanged
+//---------------------------------------------------------
+
+void EditInstrument::patchChanged(QTreeWidgetItem* sel)
+ {
+ if (sel == 0) {
+ textLabelPatchName->setText("");
+ return;
+ }
+ textLabelPatchName->setText(sel->text(0));
+ }
+
+//---------------------------------------------------------
+// fileNew
+//---------------------------------------------------------
+
+void EditInstrument::fileNew()
+ {
+
+ }
+
+//---------------------------------------------------------
+// fileOpen
+//---------------------------------------------------------
+
+void EditInstrument::fileOpen()
+ {
+ printf("fileOpen\n");
+ }
+
+//---------------------------------------------------------
+// fileSave
+//---------------------------------------------------------
+
+void EditInstrument::fileSave()
+ {
+
+ }
+
+//---------------------------------------------------------
+// fileSaveAs
+//---------------------------------------------------------
+
+void EditInstrument::fileSaveAs()
+ {
+
+ }
+
+//---------------------------------------------------------
+// fileExit
+//---------------------------------------------------------
+
+void EditInstrument::fileExit()
+ {
+
+ }
+
diff --git a/muse/muse/instruments/editinstrument.h b/muse/muse/instruments/editinstrument.h
new file mode 100644
index 00000000..a5d5cec9
--- /dev/null
+++ b/muse/muse/instruments/editinstrument.h
@@ -0,0 +1,35 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: editinstrument.h,v 1.5 2005/12/12 22:09:09 wschweer Exp $
+//
+// (C) Copyright 2003 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __EDITINSTRUMENT_H__
+#define __EDITINSTRUMENT_H__
+
+#include "ui_editinstrument.h"
+
+//---------------------------------------------------------
+// EditInstrument
+//---------------------------------------------------------
+
+class EditInstrument : public QMainWindow, public Ui::EditInstrumentBase {
+ Q_OBJECT
+
+ private slots:
+ virtual void fileNew();
+ virtual void fileOpen();
+ virtual void fileSave();
+ virtual void fileSaveAs();
+ virtual void fileExit();
+ void instrumentChanged(QListWidgetItem*);
+ void patchChanged(QTreeWidgetItem*);
+
+ public:
+ EditInstrument(QWidget* parent = 0);
+ };
+
+#endif
+
diff --git a/muse/muse/instruments/editinstrument.ui b/muse/muse/instruments/editinstrument.ui
new file mode 100644
index 00000000..648981dc
--- /dev/null
+++ b/muse/muse/instruments/editinstrument.ui
@@ -0,0 +1,756 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>EditInstrumentBase</class>
+ <widget class="QMainWindow" name="EditInstrumentBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>750</width>
+ <height>644</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Instrument Editor</string>
+ </property>
+ <widget class="QWidget" name="widget" >
+ <widget class="QSplitter" name="splitter" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <widget class="QListWidget" name="instrumentList" />
+ <widget class="QTabWidget" name="tabWidget3" >
+ <widget class="QWidget" name="tab" >
+ <attribute name="title" >
+ <string>Patches</string>
+ </attribute>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSplitter" name="" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <widget class="QTreeWidget" name="patchView" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="rootIsDecorated" >
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>Patch/Group</string>
+ </property>
+ </column>
+ </widget>
+ <widget class="QWidget" name="" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QLineEdit" name="patchNameEdit" />
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabelPatchName" >
+ <property name="text" >
+ <string>Patch Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="textLabel4_3" >
+ <property name="text" >
+ <string>Program:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" colspan="3" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>5</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="patchDelete" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>&amp;Delete</string>
+ </property>
+ <property name="shortcut" >
+ <string>Alt+D</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="patchNew" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>&amp;New Patch</string>
+ </property>
+ <property name="shortcut" >
+ <string>Alt+N</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="patchNewGroup" >
+ <property name="text" >
+ <string>New Group</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>240</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>280</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>280</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>280</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="spinBoxLBank" >
+ <property name="specialValueText" >
+ <string>d.c.</string>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>-1</number>
+ </property>
+ <property name="value" >
+ <number>-1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="textLabel2_2" >
+ <property name="text" >
+ <string>High Bank:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="textLabel3_2" >
+ <property name="text" >
+ <string>Low Bank:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>90</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="spinBoxHBank" >
+ <property name="specialValueText" >
+ <string>d.c.</string>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>-1</number>
+ </property>
+ <property name="value" >
+ <number>-1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="spinBoxProgram" />
+ </item>
+ <item row="4" column="0" colspan="3" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="checkBoxDrum" >
+ <property name="text" >
+ <string>Drum</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxGM" >
+ <property name="text" >
+ <string>GM</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxGS" >
+ <property name="text" >
+ <string>GS</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBoxXG" >
+ <property name="text" >
+ <string>XG</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab" >
+ <attribute name="title" >
+ <string>Controller</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabel1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Predefined Controller:</string>
+ </property>
+ </widget>
+ </item>
+ <item rowspan="2" row="1" column="0" >
+ <widget class="QListWidget" name="listController" >
+ <property name="whatsThis" >
+ <string>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QGroupBox" name="GroupBox1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Properties</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel1_3" >
+ <property name="text" >
+ <string>Name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel2_4" >
+ <property name="text" >
+ <string>Type</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>2</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="spinBoxType" >
+ <item>
+ <property name="text" >
+ <string>Control7</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Control14</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>RPN</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>NRPN</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pitch</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Program</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel3_2" >
+ <property name="text" >
+ <string>H-Ctrl</string>
+ </property>
+ <property name="indent" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="spinBoxHCtrlNo" >
+ <property name="toolTip" >
+ <string>Midi Controller Number High Byte</string>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="value" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel2_3_2" >
+ <property name="text" >
+ <string>L-Ctrl</string>
+ </property>
+ <property name="indent" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="spinBoxLCtrlNo" >
+ <property name="toolTip" >
+ <string>Midi Controller Number Low Byte</string>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="value" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLineEdit" name="entryName" />
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="textLabel4_2" >
+ <property name="text" >
+ <string>Range</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel1_2_2" >
+ <property name="text" >
+ <string>Min</string>
+ </property>
+ <property name="indent" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="spinBoxMin" >
+ <property name="maximum" >
+ <number>16384</number>
+ </property>
+ <property name="minimum" >
+ <number>-16385</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel2_2_2" >
+ <property name="text" >
+ <string>Max</string>
+ </property>
+ <property name="indent" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="spinBoxMax" >
+ <property name="maximum" >
+ <number>16384</number>
+ </property>
+ <property name="minimum" >
+ <number>-16385</number>
+ </property>
+ <property name="value" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="textLabel1_3" >
+ <property name="text" >
+ <string>Default</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="spinBoxDefault" />
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item rowspan="2" row="0" column="1" >
+ <widget class="QTreeWidget" name="viewController" >
+ <property name="toolTip" >
+ <string>list of defined controllers</string>
+ </property>
+ <property name="whatsThis" >
+ <string>This is the MusE list of defined controllers.</string>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <column>
+ <property name="text" >
+ <string>Name </string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Type </string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>H-Ctrl</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>L-Ctrl</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Min Val</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Max Val</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="TabPage" >
+ <attribute name="title" >
+ <string>SysEx</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>130</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item rowspan="3" row="0" column="0" >
+ <widget class="QListWidget" name="listBox2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QTextEdit" name="initSysEx" />
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="textLabel1_2" >
+ <property name="text" >
+ <string>Hex Entry:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QMenuBar" name="MenuBar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>750</width>
+ <height>35</height>
+ </rect>
+ </property>
+ <property name="defaultUp" >
+ <bool>false</bool>
+ </property>
+ <widget class="QMenu" name="fileMenu" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>155</width>
+ <height>213</height>
+ </rect>
+ </property>
+ <property name="title" >
+ <string>&amp;File</string>
+ </property>
+ <addaction name="fileNewAction" />
+ <addaction name="fileOpenAction" />
+ <addaction name="fileSaveAction" />
+ <addaction name="fileSaveAsAction" />
+ <addaction name="separator" />
+ <addaction name="fileExitAction" />
+ </widget>
+ <addaction name="fileMenu" />
+ </widget>
+ <action name="fileNewAction" >
+ <property name="icon" >
+ <iconset>image0</iconset>
+ </property>
+ <property name="text" >
+ <string>&amp;New</string>
+ </property>
+ <property name="iconText" >
+ <string>New</string>
+ </property>
+ <property name="shortcut" >
+ <string>Ctrl+N</string>
+ </property>
+ </action>
+ <action name="fileOpenAction" >
+ <property name="icon" >
+ <iconset>image1</iconset>
+ </property>
+ <property name="text" >
+ <string>&amp;Open...</string>
+ </property>
+ <property name="iconText" >
+ <string>Open</string>
+ </property>
+ <property name="shortcut" >
+ <string>Ctrl+O</string>
+ </property>
+ </action>
+ <action name="fileSaveAction" >
+ <property name="icon" >
+ <iconset>image2</iconset>
+ </property>
+ <property name="text" >
+ <string>&amp;Save</string>
+ </property>
+ <property name="iconText" >
+ <string>Save</string>
+ </property>
+ <property name="shortcut" >
+ <string>Ctrl+S</string>
+ </property>
+ </action>
+ <action name="fileSaveAsAction" >
+ <property name="text" >
+ <string>Save &amp;As...</string>
+ </property>
+ <property name="iconText" >
+ <string>Save As</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ </action>
+ <action name="fileExitAction" >
+ <property name="text" >
+ <string>E&amp;xit</string>
+ </property>
+ <property name="iconText" >
+ <string>Exit</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ </action>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <includes/>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/instruments/midictrledit.cpp b/muse/muse/instruments/midictrledit.cpp
new file mode 100644
index 00000000..61b543b3
--- /dev/null
+++ b/muse/muse/instruments/midictrledit.cpp
@@ -0,0 +1,407 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: midictrledit.cpp,v 1.3 2005/09/22 20:12:59 wschweer Exp $
+//
+// (C) Copyright 2003 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "app.h"
+#include "midiport.h"
+#include "driver/mididev.h"
+#include "midictrl.h"
+#include "midictrledit.h"
+#include "xml.h"
+#include "filedialog.h"
+#include "globals.h"
+
+MidiControllerEditDialog* midiControllerEditDialog;
+
+static MidiController predefinedMidiController[] = {
+ MidiController("Pitch", 0x40000, -10000, +10000),
+ MidiController("Program", 0x40001, 0, 127),
+ MidiController("BankSel", 0x10000, 0, 16383)
+ };
+
+enum {
+ COL_NAME = 0, COL_TYPE,
+ COL_HNUM, COL_LNUM, COL_MIN, COL_MAX
+ };
+
+//---------------------------------------------------------
+// addControllerToView
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::addControllerToView(MidiController* mctrl)
+ {
+ QString hnum;
+ hnum.setNum(mctrl->num());
+ QString lnum("---");
+ QString min;
+ min.setNum(mctrl->minVal());
+ QString max;
+ max.setNum(mctrl->maxVal());
+ new Q3ListViewItem(viewController,
+ mctrl->name(),
+ int2ctrlType(mctrl->type()),
+ hnum, lnum, min, max
+ );
+ }
+
+//---------------------------------------------------------
+// MidiControllerEditDialog
+//---------------------------------------------------------
+
+MidiControllerEditDialog::MidiControllerEditDialog(QWidget* parent, const char* name, bool modal, Qt::WFlags fl)
+ : MidiControllerEditDialogBase(parent, name, modal, fl)
+ {
+ viewController->setColumnAlignment(COL_HNUM, AlignCenter);
+ viewController->setColumnAlignment(COL_LNUM, AlignCenter);
+ viewController->setColumnAlignment(COL_MIN, AlignCenter);
+ viewController->setColumnAlignment(COL_MAX, AlignCenter);
+ viewController->setColumnWidthMode(COL_NAME, Q3ListView::Maximum);
+
+ // populate list of predefined controller
+ int size = sizeof(predefinedMidiController) / sizeof(*predefinedMidiController);
+ for (int i = 0; i < size; ++i)
+ listController->insertItem(predefinedMidiController[i].name());
+ listController->setSelected(0, true);
+
+ // populate ports pulldown
+ for (int i = 0; i < MIDI_PORTS; ++i) {
+ MidiPort* port = &midiPorts[i];
+ MidiDevice* dev = port->device();
+ QString name;
+ name.sprintf("%d(%s)", port->portno()+1,
+ dev ? dev->name().latin1() : "none");
+ midiPortsList->insertItem(name, i);
+ }
+
+ reject(); // populate list
+ viewController->setCurrentItem(viewController->firstChild());
+
+ connect(buttonNew, SIGNAL(clicked()), SLOT(ctrlAdd()));
+ connect(buttonDelete, SIGNAL(clicked()), SLOT(ctrlDelete()));
+ connect(entryName, SIGNAL(textChanged(const QString&)), SLOT(nameChanged(const QString&)));
+ connect(comboType, SIGNAL(activated(const QString&)), SLOT(typeChanged(const QString&)));
+ connect(spinboxHCtrlNo, SIGNAL(valueChanged(int)), SLOT(valueHChanged(int)));
+ connect(spinboxLCtrlNo, SIGNAL(valueChanged(int)), SLOT(valueLChanged(int)));
+ connect(spinboxMin, SIGNAL(valueChanged(int)), SLOT(minChanged(int)));
+ connect(spinboxMax, SIGNAL(valueChanged(int)), SLOT(maxChanged(int)));
+ connect(viewController, SIGNAL(selectionChanged()), SLOT(controllerChanged()));
+
+ controllerChanged(viewController->currentItem());
+ }
+
+//---------------------------------------------------------
+// reject
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::reject()
+ {
+ viewController->clear();
+ for (iMidiController i = midiControllerList.begin();
+ i != midiControllerList.end(); ++i) {
+ addControllerToView(&*i);
+ }
+ MidiControllerEditDialogBase::reject();
+ }
+
+//---------------------------------------------------------
+// ctrlAdd
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::ctrlAdd()
+ {
+ Q3ListBoxItem* item = listController->selectedItem();
+ if (item == 0)
+ return;
+ QString name = item->text();
+ int size = sizeof(predefinedMidiController) / sizeof(*predefinedMidiController);
+ for (int i = 0; i < size; ++i) {
+ MidiController* c = &predefinedMidiController[i];
+ if (c->name() != name)
+ continue;
+ MidiController::ControllerType t = c->type();
+ QString type = int2ctrlType(t);
+ QString min, max;
+ min.setNum(c->minVal());
+ max.setNum(c->maxVal());
+
+ QString hno, lno;
+ int h = (c->num() >> 14) & 0x7f;
+ int l = c->num() & 0x7f;
+
+ switch(t) {
+ case MidiController::Controller7:
+ hno = "---";
+ lno.setNum(l);
+ break;
+ case MidiController::RPN:
+ case MidiController::NRPN:
+ case MidiController::Controller14:
+ hno.setNum(h);
+ lno.setNum(l);
+ break;
+ case MidiController::Pitch:
+ case MidiController::Program:
+ hno = "---";
+ lno = "---";
+ default:
+ break;
+ }
+
+ Q3ListViewItem* item = new Q3ListViewItem(viewController,
+ name, type, hno, lno, min, max);
+
+ viewController->setCurrentItem(item);
+ controllerChanged(item);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// ctrlDelete
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::ctrlDelete()
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ delete item;
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::accept()
+ {
+ midiControllerList.clear();
+
+ Q3ListViewItem* item = viewController->firstChild();
+ int hval = item->text(COL_HNUM).toInt();
+ int lval = item->text(COL_LNUM).toInt();
+
+ while (item) {
+ MidiController c;
+ c.setName(item->text(COL_NAME));
+ MidiController::ControllerType type = ctrlType2Int(item->text(COL_TYPE));
+
+ switch(type) {
+ case MidiController::Controller7:
+ c.setNum(hval);
+ break;
+ case MidiController::Controller14:
+ c.setNum((hval << 8 | lval) | 0x10000);
+ break;
+ case MidiController::RPN:
+ c.setNum((hval << 8 | lval) | 0x20000);
+ break;
+ case MidiController::NRPN:
+ c.setNum((hval << 8 | lval) | 0x30000);
+ break;
+ case MidiController::Pitch:
+ c.setNum(CTRL_PITCH);
+ break;
+ default:
+ break;
+ }
+ c.setMinVal(item->text(COL_MIN).toInt());
+ c.setMaxVal(item->text(COL_MAX).toInt());
+ midiControllerList.push_back(c);
+ item = item->nextSibling();
+ }
+ MidiControllerEditDialogBase::accept();
+ }
+
+//---------------------------------------------------------
+// nameChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::nameChanged(const QString& s)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ item->setText(COL_NAME, s);
+ }
+
+//---------------------------------------------------------
+// typeChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::typeChanged(const QString& s)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ item->setText(COL_TYPE, s);
+ item->setText(COL_MIN, QString("0"));
+ switch(ctrlType2Int(s)) {
+ case 2: // RPN
+ case 3: // NRPN
+ case MidiController::Controller14:
+ item->setText(COL_MAX, QString("16383"));
+ break;
+ case MidiController::Controller7:
+ case MidiController::Program:
+ item->setText(COL_MAX, QString("127"));
+ break;
+ case MidiController::Pitch:
+ item->setText(COL_MIN, QString("-5000"));
+ item->setText(COL_MAX, QString("+5000"));
+ break;
+ default:
+ break;
+ }
+ controllerChanged(item);
+ }
+
+//---------------------------------------------------------
+// valueHChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::valueHChanged(int val)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ QString s;
+ s.setNum(val);
+ item->setText(COL_HNUM, s);
+ }
+
+//---------------------------------------------------------
+// valueLChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::valueLChanged(int val)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ QString s;
+ s.setNum(val);
+ item->setText(COL_LNUM, s);
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::controllerChanged()
+ {
+ Q3ListViewItem* item = viewController->selectedItem();
+ controllerChanged(item);
+ }
+
+void MidiControllerEditDialog::controllerChanged(Q3ListViewItem* item)
+ {
+ if (item == 0) {
+ entryName->setEnabled(false);
+ comboType->setEnabled(false);
+ spinboxHCtrlNo->setEnabled(false);
+ spinboxLCtrlNo->setEnabled(false);
+ spinboxMin->setEnabled(false);
+ spinboxMax->setEnabled(false);
+ return;
+ }
+
+ entryName->blockSignals(true);
+ comboType->blockSignals(true);
+ spinboxHCtrlNo->blockSignals(true);
+ spinboxLCtrlNo->blockSignals(true);
+ spinboxMin->blockSignals(true);
+ spinboxMax->blockSignals(true);
+
+ entryName->setEnabled(true);
+ entryName->setText(item->text(COL_NAME));
+ comboType->setCurrentItem(int(ctrlType2Int(item->text(COL_TYPE))));
+ switch (ctrlType2Int(item->text(COL_TYPE))) {
+ case MidiController::Controller7:
+ comboType->setEnabled(true);
+ spinboxHCtrlNo->setEnabled(false);
+ spinboxLCtrlNo->setEnabled(true);
+ spinboxMin->setEnabled(true);
+ spinboxMax->setEnabled(true);
+
+ spinboxHCtrlNo->setValue(item->text(COL_HNUM).toInt());
+ spinboxMin->setValue(item->text(COL_MIN).toInt());
+ spinboxMax->setValue(item->text(COL_MAX).toInt());
+ item->setText(COL_LNUM, QString("---"));
+ break;
+
+ case MidiController::Controller14:
+ case MidiController::RPN:
+ case MidiController::NRPN:
+ comboType->setEnabled(true);
+ spinboxHCtrlNo->setEnabled(true);
+ spinboxLCtrlNo->setEnabled(true);
+ spinboxMin->setEnabled(true);
+ spinboxMax->setEnabled(true);
+
+ spinboxHCtrlNo->setValue(item->text(COL_HNUM).toInt());
+ spinboxLCtrlNo->setValue(item->text(COL_LNUM).toInt());
+ spinboxMin->setValue(item->text(COL_MIN).toInt());
+ spinboxMax->setValue(item->text(COL_MAX).toInt());
+ break;
+
+ case MidiController::Pitch:
+ case MidiController::Program:
+ comboType->setEnabled(true);
+ spinboxHCtrlNo->setEnabled(false);
+ spinboxLCtrlNo->setEnabled(false);
+ spinboxMin->setEnabled(true);
+ spinboxMax->setEnabled(true);
+ break;
+ default:
+ break;
+ }
+ entryName->blockSignals(false);
+ comboType->blockSignals(false);
+ spinboxHCtrlNo->blockSignals(false);
+ spinboxLCtrlNo->blockSignals(false);
+ spinboxMin->blockSignals(false);
+ spinboxMax->blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// minChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::minChanged(int val)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ QString s;
+ s.setNum(val);
+ item->setText(COL_MIN, s);
+ }
+
+//---------------------------------------------------------
+// maxChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::maxChanged(int val)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ QString s;
+ s.setNum(val);
+ item->setText(COL_MAX, s);
+ }
+
+//---------------------------------------------------------
+// configMidiController
+//---------------------------------------------------------
+
+void configMidiController()
+ {
+ if (midiControllerEditDialog == 0)
+ midiControllerEditDialog = new MidiControllerEditDialog();
+ midiControllerEditDialog->show();
+ }
diff --git a/muse/muse/instruments/midictrledit.h b/muse/muse/instruments/midictrledit.h
new file mode 100644
index 00000000..c42b9be5
--- /dev/null
+++ b/muse/muse/instruments/midictrledit.h
@@ -0,0 +1,46 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: midictrledit.h,v 1.2 2005/09/22 20:12:59 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MIDICTRLEDIT_H__
+#define __MIDICTRLEDIT_H__
+
+#include "ccontrolbase.h"
+#include "midictrl.h"
+
+//---------------------------------------------------------
+// MidiControllerEditDialog
+//---------------------------------------------------------
+
+class MidiControllerEditDialog : public MidiControllerEditDialogBase {
+ Q_OBJECT
+
+ void addControllerToView(MidiController* mctrl);
+ void mergeReplace(bool replace);
+
+ private slots:
+ void ctrlAdd();
+ void ctrlDelete();
+ virtual void accept();
+ virtual void reject();
+ void nameChanged(const QString&);
+ void typeChanged(const QString&);
+ void valueHChanged(int);
+ void valueLChanged(int);
+ void controllerChanged(Q3ListViewItem*);
+ void controllerChanged();
+ void minChanged(int);
+ void maxChanged(int);
+
+ public:
+ MidiControllerEditDialog(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WFlags fl = 0);
+ };
+
+extern MidiControllerEditDialog* midiControllerEditDialog;
+extern void configMidiController();
+#endif
+
diff --git a/muse/muse/instruments/minstrument.cpp b/muse/muse/instruments/minstrument.cpp
new file mode 100644
index 00000000..5394dcec
--- /dev/null
+++ b/muse/muse/instruments/minstrument.cpp
@@ -0,0 +1,482 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: minstrument.cpp,v 1.28 2006/01/27 10:35:25 wschweer Exp $
+//
+// (C) Copyright 2000-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "minstrument.h"
+#include "track.h"
+#include "globals.h"
+#include "event.h"
+#include "mpevent.h"
+#include "midictrl.h"
+#include "gconfig.h"
+#include "midiedit/drummap.h"
+
+MidiInstrumentList midiInstruments;
+MidiInstrument* genericMidiInstrument;
+
+//---------------------------------------------------------
+// Patch
+//---------------------------------------------------------
+
+Patch::Patch()
+ {
+ drumMap = 0;
+ }
+
+Patch::~Patch()
+ {
+ if (drumMap)
+ delete drumMap;
+ }
+
+//---------------------------------------------------------
+// loadIDF
+//---------------------------------------------------------
+
+static void loadIDF(QFileInfo* fi)
+ {
+ QFile qf(fi->filePath());
+ if (!qf.open(QIODevice::ReadOnly)) {
+ printf("cannot open file %s\n", fi->fileName().toLatin1().data());
+ return;
+ }
+ QDomDocument doc;
+ int line, column;
+ QString err;
+ if (!doc.setContent(&qf, false, &err, &line, &column)) {
+ QString col, ln, error;
+ col.setNum(column);
+ ln.setNum(line);
+ error = err + " at line: " + ln + " col: " + col;
+ printf("error reading file <%s>:\n %s\n",
+ fi->filePath().toLatin1().data(), error.toLatin1().data());
+ return;
+ }
+ QDomNode node = doc.documentElement();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "muse") {
+ QString version = e.attribute(QString("version"));
+ for (QDomNode n = node.firstChild(); !n.isNull(); n = n.nextSibling()) {
+ QDomElement e = n.toElement();
+ if (e.tagName() == "MidiInstrument") {
+ MidiInstrument* i = new MidiInstrument();
+ i->read(n);
+ midiInstruments.push_back(i);
+ }
+ }
+ }
+ else
+ printf("MusE:laodIDF: %s not supported\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ qf.close();
+ }
+
+//---------------------------------------------------------
+// initMidiInstruments
+//---------------------------------------------------------
+
+void initMidiInstruments()
+ {
+ genericMidiInstrument = new MidiInstrument(QWidget::tr("generic midi"));
+
+ midiInstruments.push_back(genericMidiInstrument);
+ QString museGlobalInstruments(museGlobalShare
+ + QString("/instruments"));
+ if (debugMsg)
+ printf("load instrument definitions from <%s>\n", museGlobalInstruments.toLatin1().data());
+ QDir instrumentsDir(museGlobalInstruments, QString("*.idf"),
+ QDir::SortFlags(QDir::Name | QDir::IgnoreCase), QDir::Files);
+ if (instrumentsDir.exists()) {
+ QFileInfoList list = instrumentsDir.entryInfoList();
+ int n = list.size();
+ for (int i = 0; i < n; ++i) {
+ QFileInfo fi = list.at(i);
+ loadIDF(&fi);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// registerMidiInstrument
+//---------------------------------------------------------
+
+MidiInstrument* registerMidiInstrument(const QString& name)
+ {
+ for (iMidiInstrument i = midiInstruments.begin();
+ i != midiInstruments.end(); ++i) {
+ if ((*i)->iname() == name)
+ return *i;
+ }
+ return genericMidiInstrument;
+ }
+
+//---------------------------------------------------------
+// removeMidiInstrument
+//---------------------------------------------------------
+
+void removeMidiInstrument(const QString& name)
+ {
+ for (iMidiInstrument i = midiInstruments.begin();
+ i != midiInstruments.end(); ++i) {
+ if ((*i)->iname() == name) {
+ midiInstruments.erase(i);
+ return;
+ }
+ }
+ }
+
+void removeMidiInstrument(const MidiInstrument* instr)
+ {
+ for (iMidiInstrument i = midiInstruments.begin();
+ i != midiInstruments.end(); ++i) {
+ if (*i == instr) {
+ midiInstruments.erase(i);
+ return;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// MidiInstrument
+//---------------------------------------------------------
+
+void MidiInstrument::init()
+ {
+ _initScript = 0;
+ _midiInit = new EventList();
+ _midiReset = new EventList();
+ _midiState = new EventList();
+ _controller = new MidiControllerList;
+
+ // add some default controller to controller list
+ // this controllers are always available for all instruments
+ //
+ MidiController* prog = new MidiController("Program", CTRL_PROGRAM, 0, 0x7fffff, 0);
+ _controller->push_back(prog);
+ }
+
+MidiInstrument::MidiInstrument()
+ {
+ init();
+ }
+
+//---------------------------------------------------------
+// MidiInstrument
+//---------------------------------------------------------
+
+MidiInstrument::MidiInstrument(const QString& txt)
+ {
+ _name = txt;
+ init();
+ }
+
+//---------------------------------------------------------
+// MidiInstrument
+//---------------------------------------------------------
+
+MidiInstrument::~MidiInstrument()
+ {
+ delete _midiInit;
+ delete _midiReset;
+ delete _midiState;
+ delete _controller;
+ if (_initScript)
+ delete _initScript;
+ }
+
+//---------------------------------------------------------
+// reset
+// send note off to all channels
+//---------------------------------------------------------
+
+void MidiInstrument::reset(MidiOutPort* mp)
+ {
+ MidiEvent ev;
+ ev.setType(0x90);
+ for (int chan = 0; chan < MIDI_CHANNELS; ++chan) {
+ ev.setChannel(chan);
+ for (int pitch = 0; pitch < 128; ++pitch) {
+ ev.setA(pitch);
+ ev.setB(0);
+ mp->putEvent(ev);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// readPatchGroup
+//---------------------------------------------------------
+
+void PatchGroup::read(QDomNode node)
+ {
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+
+ if (tag == "Patch") {
+ Patch* patch = new Patch;
+ patch->read(node, false);
+ patches.push_back(patch);
+ }
+ else if (tag == "drummap") {
+ Patch* patch = new Patch;
+ patch->read(node, true);
+ patches.push_back(patch);
+ }
+ else if (!tag.isEmpty())
+ printf("MusE:PatchGroup(): unknown tag %s in group %s\n",
+ e.tagName().toLatin1().data(), name.toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void Patch::read(QDomNode node, bool dr)
+ {
+ QDomElement e = node.toElement();
+ name = e.attribute(QString("name"));
+ typ = e.attribute(QString("mode"), "-1").toInt();
+ hbank = e.attribute(QString("hbank"), "-1").toInt();
+ lbank = e.attribute(QString("lbank"), "-1").toInt();
+ prog = e.attribute(QString("prog"), "0").toInt();
+ drumMap = 0;
+ if (!dr)
+ return;
+ drumMap = new DrumMap(name);
+ int idx = 0;
+ for (node = node.firstChild(); !node.isNull(); node = node.nextSibling()) {
+ e = node.toElement();
+ QString tag(e.tagName());
+ if (tag == "entry") {
+ DrumMapEntry* de = drumMap->entry(idx);
+ de->read(node);
+ ++idx;
+ }
+ else if (!tag.isEmpty()) {
+ printf("Patch: read drummap: unknown tag %s\n", tag.toLatin1().data());
+ }
+ }
+ drumMap->init();
+ }
+
+//---------------------------------------------------------
+// readMidiState
+//---------------------------------------------------------
+
+void MidiInstrument::readMidiState(QDomNode node)
+ {
+ _midiState->read(node, true);
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void MidiInstrument::read(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ _name = e.attribute("name");
+
+ for (node = node.firstChild(); !node.isNull(); node = node.nextSibling()) {
+ e = node.toElement();
+ QString tag(e.tagName());
+ if (tag == "Patch") {
+ Patch* patch = new Patch;
+ patch->read(node, false);
+ if (pg.empty()) {
+ PatchGroup p;
+ p.patches.push_back(patch);
+ pg.push_back(p);
+ }
+ else
+ pg[0].patches.push_back(patch);
+ }
+ else if (tag == "Category")
+ ; // TODO
+ else if (tag == "drummap") {
+ Patch* patch = new Patch;
+ patch->read(node, true);
+ if (pg.empty()) {
+ PatchGroup p;
+ p.patches.push_back(patch);
+ pg.push_back(p);
+ }
+ else
+ pg[0].patches.push_back(patch);
+ }
+ else if (tag == "PatchGroup") {
+ PatchGroup p;
+ p.name = e.attribute("name");
+ p.read(node.firstChild());
+ pg.push_back(p);
+ }
+ else if (tag == "Controller") {
+ MidiController* mc = new MidiController();
+ mc->read(node);
+ _controller->push_back(mc);
+ }
+ else if (tag == "Init")
+ _midiInit->read(node.firstChild(), true);
+ else if (tag == "SysEx") {
+ SysEx se;
+ se.name = e.attribute("name");
+ for (QDomNode nnode = node.firstChild(); !nnode.isNull(); nnode = nnode.nextSibling()) {
+ e = nnode.toElement();
+ QString tag(e.tagName());
+ if (tag == "comment")
+ se.comment = e.text();
+ else if (tag == "data")
+ se.data = e.text();
+ else
+ printf("MidiInstrument::read():SysEx: unknown tag %s\n", tag.toLatin1().data());
+ }
+ sysex.push_back(se);
+ }
+ else if (!tag.isEmpty()) {
+ printf("MidiInstrument::read(): unknown tag %s\n", tag.toLatin1().data());
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// getPatchName
+//---------------------------------------------------------
+
+QString MidiInstrument::getPatchName(int /*channel*/, int prog)
+ {
+ int hbank = (prog >> 16) & 0xff;
+ int lbank = (prog >> 8) & 0xff;
+ prog &= 0xff;
+ if (prog == 0xff)
+ return "---";
+
+ int tmask = 1;
+ bool hb = hbank == 0xff;
+ bool lb = lbank == 0xff;
+
+ for (std::vector<PatchGroup>::iterator i = pg.begin(); i != pg.end(); ++i) {
+ PatchList& pl = i->patches;
+ for (PatchList::const_iterator ipl = pl.begin(); ipl != pl.end(); ++ipl) {
+ const Patch* mp = *ipl;
+ if ((mp->typ & tmask)
+ && (prog == mp->prog)
+ && (hbank == mp->hbank || hb || mp->hbank == -1)
+ && (lbank == mp->lbank || lb || mp->lbank == -1))
+ return mp->name;
+ }
+ }
+ return QString("---");
+ }
+
+//---------------------------------------------------------
+// getDrumMap
+//---------------------------------------------------------
+
+DrumMap* MidiInstrument::getDrumMap(int prog)
+ {
+ int hbank = (prog >> 16) & 0xff;
+ int lbank = (prog >> 8) & 0xff;
+ prog &= 0xff;
+ if (prog == 0xff)
+ return 0;
+
+ int tmask = 1;
+ bool hb = hbank == 0xff;
+ bool lb = lbank == 0xff;
+
+ for (std::vector<PatchGroup>::iterator i = pg.begin(); i != pg.end(); ++i) {
+ PatchList& pl = i->patches;
+ for (PatchList::const_iterator ipl = pl.begin(); ipl != pl.end(); ++ipl) {
+ const Patch* mp = *ipl;
+ if ((mp->typ & tmask)
+ && (prog == mp->prog)
+ && (hbank == mp->hbank || hb || mp->hbank == -1)
+ && (lbank == mp->lbank || lb || mp->lbank == -1)) {
+ return mp->drumMap;
+ }
+ }
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// populatePatchPopup
+//---------------------------------------------------------
+
+void MidiInstrument::populatePatchPopup(QMenu* menu, int)
+ {
+ menu->clear();
+ int mask = 7;
+
+ if (pg.size() > 1) {
+ for (std::vector<PatchGroup>::iterator i = pg.begin(); i != pg.end(); ++i) {
+ QMenu* pm = menu->addMenu(i->name);
+ pm->setFont(*config.fonts[0]);
+ PatchList& pl = i->patches;
+ for (PatchList::const_iterator ipl = pl.begin(); ipl != pl.end(); ++ipl) {
+ const Patch* mp = *ipl;
+ if (mp->typ & mask) {
+ int id = ((mp->hbank & 0xff) << 16)
+ + ((mp->lbank & 0xff) << 8) + (mp->prog & 0xff);
+ QAction* a = pm->addAction(mp->name);
+ a->setData(id);
+ }
+ }
+ }
+ }
+ else if (pg.size() == 1 ){
+ // no groups
+ PatchList& pl = pg.front().patches;
+ for (PatchList::const_iterator ipl = pl.begin(); ipl != pl.end(); ++ipl) {
+ const Patch* mp = *ipl;
+ if (mp->typ & mask) {
+ int id = ((mp->hbank & 0xff) << 16)
+ + ((mp->lbank & 0xff) << 8) + (mp->prog & 0xff);
+ QAction* a = menu->addAction(mp->name);
+ a->setData(id);
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// getMidiController
+//---------------------------------------------------------
+
+MidiController* MidiInstrument::midiController(int num) const
+ {
+ for (iMidiController i = _controller->begin(); i != _controller->end(); ++i) {
+ int cn = (*i)->num();
+ if (cn == num)
+ return *i;
+ // wildcard?
+ if (((cn & 0xff) == 0xff) && ((cn & ~0xff) == (num & ~0xff)))
+ return *i;
+ }
+ for (iMidiController i = defaultMidiController.begin(); i != defaultMidiController.end(); ++i) {
+ int cn = (*i)->num();
+ if (cn == num)
+ return *i;
+ // wildcard?
+ if (((cn & 0xff) == 0xff) && ((cn & ~0xff) == (num & ~0xff)))
+ return *i;
+ }
+ QString name = midiCtrlName(num);
+ int min = 0;
+ int max = 127;
+ MidiController* c = new MidiController(name, num, min, max, 0);
+ defaultMidiController.push_back(c);
+ return c;
+ }
+
+
diff --git a/muse/muse/instruments/minstrument.h b/muse/muse/instruments/minstrument.h
new file mode 100644
index 00000000..a18c7e82
--- /dev/null
+++ b/muse/muse/instruments/minstrument.h
@@ -0,0 +1,125 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: minstrument.h,v 1.15 2006/01/14 17:08:48 wschweer Exp $
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MINSTRUMENT_H__
+#define __MINSTRUMENT_H__
+
+#include "globaldefs.h"
+
+class MidiOutPort;
+class EventList;
+class MidiControllerList;
+class MidiController;
+class MidiEvent;
+class DrumMap;
+
+//---------------------------------------------------------
+// Patch
+//---------------------------------------------------------
+
+struct Patch {
+ signed char typ; // 1 - GM 2 - GS 4 - XG
+ signed char hbank, lbank, prog;
+ QString name;
+ DrumMap* drumMap;
+ void read(QDomNode, bool);
+
+ Patch();
+ ~Patch();
+ };
+
+typedef std::list<Patch*> PatchList;
+typedef PatchList::iterator iPatch;
+typedef PatchList::const_iterator ciPatch;
+
+//---------------------------------------------------------
+// PatchGroup
+//---------------------------------------------------------
+
+struct PatchGroup {
+ QString name;
+ PatchList patches;
+ void read(QDomNode);
+ };
+
+struct SysEx {
+ QString name;
+ QString comment;
+ QString data;
+ };
+
+//---------------------------------------------------------
+// MidiInstrument
+//---------------------------------------------------------
+
+class MidiInstrument {
+ std::vector<PatchGroup> pg;
+ MidiControllerList* _controller;
+ std::vector<SysEx> sysex;
+
+ void init();
+
+ protected:
+ EventList* _midiInit;
+ EventList* _midiReset;
+ EventList* _midiState;
+ char* _initScript;
+ QString _name;
+
+ public:
+ MidiInstrument();
+ virtual ~MidiInstrument();
+ MidiInstrument(const QString& txt);
+ const QString& iname() const { return _name; }
+ void setIName(const QString& txt) { _name = txt; }
+
+ EventList* midiInit() const { return _midiInit; }
+ EventList* midiReset() const { return _midiReset; }
+ EventList* midiState() const { return _midiState; }
+ const char* initScript() const { return _initScript; }
+ MidiControllerList* controller() const { return _controller; }
+
+ void readMidiState(QDomNode);
+ virtual bool guiVisible() const { return false; }
+ virtual void showGui(bool) {}
+ virtual bool hasGui() const { return false; }
+ virtual void writeToGui(const MidiEvent&) {}
+
+ virtual QString getPatchName(int,int);
+ virtual DrumMap* getDrumMap(int);
+
+ virtual void populatePatchPopup(QMenu*, int);
+ void read(QDomNode);
+ std::vector<SysEx>* sysexList() { return &sysex; }
+ MidiController* midiController(int num) const;
+ void reset(MidiOutPort*);
+
+ std::vector<PatchGroup>* groups() { return &pg; }
+ };
+
+//---------------------------------------------------------
+// MidiInstrumentList
+//---------------------------------------------------------
+
+class MidiInstrumentList : public std::vector<MidiInstrument*> {
+
+ public:
+ MidiInstrumentList() {}
+ };
+
+typedef MidiInstrumentList::iterator iMidiInstrument;
+
+extern MidiInstrumentList midiInstruments;
+extern MidiInstrument* genericMidiInstrument;
+extern void initMidiInstruments();
+extern MidiInstrument* registerMidiInstrument(const QString&);
+extern void removeMidiInstrument(const QString& name);
+extern void removeMidiInstrument(const MidiInstrument* instr);
+
+#endif
+
diff --git a/muse/muse/ladspa.h b/muse/muse/ladspa.h
new file mode 100644
index 00000000..7bbc338f
--- /dev/null
+++ b/muse/muse/ladspa.h
@@ -0,0 +1,599 @@
+/* ladspa.h
+
+ Linux Audio Developer's Simple Plugin API Version 1.1[provisional,
+ LGPL]. Copyright (C) 2000-2002 Richard W.E. Furse, Paul
+ Barton-Davis, Stefan Westerfeld.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ USA. */
+
+#ifndef LADSPA_INCLUDED
+#define LADSPA_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************/
+
+/* Overview:
+
+ There is a large number of synthesis packages in use or development
+ on the Linux platform at this time. This API (`The Linux Audio
+ Developer's Simple Plugin API') attempts to give programmers the
+ ability to write simple `plugin' audio processors in C/C++ and link
+ them dynamically (`plug') into a range of these packages (`hosts').
+ It should be possible for any host and any plugin to communicate
+ completely through this interface.
+
+ This API is deliberately short and simple. To achieve compatibility
+ with a range of promising Linux sound synthesis packages it
+ attempts to find the `greatest common divisor' in their logical
+ behaviour. Having said this, certain limiting decisions are
+ implicit, notably the use of a fixed type (LADSPA_Data) for all
+ data transfer and absence of a parameterised `initialisation'
+ phase. See below for the LADSPA_Data typedef.
+
+ Plugins are expected to distinguish between control and audio
+ data. Plugins have `ports' that are inputs or outputs for audio or
+ control data and each plugin is `run' for a `block' corresponding
+ to a short time interval measured in samples. Audio data is
+ communicated using arrays of LADSPA_Data, allowing a block of audio
+ to be processed by the plugin in a single pass. Control data is
+ communicated using single LADSPA_Data values. Control data has a
+ single value at the start of a call to the `run()' or `run_adding()'
+ function, and may be considered to remain this value for its
+ duration. The plugin may assume that all its input and output ports
+ have been connected to the relevant data location (see the
+ `connect_port()' function below) before it is asked to run.
+
+ Plugins will reside in shared object files suitable for dynamic
+ linking by dlopen() and family. The file will provide a number of
+ `plugin types' that can be used to instantiate actual plugins
+ (sometimes known as `plugin instances') that can be connected
+ together to perform tasks.
+
+ This API contains very limited error-handling. */
+
+/*****************************************************************************/
+
+/* Fundamental data type passed in and out of plugin. This data type
+ is used to communicate audio samples and control values. It is
+ assumed that the plugin will work sensibly given any numeric input
+ value although it may have a preferred range (see hints below).
+
+ For audio it is generally assumed that 1.0f is the `0dB' reference
+ amplitude and is a `normal' signal level. */
+
+typedef float LADSPA_Data;
+
+/*****************************************************************************/
+
+/* Special Plugin Properties:
+
+ Optional features of the plugin type are encapsulated in the
+ LADSPA_Properties type. This is assembled by ORing individual
+ properties together. */
+
+typedef int LADSPA_Properties;
+
+/* Property LADSPA_PROPERTY_REALTIME indicates that the plugin has a
+ real-time dependency (e.g. listens to a MIDI device) and so its
+ output must not be cached or subject to significant latency. */
+#define LADSPA_PROPERTY_REALTIME 0x1
+
+/* Property LADSPA_PROPERTY_INPLACE_BROKEN indicates that the plugin
+ may cease to work correctly if the host elects to use the same data
+ location for both input and output (see connect_port()). This
+ should be avoided as enabling this flag makes it impossible for
+ hosts to use the plugin to process audio `in-place.' */
+#define LADSPA_PROPERTY_INPLACE_BROKEN 0x2
+
+/* Property LADSPA_PROPERTY_HARD_RT_CAPABLE indicates that the plugin
+ is capable of running not only in a conventional host but also in a
+ `hard real-time' environment. To qualify for this the plugin must
+ satisfy all of the following:
+
+ (1) The plugin must not use malloc(), free() or other heap memory
+ management within its run() or run_adding() functions. All new
+ memory used in run() must be managed via the stack. These
+ restrictions only apply to the run() function.
+
+ (2) The plugin will not attempt to make use of any library
+ functions with the exceptions of functions in the ANSI standard C
+ and C maths libraries, which the host is expected to provide.
+
+ (3) The plugin will not access files, devices, pipes, sockets, IPC
+ or any other mechanism that might result in process or thread
+ blocking.
+
+ (4) The plugin will take an amount of time to execute a run() or
+ run_adding() call approximately of form (A+B*SampleCount) where A
+ and B depend on the machine and host in use. This amount of time
+ may not depend on input signals or plugin state. The host is left
+ the responsibility to perform timings to estimate upper bounds for
+ A and B. */
+#define LADSPA_PROPERTY_HARD_RT_CAPABLE 0x4
+
+#define LADSPA_IS_REALTIME(x) ((x) & LADSPA_PROPERTY_REALTIME)
+#define LADSPA_IS_INPLACE_BROKEN(x) ((x) & LADSPA_PROPERTY_INPLACE_BROKEN)
+#define LADSPA_IS_HARD_RT_CAPABLE(x) ((x) & LADSPA_PROPERTY_HARD_RT_CAPABLE)
+
+/*****************************************************************************/
+
+/* Plugin Ports:
+
+ Plugins have `ports' that are inputs or outputs for audio or
+ data. Ports can communicate arrays of LADSPA_Data (for audio
+ inputs/outputs) or single LADSPA_Data values (for control
+ input/outputs). This information is encapsulated in the
+ LADSPA_PortDescriptor type which is assembled by ORing individual
+ properties together.
+
+ Note that a port must be an input or an output port but not both
+ and that a port must be a control or audio port but not both. */
+
+typedef int LADSPA_PortDescriptor;
+
+/* Property LADSPA_PORT_INPUT indicates that the port is an input. */
+#define LADSPA_PORT_INPUT 0x1
+
+/* Property LADSPA_PORT_OUTPUT indicates that the port is an output. */
+#define LADSPA_PORT_OUTPUT 0x2
+
+/* Property LADSPA_PORT_CONTROL indicates that the port is a control
+ port. */
+#define LADSPA_PORT_CONTROL 0x4
+
+/* Property LADSPA_PORT_AUDIO indicates that the port is a audio
+ port. */
+#define LADSPA_PORT_AUDIO 0x8
+
+#define LADSPA_IS_PORT_INPUT(x) ((x) & LADSPA_PORT_INPUT)
+#define LADSPA_IS_PORT_OUTPUT(x) ((x) & LADSPA_PORT_OUTPUT)
+#define LADSPA_IS_PORT_CONTROL(x) ((x) & LADSPA_PORT_CONTROL)
+#define LADSPA_IS_PORT_AUDIO(x) ((x) & LADSPA_PORT_AUDIO)
+
+/*****************************************************************************/
+
+/* Plugin Port Range Hints:
+
+ The host may wish to provide a representation of data entering or
+ leaving a plugin (e.g. to generate a GUI automatically). To make
+ this more meaningful, the plugin should provide `hints' to the host
+ describing the usual values taken by the data.
+
+ Note that these are only hints. The host may ignore them and the
+ plugin must not assume that data supplied to it is meaningful. If
+ the plugin receives invalid input data it is expected to continue
+ to run without failure and, where possible, produce a sensible
+ output (e.g. a high-pass filter given a negative cutoff frequency
+ might switch to an all-pass mode).
+
+ Hints are meaningful for all input and output ports but hints for
+ input control ports are expected to be particularly useful.
+
+ More hint information is encapsulated in the
+ LADSPA_PortRangeHintDescriptor type which is assembled by ORing
+ individual hint types together. Hints may require further
+ LowerBound and UpperBound information.
+
+ All the hint information for a particular port is aggregated in the
+ LADSPA_PortRangeHint structure. */
+
+typedef int LADSPA_PortRangeHintDescriptor;
+
+/* Hint LADSPA_HINT_BOUNDED_BELOW indicates that the LowerBound field
+ of the LADSPA_PortRangeHint should be considered meaningful. The
+ value in this field should be considered the (inclusive) lower
+ bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also
+ specified then the value of LowerBound should be multiplied by the
+ sample rate. */
+#define LADSPA_HINT_BOUNDED_BELOW 0x1
+
+/* Hint LADSPA_HINT_BOUNDED_ABOVE indicates that the UpperBound field
+ of the LADSPA_PortRangeHint should be considered meaningful. The
+ value in this field should be considered the (inclusive) upper
+ bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also
+ specified then the value of UpperBound should be multiplied by the
+ sample rate. */
+#define LADSPA_HINT_BOUNDED_ABOVE 0x2
+
+/* Hint LADSPA_HINT_TOGGLED indicates that the data item should be
+ considered a Boolean toggle. Data less than or equal to zero should
+ be considered `off' or `false,' and data above zero should be
+ considered `on' or `true.' LADSPA_HINT_TOGGLED may not be used in
+ conjunction with any other hint except LADSPA_HINT_DEFAULT_0 or
+ LADSPA_HINT_DEFAULT_1. */
+#define LADSPA_HINT_TOGGLED 0x4
+
+/* Hint LADSPA_HINT_SAMPLE_RATE indicates that any bounds specified
+ should be interpreted as multiples of the sample rate. For
+ instance, a frequency range from 0Hz to the Nyquist frequency (half
+ the sample rate) could be requested by this hint in conjunction
+ with LowerBound = 0 and UpperBound = 0.5. Hosts that support bounds
+ at all must support this hint to retain meaning. */
+#define LADSPA_HINT_SAMPLE_RATE 0x8
+
+/* Hint LADSPA_HINT_LOGARITHMIC indicates that it is likely that the
+ user will find it more intuitive to view values using a logarithmic
+ scale. This is particularly useful for frequencies and gains. */
+#define LADSPA_HINT_LOGARITHMIC 0x10
+
+/* Hint LADSPA_HINT_INTEGER indicates that a user interface would
+ probably wish to provide a stepped control taking only integer
+ values. Any bounds set should be slightly wider than the actual
+ integer range required to avoid floating point rounding errors. For
+ instance, the integer set {0,1,2,3} might be described as [-0.1,
+ 3.1]. */
+#define LADSPA_HINT_INTEGER 0x20
+
+/* The various LADSPA_HINT_HAS_DEFAULT_* hints indicate a `normal'
+ value for the port that is sensible as a default. For instance,
+ this value is suitable for use as an initial value in a user
+ interface or as a value the host might assign to a control port
+ when the user has not provided one. Defaults are encoded using a
+ mask so only one default may be specified for a port. Some of the
+ hints make use of lower and upper bounds, in which case the
+ relevant bound or bounds must be available and
+ LADSPA_HINT_SAMPLE_RATE must be applied as usual. The resulting
+ default must be rounded if LADSPA_HINT_INTEGER is present. Default
+ values were introduced in LADSPA v1.1. */
+#define LADSPA_HINT_DEFAULT_MASK 0x3C0
+
+/* This default values indicates that no default is provided. */
+#define LADSPA_HINT_DEFAULT_NONE 0x0
+
+/* This default hint indicates that the suggested lower bound for the
+ port should be used. */
+#define LADSPA_HINT_DEFAULT_MINIMUM 0x40
+
+/* This default hint indicates that a low value between the suggested
+ lower and upper bounds should be chosen. For ports with
+ LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.75 +
+ log(upper) * 0.25). Otherwise, this should be (lower * 0.75 + upper
+ * 0.25). */
+#define LADSPA_HINT_DEFAULT_LOW 0x80
+
+/* This default hint indicates that a middle value between the
+ suggested lower and upper bounds should be chosen. For ports with
+ LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.5 +
+ log(upper) * 0.5). Otherwise, this should be (lower * 0.5 + upper *
+ 0.5). */
+#define LADSPA_HINT_DEFAULT_MIDDLE 0xC0
+
+/* This default hint indicates that a high value between the suggested
+ lower and upper bounds should be chosen. For ports with
+ LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.25 +
+ log(upper) * 0.75). Otherwise, this should be (lower * 0.25 + upper
+ * 0.75). */
+#define LADSPA_HINT_DEFAULT_HIGH 0x100
+
+/* This default hint indicates that the suggested upper bound for the
+ port should be used. */
+#define LADSPA_HINT_DEFAULT_MAXIMUM 0x140
+
+/* This default hint indicates that the number 0 should be used. Note
+ that this default may be used in conjunction with
+ LADSPA_HINT_TOGGLED. */
+#define LADSPA_HINT_DEFAULT_0 0x200
+
+/* This default hint indicates that the number 1 should be used. Note
+ that this default may be used in conjunction with
+ LADSPA_HINT_TOGGLED. */
+#define LADSPA_HINT_DEFAULT_1 0x240
+
+/* This default hint indicates that the number 100 should be used. */
+#define LADSPA_HINT_DEFAULT_100 0x280
+
+/* This default hint indicates that the Hz frequency of `concert A'
+ should be used. This will be 440 unless the host uses an unusual
+ tuning convention, in which case it may be within a few Hz. */
+#define LADSPA_HINT_DEFAULT_440 0x2C0
+
+#define LADSPA_IS_HINT_BOUNDED_BELOW(x) ((x) & LADSPA_HINT_BOUNDED_BELOW)
+#define LADSPA_IS_HINT_BOUNDED_ABOVE(x) ((x) & LADSPA_HINT_BOUNDED_ABOVE)
+#define LADSPA_IS_HINT_TOGGLED(x) ((x) & LADSPA_HINT_TOGGLED)
+#define LADSPA_IS_HINT_SAMPLE_RATE(x) ((x) & LADSPA_HINT_SAMPLE_RATE)
+#define LADSPA_IS_HINT_LOGARITHMIC(x) ((x) & LADSPA_HINT_LOGARITHMIC)
+#define LADSPA_IS_HINT_INTEGER(x) ((x) & LADSPA_HINT_INTEGER)
+
+#define LADSPA_IS_HINT_HAS_DEFAULT(x) ((x) & LADSPA_HINT_DEFAULT_MASK)
+#define LADSPA_IS_HINT_DEFAULT_MINIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
+ == LADSPA_HINT_DEFAULT_MINIMUM)
+#define LADSPA_IS_HINT_DEFAULT_LOW(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
+ == LADSPA_HINT_DEFAULT_LOW)
+#define LADSPA_IS_HINT_DEFAULT_MIDDLE(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
+ == LADSPA_HINT_DEFAULT_MIDDLE)
+#define LADSPA_IS_HINT_DEFAULT_HIGH(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
+ == LADSPA_HINT_DEFAULT_HIGH)
+#define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
+ == LADSPA_HINT_DEFAULT_MAXIMUM)
+#define LADSPA_IS_HINT_DEFAULT_0(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
+ == LADSPA_HINT_DEFAULT_0)
+#define LADSPA_IS_HINT_DEFAULT_1(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
+ == LADSPA_HINT_DEFAULT_1)
+#define LADSPA_IS_HINT_DEFAULT_100(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
+ == LADSPA_HINT_DEFAULT_100)
+#define LADSPA_IS_HINT_DEFAULT_440(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
+ == LADSPA_HINT_DEFAULT_440)
+
+typedef struct _LADSPA_PortRangeHint {
+
+ /* Hints about the port. */
+ LADSPA_PortRangeHintDescriptor HintDescriptor;
+
+ /* Meaningful when hint LADSPA_HINT_BOUNDED_BELOW is active. When
+ LADSPA_HINT_SAMPLE_RATE is also active then this value should be
+ multiplied by the relevant sample rate. */
+ LADSPA_Data LowerBound;
+
+ /* Meaningful when hint LADSPA_HINT_BOUNDED_ABOVE is active. When
+ LADSPA_HINT_SAMPLE_RATE is also active then this value should be
+ multiplied by the relevant sample rate. */
+ LADSPA_Data UpperBound;
+
+} LADSPA_PortRangeHint;
+
+/*****************************************************************************/
+
+/* Plugin Handles:
+
+ This plugin handle indicates a particular instance of the plugin
+ concerned. It is valid to compare this to NULL (0 for C++) but
+ otherwise the host should not attempt to interpret it. The plugin
+ may use it to reference internal instance data. */
+
+typedef void * LADSPA_Handle;
+
+/*****************************************************************************/
+
+/* Descriptor for a Type of Plugin:
+
+ This structure is used to describe a plugin type. It provides a
+ number of functions to examine the type, instantiate it, link it to
+ buffers and workspaces and to run it. */
+
+typedef struct _LADSPA_Descriptor {
+
+ /* This numeric identifier indicates the plugin type
+ uniquely. Plugin programmers may reserve ranges of IDs from a
+ central body to avoid clashes. Hosts may assume that IDs are
+ below 0x1000000. */
+ unsigned long UniqueID;
+
+ /* This identifier can be used as a unique, case-sensitive
+ identifier for the plugin type within the plugin file. Plugin
+ types should be identified by file and label rather than by index
+ or plugin name, which may be changed in new plugin
+ versions. Labels must not contain white-space characters. */
+ const char * Label;
+
+ /* This indicates a number of properties of the plugin. */
+ LADSPA_Properties Properties;
+
+ /* This member points to the null-terminated name of the plugin
+ (e.g. "Sine Oscillator"). */
+ const char * Name;
+
+ /* This member points to the null-terminated string indicating the
+ maker of the plugin. This can be an empty string but not NULL. */
+ const char * Maker;
+
+ /* This member points to the null-terminated string indicating any
+ copyright applying to the plugin. If no Copyright applies the
+ string "None" should be used. */
+ const char * Copyright;
+
+ /* This indicates the number of ports (input AND output) present on
+ the plugin. */
+ unsigned long PortCount;
+
+ /* This member indicates an array of port descriptors. Valid indices
+ vary from 0 to PortCount-1. */
+ const LADSPA_PortDescriptor * PortDescriptors;
+
+ /* This member indicates an array of null-terminated strings
+ describing ports (e.g. "Frequency (Hz)"). Valid indices vary from
+ 0 to PortCount-1. */
+ const char * const * PortNames;
+
+ /* This member indicates an array of range hints for each port (see
+ above). Valid indices vary from 0 to PortCount-1. */
+ const LADSPA_PortRangeHint * PortRangeHints;
+
+ /* This may be used by the plugin developer to pass any custom
+ implementation data into an instantiate call. It must not be used
+ or interpreted by the host. It is expected that most plugin
+ writers will not use this facility as LADSPA_Handle should be
+ used to hold instance data. */
+ void * ImplementationData;
+
+ /* This member is a function pointer that instantiates a plugin. A
+ handle is returned indicating the new plugin instance. The
+ instantiation function accepts a sample rate as a parameter. The
+ plugin descriptor from which this instantiate function was found
+ must also be passed. This function must return NULL if
+ instantiation fails.
+
+ Note that instance initialisation should generally occur in
+ activate() rather than here. */
+ LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor,
+ unsigned long SampleRate);
+
+ /* This member is a function pointer that connects a port on an
+ instantiated plugin to a memory location at which a block of data
+ for the port will be read/written. The data location is expected
+ to be an array of LADSPA_Data for audio ports or a single
+ LADSPA_Data value for control ports. Memory issues will be
+ managed by the host. The plugin must read/write the data at these
+ locations every time run() or run_adding() is called and the data
+ present at the time of this connection call should not be
+ considered meaningful.
+
+ connect_port() may be called more than once for a plugin instance
+ to allow the host to change the buffers that the plugin is
+ reading or writing. These calls may be made before or after
+ activate() or deactivate() calls.
+
+ connect_port() must be called at least once for each port before
+ run() or run_adding() is called. When working with blocks of
+ LADSPA_Data the plugin should pay careful attention to the block
+ size passed to the run function as the block allocated may only
+ just be large enough to contain the block of samples.
+
+ Plugin writers should be aware that the host may elect to use the
+ same buffer for more than one port and even use the same buffer
+ for both input and output (see LADSPA_PROPERTY_INPLACE_BROKEN).
+ However, overlapped buffers or use of a single buffer for both
+ audio and control data may result in unexpected behaviour. */
+ void (*connect_port)(LADSPA_Handle Instance,
+ unsigned long Port,
+ LADSPA_Data * DataLocation);
+
+ /* This member is a function pointer that initialises a plugin
+ instance and activates it for use. This is separated from
+ instantiate() to aid real-time support and so that hosts can
+ reinitialise a plugin instance by calling deactivate() and then
+ activate(). In this case the plugin instance must reset all state
+ information dependent on the history of the plugin instance
+ except for any data locations provided by connect_port() and any
+ gain set by set_run_adding_gain(). If there is nothing for
+ activate() to do then the plugin writer may provide a NULL rather
+ than an empty function.
+
+ When present, hosts must call this function once before run() (or
+ run_adding()) is called for the first time. This call should be
+ made as close to the run() call as possible and indicates to
+ real-time plugins that they are now live. Plugins should not rely
+ on a prompt call to run() after activate(). activate() may not be
+ called again unless deactivate() is called first. Note that
+ connect_port() may be called before or after a call to
+ activate(). */
+ void (*activate)(LADSPA_Handle Instance);
+
+ /* This method is a function pointer that runs an instance of a
+ plugin for a block. Two parameters are required: the first is a
+ handle to the particular instance to be run and the second
+ indicates the block size (in samples) for which the plugin
+ instance may run.
+
+ Note that if an activate() function exists then it must be called
+ before run() or run_adding(). If deactivate() is called for a
+ plugin instance then the plugin instance may not be reused until
+ activate() has been called again.
+
+ If the plugin has the property LADSPA_PROPERTY_HARD_RT_CAPABLE
+ then there are various things that the plugin should not do
+ within the run() or run_adding() functions (see above). */
+ void (*run)(LADSPA_Handle Instance,
+ unsigned long SampleCount);
+
+ /* This method is a function pointer that runs an instance of a
+ plugin for a block. This has identical behaviour to run() except
+ in the way data is output from the plugin. When run() is used,
+ values are written directly to the memory areas associated with
+ the output ports. However when run_adding() is called, values
+ must be added to the values already present in the memory
+ areas. Furthermore, output values written must be scaled by the
+ current gain set by set_run_adding_gain() (see below) before
+ addition.
+
+ run_adding() is optional. When it is not provided by a plugin,
+ this function pointer must be set to NULL. When it is provided,
+ the function set_run_adding_gain() must be provided also. */
+ void (*run_adding)(LADSPA_Handle Instance,
+ unsigned long SampleCount);
+
+ /* This method is a function pointer that sets the output gain for
+ use when run_adding() is called (see above). If this function is
+ never called the gain is assumed to default to 1. Gain
+ information should be retained when activate() or deactivate()
+ are called.
+
+ This function should be provided by the plugin if and only if the
+ run_adding() function is provided. When it is absent this
+ function pointer must be set to NULL. */
+ void (*set_run_adding_gain)(LADSPA_Handle Instance,
+ LADSPA_Data Gain);
+
+ /* This is the counterpart to activate() (see above). If there is
+ nothing for deactivate() to do then the plugin writer may provide
+ a NULL rather than an empty function.
+
+ Hosts must deactivate all activated units after they have been
+ run() (or run_adding()) for the last time. This call should be
+ made as close to the last run() call as possible and indicates to
+ real-time plugins that they are no longer live. Plugins should
+ not rely on prompt deactivation. Note that connect_port() may be
+ called before or after a call to deactivate().
+
+ Deactivation is not similar to pausing as the plugin instance
+ will be reinitialised when activate() is called to reuse it. */
+ void (*deactivate)(LADSPA_Handle Instance);
+
+ /* Once an instance of a plugin has been finished with it can be
+ deleted using the following function. The instance handle passed
+ ceases to be valid after this call.
+
+ If activate() was called for a plugin instance then a
+ corresponding call to deactivate() must be made before cleanup()
+ is called. */
+ void (*cleanup)(LADSPA_Handle Instance);
+
+} LADSPA_Descriptor;
+
+/**********************************************************************/
+
+/* Accessing a Plugin: */
+
+/* The exact mechanism by which plugins are loaded is host-dependent,
+ however all most hosts will need to know is the name of shared
+ object file containing the plugin types. To allow multiple hosts to
+ share plugin types, hosts may wish to check for environment
+ variable LADSPA_PATH. If present, this should contain a
+ colon-separated path indicating directories that should be searched
+ (in order) when loading plugin types.
+
+ A plugin programmer must include a function called
+ "ladspa_descriptor" with the following function prototype within
+ the shared object file. This function will have C-style linkage (if
+ you are using C++ this is taken care of by the `extern "C"' clause
+ at the top of the file).
+
+ A host will find the plugin shared object file by one means or
+ another, find the ladspa_descriptor() function, call it, and
+ proceed from there.
+
+ Plugin types are accessed by index (not ID) using values from 0
+ upwards. Out of range indexes must result in this function
+ returning NULL, so the plugin count can be determined by checking
+ for the least index that results in NULL being returned. */
+
+const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index);
+
+/* Datatype corresponding to the ladspa_descriptor() function. */
+typedef const LADSPA_Descriptor *
+(*LADSPA_Descriptor_Function)(unsigned long Index);
+
+/**********************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LADSPA_INCLUDED */
+
+/* EOF */
diff --git a/muse/muse/liste/CMakeLists.txt b/muse/muse/liste/CMakeLists.txt
new file mode 100644
index 00000000..a56df4b0
--- /dev/null
+++ b/muse/muse/liste/CMakeLists.txt
@@ -0,0 +1,46 @@
+#
+#
+#
+#
+
+MACRO(WRAP_CPP outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.cpp)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_CPP)
+
+MACRO(WRAP_H outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.h)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_H)
+
+MACRO(WRAP_UI outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.ui)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_UI)
+
+set(mocs
+ listedit editevent
+ )
+
+WRAP_H(mocH ${mocs})
+WRAP_CPP(mocCPP ${mocs})
+
+QT4_WRAP_CPP (moc_headers ${mocH})
+
+set (uics
+ editnotedialog
+ )
+
+WRAP_UI(uiUI ${uics})
+QT4_WRAP_UI (ui_headers ${uiUI})
+
+set ( liste_src ${mocCPP} ${moc_headers})
+
+add_library ( liste STATIC ${liste_src})
+set_target_properties( liste
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_SOURCE_DIR}/all.h"
+ )
+
diff --git a/muse/muse/liste/editctrlbase.ui b/muse/muse/liste/editctrlbase.ui
new file mode 100644
index 00000000..fa2f5b6f
--- /dev/null
+++ b/muse/muse/liste/editctrlbase.ui
@@ -0,0 +1,288 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>436</width>
+ <height>361</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Dialog</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="1" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="3" column="0" colspan="2" >
+ <widget class="QStackedWidget" name="stackedWidget" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="page" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="label_7" >
+ <property name="text" >
+ <string>Program</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QSpinBox" name="program" />
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="lbank" />
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="hbank" />
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_6" >
+ <property name="text" >
+ <string>L-Bank</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>H-Bank</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QPushButton" name="patchName" >
+ <property name="text" >
+ <string>Patch Name</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QLabel" name="label_9" >
+ <property name="text" >
+ <string>Value</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_8" >
+ <property name="text" >
+ <string>Controller</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QLabel" name="controllerName" >
+ <property name="text" >
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="4" >
+ <widget class="QSlider" name="valSlider" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QSpinBox" name="valSpinBox" />
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="midiPort" />
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="spinBox" />
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Time Position:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>Midi Port:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="midiChannel" />
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="text" >
+ <string>Midi Channel:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Available Controller:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="ctrlList" />
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonNewController" >
+ <property name="text" >
+ <string>Create New Controller</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>131</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>Dialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>278</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>96</x>
+ <y>254</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>Dialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>369</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>179</x>
+ <y>282</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/liste/editevent.cpp b/muse/muse/liste/editevent.cpp
new file mode 100644
index 00000000..c6f5d13e
--- /dev/null
+++ b/muse/muse/liste/editevent.cpp
@@ -0,0 +1,544 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: editevent.cpp,v 1.26 2005/11/04 12:03:47 wschweer Exp $
+// (C) Copyright 1999-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "song.h"
+#include "event.h"
+#include "midictrl.h"
+#include "editevent.h"
+#include "awl/pitchlabel.h"
+#include "awl/pitchedit.h"
+// #include "widgets/intlabel.h"
+#include "globals.h"
+#include "awl/posedit.h"
+#include "gconfig.h"
+#include "midiport.h"
+#include "midiedit/drummap.h"
+#include "instruments/minstrument.h"
+
+//---------------------------------------------------------
+// string2qhex
+//---------------------------------------------------------
+
+QString string2hex(const unsigned char* data, int len)
+ {
+ QString d;
+ QString s;
+ for (int i = 0; i < len; ++i) {
+ if ((i > 0) && ((i % 8)==0)) {
+ d += "\n";
+ }
+ else if (i)
+ d += " ";
+ d += s.sprintf("0x%02x", data[i]);
+ }
+ return d;
+ }
+
+//---------------------------------------------------------
+// hex2string
+//---------------------------------------------------------
+
+char* hex2string(QWidget* parent, const char* src, int& len)
+ {
+ char buffer[2048];
+ char* dst = buffer;
+
+ while (*src) {
+ while (*src == ' ' || *src == '\n')
+ ++src;
+ char* ep;
+ long val = strtol(src, &ep, 0);
+ if (ep == src) {
+ QMessageBox::information(parent,
+ QString("MusE"),
+ QWidget::tr("Cannot convert sysex string"));
+ return 0;
+ }
+ src = ep;
+ *dst++ = val;
+ if (dst - buffer >= 2048) {
+ QMessageBox::information(parent,
+ QString("MusE"),
+ QWidget::tr("Hex String too long (2048 bytes limit)"));
+ return 0;
+ }
+ }
+ len = dst - buffer;
+ char* b = new char[len+1];
+ memcpy(b, buffer, len);
+ b[len] = 0;
+ return b;
+ }
+
+//---------------------------------------------------------
+// getEvent
+//---------------------------------------------------------
+
+Event EditNoteDialog::getEvent(int tick, const Event& event, QWidget* parent)
+ {
+ EditNoteDialog* dlg = new EditNoteDialog(tick, event, parent);
+ Event nevent;
+ if (dlg->exec() == QDialog::Accepted) {
+ nevent = dlg->event();
+ }
+ delete dlg;
+ return nevent;
+ }
+
+Event EditSysexDialog::getEvent(int tick, MidiInstrument* mi, const Event& event, QWidget* parent)
+ {
+ EditSysexDialog* dlg = new EditSysexDialog(tick, mi, event, parent);
+ Event nevent;
+ if (dlg->exec() == QDialog::Accepted) {
+ nevent = dlg->event();
+ }
+ delete dlg;
+ return nevent;
+ }
+
+Event EditMetaDialog::getEvent(int tick, const Event& event, QWidget* parent)
+ {
+ EditEventDialog* dlg = new EditMetaDialog(tick, event, parent);
+ Event nevent;
+ if (dlg->exec() == QDialog::Accepted) {
+ nevent = dlg->event();
+ }
+ delete dlg;
+ return nevent;
+ }
+
+Event EditCAfterDialog::getEvent(int tick, const Event& event, QWidget* parent)
+ {
+ EditEventDialog* dlg = new EditCAfterDialog(tick, event, parent);
+ Event nevent;
+ if (dlg->exec() == QDialog::Accepted) {
+ nevent = dlg->event();
+ }
+ delete dlg;
+ return nevent;
+ }
+
+Event EditPAfterDialog::getEvent(int tick, const Event& event, QWidget* parent)
+ {
+ EditEventDialog* dlg = new EditPAfterDialog(tick, event, parent);
+ Event nevent;
+ if (dlg->exec() == QDialog::Accepted) {
+ nevent = dlg->event();
+ }
+ delete dlg;
+ return nevent;
+ }
+
+//---------------------------------------------------------
+// EditEventDialog
+//---------------------------------------------------------
+
+EditEventDialog::EditEventDialog(QWidget* parent)
+// : QDialog(parent, "edit event", true)
+ : QDialog(parent)
+ {
+ QVBoxLayout* xlayout = new QVBoxLayout(this);
+ layout1 = new QGridLayout;
+ xlayout->addLayout(layout1);
+
+ //---------------------------------------------------
+ // Ok, Cancel
+ //---------------------------------------------------
+
+ QBoxLayout* w5 = new QHBoxLayout;
+ xlayout->addLayout(w5);
+ QPushButton* okB = new QPushButton(tr("Ok"), this);
+ okB->setDefault(true);
+ QPushButton* cancelB = new QPushButton(tr("Cancel"), this);
+ okB->setFixedWidth(80);
+ cancelB->setFixedWidth(80);
+ w5->addWidget(okB);
+ w5->addSpacing(12);
+ w5->addWidget(cancelB);
+ w5->addStretch(1);
+ connect(cancelB, SIGNAL(clicked()), SLOT(reject()));
+ connect(okB, SIGNAL(clicked()), SLOT(accept()));
+ }
+
+//---------------------------------------------------------
+// EditNoteDialog
+//---------------------------------------------------------
+
+EditNoteDialog::EditNoteDialog(int tick, const Event& /*event*/, QWidget* parent)
+// : EditNoteDialogBase(parent)
+ : QDialog(parent)
+ {
+// if (!event.empty()) {
+//TD pos->setValue(tick);
+// il1->setValue(event.lenTick());
+// pl->setValue(event.pitch());
+// il2->setValue(event.velo());
+// il3->setValue(event.veloOff());
+// }
+// else {
+//TD pos->setValue(0);
+// il1->setValue(96);
+// pl->setValue(64);
+// il2->setValue(100);
+// il3->setValue(0);
+// }
+ }
+
+//---------------------------------------------------------
+// EditNoteDialog::event
+//---------------------------------------------------------
+
+Event EditNoteDialog::event()
+ {
+ Event event(Note);
+//TD event.setTick(pos->pos().tick());
+// event.setA(pl->value());
+// event.setB(il2->value());
+// event.setC(il3->value());
+// event.setLenTick(il1->value());
+ return event;
+ }
+
+//---------------------------------------------------------
+// EditSysExDialog
+//---------------------------------------------------------
+
+EditSysexDialog::EditSysexDialog(int tick, MidiInstrument* m, const Event& /*event*/, QWidget* parent)
+// : EditSysexDialogBase(parent)
+ : QDialog(parent)
+ {
+#if 0 //TD
+ sysex = 0;
+ mi = m;
+ if (mi) {
+ std::vector<SysEx>* sl = mi->sysexList();
+ for (std::vector<SysEx>::iterator i = sl->begin(); i != sl->end(); ++i) {
+ SysEx se = *i;
+ sysexList->insertItem(se.name);
+ }
+ }
+ if (!event.empty()) {
+ pos->setValue(tick);
+ edit->setText(string2hex(event.data(), event.dataLen()));
+ }
+ else {
+ pos->setValue(0);
+ }
+ listSelectionChanged(); // initialize Add button
+ connect(sysexList, SIGNAL(selectionChanged()), SLOT(listSelectionChanged()));
+ connect(buttonAdd, SIGNAL(clicked()), SLOT(addPressed()));
+#endif
+ }
+
+//---------------------------------------------------------
+// addPressed
+//---------------------------------------------------------
+
+void EditSysexDialog::addPressed()
+ {
+#if 0 //TD
+ Q3ListBoxItem* item = sysexList->selectedItem();
+ if (!item)
+ return;
+ std::vector<SysEx>* sl = mi->sysexList();
+ for (std::vector<SysEx>::iterator i = sl->begin(); i != sl->end(); ++i) {
+ SysEx se = *i;
+ if (se.name == item->text()) {
+ QString s = edit->text();
+ if (!s.isEmpty())
+ s += " ";
+ s += se.data;
+ edit->setText(s);
+ comment->setText(se.comment);
+ break;
+ }
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// listSelectionChanged
+//---------------------------------------------------------
+
+void EditSysexDialog::listSelectionChanged()
+ {
+//TD Q3ListBoxItem* item = sysexList->selectedItem();
+// buttonAdd->setEnabled(item);
+ }
+
+//---------------------------------------------------------
+// ~EditSysexDialog
+//---------------------------------------------------------
+
+EditSysexDialog::~EditSysexDialog()
+ {
+//TD if (sysex)
+// delete sysex;
+ }
+
+//---------------------------------------------------------
+// EditSysExDialog::event
+//---------------------------------------------------------
+
+Event EditSysexDialog::event()
+ {
+ Event event(Sysex);
+//TD event.setTick(pos->pos().tick());
+ event.setData(sysex, len);
+ return event;
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void EditSysexDialog::accept()
+ {
+//TD QString qsrc = edit->text();
+// const char* src = qsrc.toLatin1().data();
+
+// sysex = (unsigned char*)hex2string(this, src, len);
+// if (sysex)
+// QDialog::accept();
+ }
+
+//---------------------------------------------------------
+// EditMetaDialog
+//---------------------------------------------------------
+
+EditMetaDialog::EditMetaDialog(int tick, const Event& ev, QWidget* parent)
+ : EditEventDialog(parent)
+ {
+#if 0
+ meta = 0;
+ setWindowTitle(tr("MusE: Enter Meta Event"));
+
+ QLabel* l1 = new QLabel(tr("Time Position"), this);
+ pos = new PosEdit;
+
+ QLabel* l2 = new QLabel(tr("Meta Type"), this);
+ il2 = new IntLabel(-1, 0, 127, this, -1);
+ il2->setFrame(true);
+ il2->setDark();
+
+ hexButton = new QRadioButton(tr("Enter Hex"), this, "hextoggle");
+ hexButton->setChecked(true);
+ connect(hexButton, SIGNAL(toggled(bool)), SLOT(toggled(bool)));
+
+ edit = new Q3MultiLineEdit(this);
+ edit->setFont(*config.fonts[5]);
+
+ if (!ev.empty()) {
+ pos->setValue(tick);
+ il2->setValue(ev.dataA());
+ toggled(true);
+ edit->setText(string2hex(ev.data(), ev.dataLen()));
+ }
+ else {
+ pos->setValue(0);
+ il2->setValue(0);
+ }
+
+ layout1->addWidget(l1, 0, 0);
+ layout1->addWidget(pos, 0, 1, Qt::AlignLeft);
+ layout1->addWidget(l2, 1, 0);
+ layout1->addWidget(il2, 1, 1, Qt::AlignLeft);
+ layout1->addMultiCellWidget(hexButton, 2, 2, 0, 1);
+ layout1->addMultiCellWidget(edit, 3, 3, 0, 1);
+#endif
+ }
+
+//---------------------------------------------------------
+// toggled
+//---------------------------------------------------------
+
+void EditMetaDialog::toggled(bool flag)
+ {
+#if 0
+ QString qsrc = edit->text();
+ const char* src = qsrc.toLatin1().data();
+ edit->clear();
+
+ QString dst;
+ if (flag) { // convert to hex
+ dst = string2hex((unsigned char*)src, strlen(src));
+ }
+ else { // convert to string
+ int len;
+ dst = hex2string(this, src, len);
+ }
+ edit->setText(dst);
+#endif
+ }
+
+//---------------------------------------------------------
+// ~EditMetaDialog
+//---------------------------------------------------------
+
+EditMetaDialog::~EditMetaDialog()
+ {
+ if (meta)
+ delete meta;
+ }
+
+//---------------------------------------------------------
+// EditMetaDialog::event
+//---------------------------------------------------------
+
+Event EditMetaDialog::event()
+ {
+ Event event(Meta);
+#if 0
+ event.setTick(pos->pos().tick());
+ event.setA(il2->value());
+ event.setData(meta, len); // TODO ??
+#endif
+ return event;
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void EditMetaDialog::accept()
+ {
+#if 0
+ QString qsrc = edit->text();
+ const char* src = qsrc.toLatin1().data();
+ if (!hexButton->isChecked()) {
+ meta = (unsigned char*)strdup(src);
+ len = strlen(src);
+ QDialog::accept();
+ return;
+ }
+
+ meta = (unsigned char*)hex2string(this, src, len);
+ if (meta)
+ QDialog::accept();
+#endif
+ }
+
+//---------------------------------------------------------
+// EditCAfterDialog
+//---------------------------------------------------------
+
+EditCAfterDialog::EditCAfterDialog(int tick, const Event& event,
+ QWidget* parent)
+ : EditEventDialog(parent)
+ {
+#if 0
+ setCaption(tr("MusE: Enter Channel Aftertouch"));
+
+ QLabel* l1 = new QLabel(tr("Time Position"), this);
+ pos = new PosEdit;
+
+ QLabel* l2 = new QLabel(tr("Pressure"), this);
+ il2 = new IntLabel(-1, 0, 127, this, -1);
+ il2->setFrame(true);
+ il2->setDark();
+
+ QSlider* slider = new QSlider(0, 127, 1, 0, Qt::Horizontal, this);
+ connect(slider, SIGNAL(valueChanged(int)), il2, SLOT(setValue(int)));
+ connect(il2, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
+
+ if (!event.empty()) {
+ pos->setValue(tick);
+ il2->setValue(event.dataA());
+ slider->setValue(event.dataA());
+ }
+ else {
+ pos->setValue(0);
+ il2->setValue(64);
+ slider->setValue(64);
+ }
+
+ layout1->addWidget(l1, 0, 0);
+ layout1->addWidget(pos, 0, 1, Qt::AlignLeft);
+ layout1->addWidget(l2, 1, 0);
+ layout1->addWidget(il2, 1, 1, Qt::AlignLeft);
+ layout1->addMultiCellWidget(slider, 2, 2, 0, 1);
+#endif
+ }
+
+//---------------------------------------------------------
+// EditCAfterDialog::event
+//---------------------------------------------------------
+
+Event EditCAfterDialog::event()
+ {
+ Event event(CAfter);
+#if 0
+ event.setTick(pos->pos().tick());
+ event.setA(il2->value());
+#endif
+ return event;
+ }
+
+//---------------------------------------------------------
+// EditPAfterDialog
+//---------------------------------------------------------
+
+EditPAfterDialog::EditPAfterDialog(int tick, const Event& event,
+ QWidget* parent)
+ : EditEventDialog(parent)
+ {
+#if 0
+ setCaption(tr("MusE: Enter Poly Aftertouch"));
+
+ QLabel* l1 = new QLabel(tr("Time Position"), this);
+ pos = new PosEdit;
+
+ QLabel* l2 = new QLabel(tr("Pitch"), this);
+ pl = new PitchLabel;
+
+ QLabel* l3 = new QLabel(tr("Pressure"), this);
+ il2 = new IntLabel(-1, 0, 127, this, -1);
+ il2->setFrame(true);
+ il2->setDark();
+
+ QSlider* slider = new QSlider(0, 127, 1, 0, Qt::Horizontal, this);
+ connect(slider, SIGNAL(valueChanged(int)), il2, SLOT(setValue(int)));
+ connect(il2, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
+
+ if (!event.empty()) {
+ pos->setValue(tick);
+ pl->setValue(event.pitch());
+ il2->setValue(event.dataB());
+ slider->setValue(event.dataB());
+ }
+ else {
+ pos->setValue(0);
+ pl->setValue(64);
+ il2->setValue(64);
+ slider->setValue(64);
+ }
+
+ layout1->addWidget(l1, 0, 0);
+ layout1->addWidget(pos, 0, 1, Qt::AlignLeft);
+ layout1->addWidget(l2, 1, 0);
+ layout1->addWidget(pl, 1, 1, Qt::AlignLeft);
+ layout1->addWidget(l3, 2, 0);
+ layout1->addWidget(il2, 2, 1, Qt::AlignLeft);
+ layout1->addMultiCellWidget(slider, 3, 3, 0, 1);
+#endif
+ }
+
+//---------------------------------------------------------
+// EditPAfterDialog::event
+//---------------------------------------------------------
+
+Event EditPAfterDialog::event()
+ {
+ Event event(CAfter);
+#if 0 //TD
+ event.setTick(pos->pos().tick());
+ event.setA(pl->value());
+ event.setB(il2->value());
+#endif
+ return event;
+ }
+
diff --git a/muse/muse/liste/editevent.h b/muse/muse/liste/editevent.h
new file mode 100644
index 00000000..12909383
--- /dev/null
+++ b/muse/muse/liste/editevent.h
@@ -0,0 +1,152 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: editevent.h,v 1.16 2005/11/04 12:03:47 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __EDIT_EVENT_H__
+#define __EDIT_EVENT_H__
+
+#include "ui_editnotedialog.h"
+// #include "widgets/editsysexdialogbase.h"
+#include "event.h"
+
+namespace Awl {
+ class PosEdit;
+ class PitchLabel;
+ };
+using Awl::PosEdit;
+using Awl::PitchLabel;
+
+// class IntLabel;
+class MidiPart;
+class MidiInstrument;
+
+//---------------------------------------------------------
+// EditEventDialog
+//---------------------------------------------------------
+
+class EditEventDialog : public QDialog {
+ Q_OBJECT
+
+ protected:
+ QGridLayout* layout1;
+
+ public:
+ EditEventDialog(QWidget* parent=0);
+ virtual Event event() = 0;
+ };
+
+//---------------------------------------------------------
+// EditNoteDialog
+//---------------------------------------------------------
+
+// class EditNoteDialog : public EditNoteDialogBase {
+class EditNoteDialog : public QDialog {
+ Q_OBJECT
+
+ public:
+ EditNoteDialog(int tick, const Event&, QWidget* parent=0);
+ static Event getEvent(int tick, const Event&,
+ QWidget* parent = 0);
+ virtual Event event();
+ };
+
+//---------------------------------------------------------
+// EditSysExDialog
+//---------------------------------------------------------
+
+// class EditSysexDialog : public EditSysexDialogBase {
+class EditSysexDialog : public QDialog {
+ Q_OBJECT
+
+ unsigned char* sysex;
+ MidiInstrument* mi;
+
+ int len;
+
+ protected:
+ QGridLayout* layout;
+
+ private slots:
+ virtual void accept();
+ void addPressed();
+ void listSelectionChanged();
+
+ public:
+ EditSysexDialog(int tick, MidiInstrument*, const Event&, QWidget* parent=0);
+ ~EditSysexDialog();
+ static Event getEvent(int tick, MidiInstrument*, const Event&, QWidget* parent = 0);
+ virtual Event event();
+ };
+
+//---------------------------------------------------------
+// EditMetaDialog
+//---------------------------------------------------------
+
+class EditMetaDialog : public EditEventDialog {
+ Q_OBJECT
+
+ unsigned char* meta;
+ int len;
+ PosEdit* pos;
+ QTextEdit* edit;
+// IntLabel* il2;
+ QRadioButton* hexButton;
+
+ protected:
+ QGridLayout* layout;
+
+ private slots:
+ virtual void accept();
+ void toggled(bool);
+
+ public:
+ EditMetaDialog(int tick, const Event&, QWidget* parent=0);
+ ~EditMetaDialog();
+ static Event getEvent(int tick, const Event&, QWidget* parent = 0);
+ virtual Event event();
+ };
+
+//---------------------------------------------------------
+// EditCAfterDialog
+//---------------------------------------------------------
+
+class EditCAfterDialog : public EditEventDialog {
+ Q_OBJECT
+
+ PosEdit* pos;
+// IntLabel* il2;
+
+ protected:
+ QGridLayout* layout;
+
+ public:
+ EditCAfterDialog(int tick, const Event&, QWidget* parent=0);
+ static Event getEvent(int tick, const Event&, QWidget* parent = 0);
+ virtual Event event();
+ };
+
+//---------------------------------------------------------
+// EditPAfterDialog
+//---------------------------------------------------------
+
+class EditPAfterDialog : public EditEventDialog {
+ Q_OBJECT
+
+ PosEdit* pos;
+ PitchLabel* pl;
+// IntLabel* il2;
+
+ protected:
+ QGridLayout* layout;
+
+ public:
+ EditPAfterDialog(int tick, const Event&, QWidget* parent=0);
+ static Event getEvent(int tick, const Event&, QWidget* parent = 0);
+ virtual Event event();
+ };
+
+#endif
+
diff --git a/muse/muse/liste/editnotedialog.ui b/muse/muse/liste/editnotedialog.ui
new file mode 100644
index 00000000..d59d1c10
--- /dev/null
+++ b/muse/muse/liste/editnotedialog.ui
@@ -0,0 +1,150 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>EditNoteDialogBase</class>
+ <widget class="QDialog" name="EditNoteDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Dialog</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="spinBox_5" />
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="spinBox_4" />
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="spinBox_3" />
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="spinBox_2" />
+ </item>
+ <item row="4" column="1" >
+ <widget class="QSpinBox" name="spinBox" />
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Velocity Off:&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="text" >
+ <string>Velocity On:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pitch:&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Length:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Time Position:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>131</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>EditNoteDialogBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>278</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>96</x>
+ <y>254</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>EditNoteDialogBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>369</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>179</x>
+ <y>282</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/liste/listedit.cpp b/muse/muse/liste/listedit.cpp
new file mode 100644
index 00000000..3c9e7f8d
--- /dev/null
+++ b/muse/muse/liste/listedit.cpp
@@ -0,0 +1,1315 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: listedit.cpp,v 1.43 2005/11/05 23:15:23 wschweer Exp $
+// (C) Copyright 1999-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#if 0 //TD
+#include "listedit.h"
+#include "globals.h"
+#include "icons.h"
+#include "song.h"
+#include "audio.h"
+#include "shortcuts.h"
+#include "midi.h"
+#include "event.h"
+#include "midiport.h"
+#include "midictrl.h"
+#include "esettings.h"
+
+#include "al/xml.h"
+#include "al/tempo.h"
+#include "al/sig.h"
+#include "awl/utils.h"
+#include "awl/sigedit.h"
+#include "awl/posedit.h"
+#include "awl/pitchedit.h"
+
+#include "instruments/minstrument.h"
+
+enum { L_TIMESIG=1001, L_TEMPOSIG, L_NOTES, L_SYSEX, L_PAFTER,
+ L_CAFTER, L_META, L_CTRL, L_WAVE, L_PART, L_TRACK
+ };
+
+//---------------------------------------------------------
+// ListCtrl
+//---------------------------------------------------------
+
+struct ListCtrl {
+ int tick;
+ Track* track;
+ int id;
+ CVal val;
+ ListCtrl(int t, Track* tr, int d, CVal v) {
+ tick = t;
+ track = tr;
+ id = d;
+ val = v;
+ }
+ ListCtrl() {
+ tick = 0;
+ track = 0;
+ id = 0;
+ val.i = 0;
+ }
+ };
+
+//---------------------------------------------------------
+// midi_meta_name
+//---------------------------------------------------------
+
+static QString midiMetaComment(const Event& ev)
+ {
+ int meta = ev.dataA();
+ QString s = midiMetaName(meta);
+
+ switch (meta) {
+ case 0:
+ case 0x2f:
+ case 0x51:
+ case 0x54:
+ case 0x58:
+ case 0x59:
+ case 0x74:
+ case 0x7f: return s;
+
+ case 1 ... 15:
+ {
+ s += QString(": ");
+ const char* txt = (char*)(ev.data());
+ int len = ev.dataLen();
+ char buffer[len+1];
+ memcpy(buffer, txt, len);
+ buffer[len] = 0;
+
+ for (int i = 0; i < len; ++i) {
+ if (buffer[i] == '\n' || buffer[i] == '\r')
+ buffer[i] = ' ';
+ }
+ return s + QString(buffer);
+ }
+
+ case 0x20:
+ case 0x21:
+ default:
+ {
+ s += QString(": ");
+ int i;
+ int len = ev.lenTick();
+ int n = len > 10 ? 10 : len;
+ for (i = 0; i < n; ++i) {
+ if (i >= ev.dataLen())
+ break;
+ s += QString(" 0x");
+ QString k;
+ k.setNum(ev.data()[i] & 0xff, 16);
+ s += k;
+ }
+ if (i == 10)
+ s += QString("...");
+ return s;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// paintCell
+//---------------------------------------------------------
+
+void LItem::paintCell(QPainter* p, const QColorGroup& cg,
+ int column, int width, int align)
+ {
+ if (!p)
+ return;
+ Q3ListView *lv = listView();
+ if (!lv )
+ return;
+
+ if (isSelected() && (column == 0 || lv->allColumnsShowFocus())) {
+ p->fillRect(0, 0, width, height(), cg.brush(QColorGroup::Highlight));
+ p->setPen(cg.highlightedText());
+ }
+ else
+ p->fillRect(0, 0, width, height(), QColor(200, 200, zebra ? 200 : 230));
+
+ QString t = text(column);
+ if (!t.isEmpty()) {
+ if (!(align & Qt::AlignVCenter || align & Qt::AlignBottom))
+ align |= Qt::AlignTop;
+ int marg = lv->itemMargin();
+ p->drawText(marg, marg, width-marg-marg, height(), align, t);
+ }
+ }
+
+//---------------------------------------------------------
+// text
+//---------------------------------------------------------
+
+QString LItem::text(int col) const
+ {
+ QString s;
+ bool isMidi = lli()->track()->isMidiTrack();
+
+ if (col == 0) {
+ s.sprintf("%04d", _pos.tick());
+ return s;
+ }
+ if (col == 1) {
+ int bar, beat;
+ unsigned tick;
+ AL::sigmap.tickValues(_pos.tick(), &bar, &beat, &tick);
+ s.sprintf("%04d.%02d.%03d", bar+1, beat+1, tick);
+ return s;
+ }
+ switch(_rtti) {
+ case L_TIMESIG:
+ if (col == 2)
+ s = QString("Time");
+ else if (col == 3) {
+ s.sprintf("%d/%d", _sig->z, _sig->n);
+ }
+ break;
+ case L_TEMPOSIG:
+ if (col == 2)
+ s = QString("Tempo");
+ else if (col == 3) {
+ double t = (1000000.0 * 60.0)/_tempo->tempo;
+ s.setNum(t, 'f', 3);
+ }
+ break;
+ case L_NOTES:
+ if (col == 2)
+ s = "Note";
+ else if (col == 3)
+ s = Awl::pitch2string(_event.dataA());
+ else if (col == 4)
+ s.setNum(_event.dataB(), *showHex ? 16 : 10);
+ else if (col == 5)
+ s.setNum(_event.lenTick());
+ break;
+
+ case L_WAVE:
+ if (col == 2)
+ s = "Wave";
+ else if (col == 5)
+ s.setNum(_event.lenTick());
+ break;
+
+ case L_SYSEX:
+ if (col == 2)
+ s = "SysEx";
+ else if (col == 6) {
+ s = QString("len ");
+ QString k;
+ k.setNum(_event.dataLen());
+ s += k;
+ s += QString(" ");
+
+ s += nameSysex(_event.dataLen(), _event.data());
+ int i;
+ for (i = 0; i < 10; ++i) {
+ if (i >= _event.dataLen())
+ break;
+ s += QString(" 0x");
+ QString k;
+ k.setNum(_event.data()[i] & 0xff, 16);
+ s += k;
+ }
+ if (i == 10)
+ s += QString("...");
+ }
+ break;
+ case L_PAFTER:
+ if (col == 2)
+ s = "PAfter";
+ else if (col == 3)
+ s.setNum(_event.dataA(), *showHex ? 16 : 10);
+ else if (col == 4)
+ s.setNum(_event.dataB(), *showHex ? 16 : 10);
+ break;
+ case L_CAFTER:
+ if (col == 2)
+ s = "CAfter";
+ else if (col == 3)
+ s.setNum(_event.dataA(), *showHex ? 16 : 10);
+ break;
+ case L_META:
+ if (col == 2)
+ s = "Meta";
+ else if (col == 3)
+ s.setNum(_event.dataA(), *showHex ? 16 : 10);
+ else if (col == 6)
+ s = midiMetaComment(_event);
+ break;
+
+ case L_CTRL:
+ if (col == 2)
+ s = QString("Ctrl");
+ else if (col == 3) {
+ if (isMidi && lli()->ctrl() == CTRL_PROGRAM) {
+ s = "Prog";
+ }
+ else
+ s.setNum(lli()->ctrl());
+ }
+ else if (col == 4) {
+ if (isMidi) {
+ if (lli()->ctrl() == CTRL_PROGRAM) {
+ int val = _val.i;
+ int hb = (val >> 16) & 0xff;
+ int lb = (val >> 8) & 0xff;
+ int pr = (val) & 0xff;
+ char buffer[16];
+ if (*showHex) {
+ if (hb == 0xff)
+ s += "--:";
+ else {
+ sprintf(buffer, "%02x:", hb);
+ s += buffer;
+ }
+ if (lb == 0xff)
+ s += "--:";
+ else {
+ sprintf(buffer, "%02x:", lb);
+ s += buffer;
+ }
+ if (pr == 0xff)
+ s += "--";
+ else {
+ sprintf(buffer, "%02x", pr);
+ s += buffer;
+ }
+ }
+ else {
+ if (hb == 0xff)
+ s += "---:";
+ else {
+ sprintf(buffer, "%03d:", hb);
+ s += buffer;
+ }
+ if (lb == 0xff)
+ s += "---:";
+ else {
+ sprintf(buffer, "%03d:", lb);
+ s += buffer;
+ }
+ if (pr == 0xff)
+ s += "---";
+ else {
+ sprintf(buffer, "%03d", pr);
+ s += buffer;
+ }
+ }
+ }
+ else
+ s.setNum(_val.i, *showHex ? 16 : 10);
+ }
+ else
+ s.setNum(_val.f, 'f', 2);
+ }
+ else if (col == 6)
+ s = lli()->track()->getController(lli()->ctrl())->name();
+ break;
+ }
+ return s;
+ }
+
+//---------------------------------------------------------
+// updateList
+//---------------------------------------------------------
+
+void ListEdit::updateList()
+ {
+ list->clear();
+ menuEdit->setItemEnabled(CMD_DELETE, false);
+ menuEdit->setItemEnabled(CMD_INSERT_SIG, false);
+ menuEdit->setItemEnabled(CMD_INSERT_TEMPO, false);
+
+ Q3ListViewItemIterator i(lists);
+ for (; i.current(); ++i) {
+ int id = i.current()->rtti();
+ if (id < 1000)
+ continue;
+ LLItem* item = (LLItem*)(i.current());
+ if (!item->isOn())
+ continue;
+ switch (id) {
+ case L_TIMESIG:
+ menuEdit->setItemEnabled(CMD_INSERT_SIG, true);
+ for (AL::iSigEvent i = AL::sigmap.begin(); i != AL::sigmap.end(); ++i) {
+ LItem* item = new LItem(list, id, &showHex);
+ item->setPos(Pos(i->second->tick));
+ item->setSigEvent(i->second);
+ }
+ break;
+ case L_TEMPOSIG:
+ menuEdit->setItemEnabled(CMD_INSERT_TEMPO, true);
+ for (AL::iTEvent i = AL::tempomap.begin(); i != AL::tempomap.end(); ++i) {
+ LItem* item = new LItem(list, id, &showHex);
+ item->setPos(Pos(i->second->tick));
+ item->setTempo(i->second);
+ }
+ break;
+ case L_NOTES:
+ case L_SYSEX:
+ case L_PAFTER:
+ case L_CAFTER:
+ case L_META:
+ {
+ menuEdit->setItemEnabled(CMD_INSERT_NOTE, true);
+ menuEdit->setItemEnabled(CMD_INSERT_SYSEX, true);
+ menuEdit->setItemEnabled(CMD_INSERT_PAFTER, true);
+ menuEdit->setItemEnabled(CMD_INSERT_CAFTER, true);
+ menuEdit->setItemEnabled(CMD_INSERT_META, true);
+ MidiTrack* track = (MidiTrack*)(item->track());
+ PartList* pl = track->parts();
+ for (iPart ip = pl->begin(); ip !=pl->end(); ++ip) {
+ Part* part = ip->second;
+ EventList* el = part->events();
+ for (iEvent i = el->begin(); i != el->end(); ++i) {
+ EventType t = i->second.type();
+ if ((id == L_NOTES && t == Note)
+ || (id == L_SYSEX && t == Sysex)
+ || (id == L_PAFTER && t == PAfter)
+ || (id == L_CAFTER && t == CAfter)
+ || (id == L_META && t == Meta)) {
+ LItem* litem = new LItem(list, id, &showHex);
+ litem->setEvent(i->second);
+ litem->setPos(Pos(i->first + ip->first));
+ litem->setPart(part);
+ litem->setLLi(item);
+ }
+ }
+ }
+ }
+ break;
+
+ case L_WAVE:
+ {
+ WaveTrack* track = (WaveTrack*)(item->track());
+ PartList* pl = track->parts();
+ for (iPart ip = pl->begin(); ip !=pl->end(); ++ip) {
+ Part* part = ip->second;
+ EventList* el = part->events();
+ for (iEvent i = el->begin(); i != el->end(); ++i) {
+ EventType t = i->second.type();
+ if (t != Wave) {
+ printf("ListEdit::updateList(): wrong part type in wave track\n");
+ continue;
+ }
+ LItem* litem = new LItem(list, id, &showHex);
+ litem->setEvent(i->second);
+ litem->setPos(Pos(i->first + ip->first));
+ litem->setLLi(item);
+ }
+ }
+ }
+ break;
+
+ case L_CTRL:
+ {
+ menuEdit->setItemEnabled(CMD_INSERT_CTRL, true);
+ Track* track = item->track();
+ CtrlList* cl = track->controller();
+ for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) {
+ Ctrl* c = ic->second;
+ if (c->id() != item->ctrl())
+ continue;
+ for (iCtrlVal iv = c->begin(); iv != c->end(); ++iv) {
+ LItem* litem = new LItem(list, id, &showHex);
+ litem->setVal(iv->second);
+ litem->setPos(Pos(iv->first));
+ litem->setLLi(item);
+ }
+ }
+ }
+ break;
+ }
+ }
+ Q3ListViewItemIterator ii(list);
+ bool f = false;
+ for (; ii.current(); ++ii) {
+ ((LItem*)(ii.current()))->setZebra(f);
+ f = !f;
+ }
+ }
+
+//---------------------------------------------------------
+// updateLists
+//---------------------------------------------------------
+
+void ListEdit::updateLists()
+ {
+ lists->clear();
+
+ Q3ListViewItem* item = new Q3ListViewItem(lists, tr("Master"));
+ LLItem* lit = new LLItem(item, "Tempo Signature", L_TEMPOSIG);
+ connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList()));
+ lit = new LLItem(item, "Time Signature", L_TIMESIG);
+ connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList()));
+
+ TrackList* tracks = song->tracks();
+ for (irTrack it = tracks->rbegin(); it != tracks->rend(); ++it) {
+ Track* track = *it;
+ Q3ListViewItem* item = new Q3CheckListItem(lists, track->name(), Q3CheckListItem::CheckBoxController);
+ genListsTrack(track, item);
+ }
+ updateList();
+ }
+
+//---------------------------------------------------------
+// ListEdit
+//---------------------------------------------------------
+
+ListEdit::ListEdit(QWidget*, PartList*)
+ {
+ showHex = false;
+ curEditor = 0;
+ editItem = 0;
+ editCol = -1;
+ curPart = 0;
+
+ setWindowTitle("MusE: List Editor");
+
+ //---------Pulldown Menu----------------------------
+ menuEdit = new Q3PopupMenu(this);
+ menuBar()->insertItem(tr("&Edit"), menuEdit);
+//TD undoRedo->addTo(menuEdit);
+ menuEdit->addSeparator();
+ menuEdit->addAction(tr("Insert Tempo"), CMD_INSERT_TEMPO);
+ menuEdit->addAction(tr("Insert Signature"), CMD_INSERT_SIG);
+ menuEdit->addAction(tr("Insert Note"), CMD_INSERT_NOTE);
+ menuEdit->addAction(tr("Insert SysEx"), CMD_INSERT_SYSEX);
+ menuEdit->addAction(tr("Insert PolyAfterTouch"), CMD_INSERT_PAFTER);
+ menuEdit->addAction(tr("Insert After Touch"), CMD_INSERT_CAFTER);
+ menuEdit->addAction(tr("Insert Meta"), CMD_INSERT_META);
+ menuEdit->addAction(tr("Insert Controller"), CMD_INSERT_CTRL);
+
+ menuEdit->insertSeparator();
+ menuEdit->insertItem(tr("Delete Event"), CMD_DELETE);
+ menuEdit->setAccel(Qt::Key_Delete, CMD_DELETE);
+ connect(menuEdit, SIGNAL(activated(int)), SLOT(cmd(int)));
+
+ menuView = new Q3PopupMenu(this);
+ menuView->setCheckable(true);
+ menuBar()->insertItem(tr("&View"), menuView);
+ menuView->insertItem(tr("Hex Midi Values"), CMD_SET_HEX);
+ menuView->insertItem(tr("Decimal Midi Values"), CMD_SET_DEC);
+ menuView->setItemChecked(CMD_SET_HEX, showHex);
+ menuView->setItemChecked(CMD_SET_DEC, !showHex);
+ connect(menuView, SIGNAL(activated(int)), SLOT(cmd(int)));
+
+ listTools = new QToolBar(this, "list-tools");
+ listTools->setLabel(tr("List Tools"));
+//TD undoRedo->addTo(listTools);
+ QToolBar* tb = new QToolBar(this, "CurPart");
+ tb->addWidget(new QLabel(tr("CurTrack:")));
+ tb_t = new QLabel("----");
+ tb->addWidget(tb_t);
+ tb_t->setFrameShape(Q3Frame::LineEditPanel);
+ tb_t->setLineWidth(2);
+ tb->addWidget(new QLabel(tr("CurPart:")));
+ tb_p = new QLabel(tr("----"));
+ tb->addWidget(tb_p);
+ tb_p->setFrameShape(Q3Frame::LineEditPanel);
+ tb_p->setLineWidth(2);
+
+ setCentralWidget(new QWidget(this, "qt_central_widget"));
+ QGridLayout* grid = new QGridLayout(centralWidget(), 1, 1, 11, 6, "Form2Layout");
+
+ splitter = new QSplitter(Qt::Horizontal, centralWidget());
+ splitter->setOpaqueResize(true);
+ splitter->setChildrenCollapsible(true);
+
+ lists = new Q3ListView(splitter);
+ lists->viewport()->setPaletteBackgroundColor(QColor(200, 200, 230));
+ lists->setRootIsDecorated(true);
+ lists->addColumn(tr("Filter"));
+ lists->setResizeMode(Q3ListView::LastColumn);
+ lists->setColumnWidthMode(0, Q3ListView::Maximum);
+ lists->setSorting(-1);
+ splitter->setResizeMode(lists, QSplitter::Auto);
+
+ list = new Q3ListView(splitter);
+ list->viewport()->setPaletteBackgroundColor(QColor(200, 200, 230));
+
+ list->setAllColumnsShowFocus(true);
+ list->setSelectionMode(Q3ListView::Single);
+ list->addColumn(tr("Tick"));
+ list->addColumn(tr("Bar"));
+ list->addColumn(tr("Type"));
+ list->addColumn(tr("Val 1"));
+ list->addColumn(tr("Val 2"));
+ list->addColumn(tr("Len"));
+ list->addColumn(tr("Comment"));
+ list->setResizeMode(Q3ListView::LastColumn);
+
+ list->setSorting(0);
+ list->setColumnAlignment(0, Qt::AlignRight);
+
+ grid->addWidget(splitter, 0, 0);
+
+ sigEditor = new Awl::SigEdit(list->viewport());
+ textEditor = new QLineEdit(list->viewport());
+ pitchEditor = new Awl::PitchEdit(list->viewport());
+ posEditor = new Awl::PosEdit;
+ sigEditor->hide();
+ textEditor->hide();
+ pitchEditor->hide();
+ posEditor->hide();
+
+ updateLists();
+ connect(list, SIGNAL(doubleClicked(Q3ListViewItem*,const QPoint&,int)), SLOT(editColumn(Q3ListViewItem*,const QPoint&,int)));
+ connect(list->header(), SIGNAL(sizeChange(int,int,int)), SLOT(colResized()));
+ connect(list, SIGNAL(selectionChanged()), SLOT(listSelectionChanged()));
+
+ connect(sigEditor, SIGNAL(returnPressed()), SLOT(returnPressed()));
+ connect(textEditor, SIGNAL(returnPressed()), SLOT(returnPressed()));
+ connect(pitchEditor, SIGNAL(returnPressed()), SLOT(returnPressed()));
+ connect(posEditor, SIGNAL(returnPressed()), SLOT(returnPressed()));
+
+ connect(sigEditor, SIGNAL(escapePressed()), SLOT(escapePressed()));
+ connect(pitchEditor, SIGNAL(escapePressed()), SLOT(escapePressed()));
+ connect(posEditor, SIGNAL(escapePressed()), SLOT(escapePressed()));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(song, SIGNAL(trackAdded(Track*,int)), SLOT(trackAdded(Track*,int)));
+ connect(song, SIGNAL(trackRemoved(Track*)), SLOT(trackRemoved(Track*)));
+ }
+
+//---------------------------------------------------------
+// ~ListEdit
+//---------------------------------------------------------
+
+ListEdit::~ListEdit()
+ {
+ }
+
+//---------------------------------------------------------
+// editColumn
+//---------------------------------------------------------
+
+void ListEdit::editColumn(Q3ListViewItem* i, const QPoint&, int col)
+ {
+ if (i == 0 || col == 2 || col == -1)
+ return;
+ returnPressed(); // close all old editors
+
+ editItem = (LItem*)i;
+ editCol = col;
+
+ int id = editItem->rtti();
+
+ if (col == 1) {
+ posEditor->setValue(editItem->tick());
+ curEditor = posEditor;
+ }
+ else if (id == L_TIMESIG && col == 3) {
+ sigEditor->setValue(i->text(col));
+ curEditor = sigEditor;
+ }
+ else if (id == L_NOTES && col == 3) {
+ pitchEditor->setValue(editItem->event().pitch());
+ curEditor = pitchEditor;
+ }
+ else if (id == L_SYSEX) {
+#if 0 //TODO3
+ MidiTrack* track = (MidiTrack*)(editItem->part()->track());
+ MidiPort* mp = &midiPorts[track->outPort()];
+ MidiInstrument* instr = mp->instrument();
+ Event oEvent = editItem->event();
+ EditSysexDialog dl(editItem->tick(), instr, oEvent, list->viewport());
+ int rv = dl.exec();
+ if (rv == QDialog::Accepted) {
+ Event event = dl.event();
+ audio->msgChangeEvent(oEvent, event, editItem->part(), true);
+ }
+#endif
+ editItem = 0;
+ editCol = -1;
+ return;
+ }
+ else if (id == L_META) {
+ Event oEvent = editItem->event();
+//TD EditMetaDialog dl(editItem->tick(), oEvent, list->viewport());
+// int rv = dl.exec();
+// if (rv == QDialog::Accepted) {
+// Event event = dl.event();
+// audio->msgChangeEvent(oEvent, event, editItem->part(), true);
+// }
+ editItem = 0;
+ editCol = -1;
+ return;
+ }
+ else if (id == L_CTRL) {
+ ListCtrl ctrl(editItem->tick(), editItem->lli()->track(),
+ editItem->lli()->ctrl(), editItem->val());
+
+ EditCtrlDialog dl(&ctrl, list->viewport());
+
+ int rv = dl.exec();
+ if (rv == QDialog::Accepted) {
+ song->addControllerVal(ctrl.track, ctrl.id, ctrl.tick, ctrl.val);
+ }
+ editItem = 0;
+ editCol = -1;
+ return;
+ }
+ else {
+ textEditor->setText(i->text(col));
+ textEditor->selectAll();
+ curEditor = textEditor;
+ }
+ setEditorGeometry();
+ curEditor->show();
+ curEditor->setFocus();
+ }
+
+//---------------------------------------------------------
+// setEditorGeometry
+//---------------------------------------------------------
+
+void ListEdit::setEditorGeometry()
+ {
+ int x1 = 0;
+ for (int i = 0; i < editCol; ++i)
+ x1 += list->columnWidth(i);
+ QRect r(list->itemRect(editItem));
+ r.setX(x1);
+ int w = list->columnWidth(editCol);
+ int wHint = curEditor->sizeHint().width();
+ if (wHint > w)
+ w = curEditor->sizeHint().width();
+ r.setWidth(w);
+ curEditor->setGeometry(r);
+ }
+
+//---------------------------------------------------------
+// returnPressed
+//---------------------------------------------------------
+
+void ListEdit::returnPressed()
+ {
+ if (editItem == 0)
+ return;
+ switch(editItem->rtti()) {
+ case L_TIMESIG:
+ if (editCol == 3) {
+ Awl::Sig newSig = sigEditor->sig();
+ int tick = editItem->tick();
+ song->startUndo();
+ audio->msgAddSig(tick, newSig.z, newSig.n, false);
+ song->endUndo(SC_SIG);
+ }
+ break;
+ case L_TEMPOSIG:
+ if (editCol == 3) {
+ QString input = textEditor->text();
+ const AL::TEvent* t = editItem->tempo();
+ unsigned tick = t->tick;
+ bool conversionOK;
+ double dbl_input = input.toDouble(&conversionOK);
+ if (conversionOK && dbl_input < 250.0) {
+ int tempo = lrint((1000000.0 * 60.0)/dbl_input);
+ song->startUndo();
+ audio->msgAddTempo(tick, tempo, false);
+ song->endUndo(SC_TEMPO);
+ }
+ else {
+ QMessageBox::warning(this, tr("MusE: List Editor"),
+ tr("Input error, conversion not OK or value out of range"),
+ QMessageBox::Ok, QMessageBox::NoButton
+ );
+ }
+ }
+ break;
+ case L_NOTES:
+ {
+ }
+ break;
+ case L_CTRL:
+ break;
+ }
+ escapePressed();
+ }
+
+//---------------------------------------------------------
+// escapePressed
+//---------------------------------------------------------
+
+void ListEdit::escapePressed()
+ {
+ if (editItem == 0)
+ return;
+ curEditor->hide();
+ curEditor = 0;
+ list->setFocus();
+ editItem = 0;
+ editCol = -1;
+ }
+
+//---------------------------------------------------------
+// colResized
+//---------------------------------------------------------
+
+void ListEdit::colResized()
+ {
+ if (curEditor)
+ setEditorGeometry();
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void ListEdit::readStatus(QDomNode node)
+ {
+ Q3ListViewItemIterator i(lists);
+
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ QString s(e.text());
+ if (tag == "geometry") {
+ QRect r = AL::readGeometry(node);
+ setGeometry(r);
+ }
+ else if (tag == "midiNumberBase") {
+ int base = s.toInt();
+ if (base == 16)
+ showHex = true;
+ menuView->setItemChecked(CMD_SET_HEX, showHex);
+ menuView->setItemChecked(CMD_SET_DEC, !showHex);
+ }
+ else if (tag == "splitter")
+ ; // TD splitter->readStatus(node.firstChild());
+ else if (tag == "list") {
+ QString name(e.attribute("name"));
+
+ if (i.current()) {
+ if (i.current()->text(0) == name) {
+ int open = e.attribute("open","-1").toInt();
+ int checked = e.attribute("checked","-1").toInt();
+ if (open == 1)
+ i.current()->setOpen(true);
+ else if (checked == 1)
+ ((Q3CheckListItem*)(i.current()))->setOn(true);
+ }
+ else
+ printf("ListEdit::readStatus(): name mismatch <%s><%s>\n",
+ i.current()->text(0).latin1(), s.latin1());
+ ++i;
+ }
+ else {
+ printf("ListEdit::readStatus(): list too long\n");
+ }
+ }
+ else
+ printf("MusE:List::Edit::readStatus(): unknown tag %s\n", e.tagName().latin1());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void ListEdit::writeStatus(Xml& xml) const
+ {
+ xml.tag("listeditor");
+ xml.geometryTag("geometry", this);
+ xml.intTag("midiNumberBase", showHex ? 16 : 10);
+//TD splitter->writeStatus(xml);
+
+ Q3ListViewItemIterator i(lists);
+ for (; i.current(); ++i) {
+ Q3ListViewItem* item = i.current();
+ int id = item->rtti();
+ if (id < 1000)
+ xml.tagE("list name=\"%s\" open=\"%d\"",
+ item->text(0).latin1(), item->isOpen());
+ else {
+ LLItem* ci = (LLItem*)item;
+ xml.tagE("list name=\"%s\" checked=\"%d\"",
+ item->text(0).latin1(), ci->isOn());
+ }
+ }
+ xml.etag("listeditor");
+ }
+
+//---------------------------------------------------------
+// cmd
+//---------------------------------------------------------
+
+void ListEdit::cmd(int cmd)
+ {
+ switch (cmd) {
+ case CMD_SET_HEX:
+ showHex = true;
+ menuView->setItemChecked(CMD_SET_HEX, true);
+ menuView->setItemChecked(CMD_SET_DEC, false);
+ updateList();
+ break;
+
+ case CMD_SET_DEC:
+ showHex = false;
+ menuView->setItemChecked(CMD_SET_HEX, false);
+ menuView->setItemChecked(CMD_SET_DEC, true);
+ updateList();
+ break;
+
+ case CMD_DELETE:
+ {
+ Q3ListViewItem* l = list->selectedItem();
+ if (!l)
+ return;
+ LItem* li = (LItem*)l;
+ switch(li->rtti()) {
+ case L_TIMESIG:
+ break;
+ case L_TEMPOSIG:
+ break;
+ case L_NOTES:
+ case L_SYSEX:
+ case L_PAFTER:
+ case L_CAFTER:
+ case L_META:
+ audio->msgDeleteEvent(li->event(), li->part(), true);
+ break;
+ case L_CTRL:
+ song->removeControllerVal(li->lli()->track(),
+ li->lli()->ctrl(), li->tick());
+ break;
+ }
+ break;
+ }
+ case CMD_INSERT_TEMPO:
+ break;
+ case CMD_INSERT_SIG:
+ break;
+ case CMD_INSERT_NOTE:
+ {
+ if (curPart == 0) {
+ printf("first select part\n");
+ break;
+ }
+//TD Event event = EditNoteDialog::getEvent(0, Event(), this);
+// if (!event.empty())
+// audio->msgAddEvent(event, curPart);
+ }
+ break;
+ case CMD_INSERT_SYSEX:
+ {
+ if (curPart == 0) {
+ printf("first select part\n");
+ break;
+ }
+#if 0 // TODO3
+ MidiTrack* track = (MidiTrack*)(curPart->track());
+ MidiPort* mp = &midiPorts[track->outPort()];
+ MidiInstrument* mi = mp->instrument();
+ Event event = EditSysexDialog::getEvent(0, mi, Event(), this);
+ if (!event.empty())
+ audio->msgAddEvent(event, curPart);
+#endif
+ }
+ break;
+ case CMD_INSERT_PAFTER:
+ case CMD_INSERT_CAFTER:
+ case CMD_INSERT_META:
+ case CMD_INSERT_CTRL:
+ {
+// ListCtrl ctrl(0, 0, 0, 0, 0);
+// if (EditCtrlDialog::editCtrl(&ctrl, this)) {
+// printf("ADD CONTROLLER\n");
+// }
+ }
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// listSelectionChanged
+//---------------------------------------------------------
+
+void ListEdit::listSelectionChanged()
+ {
+ Q3ListViewItem* item = list->selectedItem();
+ if (item == 0 || item->rtti() < 1000) {
+ curPartChanged(0);
+ return;
+ }
+ menuEdit->setItemEnabled(CMD_DELETE, true);
+ LItem* i = (LItem*)item;
+ switch(item->rtti()) {
+ case L_NOTES:
+ case L_SYSEX:
+ case L_PAFTER:
+ case L_CAFTER:
+ case L_META:
+ curPartChanged((MidiPart*)(i->part()));
+ break;
+ case L_TIMESIG:
+ case L_TEMPOSIG:
+ case L_CTRL:
+ curPartChanged(0);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void ListEdit::songChanged(int flags)
+ {
+ if (flags & (SC_EVENT_INSERTED | SC_EVENT_REMOVED | SC_EVENT_MODIFIED | SC_SIG | SC_TEMPO)) {
+ updateList();
+ }
+ }
+
+//---------------------------------------------------------
+// EditCtrlDialog
+// PosEdit* timePos;
+// QSlider* valSlider;
+// QSpinBox* valSpinBox;
+// QLabel* controllerName;
+// QListBox* ctrlList;
+// QPushButton* buttonNewController;
+//---------------------------------------------------------
+
+EditCtrlDialog::EditCtrlDialog(ListCtrl* c, QWidget* parent)
+// : EditCtrlBase(parent)
+ : QDialog(parent)
+ {
+#if 0
+ ctrl = c;
+
+ pop = new Q3PopupMenu(this);
+ pop->setCheckable(false);
+
+ bool isDrum = false;
+ if (c->track->type() == Track::MIDI_CHANNEL)
+ isDrum = ((MidiChannel*)c->track)->useDrumMap();
+
+ if (c->track->isMidiTrack()) {
+//TODO3 midiPort->setValue(((MidiTrack*)ctrl->track)->outPort() + 1);
+//TODO3 midiChannel->setValue(((MidiTrack*)ctrl->track)->outChannel() + 1);
+ }
+ else {
+ midiPort->setEnabled(false);
+ midiChannel->setEnabled(false);
+ }
+
+ ctrlList->clear();
+ ctrlList->setSelectionMode(Q3ListBox::Single);
+
+ //
+ // populate list of available controller
+ //
+
+ ControllerNameList* cnl = ctrl->track->controllerNames();
+
+ int idx = 0;
+ for (iControllerName i = cnl->begin(); i != cnl->end(); ++i, ++idx) {
+ int num = i->id;
+ // dont show drum specific controller if not a drum track
+ if ((num & 0xff) == 0xff) {
+ if (!isDrum)
+ continue;
+ }
+ ctrlList->insertItem(i->name);
+ if (num == ctrl->id)
+ ctrlList->setSelected(idx, true);
+ }
+
+ Ctrl* ct = ctrl->track->getController(ctrl->id);
+ valSlider->setRange(ct->minVal().i, ct->maxVal().i);
+ valSpinBox->setRange(ct->minVal().i, ct->maxVal().i);
+ controllerName->setText(ct->name());
+
+ connect(ctrlList, SIGNAL(clicked(Q3ListBoxItem*)), SLOT(ctrlListClicked(Q3ListBoxItem*)));
+//TD connect(buttonNewController, SIGNAL(pressed()), SLOT(newController()));
+// connect(hbank, SIGNAL(valueChanged(int)), SLOT(programChanged()));
+// connect(lbank, SIGNAL(valueChanged(int)), SLOT(programChanged()));
+// connect(program, SIGNAL(valueChanged(int)), SLOT(programChanged()));
+// connect(patchName, SIGNAL(released()), SLOT(instrPopup()));
+
+ ctrlListClicked(ctrlList->selectedItem());
+
+ timePos->setValue(ctrl->tick);
+ if (ctrl->id != CTRL_PROGRAM)
+ valSlider->setValue(ctrl->val.i);
+#endif
+ }
+
+//---------------------------------------------------------
+// newController
+//---------------------------------------------------------
+
+void EditCtrlDialog::newController()
+ {
+ if (!ctrl->track->isMidiTrack())
+ return;
+ Q3PopupMenu* pop = new Q3PopupMenu(this);
+ pop->setCheckable(this);
+ //
+ // populate popup with all controllers available for
+ // current instrument
+ //
+#if 0 //TODO3
+ int portn = ((MidiTrack*)ctrl->track)->outPort();
+ MidiPort* port = &midiPorts[portn];
+ MidiInstrument* instr = port->instrument();
+ MidiControllerList* mcl = instr->controller();
+ for (iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci)
+ pop->insertItem((*ci)->name());
+ int rv = pop->exec(buttonNewController->mapToGlobal(QPoint(0,0)));
+ if (rv != -1) {
+ QString s = pop->text(rv);
+ for (iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci) {
+ if ((*ci)->name() == s) {
+ for (int idx = 0; ;++idx) {
+ QString str = ctrlList->text(idx);
+ if (s == str)
+ break;
+ if (str.isNull()) {
+ ctrlList->insertItem(s);
+ break;
+ }
+ }
+ }
+ }
+ }
+#endif
+ delete pop;
+ }
+
+//---------------------------------------------------------
+// ctrlListClicked
+//---------------------------------------------------------
+
+void EditCtrlDialog::ctrlListClicked(Q3ListBoxItem* item)
+ {
+#if 0 //TD
+ if (item == 0)
+ return;
+ QString s(item->text());
+
+ ControllerNameList* cnl = ctrl->track->controllerNames();
+ for (iControllerName i = cnl->begin(); i != cnl->end(); ++i) {
+ if (s != i->name)
+ continue;
+ int num = i->id;
+ Ctrl* c = ctrl->track->getController(num);
+
+ if (num == CTRL_PROGRAM) {
+ widgetStack->raiseWidget(1);
+ updatePatch();
+ }
+ else {
+ widgetStack->raiseWidget(0);
+ valSlider->setRange(c->minVal().i, c->maxVal().i);
+ valSpinBox->setRange(c->minVal().i, c->maxVal().i);
+ controllerName->setText(s);
+ ctrl->val = c->getDefault();
+ valSlider->setValue(ctrl->val.i);
+ }
+ break;
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// setPatch
+//---------------------------------------------------------
+
+void EditCtrlDialog::updatePatch()
+ {
+#if 0 //TODO3
+ int port = ((MidiTrack*)ctrl->track)->outPort();
+ int channel = ((MidiTrack*)ctrl->track)->outChannel();
+ MidiInstrument* instr = midiPorts[port].instrument();
+ int val = ctrl->val.i;
+ const char* name = instr->getPatchName(channel, val);
+ patchName->setText(QString(name));
+
+ int hb = ((val >> 16) & 0xff) + 1;
+ if (hb == 0x100)
+ hb = 0;
+ int lb = ((val >> 8) & 0xff) + 1;
+ if (lb == 0x100)
+ lb = 0;
+ int pr = (val & 0xff) + 1;
+ if (pr == 0x100)
+ pr = 0;
+
+ hbank->blockSignals(true);
+ lbank->blockSignals(true);
+ program->blockSignals(true);
+
+ hbank->setValue(hb);
+ lbank->setValue(lb);
+ program->setValue(pr);
+
+ hbank->blockSignals(false);
+ lbank->blockSignals(false);
+ program->blockSignals(false);
+#endif
+ }
+
+//---------------------------------------------------------
+// instrPopup
+//---------------------------------------------------------
+
+void EditCtrlDialog::instrPopup()
+ {
+#if 0 //TODO3
+ int channel = ((MidiTrack*)ctrl->track)->outChannel();
+ int port = ((MidiTrack*)ctrl->track)->outPort();
+ MidiInstrument* instr = midiPorts[port].instrument();
+ instr->populatePatchPopup(pop, channel);
+
+ int rv = pop->exec(patchName->mapToGlobal(QPoint(10,5)));
+ if (rv != -1) {
+ ctrl->val.i = rv;
+ updatePatch();
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// programChanged
+//---------------------------------------------------------
+
+void EditCtrlDialog::programChanged()
+ {
+#if 0 //TD
+ int hb = hbank->value();
+ int lb = lbank->value();
+ int prog = program->value();
+
+ if (hb > 0 && hb < 129)
+ hb -= 1;
+ else
+ hb = 0xff;
+ if (lb > 0 && lb < 129)
+ lb -= 1;
+ else
+ lb = 0xff;
+ if (prog > 0 && prog < 129)
+ prog -= 1;
+ else
+ prog = 0xff;
+
+ ctrl->val.i = (hb << 16) + (lb << 8) + prog;
+ updatePatch();
+#endif
+ }
+
+//---------------------------------------------------------
+// trackAdded
+//---------------------------------------------------------
+
+void ListEdit::trackAdded(Track* track, int idx)
+ {
+ Q3ListViewItem* item;
+ if (idx != 0) {
+ Q3ListViewItem* item = lists->firstChild();
+ int i = 1;
+ while (item) {
+ if (i == idx) {
+ item = new Q3ListViewItem(lists, item);
+ item->setText(0, track->name());
+ break;
+ }
+ item = item->nextSibling();
+ ++i;
+ }
+ }
+ else
+ item = new Q3ListViewItem(lists, track->name());
+ genListsTrack(track, item);
+ }
+
+//---------------------------------------------------------
+// trackRemoved
+//---------------------------------------------------------
+
+void ListEdit::trackRemoved(Track* t)
+ {
+ Q3ListViewItemIterator i(lists);
+ for (; i.current(); ++i) {
+ int id = i.current()->rtti();
+ if (id == 0 && t->name() == i.current()->text(0)) {
+ delete i.current();
+ break;
+ }
+ }
+ updateList();
+ }
+
+//---------------------------------------------------------
+// genListsTrack
+//---------------------------------------------------------
+
+void ListEdit::genListsTrack(Track* track, Q3ListViewItem* it)
+ {
+ LLItem* lit;
+ ControllerNameList* cn = track->controllerNames();
+ for (iControllerName i = cn->begin(); i != cn->end(); ++i) {
+ lit = new LLItem(it, i->name, L_CTRL);
+ lit->setTrack(track);
+ lit->setCtrl(i->id);
+ connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList()));
+ connect(track, SIGNAL(controllerChanged(int)), SLOT(updateList()));
+ }
+ PartList* pl = track->parts();
+ for (iPart ip = pl->begin(); ip != pl->end(); ++ip) {
+ Part* part = ip->second;
+ LLItem* item = new LLItem(it, tr("Part") + part->name(), L_PART);
+ item->setPart(part);
+ if (track->isMidiTrack()) {
+ lit = new LLItem(item, tr("Note On/Off"), L_NOTES);
+ lit->setTrack(track);
+ connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList()));
+ lit = new LLItem(item, tr("Aftertouch"), L_CAFTER);
+ lit->setTrack(track);
+ connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList()));
+ lit = new LLItem(item, tr("PolyAftertouch"), L_PAFTER);
+ lit->setTrack(track);
+ connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList()));
+ lit = new LLItem(item, tr("Sysex"), L_SYSEX);
+ lit->setTrack(track);
+ connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList()));
+ lit = new LLItem(item, tr("Meta"), L_META);
+ lit->setTrack(track);
+ connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList()));
+ }
+ else if (track->type() == Track::WAVE) {
+ lit = new LLItem(item, tr("Waves"), L_WAVE);
+ lit->setTrack(track);
+ connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList()));
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// curPartChanged
+//---------------------------------------------------------
+
+void ListEdit::curPartChanged(MidiPart* part)
+ {
+ curPart = part;
+
+ if (curPart) {
+ tb_p->setText(curPart->name());
+ tb_t->setText(curPart->track()->name());
+ }
+ else {
+ tb_p->setText("----");
+ tb_t->setText("----");
+ }
+ }
+#endif
+
diff --git a/muse/muse/liste/listedit.h b/muse/muse/liste/listedit.h
new file mode 100644
index 00000000..912d2650
--- /dev/null
+++ b/muse/muse/liste/listedit.h
@@ -0,0 +1,214 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: listedit.h,v 1.20 2005/11/04 12:03:47 wschweer Exp $
+// (C) Copyright 1999-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __LIST_EDIT_H__
+#define __LIST_EDIT_H__
+
+#include "widgets/noteinfo.h"
+#include "al/pos.h"
+#include "event.h"
+#include "cobject.h"
+#include "ctrl.h"
+
+namespace Awl {
+ class SigEdit;
+ };
+
+namespace AL {
+ class SigEvent;
+ class TEvent;
+ };
+
+class Event;
+class MidiTrack;
+class PartList;
+class MidiPart;
+class MidiPart;
+class Track;
+class EditorSettings;
+class Ctrl;
+class Part;
+
+#if 0
+//---------------------------------------------------------
+// LLItem
+//---------------------------------------------------------
+
+class LLItem : public QObject, public Q3CheckListItem {
+ Q_OBJECT
+
+ int _rtti;
+ Track* _track;
+ Part* _part;
+ int _ctrl;
+
+ virtual void stateChange(bool) {
+ emit clicked(this);
+ }
+ int width(const QFontMetrics&, const QListWidget*, int) const {
+ return 155;
+ }
+
+ signals:
+ void clicked(LLItem*);
+
+ public:
+ LLItem(QListWidgetItem* parent, const QString& text, int id)
+ : QCheckListItem(parent, text, Q3CheckListItem::CheckBoxController)
+ {
+ _rtti = id;
+ }
+
+ LLItem(Q3ListView* parent, const QString& text, int id)
+ : Q3CheckListItem(parent, text, Q3CheckListItem::CheckBoxController)
+ {
+ _rtti = id;
+ }
+ virtual int rtti() const { return _rtti; }
+ void setTrack(Track* t) { _track = t; }
+ Track* track() const { return _track; }
+ void setPart(Part* p) { _part = p; }
+ Part* part() const { return _part; }
+ void setCtrl(int id) { _ctrl = id; }
+ int ctrl() const { return _ctrl; }
+ };
+
+//---------------------------------------------------------
+// LItem
+//---------------------------------------------------------
+
+class LItem : public Q3ListViewItem {
+ bool zebra;
+ int _rtti;
+ Pos _pos;
+ bool* showHex;
+
+ AL::TEvent* _tempo;
+ Event _event;
+ Part* _part;
+ AL::SigEvent* _sig;
+ CVal _val;
+ LLItem* _lli;
+
+ virtual void paintCell(QPainter*, const QColorGroup&, int, int, int);
+
+ public:
+ LItem(Q3ListView* parent, int id, bool* shp)
+ : Q3ListViewItem(parent) {
+ showHex = shp;
+ _rtti = id;
+ zebra = false;
+ }
+ virtual int rtti() const { return _rtti; }
+ virtual QString text(int col) const;
+ void setPos(Pos p) { _pos = p; }
+ unsigned tick() const { return _pos.tick(); }
+ void setTempo(AL::TEvent* t) { _tempo = t; }
+ AL::TEvent* tempo() const { return _tempo; }
+ virtual int compare(Q3ListViewItem* i, int, bool) const {
+ return _pos.tick() - ((LItem*)i)->_pos.tick();
+ }
+ void setEvent(Event ev) { _event = ev; }
+ Event event() const { return _event; }
+ void setVal(CVal v) { _val = v; }
+ CVal val() const { return _val; }
+ void setZebra(bool v) { zebra = v; }
+ void setSigEvent(AL::SigEvent* e) { _sig = e; }
+ AL::SigEvent* sigEvent() const { return _sig; }
+ void setPart(Part* p) { _part = p; }
+ Part* part() const { return _part; }
+ void setLLi(LLItem* i) { _lli = i; }
+ LLItem* lli() const { return _lli; }
+ };
+
+//---------------------------------------------------------
+// ListEdit
+//---------------------------------------------------------
+
+class ListEdit : public TopWin {
+ Q_OBJECT
+ Q3ListView* lists;
+ Q3ListView* list;
+ LItem* editItem;
+ int editCol;
+ QLineEdit* textEditor;
+ Awl::SigEdit* sigEditor;
+ Awl::PitchEdit* pitchEditor;
+ Awl::PosEdit* posEditor;
+ Q3PopupMenu* menuEdit;
+ Q3PopupMenu* menuView;
+ QLabel* tb_p; // current part
+ QLabel* tb_t; // current track
+
+ MidiPart* curPart;
+ QSplitter* splitter;
+
+ QToolBar* listTools;
+ QWidget* curEditor;
+ bool showHex; // show midi values in hex
+
+ enum { CMD_DELETE, CMD_INSERT_SIG, CMD_INSERT_TEMPO, CMD_INSERT_NOTE, CMD_INSERT_SYSEX,
+ CMD_INSERT_PAFTER, CMD_INSERT_CAFTER, CMD_INSERT_META,
+ CMD_INSERT_CTRL, CMD_SET_DEC, CMD_SET_HEX
+ };
+
+ void setEditorGeometry();
+ void genListsTrack(Track*, Q3ListViewItem*);
+ void curPartChanged(MidiPart* part);
+
+ private slots:
+ void updateLists();
+ void editColumn(Q3ListViewItem*, const QPoint&, int col);
+ void returnPressed();
+ void escapePressed();
+ virtual void colResized();
+ void cmd(int cmd);
+ void listSelectionChanged();
+ void updateList();
+ void songChanged(int);
+ void trackAdded(Track*, int idx);
+ void trackRemoved(Track*);
+
+ public:
+ ListEdit(QWidget* parent, PartList*);
+ ~ListEdit();
+ virtual void readStatus(QDomNode);
+ virtual void writeStatus(Xml&) const;
+ };
+
+class ListCtrl;
+
+//---------------------------------------------------------
+// EditCtrlDialog
+//---------------------------------------------------------
+
+// class EditCtrlDialog : public EditCtrlBase {
+class EditCtrlDialog : public QDialog {
+ Q_OBJECT
+
+ ListCtrl* ctrl;
+ Q3PopupMenu* pop;
+
+ void updatePatch();
+
+ private slots:
+ void ctrlListClicked(Q3ListBoxItem*);
+ void newController();
+ void programChanged();
+ void instrPopup();
+
+ protected:
+ QGridLayout* layout;
+
+
+ public:
+ EditCtrlDialog(ListCtrl*, QWidget* parent=0);
+ };
+
+#endif
+#endif
+
diff --git a/muse/muse/marker/CMakeLists.txt b/muse/muse/marker/CMakeLists.txt
new file mode 100644
index 00000000..1af7d878
--- /dev/null
+++ b/muse/muse/marker/CMakeLists.txt
@@ -0,0 +1,45 @@
+#
+#
+#
+#
+
+MACRO(WRAP_CPP outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.cpp)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_CPP)
+
+MACRO(WRAP_H outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.h)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_H)
+
+MACRO(WRAP_UI outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.ui)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_UI)
+
+set(mocs
+ markerview
+ )
+
+WRAP_H(mocH ${mocs})
+WRAP_CPP(mocCPP ${mocs})
+
+QT4_WRAP_CPP (moc_headers ${mocH})
+
+set (uics
+ )
+
+WRAP_UI(uiUI ${uics})
+QT4_WRAP_UI (ui_headers ${uiUI})
+
+set ( marker_src ${mocCPP} ${moc_headers})
+
+add_library ( marker STATIC ${marker_src})
+set_target_properties( marker
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_SOURCE_DIR}/all.h"
+ )
+
diff --git a/muse/muse/marker/markerview.cpp b/muse/muse/marker/markerview.cpp
new file mode 100644
index 00000000..e07e7ab0
--- /dev/null
+++ b/muse/muse/marker/markerview.cpp
@@ -0,0 +1,391 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: markerview.cpp,v 1.25 2006/02/06 17:57:21 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "markerview.h"
+#include "globals.h"
+#include "sync.h"
+#include "icons.h"
+#include "song.h"
+#include "awl/posedit.h"
+#include "al/al.h"
+#include "al/xml.h"
+#include "al/sig.h"
+#include "al/tempo.h"
+#include "al/marker.h"
+
+enum { COL_TICK = 0, COL_SMPTE, COL_LOCK, COL_NAME };
+
+//---------------------------------------------------------
+// tick
+//---------------------------------------------------------
+
+unsigned MarkerItem::tick() const
+ {
+ return _marker->tick();
+ }
+
+//---------------------------------------------------------
+// name
+//---------------------------------------------------------
+
+const QString MarkerItem::name() const
+ {
+ return _marker->name();
+ }
+
+//---------------------------------------------------------
+// lock
+//---------------------------------------------------------
+
+bool MarkerItem::lock() const
+ {
+ return _marker->type() == AL::FRAMES;
+ }
+
+//---------------------------------------------------------
+// MarkerItem
+//---------------------------------------------------------
+
+MarkerItem::MarkerItem(QTreeWidget* parent, AL::Marker* m)
+ : QTreeWidgetItem(parent)
+ {
+ _marker = m;
+ setText(COL_NAME, m->name());
+ setTick(m->tick());
+ if (m->type() == AL::FRAMES)
+ setIcon(COL_LOCK, *lockIcon);
+ setLock(m->type() == AL::FRAMES);
+ }
+
+//---------------------------------------------------------
+// setName
+//---------------------------------------------------------
+
+void MarkerItem::setName(const QString& s)
+ {
+ setText(COL_NAME, s);
+ _marker = song->setMarkerName(_marker, s);
+ }
+
+//---------------------------------------------------------
+// setLock
+//---------------------------------------------------------
+
+void MarkerItem::setLock(bool lck)
+ {
+ setIcon(COL_LOCK, lck ? *lockIcon : QIcon());
+ _marker = song->setMarkerLock(_marker, lck);
+ }
+
+//---------------------------------------------------------
+// setTick
+//---------------------------------------------------------
+
+void MarkerItem::setTick(unsigned v)
+ {
+ if (_marker->tick() != v)
+ _marker = song->setMarkerTick(_marker, v);
+ QString s;
+ int bar, beat;
+ int tick;
+ _marker->mbt(&bar, &beat, &tick);
+ s.sprintf("%04d.%02d.%03d", bar+1, beat+1, tick);
+ setText(COL_TICK, s);
+
+ int min, sec, frame, subframe;
+ _marker->msf(&min, &sec, &frame, &subframe);
+
+ s.sprintf("%03d:%02d:%02d:%02d", min, sec, frame, subframe);
+ setText(COL_SMPTE, s);
+ }
+
+//---------------------------------------------------------
+// MarkerView
+//---------------------------------------------------------
+
+MarkerView::MarkerView()
+ : TopWin()
+ {
+ setWindowTitle(tr("MusE: Marker"));
+
+ //---------Actions----------------------------
+ QAction* markerAdd = new QAction(QIcon(*flagIcon), tr("add marker"), this);
+ markerAdd->setToolTip(tr("Add Marker"));
+ connect(markerAdd, SIGNAL(triggered()), SLOT(addMarker()));
+
+ QAction* markerDelete = new QAction(QIcon(*deleteIcon), tr("delete marker"), this);
+ markerDelete->setToolTip(tr("Delete Marker"));
+ connect(markerDelete, SIGNAL(triggered()), SLOT(deleteMarker()));
+
+ //---------Pulldown Menu----------------------------
+ QMenuBar* mb = menuBar();
+
+ QMenu* editMenu = mb->addMenu(tr("&Edit"));
+ editMenu->addAction(markerAdd);
+ editMenu->addAction(markerDelete);
+
+ //---------ToolBar----------------------------------
+ QToolBar* tools = addToolBar(tr("marker-tools"));
+ tools->addAction(undoAction);
+ tools->addAction(redoAction);
+
+ QToolBar* edit = addToolBar(tr("edit tools"));
+ edit->addAction(markerAdd);
+ edit->addAction(markerDelete);
+
+ //---------------------------------------------------
+ // master
+ //---------------------------------------------------
+
+ QWidget* w = new QWidget;
+ setCentralWidget(w);
+ QVBoxLayout* vbox = new QVBoxLayout;
+ w->setLayout(vbox);
+
+ table = new QTreeWidget;
+ table->setUniformRowHeights(true);
+ table->setAlternatingRowColors(true);
+ table->setSelectionBehavior(QAbstractItemView::SelectRows);
+ table->setSelectionMode(QTreeWidget::SingleSelection);
+ table->setSortingEnabled(false);
+ table->setIndentation(0);
+ QStringList labels;
+ labels << tr("Bar:Beat:Tick")
+ << tr("Min:Sc:Fr:Sf")
+ << tr("Lock")
+ << tr("Text");
+ table->setHeaderLabels(labels);
+
+ table->header()->resizeSection(0, 120);
+ table->header()->resizeSection(1, 120);
+ table->header()->resizeSection(2, 50);
+ table->header()->resizeSection(3, 200);
+// table->header()->resizeSection(mnWidthMode(3, QTreeWidget::Maximum);
+ connect(table, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(markerSelectionChanged(QTreeWidgetItem*)));
+ connect(table, SIGNAL(itemClicked(QTreeWidgetItem*,int)), SLOT(clicked(QTreeWidgetItem*)));
+
+ QGroupBox* props = new QGroupBox(tr("Marker Properties"));
+ QHBoxLayout* propsLayout = new QHBoxLayout;
+ props->setLayout(propsLayout);
+
+ editTick = new Awl::PosEdit;
+ propsLayout->addWidget(editTick);
+ editTick->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
+ QSizePolicy::Fixed));
+
+ editSMPTE = new Awl::PosEdit;
+ propsLayout->addWidget(editSMPTE);
+ editSMPTE->setSmpte(true);
+ editSMPTE->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
+ QSizePolicy::Fixed));
+
+ lock = new QToolButton;
+ propsLayout->addWidget(lock);
+ lock->setIcon(*lockIcon);
+ lock->setCheckable(true);
+
+ editName = new QLineEdit;
+ propsLayout->addWidget(editName);
+ editName->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,
+ QSizePolicy::Preferred));
+ connect(editName, SIGNAL(textChanged(const QString&)),
+ SLOT(nameChanged(const QString&)));
+ connect(editTick, SIGNAL(valueChanged(const Pos&)),
+ SLOT(tickChanged(const Pos&)));
+ connect(editSMPTE, SIGNAL(valueChanged(const Pos&)),
+ SLOT(tickChanged(const Pos&)));
+ connect(editSMPTE, SIGNAL(valueChanged(const Pos&)),
+ editTick, SLOT(setValue(const Pos&)));
+ connect(editTick, SIGNAL(valueChanged(const Pos&)),
+ editSMPTE, SLOT(setValue(const Pos&)));
+ connect(lock, SIGNAL(toggled(bool)),
+ SLOT(lockChanged(bool)));
+ connect(song, SIGNAL(markerChanged(int)),
+ SLOT(markerChanged(int)));
+
+ vbox->addWidget(table);
+ vbox->addWidget(props);
+
+ //---------------------------------------------------
+ // Rest
+ //---------------------------------------------------
+
+ connect(song, SIGNAL(songChanged(int)), SLOT(updateList()));
+ updateList();
+ }
+
+//---------------------------------------------------------
+// MArkerView
+//---------------------------------------------------------
+
+MarkerView::~MarkerView()
+ {
+// undoRedo->removeFrom(tools);
+ }
+
+//---------------------------------------------------------
+// addMarker
+//---------------------------------------------------------
+
+void MarkerView::addMarker()
+ {
+ addMarker(song->cPos());
+ }
+
+void MarkerView::addMarker(const AL::Pos& pos)
+ {
+ AL::Marker* m = song->addMarker(QString(""), pos);
+ MarkerItem* newItem = new MarkerItem(table, m);
+ table->setCurrentItem(newItem);
+ table->setItemSelected(newItem, true);
+ table->sortItems(0, Qt::AscendingOrder);
+ }
+
+//---------------------------------------------------------
+// removeMarker
+//---------------------------------------------------------
+
+void MarkerView::removeMarker(const AL::Pos&)
+ {
+ printf("delete marker: not implemented\n");
+ }
+
+//---------------------------------------------------------
+// deleteMarker
+//---------------------------------------------------------
+
+void MarkerView::deleteMarker()
+ {
+ MarkerItem* item = (MarkerItem*)table->currentItem();
+ if (item) {
+ song->removeMarker(item->marker());
+ delete item;
+ }
+ }
+
+//---------------------------------------------------------
+// updateList
+//---------------------------------------------------------
+
+void MarkerView::updateList()
+ {
+ table->clear();
+ AL::MarkerList* marker = song->marker();
+ for (AL::iMarker i = marker->begin(); i != marker->end(); ++i) {
+ AL::Marker* m = &i->second;
+ QString tick;
+ tick.setNum(i->first);
+ new MarkerItem(table, m);
+ }
+ }
+
+//---------------------------------------------------------
+// markerSelected
+//---------------------------------------------------------
+
+void MarkerView::markerSelectionChanged(QTreeWidgetItem* i)
+ {
+ MarkerItem* item = (MarkerItem*)i;
+ if (item == 0) { // never triggered
+ editTick->setValue(0);
+ editSMPTE->setValue(0);
+ editName->setText(QString(""));
+ lock->setChecked(false);
+ editSMPTE->setEnabled(false);
+ editTick->setEnabled(false);
+ lock->setEnabled(false);
+ editName->setEnabled(false);
+ }
+ else {
+ editTick->setValue(item->tick());
+ editSMPTE->setValue(item->tick());
+ editName->setText(item->name());
+ editName->setEnabled(true);
+ lock->setChecked(item->lock());
+ lock->setEnabled(true);
+ editSMPTE->setEnabled(item->lock());
+ editTick->setEnabled(!item->lock());
+ }
+ }
+
+void MarkerView::clicked(QTreeWidgetItem* i)
+ {
+ MarkerItem* item = (MarkerItem*)i;
+ if (item == 0) {
+ table->clearSelection();
+ return;
+ }
+ Pos p(item->tick(), AL::TICKS);
+ song->setPos(0, p, true, true, false);
+ }
+
+//---------------------------------------------------------
+// nameChanged
+//---------------------------------------------------------
+
+void MarkerView::nameChanged(const QString& s)
+ {
+ MarkerItem* item = (MarkerItem*)table->currentItem();
+ if (item)
+ item->setName(s);
+ }
+
+//---------------------------------------------------------
+// tickChanged
+//---------------------------------------------------------
+
+void MarkerView::tickChanged(const Pos& pos)
+ {
+ MarkerItem* item = (MarkerItem*)table->currentItem();
+ if (item) {
+ item->setTick(pos.tick());
+ Pos p(pos.tick(), AL::TICKS);
+ song->setPos(0, p, true, true, false);
+// table->sort();
+ }
+ }
+
+//---------------------------------------------------------
+// lockChanged
+//---------------------------------------------------------
+
+void MarkerView::lockChanged(bool lck)
+ {
+ MarkerItem* item = (MarkerItem*)table->currentItem();
+ if (item) {
+ item->setLock(lck);
+ editSMPTE->setEnabled(item->lock());
+ editTick->setEnabled(!item->lock());
+ }
+ }
+
+//---------------------------------------------------------
+// posChanged
+// select appropriate Marker
+//---------------------------------------------------------
+
+void MarkerView::markerChanged(int)
+ {
+#if 0
+ if (val != Song::MARKER_CUR)
+ return;
+ MarkerList* marker = song->marker();
+ for (iMarker i = marker->begin(); i != marker->end(); ++i) {
+ if (i->second.current()) {
+ MarkerItem* item = (MarkerItem*)table->firstChild();
+ while (item) {
+ if (item->marker() == &i->second) {
+ table->setSelected(item, true);
+ return;
+ }
+ item = (MarkerItem*)item->nextSibling();
+ }
+ }
+ }
+#endif
+ }
+
diff --git a/muse/muse/marker/markerview.h b/muse/muse/marker/markerview.h
new file mode 100644
index 00000000..844ce2fd
--- /dev/null
+++ b/muse/muse/marker/markerview.h
@@ -0,0 +1,84 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: markerview.h,v 1.16 2006/02/06 17:57:21 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MARKERVIEW_H__
+#define __MARKERVIEW_H__
+
+#include "cobject.h"
+
+namespace Awl {
+ class PosEdit;
+ };
+
+namespace AL {
+ class Pos;
+ class Xml;
+ class Marker;
+ };
+using AL::Pos;
+using AL::Xml;
+
+
+//---------------------------------------------------------
+// MarkerItem
+//---------------------------------------------------------
+
+class MarkerItem : public QTreeWidgetItem {
+ AL::Marker* _marker;
+
+ public:
+ MarkerItem(QTreeWidget* parent, AL::Marker* m);
+ AL::Marker* marker() const { return _marker; }
+ unsigned tick() const;
+ const QString name() const;
+ bool lock() const;
+ void setName(const QString& s);
+ void setTick(unsigned t);
+ void setLock(bool lck);
+ };
+
+//---------------------------------------------------------
+// MarkerView
+//---------------------------------------------------------
+
+class MarkerView : public TopWin {
+ Q_OBJECT
+
+ QTreeWidget* table;
+ QLineEdit* editName;
+ Awl::PosEdit* editSMPTE;
+ Awl::PosEdit* editTick;
+ QToolButton* lock;
+
+ void closeEvent(QCloseEvent* e) {
+ emit closed();
+ QMainWindow::closeEvent(e);
+ }
+
+ signals:
+ void closed();
+
+ private slots:
+ void addMarker();
+ void addMarker(const AL::Pos&);
+ void removeMarker(const AL::Pos&);
+ void deleteMarker();
+ void markerSelectionChanged(QTreeWidgetItem*);
+ void nameChanged(const QString&);
+ void tickChanged(const Pos&);
+ void lockChanged(bool);
+ void markerChanged(int);
+ void clicked(QTreeWidgetItem*);
+ void updateList();
+
+ public:
+ MarkerView();
+ virtual ~MarkerView();
+ };
+
+#endif
+
diff --git a/muse/muse/master/CMakeLists.txt b/muse/muse/master/CMakeLists.txt
new file mode 100644
index 00000000..6b34bb7f
--- /dev/null
+++ b/muse/muse/master/CMakeLists.txt
@@ -0,0 +1,37 @@
+#
+#
+#
+#
+
+MACRO(WRAP_CPP outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.cpp)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_CPP)
+
+MACRO(WRAP_H outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.h)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_H)
+
+MACRO(WRAP_UI outfiles )
+ FOREACH(it ${ARGN})
+ SET(${outfiles} ${${outfiles}} ${it}.ui)
+ ENDFOREACH(it)
+ ENDMACRO(WRAP_UI)
+
+set( mocs master masteredit )
+
+WRAP_H(mocH ${mocs})
+WRAP_CPP(mocCPP ${mocs})
+
+QT4_WRAP_CPP (moc_headers ${mocH})
+
+set ( master_src ${mocCPP} ${moc_headers})
+
+add_library ( master STATIC ${master_src})
+set_target_properties( master
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_SOURCE_DIR}/all.h"
+ )
+
diff --git a/muse/muse/master/master.cpp b/muse/muse/master/master.cpp
new file mode 100644
index 00000000..6a9dd96b
--- /dev/null
+++ b/muse/muse/master/master.cpp
@@ -0,0 +1,220 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: master.cpp,v 1.16 2006/02/06 17:57:21 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "master.h"
+#include "icons.h"
+#include "audio.h"
+#include "al/tempo.h"
+#include "song.h"
+
+static const int minTempo = 50;
+static const int maxTempo = 250;
+
+//---------------------------------------------------------
+// pix2tempo
+//---------------------------------------------------------
+
+int MasterCanvas::pix2tempo(int val) const
+ {
+ return maxTempo*1000 - mapyDev(val);
+ }
+
+//---------------------------------------------------------
+// tempo2pix
+//---------------------------------------------------------
+
+int MasterCanvas::tempo2pix(int val) const
+ {
+ return mapy(maxTempo*1000 - lrint(60000000000.0/val));
+ }
+
+//---------------------------------------------------------
+// MasterCanvas
+//---------------------------------------------------------
+
+MasterCanvas::MasterCanvas()
+ : TimeCanvas(TIME_CANVAS)
+ {
+ setMarkerList(song->marker());
+ setMag(xmag(), 400.0 / (maxTempo * 1000.0));
+ setYMagRange(40.0 / (maxTempo*1000), 4000.0 / (maxTempo*1000));
+ setVSize((maxTempo - minTempo) * 1000);
+ setYFit(true);
+ verticalScrollBar()->setSingleStep(1000);
+ verticalScrollBar()->setMinimum(minTempo * 1000);
+ verticalScrollBar()->setMaximum(maxTempo * 1000);
+ drag = DRAG_OFF;
+ }
+
+//---------------------------------------------------------
+// paint
+//---------------------------------------------------------
+
+void MasterCanvas::paint(QPainter& p, QRect rect)
+ {
+ int y = rect.y();
+
+ //---------------------------------------------------
+ // draw Canvas Items
+ //---------------------------------------------------
+
+ int y2 = lrint(maxTempo * 1000 * _ymag);
+ const AL::TempoList* tl = &AL::tempomap;
+ for (AL::ciTEvent i = tl->begin(); i != tl->end(); ++i) {
+ AL::TEvent* e = i->second;
+ int x1 = pos2pix(AL::Pos(i->first));
+ int x2 = pos2pix(AL::Pos(i->second->tick));
+ int y1 = lrint(_ymag * (maxTempo*1000 - lrint(60000000000.0/e->tempo)));
+ if (y1 < y)
+ y1 = y;
+ p.fillRect(x1, y1, x2 - x1, y2 - y1, Qt::blue);
+ }
+ }
+
+//---------------------------------------------------------
+// viewMousePressEvent
+//---------------------------------------------------------
+
+void MasterCanvas::mousePress(QMouseEvent* event)
+ {
+ start = event->pos();
+ int x = start.x() - rCanvasA.x();
+ int y = start.y() - rCanvasA.y();
+
+ switch (tool()) {
+ case PointerTool:
+ drag = DRAG_LASSO_START;
+ break;
+
+ case PencilTool:
+ drag = DRAG_NEW;
+ song->startUndo();
+ newVal(x, x, y);
+ break;
+
+ case RubberTool:
+ drag = DRAG_DELETE;
+ song->startUndo();
+ deleteVal(x, x);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// viewMouseMoveEvent
+//---------------------------------------------------------
+
+void MasterCanvas::mouseMove(QPoint pos)
+ {
+ int y = pos.y() - rCanvasA.y();
+ int x = pos.x() - rCanvasA.x();
+
+ QPoint dist = pos - start;
+ // bool moving = dist.y() >= 3 || dist.y() <= 3 || dist.x() >= 3 || dist.x() <= 3;
+
+ int sx = start.x() - rCanvasA.x();
+ switch (drag) {
+ case DRAG_NEW:
+ newVal(sx, x, y);
+ start = pos;
+ break;
+
+ case DRAG_DELETE:
+ deleteVal(sx, x);
+ start = pos;
+ break;
+
+ default:
+ break;
+ }
+ emit tempoChanged(pix2tempo(y));
+// emit timeChanged(editor->rasterVal(x));
+ }
+
+//---------------------------------------------------------
+// mouseRelease
+//---------------------------------------------------------
+
+void MasterCanvas::mouseRelease(QMouseEvent*)
+ {
+ switch (drag) {
+ case DRAG_RESIZE:
+ case DRAG_NEW:
+ case DRAG_DELETE:
+ song->endUndo(SC_TEMPO);
+ break;
+ default:
+ break;
+ }
+ drag = DRAG_OFF;
+ }
+
+//---------------------------------------------------------
+// deleteVal
+//---------------------------------------------------------
+
+bool MasterCanvas::deleteVal1(const AL::Pos& p1, const AL::Pos& p2)
+ {
+ bool songChanged = false;
+
+ AL::TempoList* tl = &AL::tempomap;
+ for (AL::iTEvent i = tl->begin(); i != tl->end(); ++i) {
+ if (i->first < p1.tick())
+ continue;
+ if (i->first >= p2.tick())
+ break;
+ AL::iTEvent ii = i;
+ ++ii;
+ if (ii != tl->end()) {
+ int tempo = ii->second->tempo;
+ audio->msgDeleteTempo(i->first, tempo, false);
+ songChanged = true;
+ }
+ }
+ return songChanged;
+ }
+
+//---------------------------------------------------------
+// deleteVal
+//---------------------------------------------------------
+
+void MasterCanvas::deleteVal(int x1, int x2)
+ {
+ AL::Pos p1(pix2pos(x1));
+ AL::Pos p2(pix2pos(x2));
+ p1.downSnap(raster());
+ p2.upSnap(raster());
+ if (deleteVal1(p1, p2))
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// newVal
+//---------------------------------------------------------
+
+void MasterCanvas::newVal(int x1, int x2, int y)
+ {
+ int tempo = lrint(60000000000.0 / pix2tempo(y));
+ AL::Pos p1 = pix2pos(x1);
+ p1.downSnap(raster());
+ AL::Pos p2 = pix2pos(x2);
+ p2.upSnap(raster());
+
+ if (p1 > p2) {
+ AL::Pos tmp = p2;
+ p2 = p1;
+ p1 = tmp;
+ }
+ deleteVal1(p1, p2);
+ audio->msgAddTempo(p1.tick(), tempo, false);
+ widget()->update();
+ }
+
+
diff --git a/muse/muse/master/master.h b/muse/muse/master/master.h
new file mode 100644
index 00000000..1c353775
--- /dev/null
+++ b/muse/muse/master/master.h
@@ -0,0 +1,50 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: master.h,v 1.12 2005/12/09 17:54:16 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MASTER_H__
+#define __MASTER_H__
+
+#include "awl/tcanvas.h"
+
+class GraphMidiEditor;
+
+//---------------------------------------------------------
+// MasterCanvas
+//---------------------------------------------------------
+
+class MasterCanvas : public TimeCanvas {
+ QPoint start;
+
+ enum {
+ DRAG_OFF, DRAG_LASSO_START, DRAG_RESIZE, DRAG_NEW,
+ DRAG_DELETE
+ } drag;
+
+ Q_OBJECT
+ virtual void mouseMove(QPoint);
+ virtual void mousePress(QMouseEvent* event);
+ virtual void mouseRelease(QMouseEvent*);
+
+ virtual void paint(QPainter&, QRect);
+
+ void newVal(int x1, int x2, int y);
+ bool deleteVal1(const AL::Pos&, const AL::Pos&);
+ void deleteVal(int x1, int x2);
+
+ int pix2tempo(int) const;
+ int tempo2pix(int) const;
+
+ signals:
+ void tempoChanged(int);
+
+ public:
+ MasterCanvas();
+ virtual ~MasterCanvas() {}
+ };
+
+#endif
+
diff --git a/muse/muse/master/masteredit.cpp b/muse/muse/master/masteredit.cpp
new file mode 100644
index 00000000..6f130cfc
--- /dev/null
+++ b/muse/muse/master/masteredit.cpp
@@ -0,0 +1,287 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: masteredit.cpp,v 1.31 2006/02/01 18:40:47 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "song.h"
+#include "masteredit.h"
+#include "awl/poslabel.h"
+#include "awl/tempoedit.h"
+#include "awl/tempolabel.h"
+#include "awl/sigedit.h"
+#include "master.h"
+#include "al/tempo.h"
+#include "widgets/tools.h"
+
+static int rasterTable[] = { 1, 0, 768, 384, 192, 96 };
+static const char* rastval[] = {
+ QT_TR_NOOP("Off"), "Bar", "1/2", "1/4", "1/8", "1/16"
+ };
+
+int MasterEdit::initRaster = MasterEdit::INIT_RASTER;
+int MasterEdit::initWidth = MasterEdit::INIT_WIDTH;
+int MasterEdit::initHeight = MasterEdit::INIT_HEIGHT;
+double MasterEdit::initXmag = 0.04;
+double MasterEdit::initYmag = 1.0;
+
+//---------------------------------------------------------
+// MasterEdit
+//---------------------------------------------------------
+
+MasterEdit::MasterEdit()
+ : Editor()
+ {
+ setWindowTitle(tr("MusE: Mastertrack"));
+
+ //---------ToolBar----------------------------------
+ tools = addToolBar(tr("edit tools"));
+ tools->addAction(undoAction);
+ tools->addAction(redoAction);
+ tools->addSeparator();
+
+ tools2 = new EditToolBar(this,
+ PointerTool | PencilTool | RubberTool);
+ addToolBar(tools2);
+
+ QToolBar* enableMaster = addToolBar(tr("EnableMaster"));
+ enableMasterAction = enableMaster->addAction(tr("Enable"));
+ enableMasterAction->setCheckable(true);
+ enableMasterAction->setToolTip(tr("Enable usage of master track"));
+ enableMasterAction->setChecked(song->masterFlag());
+ connect(enableMasterAction, SIGNAL(triggered(bool)), song, SLOT(setMasterFlag(bool)));
+
+ addToolBarBreak();
+ QToolBar* info = new QToolBar(tr("Info"), this);
+ addToolBar(info);
+
+ QLabel* label = new QLabel(tr("Cursor"));
+ info->addWidget(label);
+
+ cursorPos = new PosLabel;
+ info->addWidget(cursorPos);
+ tempo = new TempoLabel(info);
+ info->addWidget(tempo);
+
+ info->addWidget(new QLabel(tr("Snap")));
+ rasterLabel = new QComboBox;
+ info->addWidget(rasterLabel);
+ for (int i = 0; i < 6; i++)
+ rasterLabel->addItem(tr(rastval[i]), i);
+ connect(rasterLabel, SIGNAL(activated(int)), SLOT(_setRaster(int)));
+
+ cursorPos->setToolTip(tr("time at cursor position"));
+ tempo->setToolTip(tr("tempo at cursor position"));
+
+ //---------values for current position---------------
+ info->addWidget(new QLabel(tr("CurPos ")));
+ curTempo = new TempoEdit(info);
+ info->addWidget(curTempo);
+ curSig = new SigEdit(info);
+ info->addWidget(curSig);
+ curSig->setValue(AL::TimeSignature(4, 4));
+ curTempo->setToolTip(tr("tempo at current position"));
+ curSig->setToolTip(tr("time signature at current position"));
+ connect(curSig, SIGNAL(valueChanged(const AL::TimeSignature&)), song, SLOT(setSig(const AL::TimeSignature&)));
+ connect(curTempo, SIGNAL(tempoChanged(int)), song, SLOT(setTempo(int)));
+
+ //---------------------------------------------------
+ // master
+ //---------------------------------------------------
+
+ tcanvas = new MasterCanvas;
+ setCentralWidget(tcanvas);
+ tcanvas->setEndPos(AL::Pos(song->len()));
+ setRaster(INIT_RASTER);
+ tcanvas->setMag(initXmag, initYmag);
+
+ connect(song, SIGNAL(posChanged(int,const AL::Pos&,bool)), tcanvas, SLOT(setLocatorPos(int,const AL::Pos&,bool)));
+ connect(song, SIGNAL(posChanged(int,const AL::Pos&,bool)), SLOT(posChanged(int,const AL::Pos&,bool)));
+ connect(song, SIGNAL(lenChanged(const AL::Pos&)), tcanvas, SLOT(setEndPos(const AL::Pos&)));
+ connect(song, SIGNAL(tempoChanged()), tcanvas, SLOT(tempoChanged()));
+
+ connect(tcanvas, SIGNAL(posChanged(int,const AL::Pos&)), song, SLOT(setPos(int,const AL::Pos&)));
+ connect(tcanvas, SIGNAL(tempoChanged(int)), SLOT(setTempo(int)));
+ connect(tools2, SIGNAL(toolChanged(int)), tcanvas, SLOT(setTool(int)));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+
+ resize(initWidth, initHeight);
+ }
+
+//---------------------------------------------------------
+// ~MasterEdit
+//---------------------------------------------------------
+
+MasterEdit::~MasterEdit()
+ {
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void MasterEdit::songChanged(int type)
+ {
+ if (type & SC_TEMPO) {
+ int tempo = AL::tempomap.tempo(song->cpos());
+ curTempo->setTempo(tempo);
+ }
+ if (type & SC_MASTER)
+ enableMasterAction->setChecked(song->masterFlag());
+ }
+
+//---------------------------------------------------------
+// _setRaster
+//---------------------------------------------------------
+
+void MasterEdit::_setRaster(int index)
+ {
+ setRaster(rasterTable[index]);
+ }
+
+//---------------------------------------------------------
+// setRaster
+//---------------------------------------------------------
+
+void MasterEdit::setRaster(int val)
+ {
+ _raster = val;
+ tcanvas->setRaster(val);
+ for (unsigned i = 0; i < sizeof(rasterTable)/sizeof(*rasterTable); ++i) {
+ if (rasterTable[i] == val) {
+ rasterLabel->setCurrentIndex(i);
+ return;
+ }
+ }
+ rasterLabel->setCurrentIndex(1);
+ }
+
+//---------------------------------------------------------
+// posChanged
+//---------------------------------------------------------
+
+void MasterEdit::posChanged(int idx, const AL::Pos& pos, bool)
+ {
+ if (idx == 0) {
+ unsigned val = pos.tick();
+ int tempo = AL::tempomap.tempo(val);
+ AL::TimeSignature sig = AL::sigmap.timesig(val);
+ curSig->blockSignals(true);
+
+ curTempo->setTempo(tempo);
+ curSig->setValue(sig);
+
+ curSig->blockSignals(false);
+ }
+ }
+
+//---------------------------------------------------------
+// setTempo
+//---------------------------------------------------------
+
+void MasterEdit::setTempo(int val)
+ {
+ if (val == -1)
+ tempo->setEnabled(false);
+ else {
+ tempo->setEnabled(true);
+ tempo->setValue(val);
+ }
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void MasterEdit::read(QDomNode node)
+ {
+ for (node = node.firstChild(); !node.isNull(); node = node.nextSibling())
+ AL::readProperties(this, node);
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void MasterEdit::write(Xml& xml) const
+ {
+ xml.tag(metaObject()->className());
+ xml.writeProperties(this);
+ xml.etag(metaObject()->className());
+ }
+
+//---------------------------------------------------------
+// tool
+//---------------------------------------------------------
+
+int MasterEdit::tool() const
+ {
+ return tcanvas->tool();
+ }
+
+//---------------------------------------------------------
+// setTool
+//---------------------------------------------------------
+
+void MasterEdit::setTool(int n)
+ {
+ tcanvas->setTool(n);
+ tools2->set(n);
+ }
+
+//---------------------------------------------------------
+// canvasPos
+//---------------------------------------------------------
+
+QPoint MasterEdit::canvasPos() const
+ {
+ return tcanvas->getWPos();
+ }
+
+//---------------------------------------------------------
+// setCanvasPos
+//---------------------------------------------------------
+
+void MasterEdit::setCanvasPos(const QPoint& p)
+ {
+ tcanvas->setWPos(p);
+ }
+
+//---------------------------------------------------------
+// xmag
+//---------------------------------------------------------
+
+double MasterEdit::xmag() const
+ {
+ return tcanvas->xmag();
+ }
+
+//---------------------------------------------------------
+// setXmag
+//---------------------------------------------------------
+
+void MasterEdit::setXmag(double val)
+ {
+ tcanvas->setMag(val, tcanvas->ymag());
+ }
+
+//---------------------------------------------------------
+// ymag
+//---------------------------------------------------------
+
+double MasterEdit::ymag() const
+ {
+ return tcanvas->ymag();
+ }
+
+//---------------------------------------------------------
+// setYmag
+//---------------------------------------------------------
+
+void MasterEdit::setYmag(double val)
+ {
+ tcanvas->setMag(tcanvas->xmag(), val);
+ }
+
+
diff --git a/muse/muse/master/masteredit.h b/muse/muse/master/masteredit.h
new file mode 100644
index 00000000..48ed5d36
--- /dev/null
+++ b/muse/muse/master/masteredit.h
@@ -0,0 +1,94 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: masteredit.h,v 1.20 2006/02/01 18:40:47 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MASTER_EDIT_H__
+#define __MASTER_EDIT_H__
+
+#include "editor.h"
+#include "widgets/noteinfo.h"
+#include "cobject.h"
+
+class MasterCanvas;
+class EditToolBar;
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+namespace Awl {
+ class TempoEdit;
+ class SigEdit;
+ class PosLabel;
+ class TempoLabel;
+ };
+using Awl::TempoEdit;
+using Awl::SigEdit;
+using Awl::PosLabel;
+using Awl::TempoLabel;
+
+//---------------------------------------------------------
+// MasterEdit
+//---------------------------------------------------------
+
+class MasterEdit : public Editor {
+ Q_OBJECT
+ Q_PROPERTY(int raster READ raster WRITE setRaster)
+ Q_PROPERTY(QPoint canvasPos READ canvasPos WRITE setCanvasPos)
+ Q_PROPERTY(int tool READ tool WRITE setTool)
+ Q_PROPERTY(double xmag READ xmag WRITE setXmag)
+ Q_PROPERTY(double ymag READ ymag WRITE setYmag)
+
+ EditToolBar* tools2;
+ QAction* enableMasterAction;
+ TempoEdit* curTempo;
+ SigEdit* curSig;
+ QComboBox* rasterLabel;
+ QToolBar* tools;
+ PosLabel* cursorPos;
+ TempoLabel* tempo;
+
+ int _raster;
+
+ MasterCanvas* canvas() { return (MasterCanvas*)tcanvas; }
+
+ private slots:
+ void _setRaster(int);
+ void posChanged(int idx, const AL::Pos& pos, bool);
+ void setTempo(int);
+ void songChanged(int);
+
+ signals:
+ void deleted(void*);
+
+ public:
+ MasterEdit();
+ ~MasterEdit();
+ void read(QDomNode);
+ void write(Xml&) const;
+
+ int raster() const { return _raster; }
+ void setRaster(int val);
+ QPoint canvasPos() const;
+ void setCanvasPos(const QPoint&);
+ double xmag() const;
+ void setXmag(double val);
+ double ymag() const;
+ void setYmag(double val);
+ int tool() const;
+ void setTool(int);
+
+ static int initRaster, initWidth, initHeight;
+ static double initXmag, initYmag;
+
+ static const int INIT_RASTER = 384;
+ static const int INIT_WIDTH = 650;
+ static const int INIT_HEIGHT = 450;
+ };
+
+#endif
+
diff --git a/muse/muse/midi.cpp b/muse/muse/midi.cpp
new file mode 100644
index 00000000..3dc4f5cf
--- /dev/null
+++ b/muse/muse/midi.cpp
@@ -0,0 +1,779 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "midi.h"
+#include "midiedit/drummap.h"
+#include "event.h"
+#include "globals.h"
+#include "midictrl.h"
+#include "midictrl.h"
+#include "audio.h"
+#include "driver/alsamidi.h"
+#include "wave.h"
+#include "synth.h"
+#include "sync.h"
+#include "midiseq.h"
+#include "gconfig.h"
+#include "ticksynth.h"
+#include "al/tempo.h"
+#include "al/sig.h"
+#include "part.h"
+
+extern void dump(const unsigned char* p, int n);
+
+unsigned const char gmOnMsg[] = { 0x7e, 0x7f, 0x09, 0x01 };
+unsigned const char gsOnMsg[] = { 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7f, 0x00, 0x41 };
+unsigned const char xgOnMsg[] = { 0x43, 0x10, 0x4c, 0x00, 0x00, 0x7e, 0x00 };
+unsigned const int gmOnMsgLen = sizeof(gmOnMsg);
+unsigned const int gsOnMsgLen = sizeof(gsOnMsg);
+unsigned const int xgOnMsgLen = sizeof(xgOnMsg);
+
+/*---------------------------------------------------------
+ * midi_meta_name
+ *---------------------------------------------------------*/
+
+QString midiMetaName(int meta)
+ {
+ const char* s = "";
+ switch (meta) {
+ case 0: s = "Sequence Number"; break;
+ case 1: s = "Text Event"; break;
+ case 2: s = "Copyright"; break;
+ case 3: s = "Sequence/Track Name"; break;
+ case 4: s = "Instrument Name"; break;
+ case 5: s = "Lyric"; break;
+ case 6: s = "Marker"; break;
+ case 7: s = "Cue Point"; break;
+ case 8:
+ case 9:
+ case 0x0a:
+ case 0x0b:
+ case 0x0c:
+ case 0x0d:
+ case 0x0e:
+ case 0x0f: s = "Text"; break;
+ case 0x20: s = "Channel Prefix"; break;
+ case 0x21: s = "Port Change"; break;
+ case 0x2f: s = "End of Track"; break;
+ case 0x51: s = "Set Tempo"; break;
+ case 0x54: s = "SMPTE Offset"; break;
+ case 0x58: s = "Time Signature"; break;
+ case 0x59: s = "Key Signature"; break;
+ case 0x74: s = "Sequencer-Specific1"; break;
+ case 0x7f: s = "Sequencer-Specific2"; break;
+ default:
+ break;
+ }
+ return QString(s);
+ }
+
+//---------------------------------------------------------
+// QString nameSysex
+//---------------------------------------------------------
+
+QString nameSysex(unsigned int len, const unsigned char* buf)
+ {
+ QString s;
+ switch(buf[0]) {
+ case 0x00:
+ if (buf[1] == 0 && buf[2] == 0x41)
+ s = "Microsoft";
+ break;
+ case 0x01: s = "Sequential Circuits: "; break;
+ case 0x02: s = "Big Briar: "; break;
+ case 0x03: s = "Octave / Plateau: "; break;
+ case 0x04: s = "Moog: "; break;
+ case 0x05: s = "Passport Designs: "; break;
+ case 0x06: s = "Lexicon: "; break;
+ case 0x07: s = "Kurzweil"; break;
+ case 0x08: s = "Fender"; break;
+ case 0x09: s = "Gulbransen"; break;
+ case 0x0a: s = "Delta Labas"; break;
+ case 0x0b: s = "Sound Comp."; break;
+ case 0x0c: s = "General Electro"; break;
+ case 0x0d: s = "Techmar"; break;
+ case 0x0e: s = "Matthews Research"; break;
+ case 0x10: s = "Oberheim"; break;
+ case 0x11: s = "PAIA: "; break;
+ case 0x12: s = "Simmons: "; break;
+ case 0x13: s = "DigiDesign"; break;
+ case 0x14: s = "Fairlight: "; break;
+ case 0x15: s = "JL Cooper"; break;
+ case 0x16: s = "Lowery"; break;
+ case 0x17: s = "Lin"; break;
+ case 0x18: s = "Emu"; break;
+ case 0x1b: s = "Peavy"; break;
+ case 0x20: s = "Bon Tempi: "; break;
+ case 0x21: s = "S.I.E.L: "; break;
+ case 0x23: s = "SyntheAxe: "; break;
+ case 0x24: s = "Hohner"; break;
+ case 0x25: s = "Crumar"; break;
+ case 0x26: s = "Solton"; break;
+ case 0x27: s = "Jellinghaus Ms"; break;
+ case 0x28: s = "CTS"; break;
+ case 0x29: s = "PPG"; break;
+ case 0x2f: s = "Elka"; break;
+ case 0x36: s = "Cheetah"; break;
+ case 0x3e: s = "Waldorf"; break;
+ case 0x40: s = "Kawai: "; break;
+ case 0x41: s = "Roland: "; break;
+ case 0x42: s = "Korg: "; break;
+ case 0x43: s = "Yamaha: "; break;
+ case 0x44: s = "Casio"; break;
+ case 0x45: s = "Akai"; break;
+ case 0x7c: s = "MusE Soft Synth"; break;
+ case 0x7d: s = "Educational Use"; break;
+ case 0x7e: s = "Universal: Non Real Time"; break;
+ case 0x7f: s = "Universal: Real Time"; break;
+ default: s = "??: "; break;
+ }
+ //
+ // following messages should not show up in event list
+ // they are filtered while importing midi files
+ //
+ if ((len == gmOnMsgLen) && memcmp(buf, gmOnMsg, gmOnMsgLen) == 0)
+ s += "GM-ON";
+ else if ((len == gsOnMsgLen) && memcmp(buf, gsOnMsg, gsOnMsgLen) == 0)
+ s += "GS-ON";
+ else if ((len == xgOnMsgLen) && memcmp(buf, xgOnMsg, xgOnMsgLen) == 0)
+ s += "XG-ON";
+ return s;
+ }
+
+//---------------------------------------------------------
+// buildMidiEventList
+// TODO:
+// parse data increment/decrement controller
+// NRPN/RPN fine/course data 7/14 Bit
+// must we set datah/datal to zero after change
+// of NRPN/RPN register?
+// generally: how to handle incomplete messages?
+//---------------------------------------------------------
+
+void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track,
+ int div, bool addSysexMeta)
+ {
+ QString tname;
+ int hbank = 0xff;
+ int lbank = 0xff;
+ int rpnh = -1;
+ int rpnl = -1;
+ int datah = 0;
+ int datal = 0;
+ int dataType = 0; // 0 : disabled, 0x20000 : rpn, 0x30000 : nrpn
+
+ int channel = 0;
+ MidiChannel* mc = track->channel();
+ if (mc)
+ channel = mc->channelNo();
+
+ EventList mel;
+ int metaChannel = -1;
+ for (iMPEvent i = el->begin(); i != el->end(); ++i) {
+ MidiEvent ev = *i;
+ if (ev.type() == ME_META) {
+ if (ev.dataA() == 0x20) {
+ metaChannel = ((char*)(ev.data()))[0];
+ }
+ if (metaChannel == channel) {
+ if (ev.dataA() == 0x4) {
+ tname = (char*)(ev.data());
+ }
+ }
+ }
+ if (!addSysexMeta && (ev.type() == ME_SYSEX || ev.type() == ME_META))
+ continue;
+ if (!(ev.type() == ME_SYSEX || ev.type() == ME_META || (ev.channel() == channel)))
+ continue;
+ int tick = ev.time();
+ Event e;
+ switch(ev.type()) {
+ case ME_NOTEON:
+ e.setType(Note);
+
+ if (mc && mc->useDrumMap()) {
+ int instr = mc->drumMap()->inmap(ev.dataA());
+ e.setPitch(instr);
+ }
+ else
+ e.setPitch(ev.dataA());
+
+ e.setVelo(ev.dataB());
+ e.setLenTick(0);
+ break;
+ case ME_NOTEOFF:
+ e.setType(Note);
+ if (mc && mc->useDrumMap()) {
+ int instr = mc->drumMap()->inmap(ev.dataA());
+ e.setPitch(instr);
+ }
+ else
+ e.setPitch(ev.dataA());
+ e.setVelo(0);
+ e.setVeloOff(ev.dataB());
+ e.setLenTick(0);
+ break;
+ case ME_POLYAFTER:
+ e.setType(PAfter);
+ e.setA(ev.dataA());
+ e.setB(ev.dataB());
+ break;
+ case ME_CONTROLLER:
+ {
+ int val = ev.dataB();
+ switch(ev.dataA()) {
+ case CTRL_HBANK:
+ hbank = val;
+ break;
+
+ case CTRL_LBANK:
+ lbank = val;
+ break;
+
+ case CTRL_HDATA:
+ datah = val;
+ // check if a CTRL_LDATA follows
+ // e.g. wie have a 14 bit controller:
+ {
+ iMPEvent ii = i;
+ ++ii;
+ bool found = false;
+ for (; ii != el->end(); ++ii) {
+ MidiEvent ev = *ii;
+ if (ev.type() == ME_CONTROLLER) {
+ if (ev.dataA() == CTRL_LDATA) {
+ // handle later
+ found = true;
+ }
+ break;
+ }
+ }
+ if (!found) {
+ if (rpnh == -1 || rpnl == -1) {
+ printf("parameter number not defined, data 0x%x\n", datah);
+ }
+ else {
+ int ctrl = dataType | (rpnh << 8) | rpnl;
+ e.setType(Controller);
+ e.setA(ctrl);
+ e.setB(datah);
+ }
+ }
+ }
+ break;
+
+ case CTRL_LDATA:
+ datal = val;
+
+ if (rpnh == -1 || rpnl == -1) {
+ printf("parameter number not defined, data 0x%x 0x%x, tick %d, channel %d\n",
+ datah, datal, tick, channel);
+ break;
+ }
+ // assume that the sequence is always
+ // CTRL_HDATA - CTRL_LDATA
+ // eg. that LDATA is always send last
+
+ e.setType(Controller);
+ // 14 Bit RPN/NRPN
+ e.setA((dataType+0x30000) | (rpnh << 8) | rpnl);
+ e.setB((datah << 7) | datal);
+ break;
+
+ case CTRL_HNRPN:
+ rpnh = val;
+ dataType = 0x30000;
+ break;
+
+ case CTRL_LNRPN:
+ rpnl = val;
+ dataType = 0x30000;
+ break;
+
+ case CTRL_HRPN:
+ rpnh = val;
+ dataType = 0x20000;
+ break;
+
+ case CTRL_LRPN:
+ rpnl = val;
+ dataType = 0x20000;
+ break;
+
+ default:
+ e.setType(Controller);
+ e.setA(ev.dataA());
+ e.setB(val);
+ break;
+ }
+ }
+ break;
+
+ case ME_PROGRAM:
+ e.setType(Controller);
+ e.setA(CTRL_PROGRAM);
+ e.setB((hbank << 16) | (lbank << 8) | ev.dataA());
+ break;
+
+ case ME_AFTERTOUCH:
+ e.setType(CAfter);
+ e.setA(ev.dataA());
+ break;
+
+ case ME_PITCHBEND:
+ e.setType(Controller);
+ e.setA(CTRL_PITCH);
+ e.setB(ev.dataA());
+ break;
+
+ case ME_SYSEX:
+ e.setType(Sysex);
+ e.setData(ev.data(), ev.len());
+ break;
+
+ case ME_META:
+ {
+ const unsigned char* data = ev.data();
+ switch (ev.dataA()) {
+ case 0x01: // Text
+ if (track->comment().isEmpty())
+ track->setComment(QString((const char*)data));
+ else
+ track->setComment(track->comment() + "\n" + QString((const char*)data));
+ break;
+ case 0x02: // Copyright
+ config.copyright = (char*)data;
+ break;
+ case 0x03: // Sequence-/TrackName
+ tname = (char*)data;
+ break;
+ case 0x6: // Marker
+ {
+ Pos pos((tick * config.division + div/2) / div, AL::TICKS);
+ song->addMarker(QString((const char*)(data)), pos);
+ }
+ break;
+ case 0x4: // Instrument Name
+ case 0x5: // Lyrics
+ case 0x8: // text
+ case 0x9:
+ case 0xa:
+ case 0x20: // channel prefix
+ case 0x21: // port change
+ break;
+
+ case 0x0f: // Track Comment
+ track->setComment(QString((char*)data));
+ break;
+
+ case 0x51: // Tempo
+ {
+ int tempo = data[2] + (data[1] << 8) + (data[0] <<16);
+ int ltick = (tick * config.division + div/2) / div;
+ AL::tempomap.addTempo(ltick, tempo);
+ }
+ break;
+
+ case 0x58: // Time Signature
+ {
+ int timesig_z = data[0];
+ int n = data[1];
+ int timesig_n = 1;
+ for (int i = 0; i < n; i++)
+ timesig_n *= 2;
+ int ltick = (tick * config.division + div/2) / div;
+ AL::sigmap.add(ltick, AL::TimeSignature(timesig_z, timesig_n));
+ }
+ break;
+
+ case 0x59: // Key Signature
+ printf("Meta: Key Signature %d %d\n", data[0], data[1]);
+ // track->scale.set(data[0]);
+ // track->scale.setMajorMinor(data[1]);
+ break;
+
+ case 0x7f: // Sequencer Specific
+ printf("Meta: Seq specific:len %d\n", ev.len());
+ break;
+
+ default:
+ printf("unknown Meta 0x%x %d\n", ev.dataA(), ev.dataA());
+ }
+ }
+ break;
+ } // switch(ev.type()
+ if (!e.empty()) {
+ e.setTick(tick);
+ mel.add(e);
+ }
+ } // i != el->end()
+
+ //---------------------------------------------------
+ // resolve NoteOff events
+ //---------------------------------------------------
+
+ for (iEvent i = mel.begin(); i != mel.end(); ++i) {
+ Event ev = i->second;
+ if (!ev.isNote())
+ continue;
+ if (ev.lenTick())
+ continue;
+// printf("%d note %d %d\n", ev.tick(), ev.pitch(), ev.velo());
+ if (ev.isNoteOff()) {
+ bool found = false;
+ iEvent k = i;
+// printf(" start with note off\n");
+ for (++k; k != mel.end(); ++k) {
+ Event event = k->second;
+ if (event.tick() > ev.tick())
+ break;
+ if (event.isNote() && event.velo() && event.pitch() == ev.pitch()) {
+ ev.setLenTick(1);
+ ev.setVelo(event.velo());
+ ev.setVeloOff(0);
+ found = true;
+// printf(" found on: %d\n", event.tick());
+ break;
+ }
+ }
+ if (!found) {
+ // maybe found note with velocity zero is really a
+ // note-on !
+ k = i;
+ found = true;
+ for (++k; k != mel.end(); ++k) {
+ Event event = k->second;
+ if (!event.isNote())
+ continue;
+ if (event.pitch() == ev.pitch()) {
+ if (event.velo() == 0) {
+ found = true;
+ int t = event.tick() - ev.tick();
+ ev.setLenTick(t);
+ ev.setVelo(1);
+ ev.setVeloOff(0);
+ mel.erase(k);
+ i = mel.begin();
+ }
+ break;
+ }
+ }
+ if (!found) {
+ printf("NOTE OFF without Note ON tick %d type %d %d %d\n",
+ ev.tick(), ev.type(), ev.pitch(), ev.velo());
+ }
+ else
+ continue;
+ }
+ else {
+ mel.erase(k);
+ i = mel.begin(); // DEBUG
+ continue;
+ }
+ }
+ iEvent k;
+ // ev is noteOn
+ for (k = mel.lower_bound(ev.tick()); k != mel.end(); ++k) {
+ Event event = k->second;
+// printf(" - %d(%d,%d)\n", event.tick(), event.pitch(), event.velo());
+ if (ev.isNoteOff(event)) {
+ int t = k->first - i->first;
+ if (t <= 0) {
+ if (debugMsg) {
+ printf("Note len is (%d-%d)=%d, set to 1\n",
+ k->first, i->first, k->first - i->first);
+ ev.dump();
+ event.dump();
+ }
+ t = 1;
+ }
+ ev.setLenTick(t);
+ ev.setVeloOff(event.veloOff());
+ break;
+ }
+ }
+ if (k == mel.end()) {
+ printf(" -no note-off! %d pitch %d velo %d\n",
+ ev.tick(), ev.pitch(), ev.velo());
+ //
+ // switch off at end of measure
+ //
+ int endTick = song->roundUpBar(ev.tick()+1);
+ ev.setLenTick(endTick-ev.tick());
+ }
+ else {
+ mel.erase(k);
+ i = mel.begin();
+ }
+ }
+
+ for (iEvent i = mel.begin(); i != mel.end(); ++i) {
+ Event ev = i->second;
+ if (ev.isNoteOff()) {
+ printf("+extra note-off! %d pitch %d velo %d\n",
+ i->first, ev.pitch(), ev.velo());
+// ev.dump();
+ continue;
+ }
+ int tick = (ev.tick() * config.division + div/2) / div;
+ if (ev.isNote()) {
+ int lenTick = (ev.lenTick() * config.division + div/2) / div;
+ ev.setLenTick(lenTick);
+ }
+ ev.setTick(tick);
+ if (ev.type() == Controller) {
+ int id = ev.dataA();
+ CVal val;
+ val.i = ev.dataB();
+
+ bool found = false;
+ for (iRoute i = track->outRoutes()->begin(); i != track->outRoutes()->end(); ++i) {
+ MidiChannel* ch = (MidiChannel*)(i->track);
+ Ctrl* c = ch->getController(id);
+ if (c) {
+ found = true;
+ c->add(tick, val);
+ }
+ }
+ if (!found) {
+ // if no managed controller, store as event
+ del->add(ev);
+ }
+ }
+ else
+ del->add(ev);
+ }
+ if (!tname.isEmpty())
+ track->setName(tname);
+ }
+
+//---------------------------------------------------------
+// initDevices
+// - called on seek to position 0
+// - called from midi pulldown menu
+//---------------------------------------------------------
+
+void Audio::initDevices()
+ {
+ //
+ // test for explicit instrument initialization
+ //
+ MidiOutPortList* mpl = song->midiOutPorts();
+ for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i) {
+ MidiOutPort* mp = *i;
+ MidiInstrument* instr = mp->instrument();
+ if (!instr)
+ continue;
+ EventList* events = instr->midiInit();
+ if (events->empty())
+ continue;
+ for (iEvent ie = events->begin(); ie != events->end(); ++ie) {
+ MidiEvent ev(0, 0, ie->second);
+ mp->playMidiEvent(&ev);
+ }
+ }
+ MidiChannelList* mcl = song->midiChannel();
+ for (iMidiChannel i = mcl->begin(); i != mcl->end(); ++i) {
+ MidiChannel* mc = *i;
+ if (mc->noInRoute())
+ continue;
+ if (mc->autoRead()) {
+ CtrlList* cl = mc->controller();
+ for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) {
+ ic->second->setCurVal(CTRL_VAL_UNKNOWN);
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// processMidi
+// - called from midiseq thread,
+// executed in audio thread
+// Process one time slice of midi events
+//---------------------------------------------------------
+
+void Audio::processMidi(unsigned frames)
+ {
+ MidiOutPortList* ol = song->midiOutPorts();
+ for (iMidiOutPort id = ol->begin(); id != ol->end(); ++id) {
+ (*id)->process(curTickPos, nextTickPos, _pos, frames);
+ }
+
+ MidiInPortList* il = song->midiInPorts();
+ for (iMidiInPort id = il->begin(); id != il->end(); ++id) {
+ MidiInPort* port = *id;
+
+ //
+ // process routing to synti
+ //
+ RouteList* rl = port->outRoutes();
+ for (iRoute i = rl->begin(); i != rl->end(); ++i) {
+ if (i->track->type() != Track::AUDIO_SOFTSYNTH)
+ continue;
+ SynthI* s = (SynthI*)(i->track);
+ MPEventList* dl = s->playEvents();
+ port->getEvents(0, 0, -1, dl);
+ }
+ port->afterProcess();
+ }
+ }
+
+//---------------------------------------------------------
+// process
+// "play" events for this process cycle
+// if (from != to) then transport state is "playing"
+//---------------------------------------------------------
+
+void MidiOutPort::process(unsigned from, unsigned to, const Pos& pos, unsigned frames)
+ {
+ //
+ // erase already played events:
+ //
+ _playEvents.erase(_playEvents.begin(), _nextPlayEvent);
+ playFifo();
+
+ if (mute())
+ return;
+
+ // collect port controller
+ if (from != to) {
+ CtrlList* cl = controller();
+ for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) {
+ Ctrl* c = ic->second;
+ iCtrlVal is = c->lower_bound(from);
+ iCtrlVal ie = c->lower_bound(to);
+ for (iCtrlVal ic = is; ic != ie; ++ic) {
+ unsigned frame = AL::tempomap.tick2frame(ic->first);
+ Event ev(Controller);
+ ev.setA(c->id());
+ ev.setB(ic->second.i);
+ _playEvents.add(MidiEvent(frame, -1, ev));
+ }
+ }
+ }
+
+ int portVelo = 0;
+ for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
+ MidiChannel* mc = channel(ch);
+
+ if (mc->mute() || mc->noInRoute())
+ continue;
+ // collect channel controller
+ if (from != to) {
+ CtrlList* cl = mc->controller();
+ for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) {
+ Ctrl* c = ic->second;
+ iCtrlVal is = c->lower_bound(from);
+ iCtrlVal ie = c->lower_bound(to);
+ for (; is != ie; ++is) {
+ unsigned frame = AL::tempomap.tick2frame(is->first);
+ Event ev(Controller);
+ ev.setA(c->id());
+ ev.setB(is->second.i);
+ _playEvents.add(MidiEvent(frame, ch, ev));
+ }
+ }
+ }
+
+ // Collect midievents from all input tracks for outport
+ RouteList* rl = mc->inRoutes();
+ for (iRoute i = rl->begin(); i != rl->end(); ++i) {
+ MidiTrackBase* track = (MidiTrackBase*)i->track;
+ if (track->isMute())
+ continue;
+ MPEventList el;
+ track->getEvents(from, to, 0, &el);
+ int velo = 0;
+ for (iMPEvent i = el.begin(); i != el.end(); ++i) {
+ MidiEvent ev = *i;
+ ev.setChannel(ch);
+ _playEvents.insert(ev);
+ if (ev.type() == ME_NOTEON)
+ velo += ev.dataB();
+ }
+ mc->addMidiMeter(velo);
+ portVelo += velo;
+ }
+ }
+ addMidiMeter(portVelo);
+ _nextPlayEvent = _playEvents.begin();
+
+ //
+ // route events to destination
+ //
+
+ if (_playEvents.size() > 0) {
+ //printf("_playEvents.size() == %d\n", _playEvents.size());
+ unsigned endFrame = pos.frame() + frames + audio->getFrameOffset();
+ for (iRoute r = _outRoutes.begin(); r != _outRoutes.end(); ++r) {
+ switch (r->type) {
+
+ //
+ // Send events to software synthesizer
+ //
+ case Route::SYNTIPORT: {
+ SynthI* s = (SynthI*)(r->track);
+ MPEventList* el = s->playEvents();
+ iMPEvent is = _playEvents.begin();
+ iMPEvent ie = _playEvents.end();
+
+ for (; is != ie; ++is) {
+ if ((from != to) && (is->time() >= endFrame)) {
+ break;
+ }
+
+ el->insert(*is);
+ _nextPlayEvent = is;
+ _nextPlayEvent++;
+ }
+ }
+ break;
+
+ //
+ // Send events to midi port
+ //
+ case Route::MIDIPORT: {
+ //playEventList();
+ for (iMPEvent ev = _playEvents.begin(); ev != _playEvents.end(); ev++) {
+ if ((from != to) && (ev->time() >= endFrame)) {
+ break;
+ }
+
+ midiDriver->putEvent(alsaPort, *ev);
+ _nextPlayEvent = ev;
+ _nextPlayEvent++;
+ }
+ }
+ break;
+
+
+ // Invalid routetypes to send midi events to - should not happen
+ case Route::AUDIOPORT:
+ case Route::TRACK:
+ default:
+ printf("Error - invalid routetype\n");
+ break;
+ }
+ }
+ }
+ }
+
diff --git a/muse/muse/midi.h b/muse/muse/midi.h
new file mode 100644
index 00000000..56a6ccfd
--- /dev/null
+++ b/muse/muse/midi.h
@@ -0,0 +1,60 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDI_H__
+#define __MIDI_H__
+
+enum {
+ ME_NOTEOFF = 0x80,
+ ME_NOTEON = 0x90,
+ ME_POLYAFTER = 0xa0,
+ ME_CONTROLLER = 0xb0,
+ ME_PROGRAM = 0xc0,
+ ME_AFTERTOUCH = 0xd0,
+ ME_PITCHBEND = 0xe0,
+ ME_SYSEX = 0xf0,
+ ME_META = 0xff,
+ ME_SONGPOS = 0xf2,
+ ME_CLOCK = 0xf8,
+ ME_START = 0xfa,
+ ME_CONTINUE = 0xfb,
+ ME_STOP = 0xfc,
+ };
+
+#define ME_TIMESIG 0x58
+
+extern unsigned const char gmOnMsg[];
+extern unsigned const char gsOnMsg[];
+extern unsigned const char xgOnMsg[];
+
+extern unsigned const int gmOnMsgLen;
+extern unsigned const int gsOnMsgLen;
+extern unsigned const int xgOnMsgLen;
+
+QString nameSysex(unsigned int len, const unsigned char* buf);
+QString midiMetaName(int);
+
+class EventList;
+class MPEventList;
+class MidiTrack;
+extern void buildMidiEventList(EventList* mel, const MPEventList* el, MidiTrack* track, int division, bool);
+
+#endif
+
diff --git a/muse/muse/midictrl.cpp b/muse/muse/midictrl.cpp
new file mode 100644
index 00000000..af3aacf4
--- /dev/null
+++ b/muse/muse/midictrl.cpp
@@ -0,0 +1,323 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "midictrl.h"
+#include "al/xml.h"
+
+static const char* ctrlName[] = {
+ "BankSelMSB", "Modulation", "BreathCtrl", "Control 3", "Foot Ctrl",
+ "Porta Time", "DataEntMSB", "MainVolume", "Balance", "Control 9",
+/*10*/ "Pan", "Expression", "Control 12", "Control 13", "Control 14",
+ "Control 15", "Gen.Purp.1", "Gen.Purp.2", "Gen.Purp.3", "Gen.Purp.4",
+/*20*/ "Control 20", "Control 21", "Control 22", "Control 23", "Control 24",
+ "Control 25", "Control 26", "Control 27", "Control 28", "Control 29",
+/*30*/ "Control 30", "Control 31", "BankSelLSB", "Modul. LSB", "BrthCt.LSB",
+ "Control 35", "FootCt.LSB", "Port.T LSB", "DataEntLSB", "MainVolLSB",
+ "BalanceLSB", "Control 41", "Pan LSB", "Expr. LSB", "Control 44",
+ "Control 45", "Control 46", "Control 47", "Gen.P.1LSB", "Gen.P.2LSB",
+/*50*/ "Gen.P.3LSB", "Gen.P.4LSB", "Control 52", "Control 53", "Control 54",
+ "Control 55", "Control 56", "Control 57", "Control 58", "Control 59",
+ "Control 60", "Control 61", "Control 62", "Control 63", "Sustain",
+ "Porta Ped", "Sostenuto", "Soft Pedal", "Control 68", "Hold 2",
+ "Control 70", "HarmonicCo", "ReleaseTime", "Attack Time", "Brightness",
+ "Control 75", "Control 76", "Control 77", "Control 78", "Control 79",
+ "Gen.Purp.5", "Gen.Purp.6", "Gen.Purp.7", "Gen.Purp.8", "Porta Ctrl",
+ "Control 85", "Control 86", "Control 87", "Control 88", "Control 89",
+ "Control 90", "Effect1Dep", "Effect2Dep", "Effect3Dep", "Effect4Dep",
+ "Phaser Dep", "Data Incr", "Data Decr", "NRPN LSB", "NRPN MSB",
+/*100*/ "RPN LSB", "RPN MSB", "Control102", "Control103", "Control104",
+ "Control105", "Control106", "Control107", "Control108", "Control109",
+ "Control110", "Control111", "Control112", "Control113", "Control114",
+ "Control115", "Control116", "Control117", "Control118", "Control119",
+ "AllSndOff", "Reset Ctrl", "Local Ctrl", "AllNoteOff", "OmniModOff",
+ "OmniModeOn", "MonoModeOn", "PolyModeOn"
+ };
+
+#if 0
+static const char* ctrl14Name[] = {
+ "BankSel", "Modulation", "BreathCtrl",
+ "Control 3", "Foot Ctrl", "Porta Time", "DataEntry",
+ "MainVolume", "Balance", "Control 9", "Pan",
+ "Expression", "Control 12", "Control 13", "Control 14",
+ "Control 15", "Gen.Purp.1", "Gen.Purp.2", "Gen.Purp.3",
+ "Gen.Purp.4", "Control 20", "Control 21", "Control 22",
+ "Control 23", "Control 24", "Control 25", "Control 26",
+ "Control 27", "Control 28", "Control 29", "Control 30",
+ "Control 31",
+ };
+#endif
+
+enum {
+ COL_NAME = 0, COL_TYPE,
+ COL_HNUM, COL_LNUM, COL_MIN, COL_MAX
+ };
+
+MidiControllerList defaultMidiController;
+//
+// some global controller which are always available:
+//
+MidiController veloCtrl("Velocity", CTRL_VELOCITY, 0, 127, 0);
+static MidiController pitchCtrl("PitchBend", CTRL_PITCH, -8192, +8191, 0);
+static MidiController programCtrl("Program", CTRL_PROGRAM, 0, 0xffffff, 0);
+static MidiController mastervolCtrl("MasterVolume", CTRL_MASTER_VOLUME, 0, 0x3fff, 0x3000);
+static MidiController volumeCtrl("MainVolume", CTRL_VOLUME, 0, 127, 100);
+static MidiController panCtrl("Pan", CTRL_PANPOT, 0, 127, 64);
+static MidiController reverbCtrl("ReverbSend", CTRL_REVERB_SEND, 0, 127, 0);
+static MidiController chorusCtrl("ChorusSend", CTRL_CHORUS_SEND, 0, 127, 0);
+static MidiController variationCtrl("VariationSend", CTRL_VARIATION_SEND,0, 127, 0);
+
+//---------------------------------------------------------
+// ctrlType2Int
+// int2ctrlType
+//---------------------------------------------------------
+
+static struct {
+ MidiController::ControllerType type;
+ QString name;
+ } ctrlTypes[] = {
+ { MidiController::Controller7, QString("Control7") },
+ { MidiController::Controller14, QString("Control14") },
+ { MidiController::RPN, QString("RPN") },
+ { MidiController::NRPN, QString("NRPN") },
+ { MidiController::Pitch, QString("Pitch") },
+ { MidiController::Program, QString("Program") },
+ { MidiController::RPN14, QString("RPN14") },
+ { MidiController::NRPN14, QString("NRPN14") },
+ { MidiController::Controller7, QString("Control") }, // alias
+ };
+
+//---------------------------------------------------------
+// ctrlType2Int
+//---------------------------------------------------------
+
+MidiController::ControllerType ctrlType2Int(const QString& s)
+ {
+ int n = sizeof(ctrlTypes)/sizeof(*ctrlTypes);
+ for (int i = 0; i < n; ++i) {
+ if (ctrlTypes[i].name == s)
+ return ctrlTypes[i].type;
+ }
+ return MidiController::ControllerType(0);
+ }
+
+//---------------------------------------------------------
+// int2ctrlType
+//---------------------------------------------------------
+
+const QString& int2ctrlType(int n)
+ {
+ static QString dontKnow("?T?");
+ int size = sizeof(ctrlTypes)/sizeof(*ctrlTypes);
+ for (int i = 0; i < size; ++i) {
+ if (ctrlTypes[i].type == n)
+ return ctrlTypes[i].name;
+ }
+ return dontKnow;
+ }
+
+//---------------------------------------------------------
+// initMidiController
+//---------------------------------------------------------
+
+void initMidiController()
+ {
+ static bool initialized = false;
+ if (initialized)
+ return;
+ defaultMidiController.push_back(&veloCtrl);
+ defaultMidiController.push_back(&pitchCtrl);
+ defaultMidiController.push_back(&programCtrl);
+ defaultMidiController.push_back(&mastervolCtrl);
+ defaultMidiController.push_back(&volumeCtrl);
+ defaultMidiController.push_back(&panCtrl);
+ defaultMidiController.push_back(&reverbCtrl);
+ defaultMidiController.push_back(&chorusCtrl);
+ defaultMidiController.push_back(&variationCtrl);
+ initialized = true;
+ }
+
+//---------------------------------------------------------
+// midiCtrlName
+//---------------------------------------------------------
+
+QString midiCtrlName(int ctrl)
+ {
+ if (ctrl < 0x10000)
+ return QString(ctrlName[ctrl]);
+ QString s("?N?");
+ switch(ctrl) {
+ case CTRL_PITCH:
+ s = "Pitch";
+ break;
+ case CTRL_PROGRAM:
+ s = "ProgramChange";
+ break;
+ case CTRL_VELOCITY:
+ s = "Velocity";
+ break;
+ case CTRL_MASTER_VOLUME:
+ s = "MasterVolume";
+ break;
+ default:
+ printf("midiCtrlName unknown %x\n", ctrl);
+ break;
+ }
+ return s;
+ }
+
+//---------------------------------------------------------
+// MidiController
+//---------------------------------------------------------
+
+MidiController::MidiController()
+ : _name(QString(QT_TR_NOOP("Velocity")))
+ {
+ _num = CTRL_VELOCITY;
+ _minVal = 0;
+ _maxVal = 127;
+ _initVal = 0;
+ }
+
+MidiController::MidiController(const QString& s, int n, int min, int max, int init)
+ : _name(s), _num(n), _minVal(min), _maxVal(max), _initVal(init)
+ {
+ }
+
+//---------------------------------------------------------
+// type
+//---------------------------------------------------------
+
+MidiController::ControllerType midiControllerType(int num)
+ {
+ if (num < 0x10000)
+ return MidiController::Controller7;
+ if (num < 0x20000)
+ return MidiController::Controller14;
+ if (num < 0x30000)
+ return MidiController::RPN;
+ if (num < 0x40000)
+ return MidiController::NRPN;
+ if (num == CTRL_PITCH)
+ return MidiController::Pitch;
+ if (num == CTRL_PROGRAM)
+ return MidiController::Program;
+ if (num == CTRL_VELOCITY || num == CTRL_SVELOCITY)
+ return MidiController::Velo;
+ if (num < 0x60000)
+ return MidiController::RPN14;
+ if (num < 0x70000)
+ return MidiController::NRPN14;
+ return MidiController::Controller7;
+ }
+
+//---------------------------------------------------------
+// MidiController::write
+//---------------------------------------------------------
+
+void MidiController::write(Xml& xml) const
+ {
+ ControllerType t = midiControllerType(_num);
+ QString type(int2ctrlType(t));
+
+ int h = (_num >> 8) & 0x7f;
+ int l = _num & 0x7f;
+
+ QString sl;
+ if (_num & 0xff == 0xff)
+ sl = "Pitch";
+ else
+ sl.setNum(l);
+
+ xml.tagE("Controller name=\"%s\" type=\"%s\" h=\"%d\" l=\"%s\" min=\"%d\" max\"%d\" init=\"%d\"",
+ _name.toLatin1().data(), type.toLatin1().data(), h, sl.toLatin1().data(), _minVal, _maxVal, _initVal);
+ }
+
+//---------------------------------------------------------
+// MidiController::read
+//---------------------------------------------------------
+
+void MidiController::read(QDomNode node)
+ {
+ ControllerType t = Controller7;
+ static const int NOT_SET = 0x100000;
+ int l = 0;
+
+ QDomElement e = node.toElement();
+ _name = e.attribute("name");
+ t = ctrlType2Int(e.attribute("type"));
+ int h = e.attribute("h","0").toInt(0,0);
+ QString s = e.attribute("l");
+ if (s == "pitch")
+ l = 0xff;
+ else
+ l = s.toInt(0,0);
+ _minVal = e.attribute("min", "0").toInt(0,0);
+ _maxVal = e.attribute("max", "0x100000").toInt(0,0);
+ _initVal = e.attribute("init", "-1").toInt(0,0);
+
+ _num = (h << 8) + l;
+ switch (t) {
+ case RPN:
+ if (_maxVal == NOT_SET)
+ _maxVal = 127;
+ _num |= 0x20000;
+ break;
+ case NRPN:
+ if (_maxVal == NOT_SET)
+ _maxVal = 127;
+ _num |= 0x30000;
+ break;
+ case Controller7:
+ if (_maxVal == NOT_SET)
+ _maxVal = 127;
+ break;
+ case Controller14:
+ _num |= 0x10000;
+ if (_maxVal == NOT_SET)
+ _maxVal = 127 * 127 * 127;
+ break;
+ case RPN14:
+ if (_maxVal == NOT_SET)
+ _maxVal = 127 * 127 * 127;
+ _num |= 0x50000;
+ break;
+ case NRPN14:
+ if (_maxVal == NOT_SET)
+ _maxVal = 127 * 127 * 127;
+ _num |= 0x60000;
+ break;
+ case Pitch:
+ if (_maxVal == NOT_SET)
+ _maxVal = 8191;
+ if (_minVal == NOT_SET)
+ _minVal = -8192;
+ _num = CTRL_PITCH;
+ break;
+ case Program:
+ if (_maxVal == NOT_SET)
+ _maxVal = 127 * 127 * 127;
+ _num = CTRL_PROGRAM;
+ break;
+ case Velo: // cannot happen
+ break;
+ }
+ return;
+ }
+
diff --git a/muse/muse/midictrl.h b/muse/muse/midictrl.h
new file mode 100644
index 00000000..bdeca0e4
--- /dev/null
+++ b/muse/muse/midictrl.h
@@ -0,0 +1,160 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDICTRL_H__
+#define __MIDICTRL_H__
+
+const int CTRL_HBANK = 0x00;
+const int CTRL_LBANK = 0x20;
+
+const int CTRL_HDATA = 0x06;
+const int CTRL_LDATA = 0x26;
+
+const int CTRL_HNRPN = 0x63;
+const int CTRL_LNRPN = 0x62;
+
+const int CTRL_HRPN = 0x65;
+const int CTRL_LRPN = 0x64;
+
+const int CTRL_MODULATION = 0x01;
+const int CTRL_PORTAMENTO_TIME = 0x05;
+const int CTRL_VOLUME = 0x07;
+const int CTRL_PANPOT = 0x0a;
+const int CTRL_EXPRESSION = 0x0b;
+const int CTRL_SUSTAIN = 0x40;
+const int CTRL_PORTAMENTO = 0x41;
+const int CTRL_SOSTENUTO = 0x42;
+const int CTRL_SOFT_PEDAL = 0x43;
+const int CTRL_HARMONIC_CONTENT = 0x47;
+const int CTRL_RELEASE_TIME = 0x48;
+const int CTRL_ATTACK_TIME = 0x49;
+
+const int CTRL_BRIGHTNESS = 0x4a;
+const int CTRL_PORTAMENTO_CONTROL = 0x54;
+const int CTRL_REVERB_SEND = 0x5b;
+const int CTRL_CHORUS_SEND = 0x5d;
+const int CTRL_VARIATION_SEND = 0x5e;
+
+const int CTRL_ALL_SOUNDS_OFF = 0x78; // 120
+const int CTRL_RESET_ALL_CTRL = 0x79; // 121
+const int CTRL_LOCAL_OFF = 0x7a; // 122
+
+// controller types 0x10000 - 0x1ffff are 14 bit controller with
+// 0x1xxyy
+// xx - MSB controller
+// yy - LSB controller
+
+// RPN - registered parameter numbers 0x20000 -
+// NRPN - non registered parameter numbers 0x30000 -
+
+// internal controller types:
+const int CTRL_PITCH = 0x40000;
+const int CTRL_PROGRAM = 0x40001;
+const int CTRL_VELOCITY = 0x40002;
+const int CTRL_MASTER_VOLUME = 0x40003;
+const int CTRL_OTHER = 0x40004;
+const int CTRL_SVELOCITY = 0x40005; // single velocity, used for drum editor
+ // to show only velocity for current instrument
+
+const int CTRL_VAL_UNKNOWN = -1; // used as unknown hwVal
+
+const int CTRL_RPN_OFFSET = 0x20000;
+const int CTRL_NRPN_OFFSET = 0x30000;
+const int CTRL_RPN14_OFFSET = 0x50000;
+const int CTRL_NRPN14_OFFSET = 0x60000;
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+//---------------------------------------------------------
+// MidiController
+//---------------------------------------------------------
+
+class MidiController {
+ public:
+ //
+ // mapping of midi controller types to
+ // controller number:
+ //
+ enum ControllerType {
+ Controller7, // num values from 0 - 0x7f
+ Controller14, // values from 0x10000 - 0x12fff
+ RPN, // registered parameter 0x20000 -
+ NRPN, // non registered parameter 0x30000 -
+ RPN14, // registered parameter 0x50000
+ NRPN14, // non registered parameter 0x60000 -
+ Pitch, // num value = CTRL_PITCH
+ Program, // num value = CTRL_PROGRAM
+ Velo // not assigned
+ };
+ private:
+ QString _name;
+ int _num; // Controller Number
+ int _minVal; // controller value range (used in gui)
+ int _maxVal;
+ int _initVal;
+
+ public:
+ MidiController();
+ MidiController(const QString& n, int num, int min, int max, int init);
+ const QString& name() const { return _name; }
+ int num() const { return _num; }
+ void setName(const QString& s) { _name = s; }
+ void setNum(int v) { _num = v; }
+ void write(Xml& xml) const;
+ void read(QDomNode);
+ int minVal() const { return _minVal; }
+ int maxVal() const { return _maxVal; }
+ int initVal() const { return _initVal; }
+ void setInitVal(int val) { _initVal = val; }
+ void setMinVal(int val) { _minVal = val; }
+ void setMaxVal(int val) { _maxVal = val; }
+ };
+
+//---------------------------------------------------------
+// MidiControllerList
+// this is a list of used midi controllers created
+// - excplicit by user
+// - implicit during import of a midi file
+//---------------------------------------------------------
+
+class MidiControllerList : public std::list<MidiController*> {
+ public:
+ MidiControllerList() {}
+ };
+
+typedef MidiControllerList::iterator iMidiController;
+typedef MidiControllerList::const_iterator ciMidiController;
+typedef MidiControllerList MidiControllerList;
+
+extern MidiControllerList defaultMidiController;
+extern void initMidiController();
+extern MidiController::ControllerType midiControllerType(int num);
+
+extern void configMidiController();
+extern const QString& int2ctrlType(int n);
+extern MidiController::ControllerType ctrlType2Int(const QString& s);
+extern QString midiCtrlName(int ctrl);
+extern MidiController veloCtrl;
+
+#endif
+
diff --git a/muse/muse/midiedit/.Ped-tk b/muse/muse/midiedit/.Ped-tk
new file mode 100644
index 00000000..a8efe94c
--- /dev/null
+++ b/muse/muse/midiedit/.Ped-tk
Binary files differ
diff --git a/muse/muse/midiedit/citem.cpp b/muse/muse/midiedit/citem.cpp
new file mode 100644
index 00000000..be987ddf
--- /dev/null
+++ b/muse/muse/midiedit/citem.cpp
@@ -0,0 +1,69 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: citem.cpp,v 1.5 2006/01/07 16:29:13 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "part.h"
+#include "citem.h"
+
+//---------------------------------------------------------
+// CItem
+//---------------------------------------------------------
+
+CItem::CItem()
+ {
+ isMoving = false;
+ }
+
+CItem::CItem(const Event& e, Part* p)
+ {
+ event = e;
+ part = p;
+ isMoving = false;
+ pos = e.pos() + *p;
+ }
+
+//---------------------------------------------------------
+// isSelected
+//---------------------------------------------------------
+
+bool CItem::isSelected() const
+ {
+ return event.empty() ? part->selected() : event.selected();
+ }
+
+//---------------------------------------------------------
+// setSelected
+//---------------------------------------------------------
+
+void CItem::setSelected(bool f)
+ {
+ event.empty() ? part->setSelected(f) : event.setSelected(f);
+ }
+
+//---------------------------------------------------------
+// CItemList
+//---------------------------------------------------------
+
+CItem* CItemList::find(const QPoint& pos) const
+ {
+ for (ciCItem i = begin(); i != end(); ++i) {
+ if (i->second->contains(pos))
+ return i->second;
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// CItemList
+//---------------------------------------------------------
+
+void CItemList::add(CItem* item)
+ {
+ std::multimap<int, CItem*, std::less<int> >::insert(
+ std::pair<const unsigned int, CItem*> (item->pos.tick(), item)
+ );
+ }
+
diff --git a/muse/muse/midiedit/citem.h b/muse/muse/midiedit/citem.h
new file mode 100644
index 00000000..f6880ac8
--- /dev/null
+++ b/muse/muse/midiedit/citem.h
@@ -0,0 +1,56 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: citem.h,v 1.6 2006/01/27 21:12:10 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CITEM_H__
+#define __CITEM_H__
+
+#include "al/pos.h"
+#include "event.h"
+
+class Part;
+
+//---------------------------------------------------------
+// CItem
+// Canvas Item
+//---------------------------------------------------------
+
+struct CItem {
+ Event event;
+ Part* part;
+
+ bool isMoving;
+ AL::Pos moving;
+ int my;
+
+ QRect bbox;
+ AL::Pos pos;
+
+ CItem();
+ CItem(const Event& e, Part* p);
+
+ bool isSelected() const;
+ void setSelected(bool f);
+ bool contains(const QPoint& p) const { return bbox.contains(p); }
+ bool intersects(const QRect& r) const { return r.intersects(bbox); }
+ };
+
+typedef std::multimap<int, CItem*, std::less<int> >::iterator iCItem;
+typedef std::multimap<int, CItem*, std::less<int> >::const_iterator ciCItem;
+
+//---------------------------------------------------------
+// CItemList
+// Canvas Item List
+//---------------------------------------------------------
+
+class CItemList: public std::multimap<int, CItem*, std::less<int> > {
+ public:
+ void add(CItem*);
+ CItem* find(const QPoint& pos) const;
+ };
+
+#endif
+
diff --git a/muse/muse/midiedit/cmd.h b/muse/muse/midiedit/cmd.h
new file mode 100644
index 00000000..c05480aa
--- /dev/null
+++ b/muse/muse/midiedit/cmd.h
@@ -0,0 +1,19 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: cmd.h,v 1.3 2005/12/12 22:03:44 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CMD_H__
+#define __CMD_H__
+
+enum {
+ MCMD_LEFT,
+ MCMD_RIGHT,
+ MCMD_INSERT,
+ MCMD_DELETE,
+ };
+
+#endif
+
diff --git a/muse/muse/midiedit/ctrledit.cpp b/muse/muse/midiedit/ctrledit.cpp
new file mode 100644
index 00000000..6822d2c6
--- /dev/null
+++ b/muse/muse/midiedit/ctrledit.cpp
@@ -0,0 +1,142 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrledit.cpp,v 1.11 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 1999-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "ctrledit.h"
+#include "midictrl.h"
+#include "widgets/simplebutton.h"
+#include "widgets/utils.h"
+#include "ctrl/configmidictrl.h"
+#include "widgets/tools.h"
+#include "miditrack.h"
+
+static Ctrl veloList(CTRL_VELOCITY, "velocity", Ctrl::DISCRETE |Ctrl::INT, 0.0, 127.0); // dummy
+static Ctrl sveloList(CTRL_SVELOCITY, "single velocity", Ctrl::DISCRETE |Ctrl::INT, 0.0, 127.0); // dummy
+
+//---------------------------------------------------------
+// CtrlEdit
+//---------------------------------------------------------
+
+CtrlEdit::CtrlEdit(QWidget* parent, TimeCanvas* timeCanvas, Track* t)
+ : QObject(parent), _track(t)
+ {
+ _ctrlTrack = t;
+ y = 0;
+ _height = 0;
+ _drawCtrlName = true;
+
+ _tc = timeCanvas;
+ _ctrl = &veloList;
+ ctrlId = CTRL_VELOCITY;
+
+ connect(_track, SIGNAL(controllerChanged(int)), SLOT(controllerListChanged(int)));
+
+ sel = new SimpleButton(QString("Sel"), parent);
+ sel->setAutoRaise(false);
+ minus = newMinusButton(parent);
+ minus->setAutoRaise(false);
+
+ ctrlList = new QMenu;
+ sel->setMenu(ctrlList);
+ sel->setPopupMode(QToolButton::InstantPopup);
+ connect(ctrlList, SIGNAL(aboutToShow()), SLOT(populateController()));
+ connect(ctrlList, SIGNAL(triggered(QAction*)), SLOT(changeController(QAction*)));
+ }
+
+//---------------------------------------------------------
+// CtrlEdit
+//---------------------------------------------------------
+
+CtrlEdit::~CtrlEdit()
+ {
+ delete sel;
+ delete minus;
+ }
+
+//---------------------------------------------------------
+// populateController
+//---------------------------------------------------------
+
+void CtrlEdit::populateController()
+ {
+ populateControllerMenu(ctrlList);
+ }
+
+//---------------------------------------------------------
+// changeController
+//---------------------------------------------------------
+
+void CtrlEdit::changeController(QAction* a)
+ {
+ if (a == 0)
+ return;
+ int id = a->data().toInt();
+
+ if (id == CTRL_VELOCITY) {
+ ctrlId = id;
+ _ctrl = &veloList;
+ _ctrlTrack = _track;
+ }
+ else if (id == CTRL_SVELOCITY) {
+ ctrlId = id;
+ _ctrl = &sveloList;
+ _ctrlTrack = _track;
+ }
+ else if (id == CTRL_OTHER) { // "other"
+ if (track()->type() == Track::MIDI) {
+ ConfigMidiCtrl* mce = new ConfigMidiCtrl((MidiTrack*)track());
+ mce->exec();
+ sel->showMenu();
+ }
+ else
+ printf("CtrlEdit::changeController: not impl.\n");
+ }
+ else {
+ ctrlId = id;
+ _ctrl = track()->getController(ctrlId);
+ if (_ctrl == 0 && _track->type() == Track::MIDI) {
+ MidiChannel* mc = ((MidiTrack*)_track)->channel();
+ _ctrl = mc->getController(ctrlId);
+ _ctrlTrack = mc;
+ }
+ else
+ _ctrlTrack = _track;
+ }
+ _tc->updateCanvasB();
+ }
+
+//---------------------------------------------------------
+// controllerListChanged
+//---------------------------------------------------------
+
+void CtrlEdit::controllerListChanged(int id)
+ {
+ if (id != ctrlId)
+ return;
+ tc()->widget()->update(tc()->rCanvasB);
+ }
+
+//---------------------------------------------------------
+// pixel2val
+//---------------------------------------------------------
+
+int CtrlEdit::pixel2val(int y) const
+ {
+ if (ctrl() == 0)
+ return 0;
+ CVal val = ctrl()->pixel2val(y, _height - splitWidth);
+ return val.i;
+ }
+
+//---------------------------------------------------------
+// setSinglePitch
+//---------------------------------------------------------
+
+void CtrlEdit::setSinglePitch(int val)
+ {
+ singlePitch = val;
+ }
+
diff --git a/muse/muse/midiedit/ctrledit.h b/muse/muse/midiedit/ctrledit.h
new file mode 100644
index 00000000..cf19093d
--- /dev/null
+++ b/muse/muse/midiedit/ctrledit.h
@@ -0,0 +1,64 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrledit.h,v 1.9 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CTRL_EDIT_H__
+#define __CTRL_EDIT_H__
+
+#include "ctrl/ctrleditor.h"
+#include "gui.h"
+
+class SimpleButton;
+class TimeCanvas;
+
+//---------------------------------------------------------
+// CtrlEdit
+//---------------------------------------------------------
+
+class CtrlEdit : public QObject, public CtrlEditor {
+ Q_OBJECT
+
+ Track* const _track;
+ Track* _ctrlTrack;
+ Ctrl* _ctrl;
+ TimeCanvas* _tc;
+ int _height;
+
+ virtual Ctrl* ctrl() const { return _ctrl; }
+ virtual TimeCanvas* tc() const { return _tc; }
+ virtual Track* track() const { return _track; }
+ virtual Track* ctrlTrack() const { return _ctrlTrack; }
+
+ public:
+ int ctrlId;
+ int y;
+ SimpleButton* minus;
+ SimpleButton* sel;
+ QMenu* ctrlList;
+ bool _drawCtrlName;
+
+ private slots:
+ void populateController();
+ void changeController(QAction*);
+ void controllerListChanged(int);
+
+ public:
+ CtrlEdit(QWidget*, TimeCanvas*, Track*);
+ ~CtrlEdit();
+ int pixel2val(int) const;
+ void setHeight(int val) { _height = val; }
+ int height() const { return _height; }
+ virtual int cheight() const { return _height - splitWidth; }
+ void setCtrl(Ctrl* c) { _ctrl = c; }
+ Ctrl* ctrl() { return _ctrl; }
+ void setSinglePitch(int);
+ };
+
+typedef std::vector<CtrlEdit*> CtrlEditList;
+typedef CtrlEditList::iterator iCtrlEdit;
+typedef CtrlEditList::const_iterator ciCtrlEdit;
+#endif
+
diff --git a/muse/muse/midiedit/dcanvas.cpp b/muse/muse/midiedit/dcanvas.cpp
new file mode 100644
index 00000000..96372d41
--- /dev/null
+++ b/muse/muse/midiedit/dcanvas.cpp
@@ -0,0 +1,718 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: dcanvas.cpp,v 1.60 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "dcanvas.h"
+#include "song.h"
+#include "midieditor.h"
+#include "drummap.h"
+#include "audio.h"
+#include "widgets/velocity.h"
+#include "gconfig.h"
+#include "part.h"
+
+#define CARET 12
+#define CARET2 6
+
+//---------------------------------------------------------
+// drumMap
+//---------------------------------------------------------
+
+DrumMap* DrumCanvas::drumMap() const
+ {
+ DrumMap* drumMap = track()->drumMap();
+ if (drumMap == 0)
+ drumMap = &noDrumMap;
+ return drumMap;
+ }
+
+//---------------------------------------------------------
+// y2pitch
+//---------------------------------------------------------
+
+int DrumCanvas::y2pitch(int y) const
+ {
+ return drumMap()->anote(EventCanvas::y2pitch(y));
+ }
+
+//---------------------------------------------------------
+// pitch2y
+//---------------------------------------------------------
+
+int DrumCanvas::pitch2y(int pitch) const
+ {
+ return EventCanvas::pitch2y(drumMap()->outmap(pitch));
+ }
+
+//---------------------------------------------------------
+// DrumCanvas
+//---------------------------------------------------------
+
+DrumCanvas::DrumCanvas(MidiEditor* pr)
+ : EventCanvas(pr, TIME_CANVAS_DRUMEDIT)
+ {
+ singlePitch = -1;
+ verticalScrollBar()->setSingleStep(drumHeight/2);
+ canvasTools = PointerTool | PencilTool | RubberTool;
+ songChanged(SC_TRACK_INSERTED);
+ connect(track(), SIGNAL(drumMapChanged()), widget(), SLOT(update()));
+ }
+
+//---------------------------------------------------------
+// addItem
+//---------------------------------------------------------
+
+void DrumCanvas::addItem(Part* part, const Event& event)
+ {
+ CItem* item = new CItem(event, part);
+ unsigned tick = event.tick() + part->tick();
+ item->pos = Pos(tick);
+ items.add(item);
+ }
+
+//---------------------------------------------------------
+// paint
+//---------------------------------------------------------
+
+void DrumCanvas::paint(QPainter& p, QRect r)
+ {
+ p.setPen(QPen(Qt::black, 0.0));
+
+ QPainterPath pa;
+ pa.moveTo(-CARET2, 0);
+ pa.lineTo(0, - CARET2);
+ pa.lineTo(CARET2, 0);
+ pa.lineTo(0, CARET2);
+ pa.closeSubpath();
+
+ Pos p1(pix2pos(r.x() - CARET2));
+ Pos p2(pix2pos(r.x() + r.width() + CARET2));
+ iCItem from(items.lower_bound(p1.tick()));
+ iCItem to(items.upper_bound(p2.tick()));
+
+ for (iCItem i = from; i != to; ++i) {
+ CItem* e = i->second;
+ int x = pos2pix(AL::Pos(i->first));
+ int y = pitch2y(e->event.pitch()) + drumHeight/2;
+ QPoint pt(x, y);
+ Event me(e->event);
+
+ DrumMapEntry* dm = drumMap()->entry(me.pitch()); //Get the drum item
+ QColor color;
+ int velo = me.velo();
+ if (velo < dm->lv1)
+ color.setRgb(240, 240, 255);
+ else if (velo < dm->lv2)
+ color.setRgb(200, 200, 255);
+ else if (velo < dm->lv3)
+ color.setRgb(170, 170, 255);
+ else
+ color.setRgb(0, 0, 255);
+
+ if (e->part != curPart)
+ p.setBrush(Qt::lightGray);
+ else if (e->isMoving) {
+ p.setBrush(Qt::gray);
+ p.translate(pt);
+ p.drawPath(pa);
+ p.translate(-pt);
+ p.setBrush(Qt::black);
+
+ int x = pos2pix(e->moving);
+ int y = e->my + drumHeight/2;
+ pt = QPoint(x, y);
+ }
+ else if (e->isSelected())
+ p.setBrush(Qt::black);
+ else
+ p.setBrush(color);
+ p.translate(pt);
+ p.drawPath(pa);
+ p.translate(-pt);
+ }
+
+ //---------------------------------------------------
+ // draw lasso
+ //---------------------------------------------------
+
+ if (drag == DRAG_LASSO) {
+ p.setPen(Qt::blue);
+ p.setBrush(Qt::NoBrush);
+ p.drawRect(lasso);
+ }
+ }
+
+//---------------------------------------------------------
+// moveItem
+//---------------------------------------------------------
+
+void DrumCanvas::moveItem(CItem* nevent, DragType dtype)
+ {
+ Part* part = nevent->part;
+ Event event = nevent->event;
+ int npitch = y2pitch(nevent->my);
+
+ Event newEvent = event.clone();
+ newEvent.setPitch(npitch);
+ newEvent.setPos(nevent->moving - *(nevent->part));
+ if (dtype == MOVE_COPY)
+ audio->msgAddEvent(newEvent, part, false);
+ else
+ audio->msgChangeEvent(event, newEvent, part, false);
+ }
+
+//---------------------------------------------------------
+// newItem
+//---------------------------------------------------------
+
+CItem* DrumCanvas::newItem(const QPoint& p, int state)
+ {
+ AL::Pos pos(pix2pos(p.x()));
+ pos.snap(raster());
+ if (pos < partPos1 || pos >= partPos2) {
+ return 0;
+ }
+
+ int pitch = y2pitch(p.y());
+ int instr = drumMap()->outmap(pitch);
+ DrumMapEntry* dm = drumMap()->entry(instr);
+ int velo = dm->lv4;
+ if (state == Qt::ShiftModifier)
+ velo = dm->lv3;
+ else if (state == Qt::ControlModifier)
+ velo = dm->lv2;
+ else if (state == (Qt::ControlModifier | Qt::ShiftModifier))
+ velo = dm->lv1;
+
+ Event e(Note);
+ e.setPos(pos - *curPart);
+ e.setPitch(drumMap()->anote(instr));
+ e.setVelo(velo);
+ e.setLenTick(dm->len);
+ return new CItem(e, curPart);
+ }
+
+//---------------------------------------------------------
+// resizeItem
+//---------------------------------------------------------
+
+void DrumCanvas::resizeItem(CItem* nevent, bool)
+ {
+ Event ev = nevent->event;
+ audio->msgDeleteEvent(ev, nevent->part);
+ }
+
+//---------------------------------------------------------
+// newItem
+//---------------------------------------------------------
+
+void DrumCanvas::newItem(CItem* nevent, bool noSnap)
+ {
+ Event event = nevent->event;
+ Pos pos(nevent->pos);
+ if (!noSnap)
+ pos.snap(editor->raster());
+ event.setPos(pos - *(nevent->part));
+ int npitch = event.pitch();
+ event.setPitch(npitch);
+
+ //
+ // check for existing event
+ // if found change command semantic from insert to delete
+ //
+ EventList* el = nevent->part->events();
+ iEvent lower = el->lower_bound(event.tick());
+ iEvent upper = el->upper_bound(event.tick());
+
+ for (iEvent i = lower; i != upper; ++i) {
+ Event ev = i->second;
+ if (ev.pitch() == npitch) {
+ audio->msgDeleteEvent(ev, nevent->part);
+ return;
+ }
+ }
+
+ audio->msgAddEvent(event, nevent->part);
+ }
+
+//---------------------------------------------------------
+// deleteItem
+//---------------------------------------------------------
+
+bool DrumCanvas::deleteItem(CItem* item)
+ {
+ Event ev = item->event;
+ audio->msgDeleteEvent(ev, item->part);
+ return false;
+ }
+
+//---------------------------------------------------------
+// cmd
+//---------------------------------------------------------
+
+void DrumCanvas::cmd(int cmd)
+ {
+ switch(cmd) {
+ case -1:
+ return;
+ case CMD_PASTE:
+ paste();
+ break;
+ case CMD_SELECT_ALL: // select all
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ if (!k->second->isSelected())
+ selectItem(k->second, true);
+ }
+ break;
+ case CMD_SELECT_NONE: // select none
+ deselectAll();
+ break;
+ case CMD_SELECT_INVERT: // invert selection
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ selectItem(k->second, !k->second->isSelected());
+ }
+ break;
+ case CMD_SELECT_ILOOP: // select inside loop
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ CItem* nevent = k->second;
+ Part* part = nevent->part;
+ Event event = nevent->event;
+ unsigned tick = event.tick() + part->tick();
+ if (tick < song->lpos() || tick >= song->rpos())
+ selectItem(k->second, false);
+ else
+ selectItem(k->second, true);
+ }
+ break;
+ case CMD_SELECT_OLOOP: // select outside loop
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ CItem* nevent = k->second;
+ Part* part = nevent->part;
+ Event event = nevent->event;
+ unsigned tick = event.tick() + part->tick();
+ if (tick < song->lpos() || tick >= song->rpos())
+ selectItem(k->second, true);
+ else
+ selectItem(k->second, false);
+ }
+ break;
+ case CMD_DEL:
+ if (selectionSize()) {
+ song->startUndo();
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ if (!i->second->isSelected())
+ continue;
+ Event ev = i->second->event;
+ audio->msgDeleteEvent(ev, i->second->part, false);
+ }
+ song->endUndo(SC_EVENT_REMOVED);
+ }
+ return;
+
+ case CMD_FIXED_LEN: //Set notes to the length specified in the drummap
+ if (!selectionSize())
+ break;
+ song->startUndo();
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ if (k->second->isSelected()) {
+ CItem* devent = k->second;
+ Event event = devent->event;
+ Event newEvent = event.clone();
+ newEvent.setLenTick(drumMap()->entry(event.pitch())->len);
+ audio->msgChangeEvent(event, newEvent, devent->part, false);
+ }
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ break;
+ case CMD_LEFT:
+ {
+ int frames = pos[0].tick() - editor->rasterStep(pos[0].tick());
+ if (frames < 0)
+ frames = 0;
+ Pos p(frames, AL::TICKS);
+ song->setPos(0, p, true, true, true);
+ }
+ break;
+ case CMD_RIGHT:
+ {
+ Pos p(pos[0].tick() + editor->rasterStep(pos[0].tick()), AL::TICKS);
+ song->setPos(0, p, true, true, true);
+ }
+ break;
+ case CMD_MODIFY_VELOCITY:
+ {
+ Velocity w(this);
+ w.setRange(editor->applyTo());
+ if (!w.exec())
+ break;
+ editor->setApplyTo(w.range());
+ int rate = w.rateVal();
+ int offset = w.offsetVal();
+
+ song->startUndo();
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ CItem* devent = k->second;
+ Event event = devent->event;
+ if (event.type() != Note)
+ continue;
+ unsigned tick = event.tick();
+ bool selected = devent->isSelected();
+ bool inLoop = (tick >= song->lpos()) && (tick < song->rpos());
+
+ int range = editor->applyTo();
+ if ((range == RANGE_ALL)
+ || (range == RANGE_SELECTED && selected)
+ || (range == RANGE_LOOPED && inLoop)
+ || (range == (RANGE_LOOPED | RANGE_SELECTED) && selected && inLoop)) {
+ int velo = event.velo();
+
+ //velo = rate ? (velo * 100) / rate : 64;
+ velo = (velo * rate) / 100;
+ velo += offset;
+
+ if (velo <= 0)
+ velo = 1;
+ if (velo > 127)
+ velo = 127;
+ if (event.velo() != velo) {
+ Event newEvent = event.clone();
+ newEvent.setVelo(velo);
+ audio->msgChangeEvent(event, newEvent, devent->part, false);
+ }
+ }
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ }
+ break;
+ }
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// paste
+// paste events
+//---------------------------------------------------------
+
+void DrumCanvas::paste()
+ {
+ QString stype("x-muse-eventlist");
+ QString s = QApplication::clipboard()->text(stype, QClipboard::Selection);
+ pasteAt(s, song->cpos());
+ }
+
+//---------------------------------------------------------
+// startDrag
+//---------------------------------------------------------
+
+void DrumCanvas::startDrag(CItem* /* item*/, bool copymode)
+ {
+#if 0 //TD
+ QMimeData* drag = getTextDrag();
+ if (drag) {
+ QApplication::clipboard()->setMimeData(drag, QClipboard::Selection);
+ if (copymode)
+ drag->dragCopy();
+ else
+ drag->dragMove();
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// dragEnterEvent
+//---------------------------------------------------------
+
+void DrumCanvas::dragEnterEvent(QDragEnterEvent* event)
+ {
+//TD event->accept(Q3TextDrag::canDecode(event));
+ }
+
+//---------------------------------------------------------
+// dragMoveEvent
+//---------------------------------------------------------
+
+void DrumCanvas::dragMoveEvent(QDragMoveEvent*)
+ {
+//TD printf("drag move %x\n", this);
+ }
+
+//---------------------------------------------------------
+// dragLeaveEvent
+//---------------------------------------------------------
+
+void DrumCanvas::dragLeaveEvent(QDragLeaveEvent*)
+ {
+//TD printf("drag leave\n");
+ }
+
+//---------------------------------------------------------
+// dropEvent
+//---------------------------------------------------------
+
+void DrumCanvas::viewDropEvent(QDropEvent* event)
+ {
+#if 0 //TD
+ QString text;
+ if (event->source() == this) {
+ printf("local DROP\n");
+ return;
+ }
+ if (Q3TextDrag::decode(event, text)) {
+// printf("drop <%s>\n", text.ascii());
+ int x = editor->rasterVal(event->pos().x());
+ if (x < 0)
+ x = 0;
+ pasteAt(text, x);
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// keyPressed
+//---------------------------------------------------------
+
+void DrumCanvas::keyPressed(int index, bool)
+ {
+ int pitch = drumMap()->entry(index)->anote;
+
+ // play note:
+ MidiEvent e(0, 0, 0x90, pitch, 127);
+ track()->playMidiEvent(&e);
+ }
+
+//---------------------------------------------------------
+// keyReleased
+//---------------------------------------------------------
+
+void DrumCanvas::keyReleased(int index, bool)
+ {
+ int pitch = drumMap()->entry(index)->anote;
+
+ // release note:
+ MidiEvent e(0, 0, 0x90, pitch, 0);
+ track()->playMidiEvent(&e);
+ }
+
+//---------------------------------------------------------
+// resizeEvent
+//---------------------------------------------------------
+
+void DrumCanvas::resizeEvent(QResizeEvent* ev)
+ {
+ if (ev->size().width() != ev->oldSize().width())
+ emit newWidth(ev->size().width());
+ EventCanvas::resizeEvent(ev);
+ }
+
+
+//---------------------------------------------------------
+// modifySelected
+//---------------------------------------------------------
+
+void DrumCanvas::modifySelected(NoteInfo::ValType type, int delta)
+ {
+ audio->msgIdle(true);
+ song->startUndo();
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ if (!(i->second->isSelected()))
+ continue;
+ CItem* e = i->second;
+ Event event = e->event;
+ if (event.type() != Note)
+ continue;
+
+ Part* part = e->part;
+ Event newEvent = event.clone();
+
+ switch (type) {
+ case NoteInfo::VAL_TIME:
+ {
+ int newTime = event.tick() + delta;
+ if (newTime < 0)
+ newTime = 0;
+ newEvent.setTick(newTime);
+ }
+ break;
+ case NoteInfo::VAL_LEN:
+ /*
+ {
+ int len = event.lenTick() + delta;
+ if (len < 1)
+ len = 1;
+ newEvent.setLenTick(len);
+ }
+ */
+ printf("DrumCanvas::modifySelected - NoteInfo::VAL_LEN not implemented\n");
+ break;
+ case NoteInfo::VAL_VELON:
+ /*
+ {
+ int velo = event->velo() + delta;
+ if (velo > 127)
+ velo = 127;
+ else if (velo < 0)
+ velo = 0;
+ newEvent.setVelo(velo);
+ }
+ */
+ printf("DrumCanvas::modifySelected - NoteInfo::VAL_VELON not implemented\n");
+ break;
+ case NoteInfo::VAL_VELOFF:
+ /*
+ {
+ int velo = event.veloOff() + delta;
+ if (velo > 127)
+ velo = 127;
+ else if (velo < 0)
+ velo = 0;
+ newEvent.setVeloOff(velo);
+ }
+ */
+ printf("DrumCanvas::modifySelected - NoteInfo::VAL_VELOFF not implemented\n");
+ break;
+ case NoteInfo::VAL_PITCH:
+ {
+ int pitch = event.pitch() - delta; // Reversing order since the drumlist is displayed in increasing order
+ if (pitch > 127)
+ pitch = 127;
+ else if (pitch < 0)
+ pitch = 0;
+ newEvent.setPitch(pitch);
+ }
+ break;
+ }
+ song->changeEvent(event, newEvent, part);
+ song->undoOp(UndoOp::ModifyEvent, newEvent, event, part);
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ audio->msgIdle(false);
+ }
+
+//---------------------------------------------------------
+// paintDrumList
+//---------------------------------------------------------
+
+void DrumCanvas::paintDrumList(QPainter& p, QRect r)
+ {
+ p.fillRect(r, QColor(0xe0, 0xe0, 0xe0));
+ paintVLine(p, 0, rPanelB.y(), rPanelA.x() + rPanelA.width());
+ p.setFont(*config.fonts[1]);
+
+ int yoff = wpos.y() - rPanelA.y();
+ int i = (r.y() + yoff) / drumHeight;
+ if (i < 0)
+ i = 0;
+ if (i > 127)
+ return;
+ int y = i * drumHeight - yoff;
+ DrumMap* dm = drumMap();
+
+ for (; i < 128; ++i, y += drumHeight) {
+ if (y > r.y() + r.height())
+ break;
+ QRect r(3, y, drumWidth-4, drumHeight);
+ if (dm->anote(i) == curPitch || dm->anote(i) == singlePitch)
+ p.fillRect(0, y, drumWidth-4, drumHeight, Qt::white);
+ DrumMapEntry* de = dm->entry(i);
+ if (de->mute) {
+ p.setPen(Qt::red);
+ p.drawText(r, Qt::AlignVCenter | Qt::AlignLeft, "m");
+ p.setPen(Qt::darkGray);
+ p.drawText(r.adjusted(16, 0, 0, 0), Qt::AlignVCenter | Qt::AlignLeft, de->name);
+ }
+ else {
+ p.setPen(Qt::black);
+ p.drawText(r, Qt::AlignVCenter | Qt::AlignLeft, "m");
+ p.drawText(r.adjusted(16, 0, 0, 0), Qt::AlignVCenter | Qt::AlignLeft, de->name);
+ }
+ if (i != 0)
+ p.drawLine(0, y, drumWidth-3, y);
+ }
+ p.setPen(QPen(Qt::darkGray, 1));
+ p.drawLine(17, r.y(), 17, r.y() + r.height());
+ }
+
+//---------------------------------------------------------
+// searchItem
+//---------------------------------------------------------
+
+CItem* DrumCanvas::searchItem(const QPoint& p) const
+ {
+ Pos p1(pix2pos(p.x() - CARET2));
+ Pos p2(pix2pos(p.x() + CARET2));
+
+ ciCItem from(items.lower_bound(p1.tick()));
+ ciCItem to(items.upper_bound(p2.tick()));
+
+ int pitch = y2pitch(p.y());
+ for (ciCItem i = from; i != to; ++i) {
+ if (pitch == i->second->event.pitch())
+ return i->second;
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// selectLasso
+//---------------------------------------------------------
+
+void DrumCanvas::selectLasso(bool toggle)
+ {
+ Pos p1(pix2pos(lasso.x()));
+ Pos p2(pix2pos(lasso.x() + lasso.width()));
+
+ iCItem from(items.lower_bound(p1.tick()));
+ iCItem to(items.upper_bound(p2.tick()));
+ int y = lasso.y();
+ int pitch1 = y2pitch(y);
+ int pitch2 = y2pitch(y + lasso.height());
+
+ int n = 0;
+ for (iCItem i = from; i != to; ++i) {
+ CItem* item = i->second;
+ int pitch = item->event.pitch();
+ if (pitch >= pitch1 && pitch <= pitch2) {
+ selectItem(item, !(toggle && item->isSelected()));
+ ++n;
+ }
+ }
+ if (n) {
+ updateSelection();
+ widget()->update();
+ }
+ }
+
+//---------------------------------------------------------
+// mousePress
+//---------------------------------------------------------
+
+void DrumCanvas::mousePress(QMouseEvent* ev)
+ {
+ QPoint r(ev->pos());
+ int pitch = y2pitch(r.y() - rPanelA.y() - wpos.y());
+ if (r.x() < 20) {
+ //
+ // "mute" button click
+ //
+ DrumMap* dm = drumMap();
+ int idx = dm->outmap(pitch);
+ DrumMapEntry* de = dm->entry(idx);
+ de->mute = !de->mute;
+ widget()->update(rPanelA);
+ return;
+ }
+ else if (r.x() < rCanvasA.x()) {
+ if (pitch != singlePitch) {
+ singlePitch = pitch;
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i)
+ (*i)->setSinglePitch(singlePitch);
+ widget()->update();
+ }
+ }
+ EventCanvas::mousePress(ev);
+ }
+
+
diff --git a/muse/muse/midiedit/dcanvas.h b/muse/muse/midiedit/dcanvas.h
new file mode 100644
index 00000000..9eb7b626
--- /dev/null
+++ b/muse/muse/midiedit/dcanvas.h
@@ -0,0 +1,71 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: dcanvas.h,v 1.30 2006/01/27 21:12:10 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __DCANVAS_H__
+#define __DCANVAS_H__
+
+#include "ecanvas.h"
+
+class MidiEditor;
+class DrumMap;
+
+//---------------------------------------------------------
+// DrumCanvas
+//---------------------------------------------------------
+
+class DrumCanvas : public EventCanvas {
+ Q_OBJECT
+
+ int singlePitch;
+ virtual void mousePress(QMouseEvent*);
+ virtual void paint(QPainter&, QRect);
+ virtual void addItem(Part* part, const Event& event);
+ virtual void moveItem(CItem*, DragType);
+ virtual CItem* newItem(const QPoint&, int);
+ virtual void resizeItem(CItem*, bool);
+ virtual void newItem(CItem*, bool);
+ virtual bool deleteItem(CItem*);
+ virtual CItem* searchItem(const QPoint& p) const;
+
+ void copy();
+ void paste();
+ void startDrag(CItem*, bool copymode);
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dragMoveEvent(QDragMoveEvent*);
+ void dragLeaveEvent(QDragLeaveEvent*);
+ void viewDropEvent(QDropEvent* event);
+ virtual void resizeEvent(QResizeEvent*);
+ virtual void paintDrumList(QPainter&, QRect);
+ virtual void selectLasso(bool toggle);
+
+ DrumMap* drumMap() const;
+
+ protected:
+ virtual int y2pitch(int y) const;
+ virtual int pitch2y(int pitch) const;
+
+ signals:
+ void newWidth(int);
+
+ public slots:
+ void keyPressed(int, bool);
+ void keyReleased(int, bool);
+
+ public:
+ enum {
+ CMD_CUT, CMD_COPY, CMD_PASTE,
+ CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT,
+ CMD_SELECT_ILOOP, CMD_SELECT_OLOOP, CMD_DEL,
+ CMD_FIXED_LEN, CMD_RIGHT, CMD_LEFT, CMD_MODIFY_VELOCITY,
+ CMD_COMMANDS
+ };
+ DrumCanvas(MidiEditor*);
+ void cmd(int);
+ virtual void modifySelected(NoteInfo::ValType type, int delta);
+ };
+#endif
+
diff --git a/muse/muse/midiedit/drumedit.cpp b/muse/muse/midiedit/drumedit.cpp
new file mode 100644
index 00000000..d371fcbc
--- /dev/null
+++ b/muse/muse/midiedit/drumedit.cpp
@@ -0,0 +1,496 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: drumedit.cpp,v 1.82 2006/02/10 16:40:59 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "drumedit.h"
+#include "icons.h"
+#include "drummap.h"
+#include "audio.h"
+#include "shortcuts.h"
+#include "part.h"
+#include "muse.h"
+#include "song.h"
+
+static const int drumeditTools = PointerTool | PencilTool | RubberTool | DrawTool;
+
+int DrumEdit::initWidth = DrumEdit::INIT_WIDTH;
+int DrumEdit::initHeight = DrumEdit::INIT_HEIGHT;
+int DrumEdit::initRaster = DrumEdit::INIT_RASTER;
+int DrumEdit::initQuant = DrumEdit::INIT_QUANT;
+bool DrumEdit::initFollow = DrumEdit::INIT_FOLLOW;
+bool DrumEdit::initSpeaker = DrumEdit::INIT_SPEAKER;
+bool DrumEdit::initMidiin = DrumEdit::INIT_MIDIIN;
+double DrumEdit::initXmag = 0.08; // DrumEdit::INIT_XMAG;
+int DrumEdit::initApplyTo = DrumEdit::INIT_APPLY_TO;
+
+//---------------------------------------------------------
+// DrumEdit
+//---------------------------------------------------------
+
+DrumEdit::DrumEdit(PartList* pl, bool init)
+ : MidiEditor(pl)
+ {
+ _applyTo = initApplyTo;
+
+ deltaMode = false;
+ drumMap = &noDrumMap;
+
+ //---------Pulldown Menu----------------------------
+ QMenuBar* mb = menuBar();
+
+ menuEdit->addSeparator();
+
+ cmdActions[DrumCanvas::CMD_DEL] = menuEdit->addAction(tr("Delete Events"));
+ cmdActions[DrumCanvas::CMD_DEL]->setData(DrumCanvas::CMD_DEL);
+ cmdActions[DrumCanvas::CMD_DEL]->setIcon(*deleteIcon);
+
+ // Functions
+ menuFunctions = mb->addMenu(tr("&Functions"));
+ cmdActions[DrumCanvas::CMD_FIXED_LEN] = menuFunctions->addAction(tr("Set fixed length"));
+ cmdActions[DrumCanvas::CMD_FIXED_LEN]->setData(DrumCanvas::CMD_FIXED_LEN);
+
+ cmdActions[DrumCanvas::CMD_MODIFY_VELOCITY] = menuFunctions->addAction(tr("Modify Velocity..."));
+ cmdActions[DrumCanvas::CMD_MODIFY_VELOCITY]->setData(DrumCanvas::CMD_MODIFY_VELOCITY);
+
+ menuSelect = menuEdit->addMenu(tr("&Select"));
+ menuSelect->setIcon(QIcon(*selectIcon));
+
+ cmdActions[DrumCanvas::CMD_SELECT_ALL] = menuSelect->addAction(tr("Select All"));
+ cmdActions[DrumCanvas::CMD_SELECT_ALL]->setIcon(QIcon(*select_allIcon));
+ cmdActions[DrumCanvas::CMD_SELECT_ALL]->setData(DrumCanvas::CMD_SELECT_ALL);
+
+ cmdActions[DrumCanvas::CMD_SELECT_NONE] = menuSelect->addAction(tr("Select None"));
+ cmdActions[DrumCanvas::CMD_SELECT_NONE]->setIcon(QIcon(*select_deselect_allIcon));
+ cmdActions[DrumCanvas::CMD_SELECT_NONE]->setData(DrumCanvas::CMD_SELECT_NONE);
+
+ cmdActions[DrumCanvas::CMD_SELECT_INVERT] = menuSelect->addAction(tr("Invert"));
+ cmdActions[DrumCanvas::CMD_SELECT_INVERT]->setIcon(QIcon(*select_invert_selectionIcon));
+ cmdActions[DrumCanvas::CMD_SELECT_INVERT]->setData(DrumCanvas::CMD_SELECT_INVERT);
+
+ menuSelect->addSeparator();
+
+ cmdActions[DrumCanvas::CMD_SELECT_ILOOP] = menuSelect->addAction(tr("Inside Loop"));
+ cmdActions[DrumCanvas::CMD_SELECT_ILOOP]->setIcon(QIcon(*select_inside_loopIcon));
+ cmdActions[DrumCanvas::CMD_SELECT_ILOOP]->setData(DrumCanvas::CMD_SELECT_ILOOP);
+
+ cmdActions[DrumCanvas::CMD_SELECT_OLOOP] = menuSelect->addAction(tr("Outside Loop"));
+ cmdActions[DrumCanvas::CMD_SELECT_OLOOP]->setIcon(QIcon(*select_outside_loopIcon));
+ cmdActions[DrumCanvas::CMD_SELECT_OLOOP]->setData(DrumCanvas::CMD_SELECT_OLOOP);
+
+ connect(menuSelect, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+ connect(menuFunctions, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+
+ //---------------------------------------------------
+ // Toolbars
+ //---------------------------------------------------
+
+ tools = addToolBar(tr("Drum Tools"));
+ tools->addAction(undoAction);
+ tools->addAction(redoAction);
+ tools->addSeparator();
+
+ tools->addAction(stepRecAction);
+ stepRecAction->setChecked(INIT_SREC);
+
+ tools->addAction(midiInAction);
+ midiInAction->setChecked(INIT_MIDIIN);
+
+ tools->addAction(speaker);
+ speaker->setChecked(INIT_SPEAKER);
+
+ tools->addAction(followSongAction);
+ followSongAction->setChecked(INIT_FOLLOW);
+
+ tools2 = new EditToolBar(this, drumeditTools);
+ addToolBar(tools2);
+
+ QToolBar* transport = addToolBar(tr("Transport"));
+ muse->setupTransportToolbar(transport);
+
+ // dont´t show pitch value in toolbar
+ addToolBarBreak();
+ toolbar = new Toolbar1(initRaster, initQuant, false);
+ addToolBar(toolbar);
+ addToolBarBreak();
+ info = new NoteInfo(this);
+ addToolBar(info);
+
+ tcanvas = new DrumCanvas(this);
+ setCentralWidget(tcanvas);
+ tcanvas->setCornerWidget(new QSizeGrip(tcanvas));
+ tcanvas->setFollow(INIT_FOLLOW);
+
+ connect(song, SIGNAL(posChanged(int,const AL::Pos&,bool)), canvas(), SLOT(setLocatorPos(int,const AL::Pos&,bool)));
+ connect(canvas(), SIGNAL(posChanged(int,const AL::Pos&)), SLOT(setPos(int,const AL::Pos&)));
+
+ connect(canvas(), SIGNAL(toolChanged(int)), tools2, SLOT(set(int)));
+ connect(tools2, SIGNAL(toolChanged(int)), canvas(), SLOT(setTool(int)));
+
+ connect(canvas(), SIGNAL(selectionChanged(int, Event&, Part*)),
+ SLOT(setSelection(int, Event&, Part*)));
+
+ setWindowTitle(canvas()->getCaption());
+
+ int st, e;
+ canvas()->range(&st, &e);
+ e += AL::sigmap.ticksMeasure(e); // show one more measure
+ canvas()->setTimeRange(st, e);
+
+ // connect toolbar
+ connect(canvas(), SIGNAL(cursorPos(const AL::Pos&,bool)), toolbar, SLOT(setTime(const AL::Pos&,bool)));
+ connect(toolbar, SIGNAL(quantChanged(int)), SLOT(setQuant(int)));
+ connect(toolbar, SIGNAL(rasterChanged(int)), SLOT(setRaster(int)));
+ connect(toolbar, SIGNAL(soloChanged(bool)), SLOT(soloChanged(bool)));
+ connect(toolbar, SIGNAL(toChanged(int)), SLOT(setApplyTo(int)));
+
+ connect(info, SIGNAL(valueChanged(NoteInfo::ValType, int)), SLOT(noteinfoChanged(NoteInfo::ValType, int)));
+
+ clipboardChanged(); // enable/disable "Paste"
+ selectionChanged(); // enable/disable "Copy" & "Paste"
+
+ initShortcuts();
+ canvas()->selectFirst();
+
+ //
+ // install misc shortcuts
+ //
+ QShortcut* sc;
+ sc = new QShortcut(Qt::Key_Escape, this);
+ sc->setContext(Qt::WindowShortcut);
+ connect(sc, SIGNAL(activated()), SLOT(close()));
+
+ connect(song, SIGNAL(songChanged(int)), canvas(), SLOT(songChanged(int)));
+ connect(followSongAction, SIGNAL(toggled(bool)), canvas(), SLOT(setFollow(bool)));
+ canvas()->selectFirst();
+
+ Part* part = canvas()->part();
+
+ setRaster(part->raster() != -1 ? part->raster() : initRaster);
+ setQuant(part->quant() != -1 ? part->quant() : initQuant);
+ setXmag(part->xmag() != -1.0 ? part->xmag() : initXmag);
+
+ if (init)
+ initFromPart();
+ else
+ resize(initWidth, initHeight);
+ }
+
+//---------------------------------------------------------
+// ~DrumEdit
+//---------------------------------------------------------
+
+DrumEdit::~DrumEdit()
+ {
+ }
+
+//---------------------------------------------------------
+// closeEvent
+//---------------------------------------------------------
+
+void DrumEdit::closeEvent(QCloseEvent* e)
+ {
+ MidiEditor::closeEvent(e);
+ }
+
+//---------------------------------------------------------
+// setSelection
+// update Info Line
+//---------------------------------------------------------
+
+void DrumEdit::setSelection(int tick, Event& e, Part* p)
+ {
+ int selections = canvas()->selectionSize();
+ selEvent = e;
+ selPart = p;
+
+ if (selections > 1) {
+ info->setEnabled(true);
+ info->setDeltaMode(true);
+ if (!deltaMode) {
+ deltaMode = true;
+ info->setValues(0, 0, 0, 0, 0);
+ tickOffset = 0;
+ lenOffset = 0;
+ pitchOffset = 0;
+ veloOnOffset = 0;
+ veloOffOffset = 0;
+ }
+ }
+ else if (selections == 1) {
+ deltaMode = false;
+ info->setEnabled(true);
+ info->setDeltaMode(false);
+ info->setValues(tick,
+ selEvent.lenTick(),
+ selEvent.pitch(),
+ selEvent.velo(),
+ selEvent.veloOff());
+ }
+ else {
+ deltaMode = false;
+ info->setEnabled(false);
+ }
+ selectionChanged();
+ }
+
+//---------------------------------------------------------
+// soloChanged
+//---------------------------------------------------------
+
+void DrumEdit::soloChanged(bool flag)
+ {
+ song->setSolo(canvas()->track(), flag);
+ }
+
+//---------------------------------------------------------
+// edit currently selected Event
+//---------------------------------------------------------
+
+void DrumEdit::noteinfoChanged(NoteInfo::ValType type, int val)
+ {
+ int selections = canvas()->selectionSize();
+
+ if (selections == 0) {
+ printf("noteinfoChanged while nothing selected\n");
+ }
+ else if (selections == 1) {
+ Event event = selEvent.clone();
+ switch(type) {
+ case NoteInfo::VAL_TIME:
+ event.setTick(val - selPart->tick());
+ break;
+ case NoteInfo::VAL_LEN:
+ event.setLenTick(val);
+ break;
+ case NoteInfo::VAL_VELON:
+ event.setVelo(val);
+ break;
+ case NoteInfo::VAL_VELOFF:
+ event.setVeloOff(val);
+ break;
+ case NoteInfo::VAL_PITCH:
+ event.setPitch(val);
+ break;
+ }
+ audio->msgChangeEvent(selEvent, event, selPart);
+ }
+ else {
+ // multiple events are selected; treat noteinfo values
+ // as offsets to event values
+
+ int delta = 0;
+ switch (type) {
+ case NoteInfo::VAL_TIME:
+ delta = val - tickOffset;
+ tickOffset = val;
+ break;
+ case NoteInfo::VAL_LEN:
+ delta = val - lenOffset;
+ lenOffset = val;
+ break;
+ case NoteInfo::VAL_VELON:
+ delta = val - veloOnOffset;
+ veloOnOffset = val;
+ break;
+ case NoteInfo::VAL_VELOFF:
+ delta = val - veloOffOffset;
+ veloOffOffset = val;
+ break;
+ case NoteInfo::VAL_PITCH:
+ delta = val - pitchOffset;
+ pitchOffset = val;
+ break;
+ }
+ if (delta)
+ canvas()->modifySelected(type, delta);
+ }
+ }
+
+//---------------------------------------------------------
+// cmd
+// pulldown menu commands
+//---------------------------------------------------------
+
+void DrumEdit::cmd(QAction* a)
+ {
+ canvas()->cmd(a->data().toInt());
+ }
+
+//---------------------------------------------------------
+// configChanged
+//---------------------------------------------------------
+
+void DrumEdit::configChanged()
+ {
+ initShortcuts();
+ }
+
+static int rasterTable[] = {
+ //-9----8- 7 6 5 4 3(1/4) 2 1
+ 4, 8, 16, 32, 64, 128, 256, 512, 1024, // triple
+ 6, 12, 24, 48, 96, 192, 384, 768, 1536,
+ 9, 18, 36, 72, 144, 288, 576, 1152, 2304 // dot
+ };
+
+//---------------------------------------------------------
+// keyPressEvent
+//---------------------------------------------------------
+
+void DrumEdit::keyPressEvent(QKeyEvent* event)
+ {
+ DrumCanvas* dc = canvas();
+ int index = 0;
+ int n = sizeof(rasterTable);
+ for (; index < n; ++index)
+ if (rasterTable[index] == raster())
+ break;
+ int off = (index / 9) * 9;
+ index = index % 9;
+ int val;
+ int key = event->key();
+
+ if (event->modifiers() & Qt::ShiftModifier)
+ key += Qt::SHIFT;
+ if (event->modifiers() & Qt::AltModifier)
+ key += Qt::ALT;
+ if (event->modifiers() & Qt::ControlModifier)
+ key+= Qt::CTRL;
+
+ if (key == shortcuts[SHRT_POS_INC].key) {
+ dc->cmd(DrumCanvas::CMD_RIGHT);
+ return;
+ }
+ else if (key == shortcuts[SHRT_POS_DEC].key) {
+ dc->cmd(DrumCanvas::CMD_LEFT);
+ return;
+ }
+
+ else if (key == shortcuts[SHRT_TOOL_POINTER].key) {
+ tools2->set(PointerTool);
+ return;
+ }
+ else if (key == shortcuts[SHRT_TOOL_PENCIL].key) {
+ tools2->set(PencilTool);
+ return;
+ }
+ else if (key == shortcuts[SHRT_TOOL_RUBBER].key) {
+ tools2->set(RubberTool);
+ return;
+ }
+
+ /*
+ else if (key == shortcuts[SHRT_INSERT_AT_LOCATION].key) {
+ pc->pianoCmd(CMD_INSERT);
+ return;
+ }
+ */
+ else if (key == shortcuts[SHRT_SET_QUANT_1].key)
+ val = rasterTable[8 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_2].key)
+ val = rasterTable[7 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_3].key)
+ val = rasterTable[6 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_4].key)
+ val = rasterTable[5 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_5].key)
+ val = rasterTable[4 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_6].key)
+ val = rasterTable[3 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_7].key)
+ val = rasterTable[2 + off];
+ else if (key == shortcuts[SHRT_TOGGLE_TRIOL].key)
+ val = rasterTable[index + ((off == 0) ? 9 : 0)];
+ /*
+ else if (key == shortcuts[SHRT_EVENT_COLOR].key) {
+ if (colorMode == 0)
+ colorMode = 1;
+ else if (colorMode == 1)
+ colorMode = 2;
+ else
+ colorMode = 0;
+ setEventColorMode(colorMode);
+ return;
+ }*/
+ else if (key == shortcuts[SHRT_TOGGLE_PUNCT].key)
+ val = rasterTable[index + ((off == 18) ? 9 : 18)];
+
+ else if (key == shortcuts[SHRT_TOGGLE_PUNCT2].key) {//CDW
+ if ((off == 18) && (index > 2)) {
+ val = rasterTable[index + 9 - 1];
+ }
+ else if ((off == 9) && (index < 8)) {
+ val = rasterTable[index + 18 + 1];
+ }
+ else
+ return;
+ }
+ else { //Default:
+ event->ignore();
+ return;
+ }
+ setQuant(val);
+ setRaster(val);
+ toolbar->setQuant(quant());
+ toolbar->setRaster(raster());
+ }
+
+//---------------------------------------------------------
+// initShortcuts
+//---------------------------------------------------------
+
+void DrumEdit::initShortcuts()
+ {
+ cutAction->setShortcut(shortcuts[SHRT_CUT].key);
+ copyAction->setShortcut(shortcuts[SHRT_COPY].key);
+ pasteAction->setShortcut(shortcuts[SHRT_PASTE].key);
+
+ cmdActions[DrumCanvas::CMD_DEL]->setShortcut(shortcuts[SHRT_DELETE].key);
+ cmdActions[DrumCanvas::CMD_FIXED_LEN]->setShortcut(shortcuts[SHRT_FIXED_LEN].key);
+ cmdActions[DrumCanvas::CMD_MODIFY_VELOCITY]->setShortcut(shortcuts[SHRT_MODIFY_VELOCITY].key);
+ cmdActions[DrumCanvas::CMD_SELECT_ALL]->setShortcut(shortcuts[SHRT_SELECT_ALL].key);
+ cmdActions[DrumCanvas::CMD_SELECT_NONE]->setShortcut(shortcuts[SHRT_SELECT_NONE].key);
+ cmdActions[DrumCanvas::CMD_SELECT_INVERT]->setShortcut(shortcuts[SHRT_SELECT_INVERT].key);
+ cmdActions[DrumCanvas::CMD_SELECT_ILOOP]->setShortcut(shortcuts[SHRT_SELECT_ILOOP].key);
+ cmdActions[DrumCanvas::CMD_SELECT_OLOOP]->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key);
+ }
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+
+void DrumEdit::writeConfiguration(Xml& xml)
+ {
+ xml.tag("DrumEdit");
+ if (DrumEdit::initWidth != DrumEdit::INIT_WIDTH)
+ xml.intTag("width", DrumEdit::initWidth);
+ if (DrumEdit::initHeight != DrumEdit::INIT_HEIGHT)
+ xml.intTag("height", DrumEdit::initHeight);
+ if (DrumEdit::initRaster != DrumEdit::INIT_RASTER)
+ xml.intTag("raster", DrumEdit::initRaster);
+ xml.etag("DrumEdit");
+ }
+
+//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+void DrumEdit::readConfiguration(QDomNode node)
+ {
+ for (node = node.firstChild(); !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ int i = e.text().toInt();
+ if (tag == "width")
+ DrumEdit::initWidth = i;
+ else if (tag == "height")
+ DrumEdit::initHeight = i;
+ else if (tag == "raster")
+ DrumEdit::initRaster = i;
+ else
+ printf("MusE:DrumEdit: unknown tag %s\n", tag.toLatin1().data());
+ }
+ }
+
diff --git a/muse/muse/midiedit/drumedit.h b/muse/muse/midiedit/drumedit.h
new file mode 100644
index 00000000..b5abef4e
--- /dev/null
+++ b/muse/muse/midiedit/drumedit.h
@@ -0,0 +1,84 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: drumedit.h,v 1.40 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __DRUM_EDIT_H__
+#define __DRUM_EDIT_H__
+
+#include "midieditor.h"
+#include "dcanvas.h"
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+
+class PartList;
+class Part;
+class DrumMap;
+
+//---------------------------------------------------------
+// DrumEdit
+//---------------------------------------------------------
+
+class DrumEdit : public MidiEditor {
+ Q_OBJECT
+
+ Event selEvent;
+ DrumMap* drumMap;
+ int selTick;
+ QMenu *menuFunctions, *menuSelect;
+
+ int tickOffset;
+ int lenOffset;
+ int pitchOffset;
+ int veloOnOffset;
+ int veloOffOffset;
+ bool deltaMode;
+
+ QAction* cmdActions[DrumCanvas::CMD_COMMANDS];
+
+ void initShortcuts();
+ virtual void closeEvent(QCloseEvent*);
+ QWidget* genToolbar(QWidget* parent);
+ virtual void keyPressEvent(QKeyEvent*);
+ DrumCanvas* canvas() { return (DrumCanvas*)tcanvas; }
+
+ private slots:
+ void noteinfoChanged(NoteInfo::ValType type, int val);
+ virtual void cmd(QAction*);
+ void configChanged();
+
+ public slots:
+ void setSelection(int, Event&, Part*);
+ void soloChanged(bool); // called by Solo button
+
+ public:
+ DrumEdit(PartList*, bool);
+ ~DrumEdit();
+
+ static int initRaster, initQuant, initWidth, initHeight;
+ static bool initFollow, initSpeaker, initMidiin;
+ static int initApplyTo;
+ static double initXmag;
+
+ static void readConfiguration(QDomNode);
+ static void writeConfiguration(Xml&);
+
+ static const int INIT_WIDTH = 650;
+ static const int INIT_HEIGHT = 450;
+ static const int INIT_RASTER = 384 / 4;
+ static const int INIT_QUANT = 384 / 4;
+ static const bool INIT_FOLLOW = false;
+ static const bool INIT_SPEAKER = true;
+ static const bool INIT_SREC = false;
+ static const bool INIT_MIDIIN = false;
+ static const double INIT_XMAG = 0.08;
+ static const int INIT_APPLY_TO = 0;
+ };
+
+#endif
diff --git a/muse/muse/midiedit/drummap.cpp b/muse/muse/midiedit/drummap.cpp
new file mode 100644
index 00000000..b4f589e9
--- /dev/null
+++ b/muse/muse/midiedit/drummap.cpp
@@ -0,0 +1,194 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: drummap.cpp,v 1.11 2006/01/27 10:35:26 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "drummap.h"
+#include "al/xml.h"
+
+static const int DEFAULT_QUANT = 16;
+static const int DEFAULT_LEN = 32;
+static const int DEFAULT_CHANNEL = -1;
+static const int DEFAULT_LV1 = 70;
+static const int DEFAULT_LV2 = 90;
+static const int DEFAULT_LV3 = 110;
+static const int DEFAULT_LV4 = 127;
+
+//---------------------------------------------------------
+// GM default drum map
+//---------------------------------------------------------
+
+DrumMap gmDrumMap("generic");
+DrumMap noDrumMap("no-map");
+
+//---------------------------------------------------------
+// DrumMap
+//---------------------------------------------------------
+
+DrumMap::DrumMap(const QString& s)
+ {
+ _name = s;
+ for (int i = 0; i < DRUM_MAPSIZE; ++i) {
+ map[i].name = "?";
+ map[i].enote = i;
+ map[i].anote = i;
+ map[i].quant = DEFAULT_QUANT;
+ map[i].len = DEFAULT_LEN;
+ map[i].channel = DEFAULT_CHANNEL;
+ map[i].lv1 = DEFAULT_LV1;
+ map[i].lv2 = DEFAULT_LV2;
+ map[i].lv3 = DEFAULT_LV3;
+ map[i].lv4 = DEFAULT_LV4;
+ map[i].mute = false;
+ }
+ init();
+ }
+
+//---------------------------------------------------------
+// initGm
+//---------------------------------------------------------
+
+void DrumMap::initGm()
+ {
+ static const char* gmNames[] = {
+ "Acoustic Bass Drum", "Bass Drum 1", "Side Stick", "Acoustic Snare",
+ "Hand Clap", "Electric Snare", "Low Floor Tom", "Closed Hi-Hat",
+ "High Floor Tom", "Pedal Hi-Hat", "Low Tom", "Open Hi-Hat", "Low-Mid Tom",
+ "Hi-Mid Tom", "Crash Cymbal 1", "High Tom", "Ride Cymbal 1",
+ "Chinese Cymbal", "Ride Bell", "Tambourine", "Splash Cymbal",
+ "Cowbell", "Crash Cymbal 2", "Vibraslap", "Ride Cymbal 2",
+ "Hi Bongo", "Low Bongo", "Mute Hi Conga", "Open Hi Conga",
+ "Low Conga", "High Timbale", "Low Timbale", "High Agogo",
+ "Low Agogo", "Cabasa", "Maracas", "Short Whistle",
+ "Long Whistle", "Short Guiro", "Long Guiro", "Claves",
+ "Hi Wood Block", "Low Wood Block", "Mute Cuica",
+ "Open Cuica", "Mute Triangle", "Open Triangle", 0
+ };
+ init();
+ int idx = 0;
+ const char** p = &gmNames[0];
+ int val = 35;
+ for (; *p; ++p, ++val, ++idx) {
+ map[idx].name = *p;
+ map[idx].enote = val;
+ map[idx].anote = val;
+ _inmap[int(map[idx].enote)] = idx;
+ _outmap[int(map[idx].anote)] = idx;
+ }
+ }
+
+//---------------------------------------------------------
+// init
+// populate Inmap and Outmap
+//---------------------------------------------------------
+
+void DrumMap::init()
+ {
+ memset(_inmap, 0, sizeof(_inmap));
+ memset(_outmap, 0, sizeof(_outmap));
+ for (int i = 0; i < DRUM_MAPSIZE; ++i) {
+ _inmap[int(map[i].enote)] = i;
+ _outmap[int(map[i].anote)] = i;
+ }
+ }
+
+//---------------------------------------------------------
+// writeDrumMap
+//---------------------------------------------------------
+
+void DrumMap::write(Xml& xml)
+ {
+ xml.tag("drummap");
+ for (int i = 0; i < DRUM_MAPSIZE; ++i) {
+ DrumMapEntry* dm = &map[i];
+ xml.tag("entry");
+ xml.strTag("name", dm->name);
+ if (dm->quant != DEFAULT_QUANT)
+ xml.intTag("quant", dm->quant);
+ if (dm->len != DEFAULT_LEN)
+ xml.intTag("len", dm->len);
+ if (dm->channel != DEFAULT_CHANNEL)
+ xml.intTag("channel", dm->channel);
+ if (dm->lv1 != DEFAULT_LV1)
+ xml.intTag("lv1", dm->lv1);
+ if (dm->lv2 != DEFAULT_LV2)
+ xml.intTag("lv2", dm->lv2);
+ if (dm->lv2 != DEFAULT_LV3)
+ xml.intTag("lv3", dm->lv3);
+ if (dm->lv4 != DEFAULT_LV4)
+ xml.intTag("lv4", dm->lv4);
+ xml.intTag("enote", dm->enote);
+ xml.intTag("anote", dm->anote);
+ xml.etag("entry");
+ }
+ xml.etag("drummap");
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void DrumMapEntry::read(QDomNode n)
+ {
+ for (QDomNode node = n.firstChild(); !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ QString s(e.text());
+ if (tag == "name")
+ name = s;
+ else if (tag == "quant")
+ quant = s.toInt();
+ else if (tag == "len")
+ len = s.toInt();
+ else if (tag == "channel")
+ channel = s.toInt();
+ else if (tag == "lv1")
+ lv1 = s.toInt();
+ else if (tag == "lv2")
+ lv2 = s.toInt();
+ else if (tag == "lv3")
+ lv3 = s.toInt();
+ else if (tag == "lv4")
+ lv4 = s.toInt();
+ else if (tag == "enote")
+ enote = s.toInt();
+ else if (tag == "anote")
+ anote = s.toInt();
+ else if (tag == "mute")
+ mute = s.toInt();
+ else {
+ printf("read Drummap Entry: unknown tag %s\n", tag.toLatin1().data());
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// readDrummap
+//---------------------------------------------------------
+
+void DrumMap::read(QDomNode node)
+ {
+ init();
+ int idx = 0;
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+
+ if (tag == "entry") {
+ QDomNode entryNode = node.firstChild();
+ map[idx].read(entryNode);
+ _inmap[int(map[idx].enote)] = idx;
+ _outmap[int(map[idx].anote)] = idx;
+ ++idx;
+ }
+ else {
+ printf("read Drummap: unknown tag %s\n", tag.toLatin1().data());
+ break;
+ }
+ }
+ }
+
diff --git a/muse/muse/midiedit/drummap.h b/muse/muse/midiedit/drummap.h
new file mode 100644
index 00000000..5fa41662
--- /dev/null
+++ b/muse/muse/midiedit/drummap.h
@@ -0,0 +1,68 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: drummap.h,v 1.10 2006/01/27 21:12:10 wschweer Exp $
+//
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __DRUMMAP_H__
+#define __DRUMMAP_H__
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+const int DRUM_MAPSIZE = 128;
+
+//---------------------------------------------------------
+// DrumMapEntry
+//---------------------------------------------------------
+
+struct DrumMapEntry {
+ QString name;
+ int quant;
+ int len; // len of event in ticks
+ int channel; // midi channel
+ char lv1, lv2, lv3, lv4; // velocities
+ char enote, anote; // input note - output note
+ bool mute;
+
+ void read(QDomNode node);
+ };
+
+//---------------------------------------------------------
+// DrumMap
+//---------------------------------------------------------
+
+class DrumMap {
+ QString _name;
+ DrumMapEntry map[DRUM_MAPSIZE];
+ char _outmap[DRUM_MAPSIZE];
+ char _inmap[DRUM_MAPSIZE];
+
+ public:
+ DrumMap(const QString& name);
+ void init();
+ void write(Xml& xml);
+ void read(QDomNode);
+ void initGm();
+ DrumMapEntry* entry(int idx) { return &map[idx]; }
+ QString name() const { return _name; }
+ QString name(int i) const { return map[i].name; }
+ int quant(int i) const { return map[i].quant; }
+ int len(int i) const { return map[i].len; }
+ int channel(int i) const { return map[i].channel; }
+ int enote(int i) const { return map[i].enote; }
+ int anote(int i) const { return map[i].anote; }
+ bool mute(int i) const { return map[i].mute; }
+ int inmap(int i) const { return _inmap[i]; }
+ int outmap(int i) const { return _outmap[i]; }
+ };
+
+extern DrumMap gmDrumMap;
+extern DrumMap noDrumMap;
+
+#endif
+
diff --git a/muse/muse/midiedit/ecanvas.cpp b/muse/muse/midiedit/ecanvas.cpp
new file mode 100644
index 00000000..a33fa99f
--- /dev/null
+++ b/muse/muse/midiedit/ecanvas.cpp
@@ -0,0 +1,1546 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ecanvas.cpp,v 1.65 2006/03/24 21:41:16 a-lin Exp $
+// (C) Copyright 2001-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "midieditor.h"
+#include "ecanvas.h"
+#include "song.h"
+#include "shortcuts.h"
+#include "widgets/simplebutton.h"
+#include "widgets/tools.h"
+#include "widgets/utils.h"
+#include "part.h"
+#include "audio.h"
+#include "midi.h"
+
+//---------------------------------------------------------
+// EventCanvas
+//---------------------------------------------------------
+
+EventCanvas::EventCanvas(MidiEditor* pr, TimeCanvasType type)
+ : TimeCanvas(type)
+ {
+ setMarkerList(song->marker());
+ canvasTools = 0;
+ curItem = 0;
+ curSplitter = -1;
+ dragSplitter = false;
+
+ keyDown = -1;
+
+ itemPopupMenu = 0;
+ canvasPopupMenu = 0;
+ drag = DRAG_OFF;
+
+ editor = pr;
+ curVelo = 70;
+
+ setAcceptDrops(true);
+ setFocusPolicy(Qt::StrongFocus);
+ setMouseTracking(true);
+
+ curPart = editor->parts()->begin()->second;
+ connect(song, SIGNAL(midiEvent(const MidiEvent&)), SLOT(midiNote(const MidiEvent&)));
+ }
+
+//---------------------------------------------------------
+// range
+//---------------------------------------------------------
+
+void EventCanvas::range(int* s, int* e) const
+ {
+ *s = startTick;
+ *e = endTick;
+ }
+
+//---------------------------------------------------------
+// getCaption
+//---------------------------------------------------------
+
+QString EventCanvas::getCaption() const
+ {
+ int bar1, bar2, xx;
+ unsigned x;
+ AL::sigmap.tickValues(curPart->tick(), &bar1, &xx, &x);
+ AL::sigmap.tickValues(curPart->tick() + curPart->lenTick(), &bar2, &xx, &x);
+
+ return QString("MusE: Part <") + curPart->name()
+ + QString("> %1-%2").arg(bar1+1).arg(bar2+1);
+ }
+
+//---------------------------------------------------------
+// startUndo
+//---------------------------------------------------------
+
+void EventCanvas::startUndo(DragType)
+ {
+ song->startUndo();
+ }
+
+//---------------------------------------------------------
+// endUndo
+//---------------------------------------------------------
+
+void EventCanvas::endUndo(DragType dtype)
+ {
+ song->endUndo((dtype == MOVE_COPY) ? SC_EVENT_INSERTED : SC_EVENT_MODIFIED);
+ }
+
+//---------------------------------------------------------
+// updateSelection
+//---------------------------------------------------------
+
+void EventCanvas::updateSelection()
+ {
+ song->update(SC_SELECTION);
+ }
+
+//---------------------------------------------------------
+// songChanged(type)
+// called from MidiEditor
+//---------------------------------------------------------
+
+void EventCanvas::songChanged(int flags)
+ {
+ if ((flags & ~SC_SELECTION) && !editor->parts()->empty()) {
+ items.clear();
+ startTick = MAXINT;
+ endTick = 0;
+ for (iPart p = editor->parts()->begin(); p != editor->parts()->end(); ++p) {
+ Part* part = p->second;
+ unsigned stick = part->tick();
+ unsigned etick = stick + part->lenTick();
+ if (stick < startTick)
+ startTick = stick;
+ if (etick > endTick)
+ endTick = etick;
+
+ EventList* el = part->events();
+ for (iEvent i = el->begin(); i != el->end(); ++i) {
+ Event e = i->second;
+ if (e.isNote())
+ addItem(part, e);
+ }
+ }
+ }
+
+ Event event;
+ Part* part = 0;
+ int x = 0;
+ CItem* nevent = 0;
+
+ int n = 0; // count selections
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ Event ev = k->second->event;
+ bool selected = ev.selected();
+ if (selected) {
+ k->second->setSelected(true);
+ ++n;
+ if (!nevent) {
+ nevent = k->second;
+ Event mi = nevent->event;
+ curVelo = mi.velo();
+ }
+ }
+ }
+ startTick = song->roundDownBar(startTick);
+ endTick = song->roundUpBar(endTick);
+
+ if (n == 1) {
+ x = nevent->bbox.x();
+ event = nevent->event;
+ part = nevent->part;
+ }
+ emit selectionChanged(x, event, part);
+ setPart(*curPart, curPart->end());
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// selectFirst
+//---------------------------------------------------------
+
+void EventCanvas::selectFirst()
+ {
+ //Select leftmost note if none selected and there are any
+ if (!items.empty() && selectionSize() == 0) {
+ iCItem i = items.begin();
+ if (!i->second->isSelected()) {
+ selectItem(i->second, true);
+ songChanged(SC_SELECTION);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// track
+//---------------------------------------------------------
+
+MidiTrack* EventCanvas::track() const
+ {
+ return (MidiTrack*)(curPart->track());
+ }
+
+//---------------------------------------------------------
+// keyPress
+//---------------------------------------------------------
+
+void EventCanvas::keyPress(QKeyEvent* event)
+ {
+ int key = event->key();
+ if (event->modifiers() & Qt::ShiftModifier)
+ key += Qt::SHIFT;
+ if (event->modifiers() & Qt::AltModifier)
+ key += Qt::ALT;
+ if (event->modifiers() & Qt::ControlModifier)
+ key += Qt::CTRL;
+
+ //
+ // Shortcut for DrumEditor & PianoRoll
+ // Sets locators to selected events
+ //
+ if (key == shortcuts[SHRT_LOCATORS_TO_SELECTION].key) {
+ int tick_max = 0;
+ int tick_min = INT_MAX;
+ bool found = false;
+
+ for (iCItem i= items.begin(); i != items.end(); i++) {
+ if (!i->second->isSelected())
+ continue;
+
+ int tick = i->second->bbox.x();
+ int len = i->second->event.lenTick();
+ found = true;
+ if (tick + len > tick_max)
+ tick_max = tick + len;
+ if (tick < tick_min)
+ tick_min = tick;
+ }
+ if (found) {
+ Pos p1(tick_min, AL::TICKS);
+ Pos p2(tick_max, AL::TICKS);
+ song->setPos(1, p1);
+ song->setPos(2, p2);
+ }
+ }
+ // Select items by key (PianoRoll & DrumEditor)
+ else if (key == shortcuts[SHRT_SEL_RIGHT].key || key == shortcuts[SHRT_SEL_RIGHT_ADD].key) {
+ iCItem i, iRightmost;
+ CItem* rightmost = NULL;
+ //Get the rightmost selected note (if any)
+ for (i = items.begin(); i != items.end(); ++i) {
+ if (i->second->isSelected()) {
+ iRightmost = i;
+ rightmost = i->second;
+ }
+ }
+ if (rightmost) {
+ iCItem temp = iRightmost;
+ temp++;
+ //If so, deselect current note and select the one to the right
+ if (temp != items.end()) {
+ if (key != shortcuts[SHRT_SEL_RIGHT_ADD].key)
+ deselectAll();
+
+ iRightmost++;
+ iRightmost->second->setSelected(true);
+ updateSelection();
+ }
+ }
+ }
+ //Select items by key: (PianoRoll & DrumEditor)
+ else if (key == shortcuts[SHRT_SEL_LEFT].key || key == shortcuts[SHRT_SEL_LEFT_ADD].key) {
+ iCItem i, iLeftmost;
+ CItem* leftmost = NULL;
+ for (i = items.end(), i--; i != items.begin(); i--) {
+ if (i->second->isSelected()) {
+ iLeftmost = i;
+ leftmost = i->second;
+ }
+ }
+ if (leftmost) {
+ if (iLeftmost != items.begin()) {
+ //Add item
+ if (key != shortcuts[SHRT_SEL_LEFT_ADD].key)
+ deselectAll();
+
+ iLeftmost--;
+ iLeftmost->second->setSelected(true);
+ updateSelection();
+ }
+ }
+ }
+ else if (key == shortcuts[SHRT_INC_PITCH].key) {
+ modifySelected(NoteInfo::VAL_PITCH, 1);
+ }
+ else if (key == shortcuts[SHRT_DEC_PITCH].key) {
+ modifySelected(NoteInfo::VAL_PITCH, -1);
+ }
+ else if (key == shortcuts[SHRT_INC_POS].key) {
+ // TODO: Check boundaries
+ modifySelected(NoteInfo::VAL_TIME, editor->raster());
+ }
+ else if (key == shortcuts[SHRT_DEC_POS].key) {
+ // TODO: Check boundaries
+ modifySelected(NoteInfo::VAL_TIME, 0 - editor->raster());
+ }
+ else
+ event->ignore();
+ }
+
+//---------------------------------------------------------
+// mousePressCanvasA
+//---------------------------------------------------------
+
+void EventCanvas::mousePressCanvasA(QMouseEvent* me)
+ {
+ QPoint p(me->pos() - rCanvasA.topLeft());
+
+ // special events if right button is clicked while operations
+ // like moving or drawing lasso is performed.
+
+ if (button == Qt::RightButton) {
+ switch (drag) {
+ case DRAG_LASSO:
+ drag = DRAG_OFF;
+ widget()->update();
+ return;
+ case DRAG_MOVE:
+ drag = DRAG_OFF;
+ endMoveItems(MOVE_MOVE);
+ return;
+ default:
+ break;
+ }
+ }
+ // ignore event if (another) button is already active:
+ if (me->buttons() & (Qt::LeftButton | Qt::RightButton | Qt::MidButton)
+ & ~button)
+ return;
+
+ bool shift = keyState & Qt::ShiftModifier;
+ bool ctrl = keyState & Qt::ControlModifier;
+ start = p;
+
+ //---------------------------------------------------
+ // set curItem to item mouse is pointing
+ // (if any)
+ //---------------------------------------------------
+
+ curItem = searchItem(start);
+ if (curItem && editor->playEvents()) {
+ MidiEvent e(0, 0, ME_NOTEON, curItem->event.pitch(), curItem->event.velo());
+ track()->playMidiEvent(&e);
+ }
+
+ if (curItem && (button == Qt::MidButton)) {
+ if (!curItem->isSelected()) {
+ selectItem(curItem, true);
+ updateSelection();
+ widget()->update();
+ }
+ startDrag(curItem, shift);
+ }
+ else if (button == Qt::RightButton) {
+ if (curItem) {
+ if (shift) {
+ drag = DRAG_RESIZE;
+ setCursor();
+ Pos p1(curItem->bbox.x(), timeType());
+ Pos p2(pix2pos(start.x()));
+ curItem->bbox.setWidth(p2.time(timeType())-p1.time(timeType()));
+
+ start.setX(curItem->bbox.x());
+ deselectAll();
+ selectItem(curItem, true);
+ updateSelection();
+ widget()->update();
+ }
+ else {
+ itemPopupMenu = genItemPopup(curItem);
+ if (itemPopupMenu) {
+ QAction* a = itemPopupMenu->exec(QCursor::pos());
+ if (a) {
+ int n = a->data().toInt();
+ itemPopup(curItem, n, start);
+ }
+ delete itemPopupMenu;
+ }
+ }
+ }
+ else {
+ canvasPopupMenu = genCanvasPopup();
+ if (canvasPopupMenu) {
+ QAction* a = canvasPopupMenu->exec(QCursor::pos(), 0);
+ if (a) {
+ int n = a->data().toInt();
+ canvasPopup(n);
+ }
+ delete canvasPopupMenu;
+ }
+ }
+ }
+ else if (button == Qt::LeftButton) {
+ switch (_tool) {
+ case PointerTool:
+ if (curItem) {
+ itemPressed(curItem);
+ if (curItem->part != curPart)
+ setCurPart(curItem->part);
+ if (shift && !ctrl)
+ drag = DRAG_COPY_START;
+ else if (!shift && ctrl) {
+ //Select all on the same pitch
+ deselectAll();
+ int pitch = curItem->event.pitch();
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ if (i->second->event.pitch() == pitch)
+ selectItem(i->second, true);
+ }
+ updateSelection();
+ widget()->update();
+ drag = DRAG_MOVE_START;
+ }
+ else
+ drag = DRAG_MOVE_START;
+ }
+ else
+ drag = DRAG_LASSO_START;
+ setCursor();
+ break;
+
+ case RubberTool:
+ deleteItem(p);
+ drag = DRAG_DELETE;
+ setCursor();
+ break;
+
+ case PencilTool:
+ if (curItem) {
+ drag = DRAG_RESIZE;
+ setCursor();
+
+ Pos p1(curItem->bbox.x(), timeType());
+ Pos p2(pix2pos(start.x()));
+ int w = p2.time(timeType()) - p1.time(timeType());
+ curItem->bbox.setWidth(w);
+ start.setX(curItem->bbox.x());
+ start.setY(curItem->bbox.y());
+ }
+ else {
+ drag = DRAG_NEW;
+ setCursor();
+ curItem = newItem(start, keyState);
+ if (curItem) {
+ items.add(curItem);
+ if (editor->playEvents()) {
+ MidiEvent e(0, 0, ME_NOTEON, curItem->event.pitch(), curItem->event.velo());
+ track()->playMidiEvent(&e);
+ }
+ }
+ else {
+ drag = DRAG_OFF;
+ setCursor();
+ }
+ }
+ deselectAll();
+ if (curItem)
+ selectItem(curItem, true);
+ updateSelection();
+ widget()->update();
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// mouseMoveCanvasA
+// pos is relative to CanvasA
+//---------------------------------------------------------
+
+void EventCanvas::mouseMoveCanvasA(QPoint pos)
+ {
+ QPoint dist = pos - start;
+ bool isMoving = dist.manhattanLength() >= QApplication::startDragDistance();
+
+ switch (drag) {
+ case DRAG_LASSO_START:
+ if (!isMoving)
+ break;
+ drag = DRAG_LASSO;
+ setCursor();
+ // proceed with DRAG_LASSO:
+
+ case DRAG_LASSO:
+ lasso = QRect(start, QSize(dist.x(), dist.y()));
+ widget()->update();
+ break;
+
+ case DRAG_MOVE_START:
+ case DRAG_COPY_START:
+ if (!isMoving)
+ break;
+ {
+ bool shift = keyState & Qt::ShiftModifier;
+ bool ctrl = keyState & Qt::ControlModifier;
+ if (shift && ctrl) {
+ if (std::abs(dist.x()) > std::abs(dist.y())) {
+ if (drag == DRAG_MOVE_START)
+ drag = DRAGX_MOVE;
+ else
+ drag = DRAGX_COPY;
+ }
+ else {
+ if (drag == DRAG_MOVE_START)
+ drag = DRAGY_MOVE;
+ else
+ drag = DRAGY_COPY;
+ }
+ }
+ else {
+ if (drag == DRAG_MOVE_START)
+ drag = DRAG_MOVE;
+ else
+ drag = DRAG_COPY;
+ }
+ setCursor();
+ if (!curItem->isSelected()) {
+ if (drag == DRAG_MOVE)
+ deselectAll();
+ selectItem(curItem, true);
+ updateSelection();
+ widget()->update();
+ }
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ if (i->second->isSelected()) {
+ i->second->isMoving = true;
+ moving.add(i->second);
+ }
+ }
+ moveItems(pos, 0);
+ }
+ break;
+
+ case DRAG_MOVE:
+ case DRAG_COPY:
+ moveItems(pos, 0);
+ break;
+
+ case DRAGX_MOVE:
+ case DRAGX_COPY:
+ moveItems(pos, 1);
+ break;
+
+ case DRAGY_MOVE:
+ case DRAGY_COPY:
+ moveItems(pos, 2);
+ break;
+
+ case DRAG_NEW:
+ case DRAG_RESIZE:
+ if (dist.x()) {
+ Pos p1(curItem->bbox.x(), timeType());
+ Pos p2(pix2pos(pos.x()));
+ int w = p2.time(timeType()) - p1.time(timeType());
+ if (w < 1)
+ w = 1;
+ curItem->bbox.setWidth(w);
+ widget()->update();
+ }
+ break;
+ case DRAG_DELETE:
+ deleteItem(pos);
+ break;
+
+ case DRAG_OFF:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// mouseReleaseCanvasA
+//---------------------------------------------------------
+
+void EventCanvas::mouseReleaseCanvasA(QMouseEvent* me)
+ {
+ if (curItem && editor->playEvents()) {
+ MidiEvent e(0, 0, ME_NOTEON, curItem->event.pitch(), 0);
+ track()->playMidiEvent(&e);
+ }
+ // ignore event if (another) button is already active:
+
+ if (me->buttons() & (Qt::LeftButton | Qt::RightButton | Qt::MidButton)
+ & ~button)
+ return;
+
+ bool shift = keyState & Qt::ShiftModifier;
+ bool ctrl = keyState & Qt::ControlModifier;
+ bool redrawFlag = false;
+
+ switch (drag) {
+ case DRAG_MOVE_START:
+ case DRAG_COPY_START:
+ if (!(shift || ctrl))
+ deselectAll();
+ if (!ctrl)
+ selectItem(curItem, !(shift && curItem->isSelected()));
+ updateSelection();
+ redrawFlag = true;
+ itemReleased();
+ break;
+ case DRAG_COPY:
+ case DRAGX_COPY:
+ case DRAGY_COPY:
+ endMoveItems(MOVE_COPY);
+ break;
+ case DRAG_MOVE:
+ case DRAGX_MOVE:
+ case DRAGY_MOVE:
+ endMoveItems(MOVE_MOVE);
+ break;
+ case DRAG_OFF:
+ break;
+ case DRAG_RESIZE:
+ resizeItem(curItem, false);
+ break;
+ case DRAG_NEW:
+ newItem(curItem, false);
+ redrawFlag = true;
+ break;
+ case DRAG_LASSO_START:
+ lasso.setRect(-1, -1, -1, -1);
+ if (!shift)
+ deselectAll();
+ updateSelection();
+ redrawFlag = true;
+ break;
+
+ case DRAG_LASSO:
+ if (!shift)
+ deselectAll();
+ lasso = lasso.normalized();
+ selectLasso(shift);
+ updateSelection();
+ redrawFlag = true;
+ break;
+
+ case DRAG_DELETE:
+ break;
+ }
+ drag = DRAG_OFF;
+ if (redrawFlag)
+ widget()->update();
+ setCursor();
+ }
+
+
+//---------------------------------------------------------
+// endMoveItems
+//---------------------------------------------------------
+
+void EventCanvas::endMoveItems(DragType dragtype)
+ {
+ startUndo(dragtype);
+
+ for (iCItem i = moving.begin(); i != moving.end(); ++i) {
+ selectItem(i->second, true);
+ moveItem(i->second, dragtype);
+//TD if (moving.size() == 1) {
+// itemReleased();
+// }
+ if (dragtype == MOVE_COPY)
+ selectItem(i->second, false);
+ }
+ endUndo(dragtype);
+ moving.clear();
+ updateSelection();
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// selectItem
+//---------------------------------------------------------
+
+void EventCanvas::selectItem(CItem* e, bool flag)
+ {
+ e->setSelected(flag);
+ }
+
+//---------------------------------------------------------
+// deselectAll
+//---------------------------------------------------------
+
+void EventCanvas::deselectAll()
+ {
+ for (iCItem i = items.begin(); i != items.end(); ++i)
+ i->second->setSelected(false);
+ }
+
+//---------------------------------------------------------
+// genCanvasPopup
+//---------------------------------------------------------
+
+QMenu* EventCanvas::genCanvasPopup()
+ {
+ if (canvasTools == 0)
+ return 0;
+ QMenu* canvasPopup = new QMenu(this);
+
+ for (int i = 0; i < 9; ++i) {
+ int data = 1 << i;
+ if ((canvasTools & data) == 0)
+ continue;
+ QAction* a = canvasPopup->addAction(**toolList[i].icon, tr(toolList[i].tip));
+ a->setData(data);
+ a->setCheckable(true);
+ if (data == int(_tool))
+ a->setChecked(true);
+ }
+ return canvasPopup;
+ }
+
+//---------------------------------------------------------
+// canvasPopup
+//---------------------------------------------------------
+
+void EventCanvas::canvasPopup(int n)
+ {
+ setTool(n);
+ }
+
+//---------------------------------------------------------
+// setCursor
+//---------------------------------------------------------
+
+void EventCanvas::setCursor()
+ {
+ if (curSplitter != -1) {
+ widget()->setCursor(Qt::SplitVCursor);
+ return;
+ }
+ switch (drag) {
+ case DRAGX_MOVE:
+ case DRAGX_COPY:
+ widget()->setCursor(QCursor(Qt::SizeHorCursor));
+ break;
+
+ case DRAGY_MOVE:
+ case DRAGY_COPY:
+ widget()->setCursor(QCursor(Qt::SizeVerCursor));
+ break;
+
+ case DRAG_MOVE:
+ case DRAG_COPY:
+ widget()->setCursor(QCursor(Qt::SizeAllCursor));
+ break;
+
+ case DRAG_RESIZE:
+ widget()->setCursor(QCursor(Qt::SizeHorCursor));
+ break;
+
+ case DRAG_DELETE:
+ case DRAG_COPY_START:
+ case DRAG_MOVE_START:
+ case DRAG_NEW:
+ case DRAG_LASSO_START:
+ case DRAG_LASSO:
+ case DRAG_OFF:
+ TimeCanvas::setCursor();
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// deleteItem
+// p is relative to CanvasA
+//---------------------------------------------------------
+
+void EventCanvas::deleteItem(const QPoint& p)
+ {
+ Pos pos(pix2pos(p.x()));
+ int pitch(y2pitch(p.y()));
+
+// printf("%d %d - %d %d\n", p.x(), p.y(), pos.tick(), pitch);
+
+ pos -= *curPart;
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ Event& event = i->second->event;
+ if (event.pitch() == pitch
+ && (pos >= event.pos())
+ && (pos < event.end())) {
+ deleteItem(i->second);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// moveItems
+// dir = 0 move in all directions
+// 1 move only horizontal
+// 2 move only vertical
+//---------------------------------------------------------
+
+void EventCanvas::moveItems(const QPoint& pos, int dir)
+ {
+ int dy = pos.y() - start.y();
+
+ Pos sp(pix2pos(start.x()));
+ Pos cp(pix2pos(pos.x()));
+
+ bool left = sp > cp;
+ Pos dx(left ? sp - cp : cp - sp);
+
+ if (dir == 2)
+ dx.setTick(0);
+
+ for (iCItem i = moving.begin(); i != moving.end(); ++i) {
+ CItem* item = i->second;
+ Pos p;
+ if (left) {
+ //
+ // restrict movement to pos >= 0
+ //
+ if (dx > item->pos)
+ p.setTick(0);
+ else
+ p = item->pos - dx;
+ }
+ else
+ p = item->pos + dx;
+ p.snap(raster());
+ int ny = pitch2y(y2pitch(pitch2y(item->event.pitch()) + dy));
+
+ if (p < *curPart)
+ p = *curPart;
+
+ if (item->moving != p || (item->my - wpos.y()) != ny) {
+ item->moving = p;
+ if (dir != 1)
+ item->my = ny + wpos.y();
+ itemMoved(item);
+ }
+ }
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// selectionSize
+//---------------------------------------------------------
+
+int EventCanvas::selectionSize() const
+ {
+ int n = 0;
+ for (ciCItem i = items.begin(); i != items.end(); ++i) {
+ if (i->second->isSelected())
+ ++n;
+ }
+ return n;
+ }
+
+//---------------------------------------------------------
+// layout
+// called after resize
+//---------------------------------------------------------
+
+void EventCanvas::layout()
+ {
+ int n = ctrlEditList.size();
+ if (n == 0)
+ return;
+ if (ctrlHeight == 0) {
+ int wh = widget()->height();
+ resizeController(wh < 120 ? wh / 2 : 100);
+ }
+
+ // check, if layout is ok already; this happens after
+ // song load
+ int h = 0;
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ h += c->height();
+ }
+ if (h == ctrlHeight) {
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i)
+ layoutPanelB(*i);
+ return;
+ }
+
+ int y = 0;
+ int sch = ctrlHeight / n;
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ c->y = y;
+ c->setHeight(sch);
+ layoutPanelB(c);
+ y += sch;
+ }
+ }
+
+//---------------------------------------------------------
+// layout1
+// called after read song
+//---------------------------------------------------------
+
+void EventCanvas::layout1()
+ {
+ int n = ctrlEditList.size();
+ if (n == 0)
+ return;
+ int y = 0;
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ c->y = y;
+ y += c->height();
+ }
+ resizeController(y);
+ }
+
+//---------------------------------------------------------
+// layoutPanelB
+//---------------------------------------------------------
+
+void EventCanvas::layoutPanelB(CtrlEdit* c)
+ {
+ int y = c->y;
+ int h = c->height();
+ int bx = rPanelB.x() + rPanelB.width() - 23;
+ int by = rPanelB.y() + y + h - 19;
+ c->minus->setGeometry(bx, by, 18, 18);
+ bx = rPanelB.x() + 1;
+ by = rPanelB.y() + y + 5;
+ c->sel->setGeometry(bx, by, rPanelB.width()-5, 18);
+ }
+
+//---------------------------------------------------------
+// addController
+//---------------------------------------------------------
+
+void EventCanvas::addController()
+ {
+ int n = ctrlEditList.size();
+ CtrlEdit* ce = new CtrlEdit(widget(), this, track());
+ ce->setHeight(50);
+ ctrlEditList.push_back(ce);
+
+ ce->minus->defaultAction()->setData(n);
+ connect(ce->minus, SIGNAL(triggered(QAction*)), SLOT(removeController(QAction*)));
+ ce->minus->show();
+ ce->sel->show();
+
+ layout();
+ widget()->update();
+ updatePartControllerList();
+ }
+
+void EventCanvas::addController(int id, int h)
+ {
+ ctrlHeight += h;
+ int n = ctrlEditList.size();
+ CtrlEdit* ce = new CtrlEdit(widget(), this, track());
+ ce->setHeight(h);
+ Ctrl* ctrl = track()->getController(id);
+ if (ctrl)
+ ce->setCtrl(ctrl);
+ ctrlEditList.push_back(ce);
+
+ ce->minus->defaultAction()->setData(n);
+ connect(ce->minus, SIGNAL(triggered(QAction*)), SLOT(removeController(QAction*)));
+ }
+
+//---------------------------------------------------------
+// paintVLine
+//---------------------------------------------------------
+
+void paintVLine(QPainter& p, int y1, int y2, int x)
+ {
+ static QColor color[splitWidth] = {
+ QColor(0x55, 0x55, 0x52),
+ QColor(0xff, 0xff, 0xff),
+ };
+ x -= 2;
+ for (int i = 0; i < 2; ++i) {
+ p.setPen(color[i]);
+ p.drawLine(x, y1, x, y2);
+ ++x;
+ }
+ }
+
+//---------------------------------------------------------
+// paintControllerCanvas
+// r(0, 0) is PanelB topLeft()
+//---------------------------------------------------------
+
+void EventCanvas::paintControllerCanvas(QPainter& p, QRect r)
+ {
+ int x1 = r.x();
+ int x2 = x1 + r.width();
+
+ int xx2 = rCanvasB.width();
+ if (xx2 >= x2)
+ x2 = xx2 - 2;
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ int y = c->y;
+ paintHLine(p, x1, x2, y);
+ p.setPen(lineColor[0]);
+ p.drawLine(xx2-1, 1, xx2-1, splitWidth-2);
+
+ QRect rc(0, y + splitWidth, rCanvasB.width(), c->cheight());
+ QPoint pt(rc.topLeft());
+ rc &= r;
+ if (!rc.isEmpty()) {
+ p.translate(pt);
+ c->paint(p, rc.translated(-pt));
+ p.translate(-pt);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// paintControllerPanel
+// panelB
+//---------------------------------------------------------
+
+void EventCanvas::paintControllerPanel(QPainter& p, QRect r)
+ {
+ p.fillRect(r, QColor(0xe0, 0xe0, 0xe0));
+ int x1 = r.x();
+ int x2 = x1 + r.width();
+
+ paintVLine(p, r.y() + splitWidth, r.y() + r.height(),
+ rPanelB.x() + rPanelB.width());
+
+ if (x1 == 0)
+ x1 = 1;
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ paintHLine(p, x1, x2, c->y);
+ p.setPen(lineColor[0]);
+ p.drawLine(0, 1, 0, splitWidth-2);
+ }
+ }
+
+//---------------------------------------------------------
+// removeController
+//---------------------------------------------------------
+
+void EventCanvas::removeController(QAction* a)
+ {
+ int id = a->data().toInt();
+
+ int k = 0;
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i, ++k) {
+ if (k == id) {
+ CtrlEdit* c = *i;
+ delete c;
+ ctrlEditList.erase(i);
+ break;
+ }
+ }
+ k = 0;
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i, ++k) {
+ CtrlEdit* c = *i;
+ c->minus->defaultAction()->setData(k);
+ }
+
+ if (ctrlEditList.empty())
+ resizeController(0);
+ else
+ layout();
+ widget()->update();
+ updatePartControllerList();
+ }
+
+//---------------------------------------------------------
+// enterB
+//---------------------------------------------------------
+
+void EventCanvas::enterB()
+ {
+ if ((button == 0) && curSplitter != -1) {
+ curSplitter = -1;
+ setCursor();
+ }
+ }
+
+//---------------------------------------------------------
+// leaveB
+//---------------------------------------------------------
+
+void EventCanvas::leaveB()
+ {
+ if ((button == 0) && (curSplitter != -1)) {
+ curSplitter = -1;
+ setCursor();
+ }
+ }
+
+//---------------------------------------------------------
+// noteOn
+//---------------------------------------------------------
+
+void EventCanvas::noteOn(int pitch, int velocity, bool shift)
+ {
+ DrumMap* dm = track()->drumMap();
+ if (!dm)
+ pitch += track()->transposition;
+
+ // play note:
+ if (editor->playEvents()) {
+ MidiEvent e(0, 0, ME_NOTEON, pitch, velocity);
+ track()->playMidiEvent(&e);
+ }
+
+ if (curPart && editor->stepRec()
+ && pos[0].tick() >= startTick
+ && pos[0].tick() < endTick) {
+ int len = editor->quant();
+ unsigned tick = pos[0].tick() - curPart->tick(); //CDW
+ if (shift)
+ tick -= editor->rasterStep(tick);
+ Event e(Note);
+ e.setTick(tick);
+ e.setPitch(pitch);
+ e.setVelo(127);
+ e.setLenTick(len);
+ audio->msgAddEvent(e, curPart);
+ tick += editor->rasterStep(tick) + curPart->tick();
+ if (tick != song->cpos()) {
+ Pos p(tick, AL::TICKS);
+ song->setPos(0, p, true, false, true);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// noteOff
+//---------------------------------------------------------
+
+void EventCanvas::noteOff(int pitch)
+ {
+ if (!editor->playEvents())
+ return;
+ DrumMap* dm = track()->drumMap();
+ if (!dm)
+ pitch += track()->transposition;
+
+ // release key:
+ MidiEvent e(0, 0, ME_NOTEON, pitch, 0);
+ track()->playMidiEvent(&e);
+ }
+
+//---------------------------------------------------------
+// mouseDoubleClick
+//---------------------------------------------------------
+
+void EventCanvas::mouseDoubleClick(QMouseEvent* me)
+ {
+ mousePress(me);
+ }
+
+//---------------------------------------------------------
+// mousePress
+//---------------------------------------------------------
+
+void EventCanvas::mousePress(QMouseEvent* me)
+ {
+ QPoint pos(me->pos());
+ if (rPanelA.contains(pos)) {
+ bool shift = keyState & Qt::ShiftModifier;
+ if (keyDown != -1) {
+ noteOff(keyDown);
+ keyDown = -1;
+ }
+ int y = pos.y() - rCanvasA.y();
+ keyDown = y2pitch(y);
+ int velocity = me->x()*127/40;
+ if (keyDown != -1)
+ noteOn(keyDown, velocity, shift);
+ return;
+ }
+ if (rCanvasA.contains(pos)) {
+ mousePressCanvasA(me);
+ return;
+ }
+ if (curSplitter != -1) {
+ dragSplitter = true;
+ splitterY = pos.y();
+ return;
+ }
+ if (rCanvasB.contains(pos)) {
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ QRect r(rCanvasB.x(), rCanvasB.y() + c->y + splitWidth,
+ rCanvasB.width(), c->cheight());
+ if (r.contains(pos)) {
+ c->mousePress(pos - r.topLeft(), me->button());
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// mouseMove
+//---------------------------------------------------------
+
+void EventCanvas::mouseMove(QPoint pos)
+ {
+ if (rPanelA.contains(pos) || rCanvasA.contains(pos)) {
+ int y = pos.y() - rCanvasA.y();
+ int pitch = y2pitch(y);
+ if (curPitch != pitch) {
+ curPitch = pitch;
+ widget()->update(rPanelA); // update keyboard
+ emit pitchChanged(curPitch);
+ if (button != Qt::NoButton) {
+ if (keyDown != -1 && curPitch != -1) {
+ bool shift = keyState & Qt::ShiftModifier;
+ if (curPitch != keyDown)
+ noteOff(keyDown);
+ keyDown = curPitch;
+ int velocity = pos.x()*127/40;
+ noteOn(keyDown, velocity, shift);
+ }
+ }
+ }
+ }
+ if (dragSplitter) {
+ int deltaY = pos.y() - splitterY;
+
+ iCtrlEdit i = ctrlEditList.begin();
+ int y = 0;
+ if (curSplitter > 0) {
+ int k = 0;
+ CtrlEdit* c;
+ for (; i != ctrlEditList.end(); ++i, ++k) {
+ c = *i;
+ y += c->height();
+ if ((k+1) == curSplitter)
+ break;
+ }
+ if (i == ctrlEditList.end()) {
+ printf("unexpected edit list end, curSplitter %d\n", curSplitter);
+ return;
+ }
+ if (c->height() + deltaY < splitWidth)
+ deltaY = splitWidth - c->height();
+ ++i;
+ int rest = 0;
+ for (iCtrlEdit ii = i; ii != ctrlEditList.end(); ++ii)
+ rest += (*ii)->cheight();
+ if (rest < deltaY)
+ deltaY = rest;
+ c->setHeight(c->height() + deltaY);
+ layoutPanelB(c);
+ y += deltaY;
+ }
+ //
+ // layout rest, add deltaY vertical
+ //
+ int rest = 0;
+ for (iCtrlEdit ii = i; ii != ctrlEditList.end(); ++ii) {
+ CtrlEdit* c = *ii;
+ rest += c->cheight();
+ }
+ if (rest < deltaY)
+ deltaY = rest;
+ rest = deltaY;
+ for (; i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ int d = c->cheight();
+ if (d > deltaY)
+ d = deltaY;
+ c->setHeight(c->height() - d);
+ c->y = y;
+ layoutPanelB(c);
+ y += c->height();
+ deltaY -= d;
+ if (deltaY == 0)
+ break;
+ }
+ if (i != ctrlEditList.end())
+ ++i;
+ for (; i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ c->y = y;
+ y += c->height();
+ }
+ if (curSplitter == 0)
+ resizeController(ctrlHeight - rest);
+ else
+ widget()->update(rPanelB | rCanvasB);
+ splitterY = pos.y();
+ updatePartControllerList();
+ return;
+ }
+ if (rCanvasA.contains(pos)) {
+ mouseMoveCanvasA(pos - rCanvasA.topLeft());
+ return;
+ }
+ if (button == 0) {
+ if (rPanelB.contains(pos) || rCanvasB.contains(pos)) {
+ int y = pos.y() - rPanelB.y();
+ int k = 0;
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i, ++k) {
+ CtrlEdit* c = *i;
+ if (y >= c->y && y < (c->y + splitWidth)) {
+ curSplitter = k;
+ setCursor();
+ return;
+ }
+ int ypos = y - c->y - splitWidth;
+ if (ypos >= 0)
+ emit yChanged(c->pixel2val(ypos));
+ }
+ }
+ if (curSplitter != -1) {
+ curSplitter = -1;
+ setCursor();
+ }
+ return;
+ }
+ if (rCanvasB.contains(pos)) {
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ QRect r(rCanvasB.x(), rCanvasB.y() + c->y + splitWidth,
+ rCanvasB.width(), c->cheight());
+ if (r.contains(pos)) {
+ c->mouseMove(pos - r.topLeft());
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// mouseRelease
+//---------------------------------------------------------
+
+void EventCanvas::mouseRelease(QMouseEvent* me)
+ {
+ if (keyDown != -1) {
+ noteOff(keyDown);
+ keyDown = -1;
+ }
+ if (dragSplitter) {
+ dragSplitter = false;
+ return;
+ }
+ QPoint pos(me->pos());
+ if (rCanvasA.contains(pos)) {
+ mouseReleaseCanvasA(me);
+ return;
+ }
+ if (rCanvasB.contains(pos)) {
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i) {
+ CtrlEdit* c = *i;
+ QRect r(rCanvasB.x(), rCanvasB.y() + c->y + splitWidth,
+ rCanvasB.width(), c->cheight());
+ if (r.contains(pos)) {
+ c->mouseRelease();
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// setCurPart
+//---------------------------------------------------------
+
+void EventCanvas::setCurPart(Part* part)
+ {
+ curPart = part;
+
+ if (curPart->raster() != -1)
+ editor->setRaster(curPart->raster());
+ if (curPart->quant() != -1)
+ editor->setQuant(curPart->quant());
+ if (curPart->xmag() != 0.0)
+ editor->setXmag(curPart->xmag());
+ curPart->setRaster(editor->raster());
+ curPart->setQuant(editor->quant());
+ curPart->setXmag(editor->xmag());
+ setPart(*curPart, curPart->end());
+ editor->setWindowTitle(getCaption());
+ }
+
+//---------------------------------------------------------
+// getTextDrag
+//---------------------------------------------------------
+
+QMimeData* EventCanvas::getTextDrag()
+ {
+ //---------------------------------------------------
+ // generate event list from selected events
+ //---------------------------------------------------
+
+ EventList el;
+ unsigned startTick = MAXINT;
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ if (!i->second->isSelected())
+ continue;
+ CItem* ne = i->second;
+ Event e = ne->event;
+ if (startTick == MAXINT)
+ startTick = e.tick();
+ el.add(e);
+ }
+ QBuffer buffer;
+ buffer.open(QIODevice::WriteOnly);
+ Xml xml(&buffer);
+ xml.header();
+
+ xml.tag("eventlist");
+ for (ciEvent e = el.begin(); e != el.end(); ++e)
+ e->second.write(xml, -startTick);
+ xml.etag("eventlist");
+
+ QByteArray data = buffer.buffer();
+ QMimeData* drag = new QMimeData;
+ drag->setData("text/x-muse-eventlist", data);
+ buffer.close();
+ return drag;
+ }
+
+//---------------------------------------------------------
+// pasteAt
+//---------------------------------------------------------
+
+void EventCanvas::pasteAt(const QString& pt, unsigned pos)
+ {
+ QDomDocument doc;
+
+ if (!doc.setContent(pt, false)) {
+ printf("MusE:pasteAt(): syntax error\n");
+ printf(">>%s<<\n", pt.toLatin1().data());
+ return;
+ }
+ for (QDomNode node = doc.documentElement(); !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "eventlist") {
+ EventList el;
+ el.read(node.firstChild(), true);
+ song->startUndo();
+ for (iEvent i = el.begin(); i != el.end(); ++i) {
+ Event e = i->second;
+ e.setTick(e.tick() + pos - curPart->tick());
+ audio->msgAddEvent(e, curPart, false);
+ }
+ song->endUndo(SC_EVENT_INSERTED);
+ }
+ else
+ printf("MusE:pasteAt(): tag %s not supported\n", e.tagName().toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// midiNote
+//---------------------------------------------------------
+
+void EventCanvas::midiNote(const MidiEvent& me)
+ {
+ if (me.type() != ME_NOTEON)
+ return;
+ int pitch = me.dataA();
+ int velo = me.dataB();
+
+ if (editor->midiIn() && editor->stepRec() && curPart
+ && !audio->isPlaying() && velo && pos[0].tick() >= startTick
+ && pos[0].tick() < endTick
+ && !(keyState & Qt::AltModifier)) {
+ int len = editor->quant();
+ unsigned tick = pos[0].tick(); //CDW
+ unsigned starttick = tick;
+ if (keyState & Qt::ShiftModifier)
+ tick -= editor->rasterStep(tick);
+
+ //
+ // extend len of last note?
+ //
+ EventList* events = curPart->events();
+ if (keyState & Qt::ControlModifier) {
+ for (iEvent i = events->begin(); i != events->end(); ++i) {
+ Event ev = i->second;
+ if (!ev.isNote())
+ continue;
+ if (ev.pitch() == pitch && ((ev.tick() + ev.lenTick()) == starttick)) {
+ Event e = ev.clone();
+ e.setLenTick(ev.lenTick() + editor->rasterStep(starttick));
+ audio->msgChangeEvent(ev, e, curPart);
+ tick += editor->rasterStep(tick);
+ if (tick != song->cpos()) {
+ Pos p(tick, AL::TICKS);
+ song->setPos(0, p, true, false, true);
+ }
+ return;
+ }
+ }
+ }
+
+ //
+ // if we already entered the note, delete it
+ //
+ EventRange range = events->equal_range(tick);
+ for (iEvent i = range.first; i != range.second; ++i) {
+ Event ev = i->second;
+ if (ev.isNote() && ev.pitch() == pitch) {
+ audio->msgDeleteEvent(ev, curPart);
+ if (keyState & Qt::ShiftModifier)
+ tick += editor->rasterStep(tick);
+ return;
+ }
+ }
+ Event e(Note);
+ e.setTick(tick - curPart->tick());
+ e.setPitch(pitch);
+ e.setVelo(velo);
+ e.setLenTick(len);
+ audio->msgAddEvent(e, curPart);
+ tick += editor->rasterStep(tick);
+ if (tick != song->cpos()) {
+ Pos p(tick, AL::TICKS);
+ song->setPos(0, p, true, false, true);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// magChanged
+//---------------------------------------------------------
+
+void EventCanvas::magChanged()
+ {
+ if (part()) {
+ part()->setXmag(_xmag);
+ }
+ }
+
+//---------------------------------------------------------
+// updatePartControllerList
+//---------------------------------------------------------
+
+void EventCanvas::updatePartControllerList()
+ {
+ if (curPart == 0)
+ return;
+ CtrlCanvasList* cl = curPart->getCtrlCanvasList();
+ cl->clear();
+ for (iCtrlEdit i = ctrlEditList.begin(); i != ctrlEditList.end(); ++i) {
+ CtrlCanvas cc;
+ cc.ctrlId = (*i)->ctrlId;
+ cc.height = (*i)->height();
+ cl->push_back(cc);
+ }
+ }
+
diff --git a/muse/muse/midiedit/ecanvas.h b/muse/muse/midiedit/ecanvas.h
new file mode 100644
index 00000000..ce402a03
--- /dev/null
+++ b/muse/muse/midiedit/ecanvas.h
@@ -0,0 +1,157 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ecanvas.h,v 1.42 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 2001-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __ECANVAS_H__
+#define __ECANVAS_H__
+
+#include "awl/tcanvas.h"
+#include "widgets/noteinfo.h"
+#include "citem.h"
+#include "ctrledit.h"
+#include "widgets/tb1.h"
+
+class MidiTrack;
+class MidiEditor;
+class MidiEvent;
+class Part;
+class Event;
+class CtrlEdit;
+
+//---------------------------------------------------------
+// EventCanvas
+//---------------------------------------------------------
+
+class EventCanvas : public TimeCanvas {
+ Q_OBJECT
+
+ int keyDown;
+ int playedPitch;
+
+ void noteOn(int pitch, int velocity, bool shift);
+ void noteOff(int pitch);
+ virtual void layout();
+ virtual void magChanged();
+
+ protected:
+ enum DragMode {
+ DRAG_OFF, DRAG_NEW,
+ DRAG_MOVE_START, DRAG_MOVE,
+ DRAG_COPY_START, DRAG_COPY,
+ DRAGX_MOVE, DRAGY_MOVE,
+ DRAGX_COPY, DRAGY_COPY,
+ DRAG_DELETE,
+ DRAG_RESIZE, DRAG_LASSO_START, DRAG_LASSO,
+ };
+
+ enum DragType {
+ MOVE_MOVE, MOVE_COPY
+ };
+
+ CtrlEditList ctrlEditList;
+ MidiEditor* editor;
+ CItemList items;
+ CItemList moving;
+ CItem* curItem;
+ Part* curPart;
+ int canvasTools;
+ int curSplitter; // -1 mouse not in splitter
+ bool dragSplitter;
+ int splitterY;
+
+ DragMode drag;
+ QRect lasso;
+ QPoint start;
+ QMenu* itemPopupMenu;
+ QMenu* canvasPopupMenu;
+
+ unsigned startTick, endTick;
+ int curVelo;
+
+ virtual void mousePress(QMouseEvent*);
+ virtual void mouseDoubleClick(QMouseEvent*);
+ virtual void mouseMove(QPoint);
+ virtual void enterB();
+ virtual void leaveB();
+ virtual void mouseRelease(QMouseEvent*);
+ void layoutPanelB(CtrlEdit* c);
+
+ void updateSelection();
+ virtual CItem* searchItem(const QPoint& p) const = 0;
+ virtual void addItem(Part*, const Event&) = 0;
+ virtual void moveItem(CItem*, DragType) = 0;
+ virtual CItem* newItem(const QPoint&, int state) = 0;
+ virtual void newItem(CItem*, bool noSnap=false) = 0;
+ virtual bool deleteItem(CItem*) = 0;
+ virtual void resizeItem(CItem*, bool noSnap=false) = 0;
+
+ virtual void startDrag(CItem*, bool) {}
+ virtual QMenu* genItemPopup(CItem*) { return 0; }
+ virtual void itemPopup(CItem*, int, const QPoint&) {}
+ virtual void itemReleased() {}
+ virtual void itemPressed(const CItem*) {}
+ virtual void itemMoved(const CItem*) {}
+
+ virtual void addController();
+
+ void endMoveItems(DragType);
+ virtual void selectItem(CItem* e, bool);
+ virtual void deselectAll();
+ QMenu* genCanvasPopup();
+ void canvasPopup(int);
+ virtual void startUndo(DragType);
+ virtual void endUndo(DragType);
+ virtual void selectLasso(bool) {}
+ void setCursor();
+ virtual void deleteItem(const QPoint&);
+ void moveItems(const QPoint& pos, int dir);
+ void mousePressCanvasA(QPoint pos);
+ void mousePressCanvasA(QMouseEvent*);
+ void mouseMoveCanvasA(QPoint pos);
+ void mouseReleaseCanvasA(QMouseEvent*);
+
+ virtual void paintControllerCanvas(QPainter&, QRect);
+ virtual void paintControllerPanel(QPainter&, QRect);
+
+ void pasteAt(const QString& pt, unsigned pos);
+ void updatePartControllerList();
+
+ private slots:
+ void removeController(QAction*);
+ void midiNote(const MidiEvent&);
+
+ public slots:
+ void setQuant(int) { update(); }
+ void songChanged(int);
+
+ signals:
+ void selectionChanged(int, Event&, Part*);
+ void enterCanvas();
+ void yChanged(int); // emitted from mouseMove in controller canvas
+
+ public:
+ EventCanvas(MidiEditor*, TimeCanvasType);
+ MidiTrack* track() const;
+ Part* part() const { return curPart; }
+ QString getCaption() const;
+ void range(int* s, int* e) const;
+ void selectFirst();
+ virtual void modifySelected(NoteInfo::ValType, int) {}
+ virtual void keyPress(QKeyEvent*);
+ int selectionSize() const;
+ void setCurPart(Part*);
+ QMimeData* getTextDrag();
+ CItemList* getItems() { return &items; }
+ CtrlEditList* getCtrlEditors() { return &ctrlEditList; }
+ const CtrlEditList* getCtrlEditors() const { return &ctrlEditList; }
+ void addController(int id, int h);
+ void layout1();
+ };
+
+extern void paintVLine(QPainter& p, int y1, int y2, int x);
+
+#endif
+
diff --git a/muse/muse/midiedit/midieditor.cpp b/muse/muse/midiedit/midieditor.cpp
new file mode 100644
index 00000000..8b5688e9
--- /dev/null
+++ b/muse/muse/midiedit/midieditor.cpp
@@ -0,0 +1,439 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: midieditor.cpp,v 1.14 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "midieditor.h"
+#include "part.h"
+#include "song.h"
+#include "widgets/tools.h"
+#include "ecanvas.h"
+#include "icons.h"
+#include "audio.h"
+
+//---------------------------------------------------------
+// MidiEditor
+//---------------------------------------------------------
+
+MidiEditor::MidiEditor(PartList* pl)
+ : Editor()
+ {
+ _pl = pl;
+ selPart = 0;
+ tools2 = 0;
+ info = 0;
+ tools = 0;
+ toolbar = 0;
+
+ QMenuBar* mb = menuBar();
+
+ //---------Menü----------------------------------
+ menuEdit = new QMenu(tr("&Edit"));
+ mb->addMenu(menuEdit);
+
+ menuEdit->addAction(undoAction);
+ menuEdit->addAction(redoAction);
+
+ menuEdit->addSeparator();
+ cutAction = menuEdit->addAction(tr("Cut"));
+ cutAction->setIcon(*editcutIconSet);
+ cutAction->setData(MidiEditor::CMD_CUT);
+ cutAction->setShortcut(Qt::CTRL+Qt::Key_X);
+
+ copyAction = menuEdit->addAction(tr("Copy"));
+ copyAction->setIcon(*editcopyIconSet);
+ copyAction->setData(MidiEditor::CMD_COPY);
+ copyAction->setShortcut(Qt::CTRL+Qt::Key_C);
+
+ pasteAction = menuEdit->addAction(tr("Paste"));
+ pasteAction->setIcon(*editpasteIconSet);
+ pasteAction->setData(MidiEditor::CMD_PASTE);
+ pasteAction->setShortcut(Qt::CTRL+Qt::Key_V);
+
+ speaker = new QAction(this);
+ speaker->setCheckable(true);
+ speaker->setIcon(QIcon(*speakerIcon));
+ speaker->setText(tr("Play Events"));
+ speaker->setToolTip(tr("Play Events"));
+
+ stepRecAction = new QAction(this);
+ stepRecAction->setIcon(QIcon(*steprecIcon));
+ stepRecAction->setText(tr("Step Record"));
+ stepRecAction->setToolTip(tr("Step Record"));
+ stepRecAction->setCheckable(true);
+
+ midiInAction = new QAction(this);
+ midiInAction->setIcon(QIcon(*midiinIcon));
+ midiInAction->setText(tr("Midi Input"));
+ midiInAction->setToolTip(tr("Midi Input"));
+ midiInAction->setCheckable(true);
+
+ followSongAction = new QAction(this);
+ followSongAction->setText("F");
+ followSongAction->setToolTip(tr("Follow Song"));
+ followSongAction->setCheckable(true);
+
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+
+ QClipboard* cb = QApplication::clipboard();
+ connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged()));
+ connect(cb, SIGNAL(selectionChanged()), SLOT(clipboardChanged()));
+ connect(menuEdit, SIGNAL(triggered(QAction*)), SLOT(midiCmd(QAction*)));
+ }
+
+//---------------------------------------------------------
+// cmd
+//---------------------------------------------------------
+
+void MidiEditor::midiCmd(QAction* a)
+ {
+ switch (a->data().toInt()) {
+ case CMD_CUT:
+ {
+ copy();
+ song->startUndo();
+ CItemList* items = canvas()->getItems();
+ for (iCItem i = items->begin(); i != items->end(); ++i) {
+ if (!i->second->isSelected())
+ continue;
+ CItem* e = i->second;
+ Event event = e->event;
+ audio->msgDeleteEvent(event, e->part, false);
+ }
+ song->endUndo(SC_EVENT_REMOVED);
+ }
+ break;
+ case CMD_COPY:
+ copy();
+ break;
+ default:
+ cmd(a);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// copy
+// cut copy paste
+//---------------------------------------------------------
+
+void MidiEditor::copy()
+ {
+ QMimeData* drag = canvas()->getTextDrag();
+ if (drag)
+ QApplication::clipboard()->setMimeData(drag, QClipboard::Selection);
+ }
+
+
+//---------------------------------------------------------
+// setPos
+// snap locator positioning
+//---------------------------------------------------------
+
+void MidiEditor::setPos(int idx, const AL::Pos& pos)
+ {
+ song->setPos(idx, pos.snaped(_raster));
+ }
+
+//---------------------------------------------------------
+// genPartlist
+//---------------------------------------------------------
+
+void MidiEditor::genPartlist()
+ {
+ MidiTrackList* tl = song->midis();
+ PartList* npl = new PartList;
+ for (iPart ip = _pl->begin(); ip != _pl->end(); ++ip) {
+ Part* part = ip->second;
+ for (iTrack it = tl->begin(); it != tl->end(); ++it) {
+ PartList* pl2 = (*it)->parts();
+ iPart ip2 = pl2->begin();
+ for (; ip2 != pl2->end(); ++ip2)
+ if (ip2->second == part) {
+ npl->add(part);
+ break;
+ }
+ if (ip2 != pl2->end())
+ break;
+ }
+ }
+ delete _pl;
+ _pl = npl;
+ for (iPart ip = _pl->begin(); ip != _pl->end(); ++ip) {
+ if (ip->second == selPart)
+ return;
+ }
+ if (_pl->empty())
+ return;
+ selPart = _pl->begin()->second;
+ if (canvas())
+ canvas()->setCurPart(selPart);
+ }
+
+//---------------------------------------------------------
+// MidiEditor
+//---------------------------------------------------------
+
+MidiEditor::~MidiEditor()
+ {
+ if (_pl)
+ delete _pl;
+ }
+
+//---------------------------------------------------------
+// writePartList
+//---------------------------------------------------------
+
+void MidiEditor::writePartList(Xml& xml) const
+ {
+ for (ciPart p = _pl->begin(); p != _pl->end(); ++p) {
+ Part* part = p->second;
+ Track* track = part->track();
+ int trkIdx = song->tracks()->index(track);
+ int partIdx = track->parts()->index(part);
+ xml.tag("part");
+ xml.put("%d:%d", trkIdx, partIdx);
+ xml.etag("part");
+ }
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void MidiEditor::songChanged(int type)
+ {
+ if (type & (SC_PART_REMOVED | SC_PART_MODIFIED
+ | SC_PART_INSERTED | SC_TRACK_REMOVED)) {
+ genPartlist();
+ // close window if editor has no parts anymore
+ if (parts()->empty()) {
+ close();
+ return;
+ }
+ }
+ canvas()->songChanged(type);
+ }
+
+//---------------------------------------------------------
+// setQuant
+//---------------------------------------------------------
+
+void MidiEditor::setQuant(int val)
+ {
+ _quant = val;
+ if (toolbar)
+ toolbar->setQuant(val);
+ if (canvas() && canvas()->part())
+ canvas()->part()->setQuant(val);
+ }
+
+//---------------------------------------------------------
+// setRaster
+//---------------------------------------------------------
+
+void MidiEditor::setRaster(int val)
+ {
+ _raster = val;
+ if (toolbar)
+ toolbar->setRaster(val);
+ if (canvas()) {
+ canvas()->setRaster(val);
+ if (canvas()->part())
+ canvas()->part()->setRaster(val);
+ }
+ }
+
+//---------------------------------------------------------
+// setApplyTo
+//---------------------------------------------------------
+
+void MidiEditor::setApplyTo(int val)
+ {
+ _applyTo = val;
+ if (toolbar)
+ toolbar->setApplyTo(_applyTo);
+ }
+
+//---------------------------------------------------------
+// rasterStep
+//---------------------------------------------------------
+
+int MidiEditor::rasterStep(unsigned tick) const
+ {
+ return AL::sigmap.rasterStep(tick, raster());
+ }
+
+//---------------------------------------------------------
+// rasterVal
+//---------------------------------------------------------
+
+unsigned MidiEditor::rasterVal(unsigned v) const
+ {
+ return AL::sigmap.raster(v, raster());
+ }
+
+//---------------------------------------------------------
+// rasterVal1
+//---------------------------------------------------------
+
+unsigned MidiEditor::rasterVal1(unsigned v) const
+ {
+ return AL::sigmap.raster1(v, raster());
+ }
+
+//---------------------------------------------------------
+// rasterVal2
+//---------------------------------------------------------
+
+unsigned MidiEditor::rasterVal2(unsigned v) const
+ {
+ return AL::sigmap.raster2(v, raster());
+ }
+
+//---------------------------------------------------------
+// quantVal
+//---------------------------------------------------------
+
+int MidiEditor::quantVal(int v) const
+ {
+ int q = quant();
+ int val = ((v+q/2)/q)*q;
+ if (val == 0)
+ val = q;
+ return val;
+ }
+
+//---------------------------------------------------------
+// xmag
+//---------------------------------------------------------
+
+double MidiEditor::xmag() const
+ {
+ return tcanvas->xmag();
+ }
+
+//---------------------------------------------------------
+// setXmag
+//---------------------------------------------------------
+
+void MidiEditor::setXmag(double val)
+ {
+ if (canvas())
+ canvas()->setMag(val, tcanvas->ymag());
+ }
+
+//---------------------------------------------------------
+// tool
+//---------------------------------------------------------
+
+int MidiEditor::tool() const
+ {
+ return tcanvas->tool();
+ }
+
+//---------------------------------------------------------
+// setTool
+//---------------------------------------------------------
+
+void MidiEditor::setTool(int n)
+ {
+ tcanvas->setTool(n);
+ tools2->set(n);
+ }
+
+//---------------------------------------------------------
+// canvasPos
+//---------------------------------------------------------
+
+QPoint MidiEditor::canvasPos() const
+ {
+ return tcanvas->getWPos();
+ }
+
+//---------------------------------------------------------
+// setCanvasPos
+//---------------------------------------------------------
+
+void MidiEditor::setCanvasPos(const QPoint& p)
+ {
+ if (tcanvas)
+ tcanvas->setWPos(p);
+ }
+
+//---------------------------------------------------------
+// clipboardChanged
+//---------------------------------------------------------
+
+void MidiEditor::clipboardChanged()
+ {
+ QString stype("x-muse-eventlist");
+ QString s = QApplication::clipboard()->text(stype, QClipboard::Selection);
+ pasteAction->setEnabled(!s.isEmpty());
+ }
+
+//---------------------------------------------------------
+// selectionChanged
+//---------------------------------------------------------
+
+void MidiEditor::selectionChanged()
+ {
+ bool flag = canvas()->selectionSize() > 0;
+ cutAction->setEnabled(flag);
+ copyAction->setEnabled(flag);
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void MidiEditor::read(QDomNode node)
+ {
+ for (node = node.firstChild(); !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ if (tag == "CtrlEdit") {
+ int id = e.attribute("id","0").toInt();
+ int h = e.attribute("h","50").toInt();
+ canvas()->addController(id, h);
+ }
+ else
+ AL::readProperties(this, node);
+ }
+ canvas()->layout1();
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void MidiEditor::write(Xml& xml) const
+ {
+ writePartList(xml);
+ xml.tag(metaObject()->className());
+ xml.writeProperties(this);
+ const CtrlEditList* el = canvas()->getCtrlEditors();
+ for (ciCtrlEdit i = el->begin(); i != el->end(); ++i) {
+ xml.tagE("CtrlEdit h=\"%d\" id=\"%d\"",
+ (*i)->height(), (*i)->ctrl()->id());
+ }
+ xml.etag(metaObject()->className());
+ }
+
+//---------------------------------------------------------
+// initFromPart
+//---------------------------------------------------------
+
+void MidiEditor::initFromPart()
+ {
+ Part* part = canvas()->part();
+ CtrlCanvasList* cl = part->getCtrlCanvasList();
+ if (!cl->empty()) {
+ for (iCtrlCanvas i = cl->begin(); i != cl->end(); ++i)
+ canvas()->addController(i->ctrlId, i->height);
+ canvas()->layout1();
+ }
+ }
+
diff --git a/muse/muse/midiedit/midieditor.h b/muse/muse/midiedit/midieditor.h
new file mode 100644
index 00000000..8845047f
--- /dev/null
+++ b/muse/muse/midiedit/midieditor.h
@@ -0,0 +1,133 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: midieditor.h,v 1.12 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MIDIEDITOR_H__
+#define __MIDIEDITOR_H__
+
+#include "editor.h"
+
+namespace AL {
+ class Xml;
+ class Pos;
+ };
+using AL::Xml;
+
+class EditToolBar;
+class NoteInfo;
+class Toolbar1;
+class Part;
+class PartList;
+class EventCanvas;
+class ScrollScale;
+class MTScale;
+class WaveView;
+
+//---------------------------------------------------------
+// MidiEditor
+//---------------------------------------------------------
+
+class MidiEditor : public Editor {
+ Q_OBJECT
+
+ Q_PROPERTY(int raster READ raster WRITE setRaster)
+ Q_PROPERTY(int quant READ quant WRITE setQuant)
+ Q_PROPERTY(bool stepRec READ stepRec WRITE setStepRec)
+ Q_PROPERTY(bool midiIn READ midiIn WRITE setMidiIn)
+ Q_PROPERTY(bool playEvents READ playEvents WRITE setPlayEvents)
+ Q_PROPERTY(bool followSong READ followSong WRITE setFollowSong)
+ Q_PROPERTY(double xmag READ xmag WRITE setXmag)
+ Q_PROPERTY(int applyTo READ applyTo WRITE setApplyTo)
+ Q_PROPERTY(QPoint canvasPos READ canvasPos WRITE setCanvasPos)
+ Q_PROPERTY(int tool READ tool WRITE setTool)
+
+ bool _playEvents;
+
+ EventCanvas* canvas() { return (EventCanvas*)tcanvas; }
+ const EventCanvas* canvas() const { return (EventCanvas*)tcanvas; }
+ void copy();
+
+ protected:
+ int _raster;
+ int _quant;
+ int _applyTo;
+
+ PartList* _pl;
+ Part* selPart;
+
+ QMenu *menuEdit;
+ QAction* speaker;
+ QAction* stepRecAction;
+ QAction* midiInAction;
+ QAction* followSongAction;
+
+ QAction* cutAction;
+ QAction* copyAction;
+ QAction* pasteAction;
+
+ EditToolBar* tools2;
+ NoteInfo* info;
+ QToolBar* tools;
+ Toolbar1* toolbar;
+
+ void writePartList(Xml&) const;
+ void genPartlist();
+ void writeStatus(Xml&) const;
+ void initFromPart();
+
+ private slots:
+ void midiCmd(QAction*);
+
+ protected slots:
+ void clipboardChanged(); // enable/disable "Paste"
+ void selectionChanged(); // enable/disable "Copy" & "Paste"
+ void songChanged(int);
+ void setPos(int, const AL::Pos&);
+ virtual void cmd(QAction*) = 0;
+
+ public slots:
+ void setQuant(int val);
+ void setApplyTo(int val);
+ void setRaster(int val);
+
+ public:
+ MidiEditor(PartList*);
+ virtual ~MidiEditor();
+
+ void read(QDomNode);
+ void write(Xml&) const;
+ void readStatus(QDomNode);
+
+ PartList* parts() { return _pl; }
+ int rasterStep(unsigned tick) const;
+ unsigned rasterVal(unsigned v) const;
+ unsigned rasterVal1(unsigned v) const;
+ unsigned rasterVal2(unsigned v) const;
+ int quantVal(int v) const;
+ int raster() const { return _raster; }
+ int quant() const { return _quant; }
+ int applyTo() const { return _applyTo; }
+ bool playEvents() const { return speaker->isChecked(); }
+ void setPlayEvents(bool val) { speaker->setChecked(val); }
+ bool stepRec() const { return stepRecAction->isChecked(); }
+ void setStepRec(bool val) { stepRecAction->setChecked(val); }
+ bool midiIn() const { return midiInAction->isChecked(); }
+ void setMidiIn(bool val) { midiInAction->setChecked(val); }
+ bool followSong() const { return followSongAction->isChecked(); }
+ void setFollowSong(bool val) { followSongAction->setChecked(val); }
+ double xmag() const;
+ void setXmag(double val);
+ QPoint canvasPos() const;
+ void setCanvasPos(const QPoint&);
+ void setTool(int);
+ int tool() const;
+ enum {
+ CMD_CUT, CMD_COPY, CMD_PASTE
+ };
+ };
+
+#endif
+
diff --git a/muse/muse/midiedit/pianoroll.cpp b/muse/muse/midiedit/pianoroll.cpp
new file mode 100644
index 00000000..0222e901
--- /dev/null
+++ b/muse/muse/midiedit/pianoroll.cpp
@@ -0,0 +1,644 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: pianoroll.cpp,v 1.81 2006/02/10 16:40:59 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "pianoroll.h"
+#include "song.h"
+#include "icons.h"
+#include "cmd.h"
+#include "muse.h"
+#include "widgets/tools.h"
+#include "quantconfig.h"
+#include "shortcuts.h"
+#include "audio.h"
+#include "part.h"
+
+static int pianorollTools = PointerTool | PencilTool | RubberTool | DrawTool;
+int PianoRoll::initWidth = PianoRoll::INIT_WIDTH;
+int PianoRoll::initHeight = PianoRoll::INIT_HEIGHT;
+int PianoRoll::initRaster = PianoRoll::INIT_RASTER;
+int PianoRoll::initQuant = PianoRoll::INIT_QUANT;
+int PianoRoll::initColorMode = PianoRoll::INIT_COLOR_MODE;
+bool PianoRoll::initFollow = PianoRoll::INIT_FOLLOW;
+bool PianoRoll::initSpeaker = PianoRoll::INIT_SPEAKER;
+bool PianoRoll::initMidiin = PianoRoll::INIT_MIDIIN;
+double PianoRoll::initXmag = 0.08; // PianoRoll::INIT_XMAG; (compiler problem?)
+int PianoRoll::initApplyTo = PianoRoll::INIT_APPLY_TO;
+int PianoRoll::initQuantStrength = PianoRoll::INIT_QUANT_STRENGTH;
+int PianoRoll::initQuantLimit = PianoRoll::INIT_QUANT_LIMIT;
+bool PianoRoll::initQuantLen = PianoRoll::INIT_QUANT_LEN;
+
+//---------------------------------------------------------
+// PianoRoll
+//---------------------------------------------------------
+
+PianoRoll::PianoRoll(PartList* pl, bool init)
+ : MidiEditor(pl)
+ {
+ _applyTo = initApplyTo;
+ _colorMode = initColorMode;
+ _quantStrength = initQuantStrength;
+ _quantLimit = initQuantLimit;
+ _quantLen = initQuantLen;
+
+ deltaMode = false;
+ selPart = 0;
+ quantConfig = 0;
+
+ tcanvas = new PianoCanvas(this);
+ QMenuBar* mb = menuBar();
+
+ //---------Menü----------------------------------
+ menuEdit->addSeparator();
+
+ QAction* a;
+ a = menuEdit->addAction(tr("Delete Events"));
+ a->setIcon(*deleteIcon);
+ a->setData(PianoCanvas::CMD_DEL);
+ a->setShortcut(Qt::Key_Delete);
+
+ menuEdit->addSeparator();
+
+ menuSelect = menuEdit->addMenu(QIcon(*selectIcon),tr("&Select"));
+
+ cmdActions[PianoCanvas::CMD_SELECT_ALL] = menuSelect->addAction(QIcon(*select_allIcon), tr("Select &All"));
+ cmdActions[PianoCanvas::CMD_SELECT_ALL]->setData(PianoCanvas::CMD_SELECT_ALL);
+
+ cmdActions[PianoCanvas::CMD_SELECT_NONE] = menuSelect->addAction(QIcon(*select_deselect_allIcon), tr("&Deselect All"));
+ cmdActions[PianoCanvas::CMD_SELECT_NONE]->setData(PianoCanvas::CMD_SELECT_NONE);
+
+ cmdActions[PianoCanvas::CMD_SELECT_INVERT] = menuSelect->addAction(QIcon(*select_invert_selectionIcon), tr("Invert &Selection"));
+ cmdActions[PianoCanvas::CMD_SELECT_INVERT]->setData(PianoCanvas::CMD_SELECT_INVERT);
+
+ cmdActions[PianoCanvas::CMD_SELECT_ILOOP] = menuSelect->addAction(QIcon(*select_inside_loopIcon), tr("&Inside Loop"));
+ cmdActions[PianoCanvas::CMD_SELECT_ILOOP]->setData(PianoCanvas::CMD_SELECT_ILOOP);
+
+ cmdActions[PianoCanvas::CMD_SELECT_OLOOP] = menuSelect->addAction(QIcon(*select_outside_loopIcon), tr("&Outside Loop"));
+ cmdActions[PianoCanvas::CMD_SELECT_OLOOP]->setData(PianoCanvas::CMD_SELECT_OLOOP);
+
+ menuConfig = mb->addMenu(tr("&Config"));
+ eventColor = menuConfig->addMenu(tr("event color"));
+ menu_ids[CMD_EVENT_COLOR] = eventColor->menuAction();
+
+ colorModeAction[0] = eventColor->addAction(tr("blue"));
+ colorModeAction[0]->setData(0);
+ colorModeAction[0]->setCheckable(true);
+ colorModeAction[1] = eventColor->addAction(tr("pitch colors"));
+ colorModeAction[1]->setData(1);
+ colorModeAction[1]->setCheckable(true);
+ colorModeAction[2] = eventColor->addAction(tr("velocity colors"));
+ colorModeAction[2]->setData(2);
+ colorModeAction[2]->setCheckable(true);
+ connect(eventColor, SIGNAL(triggered(QAction*)), SLOT(setEventColorMode(QAction*)));
+
+ menuFunctions = mb->addMenu(tr("&Functions"));
+ cmdActions[PianoCanvas::CMD_OVER_QUANTIZE] = menuFunctions->addAction(tr("Over Quantize"));
+ cmdActions[PianoCanvas::CMD_OVER_QUANTIZE]->setData(PianoCanvas::CMD_OVER_QUANTIZE);
+ cmdActions[PianoCanvas::CMD_ON_QUANTIZE] = menuFunctions->addAction(tr("Note On Quantize"));
+ cmdActions[PianoCanvas::CMD_ON_QUANTIZE]->setData(PianoCanvas::CMD_ON_QUANTIZE);
+ cmdActions[PianoCanvas::CMD_ONOFF_QUANTIZE] = menuFunctions->addAction(tr("Note On/Off Quantize"));
+ cmdActions[PianoCanvas::CMD_ONOFF_QUANTIZE]->setData(PianoCanvas::CMD_ONOFF_QUANTIZE);
+ cmdActions[PianoCanvas::CMD_ITERATIVE_QUANTIZE] = menuFunctions->addAction(tr("Iterative Quantize"));
+ cmdActions[PianoCanvas::CMD_ITERATIVE_QUANTIZE]->setData(PianoCanvas::CMD_ITERATIVE_QUANTIZE);
+
+ menuFunctions->addSeparator();
+
+ menu_ids[CMD_CONFIG_QUANT] = menuFunctions->addAction(tr("Config Quant..."));
+ connect(menu_ids[CMD_CONFIG_QUANT], SIGNAL(triggered()), this, SLOT(configQuant()));
+
+ menuFunctions->addSeparator();
+
+ cmdActions[PianoCanvas::CMD_MODIFY_GATE_TIME] = menuFunctions->addAction(tr("Modify Gate Time"));
+ cmdActions[PianoCanvas::CMD_MODIFY_GATE_TIME]->setData(PianoCanvas::CMD_MODIFY_GATE_TIME);
+
+ cmdActions[PianoCanvas::CMD_MODIFY_VELOCITY] = menuFunctions->addAction(tr("Modify Velocity"));
+ cmdActions[PianoCanvas::CMD_MODIFY_VELOCITY]->setData(PianoCanvas::CMD_MODIFY_VELOCITY);
+
+ cmdActions[PianoCanvas::CMD_CRESCENDO] = menuFunctions->addAction(tr("Crescendo"));
+ cmdActions[PianoCanvas::CMD_CRESCENDO]->setData(PianoCanvas::CMD_CRESCENDO);
+ cmdActions[PianoCanvas::CMD_CRESCENDO]->setEnabled(false);
+
+ cmdActions[PianoCanvas::CMD_TRANSPOSE] = menuFunctions->addAction(tr("Transpose"));
+ cmdActions[PianoCanvas::CMD_TRANSPOSE]->setData(PianoCanvas::CMD_TRANSPOSE);
+ cmdActions[PianoCanvas::CMD_TRANSPOSE]->setEnabled(false);
+
+ cmdActions[PianoCanvas::CMD_THIN_OUT] = menuFunctions->addAction(tr("Thin Out"));
+ cmdActions[PianoCanvas::CMD_THIN_OUT]->setData(PianoCanvas::CMD_THIN_OUT);
+ cmdActions[PianoCanvas::CMD_THIN_OUT]->setEnabled(false);
+
+ cmdActions[PianoCanvas::CMD_ERASE_EVENT] = menuFunctions->addAction(tr("Erase Event"));
+ cmdActions[PianoCanvas::CMD_ERASE_EVENT]->setData(PianoCanvas::CMD_ERASE_EVENT);
+ cmdActions[PianoCanvas::CMD_ERASE_EVENT]->setEnabled(false);
+
+ cmdActions[PianoCanvas::CMD_NOTE_SHIFT] = menuFunctions->addAction(tr("Note Shift"));
+ cmdActions[PianoCanvas::CMD_NOTE_SHIFT]->setData(PianoCanvas::CMD_NOTE_SHIFT);
+ cmdActions[PianoCanvas::CMD_NOTE_SHIFT]->setEnabled(false);
+
+ cmdActions[PianoCanvas::CMD_MOVE_CLOCK] = menuFunctions->addAction(tr("Move Clock"));
+ cmdActions[PianoCanvas::CMD_MOVE_CLOCK]->setData(PianoCanvas::CMD_MOVE_CLOCK);
+ cmdActions[PianoCanvas::CMD_MOVE_CLOCK]->setEnabled(false);
+
+ cmdActions[PianoCanvas::CMD_COPY_MEASURE] = menuFunctions->addAction(tr("Copy Measure"));
+ cmdActions[PianoCanvas::CMD_COPY_MEASURE]->setData(PianoCanvas::CMD_COPY_MEASURE);
+ cmdActions[PianoCanvas::CMD_COPY_MEASURE]->setEnabled(false);
+
+ cmdActions[PianoCanvas::CMD_ERASE_MEASURE] = menuFunctions->addAction(tr("Erase Measure"));
+ cmdActions[PianoCanvas::CMD_ERASE_MEASURE]->setData(PianoCanvas::CMD_ERASE_MEASURE);
+ cmdActions[PianoCanvas::CMD_ERASE_MEASURE]->setEnabled(false);
+
+ cmdActions[PianoCanvas::CMD_DELETE_MEASURE] = menuFunctions->addAction(tr("Delete Measure"));
+ cmdActions[PianoCanvas::CMD_DELETE_MEASURE]->setData(PianoCanvas::CMD_DELETE_MEASURE);
+ cmdActions[PianoCanvas::CMD_DELETE_MEASURE]->setEnabled(false);
+
+ cmdActions[PianoCanvas::CMD_CREATE_MEASURE] = menuFunctions->addAction(tr("Create Measure"));
+ cmdActions[PianoCanvas::CMD_CREATE_MEASURE]->setData(PianoCanvas::CMD_CREATE_MEASURE);
+ cmdActions[PianoCanvas::CMD_CREATE_MEASURE]->setEnabled(false);
+
+ connect(menuSelect, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+ connect(menuFunctions, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+
+ //---------ToolBar----------------------------------
+ tools = addToolBar(tr("Pianoroll Tools"));
+ tools->addAction(undoAction);
+ tools->addAction(redoAction);
+ tools->addSeparator();
+
+ tools->addAction(stepRecAction);
+ stepRecAction->setChecked(INIT_SREC);
+
+ tools->addAction(midiInAction);
+ midiInAction->setChecked(INIT_MIDIIN);
+
+ tools->addAction(speaker);
+ speaker->setChecked(INIT_SPEAKER);
+
+ tools->addAction(followSongAction);
+ followSongAction->setChecked(INIT_FOLLOW);
+ tcanvas->setFollow(INIT_FOLLOW);
+
+ tools2 = new EditToolBar(this, pianorollTools);
+ addToolBar(tools2);
+
+ QToolBar* panicToolbar = addToolBar(tr("Panic"));
+ panicToolbar->addAction(panicAction);
+
+ //-------------------------------------------------------------
+ // Transport Bar
+
+ QToolBar* transport = addToolBar(tr("Transport"));
+ muse->setupTransportToolbar(transport);
+
+ addToolBarBreak();
+ toolbar = new Toolbar1(initRaster, initQuant);
+ addToolBar(toolbar);
+
+ addToolBarBreak();
+ info = new NoteInfo(this);
+ addToolBar(info);
+
+ setCentralWidget(tcanvas);
+ tcanvas->setCornerWidget(new QSizeGrip(tcanvas));
+
+ connect(song, SIGNAL(posChanged(int,const AL::Pos&,bool)), canvas(), SLOT(setLocatorPos(int,const AL::Pos&,bool)));
+ connect(canvas(), SIGNAL(posChanged(int,const AL::Pos&)), SLOT(setPos(int,const AL::Pos&)));
+
+ connect(canvas(), SIGNAL(toolChanged(int)), tools2, SLOT(set(int)));
+ connect(tools2, SIGNAL(toolChanged(int)), canvas(), SLOT(setTool(int)));
+
+ connect(info, SIGNAL(valueChanged(NoteInfo::ValType, int)), SLOT(noteinfoChanged(NoteInfo::ValType, int)));
+
+ connect(canvas(), SIGNAL(selectionChanged(int, Event&, Part*)), this,
+ SLOT(setSelection(int, Event&, Part*)));
+
+ info->setEnabled(false);
+
+ setWindowTitle(canvas()->getCaption());
+ int s1, e;
+ canvas()->range(&s1, &e);
+ e += AL::sigmap.ticksMeasure(e); // show one more measure
+ canvas()->setTimeRange(s1, e);
+
+ // connect to toolbar
+ connect(canvas(), SIGNAL(pitchChanged(int)), toolbar, SLOT(setPitch(int)));
+ connect(canvas(), SIGNAL(yChanged(int)), toolbar, SLOT(setInt(int)));
+ connect(canvas(), SIGNAL(cursorPos(const AL::Pos&,bool)), toolbar, SLOT(setTime(const AL::Pos&,bool)));
+ connect(toolbar, SIGNAL(quantChanged(int)), SLOT(setQuant(int)));
+ connect(toolbar, SIGNAL(rasterChanged(int)),SLOT(setRaster(int)));
+ connect(toolbar, SIGNAL(toChanged(int)), SLOT(setApplyTo(int)));
+ connect(toolbar, SIGNAL(soloChanged(bool)), SLOT(soloChanged(bool)));
+
+ setEventColorMode(_colorMode);
+
+ clipboardChanged(); // enable/disable "Paste"
+ selectionChanged(); // enable/disable "Copy" & "Paste"
+ initShortcuts(); // initialize shortcuts
+
+ //
+ // install misc shortcuts
+ //
+ QShortcut* sc;
+ sc = new QShortcut(shortcuts[SHRT_POS_INC].key, this);
+ sc->setContext(Qt::WindowShortcut);
+ connect(sc, SIGNAL(activated()), SLOT(cmdRight()));
+
+ sc = new QShortcut(shortcuts[SHRT_POS_DEC].key, this);
+ sc->setContext(Qt::WindowShortcut);
+ connect(sc, SIGNAL(activated()), SLOT(cmdLeft()));
+
+ sc = new QShortcut(Qt::Key_Escape, this);
+ sc->setContext(Qt::WindowShortcut);
+
+ connect(sc, SIGNAL(activated()), SLOT(close()));
+ connect(song, SIGNAL(songChanged(int)), canvas(), SLOT(songChanged(int)));
+ connect(followSongAction, SIGNAL(toggled(bool)), canvas(), SLOT(setFollow(bool)));
+ canvas()->selectFirst();
+
+ Part* part = canvas()->part();
+ setRaster(part->raster() != -1 ? part->raster() : initRaster);
+ setQuant(part->quant() != -1 ? part->quant() : initQuant);
+ setXmag(part->xmag() != -1.0 ? part->xmag() : initXmag);
+
+ if (init)
+ initFromPart();
+ else {
+ resize(initWidth, initHeight);
+printf("resize %d %d\n", initWidth, initHeight);
+ }
+ }
+
+//---------------------------------------------------------
+// cmdLeft
+//---------------------------------------------------------
+
+void PianoRoll::cmdLeft()
+ {
+ canvas()->pianoCmd(MCMD_LEFT);
+ }
+
+//---------------------------------------------------------
+// cmdRight
+//---------------------------------------------------------
+
+void PianoRoll::cmdRight()
+ {
+ canvas()->pianoCmd(MCMD_RIGHT);
+ }
+
+//---------------------------------------------------------
+// configChanged
+//---------------------------------------------------------
+
+void PianoRoll::configChanged()
+ {
+ initShortcuts();
+ }
+
+//---------------------------------------------------------
+// cmd
+// pulldown menu commands
+//---------------------------------------------------------
+
+void PianoRoll::cmd(QAction* a)
+ {
+ int cmd = a->data().toInt();
+ canvas()->cmd(cmd, _quantStrength, _quantLimit, _quantLen);
+ }
+
+//---------------------------------------------------------
+// setSelection
+// update Info Line
+//---------------------------------------------------------
+
+void PianoRoll::setSelection(int tick, Event& e, Part* p)
+ {
+ int selections = canvas()->selectionSize();
+
+ selEvent = e;
+ selPart = p;
+
+ if (selections > 1) {
+ info->setEnabled(true);
+ info->setDeltaMode(true);
+ if (!deltaMode) {
+ deltaMode = true;
+ info->setValues(0, 0, 0, 0, 0);
+ tickOffset = 0;
+ lenOffset = 0;
+ pitchOffset = 0;
+ veloOnOffset = 0;
+ veloOffOffset = 0;
+ }
+ }
+ else if (selections == 1) {
+ deltaMode = false;
+ info->setEnabled(true);
+ info->setDeltaMode(false);
+ info->setValues(tick,
+ selEvent.lenTick(),
+ selEvent.pitch(),
+ selEvent.velo(),
+ selEvent.veloOff());
+ }
+ else {
+ deltaMode = false;
+ info->setEnabled(false);
+ }
+ selectionChanged();
+ }
+
+//---------------------------------------------------------
+// edit currently selected Event
+//---------------------------------------------------------
+
+void PianoRoll::noteinfoChanged(NoteInfo::ValType type, int val)
+ {
+ int selections = canvas()->selectionSize();
+
+ if (selections == 0) {
+ printf("noteinfoChanged while nothing selected\n");
+ }
+ else if (selections == 1) {
+ Event event = selEvent.clone();
+ switch(type) {
+ case NoteInfo::VAL_TIME:
+ event.setTick(val - selPart->tick());
+ break;
+ case NoteInfo::VAL_LEN:
+ event.setLenTick(val);
+ break;
+ case NoteInfo::VAL_VELON:
+ event.setVelo(val);
+ break;
+ case NoteInfo::VAL_VELOFF:
+ event.setVeloOff(val);
+ break;
+ case NoteInfo::VAL_PITCH:
+ event.setPitch(val);
+ break;
+ }
+ audio->msgChangeEvent(selEvent, event, selPart);
+ }
+ else {
+ // multiple events are selected; treat noteinfo values
+ // as offsets to event values
+
+ int delta = 0;
+ switch (type) {
+ case NoteInfo::VAL_TIME:
+ delta = val - tickOffset;
+ tickOffset = val;
+ break;
+ case NoteInfo::VAL_LEN:
+ delta = val - lenOffset;
+ lenOffset = val;
+ break;
+ case NoteInfo::VAL_VELON:
+ delta = val - veloOnOffset;
+ veloOnOffset = val;
+ break;
+ case NoteInfo::VAL_VELOFF:
+ delta = val - veloOffOffset;
+ veloOffOffset = val;
+ break;
+ case NoteInfo::VAL_PITCH:
+ delta = val - pitchOffset;
+ pitchOffset = val;
+ break;
+ }
+ if (delta)
+ canvas()->modifySelected(type, delta);
+ }
+ }
+
+//---------------------------------------------------------
+// soloChanged
+// signal from solo button
+//---------------------------------------------------------
+
+void PianoRoll::soloChanged(bool flag)
+ {
+ song->setSolo(canvas()->track(), flag);
+ }
+
+static int rasterTable[] = {
+ //-9----8- 7 6 5 4 3(1/4) 2 1
+ 4, 8, 16, 32, 64, 128, 256, 512, 1024, // triple
+ 6, 12, 24, 48, 96, 192, 384, 768, 1536,
+ 9, 18, 36, 72, 144, 288, 576, 1152, 2304 // dot
+ };
+
+//---------------------------------------------------------
+// viewKeyPressEvent
+//---------------------------------------------------------
+
+void PianoRoll::keyPressEvent(QKeyEvent* event)
+ {
+ if (info->hasFocus()) {
+ event->ignore();
+ return;
+ }
+
+ int index;
+ int n = sizeof(rasterTable)/sizeof(*rasterTable);
+ for (index = 0; index < n; ++index)
+ if (rasterTable[index] == raster())
+ break;
+ if (index == n) {
+ index = 0;
+ // raster 1 is not in table
+ }
+ int off = (index / 9) * 9;
+ index = index % 9;
+
+ int val = 0;
+
+ PianoCanvas* pc = canvas();
+ int key = event->key();
+
+ if (event->modifiers() & Qt::ShiftModifier)
+ key += Qt::SHIFT;
+ if (event->modifiers() & Qt::AltModifier)
+ key += Qt::ALT;
+ if (event->modifiers() & Qt::ControlModifier)
+ key+= Qt::CTRL;
+
+ if (key == shortcuts[SHRT_TOOL_POINTER].key) {
+ tools2->set(PointerTool);
+ return;
+ }
+ else if (key == shortcuts[SHRT_TOOL_PENCIL].key) {
+ tools2->set(PencilTool);
+ return;
+ }
+ else if (key == shortcuts[SHRT_TOOL_RUBBER].key) {
+ tools2->set(RubberTool);
+ return;
+ }
+ else if (key == shortcuts[SHRT_TOOL_LINEDRAW].key) {
+ tools2->set(DrawTool);
+ return;
+ }
+ else if (key == shortcuts[SHRT_INSERT_AT_LOCATION].key) {
+ pc->pianoCmd(MCMD_INSERT);
+ return;
+ }
+ else if (key == Qt::Key_Delete) {
+ pc->pianoCmd(MCMD_DELETE);
+ return;
+ }
+ else if (key == shortcuts[SHRT_SET_QUANT_1].key)
+ val = rasterTable[8 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_2].key)
+ val = rasterTable[7 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_3].key)
+ val = rasterTable[6 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_4].key)
+ val = rasterTable[5 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_5].key)
+ val = rasterTable[4 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_6].key)
+ val = rasterTable[3 + off];
+ else if (key == shortcuts[SHRT_SET_QUANT_7].key)
+ val = rasterTable[2 + off];
+ else if (key == shortcuts[SHRT_TOGGLE_TRIOL].key)
+ val = rasterTable[index + ((off == 0) ? 9 : 0)];
+ else if (key == shortcuts[SHRT_EVENT_COLOR].key) {
+ _colorMode = (_colorMode + 1) % 3;
+ setEventColorMode(_colorMode);
+ return;
+ }
+ else if (key == shortcuts[SHRT_TOGGLE_PUNCT].key)
+ val = rasterTable[index + ((off == 18) ? 9 : 18)];
+
+ else if (key == shortcuts[SHRT_TOGGLE_PUNCT2].key) {//CDW
+ if ((off == 18) && (index > 2)) {
+ val = rasterTable[index + 9 - 1];
+ }
+ else if ((off == 9) && (index < 8)) {
+ val = rasterTable[index + 18 + 1];
+ }
+ else
+ return;
+ }
+ else { //Default:
+ event->ignore();
+ return;
+ }
+
+ setQuant(val);
+ setRaster(val);
+ toolbar->setQuant(quant());
+ toolbar->setRaster(raster());
+ }
+
+//---------------------------------------------------------
+// configQuant
+//---------------------------------------------------------
+
+void PianoRoll::configQuant()
+ {
+ QuantConfig quantConfig(_quantStrength, _quantLimit, _quantLen, this);
+ if (!quantConfig.exec())
+ return;
+ _quantStrength = quantConfig.quantStrength();
+ _quantLimit = quantConfig.quantLimit();
+ _quantLen = quantConfig.doQuantLen();
+ }
+
+//---------------------------------------------------------
+// setEventColorMode
+//---------------------------------------------------------
+
+void PianoRoll::setEventColorMode(QAction* a)
+ {
+ setEventColorMode(a->data().toInt());
+ }
+
+void PianoRoll::setEventColorMode(int mode)
+ {
+ _colorMode = mode;
+ for (int i = 0; i < 3; ++i)
+ colorModeAction[i]->setChecked(mode == i);
+ canvas()->setColorMode(mode);
+ }
+
+//---------------------------------------------------------
+// initShortcuts
+//---------------------------------------------------------
+
+void PianoRoll::initShortcuts()
+ {
+ cmdActions[PianoCanvas::CMD_SELECT_NONE]->setShortcut(shortcuts[SHRT_SELECT_ALL].key);
+ cmdActions[PianoCanvas::CMD_SELECT_NONE]->setShortcut(shortcuts[SHRT_SELECT_NONE].key);
+ cmdActions[PianoCanvas::CMD_SELECT_INVERT]->setShortcut(shortcuts[SHRT_SELECT_INVERT].key);
+ cmdActions[PianoCanvas::CMD_SELECT_ILOOP]->setShortcut(shortcuts[SHRT_SELECT_ILOOP].key);
+ cmdActions[PianoCanvas::CMD_SELECT_OLOOP]->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key);
+
+ menu_ids[CMD_EVENT_COLOR]->setShortcut(shortcuts[SHRT_EVENT_COLOR].key);
+
+ cmdActions[PianoCanvas::CMD_OVER_QUANTIZE]->setShortcut(shortcuts[SHRT_OVER_QUANTIZE].key);
+ cmdActions[PianoCanvas::CMD_ON_QUANTIZE]->setShortcut(shortcuts[SHRT_ON_QUANTIZE].key);
+ cmdActions[PianoCanvas::CMD_ONOFF_QUANTIZE]->setShortcut(shortcuts[SHRT_ONOFF_QUANTIZE].key);
+ cmdActions[PianoCanvas::CMD_ITERATIVE_QUANTIZE]->setShortcut(shortcuts[SHRT_ITERATIVE_QUANTIZE].key);
+ cmdActions[PianoCanvas::CMD_MODIFY_GATE_TIME]->setShortcut(shortcuts[SHRT_MODIFY_GATE_TIME].key);
+ cmdActions[PianoCanvas::CMD_MODIFY_VELOCITY]->setShortcut(shortcuts[SHRT_MODIFY_VELOCITY].key);
+ cmdActions[PianoCanvas::CMD_CRESCENDO]->setShortcut(shortcuts[SHRT_CRESCENDO].key);
+ cmdActions[PianoCanvas::CMD_TRANSPOSE]->setShortcut(shortcuts[SHRT_TRANSPOSE].key);
+ cmdActions[PianoCanvas::CMD_THIN_OUT]->setShortcut(shortcuts[SHRT_THIN_OUT].key);
+ cmdActions[PianoCanvas::CMD_ERASE_EVENT]->setShortcut(shortcuts[SHRT_ERASE_EVENT].key);
+ cmdActions[PianoCanvas::CMD_NOTE_SHIFT]->setShortcut(shortcuts[SHRT_NOTE_SHIFT].key);
+ cmdActions[PianoCanvas::CMD_MOVE_CLOCK]->setShortcut(shortcuts[SHRT_MOVE_CLOCK].key);
+ cmdActions[PianoCanvas::CMD_COPY_MEASURE]->setShortcut(shortcuts[SHRT_COPY_MEASURE].key);
+ cmdActions[PianoCanvas::CMD_ERASE_MEASURE]->setShortcut(shortcuts[SHRT_ERASE_MEASURE].key);
+ cmdActions[PianoCanvas::CMD_DELETE_MEASURE]->setShortcut(shortcuts[SHRT_DELETE_MEASURE].key);
+ cmdActions[PianoCanvas::CMD_CREATE_MEASURE]->setShortcut(shortcuts[SHRT_CREATE_MEASURE].key);
+
+ menu_ids[CMD_CONFIG_QUANT]->setShortcut(shortcuts[SHRT_CONFIG_QUANT].key);
+ }
+
+//---------------------------------------------------------
+// readConfiguration
+// read static init values
+//---------------------------------------------------------
+
+void PianoRoll::readConfiguration(QDomNode node)
+ {
+ for (node = node.firstChild(); !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ int i = e.text().toInt();
+ if (tag == "width")
+ PianoRoll::initWidth = i;
+ else if (tag == "height")
+ PianoRoll::initHeight = i;
+ else if (tag == "raster")
+ PianoRoll::initRaster = i;
+ else if (tag == "quant")
+ PianoRoll::initQuant = i;
+ else
+ printf("MusE:PianoRoll: unknown tag %s\n", tag.toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// writeConfiguration
+// write static init values
+//---------------------------------------------------------
+
+void PianoRoll::writeConfiguration(Xml& xml)
+ {
+ xml.tag("PianoRoll");
+ if (PianoRoll::initWidth != PianoRoll::INIT_WIDTH)
+ xml.intTag("width", PianoRoll::initWidth);
+ if (PianoRoll::initHeight != PianoRoll::INIT_HEIGHT)
+ xml.intTag("height", PianoRoll::initHeight);
+ if (PianoRoll::initRaster != PianoRoll::INIT_RASTER)
+ xml.intTag("raster", PianoRoll::initRaster);
+ if (PianoRoll::initQuant != PianoRoll::INIT_QUANT)
+ xml.intTag("quant", PianoRoll::initQuant);
+ xml.etag("PianoRoll");
+ }
+
diff --git a/muse/muse/midiedit/pianoroll.h b/muse/muse/midiedit/pianoroll.h
new file mode 100644
index 00000000..a5952964
--- /dev/null
+++ b/muse/muse/midiedit/pianoroll.h
@@ -0,0 +1,120 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: pianoroll.h,v 1.39 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __PIANOROLL_H__
+#define __PIANOROLL_H__
+
+#include "midieditor.h"
+#include "prcanvas.h"
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+class PianoCanvas;
+class PartList;
+class QuantConfig;
+class Part;
+class TimeCanvas;
+
+//---------------------------------------------------------
+// PianoRoll
+//---------------------------------------------------------
+
+class PianoRoll : public MidiEditor {
+ Q_OBJECT
+
+ Q_PROPERTY(int colorMode READ colorMode WRITE setColorMode)
+ Q_PROPERTY(int quantStrength READ quantStrength WRITE setQuantStrength)
+ Q_PROPERTY(int quantLimit READ quantLimit WRITE setQuantLimit)
+ Q_PROPERTY(bool quantLen READ quantLen WRITE setQuantLen)
+
+ int _quantStrength, _quantLimit;
+ bool _quantLen;
+ int _colorMode;
+
+ Event selEvent;
+
+ enum { CMD_EVENT_COLOR, CMD_CONFIG_QUANT, CMD_LAST };
+
+ QAction* menu_ids[CMD_LAST];
+ QMenu *menuFunctions, *menuSelect, *menuConfig;
+
+ int tickOffset;
+ int lenOffset;
+ int pitchOffset;
+ int veloOnOffset;
+ int veloOffOffset;
+ bool deltaMode;
+
+ QAction* colorModeAction[3];
+ QAction* cmdActions[PianoCanvas::CMD_END];
+
+ QMenu* eventColor;
+
+ QuantConfig* quantConfig;
+ void initShortcuts();
+
+ QWidget* genToolbar(QWidget* parent);
+ virtual void keyPressEvent(QKeyEvent*);
+ void setEventColorMode(int);
+ PianoCanvas* canvas() { return (PianoCanvas*)tcanvas; }
+ const PianoCanvas* canvas() const { return (PianoCanvas*)tcanvas; }
+
+ private slots:
+ void setSelection(int, Event&, Part*);
+ void noteinfoChanged(NoteInfo::ValType, int);
+ void soloChanged(bool flag);
+ void configQuant();
+
+ virtual void cmd(QAction*);
+ void setEventColorMode(QAction*);
+ void configChanged();
+ void cmdLeft();
+ void cmdRight();
+
+ public:
+ PianoRoll(PartList*, bool);
+ ~PianoRoll() {}
+
+ int colorMode() const { return _colorMode; }
+ void setColorMode(int val) { _colorMode = val; }
+ int quantStrength() const { return _quantStrength; }
+ int quantLimit() const { return _quantLimit; }
+ bool quantLen() const { return _quantLen; }
+ void setQuantStrength(int val) { _quantStrength = val; }
+ void setQuantLimit(int val) { _quantLimit = val; }
+ void setQuantLen(bool val) { _quantLen = val; }
+
+ static void readConfiguration(QDomNode);
+ static void writeConfiguration(Xml&);
+ static int initRaster, initQuant, initWidth, initHeight;
+ static bool initFollow, initSpeaker, initMidiin;
+ static int initColorMode, initApplyTo;
+ static double initXmag;
+ static int initQuantStrength, initQuantLimit;
+ static bool initQuantLen;
+
+ static const int INIT_WIDTH = 650;
+ static const int INIT_HEIGHT = 450;
+ static const int INIT_RASTER = 384 / 2;
+ static const int INIT_QUANT = 384 / 2;
+ static const bool INIT_FOLLOW = false;
+ static const bool INIT_SPEAKER = true;
+ static const bool INIT_MIDIIN = false;
+ static const bool INIT_SREC = false;
+ static const bool INIT_COLOR_MODE = 0;
+ static const double INIT_XMAG = 0.08;
+ static const int INIT_APPLY_TO = 0;
+ static const int INIT_QUANT_STRENGTH = 100;
+ static const int INIT_QUANT_LIMIT = 0;
+ static const int INIT_QUANT_LEN = false;
+ };
+
+#endif
+
diff --git a/muse/muse/midiedit/prcanvas.cpp b/muse/muse/midiedit/prcanvas.cpp
new file mode 100644
index 00000000..68ce66e9
--- /dev/null
+++ b/muse/muse/midiedit/prcanvas.cpp
@@ -0,0 +1,841 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: prcanvas.cpp,v 1.71 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "midieditor.h"
+#include "prcanvas.h"
+#include "cmd.h"
+#include "widgets/gatetime.h"
+#include "widgets/velocity.h"
+#include "song.h"
+#include "audio.h"
+#include "part.h"
+
+//---------------------------------------------------------
+// PianoCanvas
+//---------------------------------------------------------
+
+PianoCanvas::PianoCanvas(MidiEditor* pr)
+ : EventCanvas(pr, TIME_CANVAS_PIANOROLL)
+ {
+ verticalScrollBar()->setSingleStep(keyHeight/2);
+ playedPitch = -1;
+ colorMode = 0;
+ canvasTools = PointerTool | PencilTool | RubberTool | DrawTool;
+
+ songChanged(SC_TRACK_INSERTED);
+ }
+
+//---------------------------------------------------------
+// addItem
+//---------------------------------------------------------
+
+void PianoCanvas::addItem(Part* part, const Event& event)
+ {
+ CItem* item = new CItem(event, part);
+ int y = pitch2y(event.pitch()) + keyHeight/4 + wpos.y();
+ item->pos = event.pos() + *part;
+ unsigned time = item->pos.time(timeType());
+ item->bbox = QRect(time, y, event.lenTick(), keyHeight/2);
+ items.add(item);
+ }
+
+//---------------------------------------------------------
+// timeTypeChanged
+//---------------------------------------------------------
+
+void PianoCanvas::timeTypeChanged()
+ {
+ //
+ // recalculate bounding boxes
+ //
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ CItem* item = i->second;
+ unsigned t1 = item->event.pos().time(timeType());
+ unsigned t2 = item->event.end().time(timeType());
+ item->bbox.setX(t1 + (item->part)->time(timeType()));
+ item->bbox.setWidth(t2 - t1);
+ }
+ }
+
+//---------------------------------------------------------
+// paint
+//---------------------------------------------------------
+
+void PianoCanvas::paint(QPainter& p, QRect cr)
+ {
+ static QColor color1[12] = {
+ QColor(0xff, 0x3d, 0x39),
+ QColor(0x39, 0xff, 0x39),
+ QColor(0x39, 0x3d, 0xff),
+ QColor(0xff, 0xff, 0x39),
+ QColor(0xff, 0x3d, 0xff),
+ QColor(0x39, 0xff, 0xff),
+ QColor(0xff, 0x7e, 0x7a),
+ QColor(0x7a, 0x7e, 0xff),
+ QColor(0x7a, 0xff, 0x7a),
+ QColor(0xff, 0x7e, 0xbf),
+ QColor(0x7a, 0xbf, 0xff),
+ QColor(0xff, 0xbf, 0x7a)
+ };
+
+ QPoint off(MAP_OFFSET - wpos.x(), -wpos.y());
+ p.translate(off);
+ cr.translate(-off);
+
+ int time1 = lrint(cr.x() / _xmag);
+ int w = lrint(cr.width() / _xmag);
+ cr.setRect(
+ time1,
+ lrint(cr.y() / _ymag),
+ w,
+ lrint(cr.height() / _ymag)
+ );
+ p.scale(_xmag, _ymag);
+
+ int time2 = time1 + w;
+
+ //---------------------------------------------------
+ // draw Canvas Items
+ //---------------------------------------------------
+
+ p.setPen(QPen(Qt::black, 0.0));
+
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ CItem* item = i->second;
+ QRect r(item->bbox);
+ if (r.x() >= time2)
+ break;
+ if (!cr.intersects(r))
+ continue;
+ Event event(item->event);
+
+ QColor color;
+ if (item->part != curPart)
+ p.setBrush(Qt::lightGray);
+ else {
+ if (item->isMoving) {
+ p.setBrush(Qt::gray);
+ p.drawRect(r);
+ p.setBrush(Qt::NoBrush);
+ int x = item->moving.tick();
+ int y = item->my + item->bbox.height()/2;
+ int w = item->bbox.width();
+ int h = item->bbox.height();
+ p.drawRect(x, y, w, h);
+ }
+ else if (item->isSelected()) {
+ p.setBrush(Qt::black);
+ }
+ else {
+ if (colorMode == 1)
+ color = color1[event.pitch() % 12];
+ else if (colorMode == 2) {
+ int velo = event.velo();
+ if (velo < 64)
+ color.setRgb(velo*4, 0, 0xff);
+ else
+ color.setRgb(0xff, 0, (127-velo) * 4);
+ }
+ else
+ color.setRgb(0, 0, 255);
+ p.setBrush(color);
+ }
+ }
+ p.drawRect(r);
+ }
+
+ //---------------------------------------------------
+ // draw lasso
+ //---------------------------------------------------
+
+ p.resetMatrix();
+ p.translate(rCanvasA.topLeft());
+
+ if (drag == DRAG_LASSO) {
+ p.setPen(Qt::blue);
+ p.setBrush(Qt::NoBrush);
+ p.drawRect(lasso);
+ }
+ }
+
+//---------------------------------------------------------
+// viewMouseDoubleClickEvent
+//---------------------------------------------------------
+
+void PianoCanvas::viewMouseDoubleClickEvent(QMouseEvent* event)
+ {
+ if ((_tool != PointerTool) && (event->button() != Qt::LeftButton)) {
+// mousePress(event);
+ return;
+ }
+ }
+
+//---------------------------------------------------------
+// moveItem
+// called after moving an object
+//---------------------------------------------------------
+
+void PianoCanvas::moveItem(CItem* item, DragType dtype)
+ {
+ Part* part = item->part;
+ Event event = item->event;
+ int npitch = y2pitch(item->my - wpos.y() + item->bbox.height()/2);
+ if (event.pitch() != npitch && editor->playEvents()) {
+ // release note:
+ MidiEvent ev1(0, 0, 0x90, event.pitch() + track()->transposition, 0);
+ track()->playMidiEvent(&ev1);
+ MidiEvent ev2(0, 0, 0x90, npitch + track()->transposition, event.velo());
+ track()->playMidiEvent(&ev2);
+ }
+
+ Event newEvent = event.clone();
+ newEvent.setPitch(npitch);
+ newEvent.setPos(item->moving - *part);
+
+ if (dtype == MOVE_COPY)
+ audio->msgAddEvent(newEvent, part, false);
+ else
+ audio->msgChangeEvent(event, newEvent, part, false);
+ }
+
+//---------------------------------------------------------
+// newItem(p, state)
+//---------------------------------------------------------
+
+CItem* PianoCanvas::newItem(const QPoint& p, int)
+ {
+ Pos opos(pix2pos(p.x()));
+ Pos pos(opos);
+ pos.downSnap(raster());
+
+ if (pos < partPos1 || pos >= partPos2)
+ return 0;
+
+ int pitch = y2pitch(p.y());
+ Event e(Note);
+ e.setPitch(pitch);
+ e.setVelo(curVelo);
+ e.setPos(pos - *curPart);
+
+ CItem* i = new CItem(e, curPart);
+ int l = timeType() == AL::TICKS ? e.lenTick() : e.lenFrame();
+ int x = pos.time(timeType());
+ int y = pitch2y(pitch) + keyHeight/4 + wpos.y();
+ i->bbox = QRect(x, y, l, keyHeight/2);
+
+ return i;
+ }
+
+void PianoCanvas::newItem(CItem* item, bool noSnap)
+ {
+ Event event = item->event;
+ Pos p1(item->bbox.x(), timeType());
+ Pos p2(item->bbox.x() + item->bbox.width(), timeType());
+ int tickLen;
+
+ if (noSnap)
+ tickLen = p2.tick() - p1.tick();
+ else {
+ p1.downSnap(raster());
+ tickLen = editor->quantVal(p2.tick() - p1.tick());
+ }
+
+ Part* part = item->part;
+ event.setPos(p1 - *part);
+ event.setLenTick(tickLen);
+ audio->msgAddEvent(event, part);
+ }
+
+//---------------------------------------------------------
+// resizeItem
+//---------------------------------------------------------
+
+void PianoCanvas::resizeItem(CItem* item, bool noSnap)
+ {
+ Event event = item->event;
+ Event newEvent = event.clone();
+ int len;
+ if (noSnap)
+ len = item->bbox.width();
+ else
+ len = editor->quantVal(item->bbox.width());
+ newEvent.setLenTick(len);
+ audio->msgChangeEvent(event, newEvent, item->part);
+ }
+
+//---------------------------------------------------------
+// deleteItem
+//---------------------------------------------------------
+
+bool PianoCanvas::deleteItem(CItem* item)
+ {
+ if (item->part == curPart) {
+ Event ev = item->event;
+ audio->msgDeleteEvent(ev, curPart);
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// pianoCmd
+//---------------------------------------------------------
+
+void PianoCanvas::pianoCmd(int cmd)
+ {
+ switch(cmd) {
+ case MCMD_LEFT:
+ {
+ int frames = pos[0].tick() - editor->rasterStep(pos[0].tick());
+ if (frames < 0)
+ frames = 0;
+ Pos p(frames, AL::TICKS);
+ song->setPos(0, p, true, true, true); //CDW
+ }
+ break;
+ case MCMD_RIGHT:
+ {
+ Pos p(pos[0].tick() + editor->rasterStep(pos[0].tick()), AL::TICKS);
+ //if (p > part->tick())
+ // p = part->tick();
+ song->setPos(0, p, true, true, true); //CDW
+ }
+ break;
+ case MCMD_INSERT:
+ {
+ if (pos[0].tick() < startTick || pos[0].tick() >= endTick)
+ break;
+ Part* part = curPart;
+
+ if (part == 0)
+ break;
+ song->startUndo();
+ EventList* el = part->events();
+
+ std::list <Event> elist;
+ for (iEvent e = el->lower_bound(pos[0].tick() - part->tick()); e != el->end(); ++e)
+ elist.push_back((Event)e->second);
+ for (std::list<Event>::iterator i = elist.begin(); i != elist.end(); ++i) {
+ Event event = *i;
+ Event newEvent = event.clone();
+ newEvent.setTick(event.tick() + editor->raster());
+ audio->msgChangeEvent(event, newEvent, part, false);
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ Pos p(editor->rasterVal(pos[0].tick() + editor->rasterStep(pos[0].tick())), AL::TICKS);
+ song->setPos(0, p, true, false, true);
+ }
+ return;
+ case MCMD_DELETE:
+ if (pos[0].tick() < startTick || pos[0].tick() >= endTick)
+ break;
+ {
+ Part* part = curPart;
+ if (part == 0)
+ break;
+ song->startUndo();
+ EventList* el = part->events();
+
+ std::list<Event> elist;
+ for (iEvent e = el->lower_bound(pos[0].tick()); e != el->end(); ++e)
+ elist.push_back((Event)e->second);
+ for (std::list<Event>::iterator i = elist.begin(); i != elist.end(); ++i) {
+ Event event = *i;
+ Event newEvent = event.clone();
+ newEvent.setTick(event.tick() - editor->raster() - part->tick());
+ audio->msgChangeEvent(event, newEvent, part, false);
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ Pos p(editor->rasterVal(pos[0].tick() - editor->rasterStep(pos[0].tick())), AL::TICKS);
+ song->setPos(0, p, true, false, true);
+ }
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// cmd
+// pulldown menu commands
+//---------------------------------------------------------
+
+void PianoCanvas::cmd(int cmd, int quantStrength, int quantLimit, bool quantLen)
+ {
+ switch (cmd) {
+ case CMD_PASTE:
+ paste();
+ break;
+ case CMD_DEL:
+ if (selectionSize()) {
+ song->startUndo();
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ if (!i->second->isSelected())
+ continue;
+ Event ev = i->second->event;
+ audio->msgDeleteEvent(ev, i->second->part, false);
+ }
+ song->endUndo(SC_EVENT_REMOVED);
+ }
+ return;
+ case CMD_OVER_QUANTIZE: // over quantize
+ quantize(100, 1, quantLen);
+ break;
+ case CMD_ON_QUANTIZE: // note on quantize
+ quantize(50, 1, false);
+ break;
+ case CMD_ONOFF_QUANTIZE: // note on/off quantize
+ quantize(50, 1, true);
+ break;
+ case CMD_ITERATIVE_QUANTIZE: // Iterative Quantize
+ quantize(quantStrength, quantLimit, quantLen);
+ break;
+ case CMD_SELECT_ALL: // select all
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ if (!k->second->isSelected())
+ selectItem(k->second, true);
+ }
+ break;
+ case CMD_SELECT_NONE: // select none
+ deselectAll();
+ break;
+ case CMD_SELECT_INVERT: // invert selection
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ selectItem(k->second, !k->second->isSelected());
+ }
+ break;
+ case CMD_SELECT_ILOOP: // select inside loop
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ CItem* item = k->second;
+ Event event = item->event;
+ unsigned tick = event.tick();
+ if (tick < song->lpos() || tick >= song->rpos())
+ selectItem(k->second, false);
+ else
+ selectItem(k->second, true);
+ }
+ break;
+ case CMD_SELECT_OLOOP: // select outside loop
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ CItem* item = k->second;
+ Event event = item->event;
+ unsigned tick = event.tick();
+ if (tick < song->lpos() || tick >= song->rpos())
+ selectItem(k->second, true);
+ else
+ selectItem(k->second, false);
+ }
+ break;
+ case CMD_MODIFY_GATE_TIME:
+ {
+ GateTime w(this);
+ w.setRange(editor->applyTo());
+ if (!w.exec())
+ break;
+ int range = w.range(); // all, selected, looped, sel+loop
+ int rate = w.rateVal();
+ int offset = w.offsetVal();
+ editor->setApplyTo(range);
+
+ song->startUndo();
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ CItem* item = k->second;
+ Event event = item->event;
+ if (event.type() != Note)
+ continue;
+ unsigned tick = event.tick();
+ bool selected = k->second->isSelected();
+ bool inLoop = (tick >= song->lpos()) && (tick < song->rpos());
+
+ if ((range == 0)
+ || (range == 1 && selected)
+ || (range == 2 && inLoop)
+ || (range == 3 && selected && inLoop)) {
+ unsigned len = event.lenTick();
+
+ len = rate ? (len * 100) / rate : 1;
+ len += offset;
+ if (len <= 1)
+ len = 1;
+
+ if (event.lenTick() != len) {
+ Event newEvent = event.clone();
+ newEvent.setLenTick(len);
+ audio->msgChangeEvent(event, newEvent, item->part, false);
+ }
+ }
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ }
+ break;
+
+ case CMD_MODIFY_VELOCITY:
+ {
+ Velocity w(this);
+ w.setRange(editor->applyTo());
+ if (!w.exec())
+ break;
+ int range = w.range(); // all, selected, looped, sel+loop
+ int rate = w.rateVal();
+ int offset = w.offsetVal();
+
+ song->startUndo();
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ CItem* item = k->second;
+ Event event = item->event;
+ if (event.type() != Note)
+ continue;
+ unsigned tick = event.tick();
+ bool selected = k->second->isSelected();
+ bool inLoop = (tick >= song->lpos()) && (tick < song->rpos());
+
+ if ((range == 0)
+ || (range == 1 && selected)
+ || (range == 2 && inLoop)
+ || (range == 3 && selected && inLoop)) {
+ int velo = event.velo();
+
+ //velo = rate ? (velo * 100) / rate : 64;
+ velo = (velo * rate) / 100;
+ velo += offset;
+
+ if (velo <= 0)
+ velo = 1;
+ if (velo > 127)
+ velo = 127;
+ if (event.velo() != velo) {
+ Event newEvent = event.clone();
+ newEvent.setVelo(velo);
+ audio->msgChangeEvent(event, newEvent, item->part, false);
+ }
+ }
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ }
+ break;
+
+ case CMD_CRESCENDO:
+ case CMD_TRANSPOSE:
+ case CMD_THIN_OUT:
+ case CMD_ERASE_EVENT:
+ case CMD_NOTE_SHIFT:
+ case CMD_MOVE_CLOCK:
+ case CMD_COPY_MEASURE:
+ case CMD_ERASE_MEASURE:
+ case CMD_DELETE_MEASURE:
+ case CMD_CREATE_MEASURE:
+ break;
+ default:
+// printf("unknown ecanvas cmd %d\n", cmd);
+ break;
+ }
+ updateSelection();
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// quantize
+//---------------------------------------------------------
+
+void PianoCanvas::quantize(int strength, int limit, bool quantLen)
+ {
+ song->startUndo();
+ for (iCItem k = items.begin(); k != items.end(); ++k) {
+ CItem* item = k->second;
+ Event event = item->event;
+ Part* part = item->part;
+ if (event.type() != Note)
+ continue;
+
+ if ((editor->applyTo() & CMD_RANGE_SELECTED) && !k->second->isSelected())
+ continue;
+
+ unsigned tick = event.tick() + part->tick();
+
+ if ((editor->applyTo() & CMD_RANGE_LOOP)
+ && ((tick < song->lpos() || tick >= song->rpos())))
+ continue;
+
+ unsigned len = event.lenTick();
+ int tick2 = tick + len;
+
+ // quant start position
+ int diff = editor->rasterVal(tick) - tick;
+ if (abs(diff) > limit)
+ tick += ((diff * strength) / 100);
+
+ // quant len
+ diff = editor->rasterVal(tick2) - tick2;
+ if (quantLen && (abs(diff) > limit))
+ len += ((diff * strength) / 100);
+
+ // something changed?
+ if (((event.tick() + part->tick()) != tick) || (event.lenTick() != len)) {
+ Event newEvent = event.clone();
+ newEvent.setTick(tick - part->tick());
+ newEvent.setLenTick(len);
+ audio->msgChangeEvent(event, newEvent, part, false);
+ }
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ }
+
+//---------------------------------------------------------
+// paste
+// paste events
+//---------------------------------------------------------
+
+void PianoCanvas::paste()
+ {
+ QString stype("x-muse-eventlist");
+ QString s = QApplication::clipboard()->text(stype, QClipboard::Selection);
+ pasteAt(s, song->cpos());
+ }
+
+//---------------------------------------------------------
+// startDrag
+//---------------------------------------------------------
+
+void PianoCanvas::startDrag(CItem* /*item*/, bool /*copymode*/)
+ {
+ QMimeData* drag = getTextDrag();
+ if (drag) {
+ QApplication::clipboard()->setMimeData(drag);
+#if 0
+ if (copymode)
+ drag->dragCopy();
+ else
+ drag->dragMove();
+#endif
+ }
+ }
+
+//---------------------------------------------------------
+// dragEnterEvent
+//---------------------------------------------------------
+
+void PianoCanvas::dragEnterEvent(QDragEnterEvent*)
+ {
+//TD event->accept(Q3TextDrag::canDecode(event));
+ }
+
+//---------------------------------------------------------
+// dragMoveEvent
+//---------------------------------------------------------
+
+void PianoCanvas::dragMoveEvent(QDragMoveEvent*)
+ {
+// printf("drag move %x\n", this);
+ }
+
+//---------------------------------------------------------
+// dragLeaveEvent
+//---------------------------------------------------------
+
+void PianoCanvas::dragLeaveEvent(QDragLeaveEvent*)
+ {
+// printf("drag leave\n");
+ }
+
+//---------------------------------------------------------
+// dropEvent
+//---------------------------------------------------------
+
+void PianoCanvas::viewDropEvent(QDropEvent*)
+ {
+#if 0 //TD
+ QString text;
+ if (event->source() == this) {
+ printf("local DROP\n");
+ return;
+ }
+ if (Q3TextDrag::decode(event, text)) {
+ int x = editor->rasterVal(event->pos().x());
+ if (x < 0)
+ x = 0;
+ pasteAt(text, x);
+ }
+ else {
+ printf("cannot decode drop\n");
+ }
+#endif
+ }
+
+
+//---------------------------------------------------------
+// itemPressed
+//---------------------------------------------------------
+
+void PianoCanvas::itemPressed(const CItem* item)
+ {
+ if (!editor->playEvents())
+ return;
+ Event event = item->event;
+ playedPitch = event.pitch() + track()->transposition;
+ int velo = event.velo();
+
+ // play note:
+ MidiEvent e(0, 0, 0x90, playedPitch, velo);
+ track()->playMidiEvent(&e);
+ }
+
+//---------------------------------------------------------
+// itemReleased
+//---------------------------------------------------------
+
+void PianoCanvas::itemReleased()
+ {
+ if (!editor->playEvents())
+ return;
+
+ // release note:
+ MidiEvent ev(0, 0, 0x90, playedPitch, 0);
+ track()->playMidiEvent(&ev);
+ playedPitch = -1;
+ }
+
+//---------------------------------------------------------
+// itemMoved
+//---------------------------------------------------------
+
+void PianoCanvas::itemMoved(const CItem* item)
+ {
+ int npitch = y2pitch(item->my + wpos.y());
+ if ((playedPitch != -1) && (playedPitch != npitch)) {
+ Event event = item->event;
+ // release note:
+ MidiEvent ev1(0, 0, 0x90, playedPitch, 0);
+ track()->playMidiEvent(&ev1);
+ // play note:
+ MidiEvent e2(0, 0, 0x90, npitch + track()->transposition, event.velo());
+ track()->playMidiEvent(&e2);
+ playedPitch = npitch + track()->transposition;
+ }
+ }
+
+//---------------------------------------------------------
+// modifySelected
+//---------------------------------------------------------
+
+void PianoCanvas::modifySelected(NoteInfo::ValType type, int delta)
+ {
+ audio->msgIdle(true);
+ song->startUndo();
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ if (!(i->second->isSelected()))
+ continue;
+ CItem* e = i->second;
+ Event event = e->event;
+ if (event.type() != Note)
+ continue;
+
+ Part* part = e->part;
+ Event newEvent = event.clone();
+
+ switch (type) {
+ case NoteInfo::VAL_TIME:
+ {
+ int newTime = event.tick() + delta;
+ if (newTime < 0)
+ newTime = 0;
+ newEvent.setTick(newTime);
+ }
+ break;
+ case NoteInfo::VAL_LEN:
+ {
+ int len = event.lenTick() + delta;
+ if (len < 1)
+ len = 1;
+ newEvent.setLenTick(len);
+ }
+ break;
+ case NoteInfo::VAL_VELON:
+ {
+ int velo = event.velo() + delta;
+ if (velo > 127)
+ velo = 127;
+ else if (velo < 0)
+ velo = 0;
+ newEvent.setVelo(velo);
+ }
+ break;
+ case NoteInfo::VAL_VELOFF:
+ {
+ int velo = event.veloOff() + delta;
+ if (velo > 127)
+ velo = 127;
+ else if (velo < 0)
+ velo = 0;
+ newEvent.setVeloOff(velo);
+ }
+ break;
+ case NoteInfo::VAL_PITCH:
+ {
+ int pitch = event.pitch() + delta;
+ if (pitch > 127)
+ pitch = 127;
+ else if (pitch < 0)
+ pitch = 0;
+ newEvent.setPitch(pitch);
+ }
+ break;
+ }
+ song->changeEvent(event, newEvent, part);
+ song->undoOp(UndoOp::ModifyEvent, newEvent, event, part);
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ audio->msgIdle(false);
+ }
+
+//---------------------------------------------------------
+// setColorMode
+//---------------------------------------------------------
+
+void PianoCanvas::setColorMode(int mode)
+ {
+ colorMode = mode;
+ widget()->update();
+ }
+
+//---------------------------------------------------------
+// searchItem
+//---------------------------------------------------------
+
+CItem* PianoCanvas::searchItem(const QPoint& pt) const
+ {
+ QPoint p(
+ lrint((pt.x() - MAP_OFFSET + wpos.x()) / _xmag),
+ lrint((pt.y() + wpos.y()) / _ymag)
+ );
+ return items.find(p);
+ }
+
+//---------------------------------------------------------
+// selectLasso
+//---------------------------------------------------------
+
+void PianoCanvas::selectLasso(bool toggle)
+ {
+ QRect r(
+// lrint((lasso.x() - MAP_OFFSET + wpos.x()) / _xmag),
+ lrint((lasso.x() + wpos.x()) / _xmag),
+ lrint((lasso.y() + wpos.y()) / _ymag),
+ lrint(lasso.width() / _xmag),
+ lrint(lasso.height() / _ymag)
+ );
+
+ int n = 0;
+ for (iCItem i = items.begin(); i != items.end(); ++i) {
+ if (i->second->intersects(r)) {
+ selectItem(i->second, !(toggle && i->second->isSelected()));
+ ++n;
+ }
+ }
+ if (n) {
+ updateSelection();
+ widget()->update();
+ }
+ }
+
diff --git a/muse/muse/midiedit/prcanvas.h b/muse/muse/midiedit/prcanvas.h
new file mode 100644
index 00000000..147b0bee
--- /dev/null
+++ b/muse/muse/midiedit/prcanvas.h
@@ -0,0 +1,72 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: prcanvas.h,v 1.36 2006/02/08 17:33:41 wschweer Exp $
+// (C) Copyright 1999-2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __PRCANVAS_H__
+#define __PRCANVAS_H__
+
+#include "ecanvas.h"
+
+class CItem;
+
+//---------------------------------------------------------
+// PianoCanvas
+//---------------------------------------------------------
+
+class PianoCanvas : public EventCanvas {
+ Q_OBJECT
+
+ int colorMode;
+ int playedPitch;
+
+ virtual void paint(QPainter&, QRect);
+ virtual CItem* searchItem(const QPoint& p) const;
+ virtual void addItem(Part* part, const Event& event);
+ virtual void viewMouseDoubleClickEvent(QMouseEvent*);
+ virtual void moveItem(CItem*, DragType);
+ virtual CItem* newItem(const QPoint&, int);
+ virtual void resizeItem(CItem*, bool noSnap);
+ virtual void newItem(CItem*, bool noSnap);
+ virtual bool deleteItem(CItem*);
+ virtual void startDrag(CItem* item, bool copymode);
+ virtual void dragEnterEvent(QDragEnterEvent* event);
+ virtual void dragMoveEvent(QDragMoveEvent*);
+ virtual void dragLeaveEvent(QDragLeaveEvent*);
+ virtual void viewDropEvent(QDropEvent* event);
+ virtual void selectLasso(bool toggle);
+ virtual void timeTypeChanged();
+
+ void quantize(int, int, bool);
+ void paste();
+ virtual void itemPressed(const CItem*);
+ virtual void itemReleased();
+ virtual void itemMoved(const CItem*);
+
+ public slots:
+ void pianoCmd(int);
+
+ public:
+ enum {
+ CMD_CUT, CMD_COPY, CMD_PASTE,
+ CMD_DEL,
+ CMD_OVER_QUANTIZE, CMD_ON_QUANTIZE, CMD_ONOFF_QUANTIZE,
+ CMD_ITERATIVE_QUANTIZE,
+ CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT,
+ CMD_SELECT_ILOOP, CMD_SELECT_OLOOP,
+ CMD_MODIFY_GATE_TIME, CMD_MODIFY_VELOCITY,
+ CMD_CRESCENDO, CMD_TRANSPOSE, CMD_THIN_OUT, CMD_ERASE_EVENT,
+ CMD_NOTE_SHIFT, CMD_MOVE_CLOCK, CMD_COPY_MEASURE,
+ CMD_ERASE_MEASURE, CMD_DELETE_MEASURE, CMD_CREATE_MEASURE,
+ CMD_END
+ };
+
+ PianoCanvas(MidiEditor*);
+ void cmd(int, int, int, bool);
+ void setColorMode(int mode);
+ virtual void modifySelected(NoteInfo::ValType type, int delta);
+ };
+#endif
+
diff --git a/muse/muse/midiedit/quantconfig.cpp b/muse/muse/midiedit/quantconfig.cpp
new file mode 100644
index 00000000..7767f13f
--- /dev/null
+++ b/muse/muse/midiedit/quantconfig.cpp
@@ -0,0 +1,56 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: quantconfig.cpp,v 1.7 2006/01/25 16:24:33 wschweer Exp $
+//
+// (C) Copyright 2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "quantconfig.h"
+
+const char* wtStrengthTxt = QT_TR_NOOP("sets amount of quantization:\n"
+ "0 - no quantization\n"
+ "100 - full quantization");
+const char* wtQLimitTxt = QT_TR_NOOP("don't quantize notes above this tick limit");
+const char* wtQLenTxt = QT_TR_NOOP("quantize also note len as default");
+
+//---------------------------------------------------------
+// QuantConfig
+//---------------------------------------------------------
+
+QuantConfig::QuantConfig(int s, int l, bool lenFlag, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ strength->setValue(s);
+ dontQuantize->setValue(l);
+ quantLen->setChecked(lenFlag);
+ }
+
+//---------------------------------------------------------
+// quantStrength
+//---------------------------------------------------------
+
+int QuantConfig::quantStrength() const
+ {
+ return strength->value();
+ }
+
+//---------------------------------------------------------
+// quantLimit
+//---------------------------------------------------------
+
+int QuantConfig::quantLimit() const
+ {
+ return dontQuantize->value();
+ }
+
+//---------------------------------------------------------
+// doQuantLen
+//---------------------------------------------------------
+
+bool QuantConfig::doQuantLen() const
+ {
+ return quantLen->isChecked();
+ }
+
diff --git a/muse/muse/midiedit/quantconfig.h b/muse/muse/midiedit/quantconfig.h
new file mode 100644
index 00000000..5e00683b
--- /dev/null
+++ b/muse/muse/midiedit/quantconfig.h
@@ -0,0 +1,30 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: quantconfig.h,v 1.3 2006/01/25 16:24:33 wschweer Exp $
+//
+// (C) Copyright 2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __QCONFIG_H__
+#define __QCONFIG_H__
+
+#include "ui_quantconfig.h"
+
+//---------------------------------------------------------
+// QuantConfig
+//---------------------------------------------------------
+
+class QuantConfig : public QDialog, public Ui::QuantConfigBase {
+ Q_OBJECT
+
+ public:
+ QuantConfig(int, int, bool, QWidget* parent = 0);
+ int quantStrength() const;
+ int quantLimit() const;
+ bool doQuantLen() const;
+ };
+
+
+#endif
+
diff --git a/muse/muse/midiedit/quantconfig.ui b/muse/muse/midiedit/quantconfig.ui
new file mode 100644
index 00000000..1da9f790
--- /dev/null
+++ b/muse/muse/midiedit/quantconfig.ui
@@ -0,0 +1,151 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>QuantConfigBase</class>
+ <widget class="QDialog" name="QuantConfigBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>333</width>
+ <height>193</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Configure Quantize</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="dontQuantize" >
+ <property name="maximum" >
+ <number>500</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>131</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Strength:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="strength" >
+ <property name="suffix" >
+ <string>%</string>
+ </property>
+ <property name="maximum" >
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Don't Quantize:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QCheckBox" name="quantLen" >
+ <property name="text" >
+ <string>Quant Len</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>QuantConfigBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>278</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>96</x>
+ <y>254</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>QuantConfigBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>369</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>179</x>
+ <y>282</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/midievent.cpp b/muse/muse/midievent.cpp
new file mode 100644
index 00000000..bdf97af4
--- /dev/null
+++ b/muse/muse/midievent.cpp
@@ -0,0 +1,163 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "event.h"
+#include "midievent.h"
+#include "al/xml.h"
+#include "mpevent.h"
+#include "midictrl.h"
+#include "muse.h"
+
+//---------------------------------------------------------
+// MidiEventBase
+//---------------------------------------------------------
+
+MidiEventBase::MidiEventBase(EventType t)
+ : EventBase(t)
+ {
+ a = 0;
+ b = 0;
+ c = 0;
+ }
+
+//---------------------------------------------------------
+// MidiEventBase::mid
+//---------------------------------------------------------
+
+EventBase* MidiEventBase::mid(unsigned b, unsigned e)
+ {
+ if (tick() < b || tick() >= e)
+ return 0;
+ return new MidiEventBase(*this);
+ }
+
+//---------------------------------------------------------
+// isNoteOff
+//---------------------------------------------------------
+
+bool MidiEventBase::isNoteOff() const
+ {
+ return (type() == Note && (velo() == 0));
+ }
+
+bool MidiEventBase::isNoteOff(const Event& e) const
+ {
+ return (e.isNoteOff() && (e.pitch() == a));
+ }
+
+void MidiEventBase::dump(int n) const
+ {
+ EventBase::dump(n);
+ char* p;
+
+ switch(type()) {
+ case Note: p = "Note "; break;
+ case Controller: p = "Ctrl "; break;
+ case Sysex: p = "Sysex "; break;
+ case PAfter: p = "PAfter "; break;
+ case CAfter: p = "CAfter "; break;
+ case Meta: p = "Meta "; break;
+ default: p = "?? "; break;
+ }
+ for (int i = 0; i < (n+2); ++i)
+ putchar(' ');
+ printf("<%s> a:0x%x(%d) b:0x%x(%d) c:0x%x(%d)\n",
+ p, a, a, b, b, c, c);
+ }
+
+//---------------------------------------------------------
+// MidiEventBase::write
+//---------------------------------------------------------
+
+void MidiEventBase::write(Xml& xml, const Pos& offset) const
+ {
+ QString s = QString("event tick=\"%1\"").arg(tick() + offset.tick());
+
+ switch (type()) {
+ case Note:
+ s += QString(" len=\"%1\"").arg(lenTick());
+ break;
+ default:
+ s += QString(" type=\"%1\"").arg(type());
+ break;
+ }
+ if (edata.dataLen) {
+ s += QString(" datalen=\"%1\"").arg(edata.dataLen);
+ xml.tag(s.toLatin1().data());
+ QString data;
+
+ int col = 0;
+ xml.putLevel();
+ for (int i = 0; i < edata.dataLen; ++i, ++col) {
+ if (col >= 16) {
+ xml.put("");
+ col = 0;
+ xml.putLevel();
+ }
+ xml.nput("%02x ", edata.data[i] & 0xff);
+ }
+ if (col)
+ xml.put("");
+ xml.etag("event");
+ }
+ else {
+ if (a)
+ s += QString(" a=\"%1\"").arg(a);
+ if (b)
+ s += QString(" b=\"%1\"").arg(b);
+ if (c)
+ s += QString(" c=\"%1\"").arg(c);
+ xml.tagE(s.toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// MidiEventBase::read
+//---------------------------------------------------------
+
+void MidiEventBase::read(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ setTick(e.attribute("tick","0").toInt());
+ setType(EventType(e.attribute("type","0").toInt()));
+ setLenTick(e.attribute("len","0").toInt());
+ a = e.attribute("a","0").toInt();
+ b = e.attribute("b","0").toInt();
+ c = e.attribute("c","0").toInt();
+ int dataLen = e.attribute("datalen","0").toInt();
+
+ if (dataLen) {
+ QStringList l = e.text().simplified().split(" ", QString::SkipEmptyParts);
+ if (dataLen != l.size()) {
+ printf("error converting init string <%s>\n", e.text().toLatin1().data());
+ }
+ edata.data = new unsigned char[dataLen];
+ edata.dataLen = dataLen;
+ unsigned char* d = edata.data;
+ int numberBase = 16;
+ for (int i = 0; i < l.size(); ++i) {
+ bool ok;
+ *d++ = l.at(i).toInt(&ok, numberBase);
+ if (!ok)
+ printf("error converting init val <%s>\n", l.at(i).toLatin1().data());
+ }
+ }
+ }
+
diff --git a/muse/muse/midievent.h b/muse/muse/midievent.h
new file mode 100644
index 00000000..93cb5529
--- /dev/null
+++ b/muse/muse/midievent.h
@@ -0,0 +1,73 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDI_EVENT_H__
+#define __MIDI_EVENT_H__
+
+#include "eventbase.h"
+
+//---------------------------------------------------------
+// MidiEventBase
+//---------------------------------------------------------
+
+class MidiEventBase : public EventBase {
+ int a, b, c; // pitch, velo-on, velo-off
+ EvData edata;
+
+ virtual EventBase* clone() { return new MidiEventBase(*this); }
+
+ public:
+ MidiEventBase(EventType t);
+ virtual ~MidiEventBase() {}
+
+ virtual bool isNote() const { return type() == Note; }
+ virtual bool isNoteOff() const;
+ virtual bool isNoteOff(const Event&) const;
+ virtual int pitch() const { return a; }
+ virtual int program() const { return a; }
+ virtual int cntrl() const { return a; }
+ virtual int dataA() const { return a; }
+ virtual void setA(int val) { a = val; }
+ virtual void setPitch(int v) { a = v; }
+
+ virtual int cntrlVal() const { return b; }
+ virtual int dataB() const { return b; }
+ virtual int velo() const { return b; }
+ virtual void setB(int val) { b = val; }
+ virtual void setVelo(int v) { b = v; }
+
+ virtual int veloOff() const { return c; }
+ virtual int dataC() const { return c; }
+ virtual void setC(int val) { c = val; }
+ virtual void setVeloOff(int v) { c = v; }
+
+ virtual const unsigned char* data() const { return edata.data; }
+ virtual int dataLen() const { return edata.dataLen; }
+ virtual void setData(const unsigned char* data, int len) { edata.setData(data, len); }
+ virtual const EvData eventData() const { return edata; }
+
+ virtual void dump(int n = 0) const;
+ virtual void read(QDomNode);
+ virtual void write(Xml&, const Pos& offset) const;
+ virtual EventBase* mid(unsigned, unsigned);
+ };
+
+#endif
+
diff --git a/muse/muse/midififo.cpp b/muse/muse/midififo.cpp
new file mode 100644
index 00000000..833b1e80
--- /dev/null
+++ b/muse/muse/midififo.cpp
@@ -0,0 +1,61 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "midififo.h"
+
+//---------------------------------------------------------
+// MidiFifo
+//---------------------------------------------------------
+
+MidiFifo::MidiFifo()
+ {
+ size = 0;
+ wIndex = 0;
+ rIndex = 0;
+ }
+
+//---------------------------------------------------------
+// put
+// return true on fifo overflow
+//---------------------------------------------------------
+
+bool MidiFifo::put(const MidiEvent& event)
+ {
+ if (size < MIDI_FIFO_SIZE) {
+ fifo[wIndex] = event;
+ wIndex = (wIndex + 1) % MIDI_FIFO_SIZE;
+ q_atomic_increment(&size);
+ return false;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// get
+//---------------------------------------------------------
+
+MidiEvent MidiFifo::get()
+ {
+ MidiEvent event(fifo[rIndex]);
+ rIndex = (rIndex + 1) % MIDI_FIFO_SIZE;
+ q_atomic_decrement(&size);
+ return event;
+ }
+
diff --git a/muse/muse/midififo.h b/muse/muse/midififo.h
new file mode 100644
index 00000000..5572f882
--- /dev/null
+++ b/muse/muse/midififo.h
@@ -0,0 +1,47 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDIFIFO_H__
+#define __MIDIFIFO_H__
+
+#include "mpevent.h"
+
+#define MIDI_FIFO_SIZE 512
+
+//---------------------------------------------------------
+// MidiFifo
+//---------------------------------------------------------
+
+class MidiFifo {
+ MidiEvent fifo[MIDI_FIFO_SIZE];
+ volatile int size;
+ int wIndex;
+ int rIndex;
+
+ public:
+ MidiFifo();
+ bool put(const MidiEvent& event); // returns true on fifo overflow
+ MidiEvent get();
+ bool isEmpty() const { return size == 0; }
+ void clear() { size = 0; }
+ };
+
+#endif
+
diff --git a/muse/muse/midifile.cpp b/muse/muse/midifile.cpp
new file mode 100644
index 00000000..7df44faa
--- /dev/null
+++ b/muse/muse/midifile.cpp
@@ -0,0 +1,678 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "midi.h"
+#include "midifile.h"
+#include "midiedit/drummap.h"
+#include "event.h"
+#include "globals.h"
+#include "midictrl.h"
+#include "midictrl.h"
+#include "mpevent.h"
+#include "gconfig.h"
+
+const char* errString[] = {
+ "no Error",
+ "unexpected EOF",
+ "read Error",
+ "write Error",
+ "bad midifile: 'MTrk' expected",
+ "bad midifile: 'MThd' expected",
+ "bad midi fileformat",
+ };
+
+enum ERROR {
+ MF_NO_ERROR,
+ MF_EOF,
+ MF_READ,
+ MF_WRITE,
+ MF_MTRK,
+ MF_MTHD,
+ MF_FORMAT,
+ };
+
+//---------------------------------------------------------
+// error
+//---------------------------------------------------------
+
+QString MidiFile::error()
+ {
+ return QString(errString[_error]);
+ }
+
+//---------------------------------------------------------
+// MidiFile
+//---------------------------------------------------------
+
+MidiFile::MidiFile()
+ {
+ fp = 0;
+ curPos = 0;
+ _error = MF_NO_ERROR;
+ _tracks = new MidiFileTrackList;
+ _midiType = MT_GENERIC;
+ }
+
+MidiFile::~MidiFile()
+ {
+ delete _tracks;
+ }
+
+//---------------------------------------------------------
+// read
+// return true on error
+//---------------------------------------------------------
+
+bool MidiFile::read(void* p, size_t len)
+ {
+ for (;;) {
+ curPos += len;
+ qint64 rv = fp->read((char*)p, len);
+ if (rv == len)
+ return false;
+ if (fp->atEnd()) {
+ _error = MF_EOF;
+ return true;
+ }
+ _error = MF_READ;
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// write
+// return true on error
+//---------------------------------------------------------
+
+bool MidiFile::write(const void* p, size_t len)
+ {
+ qint64 rv = fp->write((char*)p, len);
+ if (rv == len)
+ return false;
+ _error = MF_WRITE;
+ return true;
+ }
+
+//---------------------------------------------------------
+// writeShort
+// return true on error
+//---------------------------------------------------------
+
+bool MidiFile::writeShort(int i)
+ {
+ short format = BE_SHORT(i);
+ return write(&format, 2);
+ }
+
+//---------------------------------------------------------
+// writeLong
+// return true on error
+//---------------------------------------------------------
+
+bool MidiFile::writeLong(int i)
+ {
+ int format = BE_LONG(i);
+ return write(&format, 4);
+ }
+
+//---------------------------------------------------------
+// readShort
+//---------------------------------------------------------
+
+int MidiFile::readShort()
+ {
+ short format;
+ read(&format, 2);
+ return BE_SHORT(format);
+ }
+
+//---------------------------------------------------------
+// readLong
+// writeLong
+//---------------------------------------------------------
+
+int MidiFile::readLong()
+ {
+ int format;
+ read(&format, 4);
+ return BE_LONG(format);
+ }
+
+/*---------------------------------------------------------
+ * skip
+ * This is meant for skipping a few bytes in a
+ * file or fifo.
+ *---------------------------------------------------------*/
+
+bool MidiFile::skip(size_t len)
+ {
+ char tmp[len];
+ return read(tmp, len);
+ }
+
+/*---------------------------------------------------------
+ * getvl
+ * Read variable-length number (7 bits per byte, MSB first)
+ *---------------------------------------------------------*/
+
+int MidiFile::getvl()
+ {
+ int l = 0;
+ for (int i = 0; i < 16; i++) {
+ uchar c;
+ if (read(&c, 1))
+ return -1;
+ l += (c & 0x7f);
+ if (!(c & 0x80))
+ return l;
+ l <<= 7;
+ }
+ return -1;
+ }
+
+/*---------------------------------------------------------
+ * putvl
+ * Write variable-length number (7 bits per byte, MSB first)
+ *---------------------------------------------------------*/
+
+void MidiFile::putvl(unsigned val)
+ {
+ unsigned long buf = val & 0x7f;
+ while ((val >>= 7) > 0) {
+ buf <<= 8;
+ buf |= 0x80;
+ buf += (val & 0x7f);
+ }
+ for (;;) {
+ put(buf);
+ if (buf & 0x80)
+ buf >>= 8;
+ else
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// readTrack
+// return true on error
+//---------------------------------------------------------
+
+bool MidiFile::readTrack(MidiFileTrack* t)
+ {
+ MPEventList* el = &(t->events);
+ char tmp[4];
+ if (read(tmp, 4))
+ return true;
+ if (memcmp(tmp, "MTrk", 4)) {
+ _error = MF_MTRK;
+ return true;
+ }
+ int len = readLong(); // len
+ int endPos = curPos + len;
+ status = -1;
+ sstatus = -1; // running status, not reset scanning meta or sysex
+ click = 0;
+
+ int port = 0;
+ int channel = 0;
+
+ for (;;) {
+ MidiEvent event;
+ lastport = -1;
+ lastchannel = -1;
+
+ int rv = readEvent(&event, t);
+ if (lastport != -1) {
+ port = lastport;
+ if (port >= MIDI_PORTS) {
+ printf("port %d >= %d, reset to 0\n", port, MIDI_PORTS);
+ port = 0;
+ }
+ }
+ if (lastchannel != -1) {
+ channel = lastchannel;
+ if (channel >= MIDI_CHANNELS) {
+ printf("channel %d >= %d, reset to 0\n", port, MIDI_CHANNELS);
+ channel = 0;
+ }
+ }
+ if (rv == 0)
+ break;
+ else if (rv == -1)
+ continue;
+ else if (rv == -2) // error
+ return true;
+
+//TODO3 event.setPort(port);
+ if (event.type() == ME_SYSEX || event.type() == ME_META)
+ event.setChannel(channel);
+ else
+ channel = event.channel();
+ el->add(event);
+ }
+ int end = curPos;
+ if (end != endPos) {
+ printf("MidiFile::readTrack(): TRACKLEN does not fit %d+%d != %d, %d too much\n",
+ endPos-len, len, end, endPos-end);
+ if (end < endPos)
+ skip(endPos - end);
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// readEvent
+// returns:
+// 0 End of track
+// -1 Event filtered
+// -2 Error
+//---------------------------------------------------------
+
+int MidiFile::readEvent(MidiEvent* event, MidiFileTrack* t)
+ {
+ uchar me, type, a, b;
+
+ int nclick = getvl();
+ if (nclick == -1) {
+ printf("readEvent: error 1\n");
+ return 0;
+ }
+ click += nclick;
+ for (;;) {
+ if (read(&me, 1)) {
+ printf("readEvent: error 2\n");
+ return 0;
+ }
+ if (me >= 0xf8 && me <= 0xfe)
+ printf("Midi: Real Time Message 0x%02x??\n", me & 0xff);
+ else
+ break;
+ }
+
+ event->setTime(click);
+ int len;
+ unsigned char* buffer;
+
+ if ((me & 0xf0) == 0xf0) {
+ if (me == 0xf0 || me == 0xf7) {
+ //
+ // SYSEX
+ //
+ status = -1; // no running status
+ len = getvl();
+ if (len == -1) {
+ printf("readEvent: error 3\n");
+ return -2;
+ }
+ buffer = new unsigned char[len];
+ if (read(buffer, len)) {
+ printf("readEvent: error 4\n");
+ delete[] buffer;
+ return -2;
+ }
+ if (buffer[len-1] != 0xf7) {
+ printf("SYSEX endet nicht mit 0xf7!\n");
+ // Forstsetzung folgt?
+ }
+ else
+ --len; // don't count 0xf7
+ event->setType(ME_SYSEX);
+ event->setData(buffer, len);
+
+ if ((len == gmOnMsgLen) && memcmp(buffer, gmOnMsg, gmOnMsgLen) == 0)
+ _midiType = MT_GM;
+ else if ((len == gsOnMsgLen) && memcmp(buffer, gsOnMsg, gsOnMsgLen) == 0)
+ _midiType = MT_GS;
+
+ if (buffer[0] == 0x43) { // Yamaha
+ _midiType = MT_XG;
+ int type = buffer[1] & 0xf0;
+ switch (type) {
+ case 0x00: // bulk dump
+ buffer[1] = 0;
+ break;
+ case 0x10:
+ if (buffer[1] != 0x10) {
+ buffer[1] = 0x10; // fix to Device 1
+ }
+ if (len == 7 && buffer[2] == 0x4c && buffer[3] == 0x08 && buffer[5] == 7) {
+ // part mode
+ // 0 - normal
+ // 1 - DRUM
+ // 2 - DRUM 1
+ // 3 - DRUM 2
+ // 4 - DRUM 3
+ // 5 - DRUM 4
+ printf("xg set part mode channel %d to %d\n", buffer[4]+1, buffer[6]);
+ if (buffer[6] != 0)
+ t->isDrumTrack = true;
+ }
+ break;
+ case 0x20:
+ printf("YAMAHA DUMP REQUEST\n");
+ return -1;
+ case 0x30:
+ printf("YAMAHA PARAMETER REQUEST\n");
+ return -1;
+ default:
+ printf("YAMAHA unknown SYSEX: data[2]=%02x\n", buffer[1]);
+ return -1;
+ }
+ }
+ else if (buffer[0] == 0x43) {
+ if (_midiType != MT_XG)
+ _midiType = MT_GS;
+ }
+
+ return 3;
+ }
+ if (me == 0xff) {
+ //
+ // META
+ //
+ status = -1; // no running status
+ if (read(&type, 1)) { // read type
+ printf("readEvent: error 5\n");
+ return -2;
+ }
+ len = getvl(); // read len
+ if (len == -1) {
+ printf("readEvent: error 6\n");
+ return -2;
+ }
+ buffer = new unsigned char[len+1];
+ *buffer = 0;
+ if (len) {
+ if (read(buffer, len)) {
+ printf("readEvent: error 7\n");
+ delete[] buffer;
+ return -2;
+ }
+ buffer[len] = 0;
+ }
+ event->setType(ME_META);
+ event->setData(buffer, len+1);
+ event->setA(type);
+ buffer[len] = 0;
+ switch(type) {
+ case 0x21: // switch port
+ lastport = buffer[0];
+ return 3;
+ case 0x20: // switch channel
+ lastchannel = buffer[0];
+ return 3;
+ case 0x2f: // End of Track
+ delete[] buffer;
+ return 0;
+ default:
+ return 3;
+ }
+ }
+ else {
+ printf("Midi: unknown Message 0x%02x\n", me & 0xff);
+ return -1;
+ }
+ }
+
+ if (me & 0x80) { // status byte
+ status = me;
+ sstatus = status;
+ if (read(&a, 1)) {
+ printf("readEvent: error 9\n");
+ return -2;
+ }
+ a &= 0x7F;
+ }
+ else {
+ if (status == -1) {
+ // Meta events and sysex events cancel running status.
+ // There are some midi files which do not send
+ // status again after this events. Silently assume
+ // old running status.
+
+ if (debugMsg || sstatus == -1)
+ printf("readEvent: no running status, read 0x%02x, old status 0x%02x\n", me, sstatus);
+ if (sstatus == -1)
+ return -1;
+ status = sstatus;
+ }
+ a = me;
+ }
+ b = 0;
+ switch (status & 0xf0) {
+ case ME_NOTEOFF:
+ case ME_NOTEON:
+ case ME_POLYAFTER:
+ case ME_CONTROLLER:
+ case ME_PITCHBEND:
+ if (read(&b, 1)) {
+ printf("readEvent: error 15\n");
+ return -2;
+ }
+ event->setB(b & 0x80 ? 0 : b);
+ break;
+ case ME_PROGRAM:
+ case ME_AFTERTOUCH:
+ break;
+ default: // f1 f2 f3 f4 f5 f6 f7 f8 f9
+ printf("BAD STATUS 0x%02x, me 0x%02x\n", status, me);
+ return -2;
+ }
+ event->setA(a & 0x7f);
+ event->setType(status & 0xf0);
+ event->setChannel(status & 0xf);
+ if ((a & 0x80) || (b & 0x80)) {
+ printf("8'tes Bit in Daten(%02x %02x): tick %d read 0x%02x status:0x%02x\n",
+ a & 0xff, b & 0xff, click, me, status);
+ printf("readEvent: error 16\n");
+ if (b & 0x80) {
+ // Try to fix: interpret as channel byte
+ status = b & 0xf0;
+ sstatus = status;
+ return 3;
+ }
+ return -1;
+ }
+ if (event->type() == ME_PITCHBEND) {
+ int val = (event->dataB() << 7) + event->dataA();
+ val -= 8192;
+ event->setA(val);
+ }
+ return 3;
+ }
+
+//---------------------------------------------------------
+// writeTrack
+//---------------------------------------------------------
+
+bool MidiFile::writeTrack(const MidiFileTrack* t)
+ {
+ const MPEventList* events = &(t->events);
+ write("MTrk", 4);
+ int lenpos = fp->pos();
+ writeLong(0); // dummy len
+
+ status = -1;
+ int tick = 0;
+ for (iMPEvent i = events->begin(); i != events->end(); ++i) {
+ int ntick = i->time();
+ if (ntick < tick) {
+ printf("MidiFile::writeTrack: ntick %d < tick %d\n", ntick, tick);
+ ntick = tick;
+ }
+ putvl(((ntick - tick) * config.midiDivision + config.division/2)/config.division);
+ tick = ntick;
+ writeEvent(&(*i));
+ }
+
+ //---------------------------------------------------
+ // write "End Of Track" Meta
+ // write Track Len
+ //
+
+ putvl(0);
+ put(0xff); // Meta
+ put(0x2f); // EOT
+ putvl(0); // len 0
+ int endpos = fp->pos();
+ fp->seek(lenpos);
+ writeLong(endpos-lenpos-4); // tracklen
+ fp->seek(endpos);
+ return false;
+ }
+
+//---------------------------------------------------------
+// writeEvent
+//---------------------------------------------------------
+
+void MidiFile::writeEvent(const MidiEvent* event)
+ {
+ int c = event->channel();
+ int nstat = event->type();
+
+ // we dont save meta data into smf type 0 files:
+
+ if (config.smfFormat == 0 && nstat == ME_META)
+ return;
+
+ nstat |= c;
+ //
+ // running status; except for Sysex- and Meta Events
+ //
+ if (((nstat & 0xf0) != 0xf0) && (nstat != status)) {
+ status = nstat;
+ put(nstat);
+ }
+ switch (event->type()) {
+ case ME_NOTEOFF:
+ case ME_NOTEON:
+ case ME_POLYAFTER:
+ case ME_CONTROLLER:
+ case ME_PITCHBEND:
+ put(event->dataA());
+ put(event->dataB());
+ break;
+ case ME_PROGRAM: // Program Change
+ case ME_AFTERTOUCH: // Channel Aftertouch
+ put(event->dataA());
+ break;
+ case ME_SYSEX:
+ put(0xf0);
+ putvl(event->len() + 1); // including 0xf7
+ write(event->data(), event->len());
+ put(0xf7);
+ status = -1; // invalidate running status
+ break;
+ case ME_META:
+ put(0xff);
+ put(event->dataA());
+ putvl(event->len());
+ write(event->data(), event->len());
+ status = -1;
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// write
+// returns true on error
+//---------------------------------------------------------
+
+bool MidiFile::write(QFile* _fp)
+ {
+ fp = _fp;
+ write("MThd", 4);
+ writeLong(6); // header len
+ writeShort(format);
+ if (format == 0) {
+ // ?? writeShort(1);
+ MidiFileTrack dst;
+ for (iMidiFileTrack i = _tracks->begin(); i != _tracks->end(); ++i) {
+ MPEventList* sl = &((*i)->events);
+ for (iMPEvent ie = sl->begin(); ie != sl->end(); ++ie)
+ dst.events.add(*ie);
+ }
+ writeShort(1);
+ writeShort(_division);
+ writeTrack(&dst);
+ }
+ else {
+ writeShort(_tracks->size());
+ writeShort(_division);
+ for (ciMidiFileTrack i = _tracks->begin(); i != _tracks->end(); ++i)
+ writeTrack(*i);
+ }
+ return false; // (ferror(fp) != 0);
+ }
+
+//---------------------------------------------------------
+// readMidi
+// returns true on error
+//---------------------------------------------------------
+
+bool MidiFile::read(QFile* _fp)
+ {
+ fp = _fp;
+ _error = MF_NO_ERROR;
+ int i;
+ char tmp[4];
+
+ if (read(tmp, 4))
+ return true;
+ int len = readLong();
+ if (memcmp(tmp, "MThd", 4) || len < 6) {
+ _error = MF_MTHD;
+ return true;
+ }
+ format = readShort();
+ ntracks = readShort();
+ _division = readShort();
+
+ if (_division < 0)
+ _division = (-(_division/256)) * (_division & 0xff);
+ if (len > 6)
+ skip(len-6); // skip excess bytes
+
+ switch (format) {
+ case 0:
+ {
+ MidiFileTrack* t = new MidiFileTrack;
+ _tracks->push_back(t);
+ if (readTrack(t))
+ return true;
+ }
+ break;
+ case 1:
+ for (i = 0; i < ntracks; i++) {
+ MidiFileTrack* t = new MidiFileTrack;
+ _tracks->push_back(t);
+ if (readTrack(t))
+ return true;
+ }
+ break;
+ default:
+ _error = MF_FORMAT;
+ return true;
+ }
+ return false;
+ }
+
diff --git a/muse/muse/midifile.h b/muse/muse/midifile.h
new file mode 100644
index 00000000..d88b58ac
--- /dev/null
+++ b/muse/muse/midifile.h
@@ -0,0 +1,121 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDIFILE_H__
+#define __MIDIFILE_H__
+
+#include "globaldefs.h"
+#include "mpevent.h"
+
+struct MPEventList;
+class MidiEvent;
+
+//---------------------------------------------------------
+// MidiFileTrack
+//---------------------------------------------------------
+
+struct MidiFileTrack {
+ MPEventList events;
+ bool isDrumTrack;
+ MidiFileTrack() {
+ isDrumTrack = false;
+ }
+ };
+
+typedef std::list<MidiFileTrack*> MidiFileTrackList;
+typedef MidiFileTrackList::iterator iMidiFileTrack;
+typedef MidiFileTrackList::const_iterator ciMidiFileTrack;
+
+//---------------------------------------------------------
+// MidiFile
+//---------------------------------------------------------
+
+class MidiFile {
+ int _error;
+ int format; // smf file format
+ int ntracks; // number of midi tracks
+ int _division;
+ MidiInstrumentType _midiType;
+ MidiFileTrackList* _tracks;
+
+ int status, click;
+ int sstatus;
+ int lastport, lastchannel;
+ QFile* fp;
+ int curPos;
+
+ bool read(void*, size_t);
+ bool write(const void*, size_t);
+ void put(unsigned char c) { write(&c, 1); }
+ bool skip(size_t);
+ int readShort();
+ bool writeShort(int);
+ int readLong();
+ bool writeLong(int);
+ int getvl();
+ void putvl(unsigned);
+
+ bool readTrack(MidiFileTrack*);
+ bool writeTrack(const MidiFileTrack*);
+
+ int readEvent(MidiEvent*, MidiFileTrack*);
+ void writeEvent(const MidiEvent*);
+
+ public:
+ MidiFile();
+ ~MidiFile();
+ bool read(QFile* f);
+ bool write(QFile* f);
+ QString error();
+ MidiFileTrackList* trackList() { return _tracks; }
+ int tracks() const { return ntracks; }
+ void setTrackList(MidiFileTrackList* tr) {
+ _tracks = tr;
+ }
+ void setDivision(int d) { _division = d; }
+ int division() const { return _division; }
+ void setFormat(int val) { format = val; }
+ MidiInstrumentType midiType() const { return _midiType; }
+ };
+
+#define XCHG_SHORT(x) ((((x)&0xFF)<<8) | (((x)>>8)&0xFF))
+#ifdef __i486__
+#define XCHG_LONG(x) \
+ ({ int __value; \
+ asm ("bswap %1; movl %1,%0" : "=g" (__value) : "r" (x)); \
+ __value; })
+#else
+#define XCHG_LONG(x) ((((x)&0xFF)<<24) | \
+ (((x)&0xFF00)<<8) | \
+ (((x)&0xFF0000)>>8) | \
+ (((x)>>24)&0xFF))
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define BE_SHORT(x) XCHG_SHORT(x)
+#define BE_LONG(x) XCHG_LONG(x)
+#else
+#define BE_SHORT(x) x
+#define BE_LONG(x) x
+#endif
+
+
+#endif
+
diff --git a/muse/muse/midiplugin.cpp b/muse/muse/midiplugin.cpp
new file mode 100644
index 00000000..7f716a99
--- /dev/null
+++ b/muse/muse/midiplugin.cpp
@@ -0,0 +1,628 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include <dlfcn.h>
+
+#include "al/al.h"
+#include "al/xml.h"
+#include "al/tempo.h"
+#include "al/sig.h"
+#include "midiplugin.h"
+#include "ctrl.h"
+#include "midiplugins/libmidiplugin/mempi.h"
+#include "audio.h"
+#include "gconfig.h"
+
+MidiPluginList midiPlugins;
+
+MempiHost mempiHost;
+
+//---------------------------------------------------------
+// division
+//---------------------------------------------------------
+
+int MempiHost::division() const
+ {
+ return config.division;
+ }
+
+//---------------------------------------------------------
+// tempo
+//---------------------------------------------------------
+
+int MempiHost::tempo(unsigned tick) const
+ {
+ return AL::tempomap.tempo(tick);
+ }
+
+//---------------------------------------------------------
+// tick2frame
+//---------------------------------------------------------
+
+unsigned MempiHost::tick2frame(unsigned tick) const
+ {
+ return AL::tempomap.tick2frame(tick);
+ }
+
+//---------------------------------------------------------
+// frame2tick
+//---------------------------------------------------------
+
+unsigned MempiHost::frame2tick(unsigned frame) const
+ {
+ return AL::tempomap.frame2tick(frame);
+ }
+
+//---------------------------------------------------------
+// bar
+//---------------------------------------------------------
+
+void MempiHost::bar(int t, int* bar, int* beat, unsigned* tick) const
+ {
+ AL::sigmap.tickValues(t, bar, beat, tick);
+ }
+
+//---------------------------------------------------------
+// bar2tick
+//---------------------------------------------------------
+
+unsigned MempiHost::bar2tick(int bar, int beat, int tick) const
+ {
+ return AL::sigmap.bar2tick(bar, beat, tick);
+ }
+
+//---------------------------------------------------------
+// MidiPlugin
+//---------------------------------------------------------
+
+MidiPlugin::MidiPlugin(const QFileInfo* f, const MEMPI_Function mf,
+ const MEMPI* d) : fi(*f)
+ {
+ mempi = mf;
+ plugin = d;
+ _instances = 0;
+ }
+
+//---------------------------------------------------------
+// instantiate
+//---------------------------------------------------------
+
+MidiPluginI* MidiPlugin::instantiate(MidiTrackBase* t)
+ {
+ if (plugin == 0) {
+ printf("initMidiPluginInstance: zero plugin\n");
+ return 0;
+ }
+ ++_instances;
+ QString inst("-" + QString::number(_instances));
+ QString s = name() + inst;
+
+ Mempi* m = plugin->instantiate(s.toLatin1().data(), &mempiHost);
+ if (m->init()) {
+ delete m;
+ return 0;
+ }
+ MidiPluginI* mp = new MidiPluginI(this,t, m);
+ return mp;
+ }
+
+bool MidiPlugin::instantiate(MidiPluginI* mp)
+ {
+ if (plugin == 0) {
+ printf("initMidiPluginInstance: zero plugin\n");
+ return 0;
+ }
+ ++_instances;
+ QString inst("-" + QString::number(_instances));
+ QString s = name() + inst;
+
+ Mempi* m = plugin->instantiate(s.toLatin1().data(), &mempiHost);
+ if (m->init()) {
+ delete m;
+ return true;
+ }
+ mp->setMempi(m);
+ return false;
+ }
+
+//---------------------------------------------------------
+// MidiPluginI
+//---------------------------------------------------------
+
+MidiPluginI::MidiPluginI(MidiPlugin* p, MidiTrackBase* t, Mempi* m)
+ {
+ _track = t;
+ _plugin = p;
+ mempi = m;
+ _on = true;
+ }
+
+//---------------------------------------------------------
+// MidiPluginI
+//---------------------------------------------------------
+
+MidiPluginI::MidiPluginI(MidiTrackBase* t)
+ {
+ _track = t;
+ _plugin = 0;
+ mempi = 0;
+ _on = true;
+ }
+
+//---------------------------------------------------------
+// MidiPluginI
+//---------------------------------------------------------
+
+MidiPluginI::~MidiPluginI()
+ {
+ }
+
+//---------------------------------------------------------
+// loadMidiPlugin
+//---------------------------------------------------------
+
+static void loadMidiPlugin(QFileInfo* fi)
+ {
+ if (debugMsg)
+ printf(" load midi plugin <%s>\n", fi->filePath().toLatin1().data());
+ void* handle = dlopen(fi->filePath().toLatin1().data(), RTLD_NOW);
+ if (handle == 0) {
+ fprintf(stderr, "loadMidiPlugin::dlopen(%s) failed: %s\n",
+ fi->filePath().toLatin1().data(), dlerror());
+ return;
+ }
+ MEMPI_Function mempi = (MEMPI_Function)dlsym(handle, "mempi_descriptor");
+
+ if (!mempi) {
+ const char *txt = dlerror();
+ if (txt) {
+ fprintf(stderr,
+ "Unable to find mempi_descriptor() function in plugin "
+ "library file \"%s\": %s.\n"
+ "Are you sure this is a MEMPI plugin file?\n",
+ fi->filePath().toLatin1().data(),
+ txt);
+ return;
+ }
+ }
+ const MEMPI* descr = mempi();
+
+ if (descr == 0) {
+ fprintf(stderr, "Mempi::instantiate: no MEMPI descr found\n");
+ return;
+ }
+ if (descr->majorMempiVersion != MEMPI_MAJOR_VERSION) {
+ fprintf(stderr, "Mempi::instantiate: bad MEMPI version %d, expected %d\n",
+ descr->majorMempiVersion, MEMPI_MAJOR_VERSION);
+ return;
+ }
+ midiPlugins.push_back(new MidiPlugin(fi, mempi, descr));
+ }
+
+//---------------------------------------------------------
+// loadMidiPluginDir
+//---------------------------------------------------------
+
+static void loadMidiPluginDir(const QString& s)
+ {
+ if (debugMsg)
+ printf("scan midi plugin dir <%s>\n", s.toLatin1().data());
+ QDir pluginDir(s, QString("*.so"), 0, QDir::Files);
+ if (pluginDir.exists()) {
+ QFileInfoList list = pluginDir.entryInfoList();
+ for (int i = 0; i < list.size(); ++i) {
+ QFileInfo fi = list.at(i);
+ loadMidiPlugin(&fi);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// initMidiPlugins
+// search for midi MEPI plugins
+//---------------------------------------------------------
+
+void initMidiPlugins()
+ {
+ loadMidiPluginDir(museGlobalLib + QString("/midiplugins"));
+ }
+
+//---------------------------------------------------------
+// find
+//---------------------------------------------------------
+
+MidiPlugin* MidiPluginList::find(const QString& /*file*/, const QString& name)
+ {
+ for (iMidiPlugin i = begin(); i != end(); ++i) {
+ if (name == (*i)->name())
+ return *i;
+ }
+ printf("MidiPlugin <%s> not found\n", name.toLatin1().data());
+ return 0;
+ }
+
+//---------------------------------------------------------
+// Pipeline
+//---------------------------------------------------------
+
+MidiPipeline::MidiPipeline()
+ : std::vector<MidiPluginI*>()
+ {
+ for (int i = 0; i < MidiPipelineDepth; ++i)
+ push_back(0);
+ }
+
+//---------------------------------------------------------
+// insert
+// give ownership of object plugin to Pipeline
+//---------------------------------------------------------
+
+void MidiPipeline::insert(MidiPluginI* plugin, int index)
+ {
+ (*this)[index] = plugin;
+ }
+
+//---------------------------------------------------------
+// isOn
+//---------------------------------------------------------
+
+bool MidiPipeline::isOn(int idx) const
+ {
+ MidiPluginI* p = (*this)[idx];
+ if (p)
+ return p->on();
+ return false;
+ }
+
+//---------------------------------------------------------
+// setOn
+//---------------------------------------------------------
+
+void MidiPipeline::setOn(int idx, bool flag)
+ {
+ MidiPluginI* p = (*this)[idx];
+ if (p) {
+ p->setOn(flag);
+ }
+ }
+
+//---------------------------------------------------------
+// name
+//---------------------------------------------------------
+
+QString MidiPipeline::name(int idx) const
+ {
+ MidiPluginI* p = (*this)[idx];
+ if (p)
+ return p->name();
+ return QString("empty");
+ }
+
+//---------------------------------------------------------
+// empty
+//---------------------------------------------------------
+
+bool MidiPipeline::empty(int idx) const
+ {
+ MidiPluginI* p = (*this)[idx];
+ return p == 0;
+ }
+
+//---------------------------------------------------------
+// move
+//---------------------------------------------------------
+
+void MidiPipeline::move(int idx, bool up)
+ {
+ MidiPluginI* p1 = (*this)[idx];
+ if (up) {
+ (*this)[idx] = (*this)[idx-1];
+ (*this)[idx-1] = p1;
+ }
+ else {
+ (*this)[idx] = (*this)[idx+1];
+ (*this)[idx+1] = p1;
+ }
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void MidiPipeline::showGui(int idx, bool flag)
+ {
+ MidiPluginI* p = (*this)[idx];
+ if (p)
+ p->showGui(flag);
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool MidiPipeline::guiVisible(int idx)
+ {
+ MidiPluginI* p = (*this)[idx];
+ if (p)
+ return p->guiVisible();
+ return false;
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void MidiPipeline::apply(unsigned from, unsigned to, MPEventList* il, MPEventList* ool)
+ {
+ MPEventList oList;
+ MPEventList* ol = &oList;
+
+ bool swap = true;
+ for (iMidiPluginI i = begin(); i != end(); ++i) {
+ MidiPluginI* p = *i;
+ if (p == 0 || !p->on())
+ continue;
+ if (swap) {
+ ol->clear();
+ p->apply(from, to, il, ol);
+ }
+ else {
+ il->clear();
+ p->apply(from, to, ol, il);
+ }
+ swap = !swap;
+ }
+ MPEventList* l = swap ? il : ol;
+ for (iMPEvent i = l->begin(); i != l->end(); ++i)
+ ool->add(*i);
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void MidiPluginI::apply(unsigned from, unsigned to, MPEventList* il, MPEventList* ol)
+ {
+ mempi->process(from, to, il, ol);
+ }
+
+//---------------------------------------------------------
+// saveConfiguration
+//---------------------------------------------------------
+
+void MidiPluginI::writeConfiguration(Xml& xml)
+ {
+ xml.tag("midiPlugin file=\"%s\" name=\"%s\"",
+ _plugin->lib().toLatin1().data(), _plugin->name().toLatin1().data());
+ if (_on == false)
+ xml.intTag("on", _on);
+ if (mempi->hasGui()) {
+ xml.intTag("guiVisible", mempi->guiVisible());
+ int x, y, w, h;
+ w = 0;
+ h = 0;
+ mempi->getGeometry(&x, &y, &w, &h);
+ if (h || w)
+ xml.qrectTag("geometry", QRect(x, y, w, h));
+ }
+
+ //---------------------------------------------
+ // dump current state of plugin
+ //---------------------------------------------
+
+ int len = 0;
+ const unsigned char* p;
+ mempi->getInitData(&len, &p);
+ if (len) {
+ xml.tag("init len=\"%d\"", len);
+ int col = 0;
+ xml.putLevel();
+ for (int i = 0; i < len; ++i, ++col) {
+ if (col >= 16) {
+ xml.put("");
+ col = 0;
+ xml.putLevel();
+ }
+ xml.nput("%02x ", p[i] & 0xff);
+ }
+ if (col)
+ xml.put("");
+ xml.etag("init");
+ }
+ xml.etag("midiPlugin");
+ }
+
+//---------------------------------------------------------
+// readConfiguration
+// return true on error
+//---------------------------------------------------------
+
+bool MidiPluginI::readConfiguration(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ QString file = e.attribute("file");
+ QString label = e.attribute("name");
+
+ if (_plugin == 0) {
+ _plugin = midiPlugins.find(file, label);
+ if (_plugin == 0)
+ return true;
+ if (_plugin->instantiate(this))
+ return true;
+ }
+ node = node.firstChild();
+ while (!node.isNull()) {
+ e = node.toElement();
+ int i = e.text().toInt();
+ QString tag(e.tagName());
+ if (tag == "on") {
+ bool flag = i;
+ _on = flag;
+ }
+ else if (tag == "guiVisible") {
+ showGui(i);
+ }
+ else if (tag == "geometry") {
+ QRect r(AL::readGeometry(node));
+ mempi->setGeometry(r.x(), r.y(), r.width(), r.height());
+ }
+ else if (tag == "init") {
+ int len = e.attribute("len","0").toInt();
+ if (len) {
+ const char* s = e.text().toLatin1().data();
+ unsigned char data[len];
+ unsigned char* d = data;
+ int numberBase = 16;
+ for (int i = 0; i < len; ++i) {
+ char* endp;
+ *d++ = strtol(s, &endp, numberBase);
+ s = endp;
+ if (s == 0)
+ break;
+ }
+ mempi->setInitData(len, data);
+ }
+ }
+ else
+ printf("MusE:MidiPluginI: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void MidiPluginI::showGui()
+ {
+ mempi->showGui(!mempi->guiVisible());
+ }
+
+void MidiPluginI::showGui(bool flag)
+ {
+ mempi->showGui(flag);
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool MidiPluginI::guiVisible() const
+ {
+ return mempi->guiVisible();
+ }
+
+//---------------------------------------------------------
+// MidiPluginDialog
+//---------------------------------------------------------
+
+MidiPluginDialog::MidiPluginDialog(QWidget* parent)
+ : QDialog(parent)
+ {
+ resize(QSize(550, 300));
+ setModal(true);
+ setWindowTitle(tr("MusE: select midi plugin"));
+ QVBoxLayout* layout = new QVBoxLayout(this);
+
+ pList = new QTreeWidget(this);
+ pList->setIndentation(0);
+ pList->setColumnCount(4);
+ pList->setSortingEnabled(true);
+ pList->setSelectionBehavior(QAbstractItemView::SelectRows);
+ pList->setSelectionMode(QAbstractItemView::SingleSelection);
+ pList->setAlternatingRowColors(true);
+
+ QStringList headerLabels;
+
+ headerLabels << tr("File") << tr("Name") << tr("Version") << tr("Description");
+ pList->header()->resizeSection(0, 100);
+ pList->header()->resizeSection(1, 120);
+ pList->header()->resizeSection(2, 70);
+ pList->header()->setResizeMode(3, QHeaderView::Stretch);
+ pList->setHeaderLabels(headerLabels);
+
+ fillPlugs();
+
+ layout->addWidget(pList);
+
+ //---------------------------------------------------
+ // Ok/Cancel Buttons
+ //---------------------------------------------------
+
+ QBoxLayout* w5 = new QHBoxLayout;
+ layout->addLayout(w5);
+
+ QPushButton* okB = new QPushButton(tr("Ok"));
+ QPushButton* cancelB = new QPushButton(tr("Cancel"));
+ okB->setFixedWidth(80);
+ cancelB->setFixedWidth(80);
+ okB->setDefault(true);
+ w5->addStretch(100);
+ w5->addWidget(okB);
+ w5->addWidget(cancelB);
+
+ connect(pList, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), SLOT(accept()));
+ connect(cancelB, SIGNAL(clicked()), SLOT(reject()));
+ connect(okB, SIGNAL(clicked()), SLOT(accept()));
+ }
+
+//---------------------------------------------------------
+// getPlugin
+//---------------------------------------------------------
+
+MidiPlugin* MidiPluginDialog::getPlugin(QWidget* parent)
+ {
+ MidiPluginDialog* dialog = new MidiPluginDialog(parent);
+ if (dialog->exec())
+ return dialog->value();
+ return 0;
+ }
+
+//---------------------------------------------------------
+// value
+//---------------------------------------------------------
+
+MidiPlugin* MidiPluginDialog::value()
+ {
+ QTreeWidgetItem* item = pList->selectedItems().at(0);
+ if (item)
+ return midiPlugins.find(item->text(0), item->text(1));
+ return 0;
+ }
+
+//---------------------------------------------------------
+// fillPlugs
+//---------------------------------------------------------
+
+void MidiPluginDialog::fillPlugs()
+ {
+ pList->clear();
+ for (iMidiPlugin i = midiPlugins.begin(); i != midiPlugins.end(); ++i) {
+ if ((*i)->type() != MEMPI_FILTER)
+ continue;
+ QTreeWidgetItem* item = new QTreeWidgetItem;
+ item->setText(0, (*i)->lib());
+ item->setText(1, (*i)->name());
+ item->setText(2, (*i)->version());
+ item->setText(3, (*i)->description());
+ pList->addTopLevelItem(item);
+ }
+ }
diff --git a/muse/muse/midiplugin.h b/muse/muse/midiplugin.h
new file mode 100644
index 00000000..944b395a
--- /dev/null
+++ b/muse/muse/midiplugin.h
@@ -0,0 +1,170 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDIPLUGIN_H__
+#define __MIDIPLUGIN_H__
+
+#include "globals.h"
+#include "midiplugins/libmidiplugin/mempi.h"
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+class MidiPluginIF;
+class MidiPluginGui;
+class MidiPluginI;
+class MidiTrackBase;
+class Ctrl;
+class MPEventList;
+class MidiTrackBase;
+
+typedef const MEMPI* (*MEMPI_Function)();
+
+//---------------------------------------------------------
+// MidiPlugin
+//---------------------------------------------------------
+
+class MidiPlugin {
+ MEMPI_Function mempi;
+ const MEMPI* plugin;
+
+ protected:
+ int _instances;
+ QFileInfo fi;
+
+ public:
+ MidiPlugin(const QFileInfo* f, const MEMPI_Function, const MEMPI* d);
+ virtual ~MidiPlugin() {}
+
+ int instances() const { return _instances; }
+ virtual void incInstances(int val) { _instances += val; }
+
+ QString lib() const { return fi.baseName(); }
+ QString path() const { return fi.absolutePath(); }
+ QString name() const { return QString(plugin->name); }
+ QString description() const { return QString(plugin->description); }
+ QString version() const { return QString(plugin->version); }
+ MempiType type() const { return plugin->type; }
+ MidiPluginI* instantiate(MidiTrackBase*);
+ bool instantiate(MidiPluginI*);
+ };
+
+//---------------------------------------------------------
+// MidiPluginList
+//---------------------------------------------------------
+
+typedef std::list<MidiPlugin*>::iterator iMidiPlugin;
+
+class MidiPluginList : public std::list<MidiPlugin*> {
+ public:
+ MidiPlugin* find(const QString&, const QString&);
+ MidiPluginList() {}
+ };
+
+//---------------------------------------------------------
+// MidiPluginI
+// plugin instance
+//---------------------------------------------------------
+
+class MidiPluginI {
+ MidiPlugin* _plugin;
+ Mempi* mempi;
+
+ MidiTrackBase* _track;
+ bool _on;
+
+ public:
+ MidiPluginI(MidiPlugin*, MidiTrackBase*, Mempi*);
+ MidiPluginI(MidiTrackBase*);
+ ~MidiPluginI();
+
+ void setMempi(Mempi* m) { mempi = m; }
+
+ MidiPlugin* plugin() const { return _plugin; }
+ bool on() const { return _on; }
+ void setOn(bool val) { _on = val; }
+ void apply(unsigned, unsigned, MPEventList*, MPEventList*);
+
+ QString name() const { return QString(mempi->name()); }
+ QString lib() const { return _plugin->lib(); }
+ MidiTrackBase* track() const { return _track; }
+ void getGeometry(int*x, int*y, int* w, int* h) const { mempi->getGeometry(x, y, w, h); }
+ void setGeometry(int x, int y, int w, int h) { mempi->setGeometry(x, y, w, h); }
+ void writeConfiguration(Xml& xml);
+ bool readConfiguration(QDomNode);
+
+ void showGui();
+ void showGui(bool);
+ bool hasGui() const { return mempi->hasGui(); }
+ void getInitData(int* len, const unsigned char** p) { mempi->getInitData(len, p); }
+ void setInitData(int len, const unsigned char* p) { mempi->setInitData(len, p); }
+ bool guiVisible() const;
+ };
+
+//---------------------------------------------------------
+// Pipeline
+// chain of connected efx inserts
+//---------------------------------------------------------
+
+const int MidiPipelineDepth = 4;
+
+class MidiPipeline : public std::vector<MidiPluginI*> {
+ public:
+ MidiPipeline();
+ void insert(MidiPluginI* p, int index);
+ bool isOn(int idx) const;
+ void setOn(int, bool);
+ QString name(int idx) const;
+ void showGui(int, bool);
+ bool guiVisible(int);
+ void apply(unsigned, unsigned, MPEventList*, MPEventList*);
+ void move(int idx, bool up);
+ bool empty(int idx) const;
+ MidiPluginI* plugin(int idx) { return (*this)[idx]; }
+ };
+
+typedef MidiPipeline::iterator iMidiPluginI;
+typedef MidiPipeline::const_iterator ciMidiPluginI;
+
+//---------------------------------------------------------
+// MidiPluginDialog
+//---------------------------------------------------------
+
+class MidiPluginDialog : public QDialog {
+ QTreeWidget* pList;
+
+ Q_OBJECT
+
+ public:
+ MidiPluginDialog(QWidget* parent=0);
+ static MidiPlugin* getPlugin(QWidget* parent);
+ MidiPlugin* value();
+
+ public slots:
+ void fillPlugs();
+ };
+
+extern void initMidiPlugins();
+extern MidiPluginList midiPlugins;
+
+#endif
+
diff --git a/muse/muse/midiport.cpp b/muse/muse/midiport.cpp
new file mode 100644
index 00000000..3cdb8958
--- /dev/null
+++ b/muse/muse/midiport.cpp
@@ -0,0 +1,815 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "midiplugin.h"
+#include "midictrl.h"
+#include "globals.h"
+#include "midi.h"
+#include "instruments/minstrument.h"
+#include "al/xml.h"
+#include "driver/alsamidi.h"
+#include "audio.h"
+#include "midiedit/drummap.h"
+
+//---------------------------------------------------------
+// midiPortsPopup
+//---------------------------------------------------------
+
+QMenu* midiPortsPopup(QWidget* parent)
+ {
+ QMenu* p = new QMenu(parent);
+ MidiOutPortList* mpl = song->midiOutPorts();
+ for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i) {
+ MidiOutPort* port = *i;
+ p->addAction(port->name());
+ }
+ return p;
+ }
+
+//---------------------------------------------------------
+// MidiOutPort
+//---------------------------------------------------------
+
+MidiOutPort::MidiOutPort()
+ : MidiTrackBase(MIDI_OUT)
+ {
+ _instrument = genericMidiInstrument;
+ for (int ch = 0; ch < MIDI_CHANNELS; ++ch)
+ _channel[ch] = new MidiChannel(this, ch);
+ alsaPort = 0;
+ _nextPlayEvent = _playEvents.end();
+ _sendSync = false;
+ addMidiController(_instrument, CTRL_MASTER_VOLUME);
+ }
+
+//---------------------------------------------------------
+// playFifo
+//---------------------------------------------------------
+
+void MidiOutPort::playFifo()
+ {
+ while (!eventFifo.isEmpty())
+ putEvent(eventFifo.get());
+ }
+
+//---------------------------------------------------------
+// MidiOutPort
+//---------------------------------------------------------
+
+MidiOutPort::~MidiOutPort()
+ {
+ if (alsaPort)
+ midiDriver->unregisterPort(alsaPort);
+ for (int ch = 0; ch < MIDI_CHANNEL; ++ch) {
+ delete _channel[ch];
+ }
+ }
+
+//---------------------------------------------------------
+// setName
+//---------------------------------------------------------
+
+void MidiOutPort::setName(const QString& s)
+ {
+ Track::setName(s);
+ if (alsaPort)
+ midiDriver->setPortName(alsaPort, s);
+ else
+ alsaPort = midiDriver->registerInPort(s);
+ for (int ch = 0; ch < MIDI_CHANNELS; ++ch)
+ _channel[ch]->setDefaultName();
+ }
+
+//---------------------------------------------------------
+// MidiOutPort::write
+//---------------------------------------------------------
+
+void MidiOutPort::write(Xml& xml) const
+ {
+ xml.tag("MidiOutPort");
+ MidiTrackBase::writeProperties(xml);
+ if (_instrument)
+ xml.strTag("instrument", _instrument->iname());
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ if (!_channel[i]->noInRoute())
+ _channel[i]->write(xml);
+ }
+ xml.etag("MidiOutPort");
+ }
+
+//---------------------------------------------------------
+// MidiOutPort::read
+//---------------------------------------------------------
+
+void MidiOutPort::read(QDomNode node)
+ {
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ if (tag == "MidiChannel") {
+ int idx = e.attribute("idx", "0").toInt();
+ _channel[idx]->read(node.firstChild());
+ }
+ else if (tag == "instrument") {
+ QString iname = e.text();
+ _instrument = registerMidiInstrument(iname);
+ }
+ else if (MidiTrackBase::readProperties(node))
+ printf("MusE:MidiOutPort: unknown tag %s\n", tag.toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// activate
+//---------------------------------------------------------
+
+void MidiOutPort::activate1()
+ {
+ if (alsaPort == 0) {
+ _outRoutes.clear();
+ return;
+ }
+ for (iRoute i = _outRoutes.begin(); i != _outRoutes.end();) {
+ iRoute ni = i;
+ ++ni;
+ Route r = *i;
+ if (r.type == Route::MIDIPORT) {
+ if (!midiDriver->connect(alsaPort, i->port))
+ _outRoutes.erase(i);
+ }
+ i = ni;
+ }
+ }
+
+//---------------------------------------------------------
+// deactivate
+//---------------------------------------------------------
+
+void MidiOutPort::deactivate()
+ {
+ for (ciRoute i = _outRoutes.begin(); i != _outRoutes.end(); ++i)
+ midiDriver->disconnect(alsaPort, i->port);
+ }
+
+//---------------------------------------------------------
+// putEvent
+// send event to midi driver
+//---------------------------------------------------------
+
+void MidiOutPort::putEvent(const MidiEvent& ev)
+ {
+ if (ev.type() == ME_CONTROLLER) {
+ int a = ev.dataA();
+ int b = ev.dataB();
+ int chn = ev.channel();
+ if (chn == 255) {
+ // port controller
+ if (hwCtrlState(a) == ev.dataB())
+ return;
+ setHwCtrlState(a, b);
+ }
+ else {
+ MidiChannel* mc = channel(chn);
+ //
+ // optimize controller settings
+ //
+ if (mc->hwCtrlState(a) == ev.dataB())
+ return;
+ mc->setHwCtrlState(a, b);
+ }
+
+ if (a == CTRL_PITCH) {
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_PITCHBEND, b, 0));
+ return;
+ }
+ if (a == CTRL_PROGRAM) {
+ // don't output program changes for GM drum channel
+// if (!(song->mtype() == MT_GM && chn == 9)) {
+ int hb = (b >> 16) & 0xff;
+ int lb = (b >> 8) & 0xff;
+ int pr = b & 0x7f;
+ if (hb != 0xff)
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_HBANK, hb));
+ if (lb != 0xff)
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_LBANK, lb));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_PROGRAM, pr, 0));
+ return;
+// }
+ }
+ if (a == CTRL_MASTER_VOLUME) {
+ unsigned char sysex[] = {
+ 0x7f, 0x7f, 0x04, 0x01, 0x00, 0x00
+ };
+ sysex[4] = b & 0x7f;
+ sysex[5] = (b >> 7) & 0x7f;
+ MidiEvent e(ev.time(), ME_SYSEX, sysex, 6);
+ midiDriver->putEvent(alsaPort, e);
+ return;
+ }
+
+#if 1 // if ALSA cannot handle RPN NRPN etc.
+ if (a < 0x1000) { // 7 Bit Controller
+ //putMidiEvent(MidiEvent(0, chn, ME_CONTROLLER, a, b));
+ midiDriver->putEvent(alsaPort, ev);
+ }
+ else if (a < 0x20000) { // 14 bit high resolution controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ int dataH = (b >> 7) & 0x7f;
+ int dataL = b & 0x7f;
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, ctrlH, dataH));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, ctrlL, dataL));
+ }
+ else if (a < 0x30000) { // RPN 7-Bit Controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_HRPN, ctrlH));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_LRPN, ctrlL));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_HDATA, b));
+ }
+ else if (a < 0x40000) { // NRPN 7-Bit Controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_HNRPN, ctrlH));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_LNRPN, ctrlL));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_HDATA, b));
+ }
+ else if (a < 0x60000) { // RPN14 Controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ int dataH = (b >> 7) & 0x7f;
+ int dataL = b & 0x7f;
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_HRPN, ctrlH));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_LRPN, ctrlL));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_HDATA, dataH));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_LDATA, dataL));
+ }
+ else if (a < 0x70000) { // NRPN14 Controller
+ int ctrlH = (a >> 8) & 0x7f;
+ int ctrlL = a & 0x7f;
+ int dataH = (b >> 7) & 0x7f;
+ int dataL = b & 0x7f;
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_HNRPN, ctrlH));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_LNRPN, ctrlL));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_HDATA, dataH));
+ midiDriver->putEvent(alsaPort, MidiEvent(0, chn, ME_CONTROLLER, CTRL_LDATA, dataL));
+ }
+ else {
+ printf("putEvent: unknown controller type 0x%x\n", a);
+ }
+#endif
+ }
+ midiDriver->putEvent(alsaPort, ev);
+ }
+
+//---------------------------------------------------------
+// playEventList
+//---------------------------------------------------------
+
+void MidiOutPort::playEventList()
+ {
+ for (; _nextPlayEvent != _playEvents.end(); ++_nextPlayEvent)
+ midiDriver->putEvent(alsaPort, *_nextPlayEvent);
+ }
+
+//---------------------------------------------------------
+// sendGmOn
+// send GM-On message to midi device and keep track
+// of device state
+//---------------------------------------------------------
+
+void MidiOutPort::sendGmOn()
+ {
+ sendSysex(gmOnMsg, gmOnMsgLen);
+ setHwCtrlState(CTRL_PROGRAM, 0);
+ setHwCtrlState(CTRL_PITCH, 0);
+ setHwCtrlState(CTRL_VOLUME, 100);
+ setHwCtrlState(CTRL_PANPOT, 64);
+ setHwCtrlState(CTRL_REVERB_SEND, 40);
+ setHwCtrlState(CTRL_CHORUS_SEND, 0);
+ _meter[0] = 0.0f;
+ }
+
+//---------------------------------------------------------
+// sendGsOn
+// send Roland GS-On message to midi device and keep track
+// of device state
+//---------------------------------------------------------
+
+void MidiOutPort::sendGsOn()
+ {
+ static unsigned char data2[] = { 0x41, 0x10, 0x42, 0x12, 0x40, 0x01, 0x33, 0x50, 0x3c };
+ static unsigned char data3[] = { 0x41, 0x10, 0x42, 0x12, 0x40, 0x01, 0x34, 0x50, 0x3b };
+
+ sendSysex(data2, sizeof(data2));
+ sendSysex(data3, sizeof(data3));
+ }
+
+//---------------------------------------------------------
+// sendXgOn
+// send Yamaha XG-On message to midi device and keep track
+// of device state
+//---------------------------------------------------------
+
+void MidiOutPort::sendXgOn()
+ {
+ sendSysex(xgOnMsg, xgOnMsgLen);
+ setHwCtrlState(CTRL_PROGRAM, 0);
+ setHwCtrlState(CTRL_MODULATION, 0);
+ setHwCtrlState(CTRL_PORTAMENTO_TIME, 0);
+ setHwCtrlState(CTRL_VOLUME, 0x64);
+ setHwCtrlState(CTRL_PANPOT, 0x40);
+ setHwCtrlState(CTRL_EXPRESSION, 0x7f);
+ setHwCtrlState(CTRL_SUSTAIN, 0x0);
+ setHwCtrlState(CTRL_PORTAMENTO, 0x0);
+ setHwCtrlState(CTRL_SOSTENUTO, 0x0);
+ setHwCtrlState(CTRL_SOFT_PEDAL, 0x0);
+ setHwCtrlState(CTRL_HARMONIC_CONTENT, 0x40);
+ setHwCtrlState(CTRL_RELEASE_TIME, 0x40);
+ setHwCtrlState(CTRL_ATTACK_TIME, 0x40);
+ setHwCtrlState(CTRL_BRIGHTNESS, 0x40);
+ setHwCtrlState(CTRL_REVERB_SEND, 0x28);
+ setHwCtrlState(CTRL_CHORUS_SEND, 0x0);
+ setHwCtrlState(CTRL_VARIATION_SEND, 0x0);
+ _meter[0] = 0.0f;
+ }
+
+//---------------------------------------------------------
+// sendSysex
+// send SYSEX message to midi device
+//---------------------------------------------------------
+
+void MidiOutPort::sendSysex(const unsigned char* p, int n)
+ {
+ MidiEvent event(0, ME_SYSEX, p, n);
+ putEvent(event);
+ }
+
+//---------------------------------------------------------
+// sendStart
+//---------------------------------------------------------
+
+void MidiOutPort::sendStart()
+ {
+ MidiEvent event(0, 0, ME_START, 0, 0);
+ putEvent(event);
+ }
+
+//---------------------------------------------------------
+// sendStop
+//---------------------------------------------------------
+
+void MidiOutPort::sendStop()
+ {
+ MidiEvent event(0, 0, ME_STOP, 0, 0);
+ putEvent(event);
+ }
+
+//---------------------------------------------------------
+// sendClock
+//---------------------------------------------------------
+
+void MidiOutPort::sendClock()
+ {
+ MidiEvent event(0, 0, ME_CLOCK, 0, 0);
+ putEvent(event);
+ }
+
+//---------------------------------------------------------
+// sendContinue
+//---------------------------------------------------------
+
+void MidiOutPort::sendContinue()
+ {
+ MidiEvent event(0, 0, ME_CONTINUE, 0, 0);
+ putEvent(event);
+ }
+
+//---------------------------------------------------------
+// sendSongpos
+//---------------------------------------------------------
+
+void MidiOutPort::sendSongpos(int pos)
+ {
+ MidiEvent event(0, 0, ME_SONGPOS, pos, 0);
+ putEvent(event);
+ }
+
+//---------------------------------------------------------
+// playMidiEvent
+// called from GUI
+//---------------------------------------------------------
+
+void MidiOutPort::playMidiEvent(MidiEvent* ev)
+ {
+ if (ev->type() == ME_NOTEON) {
+ _meter[0] += ev->dataB()/2;
+ if (_meter[0] > 127.0f)
+ _meter[0] = 127.0f;
+ }
+ RouteList* orl = outRoutes();
+ bool sendToFifo = false;
+ for (iRoute i = orl->begin(); i != orl->end(); ++i) {
+ if (i->type == Route::MIDIPORT)
+ sendToFifo = true;
+ else if (i->type == Route::SYNTIPORT) {
+ if (((SynthI*)i->track)->eventFifo()->put(*ev))
+ printf("MidiOut::playMidiEvent(): synti overflow, drop event\n");
+ }
+ else
+ printf("MidiOutPort::playMidiEvent: bad route type\n");
+ }
+ if (sendToFifo) {
+ if (eventFifo.put(*ev))
+ printf("MidiPort::playMidiEvent(): port overflow, drop event\n");
+ }
+ }
+
+//---------------------------------------------------------
+// setInstrument
+//---------------------------------------------------------
+
+void MidiOutPort::setInstrument(MidiInstrument* i)
+ {
+ _instrument = i;
+ emit instrumentChanged();
+ }
+
+//---------------------------------------------------------
+// setSendSync
+//---------------------------------------------------------
+
+void MidiOutPort::setSendSync(bool val)
+ {
+ _sendSync = val;
+ emit sendSyncChanged(val);
+ }
+
+//---------------------------------------------------------
+// MidiInPort
+//---------------------------------------------------------
+
+MidiInPort::MidiInPort()
+ : MidiTrackBase(MIDI_IN)
+ {
+ alsaPort = 0;
+ }
+
+//---------------------------------------------------------
+// MidiInPort
+//---------------------------------------------------------
+
+MidiInPort::~MidiInPort()
+ {
+ if (alsaPort)
+ midiDriver->unregisterPort(alsaPort);
+ }
+
+//---------------------------------------------------------
+// setName
+//---------------------------------------------------------
+
+void MidiInPort::setName(const QString& s)
+ {
+ Track::setName(s);
+ if (alsaPort)
+ midiDriver->setPortName(alsaPort, s);
+ else
+ alsaPort = midiDriver->registerOutPort(s);
+ }
+
+//---------------------------------------------------------
+// MidiInPort::write
+//---------------------------------------------------------
+
+void MidiInPort::write(Xml& xml) const
+ {
+ xml.tag("MidiInPort");
+ MidiTrackBase::writeProperties(xml);
+ xml.etag("MidiInPort");
+ }
+
+//---------------------------------------------------------
+// MidiInPort::read
+//---------------------------------------------------------
+
+void MidiInPort::read(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ if (MidiTrackBase::readProperties(node))
+ printf("MusE:MidiInPort: unknown tag %s\n", tag.toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
+//---------------------------------------------------------
+// activate
+//---------------------------------------------------------
+
+void MidiInPort::activate1()
+ {
+ if (alsaPort == 0) {
+ _inRoutes.clear();
+ return;
+ }
+ for (iRoute i = _inRoutes.begin(); i != _inRoutes.end();) {
+ iRoute ni = i;
+ ++ni;
+ Route r = *i;
+ if (!midiDriver->connect(i->port, alsaPort))
+ _inRoutes.erase(i);
+ i = ni;
+ }
+ }
+
+//---------------------------------------------------------
+// deactivate
+//---------------------------------------------------------
+
+void MidiInPort::deactivate()
+ {
+ for (ciRoute i = _inRoutes.begin(); i != _inRoutes.end(); ++i)
+ midiDriver->disconnect(i->port, alsaPort);
+ }
+
+//---------------------------------------------------------
+// midiReceived
+//---------------------------------------------------------
+
+void MidiInPort::eventReceived(snd_seq_event_t* ev)
+ {
+ MidiEvent event;
+ event.setB(0);
+ event.setTime(audio->timestamp());
+
+ switch(ev->type) {
+ case SND_SEQ_EVENT_NOTEON:
+ event.setChannel(ev->data.note.channel);
+ event.setType(ME_NOTEON);
+ event.setA(ev->data.note.note);
+ event.setB(ev->data.note.velocity);
+ break;
+
+ case SND_SEQ_EVENT_KEYPRESS:
+ event.setChannel(ev->data.note.channel);
+ event.setType(ME_POLYAFTER);
+ event.setA(ev->data.note.note);
+ event.setB(ev->data.note.velocity);
+ break;
+
+ case SND_SEQ_EVENT_SYSEX:
+ event.setTime(0); // mark as used
+ event.setType(ME_SYSEX);
+ event.setData((unsigned char*)(ev->data.ext.ptr)+1,
+ ev->data.ext.len-2);
+ break;
+
+ case SND_SEQ_EVENT_NOTEOFF:
+ event.setChannel(ev->data.note.channel);
+ event.setType(ME_NOTEOFF);
+ event.setA(ev->data.note.note);
+ event.setB(ev->data.note.velocity);
+ break;
+
+ case SND_SEQ_EVENT_CHANPRESS:
+ event.setChannel(ev->data.control.channel);
+ event.setType(ME_AFTERTOUCH);
+ event.setA(ev->data.control.value);
+ break;
+
+ case SND_SEQ_EVENT_PGMCHANGE:
+ event.setChannel(ev->data.control.channel);
+ event.setType(ME_PROGRAM);
+ event.setA(ev->data.control.value);
+ break;
+
+ case SND_SEQ_EVENT_PITCHBEND:
+ event.setChannel(ev->data.control.channel);
+ event.setType(ME_PITCHBEND);
+ event.setA(ev->data.control.value);
+ break;
+
+ case SND_SEQ_EVENT_CONTROLLER:
+ event.setChannel(ev->data.control.channel);
+ event.setType(ME_CONTROLLER);
+ event.setA(ev->data.control.param);
+ event.setB(ev->data.control.value);
+ break;
+ }
+
+ if (midiInputTrace) {
+ printf("MidiInput<%s>: ", name().toLatin1().data());
+ event.dump();
+ }
+ //
+ // process midi filter pipeline and add event to
+ // _recordEvents
+ //
+
+ MPEventList il, ol;
+ il.insert(event);
+ pipeline()->apply(0, 0, &il, &ol);
+
+ //
+ // update midi meter
+ // notify gui of new events
+ //
+ for (iMPEvent i = ol.begin(); i != ol.end(); ++i) {
+ if (i->type() == ME_NOTEON)
+ addMidiMeter(i->dataB());
+ song->putEvent(*i);
+ _recordEvents.add(*i);
+ }
+ }
+
+//---------------------------------------------------------
+// afterProcess
+// clear all recorded events after a process cycle
+//---------------------------------------------------------
+
+void MidiInPort::afterProcess()
+ {
+ _recordEvents.clear();
+ }
+
+//---------------------------------------------------------
+// getEvents
+//---------------------------------------------------------
+
+void MidiInPort::getEvents(unsigned, unsigned, int ch, MPEventList* dst)
+ {
+ for (iMPEvent i = _recordEvents.begin(); i != _recordEvents.end(); ++i) {
+ if (i->channel() == ch || ch == -1)
+ dst->insert(*i);
+ }
+ }
+
+//---------------------------------------------------------
+// MidiChannel
+//---------------------------------------------------------
+
+MidiChannel::MidiChannel(MidiOutPort* p, int ch)
+ : MidiTrackBase(MIDI_CHANNEL)
+ {
+ _port = p;
+ _channelNo = ch;
+ _drumMap = 0;
+ _useDrumMap = false;
+ initMidiController();
+
+ //
+ // create minimum set of managed controllers
+ // to make midi mixer operational
+ //
+ MidiInstrument* mi = port()->instrument();
+ addMidiController(mi, CTRL_PROGRAM);
+ addMidiController(mi, CTRL_VOLUME);
+ addMidiController(mi, CTRL_PANPOT);
+ addMidiController(mi, CTRL_REVERB_SEND);
+ addMidiController(mi, CTRL_CHORUS_SEND);
+ addMidiController(mi, CTRL_VARIATION_SEND);
+ }
+
+//---------------------------------------------------------
+// MidiChannel
+//---------------------------------------------------------
+
+MidiChannel::~MidiChannel()
+ {
+ }
+
+//---------------------------------------------------------
+// MidiChannel::write
+//---------------------------------------------------------
+
+void MidiChannel::write(Xml& xml) const
+ {
+ xml.tag("MidiChannel idx=\"%d\"", _channelNo);
+ MidiTrackBase::writeProperties(xml);
+ xml.intTag("useDrumMap", _useDrumMap);
+ xml.etag("MidiChannel");
+ }
+
+//---------------------------------------------------------
+// MidiChannel::read
+//---------------------------------------------------------
+
+void MidiChannel::read(QDomNode node)
+ {
+ QString drumMapName;
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ if (tag == "useDrumMap")
+ _useDrumMap = e.text().toInt();
+ else if (MidiTrackBase::readProperties(node))
+ printf("MusE:MidiChannel: unknown tag %s\n", tag.toLatin1().data());
+ node = node.nextSibling();
+ }
+ MidiOutPort* op = port();
+ if (op) {
+ MidiInstrument* mi = op->instrument();
+ int val = ctrlVal(CTRL_PROGRAM).i;
+ _drumMap = mi->getDrumMap(val);
+ }
+ }
+
+//---------------------------------------------------------
+// playMidiEvent
+//---------------------------------------------------------
+
+void MidiChannel::playMidiEvent(MidiEvent* ev)
+ {
+ if (ev->type() == ME_NOTEON) {
+ _meter[0] += ev->dataB()/2;
+ if (_meter[0] > 127.0f)
+ _meter[0] = 127.0f;
+ }
+ ev->setChannel(_channelNo);
+ _port->playMidiEvent(ev);
+ }
+
+//---------------------------------------------------------
+// setUseDrumMap
+//---------------------------------------------------------
+
+void MidiChannel::setUseDrumMap(bool val)
+ {
+ if (_useDrumMap != val) {
+ _useDrumMap = val;
+ if (_useDrumMap) {
+ int val = ctrlVal(CTRL_PROGRAM).i;
+ MidiOutPort* op = port();
+ MidiInstrument* mi = op->instrument();
+ DrumMap* dm = mi->getDrumMap(val);
+ if (dm == 0)
+ dm = &gmDrumMap;
+ _drumMap = dm;
+ }
+ else
+ _drumMap = &noDrumMap;
+ for (iRoute i = _inRoutes.begin(); i != _inRoutes.end(); ++i) {
+ MidiTrack* mt = (MidiTrack*)(i->track);
+ mt->changeDrumMap();
+ }
+ emit useDrumMapChanged(_useDrumMap);
+ }
+ }
+
+//---------------------------------------------------------
+// emitControllerChanged
+//---------------------------------------------------------
+
+void MidiChannel::emitControllerChanged(int id)
+ {
+ if (id == CTRL_PROGRAM && _useDrumMap) {
+ int val = ctrlVal(id).i;
+ MidiOutPort* op = port();
+ MidiInstrument* mi = op->instrument();
+ DrumMap* dm = mi->getDrumMap(val);
+ if (dm == 0)
+ dm = &gmDrumMap;
+ if (dm != _drumMap) {
+ _drumMap = dm;
+ for (iRoute i = _inRoutes.begin(); i != _inRoutes.end(); ++i) {
+ MidiTrack* mt = (MidiTrack*)(i->track);
+ mt->changeDrumMap();
+ }
+ }
+ }
+ emit controllerChanged(id);
+ }
+
+//---------------------------------------------------------
+// isMute
+//---------------------------------------------------------
+
+bool MidiChannel::isMute() const
+ {
+ if (_solo)
+ return false;
+ if (song->solo())
+ return true;
+ return _mute;
+ }
+
diff --git a/muse/muse/midiport.h b/muse/muse/midiport.h
new file mode 100644
index 00000000..80319aad
--- /dev/null
+++ b/muse/muse/midiport.h
@@ -0,0 +1,25 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDIPORT_H__
+#define __MIDIPORT_H__
+
+#endif
+
diff --git a/muse/muse/midirc.cpp b/muse/muse/midirc.cpp
new file mode 100644
index 00000000..b889bcb2
--- /dev/null
+++ b/muse/muse/midirc.cpp
@@ -0,0 +1,180 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "midirc.h"
+#include "song.h"
+#include "midi.h"
+
+MidiRCList midiRCList;
+
+//---------------------------------------------------------
+// isActive
+//---------------------------------------------------------
+
+bool MidiRCList::isActive(int action)
+ {
+ for (iMidiRC i = begin(); i != end(); ++i) {
+ if (i->action == action)
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// setAction
+//---------------------------------------------------------
+
+void MidiRCList::setAction(const MidiEvent& e, int action)
+ {
+ //
+ // TODO: check for already used events
+ //
+ for (iMidiRC i = begin(); i != end(); ++i) {
+ if (i->action == action) {
+// printf("replace action %d: ", action);
+// i->event.dump();
+ i->event = e;
+ return;
+ }
+ }
+ push_back(MidiRC(e, action));
+// printf("add action %d: ", action);
+ e.dump();
+ }
+
+//---------------------------------------------------------
+// emitAction
+//---------------------------------------------------------
+
+void MidiRCList::emitAction(int action) const
+ {
+// printf("emit action %d\n", action);
+ switch(action) {
+ case RC_STOP:
+ song->setStop(true);
+ break;
+ case RC_PLAY:
+ song->setPlay(true);
+ break;
+ case RC_RECORD:
+ song->setRecord(true);
+ break;
+ case RC_GOTO_LEFT_MARK:
+ song->setPos(0, song->lpos(), true, true, true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// doAction
+// emit action associated with event e
+// return true if action found
+//---------------------------------------------------------
+
+bool MidiRCList::doAction(const MidiEvent& e)
+ {
+// printf("MidiRCList::doAction ");
+// e.dump();
+ for (iMidiRC i = begin(); i != end(); ++i) {
+ if ((i->event.type()& 0xf0) == (e.type() & 0xf0)) {
+ //
+ // for note on events only compare pitch, not velocity
+ // ignore note off events (note on with velicity zero
+ //
+ if ((e.type() == ME_NOTEON)
+ && i->event.dataA() == e.dataA()
+ && e.dataB() != 0) {
+ emitAction(i->action);
+ return true;
+ }
+ //
+ // compare controller and controller value
+ // TODO: maybe we need a special option to
+ // ignore the controller value
+ //
+ if ((e.type() == ME_CONTROLLER)
+ && i->event.dataA() == e.dataA()
+ && i->event.dataB() == e.dataB()) {
+ emitAction(i->action);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void MidiRCList::read(QDomNode node)
+ {
+ int action = 0;
+ MidiEvent event;
+ for (node = node.firstChild(); !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "action") {
+ action = e.attribute("id", "0").toInt();
+ for (QDomNode n = node.firstChild(); !n.isNull(); n = n.nextSibling()) {
+ QDomElement e1 = node.toElement();
+ if (e1.isNull())
+ continue;
+ if (e1.tagName() == "noteOn") {
+ event.setType(ME_NOTEON);
+ event.setA(e1.attribute("pitch","0").toInt());
+ }
+ else if (e1.tagName() == "controller") {
+ event.setType(ME_CONTROLLER);
+ event.setA(e1.attribute("no","0").toInt());
+ event.setB(e1.attribute("val","0").toInt());
+ }
+ else
+ printf("MusE:midiRC:action: unknown tag %s\n", e1.tagName().toLatin1().data());
+ }
+ setAction(event, action);
+ }
+ else
+ printf("MusE:midiRC: unknown tag %s\n", e.tagName().toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void MidiRCList::write(Xml& xml)
+ {
+ xml.tag("midiRC");
+ for (iMidiRC i = begin(); i != end(); ++i) {
+ xml.tag("action id=\"%d\"", i->action);
+ if (i->event.type() == ME_NOTEON)
+ xml.tag("noteOn pitch=\"%d\"", i->event.dataA());
+ else if (i->event.type() == ME_CONTROLLER)
+ xml.tag("controller no=\"%d\" val=\"%d\"",
+ i->event.dataA(), i->event.dataB());
+ else
+ printf("remote event type %d not supported\n", i->event.type());
+ xml.etag("action");
+ }
+ xml.etag("midiRC");
+ }
+
diff --git a/muse/muse/midirc.h b/muse/muse/midirc.h
new file mode 100644
index 00000000..a992f198
--- /dev/null
+++ b/muse/muse/midirc.h
@@ -0,0 +1,65 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDIRC_H__
+#define __MIDIRC_H__
+
+#include "event.h"
+#include "mpevent.h"
+
+enum {
+ RC_STOP, RC_PLAY, RC_RECORD, RC_GOTO_LEFT_MARK
+ };
+
+//---------------------------------------------------------
+// MidiRC
+//---------------------------------------------------------
+
+struct MidiRC {
+ MidiEvent event;
+ int action;
+
+ MidiRC(const MidiEvent& e, int a)
+ : event(e), action(a)
+ {
+ }
+ };
+
+//---------------------------------------------------------
+// MidiRCList
+//---------------------------------------------------------
+
+class MidiRCList : public std::list<MidiRC> {
+
+ void emitAction(int) const;
+
+ public:
+ MidiRCList() {}
+ void setAction(const MidiEvent& e, int action);
+ bool isActive(int action);
+ bool doAction(const MidiEvent&);
+ void read(QDomNode);
+ void write(Xml&);
+ };
+
+typedef MidiRCList::iterator iMidiRC;
+
+extern MidiRCList midiRCList;
+#endif
diff --git a/muse/muse/midiseq.cpp b/muse/muse/midiseq.cpp
new file mode 100644
index 00000000..5fac0c5c
--- /dev/null
+++ b/muse/muse/midiseq.cpp
@@ -0,0 +1,549 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "globals.h"
+#include "midi.h"
+#include "midiseq.h"
+#include "midictrl.h"
+#include "audio.h"
+#include "driver/alsamidi.h"
+#include "driver/posixtimer.h"
+#include "driver/alsatimer.h"
+#include "sync.h"
+#include "song.h"
+#include "gconfig.h"
+#include "al/tempo.h"
+#include "al/al.h"
+#include "instruments/minstrument.h"
+
+MidiSeq* midiSeq;
+static const unsigned char mmcStopMsg[] = { 0x7f, 0x7f, 0x06, 0x01 };
+static const unsigned char mmcDeferredPlayMsg[] = { 0x7f, 0x7f, 0x06, 0x03 };
+
+//---------------------------------------------------------
+// readMsg
+//---------------------------------------------------------
+
+static void readMsg(void* p, void*)
+ {
+ MidiSeq* at = (MidiSeq*)p;
+ at->readMsg();
+ }
+
+//---------------------------------------------------------
+// processMsg
+//---------------------------------------------------------
+
+void MidiSeq::processMsg(const ThreadMsg* m)
+ {
+ AudioMsg* msg = (AudioMsg*)m;
+ switch (msg->id) {
+ case MS_PROCESS:
+ audio->processMidi(msg->time);
+ break;
+ case SEQM_SEEK:
+ processSeek();
+ break;
+ case MS_START:
+ processStart();
+ break;
+ case MS_STOP:
+ processStop();
+ break;
+ case MS_SET_RTC:
+ initRealtimeTimer();
+ break;
+ case SEQM_RESET_DEVICES:
+ resetDevices();
+ break;
+ case SEQM_ADD_TRACK:
+ song->insertTrack2(msg->track);
+ updatePollFd();
+ break;
+ case SEQM_REMOVE_TRACK:
+ song->removeTrack2(msg->track);
+ updatePollFd();
+ break;
+ case SEQM_ADD_PART:
+ song->cmdAddPart((Part*)msg->p1);
+ break;
+ case SEQM_REMOVE_PART:
+ song->cmdRemovePart((Part*)msg->p1);
+ break;
+ case SEQM_CHANGE_PART:
+ song->cmdChangePart((Part*)msg->p1, (Part*)msg->p2);
+ break;
+ case SEQM_IDLE:
+ idle = msg->a;
+ break;
+ case SEQM_MOVE_TRACK:
+ song->moveTrack((Track*)(msg->p1), (Track*)(msg->p2));
+ break;
+ case AUDIO_ADDMIDIPLUGIN:
+ ((MidiTrackBase*)msg->track)->addPlugin(msg->mplugin, msg->ival);
+ break;
+ default:
+ song->processMsg(msg);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// processStart
+//---------------------------------------------------------
+
+void MidiSeq::processStart()
+ {
+ if (genMMC || genMCSync) {
+ MidiOutPortList* ol = song->midiOutPorts();
+ for (iMidiOutPort i = ol->begin(); i != ol->end(); ++i) {
+ MidiOutPort* mp = *i;
+ if (!mp->sendSync())
+ continue;
+ if (genMMC)
+ mp->sendSysex(mmcDeferredPlayMsg, sizeof(mmcDeferredPlayMsg));
+ if (genMCSync) {
+ if (audio->tickPos())
+ mp->sendContinue();
+ else
+ mp->sendStart();
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// processStop
+// synced with audio process()
+//---------------------------------------------------------
+
+void MidiSeq::processStop()
+ {
+ //---------------------------------------------------
+ // stop stuck notes
+ //---------------------------------------------------
+
+ MidiOutPortList* ol = song->midiOutPorts();
+ for (iMidiOutPort id = ol->begin(); id != ol->end(); ++id) {
+ MidiOutPort* md = *id;
+ if (md->noOutRoute())
+ continue;
+ MPEventList* pel = md->playEvents();
+ for (iMPEvent i = pel->begin(); i != pel->end(); ++i) {
+ MidiEvent ev = *i;
+ if (ev.isNoteOff()) {
+ ev.setTime(0);
+ md->putEvent(ev);
+ }
+ }
+ pel->clear();
+ md->setNextPlayEvent(pel->begin());
+ }
+
+ //---------------------------------------------------
+ // reset sustain
+ //---------------------------------------------------
+
+ MidiChannelList* mcl = song->midiChannel();
+ for (iMidiChannel i = mcl->begin(); i != mcl->end(); ++i) {
+ MidiChannel* mc = *i;
+ if (mc->noInRoute())
+ continue;
+ MidiOutPort* mp = mc->port();
+ if (mc->hwCtrlState(CTRL_SUSTAIN) != CTRL_VAL_UNKNOWN) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, CTRL_SUSTAIN, 0);
+ ev.setChannel(mc->channelNo());
+ mp->putEvent(ev);
+ }
+ }
+
+ if (genMMC || genMCSync) {
+ MidiOutPortList* ol = song->midiOutPorts();
+ for (iMidiOutPort i = ol->begin(); i != ol->end(); ++i) {
+ MidiOutPort* mp = *i;
+ if (!mp->sendSync())
+ continue;
+ if (genMMC) {
+ unsigned char mmcPos[] = {
+ 0x7f, 0x7f, 0x06, 0x44, 0x06, 0x01,
+ 0, 0, 0, 0, 0
+ };
+ int frame = AL::tempomap.tick2frame(audio->tickPos());
+ MTC mtc(double(frame) / double(AL::sampleRate));
+ mmcPos[6] = mtc.h() | (AL::mtcType << 5);
+ mmcPos[7] = mtc.m();
+ mmcPos[8] = mtc.s();
+ mmcPos[9] = mtc.f();
+ mmcPos[10] = mtc.sf();
+ mp->sendSysex(mmcStopMsg, sizeof(mmcStopMsg));
+ mp->sendSysex(mmcPos, sizeof(mmcPos));
+ }
+ if (genMCSync) { // Midi Clock
+ // send STOP and
+ // "set song position pointer"
+ mp->sendStop();
+ mp->sendSongpos(audio->tickPos() * 4 / config.division);
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// resetDevices
+//---------------------------------------------------------
+
+void MidiSeq::resetDevices()
+ {
+ MidiOutPortList* ol = song->midiOutPorts();
+ for (iMidiOutPort id = ol->begin(); id != ol->end(); ++id) {
+ MidiOutPort* md = *id;
+ MidiInstrument* instr = md->instrument();
+ instr->reset(md);
+ }
+ }
+
+//---------------------------------------------------------
+// processSeek
+// synced with audio process()
+//---------------------------------------------------------
+
+void MidiSeq::processSeek()
+ {
+ int pos = audio->tickPos();
+ if (genMCSync) {
+ MidiOutPortList* ol = song->midiOutPorts();
+ for (iMidiOutPort i = ol->begin(); i != ol->end(); ++i) {
+ MidiOutPort* mp = *i;
+ if (!mp->sendSync())
+ continue;
+ int beat = (pos * 4) / config.division;
+ mp->sendStop();
+ mp->sendSongpos(beat);
+ mp->sendContinue();
+ }
+ }
+
+// if (pos == 0 && !song->record())
+// audio->initDevices();
+
+ //---------------------------------------------------
+ // set all controller
+ //---------------------------------------------------
+
+ MidiOutPortList* opl = song->midiOutPorts();
+
+ for (iMidiOutPort i = opl->begin(); i != opl->end(); ++i) {
+ MidiOutPort* op = *i;
+ if (op->mute())
+ continue;
+ MPEventList* el = op->playEvents();
+ if (audio->isPlaying()) {
+ // stop all notes
+ for (iMPEvent i = el->begin(); i != el->end(); ++i) {
+ MidiEvent ev = *i;
+ if (ev.isNoteOff()) {
+ ev.setTime(0);
+ op->putEvent(ev);
+ // el->add(ev);
+ }
+ }
+ el->clear();
+ }
+ else
+ el->erase(el->begin(), op->nextPlayEvent());
+ for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
+ MidiChannel* mc = op->channel(ch);
+ if (mc->mute() || mc->noInRoute() || !mc->autoRead())
+ continue;
+ CtrlList* cll = mc->controller();
+ for (iCtrl ivl = cll->begin(); ivl != cll->end(); ++ivl) {
+ Ctrl* c = ivl->second;
+ int val = c->value(pos).i;
+ if (val != CTRL_VAL_UNKNOWN && val != c->curVal().i) {
+ op->putEvent(MidiEvent(0, ch, ME_CONTROLLER, c->id(), val));
+ }
+ }
+ }
+ op->setNextPlayEvent(op->playEvents()->begin());
+ }
+ }
+
+//---------------------------------------------------------
+// MidiSeq
+//---------------------------------------------------------
+
+MidiSeq::MidiSeq(const char* name)
+ : Thread(name)
+ {
+ idle = false;
+ midiClock = 0;
+ mclock1 = 0.0;
+ mclock2 = 0.0;
+ songtick1 = songtick2 = 0;
+ lastTempo = 0;
+ storedtimediffs = 0;
+ timer = 0;
+ }
+
+//---------------------------------------------------------
+// threadStart
+// called from loop()
+//---------------------------------------------------------
+
+void MidiSeq::threadStart(void*)
+ {
+ struct sched_param rt_param;
+ memset(&rt_param, 0, sizeof(rt_param));
+
+ int prio_min = sched_get_priority_min(SCHED_FIFO);
+ int prio_max = sched_get_priority_max(SCHED_FIFO);
+ int prio = realTimePriority;
+ if (prio < prio_min)
+ prio = prio_min;
+ else if (prio > prio_max)
+ prio = prio_max;
+ rt_param.sched_priority = prio;
+
+ pthread_t tid = pthread_self();
+ int rv = pthread_setschedparam(tid, SCHED_FIFO, &rt_param);
+ if (rv != 0)
+ perror("set realtime scheduler");
+
+ int policy;
+ if ((policy = sched_getscheduler (0)) < 0) {
+ printf("cannot get current client scheduler for midi thread: %s!\n", strerror(errno));
+ }
+ else {
+ if (policy != SCHED_FIFO)
+ printf("midi thread %d _NOT_ running SCHED_FIFO\n", getpid());
+ else if (debugMsg) {
+ struct sched_param rt_param;
+ int rv;
+ memset(&rt_param, 0, sizeof(sched_param));
+ int type;
+ rv = pthread_getschedparam(pthread_self(), &type, &rt_param);
+ if (rv == -1)
+ perror("get scheduler parameter");
+ printf("midiseq thread running SCHED_FIFO priority %d\n",
+ rt_param.sched_priority);
+ }
+ }
+// timer = new PosixTimer;
+// if (!timer->initTimer()) {
+// delete timer;
+ timer = new RtcTimer;
+ if (!timer->initTimer()) {
+ delete timer;
+ timer = new AlsaTimer;
+ if (!timer->initTimer()) {
+ fprintf(stderr, "no midi timer available\n");
+ abort();
+ }
+ }
+// }
+ initRealtimeTimer();
+ updatePollFd();
+ }
+
+//---------------------------------------------------------
+// midiRead
+//---------------------------------------------------------
+
+
+static void midiRead(void*, void*)
+ {
+ midiDriver->read(midiSeq);
+ }
+
+//---------------------------------------------------------
+// updatePollFd
+//---------------------------------------------------------
+
+void MidiSeq::updatePollFd()
+ {
+ if (!isRunning())
+ return;
+ clearPollFd();
+ int timerFd = timer->getFd();
+ if (timerFd != -1)
+ addPollFd(timerFd, POLLIN, midiTick, this, 0);
+
+ addPollFd(toThreadFdr, POLLIN, ::readMsg, this, 0);
+
+ struct pollfd* pfd;
+ int n;
+ midiDriver->getInputPollFd(&pfd, &n);
+ for (int i = 0; i < n; ++i)
+ addPollFd(pfd[i].fd, POLLIN, ::midiRead, this, 0);
+// midiDriver->getOutputPollFd(&pfd, &n);
+// for (int i = 0; i < n; ++i)
+// addPollFd(pfdi[i].fd, POLLOUT, ::midiWrite, this, 0);
+ }
+
+//---------------------------------------------------------
+// threadStop
+// called from loop()
+//---------------------------------------------------------
+
+void MidiSeq::threadStop()
+ {
+ if (timer)
+ timer->stopTimer();
+ }
+
+//---------------------------------------------------------
+// setRtcTicks
+// return true on success
+//---------------------------------------------------------
+
+bool MidiSeq::initRealtimeTimer()
+ {
+ if (!timer->setTimerFreq(config.rtcTicks))
+ return false;
+ if (!timer->startTimer())
+ return false;
+ realRtcTicks = config.rtcTicks;
+ return true;
+ }
+
+//---------------------------------------------------------
+// start
+// return true on error
+//---------------------------------------------------------
+
+bool MidiSeq::start(int prio)
+ {
+ Thread::start(prio);
+ return false;
+ }
+
+//---------------------------------------------------------
+// processMidiClock
+//---------------------------------------------------------
+
+void MidiSeq::processMidiClock()
+ {
+/* if (genMCSync)
+ midiPorts[txSyncPort].sendClock();
+ if (state == START_PLAY) {
+ // start play on sync
+ state = PLAY;
+ _midiTick = playTickPos;
+ midiClock = playTickPos;
+
+ int bar, beat, tick;
+ sigmap.tickValues(_midiTick, &bar, &beat, &tick);
+ midiClick = sigmap.bar2tick(bar, beat+1, 0);
+
+ double cpos = tempomap.tick2time(playTickPos);
+ samplePosStart = samplePos - lrint(cpos * sampleRate);
+ rtcTickStart = rtcTick - lrint(cpos * realRtcTicks);
+
+ endSlice = playTickPos;
+ recTick = playTickPos;
+ lastTickPos = playTickPos;
+
+ tempoSN = tempomap.tempoSN();
+
+ startRecordPos.setPosTick(playTickPos);
+ }
+*/
+ midiClock += config.division/24;
+ }
+
+//---------------------------------------------------------
+// midiTick
+//---------------------------------------------------------
+
+void MidiSeq::midiTick(void* p, void*)
+ {
+ MidiSeq* at = (MidiSeq*)p;
+ at->processTimerTick();
+ }
+
+//---------------------------------------------------------
+// processTimerTick
+//---------------------------------------------------------
+
+void MidiSeq::processTimerTick()
+ {
+ extern int watchMidi;
+ ++watchMidi; // make a simple watchdog happy
+
+ timer->getTimerTicks(); // read elapsed rtc timer ticks
+
+ if (idle)
+ return;
+
+ unsigned curFrame = audio->curFrame();
+
+/* if (!extSyncFlag.value()) {
+ int curTick = AL::tempomap.frame2tick(curFrame);
+ if (curTick >= midiClock)
+ processMidiClock();
+ }
+ */
+
+ //
+ // play all events upto curFrame
+ //
+ MidiOutPortList* ol = song->midiOutPorts();
+ for (iMidiOutPort id = ol->begin(); id != ol->end(); ++id) {
+ MidiOutPort* mp = *id;
+ MPEventList* el = mp->playEvents();
+ iMPEvent i = mp->nextPlayEvent();
+
+ for (; i != el->end(); ++i) {
+ if (i->time() > curFrame)
+ break;
+ mp->putEvent(*i);
+ }
+ mp->setNextPlayEvent(i);
+ }
+ }
+
+//---------------------------------------------------------
+// msgMsg
+//---------------------------------------------------------
+
+void MidiSeq::msgMsg(int id)
+ {
+ AudioMsg msg;
+ msg.id = id;
+ Thread::sendMsg(&msg);
+ }
+
+//---------------------------------------------------------
+// msgProcess
+//---------------------------------------------------------
+
+void MidiSeq::msgProcess(unsigned frames)
+ {
+ AudioMsg msg;
+ msg.id = MS_PROCESS;
+ msg.time = frames;
+ Thread::sendMsg(&msg);
+ }
+
+void MidiSeq::msgSeek() { msgMsg(SEQM_SEEK); }
+void MidiSeq::msgStop() { msgMsg(MS_STOP); }
+void MidiSeq::msgStart() { msgMsg(MS_START); }
+void MidiSeq::msgSetRtc() { msgMsg(MS_SET_RTC); }
+
diff --git a/muse/muse/midiseq.h b/muse/muse/midiseq.h
new file mode 100644
index 00000000..48bec2c6
--- /dev/null
+++ b/muse/muse/midiseq.h
@@ -0,0 +1,98 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDISEQ_H__
+#define __MIDISEQ_H__
+
+#include "thread.h"
+#include "mpevent.h"
+#include "driver/rtctimer.h"
+
+namespace AL {
+ class Pos;
+ };
+class AL::Pos;
+
+class MPEventList;
+class SynthI;
+class MTC;
+
+//---------------------------------------------------------
+// MidiSeq
+//---------------------------------------------------------
+
+class MidiSeq : public Thread {
+ int realRtcTicks;
+ Timer* timer;
+ int idle;
+ int midiClock;
+
+/* Testing */
+ int recTick; // ext sync tick position
+ int lastTickPos; // position of last sync tick
+ // run values:
+ unsigned _midiTick;
+ double mclock1, mclock2;
+ double songtick1, songtick2;
+ int recTick1, recTick2;
+ int lastTempo;
+ double timediff[24];
+ int storedtimediffs;
+/* Testing */
+
+ bool initRealtimeTimer();
+ static void midiTick(void* p, void*);
+ void processTimerTick();
+ void processSeek();
+ void processStart();
+ void processStop();
+ void resetDevices();
+ void processMidiClock();
+ virtual void processMsg(const ThreadMsg*);
+ void updatePollFd();
+
+ void mtcSyncMsg(const MTC& mtc, bool seekFlag);
+ void mtcInputFull(const unsigned char* p, int n);
+ void nonRealtimeSystemSysex(const unsigned char* p, int n);
+
+ public:
+ MidiSeq(const char* name);
+ bool start(int);
+ virtual void threadStop();
+ virtual void threadStart(void*);
+
+ void realtimeSystemInput(int, int);
+ void mtcInputQuarter(int, unsigned char);
+ void setSongPosition(int, int);
+ void mmcInput(int id, int cmd, const AL::Pos&);
+
+ void msgMsg(int id);
+ void msgProcess(unsigned frames);
+ void msgSeek();
+ void msgStart();
+ void msgStop();
+ void msgSetRtc();
+ void msgAddSynthI(SynthI* synth);
+ void msgRemoveSynthI(SynthI* synth);
+ };
+
+extern MidiSeq* midiSeq;
+#endif
+
diff --git a/muse/muse/midisynti.cpp b/muse/muse/midisynti.cpp
new file mode 100644
index 00000000..9a420da3
--- /dev/null
+++ b/muse/muse/midisynti.cpp
@@ -0,0 +1,237 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "midi.h"
+#include "midisynti.h"
+#include "midiplugin.h"
+#include "midiplugins/libmidiplugin/mempi.h"
+#include "al/tempo.h"
+
+//---------------------------------------------------------
+// MidiSynti
+//---------------------------------------------------------
+
+MidiSynti::MidiSynti()
+ : MidiTrackBase(MIDI_SYNTI)
+ {
+ _synti = 0;
+ init();
+ }
+
+MidiSynti::~MidiSynti()
+ {
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void MidiSynti::init()
+ {
+ }
+
+//---------------------------------------------------------
+// hasGui
+//---------------------------------------------------------
+
+bool MidiSynti::hasGui() const
+ {
+ return _synti->hasGui();
+ }
+
+//---------------------------------------------------------
+// hasGui
+//---------------------------------------------------------
+
+void MidiSynti::showGui(bool val)
+ {
+ return _synti->showGui(val);
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool MidiSynti::guiVisible() const
+ {
+ return _synti->guiVisible();
+ }
+
+//---------------------------------------------------------
+// initInstance
+// return true on error
+//---------------------------------------------------------
+
+bool MidiSynti::initInstance(MidiPlugin* plugin)
+ {
+ _synti = plugin->instantiate(this);
+ return _synti == 0;
+ }
+
+//---------------------------------------------------------
+// MidiSynti::write
+//---------------------------------------------------------
+
+void MidiSynti::write(Xml& xml) const
+ {
+ xml.tag("MidiSynti");
+ MidiTrackBase::writeProperties(xml);
+ xml.strTag("class", _synti->plugin()->name());
+ if (_synti->hasGui()) {
+ xml.intTag("guiVisible", _synti->guiVisible());
+ int x, y, w, h;
+ w = 0;
+ h = 0;
+ _synti->getGeometry(&x, &y, &w, &h);
+ if (h || w)
+ xml.qrectTag("geometry", QRect(x, y, w, h));
+ }
+ //---------------------------------------------
+ // dump current state of plugin
+ //---------------------------------------------
+
+ int len = 0;
+ const unsigned char* p;
+ _synti->getInitData(&len, &p);
+ if (len) {
+ xml.tag("init len=\"%d\"", len);
+ int col = 0;
+ xml.putLevel();
+ for (int i = 0; i < len; ++i, ++col) {
+ if (col >= 16) {
+ xml.put("");
+ col = 0;
+ xml.putLevel();
+ }
+ xml.nput("%02x ", p[i] & 0xff);
+ }
+ if (col)
+ xml.put("");
+ xml.etag("init");
+ }
+ xml.etag("MidiSynti");
+ }
+
+//---------------------------------------------------------
+// MidiSynti::read
+//---------------------------------------------------------
+
+void MidiSynti::read(QDomNode node)
+ {
+ bool startGui = false;
+ QRect r;
+ QString sclass;
+ unsigned char* data = 0;
+ int len = 0;
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ if (tag == "class")
+ sclass = e.text();
+ else if (tag == "guiVisible")
+ startGui = e.text().toInt();
+ else if (tag == "geometry")
+ r = AL::readGeometry(node);
+ else if (tag == "init") {
+ len = e.attribute("len", "0").toInt();
+ if (len) {
+ QStringList l = e.text().simplified().split(" ", QString::SkipEmptyParts);
+ if (len != l.size()) {
+ printf("error converting init string <%s>\n", e.text().toLatin1().data());
+ }
+ data = new unsigned char[len];
+ unsigned char* d = data;
+ int numberBase = 16;
+ for (int i = 0; i < l.size(); ++i) {
+ bool ok;
+ *d++ = l.at(i).toInt(&ok, numberBase);
+ if (!ok)
+ printf("error converting init val <%s>\n", l.at(i).toLatin1().data());
+ }
+ }
+ }
+ else if (MidiTrackBase::readProperties(node))
+ printf("MusE:MidiSynti: unknown tag %s\n", node.toElement().tagName().toLatin1().data());
+ }
+ iMidiPlugin i;
+ for (i = midiPlugins.begin(); i != midiPlugins.end(); ++i) {
+ if ((*i)->type() != MEMPI_GENERATOR)
+ continue;
+ if ((*i)->name() == sclass)
+ break;
+ }
+ if (i == midiPlugins.end()) {
+ fprintf(stderr, "MidiSynti::read: midi plugin not found\n");
+ return;
+ }
+ MidiPlugin* mp = *i;
+ if (initInstance(mp)) {
+ fprintf(stderr, "MidiSynti::read: instantiate failed\n");
+ return;
+ }
+ if (data) {
+ _synti->setInitData(len, data);
+ delete[] data;
+ }
+ song->insertTrack0(this, -1);
+ _synti->showGui(startGui);
+ _synti->setGeometry(r.x(), r.y(), r.width(), r.height());
+ }
+
+//---------------------------------------------------------
+// getEvents
+//---------------------------------------------------------
+
+void MidiSynti::getEvents(unsigned from, unsigned to, int, MPEventList* dst)
+ {
+ MPEventList il;
+ RouteList* rl = inRoutes();
+ for (iRoute i = rl->begin(); i != rl->end(); ++i) {
+ MidiTrackBase* track = (MidiTrackBase*)i->track;
+ if (track->isMute())
+ continue;
+ track->getEvents(from, to, i->channel, &il);
+ }
+ MPEventList ol;
+ _synti->apply(from, to, &il, &ol);
+ for (iMPEvent i = ol.begin(); i != ol.end(); ++i) {
+ MidiEvent ev(*i);
+ if (ev.type() == ME_NOTEON) {
+ _meter[0] += ev.dataB()/2;
+ if (_meter[0] > 127.0f)
+ _meter[0] = 127.0f;
+ }
+ // convert tick-time to sample-time
+ ev.setTime(AL::tempomap.tick2frame(ev.time()));
+ dst->insert(ev);
+ }
+ }
+
+bool MidiSynti::isMute() const
+ {
+ if (_solo)
+ return false;
+ if (song->solo())
+ return true;
+ return _mute;
+ }
+
+
diff --git a/muse/muse/midisynti.h b/muse/muse/midisynti.h
new file mode 100644
index 00000000..92041c41
--- /dev/null
+++ b/muse/muse/midisynti.h
@@ -0,0 +1,61 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDISYNTH_H__
+#define __MIDISYNTH_H__
+
+#include "track.h"
+
+//---------------------------------------------------------
+// MidiSynti
+//---------------------------------------------------------
+
+class MidiSynti : public MidiTrackBase {
+ Q_OBJECT
+
+ MidiPluginI* _synti;
+
+ public:
+ MidiSynti();
+ virtual ~MidiSynti();
+ void init();
+
+ virtual void read(QDomNode);
+ virtual void write(Xml&) const;
+ virtual bool isMute() const;
+
+ virtual MidiSynti* newTrack() const { return new MidiSynti(); }
+ virtual Part* newPart(Part*, bool) { return 0; }
+
+ bool initInstance(MidiPlugin*);
+ virtual void getEvents(unsigned from, unsigned to, int channel, MPEventList* dst);
+
+ bool hasGui() const;
+ bool guiVisible() const;
+ void showGui(bool);
+ };
+
+
+typedef tracklist<MidiSynti*>::iterator iMidiSynti;
+typedef tracklist<MidiSynti*>::const_iterator ciMidiSynti;
+typedef tracklist<MidiSynti*> MidiSyntiList;
+
+#endif
+
diff --git a/muse/muse/miditrack.cpp b/muse/muse/miditrack.cpp
new file mode 100644
index 00000000..97f71778
--- /dev/null
+++ b/muse/muse/miditrack.cpp
@@ -0,0 +1,615 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "miditrack.h"
+#include "event.h"
+#include "song.h"
+#include "midi.h"
+#include "midictrl.h"
+#include "audio.h"
+#include "part.h"
+#include "al/tempo.h"
+#include "midiedit/drummap.h"
+
+//---------------------------------------------------------
+// MidiTrack
+//---------------------------------------------------------
+
+MidiTrack::MidiTrack()
+ : MidiTrackBase(MIDI)
+ {
+ init();
+ _events = new EventList;
+ recordPart = 0;
+ }
+
+MidiTrack::~MidiTrack()
+ {
+ delete _events;
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void MidiTrack::init()
+ {
+ transposition = 0;
+ velocity = 0;
+ delay = 0;
+ len = 100; // percent
+ compression = 100; // percent
+ }
+
+//---------------------------------------------------------
+// newPart
+//---------------------------------------------------------
+
+Part* MidiTrack::newPart(Part*p, bool clone)
+ {
+ Part* part = clone ? new Part(this, p->events()) : new Part(this);
+ if (p) {
+ part->setName(p->name());
+ part->setColorIndex(p->colorIndex());
+
+ *(AL::PosLen*)part = *(AL::PosLen*)p;
+ part->setMute(p->mute());
+ }
+ return part;
+ }
+
+//---------------------------------------------------------
+// MidiTrack::write
+//---------------------------------------------------------
+
+void MidiTrack::write(Xml& xml) const
+ {
+ xml.tag("miditrack");
+ MidiTrackBase::writeProperties(xml);
+
+ xml.intTag("transposition", transposition);
+ xml.intTag("velocity", velocity);
+ xml.intTag("delay", delay);
+ xml.intTag("len", len);
+ xml.intTag("compression", compression);
+
+ const PartList* pl = cparts();
+ for (ciPart p = pl->begin(); p != pl->end(); ++p)
+ p->second->write(xml);
+ xml.etag("miditrack");
+ }
+
+//---------------------------------------------------------
+// MidiTrack::read
+//---------------------------------------------------------
+
+void MidiTrack::read(QDomNode node)
+ {
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ QString s(e.text());
+ int i = s.toInt();
+ if (tag == "transposition")
+ transposition = i;
+ else if (tag == "velocity")
+ velocity = i;
+ else if (tag == "delay")
+ delay = i;
+ else if (tag == "len")
+ len = i;
+ else if (tag == "compression")
+ compression = i;
+ else if (tag == "part") {
+ Part* p = newPart();
+ p->read(node.firstChild());
+ parts()->add(p);
+ }
+ else if (tag == "locked")
+ _locked = i;
+ else if (MidiTrackBase::readProperties(node))
+ printf("MusE:MidiTrack: unknown tag %s\n", e.tagName().toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// channel
+//---------------------------------------------------------
+
+MidiChannel* MidiTrack::channel() const
+ {
+ if (_outRoutes.empty())
+ return 0;
+ return (MidiChannel*)(_outRoutes.front().track);
+ }
+
+//---------------------------------------------------------
+// playMidiEvent
+//---------------------------------------------------------
+
+void MidiTrack::playMidiEvent(MidiEvent* ev)
+ {
+ const RouteList* rl = &_outRoutes;
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ ((MidiChannel*)r->track)->playMidiEvent(ev);
+ }
+ }
+
+//---------------------------------------------------------
+// startRecording
+// gui context
+//---------------------------------------------------------
+
+void MidiTrack::startRecording()
+ {
+ hbank = 0;
+ lbank = 0;
+ datah = 0;
+ datal = 0;
+ rpnh = 0;
+ rpnl = 0;
+ dataType = 0;
+ recordedEvents = 0;
+ partCreated = false;
+ recordPart = 0;
+ recordFifo.clear();
+ keyDown.clear();
+
+ AL::Pos start = song->punchin() ? song->lPos() : song->cPos();
+
+ for (iPart ip = parts()->begin(); ip != parts()->end(); ++ip) {
+ Part* part = ip->second;
+ unsigned partStart = part->tick();
+ unsigned partEnd = partStart + part->lenTick();
+ if (start.tick() >= partStart && start.tick() < partEnd) {
+ recordPart = part;
+ }
+ }
+ if (recordPart == 0) {
+ //
+ // create new part for recording
+ //
+ recordPart = new Part(this);
+ recordPart->setTrack(this);
+ int startTick = song->roundDownBar(start.tick());
+ int endTick = song->roundUpBar(start.tick());
+ recordPart->setTick(startTick);
+ recordPart->setLenTick(endTick - startTick);
+ recordPart->setName(name());
+ audio->msgAddPart(recordPart, false);
+ partCreated = true;
+ }
+ }
+
+//---------------------------------------------------------
+// recordBeat
+// gui context
+// update current recording
+//---------------------------------------------------------
+
+void MidiTrack::recordBeat()
+ {
+ int updateFlags = 0;
+ unsigned cpos = song->cpos();
+ unsigned ptick = recordPart->tick();
+
+ if (song->punchout()) {
+ if (song->rPos() >= song->cPos()) {
+ while (!recordFifo.isEmpty())
+ recordFifo.get();
+ return;
+ }
+ }
+ while (!recordFifo.isEmpty()) {
+ MidiEvent me(recordFifo.get());
+ unsigned time = me.time();
+ if (song->punchin() && time < song->lpos())
+ continue;
+ bool isOff = (me.type() == ME_NOTEON && me.dataB() == 0)
+ || (me.type() == ME_NOTEOFF);
+ if (song->punchout() && (time >= song->rpos()) && !isOff)
+ continue;
+
+ if (!partCreated && song->recMode() == Song::REC_REPLACE) {
+ // TODO: remove old events
+ }
+
+ time -= ptick;
+ if (isOff) {
+ //
+ // process note off
+ //
+ for (std::list<Event>::iterator i = keyDown.begin(); i != keyDown.end(); ++i) {
+ if (i->pitch() == me.dataA()) {
+ unsigned tl = time - i->tick();
+ if (tl != i->lenTick()) {
+ i->setLenTick(tl);
+ updateFlags |= SC_EVENT_MODIFIED;
+ }
+ keyDown.erase(i);
+ break;
+ }
+ }
+ }
+ else if (me.type() == ME_NOTEON && me.dataB() != 0) {
+ //
+ // create Note event on "note on"
+ //
+ Event event(Note);
+ event.setTick(time);
+ event.setLenTick(1);
+ event.setPitch(me.dataA());
+ event.setVelo(me.dataB());
+ audio->msgAddEvent(event, recordPart, false);
+ ++recordedEvents;
+ updateFlags |= SC_EVENT_INSERTED;
+ keyDown.push_front(event);
+ }
+ else if (me.type() == ME_POLYAFTER) {
+ Event event(PAfter);
+ event.setTick(time);
+ event.setA(me.dataA());
+ event.setB(me.dataB());
+ }
+ else if (me.type() == ME_CONTROLLER) {
+ Event event(Controller);
+ event.setTick(time);
+ switch(me.dataA()) {
+ case CTRL_HBANK:
+ hbank = me.dataB();
+ break;
+
+ case CTRL_LBANK:
+ lbank = me.dataB();
+ break;
+
+ case CTRL_HDATA:
+ datah = me.dataB();
+ event.setType(Controller);
+ event.setA(dataType | (rpnh << 8) | rpnl);
+ event.setB(datah);
+ audio->msgAddEvent(event, recordPart, false);
+ ++recordedEvents;
+ updateFlags |= SC_EVENT_INSERTED;
+ break;
+
+ case CTRL_LDATA:
+ datal = me.dataB();
+ if (dataType == CTRL_NRPN_OFFSET)
+ dataType = CTRL_NRPN14_OFFSET;
+ else if (dataType == CTRL_RPN_OFFSET)
+ dataType = CTRL_RPN14_OFFSET;
+ break;
+
+ case CTRL_HNRPN:
+ rpnh = me.dataB();
+ dataType = CTRL_NRPN_OFFSET;
+ break;
+
+ case CTRL_LNRPN:
+ rpnl = me.dataB();
+ dataType = CTRL_NRPN_OFFSET;
+ break;
+
+ case CTRL_HRPN:
+ rpnh = me.dataB();
+ dataType = CTRL_RPN_OFFSET;
+ break;
+
+ case CTRL_LRPN:
+ rpnl = me.dataB();
+ dataType = CTRL_RPN_OFFSET;
+ break;
+
+ default:
+ event.setType(Controller);
+ event.setA(me.dataA());
+ event.setB(me.dataB());
+ audio->msgAddEvent(event, recordPart, false);
+ ++recordedEvents;
+ updateFlags |= SC_EVENT_INSERTED;
+ break;
+ }
+ }
+ else if (me.type() == ME_PROGRAM) {
+ Event event(Controller);
+ event.setTick(time);
+ event.setA(CTRL_PROGRAM);
+ event.setB((hbank << 16) | (lbank << 8) | me.dataA());
+ audio->msgAddEvent(event, recordPart, false);
+ ++recordedEvents;
+ updateFlags |= SC_EVENT_INSERTED;
+ }
+ else if (me.type() == ME_PITCHBEND) {
+ Event event(Controller);
+ event.setTick(time);
+ event.setA(CTRL_PITCH);
+ event.setB(me.dataA());
+ audio->msgAddEvent(event, recordPart, false);
+ ++recordedEvents;
+ updateFlags |= SC_EVENT_INSERTED;
+ }
+ else if (me.type() == ME_SYSEX) {
+ Event event(Sysex);
+ event.setTick(time);
+ event.setData(me.data(), me.len());
+ audio->msgAddEvent(event, recordPart, false);
+ ++recordedEvents;
+ updateFlags |= SC_EVENT_INSERTED;
+ }
+ else if (me.type() == ME_AFTERTOUCH) {
+ Event event(CAfter);
+ event.setTick(time);
+ event.setA(me.dataA());
+ audio->msgAddEvent(event, recordPart, false);
+ ++recordedEvents;
+ updateFlags |= SC_EVENT_INSERTED;
+ }
+ }
+ if (partCreated) {
+ recordPart->setLenTick(cpos - ptick);
+ updateFlags |= SC_PART_MODIFIED;
+ }
+ //
+ // modify len of all hold keys
+ //
+ for (std::list<Event>::iterator i = keyDown.begin(); i != keyDown.end(); ++i) {
+ if (cpos > (i->tick() + ptick))
+ i->setLenTick(cpos - (i->tick() + ptick));
+ updateFlags |= SC_EVENT_MODIFIED;
+ }
+ song->update(updateFlags);
+ }
+
+//---------------------------------------------------------
+// stopRecording
+// gui context
+//---------------------------------------------------------
+
+void MidiTrack::stopRecording()
+ {
+ if (recordedEvents == 0 && partCreated) {
+ // TD: remove empty part?
+ }
+ //
+ // modify len of all hold keys
+ //
+ unsigned ptick = recordPart->tick();
+ unsigned cpos = song->cpos();
+ for (std::list<Event>::iterator i = keyDown.begin(); i != keyDown.end(); ++i) {
+ i->setLenTick(cpos - (i->tick() + ptick));
+ }
+ //
+ // adjust part len && song len
+ //
+ if (recordPart->lenTick() < (cpos-ptick)) {
+ //
+ // TODO: check for events outside part boundaries
+ //
+ int endTick = song->roundUpBar(cpos);
+ recordPart->setLenTick(endTick - ptick);
+ }
+
+ unsigned etick = recordPart->endTick();
+ if (song->len() < etick)
+ song->setLen(etick);
+ }
+
+//---------------------------------------------------------
+// clone
+//---------------------------------------------------------
+
+void MidiTrack::clone(MidiTrack* t)
+ {
+ QString name;
+ for (int i = 1; ; ++i) {
+ name.sprintf("%s-%d", t->name().toLatin1().data(), i);
+ TrackList* tl = song->tracks();
+ bool found = false;
+ for (iTrack it = tl->begin(); it != tl->end(); ++it) {
+ if ((*it)->name() == name) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ break;
+ }
+ setName(name);
+ transposition = t->transposition;
+ velocity = t->velocity;
+ delay = t->delay;
+ len = t->len;
+ compression = t->compression;
+ _recordFlag = t->_recordFlag;
+ _mute = t->_mute;
+ _solo = t->_solo;
+ _off = t->_off;
+ _monitor = t->_monitor;
+ _channels = t->_channels;
+ _locked = t->_locked;
+ _inRoutes = t->_inRoutes;
+ _outRoutes = t->_outRoutes;
+ _controller = t->_controller;
+ _autoRead = t->_autoRead;
+ _autoWrite = t->_autoWrite;
+ }
+
+//---------------------------------------------------------
+// isMute
+//---------------------------------------------------------
+
+bool MidiTrack::isMute() const
+ {
+ if (_solo)
+ return false;
+ if (song->solo())
+ return true;
+ return _mute;
+ }
+
+//---------------------------------------------------------
+// drumMap
+// return drum map for this track
+// return zero if no drum map is used
+//---------------------------------------------------------
+
+DrumMap* MidiTrack::drumMap() const
+ {
+ MidiChannel* mc = channel();
+ if (mc && mc->useDrumMap())
+ return mc->drumMap();
+ return 0;
+ }
+
+//---------------------------------------------------------
+// changeDrumMap
+//---------------------------------------------------------
+
+void MidiTrack::changeDrumMap() const
+ {
+ emit drumMapChanged();
+ }
+
+//---------------------------------------------------------
+// getEvents
+// from/to - midi ticks
+//---------------------------------------------------------
+
+void MidiTrack::getEvents(unsigned from, unsigned to, int, MPEventList* dst)
+ {
+ if (from > to) {
+ printf("getEvents(): FATAL: cur > next %d > %d\n", from, to);
+ return;
+ }
+ //
+ // collect events only when transport is rolling
+ //
+ if (from < to) {
+ for (iPart p = parts()->begin(); p != parts()->end(); ++p) {
+ Part* part = p->second;
+ if (part->mute())
+ continue;
+ DrumMap* dm = ((MidiTrack*)part->track())->drumMap();
+ unsigned offset = delay + part->tick();
+
+ if (offset > to)
+ break;
+
+ EventList* events = part->events();
+
+ iEvent ie = events->lower_bound((offset > from) ? 0 : from - offset);
+ iEvent iend = events->lower_bound(to - offset);
+
+ for (; ie != iend; ++ie) {
+ Event ev = ie->second;
+ if (ev.type() == Meta) // ignore meta events
+ continue;
+ unsigned tick = ev.tick() + offset;
+ unsigned frame = AL::tempomap.tick2frame(tick) + audio->getFrameOffset();
+ if (ev.type() == Note) {
+ if (dm) {
+ if (dm->entry(dm->outmap(ev.pitch()))->mute)
+ continue;
+ }
+ //
+ // maybe we should skip next lines if using a
+ // drummap
+
+ int pitch = ev.pitch() + transposition + song->globalPitchShift();
+ if (pitch > 127)
+ pitch = 127;
+ if (pitch < 0)
+ pitch = 0;
+ int velo = ev.velo();
+ velo += velocity;
+ velo = (velo * compression) / 100;
+ if (velo > 127)
+ velo = 127;
+ if (velo < 1) // no off event
+ velo = 1;
+ int elen = (ev.lenTick() * len)/100;
+ if (elen <= 0) // don´t allow zero length
+ elen = 1;
+ int veloOff = ev.veloOff();
+
+ unsigned eframe = AL::tempomap.tick2frame(tick+elen) + audio->getFrameOffset();
+ dst->add(MidiEvent(frame, 0, 0x90, pitch, velo));
+ dst->add(MidiEvent(eframe, 0, veloOff ? 0x80 : 0x90, pitch, veloOff));
+ _meter[0] += velo/2;
+ if (_meter[0] > 127.0f)
+ _meter[0] = 127.0f;
+ }
+ else {
+ dst->add(MidiEvent(frame, 0, ev));
+ }
+ }
+ }
+ }
+
+ //
+ // process input routing
+ //
+
+ RouteList* rl = inRoutes();
+ for (iRoute i = rl->begin(); i != rl->end(); ++i) {
+ MidiTrackBase* track = (MidiTrackBase*)i->track;
+ if (track->isMute())
+ continue;
+ MPEventList el;
+ track->getEvents(from, to, i->channel, &el);
+
+ for (iMPEvent ie = el.begin(); ie != el.end(); ++ie) {
+ MidiEvent event(*ie);
+ int eventTime = event.time();
+ if (recordFlag() && audio->isRecording()) {
+ unsigned time = AL::tempomap.frame2tick(eventTime);
+ event.setTime(time); // set tick time
+ recordFifo.put(event);
+ }
+ if (event.type() == ME_NOTEON && (monitor() || recordFlag()))
+ addMidiMeter(event.dataB());
+ if (monitor()) {
+ if (event.type() == ME_NOTEON) {
+ int pitch = event.dataA() + transposition + song->globalPitchShift();
+ if (pitch > 127)
+ pitch = 127;
+ if (pitch < 0)
+ pitch = 0;
+ event.setA(pitch);
+ if (!event.isNoteOff()) {
+ int velo = event.dataB() + velocity;
+ velo = (velo * compression) / 100;
+ if (velo > 127)
+ velo = 127;
+ if (velo < 1)
+ velo = 1;
+ event.setB(velo);
+ }
+ }
+ unsigned time = eventTime + segmentSize*(segmentCount-1);
+ event.setTime(time);
+ dst->add(event);
+ }
+ }
+ }
+ }
+
+
diff --git a/muse/muse/miditrack.h b/muse/muse/miditrack.h
new file mode 100644
index 00000000..1cb5862d
--- /dev/null
+++ b/muse/muse/miditrack.h
@@ -0,0 +1,95 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDITRACK_H__
+#define __MIDITRACK_H__
+
+#include "track.h"
+#include "midififo.h"
+
+class Part;
+class EventList;
+
+//---------------------------------------------------------
+// MidiTrack
+//---------------------------------------------------------
+
+class MidiTrack : public MidiTrackBase {
+ Q_OBJECT
+
+ EventList* _events; // tmp Events during midi import
+
+ // recording:
+ MidiFifo recordFifo; // for event transfer from RT-thread to gui thread
+ std::list<Event> keyDown; // keep track of "note on" events
+ Part* recordPart; // part we are recording into
+ int recordedEvents;
+ bool partCreated;
+ int hbank, lbank;
+ int datah, datal;
+ int rpnh, rpnl;
+ int dataType;
+
+ signals:
+ void drumMapChanged() const;
+
+ public:
+ MidiTrack();
+ virtual ~MidiTrack();
+ void init();
+ void clone(MidiTrack*);
+ MidiChannel* channel() const;
+
+ void changeDrumMap() const;
+
+ // play parameter
+ int transposition;
+ int velocity;
+ int delay;
+ int len;
+ int compression;
+
+ void startRecording();
+ void recordBeat();
+ void stopRecording();
+
+ EventList* events() const { return _events; }
+
+ virtual void read(QDomNode);
+ virtual void write(Xml&) const;
+
+ virtual MidiTrack* newTrack() const { return new MidiTrack(); }
+ virtual Part* newPart(Part*p=0, bool clone=false);
+
+ virtual bool isMute() const;
+ virtual bool canRecord() const { return true; }
+ void playMidiEvent(MidiEvent*);
+
+ virtual void getEvents(unsigned from, unsigned to, int channel, MPEventList* dst);
+ bool useDrumMap() const;
+ DrumMap* drumMap() const;
+ };
+
+typedef tracklist<MidiTrack*>::iterator iMidiTrack;
+typedef tracklist<MidiTrack*>::const_iterator ciMidiTrack;
+typedef tracklist<MidiTrack*> MidiTrackList;
+
+#endif
+
diff --git a/muse/muse/miditransform.cpp b/muse/muse/miditransform.cpp
new file mode 100644
index 00000000..f4e85be2
--- /dev/null
+++ b/muse/muse/miditransform.cpp
@@ -0,0 +1,1534 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "helper.h"
+#include "event.h"
+#include "miditransform.h"
+#include "track.h"
+#include "song.h"
+#include "al/xml.h"
+#include "globals.h"
+#include "comboQuant.h"
+#include "audio.h"
+#include "gconfig.h"
+#include "al/sig.h"
+
+static int eventTypeTable[] = {
+ Note, Controller, Sysex, PAfter, CAfter, Meta
+ };
+
+static int procVal2Map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 10, 11 };
+
+//---------------------------------------------------------
+// MidiTransformation
+//---------------------------------------------------------
+
+class MidiTransformation {
+ public:
+ QString name;
+ QString comment;
+
+ ValOp selEventOp;
+ EventType selType;
+
+ ValOp selVal1;
+ int selVal1a, selVal1b;
+ ValOp selVal2;
+ int selVal2a, selVal2b;
+ ValOp selLen;
+ int selLenA, selLenB;
+ ValOp selRange;
+ int selRangeA, selRangeB;
+
+ TransformOperator procEvent;
+ EventType eventType;
+ TransformOperator procVal1;
+ int procVal1a, procVal1b;
+ TransformOperator procVal2;
+ int procVal2a, procVal2b;
+ TransformOperator procLen;
+ int procLenA;
+ TransformOperator procPos;
+ int procPosA;
+
+ TransformFunction funcOp;
+ int quantVal;
+ bool selectedTracks;
+ bool insideLoop;
+
+ MidiTransformation(const QString& s) {
+ name = s;
+ selEventOp = All;
+ selType = Note;
+ selVal1 = Ignore;
+ selVal1a = 0;
+ selVal1b = 0;
+ selVal2 = Ignore;
+ selVal2a = 0;
+ selVal2b = 0;
+ selLen = Ignore;
+ selLenA = 0;
+ selLenB = 0;
+ selRange = Ignore;
+ selRangeA = 0;
+ selRangeB = 0;
+ procEvent = Keep;
+ eventType = Note;
+ procVal1 = Keep;
+ procVal1a = 0;
+ procVal1b = 0;
+ procVal2 = Keep;
+ procVal2a = 0;
+ procVal2b = 0;
+ procLen = Keep;
+ procLenA = 0;
+ procPos = Keep;
+ procPosA = 0;
+ funcOp = Select;
+ quantVal = config.division;
+ selectedTracks = false;
+ insideLoop = false;
+ }
+ void write(Xml& xml);
+ };
+
+class MidiTransformPrivate {
+ public:
+ MidiTransformation* cmt;
+ int cindex; // current index in preset list
+ };
+
+typedef std::list<MidiTransformation* > MidiTransformationList;
+typedef std::list<MidiTransformation* >::iterator iMidiTransformation;
+typedef std::list<MidiTransformation* >::const_iterator ciMidiTransformation;
+
+static MidiTransformationList mtlist;
+
+//---------------------------------------------------------
+// MidiTransformDialog
+// Widgets:
+// presetList nameEntry commentEntry
+// selEventOp selType
+// selVal1Op selVal1a selVal1b
+// selVal2Op selVal2a selVal2b
+// selLenOp selLenA selLenB
+// selRangeOp selBarA selBarB
+//
+// procEventOp procType
+// procVal1Op procVal1a procVal1b
+// procVal2Op procVal2a procVal2b
+// procLenOp procLenA
+// procPosOp procPosA
+// funcOp funcQuantVal
+// processAll selectedTracks insideLoop
+// buttonNew buttonDelete buttonApply buttonOk
+//---------------------------------------------------------
+
+MidiTransformerDialog::MidiTransformerDialog(QWidget* parent,
+ const char* name, bool modal, Qt::WFlags fl)
+ : MidiTransformDialogBase(parent, name, modal, fl)
+ {
+ data = new MidiTransformPrivate;
+ data->cmt = 0;
+ data->cindex = -1;
+ connect(buttonApply, SIGNAL(clicked()), SLOT(apply()));
+ connect(buttonNew, SIGNAL(clicked()), SLOT(presetNew()));
+ connect(buttonDelete, SIGNAL(clicked()), SLOT(presetDelete()));
+ connect(selEventOp, SIGNAL(activated(int)), SLOT(selEventOpSel(int)));
+ connect(selType, SIGNAL(activated(int)), SLOT(selTypeSel(int)));
+ connect(selVal1Op, SIGNAL(activated(int)), SLOT(selVal1OpSel(int)));
+ connect(selVal2Op, SIGNAL(activated(int)), SLOT(selVal2OpSel(int)));
+ connect(selLenOp, SIGNAL(activated(int)), SLOT(selLenOpSel(int)));
+ connect(selRangeOp, SIGNAL(activated(int)), SLOT(selRangeOpSel(int)));
+ connect(procEventOp, SIGNAL(activated(int)), SLOT(procEventOpSel(int)));
+ connect(procType, SIGNAL(activated(int)), SLOT(procEventTypeSel(int)));
+ connect(procVal1Op, SIGNAL(activated(int)), SLOT(procVal1OpSel(int)));
+ connect(procVal2Op, SIGNAL(activated(int)), SLOT(procVal2OpSel(int)));
+ connect(procLenOp, SIGNAL(activated(int)), SLOT(procLenOpSel(int)));
+ connect(procPosOp, SIGNAL(activated(int)), SLOT(procPosOpSel(int)));
+ connect(funcOp, SIGNAL(activated(int)), SLOT(funcOpSel(int)));
+ connect(funcQuantVal, SIGNAL(valueChanged(int)), SLOT(funcQuantValSel(int)));
+ connect(presetList, SIGNAL(highlighted(Q3ListBoxItem*)),
+ SLOT(presetChanged(Q3ListBoxItem*)));
+ connect(nameEntry, SIGNAL(textChanged(const QString&)),
+ SLOT(nameChanged(const QString&)));
+ connect(commentEntry, SIGNAL(textChanged()), SLOT(commentChanged()));
+
+ connect(selVal1a, SIGNAL(valueChanged(int)), SLOT(selVal1aChanged(int)));
+ connect(selVal1b, SIGNAL(valueChanged(int)), SLOT(selVal1bChanged(int)));
+ connect(selVal2a, SIGNAL(valueChanged(int)), SLOT(selVal2aChanged(int)));
+ connect(selVal2b, SIGNAL(valueChanged(int)), SLOT(selVal2bChanged(int)));
+ connect(selLenA, SIGNAL(valueChanged(int)), SLOT(selLenAChanged(int)));
+ connect(selLenB, SIGNAL(valueChanged(int)), SLOT(selLenBChanged(int)));
+ connect(selBarA, SIGNAL(valueChanged(int)), SLOT(selBarAChanged(int)));
+ connect(selBarB, SIGNAL(valueChanged(int)), SLOT(selBarBChanged(int)));
+ connect(procVal1a, SIGNAL(valueChanged(int)), SLOT(procVal1aChanged(int)));
+ connect(procVal1b, SIGNAL(valueChanged(int)), SLOT(procVal1bChanged(int)));
+ connect(procVal2a, SIGNAL(valueChanged(int)), SLOT(procVal2aChanged(int)));
+ connect(procVal2b, SIGNAL(valueChanged(int)), SLOT(procVal2bChanged(int)));
+ connect(procLenA, SIGNAL(valueChanged(int)), SLOT(procLenAChanged(int)));
+ connect(procPosA, SIGNAL(valueChanged(int)), SLOT(procPosAChanged(int)));
+
+ connect(processAll, SIGNAL(toggled(bool)), SLOT(processAllChanged(bool)));
+ connect(selectedTracks, SIGNAL(toggled(bool)), SLOT(selectedTracksChanged(bool)));
+ connect(insideLoop, SIGNAL(toggled(bool)), SLOT(insideLoopChanged(bool)));
+
+ //---------------------------------------------------
+ // populate preset list
+ //---------------------------------------------------
+
+ for (iMidiTransformation i = mtlist.begin(); i != mtlist.end(); ++i) {
+ presetList->insertItem((*i)->name);
+ if (data->cmt == 0)
+ data->cmt = *i;
+ }
+ if (data->cmt == 0) {
+ data->cmt = new MidiTransformation(tr("New"));
+ mtlist.push_back(data->cmt);
+ presetList->insertItem(tr("New"));
+ }
+ data->cindex = 0;
+ presetList->setCurrentItem(0);
+ }
+
+//---------------------------------------------------------
+// ~MidiTransformDialog
+//---------------------------------------------------------
+
+MidiTransformerDialog::~MidiTransformerDialog()
+ {
+ delete data;
+ }
+
+//---------------------------------------------------------
+// writeMidiTransforms
+//---------------------------------------------------------
+
+void writeMidiTransforms(Xml& xml)
+ {
+ for (iMidiTransformation i = mtlist.begin(); i != mtlist.end(); ++i) {
+ (*i)->write(xml);
+ }
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void MidiTransformation::write(Xml& xml)
+ {
+ xml.tag("midiTransform");
+ xml.strTag("name", name);
+ xml.strTag("comment", comment);
+ xml.intTag("function", int(funcOp));
+ xml.intTag("selectedTracks", selectedTracks);
+ xml.intTag("insideLoop", insideLoop);
+ if (funcOp == Quantize) {
+ xml.intTag("quantVal", quantVal);
+ }
+ if (funcOp == Transform || funcOp == Insert) {
+ if (procEvent != Keep) {
+ xml.intTag("procEventOp", int(procEvent));
+ xml.intTag("eventType", int(eventType));
+ }
+ if (procVal1 != Keep) {
+ xml.intTag("procVal1Op", int(procVal1));
+ xml.intTag("procVal1a", procVal1a);
+ xml.intTag("procVal1b", procVal1b);
+ }
+ if (procVal2 != Keep) {
+ xml.intTag("procVal2Op", int(procVal2));
+ xml.intTag("procVal2a", procVal2a);
+ xml.intTag("procVal2b", procVal2b);
+ }
+ if (procLen != Keep) {
+ xml.intTag("procLenOp", int(procLen));
+ xml.intTag("procLen", procLenA);
+ }
+ if (procPos != Keep) {
+ xml.intTag("procPosOp", int(procPos));
+ xml.intTag("procPos", procPosA);
+ }
+ }
+ if (selEventOp != Ignore) {
+ xml.intTag("selEventOp", int(selEventOp));
+ xml.intTag("selEventType", int(selType));
+ }
+ if (selVal1 != Ignore) {
+ xml.intTag("selVal1Op", int(selVal1));
+ xml.intTag("selVal1a", selVal1a);
+ xml.intTag("selVal1b", selVal1b);
+ }
+ if (selVal2 != Ignore) {
+ xml.intTag("selVal2Op", int(selVal2));
+ xml.intTag("selVal2a", selVal2a);
+ xml.intTag("selVal2b", selVal2b);
+ }
+ if (selLen != Ignore) {
+ xml.intTag("selLenOp", int(selLen));
+ xml.intTag("selLenA", selLenA);
+ xml.intTag("selLenB", selLenB);
+ }
+ if (selRange != Ignore) {
+ xml.intTag("selRangeOp", int(selRange));
+ xml.intTag("selRangeA", selRangeA);
+ xml.intTag("selRangeB", selRangeB);
+ }
+ xml.etag("midiTransform");
+ }
+
+//---------------------------------------------------------
+// readMidiTransform
+//---------------------------------------------------------
+
+void readMidiTransform(QDomNode node)
+ {
+ MidiTransformation trans(QWidget::tr("new"));
+
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ QString s(e.text());
+ int i = s.toInt();
+
+ if (tag == "name")
+ trans.name = s;
+ else if (tag == "comment")
+ trans.comment = s;
+ else if (tag == "function")
+ trans.funcOp = TransformFunction(i);
+ else if (tag == "selectedTracks")
+ trans.selectedTracks = i;
+ else if (tag == "insideLoop")
+ trans.insideLoop = i;
+ else if (tag == "quantVal")
+ trans.quantVal = i;
+ else if (tag == "procEventOp")
+ trans.procEvent = TransformOperator(i);
+ else if (tag == "eventType")
+ trans.eventType = EventType(i);
+ else if (tag == "procVal1Op")
+ trans.procVal1 = TransformOperator(i);
+ else if (tag == "procVal1a")
+ trans.procVal1a = i;
+ else if (tag == "procVal1b")
+ trans.procVal1b = i;
+ else if (tag == "procVal2Op")
+ trans.procVal2 = TransformOperator(i);
+ else if (tag == "procVal2a")
+ trans.procVal2a = i;
+ else if (tag == "procVal2b")
+ trans.procVal2b = i;
+ else if (tag == "procLenOp")
+ trans.procLen = TransformOperator(i);
+ else if (tag == "procLen")
+ trans.procLenA = i;
+ else if (tag == "procPosOp")
+ trans.procPos = TransformOperator(i);
+ else if (tag == "procPos")
+ trans.procPosA = i;
+ else if (tag == "selEventOp")
+ trans.selEventOp = ValOp(i);
+ else if (tag == "selEventType")
+ trans.selType = EventType(i);
+ else if (tag == "selVal1Op")
+ trans.selVal1 = ValOp(i);
+ else if (tag == "selVal1a")
+ trans.selVal1a = i;
+ else if (tag == "selVal1b")
+ trans.selVal1b = i;
+ else if (tag == "selVal2Op")
+ trans.selVal2 = ValOp(i);
+ else if (tag == "selVal2a")
+ trans.selVal2a = i;
+ else if (tag == "selVal2b")
+ trans.selVal2b = i;
+ else if (tag == "selLenOp")
+ trans.selLen = ValOp(i);
+ else if (tag == "selLenA")
+ trans.selLenA = i;
+ else if (tag == "selLenB")
+ trans.selLenB = i;
+ else if (tag == "selRangeOp")
+ trans.selRange = ValOp(i);
+ else if (tag == "selRangeA")
+ trans.selRangeA = i;
+ else if (tag == "selRangeB")
+ trans.selRangeB = i;
+ else
+ printf("MusE:readMidiTransform(): unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ MidiTransformation* t = new MidiTransformation(trans);
+ mtlist.push_back(t);
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void MidiTransformerDialog::accept()
+ {
+ apply();
+ reject();
+ }
+
+//---------------------------------------------------------
+// transformEvent
+// subfunction of processEvent()
+//---------------------------------------------------------
+
+void MidiTransformerDialog::transformEvent(Event& event, MidiPart* part,
+ MidiPart* newPart)
+ {
+ MidiTransformation* cmt = data->cmt;
+ Event newEvent = event.clone();
+
+ if (cmt->procEvent != Keep)
+ newEvent.setType(cmt->eventType);
+
+ //---------------------------------------------------
+ // transform value A
+ //---------------------------------------------------
+
+ int val = newEvent.dataA();
+ switch (cmt->procVal1) {
+ case Keep:
+ break;
+ case Plus:
+ val += cmt->procVal1a;
+ break;
+ case Minus:
+ val -= cmt->procVal1a;
+ break;
+ case Multiply:
+ val = int(val * (cmt->procVal1a/100.0) + .5);
+ break;
+ case Divide:
+ val = int(val / (cmt->procVal1a/100.0) + .5);
+ break;
+ case Fix:
+ val = cmt->procVal1a;
+ break;
+ case Value:
+ val = cmt->procVal2a;
+ break;
+ case Invert:
+ val = 128 - val;
+ break;
+ case ScaleMap:
+ printf("scale map not implemented\n");
+ break;
+ case Flip:
+ val = cmt->procVal1a - val;
+ break;
+ case Dynamic: // "crescendo"
+ val = (((cmt->procVal2b-cmt->procVal2a)
+ * (newEvent.tick() - song->lpos()))
+ / (song->rpos() - song->lpos())) + cmt->procVal2a;
+ break;
+ case Random:
+ {
+ int range = cmt->procVal1b - cmt->procVal1a;
+ if (range > 0)
+ val = (rand() % range) + cmt->procVal1a;
+ else if (range < 0)
+ val = (rand() % -range) + cmt->procVal1b;
+ else
+ val = cmt->procVal1a;
+ }
+ break;
+ }
+ if (val < 0)
+ val = 0;
+ if (val > 127)
+ val = 127;
+ newEvent.setA(val);
+
+ //---------------------------------------------------
+ // transform value B
+ //---------------------------------------------------
+
+ val = newEvent.dataB();
+ switch (cmt->procVal2) {
+ case Plus:
+ val += cmt->procVal2a;
+ break;
+ case Minus:
+ val -= cmt->procVal2a;
+ break;
+ case Multiply:
+ val = int(val * (cmt->procVal2a/100.0) + .5);
+ break;
+ case Divide:
+ val = int(val / (cmt->procVal2a/100.0) + .5);
+ break;
+ case Fix:
+ val = cmt->procVal2a;
+ break;
+ case Value:
+ val = cmt->procVal1a;
+ break;
+ case Invert:
+ val = 128 - val;
+ break;
+ case Dynamic:
+ val = (((cmt->procVal2b-cmt->procVal2a)
+ * (newEvent.tick() - song->lpos()))
+ / (song->rpos() - song->lpos())) + cmt->procVal2a;
+ break;
+ case Random:
+ {
+ int range = cmt->procVal2b - cmt->procVal2a;
+ if (range > 0)
+ val = (rand() % range) + cmt->procVal2a;
+ else if (range < 0)
+ val = (rand() % -range) + cmt->procVal2b;
+ else
+ val = cmt->procVal1a;
+ }
+ break;
+ case ScaleMap:
+ case Keep:
+ case Flip:
+ break;
+ }
+ if (val < 0)
+ val = 0;
+ if (val > 127)
+ val = 127;
+ newEvent.setB(val);
+
+ //---------------------------------------------------
+ // transform len
+ //---------------------------------------------------
+
+ int len = newEvent.lenTick();
+ switch (cmt->procLen) {
+ case Plus:
+ len += cmt->procLenA;
+ break;
+ case Minus:
+ len -= cmt->procLenA;
+ break;
+ case Multiply:
+ len = int(val * (cmt->procLenA/100.0) + .5);
+ break;
+ case Divide:
+ len = int(val / (cmt->procLenA/100.0) + .5);
+ break;
+ case Fix:
+ len = cmt->procLenA;
+ break;
+ case Invert:
+ case ScaleMap:
+ case Dynamic:
+ case Random:
+ case Keep:
+ case Flip:
+ case Value:
+ break;
+ }
+ if (len < 0)
+ len = 0;
+ newEvent.setLenTick(len);
+
+ //---------------------------------------------------
+ // transform pos
+ //---------------------------------------------------
+
+ int pos = newEvent.tick();
+ switch (cmt->procPos) {
+ case Plus:
+ pos += cmt->procPosA;
+ break;
+ case Minus:
+ pos -= cmt->procPosA;
+ break;
+ case Multiply:
+ pos = int(val * (cmt->procPosA/100.0) + .5);
+ break;
+ case Divide:
+ pos = int(val / (cmt->procPosA/100.0) + .5);
+ break;
+ case Fix:
+ case Invert:
+ case ScaleMap:
+ case Dynamic:
+ case Random:
+ case Keep:
+ case Flip:
+ case Value:
+ break;
+ }
+ if (pos < 0)
+ pos = 0;
+ newEvent.setTick(pos);
+
+ Event dummy;
+ switch(data->cmt->funcOp) {
+ case Transform:
+ song->changeEvent(event, newEvent, part);
+ song->undoOp(UndoOp::ModifyEvent, newEvent, event, part);
+ song->addUpdateFlags(SC_EVENT_MODIFIED);
+ break;
+ case Insert:
+ song->undoOp(UndoOp::AddEvent, dummy, newEvent, part);
+ song->addEvent(newEvent, part);
+ song->addUpdateFlags(SC_EVENT_INSERTED);
+ break;
+ case Extract:
+ song->undoOp(UndoOp::DeleteEvent, dummy, event, part);
+ song->deleteEvent(event, part);
+ song->addUpdateFlags(SC_EVENT_REMOVED);
+ case Copy:
+ newPart->addEvent(newEvent);
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// processEvent
+//---------------------------------------------------------
+
+void MidiTransformerDialog::processEvent(Event& event, MidiPart* part, MidiPart* newPart)
+ {
+ switch(data->cmt->funcOp) {
+ case Select:
+ break;
+ case Quantize:
+ {
+ int tick = event.tick();
+ int rt = AL::sigmap.raster(tick, data->cmt->quantVal) - tick;
+ if (tick != rt) {
+ Event newEvent = event.clone();
+ newEvent.setTick(rt);
+ song->changeEvent(event, newEvent, part);
+ song->undoOp(UndoOp::ModifyEvent, newEvent, event, part);
+ song->addUpdateFlags(SC_EVENT_MODIFIED);
+ }
+ }
+ break;
+ case Delete:
+ {
+ Event ev;
+ song->undoOp(UndoOp::DeleteEvent, ev, event, part);
+ song->deleteEvent(event, part);
+ song->addUpdateFlags(SC_EVENT_REMOVED);
+ }
+ break;
+ case Transform:
+ case Insert:
+ case Copy:
+ case Extract:
+ transformEvent(event, part, newPart);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// isSelected
+// apply Select filter
+// return true if event is selected
+//---------------------------------------------------------
+
+bool MidiTransformerDialog::isSelected(Event& event, MidiPart*)
+ {
+ MidiTransformation* cmt = data->cmt;
+
+ switch (cmt->selEventOp) {
+ case Equal:
+ if (event.type() != cmt->selType) {
+ return false;
+ }
+ break;
+ case Unequal:
+ if (event.type() == cmt->selType) {
+ return false;
+ }
+ break;
+ default:
+ break;
+ }
+ switch (cmt->selVal1) {
+ case Ignore:
+ break;
+ case Equal:
+ if (event.dataA() != cmt->selVal1a)
+ return false;
+ break;
+ case Unequal:
+ if (event.dataA() == cmt->selVal1a)
+ return false;
+ break;
+ case Higher:
+ if (event.dataA() <= cmt->selVal1a)
+ return false;
+ break;
+ case Lower:
+ if (event.dataA() >= cmt->selVal1a)
+ return false;
+ break;
+ case Inside:
+ if ((event.dataA() < cmt->selVal1a)
+ || (event.dataA() >= cmt->selVal1b))
+ return false;
+ break;
+ case Outside:
+ if ((event.dataA() >= cmt->selVal1a)
+ && (event.dataA() < cmt->selVal1b))
+ return false;
+ break;
+ }
+ switch (cmt->selVal2) {
+ case Ignore:
+ break;
+ case Equal:
+ if (event.dataB() != cmt->selVal2a)
+ return false;
+ break;
+ case Unequal:
+ if (event.dataB() == cmt->selVal2a)
+ return false;
+ break;
+ case Higher:
+ if (event.dataB() <= cmt->selVal2a)
+ return false;
+ break;
+ case Lower:
+ if (event.dataB() >= cmt->selVal2a)
+ return false;
+ break;
+ case Inside:
+ if ((event.dataB() < cmt->selVal2a)
+ || (event.dataB() >= cmt->selVal2b))
+ return false;
+ break;
+ case Outside:
+ if ((event.dataB() >= cmt->selVal2a)
+ && (event.dataB() < cmt->selVal2b))
+ return false;
+ break;
+ }
+ int len = event.lenTick();
+ switch (cmt->selLen) {
+ case Ignore:
+ break;
+ case Equal:
+ if (len != cmt->selLenA)
+ return false;
+ break;
+ case Unequal:
+ if (len == cmt->selLenA)
+ return false;
+ break;
+ case Higher:
+ if (len <= cmt->selLenA)
+ return false;
+ break;
+ case Lower:
+ if (len >= cmt->selLenA)
+ return false;
+ break;
+ case Inside:
+ if ((len < cmt->selLenA) || (len >= cmt->selLenB))
+ return false;
+ break;
+ case Outside:
+ if ((len >= cmt->selLenA) && (len < cmt->selLenB))
+ return false;
+ break;
+ }
+ int bar, beat;
+ unsigned tick;
+ AL::sigmap.tickValues(event.tick(), &bar, &beat, &tick);
+ int beat1 = cmt->selRangeA / 1000;
+ unsigned tick1 = cmt->selRangeA % 1000;
+ int beat2 = cmt->selRangeB / 1000;
+ unsigned tick2 = cmt->selRangeB % 1000;
+ switch (cmt->selRange) {
+ case Ignore:
+ break;
+ case Equal:
+ if (beat != beat1 || tick != tick1)
+ return false;
+ break;
+ case Unequal:
+ if (beat == beat1 && tick == tick1)
+ return false;
+ break;
+ case Higher:
+ if (beat <= beat1)
+ return false;
+ if (beat == beat1 && tick <= tick1)
+ return false;
+ break;
+ case Lower:
+ if (beat >= beat1)
+ return false;
+ if (beat == beat1 && tick >= tick1)
+ return false;
+ break;
+ case Inside:
+ if ((beat < beat1) || (beat >= beat2))
+ return false;
+ if (beat == beat1 && tick < tick1)
+ return false;
+ if (beat == beat2 && tick >= tick2)
+ return false;
+ break;
+ case Outside:
+ if ((beat >= beat1) || (beat < beat2))
+ return false;
+ if (beat == beat1 && tick >= tick1)
+ return false;
+ if (beat == beat2 && tick < tick2)
+ return false;
+ break;
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void MidiTransformerDialog::apply()
+ {
+ int flags = 0;
+ song->startUndo();
+ audio->msgIdle(true);
+ bool copyExtract = (data->cmt->funcOp == Copy)
+ || (data->cmt->funcOp == Extract);
+
+ MidiTrackList* tracks = song->midis();
+ MidiTrackList tl;
+ for (iMidiTrack t = tracks->begin(); t != tracks->end(); ++t) {
+ if (data->cmt->selectedTracks && !(*t)->selected())
+ continue;
+ MidiTrack* newTrack = 0;
+ PartList *pl = (*t)->parts();
+ if (copyExtract) {
+ // check wether we must generate a new track
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ MidiPart* part = (MidiPart *) p->second;
+ EventList* el = part->events();
+ for (iEvent i = el->begin(); i != el->end(); ++i) {
+ Event event = i->second;
+ unsigned tick = event.tick();
+ if (data->cmt->insideLoop && (tick < song->lpos() || tick >= song->rpos()))
+ continue;
+ if (isSelected(event, part)) {
+ newTrack = new MidiTrack();
+ tl.push_back(newTrack);
+ break;
+ }
+ }
+ if (newTrack)
+ break;
+ }
+ }
+
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ MidiPart* part = (MidiPart *) p->second;
+ MidiPart* newPart = 0;
+ EventList* el = part->events();
+ if (copyExtract) {
+ // check wether we must generate a new part
+ for (iEvent i = el->begin(); i != el->end(); ++i) {
+ Event event = i->second;
+ unsigned tick = event.tick();
+ if (data->cmt->insideLoop && (tick < song->lpos() || tick >= song->rpos()))
+ continue;
+ if (isSelected(event, part)) {
+ newPart = new MidiPart(newTrack);
+ newPart->setName(part->name());
+ newPart->setColorIndex(part->colorIndex());
+ newPart->setTick(part->tick());
+ newPart->setLenTick(part->lenTick());
+ song->addPart(newPart);
+ flags |= SC_PART_INSERTED;
+ break;
+ }
+ }
+ }
+ EventList pel;
+ for (iEvent i = el->begin(); i != el->end(); ++i) {
+ Event event = i->second;
+ unsigned tick = event.tick();
+ if (data->cmt->insideLoop && (tick < song->lpos() || tick >= song->rpos()))
+ continue;
+ bool flag = isSelected(event, part);
+ if (data->cmt->funcOp == Select)
+ event.setSelected(flag);
+ else if (flag)
+ pel.add(event);
+ }
+ for (iEvent i = pel.begin(); i != pel.end(); ++i) {
+ Event event = i->second;
+ processEvent(event, part, newPart);
+ }
+ }
+ }
+ if (!tl.empty()) {
+ flags |= SC_TRACK_INSERTED;
+ for (iTrack t = tl.begin(); t != tl.end(); ++t) {
+ song->insertTrack0(*t, -1);
+ }
+ }
+
+ switch(data->cmt->funcOp) {
+ case Select:
+ flags |= SC_SELECTION;
+ break;
+ case Quantize:
+ flags |= SC_EVENT_MODIFIED;
+ break;
+ case Delete:
+ flags |= SC_EVENT_REMOVED;
+ break;
+ case Transform:
+ flags |= SC_EVENT_MODIFIED;
+ break;
+ case Insert:
+ flags |= SC_EVENT_INSERTED;
+ break;
+ case Copy:
+ flags |= SC_EVENT_INSERTED;
+ case Extract:
+ break;
+ }
+ audio->msgIdle(false);
+ song->endUndo(flags);
+ }
+
+//---------------------------------------------------------
+// setValOp
+//---------------------------------------------------------
+
+void MidiTransformerDialog::setValOp(QWidget* a, QWidget* b, ValOp op)
+ {
+ switch (op) {
+ case Ignore:
+ a->setEnabled(false);
+ b->setEnabled(false);
+ break;
+ case Equal:
+ case Unequal:
+ case Higher:
+ case Lower:
+ a->setEnabled(true);
+ b->setEnabled(false);
+ break;
+ case Inside:
+ case Outside:
+ a->setEnabled(true);
+ b->setEnabled(true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// selEventOpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selEventOpSel(int val)
+ {
+ selType->setEnabled(val != All);
+ data->cmt->selEventOp = ValOp(val);
+ selVal1aChanged(data->cmt->selVal1a);
+ selVal1bChanged(data->cmt->selVal1b);
+ }
+
+//---------------------------------------------------------
+// selTypeSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selTypeSel(int val)
+ {
+ data->cmt->selType = EventType(eventTypeTable[val]);
+ selVal1aChanged(data->cmt->selVal1a);
+ selVal1bChanged(data->cmt->selVal1b);
+ }
+
+//---------------------------------------------------------
+// selVal1OpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selVal1OpSel(int val)
+ {
+ setValOp(selVal1a, selVal1b, ValOp(val));
+ data->cmt->selVal1 = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// selVal2OpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selVal2OpSel(int val)
+ {
+ setValOp(selVal2a, selVal2b, ValOp(val));
+ data->cmt->selVal2 = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// selLenOpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selLenOpSel(int val)
+ {
+ setValOp(selLenA, selLenB, ValOp(val));
+ data->cmt->selLen = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// selRangeOpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selRangeOpSel(int val)
+ {
+ setValOp(selBarA, selBarB, ValOp(val));
+ data->cmt->selRange = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// procEventOpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procEventOpSel(int val)
+ {
+ TransformOperator op = val == 0 ? Keep : Fix;
+ procType->setEnabled(op == Fix);
+ data->cmt->procEvent = op;
+ }
+
+//---------------------------------------------------------
+// procEventTypeSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procEventTypeSel(int val)
+ {
+ data->cmt->eventType = EventType(eventTypeTable[val]);
+ }
+
+//---------------------------------------------------------
+// procVal1OpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procVal1OpSel(int val)
+ {
+ data->cmt->procVal1 = TransformOperator(val);
+ switch(TransformOperator(val)) {
+ case Keep:
+ case Invert:
+ procVal1a->setEnabled(false);
+ procVal1b->setEnabled(false);
+ break;
+ case Multiply:
+ case Divide:
+ procVal1a->setEnabled(true);
+// procVal1a->setPrecision(2);
+ procVal1b->setEnabled(false);
+ break;
+ case Plus:
+ case Minus:
+ case Fix:
+ case Value:
+ case Flip:
+// procVal1a->setPrecision(0);
+ procVal1a->setEnabled(true);
+ procVal1b->setEnabled(false);
+ break;
+ case Random:
+ case ScaleMap:
+ case Dynamic:
+// procVal1a->setPrecision(0);
+ procVal1a->setEnabled(true);
+ procVal1b->setEnabled(true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// procVal2OpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procVal2OpSel(int val)
+ {
+ TransformOperator op = TransformOperator(procVal2Map[val]);
+ data->cmt->procVal2 = op;
+
+ switch (op) {
+ case Keep:
+ case Invert:
+ procVal2a->setEnabled(false);
+ procVal2b->setEnabled(false);
+ break;
+ case Multiply:
+ case Divide:
+ procVal2a->setEnabled(true);
+// procVal2a->setPrecision(2);
+ procVal2b->setEnabled(false);
+ break;
+ case Plus:
+ case Minus:
+ case Fix:
+ case Value:
+// procVal2a->setPrecision(0);
+ procVal2a->setEnabled(true);
+ procVal2b->setEnabled(false);
+ break;
+ case Random:
+ case Dynamic:
+// procVal2a->setPrecision(0);
+ procVal2a->setEnabled(true);
+ procVal2b->setEnabled(true);
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// procLenOpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procLenOpSel(int val)
+ {
+ TransformOperator op = TransformOperator(val);
+ data->cmt->procLen = op;
+
+ switch (op) {
+ case Keep:
+ case Invert:
+ procLenA->setEnabled(false);
+ break;
+ case Plus:
+ case Minus:
+ case Fix:
+// procLenA->setPrecision(0);
+ procLenA->setEnabled(true);
+ break;
+ case Multiply:
+ case Divide:
+// procLenA->setPrecision(2);
+ procLenA->setEnabled(true);
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// procPosOpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procPosOpSel(int val)
+ {
+ TransformOperator op = TransformOperator(val);
+ data->cmt->procPos = op;
+
+ switch (op) {
+ case Keep:
+ case Invert:
+ procPosA->setEnabled(false);
+ break;
+ case Multiply:
+ case Divide:
+// procPosA->setPrecision(2);
+ procPosA->setEnabled(true);
+ break;
+ case Plus:
+ case Minus:
+// procPosA->setPrecision(0);
+ procPosA->setEnabled(true);
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// funcOpSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::funcOpSel(int val)
+ {
+ funcQuantVal->setEnabled(val == Quantize);
+ bool isFuncOp = val == Transform || val == Insert;
+
+ procEventOp->setEnabled(isFuncOp);
+ procType->setEnabled(isFuncOp);
+ procVal1Op->setEnabled(isFuncOp);
+ procVal1a->setEnabled(isFuncOp);
+ procVal1b->setEnabled(isFuncOp);
+ procVal2Op->setEnabled(isFuncOp);
+ procVal2a->setEnabled(isFuncOp);
+ procVal2b->setEnabled(isFuncOp);
+ procLenOp->setEnabled(isFuncOp);
+ procLenA->setEnabled(isFuncOp);
+ procPosOp->setEnabled(isFuncOp);
+ procPosA->setEnabled(isFuncOp);
+ if (isFuncOp) {
+ procEventOpSel(data->cmt->procEvent);
+ procVal1OpSel(data->cmt->procVal1);
+ procVal2OpSel(data->cmt->procVal2);
+ procLenOpSel(data->cmt->procLen);
+ procPosOpSel(data->cmt->procPos);
+ }
+ data->cmt->funcOp = TransformFunction(val);
+ }
+
+//---------------------------------------------------------
+// presetNew
+//---------------------------------------------------------
+
+void MidiTransformerDialog::presetNew()
+ {
+ QString name;
+ for (int i = 0;; ++i) {
+ name.sprintf("New-%d", i);
+ iMidiTransformation imt;
+ for (imt = mtlist.begin(); imt != mtlist.end(); ++imt) {
+ if (name == (*imt)->name)
+ break;
+ }
+ if (imt == mtlist.end())
+ break;
+ }
+ MidiTransformation* mt = new MidiTransformation(name);
+ Q3ListBoxText* lbi = new Q3ListBoxText(presetList, name);
+ mtlist.push_back(mt);
+ presetList->setCurrentItem(lbi);
+ }
+
+//---------------------------------------------------------
+// presetDelete
+//---------------------------------------------------------
+
+void MidiTransformerDialog::presetDelete()
+ {
+ if (data->cindex != -1) {
+ iMidiTransformation mt = mtlist.begin();
+ for (int i = 0; i < data->cindex; ++i, ++mt) {
+ mtlist.erase(mt);
+ presetList->removeItem(data->cindex);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// presetChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::presetChanged(Q3ListBoxItem* item)
+ {
+ data->cindex = presetList->index(item);
+ iMidiTransformation i;
+ for (i = mtlist.begin(); i != mtlist.end(); ++i) {
+ if (item->text() == (*i)->name) {
+ data->cmt = *i;
+ break;
+ }
+ }
+ if (i == mtlist.end()) {
+ printf("MidiTransformerDialog::presetChanged: not found\n");
+ return;
+ }
+ nameEntry->setText(data->cmt->name);
+ commentEntry->setText(data->cmt->comment);
+
+ selEventOp->setCurrentItem(data->cmt->selEventOp);
+ selEventOpSel(data->cmt->selEventOp);
+
+ for (unsigned i = 0; i < sizeof(eventTypeTable)/sizeof(*eventTypeTable); ++i) {
+ if (eventTypeTable[i] == data->cmt->selType) {
+ selType->setCurrentItem(i);
+ break;
+ }
+ }
+
+ selVal1Op->setCurrentItem(data->cmt->selVal1);
+ selVal1OpSel(data->cmt->selVal1);
+
+ selVal2Op->setCurrentItem(data->cmt->selVal2);
+ selVal2OpSel(data->cmt->selVal2);
+
+ selLenOp->setCurrentItem(data->cmt->selLen);
+ selLenOpSel(data->cmt->selLen);
+
+ selRangeOp->setCurrentItem(data->cmt->selRange);
+ selRangeOpSel(data->cmt->selRange);
+
+ funcOp->setCurrentItem(data->cmt->funcOp);
+ funcOpSel(data->cmt->funcOp);
+
+ // TransformOperator procEvent: Keep, Fix
+ procEventOp->setCurrentItem(data->cmt->procEvent == Fix);
+
+ procEventOpSel(data->cmt->procEvent);
+
+ procVal1Op->setCurrentItem(data->cmt->procVal1);
+ procVal1OpSel(data->cmt->procVal1);
+
+ for (unsigned i = 0; i < sizeof(procVal2Map)/sizeof(*procVal2Map); ++i) {
+ if (procVal2Map[i] == data->cmt->procVal2) {
+ procVal2Op->setCurrentItem(i);
+ break;
+ }
+ }
+ procLenOp->setCurrentItem(data->cmt->procLen);
+ procLenOpSel(data->cmt->procLen);
+
+ procPosOp->setCurrentItem(data->cmt->procPos);
+ procPosOpSel(data->cmt->procPos);
+
+ selVal1aChanged(data->cmt->selVal1a);
+ selVal1bChanged(data->cmt->selVal1b);
+ selVal2a->setValue(data->cmt->selVal2a);
+ selVal2b->setValue(data->cmt->selVal2b);
+ selLenA->setValue(data->cmt->selLenA);
+ selLenB->setValue(data->cmt->selLenB);
+ selBarA->setValue(data->cmt->selRangeA);
+ selBarB->setValue(data->cmt->selRangeB);
+ procVal1a->setValue(data->cmt->procVal1a);
+ procVal1b->setValue(data->cmt->procVal1b);
+ procVal2a->setValue(data->cmt->procVal2a);
+ procVal2b->setValue(data->cmt->procVal2b);
+ procLenA->setValue(data->cmt->procLenA);
+ procPosA->setValue(data->cmt->procPosA);
+ funcQuantVal->setValue(data->cmt->quantVal);
+
+ selectedTracks->setChecked(data->cmt->selectedTracks);
+ selectedTracksChanged(data->cmt->selectedTracks);
+ insideLoop->setChecked(data->cmt->insideLoop);
+ insideLoopChanged(data->cmt->insideLoop);
+ }
+
+//---------------------------------------------------------
+// nameChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::nameChanged(const QString& s)
+ {
+ data->cmt->name = s;
+ Q3ListBoxItem* item = presetList->item(data->cindex);
+ if (s != item->text()) {
+ disconnect(presetList, SIGNAL(highlighted(Q3ListBoxItem*)),
+ this, SLOT(presetChanged(Q3ListBoxItem*)));
+ presetList->changeItem(s, data->cindex);
+ connect(presetList, SIGNAL(highlighted(Q3ListBoxItem*)),
+ SLOT(presetChanged(Q3ListBoxItem*)));
+ }
+ }
+
+//---------------------------------------------------------
+// commentChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::commentChanged()
+ {
+ data->cmt->comment = commentEntry->text();
+ }
+
+//---------------------------------------------------------
+// selVal1aChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selVal1aChanged(int val)
+ {
+ data->cmt->selVal1a = val;
+ if ((data->cmt->selEventOp != All)
+ && (data->cmt->selType == Note)) {
+ selVal1a->setSuffix(" - " + pitch2string(val));
+ }
+ else
+ selVal1a->setSuffix(QString(""));
+ }
+
+//---------------------------------------------------------
+// selVal1bChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selVal1bChanged(int val)
+ {
+ data->cmt->selVal1b = val;
+ if ((data->cmt->selEventOp != All)
+ && (data->cmt->selType == Note)) {
+ selVal1b->setSuffix(" - " + pitch2string(val));
+ }
+ else
+ selVal1b->setSuffix(QString(""));
+ }
+
+//---------------------------------------------------------
+// selVal2aChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selVal2aChanged(int val)
+ {
+ data->cmt->selVal2a = val;
+ }
+
+//---------------------------------------------------------
+// selVal2bChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selVal2bChanged(int val)
+ {
+ data->cmt->selVal2b = val;
+ }
+
+//---------------------------------------------------------
+// selLenAChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selLenAChanged(int val)
+ {
+ data->cmt->selLenA = val;
+ }
+
+//---------------------------------------------------------
+// selLenBChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selLenBChanged(int val)
+ {
+ data->cmt->selLenB = val;
+ }
+
+//---------------------------------------------------------
+// selBarAChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selBarAChanged(int val)
+ {
+ data->cmt->selRangeA = val;
+ }
+
+//---------------------------------------------------------
+// selBarBChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selBarBChanged(int val)
+ {
+ data->cmt->selRangeB = val;
+ }
+
+//---------------------------------------------------------
+// procVal1aChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procVal1aChanged(int val)
+ {
+ data->cmt->procVal1a = val;
+ }
+
+//---------------------------------------------------------
+// procVal1bChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procVal1bChanged(int val)
+ {
+ data->cmt->procVal1b = val;
+ }
+
+//---------------------------------------------------------
+// procVal2aChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procVal2aChanged(int val)
+ {
+ data->cmt->procVal2a = val;
+ }
+
+//---------------------------------------------------------
+// procVal2bChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procVal2bChanged(int val)
+ {
+ data->cmt->procVal2b = val;
+ }
+
+//---------------------------------------------------------
+// procLenAChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procLenAChanged(int val)
+ {
+ data->cmt->procLenA = val;
+ }
+
+//---------------------------------------------------------
+// procPosAChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::procPosAChanged(int val)
+ {
+ data->cmt->procPosA = val;
+ }
+
+//---------------------------------------------------------
+// funcQuantValSel
+//---------------------------------------------------------
+
+void MidiTransformerDialog::funcQuantValSel(int val)
+ {
+ data->cmt->quantVal = val;
+ }
+
+//---------------------------------------------------------
+// processAllChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::processAllChanged(bool val)
+ {
+ if (val == true) {
+ selectedTracks->setChecked(false);
+ insideLoop->setChecked(false);
+ data->cmt->selectedTracks = false;
+ data->cmt->insideLoop = false;
+ }
+ }
+
+//---------------------------------------------------------
+// selectedTracksChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::selectedTracksChanged(bool val)
+ {
+ data->cmt->selectedTracks = val;
+ processAll->setChecked(!val && !data->cmt->insideLoop);
+ }
+
+//---------------------------------------------------------
+// insideLoopChanged
+//---------------------------------------------------------
+
+void MidiTransformerDialog::insideLoopChanged(bool val)
+ {
+ data->cmt->insideLoop = val;
+ processAll->setChecked(!data->cmt->selectedTracks && !val);
+ }
+
diff --git a/muse/muse/miditransform.h b/muse/muse/miditransform.h
new file mode 100644
index 00000000..1931ce78
--- /dev/null
+++ b/muse/muse/miditransform.h
@@ -0,0 +1,113 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MIDITRANSFORM_H__
+#define __MIDITRANSFORM_H__
+
+#include "widgets/transformbase.h"
+
+class MidiTransformation;
+class MidiTransformPrivate;
+class Event;
+class Part;
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+enum ValOp {
+ All=0, Ignore=0, Equal=1, Unequal=2, Higher=3, Lower=4,
+ Inside=5, Outside=6
+ };
+
+enum TransformFunction {
+ Select, Quantize, Delete, Transform, Insert, Copy, Extract
+ };
+
+enum TransformOperator {
+ Keep, Plus, Minus, Multiply, Divide, Fix, Value, Invert,
+ ScaleMap, Flip, Dynamic, Random
+ };
+
+//---------------------------------------------------------
+// MidiTransformDialog
+//---------------------------------------------------------
+
+class MidiTransformerDialog : public MidiTransformDialogBase {
+ Q_OBJECT
+ MidiTransformPrivate* data;
+
+ virtual void accept();
+// virtual void reject();
+ void setValOp(QWidget* a, QWidget* b, ValOp op);
+ void processEvent(Event&, Part*, Part*);
+ bool isSelected(Event&, Part*);
+ void transformEvent(Event&, Part*, Part*);
+
+ private slots:
+ void apply();
+ void presetNew();
+ void presetDelete();
+
+ void selEventOpSel(int);
+ void selTypeSel(int);
+ void selVal1OpSel(int);
+ void selVal2OpSel(int);
+ void selLenOpSel(int);
+ void selRangeOpSel(int);
+ void procEventOpSel(int);
+ void procEventTypeSel(int);
+ void procVal1OpSel(int);
+ void procVal2OpSel(int);
+ void procLenOpSel(int);
+ void procPosOpSel(int);
+ void funcOpSel(int);
+ void presetChanged(QListWidgetItem*);
+ void nameChanged(const QString&);
+ void commentChanged();
+ void selVal1aChanged(int);
+ void selVal1bChanged(int);
+ void selVal2aChanged(int);
+ void selVal2bChanged(int);
+ void selLenAChanged(int);
+ void selLenBChanged(int);
+ void selBarAChanged(int);
+ void selBarBChanged(int);
+ void procVal1aChanged(int);
+ void procVal1bChanged(int);
+ void procVal2aChanged(int);
+ void procVal2bChanged(int);
+ void procLenAChanged(int);
+ void procPosAChanged(int);
+ void funcQuantValSel(int);
+ void processAllChanged(bool);
+ void selectedTracksChanged(bool);
+ void insideLoopChanged(bool);
+
+ public:
+ MidiTransformerDialog(QWidget* parent = 0, const char* name = 0,
+ bool modal = false, Qt::WFlags fl = 0);
+ ~MidiTransformerDialog();
+ };
+
+extern void writeMidiTransforms(Xml& xml);
+extern void readMidiTransform(QDomNode);
+#endif
diff --git a/muse/muse/mixer/astrip.cpp b/muse/muse/mixer/astrip.cpp
new file mode 100644
index 00000000..3514cd09
--- /dev/null
+++ b/muse/muse/mixer/astrip.cpp
@@ -0,0 +1,1036 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: astrip.cpp,v 1.81 2006/04/22 13:53:17 wschweer Exp $
+//
+// (C) Copyright 2000-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "audio.h"
+#include "driver/audiodev.h"
+#include "song.h"
+#include "astrip.h"
+#include "synth.h"
+#include "rack.h"
+#include "gconfig.h"
+#include "muse.h"
+#include "widgets/simplebutton.h"
+#include "widgets/utils.h"
+#include "plugin.h"
+
+#include "awl/volknob.h"
+#include "awl/panknob.h"
+#include "awl/mslider.h"
+#include "awl/volentry.h"
+#include "awl/panentry.h"
+
+//---------------------------------------------------------
+// heartBeat
+//---------------------------------------------------------
+
+void AudioStrip::heartBeat()
+ {
+ int peakHold = (config.peakHoldTime * config.guiRefresh) / 1000;
+ for (int ch = 0; ch < channel; ++ch) {
+ int n = track->peakTimer(ch);
+ ++n;
+ float f = track->peak(ch);
+ if (n >= peakHold) {
+ // track->resetPeak(ch);
+ track->setPeak(ch, f * 0.7);
+ }
+ track->setPeakTimer(ch, n);
+ slider->setMeterVal(ch, track->meter(ch), f);
+ }
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void AudioStrip::songChanged(int val)
+ {
+ AudioTrack* src = (AudioTrack*)track;
+ if (val & SC_TRACK_MODIFIED)
+ updateLabel();
+ if (val & SC_ROUTE) {
+ if (pre) {
+ pre->setChecked(src->prefader());
+ }
+ }
+ if (val & SC_CHANNELS)
+ updateChannels();
+ }
+
+//---------------------------------------------------------
+// offToggled
+//---------------------------------------------------------
+
+void AudioStrip::offToggled(bool val)
+ {
+ song->setOff(track, !val);
+ }
+
+//---------------------------------------------------------
+// updateOffState
+//---------------------------------------------------------
+
+void AudioStrip::updateOffState()
+ {
+ bool val = !track->off();
+ slider->setEnabled(val);
+ sl->setEnabled(val);
+ pan->setEnabled(val);
+ panl->setEnabled(val);
+ pre->setEnabled(val);
+ rack->setEnabled(val);
+
+ if (track->type() != Track::AUDIO_SOFTSYNTH)
+ stereo->setEnabled(val);
+//TD label->setEnabled(val);
+ if (solo)
+ solo->setEnabled(val);
+ if (mute)
+ mute->setEnabled(val);
+ if (iR)
+ iR->setEnabled(val);
+ if (oR)
+ oR->setEnabled(val);
+ if (off) {
+ off->setChecked(track->off());
+ }
+ }
+
+//---------------------------------------------------------
+// preToggled
+//---------------------------------------------------------
+
+void AudioStrip::preToggled(bool val)
+ {
+ audio->msgSetPrefader((AudioTrack*)track, val);
+ resetPeaks();
+ song->update(SC_ROUTE);
+ }
+
+//---------------------------------------------------------
+// stereoToggled
+//---------------------------------------------------------
+
+void AudioStrip::stereoToggled(bool val)
+ {
+ int nc = val ? 1 : 2;
+ if (channel == nc)
+ return;
+ audio->msgSetChannels((AudioTrack*)track, nc);
+ song->update(SC_CHANNELS);
+ }
+
+//---------------------------------------------------------
+// auxChanged
+//---------------------------------------------------------
+
+void AudioStrip::auxChanged(float v, int idx)
+ {
+ if (auxValue[idx] != v) {
+ CVal val;
+ val.f = v;
+ song->setControllerVal(track, AC_AUX+idx, val);
+ auxValue[idx] = v;
+ }
+ }
+
+//---------------------------------------------------------
+// volumeChanged
+//---------------------------------------------------------
+
+void AudioStrip::volumeChanged(float v)
+ {
+ CVal val;
+ val.f = v;
+ song->setControllerVal(track, AC_VOLUME, val);
+ }
+
+//---------------------------------------------------------
+// setAux
+//---------------------------------------------------------
+
+void AudioStrip::setAux(float val, int idx)
+ {
+ auxKnob[idx]->setValue(val);
+ auxLabel[idx]->setValue(val);
+ auxValue[idx] = val;
+ }
+
+//---------------------------------------------------------
+// auxPressed
+//---------------------------------------------------------
+
+void AudioStrip::auxPressed(int n)
+ {
+ ((AudioTrack*)track)->startAutoRecord(AC_AUX+n);
+ }
+
+//---------------------------------------------------------
+// auxReleased
+//---------------------------------------------------------
+
+void AudioStrip::auxReleased(int n)
+ {
+ ((AudioTrack*)track)->stopAutoRecord(AC_AUX+n);
+ }
+
+//---------------------------------------------------------
+// volumePressed
+//---------------------------------------------------------
+
+void AudioStrip::volumePressed()
+ {
+ ((AudioTrack*)track)->startAutoRecord(AC_VOLUME);
+ }
+
+//---------------------------------------------------------
+// volumeReleased
+//---------------------------------------------------------
+
+void AudioStrip::volumeReleased()
+ {
+ ((AudioTrack*)track)->stopAutoRecord(AC_VOLUME);
+ }
+
+//---------------------------------------------------------
+// panChanged
+//---------------------------------------------------------
+
+void AudioStrip::panChanged(float v)
+ {
+ if (v != panVal) {
+ CVal val;
+ val.f = v;
+ song->setControllerVal(track, AC_PAN, val);
+ panVal = v;
+ }
+ }
+
+//---------------------------------------------------------
+// setPan
+//---------------------------------------------------------
+
+void AudioStrip::setPan(float val)
+ {
+ if (val != panVal) {
+ panVal = val;
+ pan->setValue(val);
+ panl->setValue(val);
+ }
+ }
+
+//---------------------------------------------------------
+// panPressed
+//---------------------------------------------------------
+
+void AudioStrip::panPressed()
+ {
+ track->startAutoRecord(AC_PAN);
+ }
+
+//---------------------------------------------------------
+// panReleased
+//---------------------------------------------------------
+
+void AudioStrip::panReleased()
+ {
+ track->stopAutoRecord(AC_PAN);
+ }
+
+//---------------------------------------------------------
+// updateChannels
+//---------------------------------------------------------
+
+void AudioStrip::updateChannels()
+ {
+ AudioTrack* t = (AudioTrack*)track;
+ int c = t->channels();
+ if (c == channel)
+ return;
+ channel = c;
+ slider->setChannel(c);
+ stereo->setChecked(channel == 2);
+ }
+
+//---------------------------------------------------------
+// addAuxKnob
+//---------------------------------------------------------
+
+Awl::VolKnob* AudioStrip::addAuxKnob(int id, Awl::VolEntry** dlabel)
+ {
+ QString label;
+
+ Awl::VolKnob* knob = new Awl::VolKnob(this);
+ knob->setToolTip(tr("aux send level"));
+ knob->setRange(config.minSlider-0.1f, 10.0f);
+
+ Awl::VolEntry* pl = new Awl::VolEntry(this);
+ pl->setRange(config.minSlider, 10.0f);
+ label.sprintf("Aux%d", id+1);
+
+ knob->setFixedWidth(STRIP_WIDTH/2-2);
+ knob->setFixedHeight(STRIP_WIDTH/2);
+
+ if (dlabel)
+ *dlabel = pl;
+ pl->setFont(*config.fonts[1]);
+ pl->setFrame(true);
+ pl->setFixedWidth(STRIP_WIDTH/2-2);
+
+ QLabel* plb = new QLabel(label, this);
+ plb->setFont(*config.fonts[1]);
+ plb->setFixedWidth(STRIP_WIDTH/2-2);
+ plb->setAlignment(Qt::AlignCenter);
+
+ QGridLayout* pangrid = new QGridLayout;
+ pangrid->setSpacing(0);
+ pangrid->setMargin(0);
+ pangrid->addWidget(plb, 0, 0);
+ pangrid->addWidget(pl, 1, 0);
+ pangrid->addWidget(knob, 0, 1, 2, 1);
+ layout->addLayout(pangrid);
+
+ knob->setId(id);
+
+ connect(knob, SIGNAL(sliderPressed(int)), SLOT(auxPressed(int)));
+ connect(knob, SIGNAL(sliderReleased(int)), SLOT(auxReleased(int)));
+ connect(knob, SIGNAL(valueChanged(float, int)), SLOT(auxChanged(float, int)));
+ connect(pl, SIGNAL(valueChanged(float, int)), SLOT(auxChanged(float, int)));
+ return knob;
+ }
+
+//---------------------------------------------------------
+// addPanKnob
+//---------------------------------------------------------
+
+Awl::PanKnob* AudioStrip::addPanKnob(Awl::PanEntry** dlabel)
+ {
+ Awl::PanKnob* knob = new Awl::PanKnob(this);
+ knob->setToolTip(tr("panorama"));
+ knob->setFixedSize(buttonSize.width(), entrySize.height() * 2);
+
+ Awl::PanEntry* pl = new Awl::PanEntry(this);
+ pl->setPrecision(2);
+
+ if (dlabel)
+ *dlabel = pl;
+ pl->setFont(*config.fonts[1]);
+ pl->setFrame(true);
+
+ pl->setFixedSize(entrySize);
+
+ QLabel* plb = new QLabel;
+ plb->setText(tr("Pan"));
+
+ plb->setFont(*config.fonts[1]);
+ plb->setFixedSize(entrySize);
+ plb->setAlignment(Qt::AlignCenter);
+
+ QGridLayout* pangrid = new QGridLayout;
+ pangrid->setMargin(0);
+ pangrid->setSpacing(0);
+ pangrid->addWidget(plb, 0, 0);
+ pangrid->addWidget(pl, 1, 0);
+ pangrid->addWidget(knob, 0, 1, 2, 1);
+ layout->addLayout(pangrid);
+
+ connect(knob, SIGNAL(valueChanged(float,int)), SLOT(panChanged(float)));
+ connect(pl, SIGNAL(valueChanged(float,int)), SLOT(panChanged(float)));
+ connect(knob, SIGNAL(sliderPressed(int)), SLOT(panPressed()));
+ connect(knob, SIGNAL(sliderReleased(int)), SLOT(panReleased()));
+ return knob;
+ }
+
+//---------------------------------------------------------
+// AudioStrip
+//---------------------------------------------------------
+
+AudioStrip::~AudioStrip()
+ {
+ }
+
+//---------------------------------------------------------
+// AudioStrip
+// create mixer strip
+//---------------------------------------------------------
+
+AudioStrip::AudioStrip(Mixer* m, AudioTrack* t, bool align)
+ : Strip(m, t, align)
+ {
+ iR = 0;
+ oR = 0;
+ off = 0;
+ volume = -1.0;
+ channel = t->channels();
+
+ //---------------------------------------------------
+ // plugin rack
+ //---------------------------------------------------
+
+ rack = new EffectRack(this, t);
+ rack->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ rack->setFixedHeight(rack->sizeHint().height() + 2);
+ layout->addWidget(rack);
+
+ //---------------------------------------------------
+ // mono/stereo pre/post
+ //---------------------------------------------------
+
+ QHBoxLayout* ppBox = new QHBoxLayout;
+ stereo = newStereoButton(this);
+ stereo->setChecked(channel == 2);
+ stereo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ stereo->setFixedHeight(LABEL_HEIGHT);
+ connect(stereo, SIGNAL(clicked(bool)), SLOT(stereoToggled(bool)));
+
+ pre = new QToolButton;
+ pre->setFont(*config.fonts[1]);
+ pre->setCheckable(true);
+ pre->setText(tr("Pre"));
+ pre->setToolTip(tr("pre fader - post fader"));
+ pre->setChecked(t->prefader());
+ pre->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ pre->setFixedHeight(LABEL_HEIGHT);
+ connect(pre, SIGNAL(clicked(bool)), SLOT(preToggled(bool)));
+
+ ppBox->addWidget(stereo);
+ ppBox->addWidget(pre);
+ layout->addLayout(ppBox);
+
+ //---------------------------------------------------
+ // aux send
+ //---------------------------------------------------
+
+ int auxsSize = song->auxs()->size();
+ if (t->hasAuxSend()) {
+ for (int idx = 0; idx < auxsSize; ++idx) {
+ Awl::VolEntry* al;
+ Awl::VolKnob* ak = addAuxKnob(idx, &al);
+ auxKnob.push_back(ak);
+ auxLabel.push_back(al);
+ auxValue.push_back(0.0f);
+ float as = t->getController(AC_AUX+idx)->curVal().f;
+ ak->setValue(as);
+ al->setValue(as);
+ }
+ }
+ else if (auxsSize && _align)
+ layout->addSpacing((STRIP_WIDTH/2 + 2) * auxsSize);
+
+ //---------------------------------------------------
+ // slider, label
+ //---------------------------------------------------
+
+ slider = new Awl::MeterSlider(this);
+ slider->setRange(config.minSlider-0.1f, 10.0f);
+ slider->setFixedWidth(60);
+ slider->setChannel(channel);
+ Ctrl* ctrl = t->getController(AC_VOLUME);
+ float vol = 0.0;
+ if (ctrl)
+ vol = ctrl->curVal().f;
+ slider->setValue(vol);
+ layout->addWidget(slider, 100, Qt::AlignRight);
+
+ sl = new Awl::VolEntry(this);
+ sl->setFont(*config.fonts[1]);
+ sl->setSuffix(tr("dB"));
+ sl->setFrame(true);
+ sl->setValue(vol);
+
+ connect(slider, SIGNAL(valueChanged(float,int)), SLOT(volumeChanged(float)));
+ connect(sl, SIGNAL(valueChanged(float,int)), SLOT(volumeChanged(float)));
+
+ connect(slider, SIGNAL(sliderPressed(int)), SLOT(volumePressed()));
+ connect(slider, SIGNAL(sliderReleased(int)), SLOT(volumeReleased()));
+ connect(slider, SIGNAL(meterClicked()), SLOT(resetPeaks()));
+ layout->addWidget(sl);
+
+ //---------------------------------------------------
+ // pan, balance
+ //---------------------------------------------------
+
+ pan = addPanKnob(&panl);
+ float panv = t->getController(AC_PAN)->curVal().f;
+ pan->setValue(panv);
+ panl->setValue(panv);
+
+ //---------------------------------------------------
+ // mute, solo, record
+ //---------------------------------------------------
+
+ Track::TrackType type = t->type();
+
+ QHBoxLayout* smBox1 = new QHBoxLayout(0);
+ QHBoxLayout* smBox2 = new QHBoxLayout(0);
+
+ mute = newMuteButton(this);
+ mute->setChecked(t->mute());
+ mute->setFixedSize(buttonSize);
+ connect(mute, SIGNAL(clicked(bool)), SLOT(muteToggled(bool)));
+ connect(t, SIGNAL(muteChanged(bool)), mute, SLOT(setChecked(bool)));
+ smBox2->addWidget(mute);
+
+ solo = newSoloButton(this);
+ solo->setDisabled(true);
+ solo->setFixedSize(buttonSize);
+ smBox2->addWidget(solo);
+ connect(solo, SIGNAL(clicked(bool)), SLOT(soloToggled(bool)));
+ connect(t, SIGNAL(soloChanged(bool)), solo, SLOT(setChecked(bool)));
+
+ off = newOffButton(this);
+ off->setFixedSize(buttonSize);
+ off->setChecked(t->off());
+ connect(off, SIGNAL(clicked(bool)), SLOT(offToggled(bool)));
+ connect(t, SIGNAL(offChanged(bool)), this, SLOT(updateOffState()));
+
+ smBox1->addWidget(off);
+
+ if (track->canRecord()) {
+ record = newRecordButton(this);
+ record->setFixedSize(buttonSize);
+ if (type == Track::AUDIO_OUTPUT)
+ record->setToolTip(tr("record downmix"));
+ record->setChecked(t->recordFlag());
+ connect(record, SIGNAL(clicked(bool)), SLOT(recordToggled(bool)));
+ connect(t, SIGNAL(recordChanged(bool)), record, SLOT(setChecked(bool)));
+ smBox1->addWidget(record);
+ }
+ else {
+ record = 0;
+ smBox1->addStretch(100);
+ }
+
+ layout->addLayout(smBox1);
+ layout->addLayout(smBox2);
+
+ //---------------------------------------------------
+ // automation read write
+ //---------------------------------------------------
+
+ addAutomationButtons();
+
+ //---------------------------------------------------
+ // routing
+ //---------------------------------------------------
+
+ QHBoxLayout* rBox = new QHBoxLayout(0);
+// if (type != Track::AUDIO_AUX && type != Track::AUDIO_SOFTSYNTH) {
+ if (type != Track::AUDIO_AUX) {
+ iR = new QToolButton(this);
+ iR->setFont(*config.fonts[1]);
+ iR->setFixedWidth((STRIP_WIDTH-4)/2);
+ iR->setText(tr("iR"));
+ iR->setCheckable(false);
+ iR->setToolTip(tr("input routing"));
+ rBox->addWidget(iR);
+ connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed()));
+ }
+ else
+ rBox->addSpacing((STRIP_WIDTH-4)/2);
+ oR = new QToolButton(this);
+ oR->setFont(*config.fonts[1]);
+ oR->setFixedWidth((STRIP_WIDTH-4)/2);
+ oR->setText(tr("oR"));
+ oR->setCheckable(false);
+ oR->setToolTip(tr("output routing"));
+ rBox->addWidget(oR);
+ connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed()));
+
+ layout->addLayout(rBox);
+
+ if (off) {
+ updateOffState(); // init state
+ }
+ connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat()));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(track, SIGNAL(controllerChanged(int)), SLOT(controllerChanged(int)));
+ connect(track, SIGNAL(autoReadChanged(bool)), SLOT(autoChanged()));
+ connect(track, SIGNAL(autoWriteChanged(bool)), SLOT(autoChanged()));
+ autoChanged();
+ }
+
+//---------------------------------------------------------
+// addAuxPorts
+//---------------------------------------------------------
+
+static void addAuxPorts(AudioTrack* t, QMenu* lb, RouteList* r)
+ {
+ AuxList* al = song->auxs();
+ for (iAudioAux i = al->begin(); i != al->end(); ++i) {
+ Track* track = *i;
+ if (t == track)
+ continue;
+ QString s(track->name());
+ QAction* it = lb->addAction(s); //int it = lb->insertItem(s);
+ for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
+ if (ir->type == 0 && ir->track == track) {
+ it->setCheckable(true); //lb->setItemChecked(it, true);
+ it->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// addInPorts
+//---------------------------------------------------------
+
+static void addInPorts(AudioTrack* t, QMenu* lb, RouteList* r)
+ {
+ InputList* al = song->inputs();
+ for (iAudioInput i = al->begin(); i != al->end(); ++i) {
+ Track* track = *i;
+ if (t == track)
+ continue;
+ QString s(track->name());
+ QAction* it = lb->addAction(s); //int it = lb->insertItem(s);
+ for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
+ if (ir->type == 0 && ir->track == track) {
+ it->setCheckable(true); //lb->setItemChecked(it, true);
+ it->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// addOutPorts
+//---------------------------------------------------------
+
+static void addOutPorts(AudioTrack* t, QMenu* lb, RouteList* r)
+ {
+ OutputList* al = song->outputs();
+ for (iAudioOutput i = al->begin(); i != al->end(); ++i) {
+ Track* track = *i;
+ if (t == track)
+ continue;
+ QString s(track->name());
+ QAction* it = lb->addAction(s); //int it = lb->insertItem(s);
+ for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
+ if (ir->type == 0 && ir->track == track) {
+ it->setCheckable(true); //lb->setItemChecked(it, true);
+ it->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// addGroupPorts
+//---------------------------------------------------------
+
+static void addGroupPorts(AudioTrack* t, QMenu* lb, RouteList* r)
+ {
+ GroupList* al = song->groups();
+ for (iAudioGroup i = al->begin(); i != al->end(); ++i) {
+ Track* track = *i;
+ if (t == track)
+ continue;
+ QString s(track->name());
+ QAction* it = lb->addAction(s); //int it = lb->insertItem(s);
+ for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
+ if (ir->type == 0 && ir->track == track) {
+ it->setCheckable(true); //lb->setItemChecked(it, true);
+ it->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// addWavePorts
+//---------------------------------------------------------
+
+static void addWavePorts(AudioTrack* t, QMenu* lb, RouteList* r)
+ {
+ WaveTrackList* al = song->waves();
+ for (iWaveTrack i = al->begin(); i != al->end(); ++i) {
+ Track* track = *i;
+ if (t == track)
+ continue;
+ QString s(track->name());
+ QAction* it = lb->addAction(s); //int it = lb->insertItem(s);
+ for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
+ if (ir->type == 0 && ir->track == track) {
+ it->setCheckable(true); //lb->setItemChecked(it, true);
+ it->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// addMidiOutPorts
+//---------------------------------------------------------
+
+static void addMidiOutPorts(Track* t, QMenu* lb, RouteList* r)
+ {
+ MidiOutPortList* al = song->midiOutPorts();
+ for (iMidiOutPort i = al->begin(); i != al->end(); ++i) {
+ Track* track = *i;
+ if (t == track)
+ continue;
+ QString s(track->name());
+ QAction* it = lb->addAction(s);//int it = lb->insertItem(s);
+ Route route(track, -1, Route::TRACK);
+ for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
+ if (*ir == route) {
+ it->setCheckable(true);//lb->setItemChecked(it, true);
+ it->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// addMidiInPorts
+//---------------------------------------------------------
+
+static void addMidiInPorts(Track* t, QMenu* lb, RouteList* r)
+ {
+ MidiInPortList* al = song->midiInPorts();
+ for (iMidiInPort i = al->begin(); i != al->end(); ++i) {
+ Track* track = *i;
+ if (t == track)
+ continue;
+ QString s(track->name());
+ QAction* it = lb->addAction(s); //int it = lb->insertItem(s);
+ Route route(track, -1, Route::TRACK);
+ for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
+ if (*ir == route) {
+ it->setCheckable(true); //lb->setItemChecked(it, true);
+ it->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// addSyntiPorts
+//---------------------------------------------------------
+
+static void addSyntiPorts(AudioTrack* t, QMenu* lb, RouteList* r)
+ {
+ SynthIList* al = song->syntis();
+ for (iSynthI i = al->begin(); i != al->end(); ++i) {
+ Track* track = *i;
+ if (t == track)
+ continue;
+ QString s(track->name());
+ QAction* it = lb->addAction(s); //int it = lb->insertItem(s);
+ Route route(track, -1, Route::SYNTIPORT);
+
+ for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
+ if (*ir == route) {
+ it->setCheckable(true);//lb->setItemChecked(it, true);
+ it->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// iRoutePressed
+//---------------------------------------------------------
+
+void AudioStrip::iRoutePressed()
+ {
+ QMenu* pup = new QMenu(iR);
+ AudioTrack* t = (AudioTrack*)track;
+ RouteList* irl = t->inRoutes();
+
+ switch(track->type()) {
+ default:
+ delete pup;
+ return;
+ case Track::AUDIO_INPUT:
+ {
+ int gid = 0;
+ for (int i = 0; i < channel; ++i) {
+ char buffer[128];
+ snprintf(buffer, 128, "%s %d", tr("Channel").toLatin1().data(), i+1);
+ pup->addSeparator()->setText(QString(buffer));
+
+ std::list<PortName>* ol = audioDriver->outputPorts();
+ for (std::list<PortName>::iterator ip = ol->begin(); ip != ol->end(); ++ip) {
+ QAction* id = pup->addAction(ip->name);
+ id->setData(QVariant(gid * 16 + i));
+ Route src(ip->name, i, Route::AUDIOPORT);
+ ++gid;
+ for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) {
+ if (*ir == src) {
+ id->setCheckable(true);
+ id->setChecked(true);
+ break;
+ }
+ }
+ }
+ delete ol;
+// if (i+1 != channel)
+// pup->addSeparator();
+ }
+ }
+ break;
+ case Track::AUDIO_OUTPUT:
+ addWavePorts(t, pup, irl);
+ addInPorts(t, pup, irl);
+ addGroupPorts(t, pup, irl);
+ addAuxPorts(t, pup, irl);
+ addSyntiPorts(t, pup, irl);
+ break;
+ case Track::WAVE:
+ addInPorts(t, pup, irl);
+ break;
+ case Track::AUDIO_GROUP:
+ addWavePorts(t, pup, irl);
+ addInPorts(t, pup, irl);
+ addGroupPorts(t, pup, irl);
+ addSyntiPorts(t, pup, irl);
+ break;
+ case Track::AUDIO_SOFTSYNTH:
+ addMidiOutPorts(t, pup, irl);
+ addMidiInPorts(t, pup, irl);
+ break;
+ }
+ QAction* n = pup->exec(QCursor::pos());
+ if (n != 0) {
+ int id = n->data().toInt();
+ QString s(n->text());
+ Route srcRoute, dstRoute;
+
+ if (track->type() == Track::AUDIO_INPUT) {
+ srcRoute = Route(s, id & 0xf, Route::AUDIOPORT);
+ dstRoute = Route(t, id & 0xf, Route::TRACK);
+ }
+ else if (track->type() == Track::AUDIO_SOFTSYNTH) {
+ srcRoute = Route(s, -1, Route::TRACK);
+ dstRoute = Route(t, -1, Route::SYNTIPORT);
+ }
+ else {
+ srcRoute = Route(s, -1, Route::TRACK);
+ dstRoute = Route(t, -1, Route::TRACK);
+ }
+ iRoute iir = irl->begin();
+ for (; iir != irl->end(); ++iir) {
+ if (*iir == srcRoute)
+ break;
+ }
+ if (iir != irl->end()) {
+ // disconnect
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ }
+ else {
+ // connect
+ audio->msgAddRoute(srcRoute, dstRoute);
+ }
+ song->update(SC_ROUTE);
+ }
+ delete pup;
+ iR->setDown(false); // pup->exec() catches mouse release event
+ }
+
+//---------------------------------------------------------
+// oRoutePressed
+//---------------------------------------------------------
+
+void AudioStrip::oRoutePressed()
+ {
+ QMenu* pup = new QMenu(oR);
+ AudioTrack* t = (AudioTrack*)track;
+ RouteList* orl = t->outRoutes();
+
+ switch(track->type()) {
+ default:
+ delete pup;
+ return;
+ case Track::AUDIO_OUTPUT:
+ {
+ int gid = 0;
+ for (int i = 0; i < channel; ++i) {
+ char buffer[128];
+ snprintf(buffer, 128, "%s %d", tr("Channel").toLatin1().data(), i+1);
+ pup->addSeparator()->setText(QString(buffer));
+
+ std::list<PortName>* ol = audioDriver->inputPorts();
+ for (std::list<PortName>::iterator ip = ol->begin(); ip != ol->end(); ++ip) {
+ QAction* action = pup->addAction(ip->name);
+ action->setData(QVariant(gid * 16 + i));
+ Route dst(ip->name, i, Route::AUDIOPORT);
+ ++gid;
+ for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
+ if (*ir == dst) {
+ action->setCheckable(true);
+ action->setChecked(true);
+ break;
+ }
+ }
+ }
+ delete ol;
+// if (i+1 != channel)
+// pup->addSeparator();
+ }
+ }
+ break;
+ case Track::AUDIO_INPUT:
+ addWavePorts(t, pup, orl);
+ case Track::WAVE:
+ case Track::AUDIO_GROUP:
+ case Track::AUDIO_SOFTSYNTH:
+ addOutPorts(t, pup, orl);
+ addGroupPorts(t, pup, orl);
+ break;
+ case Track::AUDIO_AUX:
+ addOutPorts(t, pup, orl);
+ break;
+ }
+ QAction* n = pup->exec(QCursor::pos());
+ if (n != 0) {
+ QString s(n->text());
+ Route srcRoute(t, -1, track->type() == Track::AUDIO_SOFTSYNTH
+ ? Route::SYNTIPORT : Route::TRACK);
+ Route dstRoute(s, -1, track->type() == Track::AUDIO_OUTPUT
+ ? Route::AUDIOPORT : Route::TRACK);
+
+ if (track->type() == Track::AUDIO_OUTPUT) {
+ QVariant data = n->data();
+ srcRoute.channel = dstRoute.channel = data.toInt() & 0xf; //n & 0xf;
+ }
+
+
+ // check if route src->dst exists:
+ iRoute iorl = orl->begin();
+ for (; iorl != orl->end(); ++iorl) {
+ if (*iorl == dstRoute)
+ break;
+ }
+ if (iorl != orl->end()) {
+ // disconnect if route exists
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ }
+ else {
+ // connect if route does not exist
+ audio->msgAddRoute(srcRoute, dstRoute);
+ }
+ song->update(SC_ROUTE);
+ }
+ delete pup;
+ oR->setDown(false); // pup->exec() catches mouse release event
+ }
+
+//---------------------------------------------------------
+// muteToggled
+//---------------------------------------------------------
+
+void AudioStrip::muteToggled(bool val)
+ {
+ song->setMute(track, val);
+ }
+
+//---------------------------------------------------------
+// soloToggled
+//---------------------------------------------------------
+
+void AudioStrip::soloToggled(bool val)
+ {
+ song->setSolo(track, val);
+ }
+
+//---------------------------------------------------------
+// recordToggled
+//---------------------------------------------------------
+
+void AudioStrip::recordToggled(bool val)
+ {
+ song->setRecordFlag(track, !val);
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void AudioStrip::controllerChanged(int id)
+ {
+ float val = track->getController(id)->curVal().f;
+ switch (id) {
+ case AC_VOLUME:
+ slider->setValue(val);
+ sl->setValue(val);
+ break;
+ case AC_PAN:
+ pan->setValue(val);
+ panl->setValue(val);
+ panVal = val;
+ break;
+ case AC_MUTE:
+ break;
+ case AC_AUX...AC_AUX+NUM_AUX:
+ {
+ int idx = id - AC_AUX;
+ auxKnob[idx]->setValue(val);
+ auxLabel[idx]->setValue(val);
+ auxValue[idx] = val;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// autoChanged
+//---------------------------------------------------------
+
+void AudioStrip::autoChanged()
+ {
+ bool ar = track->autoRead();
+ bool aw = track->autoWrite();
+
+ // controller are enabled if
+ // autoRead is off
+ // autoRead and autoWrite are on (touch mode)
+
+ bool ec = !ar || (ar && aw);
+ slider->setEnabled(ec);
+ sl->setEnabled(ec);
+ if (((AudioTrack*)track)->hasAuxSend()) {
+ int auxsSize = song->auxs()->size();
+ for (int idx = 0; idx < auxsSize; ++idx) {
+ auxKnob[idx]->setEnabled(ec);
+ auxLabel[idx]->setEnabled(ec);
+ }
+ }
+ pan->setEnabled(ec);
+ panl->setEnabled(ec);
+ }
+
+//---------------------------------------------------------
+// autoReadToggled
+//---------------------------------------------------------
+
+void AudioStrip::autoReadToggled(bool val)
+ {
+ song->setAutoRead(track, val);
+ }
+
+//---------------------------------------------------------
+// autoWriteToggled
+//---------------------------------------------------------
+
+void AudioStrip::autoWriteToggled(bool val)
+ {
+ song->setAutoWrite(track, val);
+ }
diff --git a/muse/muse/mixer/astrip.h b/muse/muse/mixer/astrip.h
new file mode 100644
index 00000000..4a6c9cf7
--- /dev/null
+++ b/muse/muse/mixer/astrip.h
@@ -0,0 +1,98 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: astrip.h,v 1.26 2005/11/04 12:03:47 wschweer Exp $
+//
+// (C) Copyright 2000-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __ASTRIP_H__
+#define __ASTRIP_H__
+
+#include "strip.h"
+
+namespace Awl {
+ class MeterSlider;
+ class VolEntry;
+ class VolKnob;
+ class PanKnob;
+ class PanEntry;
+ };
+
+class AudioTrack;
+class SimpleButton;
+class EffectRack;
+class Mixer;
+
+//---------------------------------------------------------
+// AudioStrip
+//---------------------------------------------------------
+
+class AudioStrip : public Strip {
+ Q_OBJECT
+
+ int channel;
+ EffectRack* rack;
+
+ Awl::MeterSlider* slider;
+ Awl::VolEntry* sl;
+ float volume;
+
+ Awl::PanKnob* pan;
+ Awl::PanEntry* panl;
+ float panVal;
+
+ std::vector<Awl::VolKnob*> auxKnob;
+ std::vector<Awl::VolEntry*> auxLabel;
+ std::vector<float> auxValue;
+
+ QToolButton* stereo;
+ QToolButton* pre;
+
+ Awl::VolKnob* addAuxKnob(int, Awl::VolEntry**);
+ Awl::PanKnob* addPanKnob(Awl::PanEntry**);
+
+ QToolButton* iR;
+ QToolButton* oR;
+ SimpleButton* off;
+ SimpleButton* record;
+
+ void updateChannels();
+
+ private slots:
+ void stereoToggled(bool);
+ void preToggled(bool);
+ void offToggled(bool);
+ void iRoutePressed();
+ void oRoutePressed();
+ void auxChanged(float, int);
+ void volumeChanged(float);
+ void volumePressed();
+ void volumeReleased();
+ void panChanged(float);
+ void setPan(float);
+ void panPressed();
+ void panReleased();
+ void setAux(float, int);
+ void auxPressed(int);
+ void auxReleased(int);
+ void muteToggled(bool);
+ void soloToggled(bool);
+ void recordToggled(bool);
+ void autoChanged();
+ virtual void controllerChanged(int id);
+ virtual void songChanged(int);
+ void autoReadToggled(bool);
+ void autoWriteToggled(bool);
+ void updateOffState();
+
+ protected slots:
+ virtual void heartBeat();
+
+ public:
+ AudioStrip(Mixer*, AudioTrack*, bool align);
+ ~AudioStrip();
+ };
+
+#endif
+
diff --git a/muse/muse/mixer/midirack.cpp b/muse/muse/mixer/midirack.cpp
new file mode 100644
index 00000000..099e27e2
--- /dev/null
+++ b/muse/muse/mixer/midirack.cpp
@@ -0,0 +1,194 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: midirack.cpp,v 1.11 2006/01/12 14:49:13 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "icons.h"
+#include "gconfig.h"
+#include "midirack.h"
+#include "track.h"
+#include "song.h"
+#include "midiplugin.h"
+#include "audio.h"
+
+//---------------------------------------------------------
+// MidiRack
+//---------------------------------------------------------
+
+MidiRack::MidiRack(QWidget* parent, MidiTrackBase* t)
+ : QListWidget(parent)
+ {
+ setAttribute(Qt::WA_DeleteOnClose, true);
+ track = t;
+ setFont(*config.fonts[1]);
+
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+ setSelectionMode(QAbstractItemView::SingleSelection);
+ for (int i = 0; i < MidiPipelineDepth; ++i) {
+ QListWidgetItem* item = new QListWidgetItem;
+ item->setText(t->pipeline()->name(i));
+ item->setBackgroundColor(t->pipeline()->isOn(i) ? Qt::white : Qt::gray);
+ addItem(item);
+ }
+ connect(this, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
+ this, SLOT(doubleClicked(QListWidgetItem*)));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ setToolTip(tr("midi effect rack"));
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize MidiRack::sizeHint() const
+ {
+ QFontMetrics fm(font());
+ int h = fm.lineSpacing() * MidiPipelineDepth + 1;
+ return QSize(100, h);
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void MidiRack::songChanged(int typ)
+ {
+ if (typ & (SC_ROUTE | SC_RACK)) {
+ for (int i = 0; i < MidiPipelineDepth; ++i) {
+ QListWidgetItem* it = item(i);
+ it->setText(track->pipeline()->name(i));
+ it->setBackgroundColor(track->pipeline()->isOn(i) ? Qt::white : Qt::gray);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// menuRequested
+//---------------------------------------------------------
+
+void MidiRack::contextMenuEvent(QContextMenuEvent* ev)
+ {
+ QPoint pt(ev->pos());
+ QListWidgetItem* item = itemAt(pt);
+
+ if (item == 0 || track == 0)
+ return;
+
+ int idx = row(item);
+ QString name;
+ bool mute;
+
+ MidiPipeline* pipe = track->pipeline();
+ name = pipe->name(idx);
+ mute = pipe->isOn(idx);
+
+ QMenu* menu = new QMenu;
+
+ QAction* upAction = menu->addAction(QIcon(*upIcon), tr("move up"));
+ QAction* downAction = menu->addAction(QIcon(*downIcon), tr("move down"));
+ QAction* removeAction = menu->addAction(tr("remove"));
+ QAction* bypassAction = menu->addAction(tr("bypass"));
+ QAction* showAction = menu->addAction(tr("show gui"));
+ QAction* newAction;
+
+ bypassAction->setChecked(!pipe->isOn(idx));
+ showAction->setChecked(pipe->guiVisible(idx));
+
+ if (pipe->empty(idx)) {
+ newAction = menu->addAction(tr("new"));
+ upAction->setEnabled(false);
+ downAction->setEnabled(false);
+ removeAction->setEnabled(false);
+ bypassAction->setEnabled(false);
+ showAction->setEnabled(false);
+ }
+ else {
+ newAction = menu->addAction(tr("change"));
+ if (idx == 0)
+ upAction->setEnabled(false);
+ if (idx == (MidiPipelineDepth-1))
+ downAction->setEnabled(false);
+ }
+
+ QAction* sel = menu->exec(mapToGlobal(pt), newAction);
+ delete menu;
+ if (sel == 0)
+ return;
+
+ if (sel == newAction) {
+ MidiPlugin* plugin = MidiPluginDialog::getPlugin(this);
+ if (plugin) {
+ MidiPluginI* plugi = plugin->instantiate(track);
+ if (plugi == 0) {
+ printf("cannot instantiate plugin <%s>\n",
+ plugin->name().toLatin1().data());
+ delete plugi;
+ }
+ else
+ audio->msgAddMidiPlugin(track, idx, plugi);
+ }
+ }
+ else if (sel == removeAction) {
+ audio->msgAddMidiPlugin(track, idx, 0);
+ }
+ else if (sel == bypassAction) {
+ bool flag = !pipe->isOn(idx);
+ pipe->setOn(idx, flag);
+ }
+ else if (sel == showAction) {
+ bool flag = !pipe->guiVisible(idx);
+ pipe->showGui(idx, flag);
+ }
+ else if (sel == upAction) {
+ if (idx > 0) {
+ setCurrentRow(idx-1);
+ pipe->move(idx, true);
+ }
+ }
+ else if (sel == downAction) {
+ if (idx < (MidiPipelineDepth-1)) {
+ setCurrentRow(idx+1);
+ pipe->move(idx, false);
+ }
+ }
+ song->update(SC_RACK);
+ }
+
+//---------------------------------------------------------
+// doubleClicked
+// toggle gui
+//---------------------------------------------------------
+
+void MidiRack::doubleClicked(QListWidgetItem* it)
+ {
+ if (it == 0 || track == 0)
+ return;
+
+ int idx = row(it);
+ MidiPipeline* pipe = track->pipeline();
+
+ if (!pipe->empty(idx)) {
+ bool flag = !pipe->guiVisible(idx);
+ pipe->showGui(idx, flag);
+ }
+ else {
+ MidiPlugin* plugin = MidiPluginDialog::getPlugin(this);
+ if (plugin) {
+ MidiPluginI* plugi = plugin->instantiate(track);
+ if (plugi == 0) {
+ printf("cannot instantiate plugin <%s>\n",
+ plugin->name().toLatin1().data());
+ delete plugi;
+ }
+ else {
+ audio->msgAddMidiPlugin(track, idx, plugi);
+ }
+ }
+ }
+ }
+
diff --git a/muse/muse/mixer/midirack.h b/muse/muse/mixer/midirack.h
new file mode 100644
index 00000000..c490c0f2
--- /dev/null
+++ b/muse/muse/mixer/midirack.h
@@ -0,0 +1,34 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: midirack.h,v 1.7 2005/12/28 13:13:26 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MIDIRACK_H__
+#define __MIDIRACK_H__
+
+class MidiTrackBase;
+
+//---------------------------------------------------------
+// MidiRack
+//---------------------------------------------------------
+
+class MidiRack : public QListWidget {
+ MidiTrackBase* track;
+ Q_OBJECT
+
+ virtual void contextMenuEvent(QContextMenuEvent*);
+
+ private slots:
+ void doubleClicked(QListWidgetItem*);
+ void songChanged(int);
+
+ public:
+ MidiRack(QWidget*, MidiTrackBase* t);
+ QSize sizeHint() const;
+ };
+
+#endif
+
diff --git a/muse/muse/mixer/mixer.cpp b/muse/muse/mixer/mixer.cpp
new file mode 100644
index 00000000..16137697
--- /dev/null
+++ b/muse/muse/mixer/mixer.cpp
@@ -0,0 +1,425 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mixer.cpp,v 1.18 2006/01/12 18:15:28 wschweer Exp $
+//
+// (C) Copyright 2000-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "muse.h"
+#include "mixer.h"
+#include "song.h"
+#include "icons.h"
+#include "astrip.h"
+#include "mstrip.h"
+#include "routedialog.h"
+#include "synth.h"
+
+extern void populateAddTrack(QMenu* addTrack);
+
+//---------------------------------------------------------
+// Mixer
+//
+// inputs | synthis | tracks | groups | master
+//---------------------------------------------------------
+
+Mixer::Mixer(QWidget* parent, MixerConfig* c)
+ : QMainWindow(parent)
+ {
+ mustUpdateMixer = false;
+ cfg = c;
+ oldAuxsSize = 0;
+ routingDialog = 0;
+ setWindowTitle(tr("MusE: Mixer"));
+ setWindowIcon(*museIcon);
+
+ QMenu* menuCreate = menuBar()->addMenu(tr("&Create"));
+ populateAddTrack(menuCreate);
+
+ menuView = menuBar()->addMenu(tr("&View"));
+ routingAction = menuView->addAction(tr("Routing"), this, SLOT(toggleRouteDialog()));
+ routingAction->setCheckable(true);
+
+ showMidiTracksId = menuView->addAction(tr("Show Midi Tracks"));
+ showMidiOutPortId = menuView->addAction(tr("Show Midi Out Ports"));
+ showMidiInPortId = menuView->addAction(tr("Show Midi In Ports"));
+ showMidiChannelId = menuView->addAction(tr("Show Midi Channels"));
+
+ menuView->addSeparator();
+
+ showWaveTracksId = menuView->addAction(tr("Show Wave Tracks"));
+ showOutputTracksId = menuView->addAction(tr("Show Output Tracks"));
+ showGroupTracksId = menuView->addAction(tr("Show Group Tracks"));
+ showInputTracksId = menuView->addAction(tr("Show Input Tracks"));
+ showAuxTracksId = menuView->addAction(tr("Show Aux Tracks"));
+ showSyntiTracksId = menuView->addAction(tr("Show Synthesizer"));
+ connect(menuView, SIGNAL(triggered(QAction*)), SLOT(showTracksChanged(QAction*)));
+
+ showMidiTracksId->setCheckable(true);
+ showMidiInPortId->setCheckable(true);
+ showMidiOutPortId->setCheckable(true);
+ showMidiChannelId->setCheckable(true);
+ showWaveTracksId->setCheckable(true);
+ showOutputTracksId->setCheckable(true);
+ showGroupTracksId->setCheckable(true);
+ showInputTracksId->setCheckable(true);
+ showAuxTracksId->setCheckable(true);
+ showSyntiTracksId->setCheckable(true);
+
+ showMidiTracksId->setChecked(cfg->showMidiTracks);
+ showMidiInPortId->setChecked(cfg->showMidiInPorts);
+ showMidiOutPortId->setChecked(cfg->showMidiOutPorts);
+ showMidiChannelId->setChecked(cfg->showMidiChannels);
+ showWaveTracksId->setChecked(cfg->showWaveTracks);
+ showOutputTracksId->setChecked(cfg->showOutputTracks);
+ showGroupTracksId->setChecked(cfg->showGroupTracks);
+ showInputTracksId->setChecked(cfg->showInputTracks);
+ showAuxTracksId->setChecked(cfg->showAuxTracks);
+ showSyntiTracksId->setChecked(cfg->showSyntiTracks);
+
+ QScrollArea* view = new QScrollArea;
+ view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setCentralWidget(view);
+
+ central = new QWidget;
+ layout = new QHBoxLayout;
+ central->setLayout(layout);
+ layout->setSpacing(0);
+ layout->setMargin(0);
+ view->setWidget(central);
+ view->setWidgetResizable(true);
+
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(muse, SIGNAL(configChanged()), SLOT(configChanged()));
+ connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat()));
+ song->update(); // calls update mixer
+ }
+
+//---------------------------------------------------------
+// addStrip
+//---------------------------------------------------------
+
+void Mixer::addStrip(Track* t, int idx)
+ {
+ StripList::iterator si = stripList.begin();
+ for (int i = 0; i < idx; ++i) {
+ if (si != stripList.end())
+ ++si;
+ }
+ if (si != stripList.end() && (*si)->getTrack() == t)
+ return;
+
+ std::list<Strip*>::iterator nsi = si;
+ ++nsi;
+ if (si != stripList.end()
+ && nsi != stripList.end()
+ && (*nsi)->getTrack() == t) {
+ layout->removeWidget(*si);
+ delete *si;
+ stripList.erase(si);
+ }
+ else {
+ Strip* strip;
+ switch(t->type()) {
+ case Track::MIDI_IN:
+ strip = new MidiInPortStrip(this, (MidiInPort*)t, true);
+ break;
+ case Track::MIDI_OUT:
+ strip = new MidiOutPortStrip(this, (MidiOutPort*)t, true);
+ break;
+ case Track::MIDI_CHANNEL:
+ strip = new MidiChannelStrip(this, (MidiChannel*)t, true);
+ break;
+ case Track::MIDI:
+ strip = new MidiStrip(this, (MidiTrack*)t, true);
+ break;
+ case Track::MIDI_SYNTI:
+ strip = new MidiSyntiStrip(this, (MidiSynti*)t, true);
+ break;
+ default:
+ strip = new AudioStrip(this, (AudioTrack*)t, true);
+ break;
+ }
+ layout->insertWidget(idx, strip);
+ stripList.insert(si, strip);
+ strip->show();
+ }
+ }
+
+//---------------------------------------------------------
+// clear
+//---------------------------------------------------------
+
+void Mixer::clear()
+ {
+ QLayoutItem* i;
+ while ((i = layout->takeAt(0))) {
+ if (i->widget())
+ delete i->widget();
+ delete i;
+ }
+ stripList.clear();
+ oldAuxsSize = -1;
+ }
+
+//---------------------------------------------------------
+// updateMixer
+//---------------------------------------------------------
+
+void Mixer::updateMixer(int action)
+ {
+ int auxsSize = song->auxs()->size();
+ if (action == STRIP_REMOVED && auxsSize == oldAuxsSize) {
+ StripList::iterator si = stripList.begin();
+ for (; si != stripList.end();) {
+ Track* track = (*si)->getTrack();
+ StripList::iterator ssi = si;
+ ++si;
+ if (song->trackExists(track))
+ continue;
+ layout->removeWidget(*ssi);
+ delete *ssi;
+ stripList.erase(ssi);
+ }
+ int idx = stripList.size();
+ setMaximumWidth(STRIP_WIDTH * idx);
+ central->setFixedWidth(STRIP_WIDTH * idx);
+ if (idx < 4)
+ setMinimumWidth(idx * STRIP_WIDTH);
+ return;
+ }
+
+ clear();
+ oldAuxsSize = auxsSize;
+
+ int idx = 0;
+ //---------------------------------------------------
+ // generate Input Strips
+ //---------------------------------------------------
+
+ if (cfg->showInputTracks) {
+ InputList* itl = song->inputs();
+ for (iAudioInput i = itl->begin(); i != itl->end(); ++i)
+ addStrip(*i, idx++);
+ }
+
+ //---------------------------------------------------
+ // Synthesizer Strips
+ //---------------------------------------------------
+
+ if (cfg->showSyntiTracks) {
+ SynthIList* sl = song->syntis();
+ for (iSynthI i = sl->begin(); i != sl->end(); ++i)
+ addStrip(*i, idx++);
+ }
+
+ //---------------------------------------------------
+ // generate Wave Track Strips
+ //---------------------------------------------------
+
+ if (cfg->showWaveTracks) {
+ WaveTrackList* wtl = song->waves();
+ for (iWaveTrack i = wtl->begin(); i != wtl->end(); ++i)
+ addStrip(*i, idx++);
+ }
+
+ //---------------------------------------------------
+ // generate Midi strips
+ //---------------------------------------------------
+
+ if (cfg->showMidiInPorts) {
+ MidiInPortList* mpl = song->midiInPorts();
+ for (iMidiInPort i = mpl->begin(); i != mpl->end(); ++i)
+ addStrip(*i, idx++);
+ }
+
+ if (cfg->showMidiSyntiPorts) {
+ MidiSyntiList* mpl = song->midiSyntis();
+ for (iMidiSynti i = mpl->begin(); i != mpl->end(); ++i)
+ addStrip(*i, idx++);
+ }
+
+ if (cfg->showMidiTracks) {
+ MidiTrackList* mtl = song->midis();
+ for (iMidiTrack i = mtl->begin(); i != mtl->end(); ++i)
+ addStrip(*i, idx++);
+ }
+
+ if (cfg->showMidiChannels) {
+ MidiChannelList* mpl = song->midiChannel();
+ for (iMidiChannel i = mpl->begin(); i != mpl->end(); ++i) {
+ MidiChannel* mc = *i;
+ //
+ // show only if used
+ //
+ if (!mc->noInRoute())
+ addStrip(mc, idx++);
+ }
+ }
+ if (cfg->showMidiOutPorts) {
+ MidiOutPortList* mpl = song->midiOutPorts();
+ for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i)
+ addStrip(*i, idx++);
+ }
+
+ //---------------------------------------------------
+ // Groups
+ //---------------------------------------------------
+
+ if (cfg->showGroupTracks) {
+ GroupList* gtl = song->groups();
+ for (iAudioGroup i = gtl->begin(); i != gtl->end(); ++i)
+ addStrip(*i, idx++);
+ }
+
+ //---------------------------------------------------
+ // Aux
+ //---------------------------------------------------
+
+ if (cfg->showAuxTracks) {
+ AuxList* al = song->auxs();
+ for (iAudioAux i = al->begin(); i != al->end(); ++i)
+ addStrip(*i, idx++);
+ }
+
+ //---------------------------------------------------
+ // Master
+ //---------------------------------------------------
+
+ if (cfg->showOutputTracks) {
+ OutputList* otl = song->outputs();
+ for (iAudioOutput i = otl->begin(); i != otl->end(); ++i)
+ addStrip(*i, idx++);
+ }
+ setMaximumWidth(STRIP_WIDTH * idx);
+ central->setFixedWidth(STRIP_WIDTH * idx);
+ if (idx < 4)
+ setMinimumWidth(idx * STRIP_WIDTH);
+ layout->update();
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void Mixer::songChanged(int flags)
+ {
+ int action = NO_UPDATE;
+ if (flags == -1)
+ action = UPDATE_ALL;
+ else {
+ if (flags & SC_TRACK_REMOVED)
+ action |= STRIP_REMOVED;
+ if (flags & SC_TRACK_INSERTED)
+ action |= STRIP_INSERTED;
+ }
+ if (action != NO_UPDATE)
+ updateMixer(action);
+ }
+
+//---------------------------------------------------------
+// closeEvent
+//---------------------------------------------------------
+
+void Mixer::closeEvent(QCloseEvent* e)
+ {
+ emit closed();
+ e->accept();
+ }
+
+//---------------------------------------------------------
+// toggleRouteDialog
+//---------------------------------------------------------
+
+void Mixer::toggleRouteDialog()
+ {
+ showRouteDialog(routingAction->isChecked());
+ }
+
+//---------------------------------------------------------
+// showRouteDialog
+//---------------------------------------------------------
+
+void Mixer::showRouteDialog(bool on)
+ {
+ if (on && routingDialog == 0) {
+ routingDialog = new RouteDialog(this);
+ connect(routingDialog, SIGNAL(closed()), SLOT(routingDialogClosed()));
+ }
+ if (routingDialog)
+ routingDialog->setShown(on);
+ routingAction->setChecked(on);
+ }
+
+//---------------------------------------------------------
+// routingDialogClosed
+//---------------------------------------------------------
+
+void Mixer::routingDialogClosed()
+ {
+ routingAction->setChecked(false);
+ }
+
+//---------------------------------------------------------
+// showTracksChanged
+//---------------------------------------------------------
+
+void Mixer::showTracksChanged(QAction* id)
+ {
+ bool val = id->isChecked();
+ if (id == showMidiTracksId)
+ cfg->showMidiTracks = val;
+ else if (id == showOutputTracksId)
+ cfg->showOutputTracks = val;
+ else if (id == showWaveTracksId)
+ cfg->showWaveTracks = val;
+ else if (id == showGroupTracksId)
+ cfg->showGroupTracks = val;
+ else if (id == showInputTracksId)
+ cfg->showInputTracks = val;
+ else if (id == showAuxTracksId)
+ cfg->showAuxTracks = val;
+ else if (id == showSyntiTracksId)
+ cfg->showSyntiTracks = val;
+ else if (id == showMidiInPortId)
+ cfg->showMidiInPorts = val;
+ else if (id == showMidiOutPortId)
+ cfg->showMidiOutPorts = val;
+ else if (id == showMidiChannelId)
+ cfg->showMidiChannels = val;
+ updateMixer(UPDATE_ALL);
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void Mixer::write(Xml& xml, const char* name)
+ {
+ xml.tag("%s", name);
+ xml.qrectTag("geometry", geometry());
+ xml.intTag("showMidiTracks", cfg->showMidiTracks);
+ xml.intTag("showOutputTracks", cfg->showOutputTracks);
+ xml.intTag("showWaveTracks", cfg->showWaveTracks);
+ xml.intTag("showGroupTracks", cfg->showGroupTracks);
+ xml.intTag("showInputTracks", cfg->showInputTracks);
+ xml.intTag("showAuxTracks", cfg->showAuxTracks);
+ xml.intTag("showSyntiTracks", cfg->showSyntiTracks);
+ xml.intTag("showMidiInPorts", cfg->showMidiInPorts);
+ xml.intTag("showMidiOutPorts", cfg->showMidiOutPorts);
+ xml.intTag("showMidiChannels", cfg->showMidiChannels);
+ xml.etag("%s", name);
+ }
+
+//---------------------------------------------------------
+// heartBeat
+//---------------------------------------------------------
+
+void Mixer::heartBeat()
+ {
+ if (mustUpdateMixer) {
+ updateMixer(STRIP_INSERTED | STRIP_REMOVED);
+ mustUpdateMixer = false;
+ }
+ }
+
diff --git a/muse/muse/mixer/mixer.h b/muse/muse/mixer/mixer.h
new file mode 100644
index 00000000..3d063bba
--- /dev/null
+++ b/muse/muse/mixer/mixer.h
@@ -0,0 +1,86 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mixer.h,v 1.9 2006/01/12 14:49:13 wschweer Exp $
+//
+// (C) Copyright 2000-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __AMIXER_H__
+#define __AMIXER_H__
+
+#include "gconfig.h"
+
+class Meter;
+class Track;
+class Slider;
+class Knob;
+class RouteDialog;
+class Strip;
+
+typedef std::list<Strip*> StripList;
+
+//---------------------------------------------------------
+// Mixer
+//---------------------------------------------------------
+
+class Mixer : public QMainWindow {
+ Q_OBJECT
+
+ MixerConfig* cfg;
+ StripList stripList;
+ QWidget* central;
+ QHBoxLayout* lbox;
+ Strip* master;
+ QHBoxLayout* layout;
+ QMenu* menuView;
+ RouteDialog* routingDialog;
+ QAction* routingAction;
+
+ QAction* routingId;
+ QAction* showMidiTracksId;
+ QAction* showMidiInPortId;
+ QAction* showMidiOutPortId;
+ QAction* showMidiChannelId;
+ QAction* showOutputTracksId;
+ QAction* showWaveTracksId;
+ QAction* showGroupTracksId;
+ QAction* showInputTracksId;
+ QAction* showAuxTracksId;
+ QAction* showSyntiTracksId;
+
+ int oldAuxsSize;
+ bool mustUpdateMixer;
+
+ virtual void closeEvent(QCloseEvent*);
+ void addStrip(Track*, int);
+ void showRouteDialog(bool);
+
+ enum {
+ NO_UPDATE = 0,
+ STRIP_INSERTED = 1,
+ STRIP_REMOVED = 2,
+ UPDATE_ALL = 4
+ };
+ void updateMixer(int);
+
+ signals:
+ void closed();
+
+ private slots:
+ void songChanged(int);
+ void configChanged() { songChanged(-1); }
+ void toggleRouteDialog();
+ void routingDialogClosed();
+ void showTracksChanged(QAction*);
+ void heartBeat();
+
+ public:
+ Mixer(QWidget* parent, MixerConfig*);
+ void clear();
+ void write(Xml&, const char* name);
+ void setUpdateMixer() { mustUpdateMixer = true; }
+ };
+
+#endif
+
diff --git a/muse/muse/mixer/mstrip.cpp b/muse/muse/mixer/mstrip.cpp
new file mode 100644
index 00000000..ef330b57
--- /dev/null
+++ b/muse/muse/mixer/mstrip.cpp
@@ -0,0 +1,1700 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mstrip.cpp,v 1.70 2006/01/12 14:49:13 wschweer Exp $
+//
+// (C) Copyright 2000-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "midictrl.h"
+#include "mstrip.h"
+#include "audio.h"
+#include "song.h"
+#include "mixer.h"
+#include "widgets/simplebutton.h"
+#include "widgets/utils.h"
+#include "driver/alsamidi.h"
+#include "synth.h"
+#include "midirack.h"
+#include "midiplugin.h"
+
+#include "awl/midimslider.h"
+#include "awl/midimeter.h"
+#include "awl/midivolentry.h"
+#include "awl/midipanentry.h"
+#include "awl/midipanknob.h"
+#include "awl/knob.h"
+
+enum { KNOB_PAN, KNOB_CHOR_SEND, KNOB_VAR_SEND, KNOB_REV_SEND };
+
+//---------------------------------------------------------
+// addKnob
+//---------------------------------------------------------
+
+void MidiChannelStrip::addKnob(int ctrl, int idx, const QString& tt, const QString& label,
+ const char* slot, bool enabled)
+ {
+ Awl::FloatEntry* dl;
+ Awl::Knob* knob;
+
+ if (idx == KNOB_PAN) {
+ dl = new Awl::MidiPanEntry(this);
+ knob = new Awl::MidiPanKnob(this);
+ }
+ else {
+ dl = new Awl::MidiVolEntry(this);
+ knob = new Awl::Knob(this);
+ knob->setRange(0.0, 127.0);
+ }
+ knob->setId(ctrl);
+ dl->setId(ctrl);
+
+ controller[idx].knob = knob;
+ knob->setFixedSize(buttonSize.width(), entrySize.height() * 2);
+ knob->setToolTip(tt);
+ knob->setEnabled(enabled);
+
+ controller[idx].dl = dl;
+ dl->setFont(*config.fonts[1]);
+ dl->setFixedSize(entrySize);
+ dl->setEnabled(enabled);
+
+ QLabel* lb = new QLabel(label, this);
+ controller[idx].lb = lb;
+ lb->setFont(*config.fonts[1]);
+ lb->setFixedSize(entrySize);
+ lb->setAlignment(Qt::AlignCenter);
+ lb->setEnabled(enabled);
+
+ QGridLayout* grid = new QGridLayout;
+ grid->setMargin(0);
+ grid->setSpacing(0);
+ grid->addWidget(lb, 0, 0);
+ grid->addWidget(dl, 1, 0);
+ grid->addWidget(knob, 0, 1, 2, 1);
+ layout->addLayout(grid);
+
+ connect(knob, SIGNAL(valueChanged(float,int)), slot);
+ connect(dl, SIGNAL(valueChanged(float,int)), slot);
+ connect(knob, SIGNAL(sliderPressed(int)), SLOT(sliderPressed(int)));
+ connect(knob, SIGNAL(sliderReleased(int)), SLOT(sliderReleased(int)));
+ }
+
+//---------------------------------------------------------
+// MidiChannelStrip
+//---------------------------------------------------------
+
+MidiChannelStrip::MidiChannelStrip(Mixer* m, MidiChannel* t, bool align)
+ : Strip(m, t, align)
+ {
+ volumeTouched = false;
+ panTouched = false;
+ reverbSendTouched = false;
+ variSendTouched = false;
+ chorusSendTouched = false;
+
+ addKnob(CTRL_VARIATION_SEND, KNOB_VAR_SEND, tr("VariationSend"), tr("Var"), SLOT(ctrlChanged(float,int)), true);
+ addKnob(CTRL_REVERB_SEND, KNOB_REV_SEND, tr("ReverbSend"), tr("Rev"), SLOT(ctrlChanged(float,int)), true);
+ addKnob(CTRL_CHORUS_SEND, KNOB_CHOR_SEND, tr("ChorusSend"), tr("Cho"), SLOT(ctrlChanged(float,int)), true);
+
+ int auxsSize = song->auxs()->size();
+ if (auxsSize)
+ layout->addSpacing((STRIP_WIDTH/2 + 1) * auxsSize);
+
+ //---------------------------------------------------
+ // slider, label, meter
+ //---------------------------------------------------
+
+ slider = new Awl::MidiMeterSlider(this);
+ slider->setId(CTRL_VOLUME);
+ slider->setFixedWidth(40);
+ layout->addWidget(slider, 100, Qt::AlignRight);
+
+ sl = new Awl::MidiVolEntry(this);
+ sl->setId(CTRL_VOLUME);
+ sl->setFont(*config.fonts[1]);
+
+ connect(slider, SIGNAL(valueChanged(float,int)), SLOT(ctrlChanged(float, int)));
+ connect(slider, SIGNAL(sliderPressed(int)), SLOT(sliderPressed(int)));
+ connect(slider, SIGNAL(sliderReleased(int)), SLOT(sliderReleased(int)));
+ connect(sl, SIGNAL(valueChanged(float,int)), SLOT(ctrlChanged(float, int)));
+ layout->addWidget(sl);
+
+ //---------------------------------------------------
+ // pan, balance
+ //---------------------------------------------------
+
+ addKnob(CTRL_PANPOT, KNOB_PAN, tr("Pan/Balance"), tr("Pan"), SLOT(ctrlChanged(float,int)), true);
+
+ //---------------------------------------------------
+ // --- record
+ // mute, solo
+ //---------------------------------------------------
+
+ if (_align)
+ layout->addSpacing(STRIP_WIDTH/3);
+
+ mute = newMuteButton(this);
+ mute->setChecked(track->isMute());
+ mute->setFixedSize(buttonSize);
+ connect(mute, SIGNAL(clicked(bool)), SLOT(muteToggled(bool)));
+
+ solo = newSoloButton(this);
+ solo->setFixedSize(buttonSize);
+ solo->setChecked(track->solo());
+ connect(solo, SIGNAL(clicked(bool)), SLOT(soloToggled(bool)));
+
+ QHBoxLayout* smBox2 = new QHBoxLayout(0);
+
+ smBox2->addWidget(mute);
+ smBox2->addWidget(solo);
+
+ layout->addLayout(smBox2);
+
+ //---------------------------------------------------
+ // automation mode
+ //---------------------------------------------------
+
+ addAutomationButtons();
+
+ //---------------------------------------------------
+ // routing
+ //---------------------------------------------------
+
+ QHBoxLayout* rBox = new QHBoxLayout(0);
+ iR = new QToolButton(this);
+ iR->setCheckable(false);
+ iR->setFont(*config.fonts[1]);
+ iR->setFixedWidth((STRIP_WIDTH-4)/2);
+ iR->setText(tr("iR"));
+ iR->setToolTip(tr("input routing"));
+ rBox->addWidget(iR);
+ connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed()));
+ rBox->addStretch(100);
+ layout->addLayout(rBox);
+
+ connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat()));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(track, SIGNAL(muteChanged(bool)), mute, SLOT(setChecked(bool)));
+ connect(track, SIGNAL(soloChanged(bool)), solo, SLOT(setChecked(bool)));
+ connect(track, SIGNAL(autoReadChanged(bool)), SLOT(autoChanged()));
+ connect(track, SIGNAL(autoWriteChanged(bool)), SLOT(autoChanged()));
+ connect(track, SIGNAL(controllerChanged(int)), SLOT(controllerChanged(int)));
+ autoChanged();
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void MidiChannelStrip::songChanged(int val)
+ {
+ if (val & SC_TRACK_MODIFIED)
+ updateLabel();
+ }
+
+//---------------------------------------------------------
+// heartBeat
+//---------------------------------------------------------
+
+void MidiChannelStrip::heartBeat()
+ {
+ float a = track->meter(0); // fast_log10(track->meter(0)) * .2f;
+ slider->setMeterVal(a * 0.008);
+ track->setMeter(0, a * 0.8); // hack
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void MidiChannelStrip::controllerChanged(int id)
+ {
+ float val = float(track->ctrlVal(id).i);
+
+ switch (id) {
+ case CTRL_VOLUME:
+ if (!volumeTouched)
+ slider->setValue(val);
+ sl->setValue(val);
+ break;
+ case CTRL_PANPOT:
+ if (!panTouched)
+ controller[KNOB_PAN].knob->setValue(val);
+ controller[KNOB_PAN].dl->setValue(val);
+ break;
+ case CTRL_VARIATION_SEND:
+ if (!variSendTouched)
+ controller[KNOB_VAR_SEND].knob->setValue(val);
+ controller[KNOB_VAR_SEND].dl->setValue(val);
+ break;
+ case CTRL_REVERB_SEND:
+ if (!reverbSendTouched)
+ controller[KNOB_REV_SEND].knob->setValue(val);
+ controller[KNOB_REV_SEND].dl->setValue(val);
+ break;
+ case CTRL_CHORUS_SEND:
+ if (!chorusSendTouched)
+ controller[KNOB_CHOR_SEND].knob->setValue(val);
+ controller[KNOB_CHOR_SEND].dl->setValue(val);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// ctrlChanged
+// called when user changes controller
+//---------------------------------------------------------
+
+void MidiChannelStrip::ctrlChanged(float val, int num)
+ {
+ int ival = int(val);
+ CVal cval;
+ cval.i = ival;
+ song->setControllerVal(track, num, cval);
+ }
+
+//---------------------------------------------------------
+// sliderPressed
+//---------------------------------------------------------
+
+void MidiChannelStrip::sliderPressed(int id)
+ {
+ switch (id) {
+ case CTRL_VOLUME: volumeTouched = true; break;
+ case CTRL_PANPOT: panTouched = true; break;
+ case CTRL_VARIATION_SEND: variSendTouched = true; break;
+ case CTRL_REVERB_SEND: reverbSendTouched = true; break;
+ case CTRL_CHORUS_SEND: chorusSendTouched = true; break;
+ }
+ track->startAutoRecord(id);
+ }
+
+//---------------------------------------------------------
+// sliderReleased
+//---------------------------------------------------------
+
+void MidiChannelStrip::sliderReleased(int id)
+ {
+ switch (id) {
+ case CTRL_VOLUME: volumeTouched = false; break;
+ case CTRL_PANPOT: panTouched = false; break;
+ case CTRL_VARIATION_SEND: variSendTouched = false; break;
+ case CTRL_REVERB_SEND: reverbSendTouched = false; break;
+ case CTRL_CHORUS_SEND: chorusSendTouched = false; break;
+ }
+ track->stopAutoRecord(id);
+ }
+
+//---------------------------------------------------------
+// muteToggled
+//---------------------------------------------------------
+
+void MidiChannelStrip::muteToggled(bool val)
+ {
+ song->setMute(track, val);
+ }
+
+//---------------------------------------------------------
+// soloToggled
+//---------------------------------------------------------
+
+void MidiChannelStrip::soloToggled(bool val)
+ {
+ song->setSolo(track, val);
+ }
+
+//---------------------------------------------------------
+// autoChanged
+//---------------------------------------------------------
+
+void MidiChannelStrip::autoChanged()
+ {
+ bool ar = track->autoRead();
+ bool aw = track->autoWrite();
+
+ // controller are enabled if
+ // autoRead is off
+ // autoRead and autoWrite are on (touch mode)
+
+ bool ec = !ar || (ar && aw);
+ for (unsigned i = 0; i < sizeof(controller)/sizeof(*controller); ++i) {
+ controller[i].knob->setEnabled(ec);
+ controller[i].dl->setEnabled(ec);
+ }
+ slider->setEnabled(ec);
+ sl->setEnabled(ec);
+ }
+
+//---------------------------------------------------------
+// autoReadToggled
+//---------------------------------------------------------
+
+void MidiChannelStrip::autoReadToggled(bool val)
+ {
+ song->setAutoRead(track, val);
+ }
+
+//---------------------------------------------------------
+// autoWriteToggled
+//---------------------------------------------------------
+
+void MidiChannelStrip::autoWriteToggled(bool val)
+ {
+ song->setAutoWrite(track, val);
+ }
+
+//---------------------------------------------------------
+// iRoutePressed
+//---------------------------------------------------------
+
+void MidiChannelStrip::iRoutePressed()
+ {
+ QMenu* pup = new QMenu(iR);
+ pup->addSeparator()->setText(tr("Tracks"));
+
+ MidiChannel* t = (MidiChannel*)track;
+ RouteList* irl = t->inRoutes();
+
+ MidiTrackList* tl = song->midis();
+ int tn = 0;
+ for (iMidiTrack i = tl->begin();i != tl->end(); ++i, ++tn) {
+ QAction* id = pup->addAction((*i)->name());
+ id->setData(QVariant(0));
+ Route dst(*i, -1, Route::TRACK);
+ for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) {
+ if (*ir == dst) {
+ id->setData(QVariant(1));
+ id->setCheckable(true);
+ id->setChecked(true);
+ break;
+ }
+ }
+ }
+
+ QAction* n = pup->exec(QCursor::pos());
+ if (n) {//if (n != -1) {
+ int was_checked = n->data().toInt(); // isChecked appears to always give false, storing in QVariant instead
+ QString s(n->text());
+ Route dstRoute(t, -1, Route::TRACK);
+ Route srcRoute(s, -1, Route::TRACK);
+
+
+ if (was_checked == 1) {
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ }
+ else {
+ audio->msgAddRoute(srcRoute, dstRoute);
+ }
+ song->update(SC_ROUTE);
+ }
+ delete pup;
+ iR->setDown(false); // pup->exec() catches mouse release event
+ }
+
+//---------------------------------------------------------
+// MidiStrip
+//---------------------------------------------------------
+
+MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align)
+ : Strip(m, t, align)
+ {
+ int auxsSize = song->auxs()->size();
+ if (_align)
+ layout->addSpacing((STRIP_WIDTH/2 + 1) * auxsSize + STRIP_WIDTH/2 * 3);
+
+ //---------------------------------------------------
+ // slider, label, meter
+ //---------------------------------------------------
+
+ meter = new Awl::MidiMeter(this);
+ meter->setId(CTRL_VOLUME);
+ meter->setFixedWidth(40);
+ layout->addWidget(meter, 100, Qt::AlignRight);
+
+ if (_align)
+ layout->addSpacing(LABEL_HEIGHT);
+
+ //---------------------------------------------------
+ // pan, balance
+ //---------------------------------------------------
+
+ if (_align)
+ layout->addSpacing(STRIP_WIDTH/2 + 1);
+
+ //---------------------------------------------------
+ // mute, solo
+ // or
+ // record, mixdownfile
+ //---------------------------------------------------
+
+ SimpleButton* record = newRecordButton(this);
+ record->setFixedSize(buttonSize);
+ record->setChecked(track->recordFlag());
+ connect(record, SIGNAL(clicked(bool)), SLOT(recordToggled(bool)));
+ connect(t, SIGNAL(recordChanged(bool)), record, SLOT(setChecked(bool)));
+
+ mute = newMuteButton(this);
+ mute->setChecked(track->isMute());
+ mute->setFixedSize(buttonSize);
+ connect(mute, SIGNAL(clicked(bool)), SLOT(muteToggled(bool)));
+
+ solo = newSoloButton(this);
+ solo->setFixedSize(buttonSize);
+ solo->setChecked(track->solo());
+ connect(solo, SIGNAL(clicked(bool)), SLOT(soloToggled(bool)));
+
+ QHBoxLayout* smBox1 = new QHBoxLayout(0);
+ QHBoxLayout* smBox2 = new QHBoxLayout(0);
+
+ smBox2->addWidget(mute);
+ smBox2->addWidget(solo);
+
+ smBox1->addStretch(100);
+ smBox1->addWidget(record);
+ layout->addLayout(smBox1);
+ layout->addLayout(smBox2);
+
+ //---------------------------------------------------
+ // automation mode
+ //---------------------------------------------------
+
+ if (_align)
+ layout->addSpacing(STRIP_WIDTH/3);
+
+ //---------------------------------------------------
+ // routing
+ //---------------------------------------------------
+
+ QHBoxLayout* rBox = new QHBoxLayout(0);
+ iR = new QToolButton(this);
+ iR->setFont(*config.fonts[1]);
+ iR->setFixedWidth((STRIP_WIDTH-4)/2);
+ iR->setText(tr("iR"));
+ iR->setCheckable(false);
+ iR->setToolTip(tr("input routing"));
+ rBox->addWidget(iR);
+ connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed()));
+
+ oR = new QToolButton(this);
+ oR->setFont(*config.fonts[1]);
+ oR->setFixedWidth((STRIP_WIDTH-4)/2);
+ oR->setText(tr("oR"));
+ oR->setCheckable(false);
+ oR->setToolTip(tr("output routing"));
+ rBox->addWidget(oR);
+ connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed()));
+
+ layout->addLayout(rBox);
+
+ connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat()));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(track, SIGNAL(muteChanged(bool)), mute, SLOT(setChecked(bool)));
+ connect(track, SIGNAL(soloChanged(bool)), solo, SLOT(setChecked(bool)));
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void MidiStrip::songChanged(int val)
+ {
+ if (val & SC_TRACK_MODIFIED)
+ updateLabel();
+ }
+
+//---------------------------------------------------------
+// heartBeat
+//---------------------------------------------------------
+
+void MidiStrip::heartBeat()
+ {
+ float a = track->meter(0); // fast_log10(track->meter(0)) * .2f;
+ meter->setMeterVal(a * 0.008);
+ track->setMeter(0, a * 0.8); // hack
+ }
+
+//---------------------------------------------------------
+// muteToggled
+//---------------------------------------------------------
+
+void MidiStrip::muteToggled(bool val)
+ {
+ song->setMute(track, val);
+ }
+
+//---------------------------------------------------------
+// soloToggled
+//---------------------------------------------------------
+
+void MidiStrip::soloToggled(bool val)
+ {
+ song->setSolo(track, val);
+ }
+
+//---------------------------------------------------------
+// recordToggled
+//---------------------------------------------------------
+
+void MidiStrip::recordToggled(bool val)
+ {
+ song->setRecordFlag(track, !val);
+ }
+
+//---------------------------------------------------------
+// iRoutePressed
+//---------------------------------------------------------
+
+void MidiStrip::iRoutePressed()
+ {
+ QMenu* pup = new QMenu(oR);
+ pup->addSeparator()->setText(tr("Input Ports"));
+ MidiOutPort* t = (MidiOutPort*)track;
+ RouteList* irl = t->inRoutes();
+
+ MidiInPortList* ipl = song->midiInPorts();
+ int tn = 0;
+ for (iMidiInPort i = ipl->begin(); i != ipl->end(); ++i, ++tn) {
+ QMenu* m = pup->addMenu((*i)->name());
+ m->addSeparator()->setText(tr("Channel"));
+ QAction* all_action = m->addAction(tr("All"));
+ QMap<QString, QVariant> map;
+ map["was_checked"] = false;
+ map["id"] = tn * 32 + MIDI_CHANNELS;
+ all_action->setData(map);
+
+ for (int channel = 0; channel < MIDI_CHANNELS; ++channel) {
+ QString s;
+ s.setNum(channel+1);
+ QAction* channel_action = m->addAction(s);
+ QMap<QString, QVariant> cmap;
+ cmap["was_checked"] = false;
+ cmap["id"] = tn * 32 + channel; // trackno + channel as id
+ channel_action->setData(cmap);
+ Route src(*i, channel, Route::TRACK);
+ for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) {
+ if (*ir == src) {
+ cmap["was_checked"] = true;
+ channel_action->setData(cmap);
+ channel_action->setCheckable(true);
+ channel_action->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+ QAction* n = pup->exec(QCursor::pos());
+ if (n) {
+ QMap<QString, QVariant> data = n->data().toMap();
+ int trackid = data["id"].toInt();
+ int was_checked = data["was_checked"].toInt();
+ int port = trackid >> 5;
+ int channel = trackid & 0x1f;
+
+ MidiInPort* mip = ipl->index(port);
+ if (channel == MIDI_CHANNELS) {
+ for (channel = 0; channel < MIDI_CHANNELS; ++channel) {
+ Route srcRoute(mip, channel, Route::TRACK);
+ Route dstRoute(track, channel, Route::TRACK);
+ audio->msgAddRoute(srcRoute, dstRoute);
+ }
+ }
+ else {
+ Route srcRoute(mip, channel, Route::TRACK);
+ Route dstRoute(track, channel, Route::TRACK);
+
+ if (was_checked == 1)
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ else
+ audio->msgAddRoute(srcRoute, dstRoute);
+ }
+ song->update(SC_ROUTE);
+ }
+ delete pup;
+ iR->setDown(false); // pup->exec() catches mouse release event
+ }
+
+//---------------------------------------------------------
+// oRoutePressed
+//---------------------------------------------------------
+
+void MidiStrip::oRoutePressed()
+ {
+ QMenu* pup = new QMenu(oR);
+ pup->addSeparator()->setText(tr("OutputPorts"));
+ RouteList* orl = track->outRoutes();
+
+ MidiOutPortList* mpl = song->midiOutPorts();
+ int pn = 0;
+ for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i, ++pn) {
+ MidiOutPort* op = *i;
+ QMenu* m = pup->addMenu(op->name());
+ m->addSeparator()->setText(tr("Channel"));
+ for (int channel = 0; channel < MIDI_CHANNELS; ++channel) {
+ QString s;
+ s.setNum(channel+1);
+ QMap<QString, QVariant> data;
+ QAction* action = m->addAction(s); //int id = m->insertItem(s, pn * 16 + channel);
+ data["was_checked"] = false;
+ data["trackid"] = pn * 16 + channel;
+ action->setData(data);
+
+ MidiChannel* mc = op->channel(channel);
+ Route r(mc, -1, Route::TRACK);
+ for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
+ if (r == *ir) {
+ action->setCheckable(true);
+ action->setChecked(true);
+ data["was_checked"] = true;
+ action->setData(data);
+ break;
+ }
+ }
+ }
+ }
+ QAction* n = pup->exec(QCursor::pos());
+ if (n) {
+ QMap<QString, QVariant> data = n->data().toMap();
+ int trackid = data["trackid"].toInt();
+ int was_checked = data["was_checked"].toInt();
+ int portno = trackid >> 4;
+ int channel = trackid & 0xf;
+ MidiOutPort* mp = mpl->index(portno);
+ MidiChannel* mc = mp->channel(channel);
+ Route srcRoute(track, -1, Route::TRACK);
+ Route dstRoute(mc, -1, Route::TRACK);
+
+ if (was_checked == 1)
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ else
+ audio->msgAddRoute(srcRoute, dstRoute);
+
+ song->update(SC_ROUTE);
+ }
+ delete pup;
+ oR->setDown(false); // pup->exec() catches mouse release event
+ }
+
+//---------------------------------------------------------
+// MidiOutPortStrip
+//---------------------------------------------------------
+
+MidiOutPortStrip::MidiOutPortStrip(Mixer* m, MidiOutPort* t, bool align)
+ : Strip(m, t, align)
+ {
+ int auxsSize = song->auxs()->size();
+ if (_align)
+ layout->addSpacing((STRIP_WIDTH/2 + 1) * auxsSize + STRIP_WIDTH/2 * 3);
+
+ volumeTouched = false;
+
+ //---------------------------------------------------
+ // slider, label, meter
+ //---------------------------------------------------
+
+ slider = new Awl::MidiMeterSlider(this);
+ slider->setId(CTRL_MASTER_VOLUME);
+ slider->setRange(0.0, 1024*16.0);
+ slider->setFixedWidth(40);
+ layout->addWidget(slider, 100, Qt::AlignRight);
+
+ sl = new Awl::MidiVolEntry(this);
+ sl->setId(CTRL_MASTER_VOLUME);
+ sl->setMax(128 * 128 - 1);
+ sl->setFont(*config.fonts[1]);
+
+ controllerChanged(CTRL_MASTER_VOLUME);
+
+ connect(slider, SIGNAL(valueChanged(float,int)), SLOT(ctrlChanged(float, int)));
+ connect(slider, SIGNAL(sliderPressed(int)), SLOT(sliderPressed(int)));
+ connect(slider, SIGNAL(sliderReleased(int)), SLOT(sliderReleased(int)));
+ connect(sl, SIGNAL(valueChanged(float,int)), SLOT(ctrlChanged(float, int)));
+ layout->addWidget(sl);
+
+ //---------------------------------------------------
+ // pan, balance
+ //---------------------------------------------------
+
+ if (_align)
+ layout->addSpacing(entrySize.height() * 2);
+
+ //---------------------------------------------------
+ // sync
+ // mute, solo
+ //---------------------------------------------------
+
+ sync = newSyncButton(this);
+ sync->setFixedHeight(buttonSize.height());
+ sync->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ sync->setChecked(((MidiOutPort*)track)->sendSync());
+ layout->addWidget(sync);
+ connect(sync, SIGNAL(clicked(bool)), SLOT(syncToggled(bool)));
+ connect(track, SIGNAL(sendSyncChanged(bool)), sync, SLOT(setChecked(bool)));
+
+ mute = newMuteButton(this);
+ mute->setChecked(track->isMute());
+ mute->setFixedSize(buttonSize);
+ connect(mute, SIGNAL(clicked(bool)), SLOT(muteToggled(bool)));
+
+ solo = newSoloButton(this);
+ solo->setFixedSize(buttonSize);
+ solo->setChecked(track->solo());
+ connect(solo, SIGNAL(clicked(bool)), SLOT(soloToggled(bool)));
+
+ QHBoxLayout* smBox2 = new QHBoxLayout(0);
+
+ smBox2->addWidget(mute);
+ smBox2->addWidget(solo);
+
+ layout->addLayout(smBox2);
+
+ //---------------------------------------------------
+ // automation mode
+ //---------------------------------------------------
+
+ addAutomationButtons();
+
+ //---------------------------------------------------
+ // output routing
+ //---------------------------------------------------
+
+ QHBoxLayout* rBox = new QHBoxLayout(0);
+ rBox->addStretch(100);
+
+ oR = new QToolButton(this);
+ oR->setFont(*config.fonts[1]);
+ oR->setFixedWidth((STRIP_WIDTH-4)/2);
+ oR->setText(tr("oR"));
+ oR->setCheckable(false);
+ oR->setToolTip(tr("output routing"));
+ rBox->addWidget(oR);
+ connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed()));
+
+ layout->addLayout(rBox);
+
+ connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat()));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(track, SIGNAL(muteChanged(bool)), mute, SLOT(setChecked(bool)));
+ connect(track, SIGNAL(soloChanged(bool)), solo, SLOT(setChecked(bool)));
+ connect(track, SIGNAL(autoReadChanged(bool)), SLOT(autoChanged()));
+ connect(track, SIGNAL(autoWriteChanged(bool)), SLOT(autoChanged()));
+ autoChanged();
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void MidiOutPortStrip::songChanged(int val)
+ {
+ if (val & SC_TRACK_MODIFIED)
+ updateLabel();
+ }
+
+//---------------------------------------------------------
+// heartBeat
+//---------------------------------------------------------
+
+void MidiOutPortStrip::heartBeat()
+ {
+ float a = track->meter(0); // fast_log10(track->meter(0)) * .2f;
+ slider->setMeterVal(a * 0.008);
+ track->setMeter(0, a * 0.8); // hack
+ }
+
+//---------------------------------------------------------
+// ctrlChanged
+//---------------------------------------------------------
+
+void MidiOutPortStrip::ctrlChanged(float val, int num)
+ {
+ int ival = int(val);
+ CVal cval;
+ cval.i = ival;
+ song->setControllerVal(track, num, cval);
+ }
+
+//---------------------------------------------------------
+// sliderPressed
+//---------------------------------------------------------
+
+void MidiOutPortStrip::sliderPressed(int id)
+ {
+ switch (id) {
+ case CTRL_MASTER_VOLUME: volumeTouched = true; break;
+ }
+ track->startAutoRecord(id);
+ }
+
+//---------------------------------------------------------
+// sliderReleased
+//---------------------------------------------------------
+
+void MidiOutPortStrip::sliderReleased(int id)
+ {
+ switch (id) {
+ case CTRL_MASTER_VOLUME: volumeTouched = false; break;
+ }
+ track->stopAutoRecord(id);
+ }
+
+//---------------------------------------------------------
+// muteToggled
+//---------------------------------------------------------
+
+void MidiOutPortStrip::muteToggled(bool val)
+ {
+ song->setMute(track, val);
+ }
+
+//---------------------------------------------------------
+// soloToggled
+//---------------------------------------------------------
+
+void MidiOutPortStrip::soloToggled(bool val)
+ {
+ song->setSolo(track, val);
+ }
+
+//---------------------------------------------------------
+// autoChanged
+//---------------------------------------------------------
+
+void MidiOutPortStrip::autoChanged()
+ {
+ bool ar = track->autoRead();
+ bool aw = track->autoWrite();
+
+ // controller are enabled if
+ // autoRead is off
+ // autoRead and autoWrite are on (touch mode)
+
+ bool ec = !ar || (ar && aw);
+ slider->setEnabled(ec);
+ sl->setEnabled(ec);
+ }
+
+//---------------------------------------------------------
+// autoReadToggled
+//---------------------------------------------------------
+
+void MidiOutPortStrip::autoReadToggled(bool val)
+ {
+ song->setAutoRead(track, val);
+ }
+
+//---------------------------------------------------------
+// autoWriteToggled
+//---------------------------------------------------------
+
+void MidiOutPortStrip::autoWriteToggled(bool val)
+ {
+ song->setAutoWrite(track, val);
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void MidiOutPortStrip::controllerChanged(int id)
+ {
+ if (id == CTRL_MASTER_VOLUME) {
+ float val = float(track->ctrlVal(id).i);
+ if (!volumeTouched)
+ slider->setValue(val);
+ sl->setValue(val);
+ }
+ }
+
+//---------------------------------------------------------
+// oRoutePressed
+//---------------------------------------------------------
+
+void MidiOutPortStrip::oRoutePressed()
+ {
+ QMenu* pup = new QMenu(oR);
+ pup->addSeparator()->setText(tr("MidiDevices"));
+ RouteList* orl = track->outRoutes();
+
+ std::list<PortName>* ol = midiDriver->outputPorts();
+ int idx = 0;
+ for (std::list<PortName>::iterator ip = ol->begin(); ip != ol->end(); ++ip, ++idx) {
+ QAction* oa = pup->addAction(ip->name);
+
+ QMap<QString, QVariant> data;
+ data["was_checked"] = false;
+ data["id"] = idx;
+ oa->setData(data);
+
+ Port port = ip->port;
+ Route dst(port, Route::MIDIPORT);
+ for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
+ if (*ir == dst) {
+ oa->setCheckable(true);
+ oa->setChecked(true);
+ data["was_checked"] = true;
+ oa->setData(data);
+ break;
+ }
+ }
+ }
+
+ //
+ // add software synthesizer to list
+ //
+ idx = 1000;
+ SynthIList* sl = song->syntis();
+ for (iSynthI i = sl->begin(); i != sl->end(); ++i, ++idx) {
+ //int id = pup->insertItem((*i)->name(), idx);
+ QAction* oa = pup->addAction((*i)->name());
+
+ QMap<QString, QVariant> data;
+ data["was_checked"] = false;
+ data["id"] = idx;
+ oa->setData(data);
+
+ Route dst(*i, Route::SYNTIPORT);
+ for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
+ if (*ir == dst) {
+ oa->setCheckable(true);
+ oa->setChecked(true);
+ data["was_checked"] = true;
+ oa->setData(data);
+ break;
+ }
+ }
+ }
+
+ QAction* action = pup->exec(QCursor::pos());
+ if (action) {
+ QString s(action->text()); //(pup->text(n));
+ int n = action->data().toMap()["id"].toInt();
+ int was_checked = action->data().toMap()["was_checked"].toInt();
+
+ Route srcRoute(track, -1, Route::TRACK);
+ if (n < 1000) {
+ int idx = 0;
+ std::list<PortName>::iterator ip;
+ for (ip = ol->begin(); ip != ol->end(); ++ip, ++idx) {
+ if (idx == n)
+ break;
+ }
+ Port port = ip->port;
+ Route dstRoute(port, Route::MIDIPORT);
+ if (was_checked)
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ else
+ audio->msgAddRoute(srcRoute, dstRoute);
+ }
+ else {
+ for (iSynthI i = sl->begin(); i != sl->end(); ++i) {
+ if ((*i)->name() == s) {
+ Route dstRoute(*i, Route::SYNTIPORT);
+ if (was_checked)
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ else
+ audio->msgAddRoute(srcRoute, dstRoute);
+ break;
+ }
+ }
+ }
+ song->update(SC_ROUTE);
+ }
+ delete pup;
+ delete ol;
+ oR->setDown(false); // pup->exec() catches mouse release event
+ }
+
+//---------------------------------------------------------
+// syncToggled
+//---------------------------------------------------------
+
+void MidiOutPortStrip::syncToggled(bool val) const
+ {
+ ((MidiOutPort*)track)->setSendSync(val);
+ }
+
+//---------------------------------------------------------
+// MidiInPortStrip
+//---------------------------------------------------------
+
+MidiInPortStrip::MidiInPortStrip(Mixer* m, MidiInPort* t, bool align)
+ : Strip(m, t, align)
+ {
+ //---------------------------------------------------
+ // plugin rack
+ //---------------------------------------------------
+
+ MidiRack* rack = new MidiRack(this, t);
+ rack->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ rack->setFixedSize(STRIP_WIDTH, rack->sizeHint().height()+2);
+ layout->addWidget(rack);
+
+ if (_align)
+ // layout->addSpacing(STRIP_WIDTH/2);
+ layout->addSpacing(LABEL_HEIGHT);
+
+ int auxsSize = song->auxs()->size();
+ if (_align && auxsSize)
+ layout->addSpacing((STRIP_WIDTH/2 + 1) * auxsSize);
+
+ //---------------------------------------------------
+ // slider, label, meter
+ //---------------------------------------------------
+
+ meter = new Awl::MidiMeter(this);
+ meter->setFixedWidth(40);
+ layout->addWidget(meter, 100, Qt::AlignRight);
+
+ //---------------------------------------------------
+ // pan, balance
+ //---------------------------------------------------
+
+ if (_align) {
+ layout->addSpacing(STRIP_WIDTH/2 + STRIP_WIDTH/3);
+ layout->addSpacing(LABEL_HEIGHT);
+ }
+
+ //---------------------------------------------------
+ // mute, solo
+ // or
+ // record, mixdownfile
+ //---------------------------------------------------
+
+ mute = newMuteButton(this);
+ mute->setChecked(track->isMute());
+ mute->setFixedSize(buttonSize);
+ connect(mute, SIGNAL(clicked(bool)), SLOT(muteToggled(bool)));
+
+ solo = newSoloButton(this);
+ solo->setFixedSize(buttonSize);
+ solo->setChecked(track->solo());
+ connect(solo, SIGNAL(clicked(bool)), SLOT(soloToggled(bool)));
+
+ QHBoxLayout* smBox1 = new QHBoxLayout(0);
+ QHBoxLayout* smBox2 = new QHBoxLayout(0);
+
+ smBox2->addWidget(mute);
+ smBox2->addWidget(solo);
+
+ layout->addLayout(smBox1);
+ layout->addLayout(smBox2);
+
+ //---------------------------------------------------
+ // output routing
+ //---------------------------------------------------
+
+ if (_align)
+ layout->addSpacing(STRIP_WIDTH/3); // automation line
+
+ QHBoxLayout* rBox = new QHBoxLayout(0);
+ iR = new QToolButton(this);
+ iR->setFont(*config.fonts[1]);
+ iR->setFixedWidth((STRIP_WIDTH-4)/2);
+ iR->setText(tr("iR"));
+ iR->setCheckable(false);
+ iR->setToolTip(tr("input routing"));
+ rBox->addWidget(iR);
+ connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed()));
+
+ oR = new QToolButton(this);
+ oR->setFont(*config.fonts[1]);
+ oR->setFixedWidth((STRIP_WIDTH-4)/2);
+ oR->setText(tr("oR"));
+ oR->setCheckable(false);
+ oR->setToolTip(tr("output routing"));
+ rBox->addWidget(oR);
+ connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed()));
+
+ layout->addLayout(rBox);
+
+ connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat()));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(track, SIGNAL(muteChanged(bool)), mute, SLOT(setChecked(bool)));
+ connect(track, SIGNAL(soloChanged(bool)), solo, SLOT(setChecked(bool)));
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void MidiInPortStrip::songChanged(int val)
+ {
+ if (val & SC_TRACK_MODIFIED)
+ updateLabel();
+ }
+
+//---------------------------------------------------------
+// heartBeat
+//---------------------------------------------------------
+
+void MidiInPortStrip::heartBeat()
+ {
+ float a = track->meter(0); // fast_log10(track->meter(0)) * .2f;
+ meter->setMeterVal(a * 0.008);
+ track->setMeter(0, a * 0.8); // hack
+ }
+
+//---------------------------------------------------------
+// muteToggled
+//---------------------------------------------------------
+
+void MidiInPortStrip::muteToggled(bool val)
+ {
+ song->setMute(track, val);
+ }
+
+//---------------------------------------------------------
+// soloToggled
+//---------------------------------------------------------
+
+void MidiInPortStrip::soloToggled(bool val)
+ {
+ song->setSolo(track, val);
+ }
+
+//---------------------------------------------------------
+// oRoutePressed
+//---------------------------------------------------------
+
+void MidiInPortStrip::oRoutePressed()
+ {
+ QMenu* pup = new QMenu(tr("Channel"), oR);
+ pup->addSeparator()->setText(tr("Channel"));
+
+ MidiTrackList* tl = song->midis();
+ MidiSyntiList* sl = song->midiSyntis();
+ RouteList* orl = track->outRoutes();
+ SynthIList* asl = song->syntis();
+
+ int sn = 0;
+ for (iSynthI i = asl->begin(); i != asl->end(); ++i) {
+ QAction* action = pup->addAction((*i)->name());
+
+ QMap<QString, QVariant> data;
+ data["id"] = QVariant(0x20000 + sn);
+ data["was_checked"] = false;
+ action->setData(data);
+
+ Route dst(*i, -1, Route::SYNTIPORT);
+ for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
+ if (*ir == dst) {
+ action->setCheckable(true);
+ action->setChecked(true);
+ data["was_checked"] = true;
+ action->setData(data);
+ break;
+ }
+ }
+ }
+ for (int channel = 0; channel < MIDI_CHANNELS; ++channel) {
+ QMenu* m = pup->addMenu(QString(tr("Channel %1")).arg(channel + 1));
+ m->addSeparator()->setText(tr("Tracks"));
+
+ //
+ // route to midi track for recording
+ // and monitoring
+ //
+ int tn = 0;
+ for (iMidiTrack i = tl->begin(); i != tl->end(); ++i, ++tn) {
+ QAction* trackno_action = m->addAction((*i)->name());
+
+ QMap<QString, QVariant> data;
+ data["id"] = tn * 16 + channel;
+ data["was_checked"] = false;
+ trackno_action->setData(data);
+
+ Route dst(*i, channel, Route::TRACK);
+ for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
+ if (*ir == dst) {
+ trackno_action->setCheckable(true);
+ trackno_action->setChecked(true);
+ data["was_checked"] = true;
+ trackno_action->setData(data);
+ break;
+ }
+ }
+ }
+ //
+ // route to midi synthesizer (arpeggiator etc.)
+ //
+ tn = 0;
+ for (iMidiSynti i = sl->begin(); i != sl->end(); ++i, ++tn) {
+ QAction* trackno_action = m->addAction((*i)->name());
+
+ QMap<QString, QVariant> data;
+ data["id"] = 0x10000 + tn * 16 + channel;
+ data["was_checked"] = false;
+ trackno_action->setData(data);
+
+ Route dst(*i, channel, Route::TRACK);
+ for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
+ if (*ir == dst) {
+ trackno_action->setCheckable(true);
+ trackno_action->setChecked(true);
+ data["was_checked"] = true;
+ trackno_action->setData(data);
+ break;
+ }
+ }
+ }
+ }
+
+ QAction* action = pup->exec(QCursor::pos());
+ if (action) {
+ int n = action->data().toMap()["id"].toInt();
+ int was_checked = action->data().toMap()["was_checked"].toInt();
+ Route srcRoute(track, -1, Route::TRACK);
+ Route dstRoute;
+ if (n >= 0x20000) {
+ dstRoute.track = asl->index(n - 0x20000);
+ dstRoute.channel = -1;
+ dstRoute.type = Route::SYNTIPORT;
+ }
+ else if (n >= 0x10000) {
+ int channel = (n-0x10000) & 0xf;
+ srcRoute.channel = channel;
+ dstRoute.track = sl->index((n - 0x10000) >> 4);
+ dstRoute.channel = channel;
+ dstRoute.type = Route::TRACK;
+ }
+ else {
+ int channel = n & 0xf;
+ srcRoute.channel = channel;
+ dstRoute.track = tl->index(n >> 4);
+ dstRoute.channel = channel;
+ dstRoute.type = Route::TRACK;
+ }
+ if (was_checked)
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ else
+ audio->msgAddRoute(srcRoute, dstRoute);
+ song->update(SC_ROUTE);
+ }
+ delete pup;
+ oR->setDown(false); // pup->exec() catches mouse release event
+ }
+
+//---------------------------------------------------------
+// iRoutePressed
+//---------------------------------------------------------
+
+void MidiInPortStrip::iRoutePressed()
+ {
+ QMenu* pup = new QMenu(oR);
+ pup->addSeparator()->setText(tr("AlsaDevices"));
+
+ RouteList* irl = track->inRoutes();
+
+ std::list<PortName>* ol = midiDriver->inputPorts();
+ for (std::list<PortName>::iterator ip = ol->begin(); ip != ol->end(); ++ip) {
+ QAction* action = pup->addAction(ip->name);
+ Port port = ip->port;
+ Route dst(port, Route::MIDIPORT);
+ for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) {
+ if (*ir == dst) {
+ action->setCheckable(true);
+ action->setChecked(true);
+ break;
+ }
+ }
+ }
+ delete ol;
+ QAction* action = pup->exec(QCursor::pos());
+ if (action) {
+ QString s(action->text());
+ Port port = midiDriver->findPort(s.toAscii().data());
+ Route srcRoute(port, Route::MIDIPORT);
+ Route dstRoute(track, -1, Route::TRACK);
+
+ // check if route src->dst exists:
+ iRoute ir = irl->begin();
+ for (; ir != irl->end(); ++ir) {
+ if (*ir == srcRoute)
+ break;
+ }
+ if (ir != irl->end()) {
+ // disconnect if route exists
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ }
+ else {
+ // connect if route does not exist
+ audio->msgAddRoute(srcRoute, dstRoute);
+ }
+ song->update(SC_ROUTE);
+ }
+ delete pup;
+ iR->setDown(false); // pup->exec() catches mouse release event
+ }
+
+//---------------------------------------------------------
+// MidiSyntiStrip
+//---------------------------------------------------------
+
+MidiSyntiStrip::MidiSyntiStrip(Mixer* m, MidiSynti* t, bool align)
+ : Strip(m, t, align)
+ {
+ int auxsSize = song->auxs()->size();
+ if (_align)
+ layout->addSpacing((STRIP_WIDTH/2 + 1) * auxsSize + STRIP_WIDTH/2 * 3);
+
+ volumeTouched = false;
+
+ //---------------------------------------------------
+ // slider, label, meter
+ //---------------------------------------------------
+
+ slider = new Awl::MidiMeterSlider(this);
+ slider->setId(CTRL_MASTER_VOLUME);
+ slider->setRange(0.0, 1024*16.0);
+ slider->setFixedWidth(40);
+ layout->addWidget(slider, 100, Qt::AlignRight);
+
+ sl = new Awl::MidiVolEntry(this);
+ sl->setId(CTRL_MASTER_VOLUME);
+ sl->setFont(*config.fonts[1]);
+ sl->setFixedWidth(STRIP_WIDTH-2);
+
+ connect(slider, SIGNAL(valueChanged(float,int)), SLOT(ctrlChanged(float, int)));
+ connect(slider, SIGNAL(sliderPressed(int)), SLOT(sliderPressed(int)));
+ connect(slider, SIGNAL(sliderReleased(int)), SLOT(sliderReleased(int)));
+ connect(sl, SIGNAL(valueChanged(float,int)), SLOT(ctrlChanged(float, int)));
+ layout->addWidget(sl);
+
+ //---------------------------------------------------
+ // pan, balance
+ //---------------------------------------------------
+
+ if (_align)
+ layout->addSpacing(STRIP_WIDTH);
+
+ //---------------------------------------------------
+ // sync
+ // mute, solo
+ //---------------------------------------------------
+
+ mute = newMuteButton(this);
+ mute->setChecked(track->isMute());
+ mute->setFixedSize(buttonSize);
+ connect(mute, SIGNAL(clicked(bool)), SLOT(muteToggled(bool)));
+
+ solo = newSoloButton(this);
+ solo->setFixedSize(buttonSize);
+ solo->setChecked(track->solo());
+ connect(solo, SIGNAL(clicked(bool)), SLOT(soloToggled(bool)));
+
+ QHBoxLayout* smBox2 = new QHBoxLayout(0);
+
+ smBox2->addWidget(mute);
+ smBox2->addWidget(solo);
+
+ layout->addLayout(smBox2);
+
+ //---------------------------------------------------
+ // automation mode
+ //---------------------------------------------------
+
+ addAutomationButtons();
+
+ //---------------------------------------------------
+ // output routing
+ //---------------------------------------------------
+
+ QHBoxLayout* rBox = new QHBoxLayout(0);
+
+ iR = new QToolButton(this);
+ iR->setFont(*config.fonts[1]);
+ iR->setFixedWidth((STRIP_WIDTH-4)/2);
+ iR->setText(tr("iR"));
+ iR->setCheckable(false);
+ iR->setToolTip(tr("input routing"));
+ rBox->addWidget(iR);
+ connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed()));
+
+ oR = new QToolButton(this);
+ oR->setFont(*config.fonts[1]);
+ oR->setFixedWidth((STRIP_WIDTH-4)/2);
+ oR->setText(tr("oR"));
+ oR->setCheckable(false);
+ oR->setToolTip(tr("output routing"));
+ rBox->addWidget(oR);
+ connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed()));
+
+ layout->addLayout(rBox);
+
+ connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat()));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(track, SIGNAL(muteChanged(bool)), mute, SLOT(setChecked(bool)));
+ connect(track, SIGNAL(soloChanged(bool)), solo, SLOT(setChecked(bool)));
+ connect(track, SIGNAL(autoReadChanged(bool)), SLOT(autoChanged()));
+ connect(track, SIGNAL(autoWriteChanged(bool)), SLOT(autoChanged()));
+ autoChanged();
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void MidiSyntiStrip::songChanged(int val)
+ {
+ if (val & SC_TRACK_MODIFIED)
+ updateLabel();
+ }
+
+//---------------------------------------------------------
+// heartBeat
+//---------------------------------------------------------
+
+void MidiSyntiStrip::heartBeat()
+ {
+ float a = track->meter(0); // fast_log10(track->meter(0)) * .2f;
+ slider->setMeterVal(a * 0.008);
+ track->setMeter(0, a * 0.8); // hack
+ }
+
+//---------------------------------------------------------
+// ctrlChanged
+//---------------------------------------------------------
+
+void MidiSyntiStrip::ctrlChanged(float val, int num)
+ {
+ int ival = int(val);
+ CVal cval;
+ cval.i = ival;
+ song->setControllerVal(track, num, cval);
+ }
+
+//---------------------------------------------------------
+// sliderPressed
+//---------------------------------------------------------
+
+void MidiSyntiStrip::sliderPressed(int id)
+ {
+ switch (id) {
+ case CTRL_MASTER_VOLUME: volumeTouched = true; break;
+ }
+ track->startAutoRecord(id);
+ }
+
+//---------------------------------------------------------
+// sliderReleased
+//---------------------------------------------------------
+
+void MidiSyntiStrip::sliderReleased(int id)
+ {
+ switch (id) {
+ case CTRL_MASTER_VOLUME: volumeTouched = false; break;
+ }
+ track->stopAutoRecord(id);
+ }
+
+//---------------------------------------------------------
+// muteToggled
+//---------------------------------------------------------
+
+void MidiSyntiStrip::muteToggled(bool val)
+ {
+ song->setMute(track, val);
+ }
+
+//---------------------------------------------------------
+// soloToggled
+//---------------------------------------------------------
+
+void MidiSyntiStrip::soloToggled(bool val)
+ {
+ song->setSolo(track, val);
+ }
+
+//---------------------------------------------------------
+// autoChanged
+//---------------------------------------------------------
+
+void MidiSyntiStrip::autoChanged()
+ {
+ bool ar = track->autoRead();
+ bool aw = track->autoWrite();
+
+ // controller are enabled if
+ // autoRead is off
+ // autoRead and autoWrite are on (touch mode)
+
+ bool ec = !ar || (ar && aw);
+ slider->setEnabled(ec);
+ sl->setEnabled(ec);
+ }
+
+//---------------------------------------------------------
+// autoReadToggled
+//---------------------------------------------------------
+
+void MidiSyntiStrip::autoReadToggled(bool val)
+ {
+ song->setAutoRead(track, val);
+ }
+
+//---------------------------------------------------------
+// autoWriteToggled
+//---------------------------------------------------------
+
+void MidiSyntiStrip::autoWriteToggled(bool val)
+ {
+ song->setAutoWrite(track, val);
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void MidiSyntiStrip::controllerChanged(int id)
+ {
+ if (id == CTRL_MASTER_VOLUME) {
+ float val = float(track->ctrlVal(id).i);
+ if (!volumeTouched)
+ slider->setValue(val);
+ sl->setValue(val);
+ }
+ }
+
+//---------------------------------------------------------
+// oRoutePressed
+//---------------------------------------------------------
+
+void MidiSyntiStrip::oRoutePressed()
+ {
+ QMenu* pup = new QMenu(oR);
+ pup->addSeparator()->setText(tr("OutputPorts"));
+ RouteList* orl = track->outRoutes();
+
+ MidiOutPortList* mpl = song->midiOutPorts();
+ int pn = 0;
+ for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i, ++pn) {
+ MidiOutPort* op = *i;
+ QMenu* m = pup->addMenu(op->name());
+ m->addSeparator()->setText(tr("Channel"));
+ for (int channel = 0; channel < MIDI_CHANNELS; ++channel) {
+ QString s;
+ s.setNum(channel+1);
+ QAction* action = m->addAction(s);//int id = m->insertItem(s, pn * 16 + channel);
+ action->setData(pn * 16 + channel);
+ MidiChannel* mc = op->channel(channel);
+ Route r(mc, -1, Route::TRACK);
+ for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
+ if (r == *ir) {
+ action->setCheckable(true);//m->setItemChecked(id, true);
+ action->setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+ QAction* action = pup->exec(QCursor::pos()); //int n = pup->exec(QCursor::pos());
+ if (action) {
+ int n = action->data().toInt();
+ int portno = n >> 4;
+ int channel = n & 0xf;
+ MidiOutPort* mp = mpl->index(portno);
+ MidiChannel* mc = mp->channel(channel);
+ Route srcRoute(track, -1, Route::TRACK);
+ Route dstRoute(mc, -1, Route::TRACK);
+
+ // remove old route
+ // note: audio->msgRemoveRoute() changes orl list
+ //
+ bool removed;
+ do {
+ removed = false;
+ for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) {
+ Route s(track, ir->channel, Route::TRACK);
+ s.dump();
+ ir->dump();
+ audio->msgRemoveRoute(s, *ir);
+ removed = true;
+ break;
+ }
+ } while (removed);
+ audio->msgAddRoute(srcRoute, dstRoute);
+ song->update(SC_ROUTE);
+ if (mixer)
+ mixer->setUpdateMixer();
+ }
+ delete pup;
+ oR->setDown(false); // pup->exec() catches mouse release event
+ }
+
+//---------------------------------------------------------
+// iRoutePressed
+//---------------------------------------------------------
+
+void MidiSyntiStrip::iRoutePressed()
+ {
+ QMenu* pup = new QMenu(oR);
+ pup->addSeparator()->setText(tr("Input Ports"));
+ MidiOutPort* t = (MidiOutPort*)track;
+ RouteList* irl = t->inRoutes();
+
+ MidiInPortList* ipl = song->midiInPorts();
+ int tn = 0;
+ for (iMidiInPort i = ipl->begin(); i != ipl->end(); ++i, ++tn) {
+ QMenu* m = pup->addMenu((*i)->name());
+ m->addSeparator()->setText(tr("Channel"));
+ QAction* action = m->addAction(tr("All"));
+ QMap<QString, QVariant> data;
+ data["id"] = tn * 32 + MIDI_CHANNELS;
+ data["was_checked"] = false;
+ action->setData(data);
+
+ for (int channel = 0; channel < MIDI_CHANNELS; ++channel) {
+ QString s;
+ s.setNum(channel+1);
+
+ QMap<QString, QVariant> data;
+ action = m->addAction(s); //int id = m->insertItem(s, tn * 32 + channel);
+ data["id"] = tn * 32 + channel;
+ data["was_checked"] = false;
+ action->setData(data);
+
+ Route src(*i, channel, Route::TRACK);
+ for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) {
+ if (*ir == src) {
+ //m->setItemChecked(id, true);
+ action->setCheckable(true);
+ action->setChecked(true);
+ data["was_checked"] = true;
+ action->setData(data);
+ break;
+ }
+ }
+ }
+ }
+
+ QAction* action = pup->exec(QCursor::pos());//int n = pup->exec(QCursor::pos());
+ if (action) {
+ int n = action->data().toMap()["id"].toInt();
+ int was_checked = action->data().toMap()["was_checked"].toInt();
+ int port = n >> 5;
+ int channel = n & 0x1f;
+ MidiInPort* mip = ipl->index(port);
+ if (channel == MIDI_CHANNELS) {
+ for (channel = 0; channel < MIDI_CHANNELS; ++channel) {
+ Route srcRoute(mip, channel, Route::TRACK);
+ Route dstRoute(track, channel, Route::TRACK);
+ audio->msgAddRoute(srcRoute, dstRoute);
+ }
+ }
+ else {
+ Route srcRoute(mip, channel, Route::TRACK);
+ Route dstRoute(track, channel, Route::TRACK);
+
+ if (was_checked)
+ audio->msgRemoveRoute(srcRoute, dstRoute);
+ else
+ audio->msgAddRoute(srcRoute, dstRoute);
+ }
+ song->update(SC_ROUTE);
+ }
+ delete pup;
+ iR->setDown(false); // pup->exec() catches mouse release event
+ }
+
diff --git a/muse/muse/mixer/mstrip.h b/muse/muse/mixer/mstrip.h
new file mode 100644
index 00000000..c42dfe94
--- /dev/null
+++ b/muse/muse/mixer/mstrip.h
@@ -0,0 +1,204 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mstrip.h,v 1.27 2005/10/03 21:38:14 wschweer Exp $
+//
+// (C) Copyright 2000-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MSTRIP_H__
+#define __MSTRIP_H__
+
+#include "strip.h"
+
+namespace Awl {
+ class MidiMeterSlider;
+ class MidiMeter;
+ class FloatEntry;
+ class MidiVolEntry;
+ class Knob;
+ };
+
+class MidiTrack;
+class MidiOutPort;
+class MidiInPort;
+class MidiChannel;
+class MidiSynti;
+
+//---------------------------------------------------------
+// MidiStrip
+//---------------------------------------------------------
+
+class MidiStrip : public Strip {
+ Q_OBJECT
+
+ Awl::MidiMeter* meter;
+ QToolButton* iR;
+ QToolButton* oR;
+
+ private slots:
+ void muteToggled(bool);
+ void soloToggled(bool);
+ void recordToggled(bool);
+ void iRoutePressed();
+ void oRoutePressed();
+
+ protected slots:
+ virtual void heartBeat();
+
+ public slots:
+ virtual void songChanged(int);
+
+ public:
+ MidiStrip(Mixer*, MidiTrack*, bool align);
+ };
+
+//---------------------------------------------------------
+// MidiChannelStrip
+//---------------------------------------------------------
+
+class MidiChannelStrip : public Strip {
+ Q_OBJECT
+
+ Awl::MidiMeterSlider* slider;
+ Awl::MidiVolEntry* sl;
+ QToolButton* iR;
+
+ struct KNOB {
+ Awl::Knob* knob;
+ Awl::FloatEntry* dl;
+ QLabel* lb;
+ } controller[4]; // pan variation reverb chorus
+
+ bool volumeTouched;
+ bool panTouched;
+ bool reverbSendTouched;
+ bool variSendTouched;
+ bool chorusSendTouched;
+
+ void addKnob(int ctrl, int idx, const QString&, const QString&, const char*, bool);
+
+ private slots:
+ virtual void controllerChanged(int id);
+ void ctrlChanged(float val, int num);
+ void muteToggled(bool);
+ void soloToggled(bool);
+ void autoChanged();
+ void sliderPressed(int);
+ void sliderReleased(int);
+ void autoReadToggled(bool);
+ void autoWriteToggled(bool);
+ void iRoutePressed();
+
+ protected slots:
+ virtual void heartBeat();
+
+ public slots:
+ virtual void songChanged(int);
+
+ public:
+ MidiChannelStrip(Mixer*, MidiChannel*, bool align = true);
+ };
+
+//---------------------------------------------------------
+// MidiOutPortStrip
+//---------------------------------------------------------
+
+class MidiOutPortStrip : public Strip {
+ Q_OBJECT
+
+ Awl::MidiMeterSlider* slider;
+ Awl::MidiVolEntry* sl;
+ QToolButton* oR;
+ SimpleButton* sync;
+
+ bool volumeTouched;
+
+ private slots:
+ virtual void controllerChanged(int id);
+ void ctrlChanged(float val, int num);
+ void muteToggled(bool);
+ void soloToggled(bool);
+ void autoChanged();
+ void sliderPressed(int);
+ void sliderReleased(int);
+ void autoReadToggled(bool);
+ void autoWriteToggled(bool);
+ void oRoutePressed();
+ void syncToggled(bool) const;
+
+ protected slots:
+ virtual void heartBeat();
+
+ public slots:
+ virtual void songChanged(int);
+
+ public:
+ MidiOutPortStrip(Mixer*, MidiOutPort*, bool align = true);
+ };
+
+//---------------------------------------------------------
+// MidiSyntiStrip
+//---------------------------------------------------------
+
+class MidiSyntiStrip : public Strip {
+ Q_OBJECT
+
+ Awl::MidiMeterSlider* slider;
+ Awl::MidiVolEntry* sl;
+ QToolButton* iR;
+ QToolButton* oR;
+
+ bool volumeTouched;
+
+ private slots:
+ virtual void controllerChanged(int id);
+ void ctrlChanged(float val, int num);
+ void muteToggled(bool);
+ void soloToggled(bool);
+ void autoChanged();
+ void sliderPressed(int);
+ void sliderReleased(int);
+ void autoReadToggled(bool);
+ void autoWriteToggled(bool);
+ void iRoutePressed();
+ void oRoutePressed();
+
+ protected slots:
+ virtual void heartBeat();
+
+ public slots:
+ virtual void songChanged(int);
+
+ public:
+ MidiSyntiStrip(Mixer*, MidiSynti*, bool align = true);
+ };
+
+//---------------------------------------------------------
+// MidiInPortStrip
+//---------------------------------------------------------
+
+class MidiInPortStrip : public Strip {
+ Q_OBJECT
+
+ Awl::MidiMeter* meter;
+ QToolButton* iR;
+ QToolButton* oR;
+
+ private slots:
+ void muteToggled(bool);
+ void soloToggled(bool);
+ void iRoutePressed();
+ void oRoutePressed();
+
+ protected slots:
+ virtual void heartBeat();
+
+ public slots:
+ virtual void songChanged(int);
+
+ public:
+ MidiInPortStrip(Mixer*, MidiInPort*, bool align = true);
+ };
+
+#endif
diff --git a/muse/muse/mixer/rack.cpp b/muse/muse/mixer/rack.cpp
new file mode 100644
index 00000000..fb25e491
--- /dev/null
+++ b/muse/muse/mixer/rack.cpp
@@ -0,0 +1,404 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: rack.cpp,v 1.27 2006/01/25 16:24:33 wschweer Exp $
+//
+// (C) Copyright 2000-2003 Werner Schweer (ws@seh.de)
+//=========================================================
+
+//#include <QDrag>
+//#include <QMimeData>
+#include "rack.h"
+#include "song.h"
+#include "audio.h"
+#include "icons.h"
+#include "gconfig.h"
+#include "plugin.h"
+#include "plugingui.h"
+#include "widgets/filedialog.h"
+
+//---------------------------------------------------------
+// EffectRack
+//---------------------------------------------------------
+
+EffectRack::EffectRack(QWidget* parent, AudioTrack* t)
+ : QListWidget(parent)
+ {
+ setAttribute(Qt::WA_DeleteOnClose, true);
+ track = t;
+ setFont(*config.fonts[1]);
+
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+ setSelectionMode(QAbstractItemView::SingleSelection);
+ for (int i = 0; i < PipelineDepth; ++i) {
+ QListWidgetItem* item = new QListWidgetItem;
+ item->setText(t->efxPipe()->name(i));
+ item->setBackgroundColor(t->efxPipe()->isOn(i) ? Qt::white : Qt::gray);
+ addItem(item);
+ }
+ connect(this, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
+ this, SLOT(doubleClicked(QListWidgetItem*)));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ setToolTip(tr("effect rack"));
+ setAcceptDrops(true);
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize EffectRack::sizeHint() const
+ {
+ QFontMetrics fm(font());
+ int h = fm.lineSpacing() * PipelineDepth + 1;
+ return QSize(100, h);
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void EffectRack::songChanged(int typ)
+ {
+ if (typ & (SC_ROUTE | SC_RACK)) {
+ for (int i = 0; i < PipelineDepth; ++i) {
+ QListWidgetItem* it = item(i);
+ it->setText(track->efxPipe()->name(i));
+ it->setBackgroundColor(track->efxPipe()->isOn(i) ? Qt::white : Qt::gray);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// menuRequested
+//---------------------------------------------------------
+
+void EffectRack::contextMenuEvent(QContextMenuEvent* ev)
+ {
+ QPoint pt(ev->pos());
+ QListWidgetItem* item = itemAt(pt);
+ if (item == 0 || track == 0)
+ return;
+
+ int idx = row(item);
+ QString name;
+ bool mute;
+ Pipeline* pipe = track->efxPipe();
+ if (pipe) {
+ name = pipe->name(idx);
+ mute = pipe->isOn(idx);
+ }
+
+ QAction* newAction;
+ QAction* upAction;
+ QAction* downAction;
+ QAction* removeAction;
+ QAction* bypassAction;
+ QAction* showAction;
+ QAction* showCustomAction;
+
+ QMenu* menu = new QMenu;
+ upAction = menu->addAction(QIcon(*upIcon), tr("move up"));
+ downAction = menu->addAction(QIcon(*downIcon), tr("move down"));
+ removeAction = menu->addAction(tr("remove"));
+ bypassAction = menu->addAction(tr("bypass"));
+ showAction = menu->addAction(tr("show gui"));
+ showCustomAction = menu->addAction(tr("show native gui"));
+
+ bypassAction->setChecked(!pipe->isOn(idx));
+ showAction->setChecked(pipe->guiVisible(idx));
+ showCustomAction->setChecked(pipe->nativeGuiVisible(idx));
+
+ if (pipe->empty(idx)) {
+ newAction = menu->addAction(tr("new"));
+ upAction->setEnabled(false);
+ downAction->setEnabled(false);
+ removeAction->setEnabled(false);
+ bypassAction->setEnabled(false);
+ showAction->setEnabled(false);
+ showCustomAction->setEnabled(false);
+ }
+ else {
+ newAction = menu->addAction(tr("change"));
+ if (idx == 0)
+ upAction->setEnabled(false);
+ if (idx == (PipelineDepth-1))
+ downAction->setEnabled(false);
+ showCustomAction->setEnabled(pipe->hasNativeGui(idx));
+ }
+
+ QAction* sel = menu->exec(mapToGlobal(pt), newAction);
+ delete menu;
+ if (sel == 0)
+ return;
+
+ if (sel == newAction) {
+ Plugin* plugin = PluginDialog::getPlugin(this);
+ if (plugin) {
+ PluginI* plugi = new PluginI(track);
+ if (plugi->initPluginInstance(plugin, track->channels())) {
+ printf("cannot instantiate plugin <%s>\n",
+ plugin->name().toLatin1().data());
+ delete plugi;
+ }
+ else
+ audio->msgAddPlugin(track, idx, plugi);
+ }
+ }
+ else if (sel == removeAction) {
+ audio->msgAddPlugin(track, idx, 0);
+ }
+ else if (sel == bypassAction) {
+ bool flag = !pipe->isOn(idx);
+ pipe->setOn(idx, flag);
+ }
+ else if (sel == showAction) {
+ bool flag = !pipe->guiVisible(idx);
+ pipe->showGui(idx, flag);
+ }
+ else if (sel == showCustomAction) {
+ bool flag = !pipe->nativeGuiVisible(idx);
+ pipe->showNativeGui(idx, flag);
+ }
+ else if (sel == upAction) {
+ if (idx > 0) {
+ setCurrentRow(idx-1);
+ pipe->move(idx, true);
+ }
+ }
+ else if (sel == downAction) {
+ if (idx < (PipelineDepth-1)) {
+ setCurrentRow(idx+1);
+ pipe->move(idx, false);
+ }
+ }
+ song->update(SC_RACK);
+ }
+
+//---------------------------------------------------------
+// doubleClicked
+// toggle gui and open requester if needed.
+//---------------------------------------------------------
+
+void EffectRack::doubleClicked(QListWidgetItem* it)
+ {
+ if (it == 0 || track == 0)
+ return;
+ int idx = row(it);
+ Pipeline* pipe = track->efxPipe();
+
+ if (!pipe->empty(idx)) {
+ bool flag = !pipe->guiVisible(idx);
+ pipe->showGui(idx, flag);
+ }
+ else {
+ Plugin* plugin = PluginDialog::getPlugin(this);
+ if (plugin) {
+ PluginI* plugi = new PluginI(track);
+ if (plugi->initPluginInstance(plugin, track->channels())) {
+ printf("cannot instantiate plugin <%s>\n",
+ plugin->name().toLatin1().data());
+ delete plugi;
+ }
+ else {
+ audio->msgAddPlugin(track, idx, plugi);
+ }
+ song->update(SC_RACK);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// startDrag
+//---------------------------------------------------------
+
+void EffectRack::startDrag(int idx)
+ {
+ QBuffer buffer;
+ AL::Xml xml(&buffer);
+ Pipeline* pipe = track->efxPipe();
+ if (pipe) {
+ if ((*pipe)[idx] != NULL) {
+ PluginI *plug = (*pipe)[idx];
+ xml.header();
+ xml.tag("muse version=\"1.0\"");
+ // header info
+ plug->writeConfiguration1(xml); // wC1 does not append endtag
+ // parameters
+ int noParams = plug->plugin()->parameter();
+ for (int i=0;i<noParams;i++) {
+ QString fval;
+ QString name(plug->getParameterName(i));
+ fval.setNum(plug->param(i)); // wierd stuff to avoid localization
+ QString str="<control name=\"" + name + "\" val=\""+ fval+"\" />";
+ xml.put(str.toLatin1().data());
+ }
+ xml.etag("plugin");
+
+ xml.etag("muse");
+ }
+ else {
+ //printf("no plugin!\n");
+ return;
+ }
+ }
+ else {
+ //printf("no pipe!\n");
+ return;
+ }
+
+ QByteArray xmldump = buffer.buffer();
+ QDrag *drag = new QDrag(this);
+ QMimeData *mime = new QMimeData();
+ mime->setData("text/x-muse-plugin", xmldump);
+ drag->setMimeData(mime);
+ Qt::DropAction dropAction = drag->start();
+ }
+
+//---------------------------------------------------------
+// startDrag
+//---------------------------------------------------------
+void EffectRack::dropEvent(QDropEvent *event)
+ {
+ QString text;
+ QListWidgetItem *i = itemAt( (event->pos()) );
+ int idx = row(i);
+
+ Pipeline* pipe = track->efxPipe();
+ if (pipe) {
+ if ((*pipe)[idx] != NULL) {
+ if(!QMessageBox::question(this, tr("Replace effect"),tr("Do you really want to replace the effect %1?").arg(pipe->name(idx)),
+ tr("&Yes"), tr("&No"),
+ QString::null, 0, 1 ))
+ {
+ audio->msgAddPlugin(track, idx, 0);
+ song->update(SC_RACK);
+ }
+ else {
+ printf("nothing here\n");
+ return;
+ }
+ }
+ if(event->mimeData()->hasText())
+ {
+ //printf("has text\n");
+ text = event->mimeData()->text().trimmed();
+ if (QString(text).endsWith(".pre"))
+ {
+ QUrl url(text);
+ QString newPath = url.path();
+
+ QFile xmlfile(newPath);
+ xmlfile.open(QIODevice::ReadOnly);
+ QDomDocument doc;
+ doc.setContent(&xmlfile);
+ QDomNode node = doc.documentElement().firstChild();
+ initPlugin(node, idx);
+ }
+ }
+ else if (event->mimeData()->hasFormat("text/x-muse-plugin"))
+ {
+ QByteArray outxml = event->mimeData()->data("text/x-muse-plugin");
+ //printf("%s\n",outxml.data());
+ QDomDocument doc;
+ doc.setContent(outxml);
+ QDomNode node = doc.documentElement().firstChild();
+
+ initPlugin(node, idx);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// dragEnterEvent
+//---------------------------------------------------------
+void EffectRack::dragEnterEvent(QDragEnterEvent *event)
+ {
+ //printf("dragEnterEvent\n");
+ //if (event->mimeData()->hasFormat("text/x-muse-plugin"))
+ event->acceptProposedAction();
+ }
+
+//---------------------------------------------------------
+// dragMoveEvent
+//---------------------------------------------------------
+void EffectRack::dragMoveEvent(QDragMoveEvent *event)
+ {
+ //printf("dragMoveEvent\n");
+ //if (event->mimeData()->hasFormat("text/x-muse-plugin"))
+ event->acceptProposedAction();
+ }
+
+//---------------------------------------------------------
+// contentsMousePressEvent
+//---------------------------------------------------------
+void EffectRack::mousePressEvent(QMouseEvent *event)
+ {
+ //printf("mousePressEvent\n");
+ if(event->button() & Qt::LeftButton) {
+ dragPos = event->pos();
+ }
+ QListWidget::mousePressEvent(event);
+ }
+
+//---------------------------------------------------------
+// contentsMouseMoveEvent
+//---------------------------------------------------------
+void EffectRack::mouseMoveEvent(QMouseEvent *event)
+ {
+ if (event->buttons() & Qt::LeftButton) {
+ int distance = (dragPos-event->pos()).manhattanLength();
+ if (distance > QApplication::startDragDistance()) {
+ QListWidgetItem *i = itemAt( event->pos() );
+ int idx = row(i);
+ startDrag(idx);
+ }
+ }
+ QListWidget::mouseMoveEvent(event);
+ }
+
+
+//---------------------------------------------------------
+// initPlugin
+//---------------------------------------------------------
+
+void EffectRack::initPlugin(QDomNode &node, int idx)
+ {
+ QDomElement e = node.toElement();
+ //QString version = e.attribute("version");
+ QString file = e.attribute("file");
+ QString label = e.attribute("label");
+
+ //printf("version=%s file=%s label=%s channel=%d\n",version.toLatin1().data(),file.toLatin1().data(), label.toLatin1().data(), channel);
+
+ //Plugin* plugin = PluginDialog::getPlugin(this);
+ Plugin* plugin = plugins.find(file, label);
+ if (plugin) {
+ PluginI* plugi = new PluginI(track);
+ if (plugi->initPluginInstance(plugin, track->channels())) {
+ printf("cannot instantiate plugin <%s>\n",
+ plugin->name().toLatin1().data());
+ delete plugi;
+ }
+ else {
+ audio->msgAddPlugin(track, idx, plugi);
+ song->update(SC_RACK);
+ int i = 0;
+ for (QDomNode n = node.firstChild(); !n.isNull(); n = n.nextSibling()) {
+ QDomElement e = n.toElement();
+ if (e.nodeName() == "control") {
+ //QString name = e.attribute("name"); // currently this value is just thrown.
+ QString value = e.attribute("val");
+ QLocale::setDefault(QLocale::C);
+ float val = value.toFloat();
+ CVal cval;
+ cval.f = val;
+ song->setControllerVal(plugi->track(), plugi->controller(i), cval);
+ i++;
+ }
+ }
+ }
+ }
+ }
diff --git a/muse/muse/mixer/rack.h b/muse/muse/mixer/rack.h
new file mode 100644
index 00000000..74664d39
--- /dev/null
+++ b/muse/muse/mixer/rack.h
@@ -0,0 +1,49 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: rack.h,v 1.12 2006/01/14 23:44:57 spamatica Exp $
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __RACK_H__
+#define __RACK_H__
+
+#include <al/xml.h>
+
+class AudioTrack;
+
+//---------------------------------------------------------
+// EffectRack
+//---------------------------------------------------------
+
+class EffectRack : public QListWidget {
+ AudioTrack* track;
+
+ QPoint dragPos;
+ Q_OBJECT
+
+
+ virtual void contextMenuEvent(QContextMenuEvent*);
+
+ void startDrag(int idx);
+ void initPlugin(QDomNode &node, int idx);
+
+ private slots:
+ void doubleClicked(QListWidgetItem*);
+ void songChanged(int);
+
+ protected:
+ void dropEvent(QDropEvent *event);
+ void dragEnterEvent(QDragEnterEvent *event);
+ void mousePressEvent(QMouseEvent *event);
+ void mouseMoveEvent(QMouseEvent *event);
+ void dragMoveEvent(QDragMoveEvent *event);
+
+ public:
+ EffectRack(QWidget*, AudioTrack* t);
+ QSize sizeHint() const;
+ };
+
+#endif
+
diff --git a/muse/muse/mixer/routedialog.cpp b/muse/muse/mixer/routedialog.cpp
new file mode 100644
index 00000000..261df8eb
--- /dev/null
+++ b/muse/muse/mixer/routedialog.cpp
@@ -0,0 +1,184 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: routedialog.cpp,v 1.12 2006/01/06 22:48:09 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "routedialog.h"
+#include "track.h"
+#include "song.h"
+#include "audio.h"
+#include "driver/jackaudio.h"
+
+//---------------------------------------------------------
+// RouteDialog
+//---------------------------------------------------------
+
+RouteDialog::RouteDialog(QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ connect(routeList, SIGNAL(selectionChanged()), SLOT(routeSelectionChanged()));
+ connect(newSrcList, SIGNAL(selectionChanged()), SLOT(srcSelectionChanged()));
+ connect(newDstList, SIGNAL(selectionChanged()), SLOT(dstSelectionChanged()));
+ connect(removeButton, SIGNAL(clicked()), SLOT(removeRoute()));
+ connect(connectButton, SIGNAL(clicked()), SLOT(addRoute()));
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ routingChanged();
+ }
+
+//---------------------------------------------------------
+// routingChanged
+//---------------------------------------------------------
+
+void RouteDialog::routingChanged()
+ {
+ //---------------------------------------------------
+ // populate lists
+ //---------------------------------------------------
+
+ routeList->clear();
+ newSrcList->clear();
+ newDstList->clear();
+
+#if 0 //TODO3
+ TrackList* tl = song->tracks();
+ for (ciTrack i = tl->begin(); i != tl->end(); ++i) {
+ if ((*i)->isMidiTrack())
+ continue;
+ Track* track = *i;
+ if (track->type() == Track::AUDIO_INPUT) {
+ for (int channel = 0; channel < track->channels(); ++channel)
+ newDstList->insertItem(Route(track, channel).name());
+ const RouteList* rl = track->inRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ Route dst(track->name(), r->channel, Route::AUDIOPORT);
+ new QListWidgetItem(routeList, r->name(), dst.name());
+ }
+ }
+ else if (track->type() != Track::AUDIO_AUX)
+ newDstList->insertItem(Route(track, -1).name());
+ if (track->type() == Track::AUDIO_OUTPUT) {
+ for (int channel = 0; channel < track->channels(); ++channel) {
+ Route r(track, channel);
+ newSrcList->insertItem(r.name());
+ }
+ }
+ else
+ newSrcList->insertItem(Route(track, -1).name());
+
+ const RouteList* rl = track->outRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ QString src(track->name());
+ if (track->type() == Track::AUDIO_OUTPUT) {
+ Route s(src, r->channel, Route::AUDIOPORT);
+ src = s.name();
+ }
+ new QListWidgetItem(routeList, src, r->name());
+ }
+ }
+
+ std::list<QString> sl = audioDriver->outputPorts();
+ for (std::list<QString>::iterator i = sl.begin(); i != sl.end(); ++i)
+ newSrcList->insertItem(*i);
+ sl = audioDriver->inputPorts();
+ for (std::list<QString>::iterator i = sl.begin(); i != sl.end(); ++i)
+ newDstList->insertItem(*i);
+#endif
+ routeSelectionChanged(); // init remove button
+ srcSelectionChanged(); // init select button
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void RouteDialog::songChanged(int v)
+ {
+ if (v & (SC_TRACK_INSERTED | SC_TRACK_REMOVED | SC_ROUTE)) {
+ routingChanged();
+ }
+ }
+
+//---------------------------------------------------------
+// routeSelectionChanged
+//---------------------------------------------------------
+
+void RouteDialog::routeSelectionChanged()
+ {
+//TD QListWidgetItem* item = routeList->selectedItem();
+// removeButton->setEnabled(item != 0);
+ }
+
+//---------------------------------------------------------
+// removeRoute
+//---------------------------------------------------------
+
+void RouteDialog::removeRoute()
+ {
+#if 0 //TD
+ QListWidgetItem* item = routeList->selectedItem();
+ if (item == 0)
+ return;
+ audio->msgRemoveRoute(Route(item->text(0), -1, Route::TRACK), Route(item->text(1), -1, Route::AUDIOPORT));
+ delete item;
+#endif
+ }
+
+//---------------------------------------------------------
+// addRoute
+//---------------------------------------------------------
+
+void RouteDialog::addRoute()
+ {
+#if 0 //TD
+ QListWidgetItem* srcItem = newSrcList->selectedItem();
+ QListWidgetItem* dstItem = newDstList->selectedItem();
+ if (srcItem == 0 || dstItem == 0)
+ return;
+ audio->msgAddRoute(Route(srcItem->text(), -1, Route::TRACK), Route(dstItem->text(), -1, Route::AUDIOPORT));
+ new QListWidgetItem(routeList, srcItem->text(), dstItem->text());
+#endif
+ }
+
+//---------------------------------------------------------
+// srcSelectionChanged
+//---------------------------------------------------------
+
+void RouteDialog::srcSelectionChanged()
+ {
+#if 0 //TD
+ QListWidgetItem* srcItem = newSrcList->selectedItem();
+ QListWidgetItem* dstItem = newDstList->selectedItem();
+ connectButton->setEnabled((srcItem != 0)
+ && (dstItem != 0)
+ && checkRoute(srcItem->text(), dstItem->text()));
+#endif
+ }
+
+//---------------------------------------------------------
+// dstSelectionChanged
+//---------------------------------------------------------
+
+void RouteDialog::dstSelectionChanged()
+ {
+#if 0 //TD
+ QListWidgetItem* dstItem = newDstList->selectedItem();
+ QListWidgetItem* srcItem = newSrcList->selectedItem();
+ connectButton->setEnabled((srcItem != 0)
+ && (dstItem != 0)
+ && checkRoute(srcItem->text(), dstItem->text()));
+#endif
+ }
+
+//---------------------------------------------------------
+// closeEvent
+//---------------------------------------------------------
+
+void RouteDialog::closeEvent(QCloseEvent* e)
+ {
+ emit closed();
+ e->accept();
+ }
diff --git a/muse/muse/mixer/routedialog.h b/muse/muse/mixer/routedialog.h
new file mode 100644
index 00000000..8b53411b
--- /dev/null
+++ b/muse/muse/mixer/routedialog.h
@@ -0,0 +1,41 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: routedialog.h,v 1.5 2006/01/06 22:48:09 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __ROUTEDIALOG_H__
+#define __ROUTEDIALOG_H__
+
+#include "ui_routedialog.h"
+
+//---------------------------------------------------------
+// RouteDialog
+//---------------------------------------------------------
+
+class RouteDialog : public QDialog, public Ui::RouteDialogBase {
+ Q_OBJECT
+
+ virtual void closeEvent(QCloseEvent*);
+ void routingChanged();
+
+ private slots:
+ void routeSelectionChanged();
+ void removeRoute();
+ void addRoute();
+ void srcSelectionChanged();
+ void dstSelectionChanged();
+ void songChanged(int);
+
+ signals:
+ void closed();
+
+ public:
+ RouteDialog(QWidget* parent);
+ };
+
+
+#endif
+
diff --git a/muse/muse/mixer/routedialog.ui b/muse/muse/mixer/routedialog.ui
new file mode 100644
index 00000000..be34c451
--- /dev/null
+++ b/muse/muse/mixer/routedialog.ui
@@ -0,0 +1,170 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>RouteDialogBase</class>
+ <widget class="QDialog" name="RouteDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>316</width>
+ <height>383</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Routing</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>4</number>
+ </property>
+ <property name="spacing" >
+ <number>4</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="groupBox4" >
+ <property name="title" >
+ <string>Add Route</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>4</number>
+ </property>
+ <property name="spacing" >
+ <number>4</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="groupBox2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Source:</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>2</number>
+ </property>
+ <property name="spacing" >
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QListWidget" name="newSrcList" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Destination:</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>2</number>
+ </property>
+ <property name="spacing" >
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QListWidget" name="newDstList" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QToolButton" name="connectButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>connect source to destination</string>
+ </property>
+ <property name="text" >
+ <string>Connect</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox1" >
+ <property name="title" >
+ <string>Current Routes</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>4</number>
+ </property>
+ <property name="spacing" >
+ <number>4</number>
+ </property>
+ <item>
+ <widget class="QListWidget" name="routeList" />
+ </item>
+ <item>
+ <widget class="QToolButton" name="removeButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>remove selected route</string>
+ </property>
+ <property name="text" >
+ <string>Remove</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/mixer/strip.cpp b/muse/muse/mixer/strip.cpp
new file mode 100644
index 00000000..a995f7e2
--- /dev/null
+++ b/muse/muse/mixer/strip.cpp
@@ -0,0 +1,119 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: strip.cpp,v 1.40 2006/01/11 16:14:29 wschweer Exp $
+//
+// (C) Copyright 2000-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "gconfig.h"
+#include "song.h"
+#include "strip.h"
+#include "muse.h"
+#include "widgets/simplebutton.h"
+#include "widgets/utils.h"
+
+//---------------------------------------------------------
+// resetPeaks
+//---------------------------------------------------------
+
+void Strip::resetPeaks()
+ {
+ track->resetPeaks();
+ }
+
+//---------------------------------------------------------
+// updateLabel
+//---------------------------------------------------------
+
+void Strip::updateLabel()
+ {
+ QPalette p = label->palette();
+ p.setColor(label->backgroundRole(), track->ccolor());
+ label->setPalette(p);
+
+ // qt4.1.0 specific
+ label->setAutoFillBackground(true);
+
+ label->setFont(*config.fonts[4]);
+ label->setText(track->name());
+ label->setToolTip(track->name());
+ }
+
+//---------------------------------------------------------
+// Strip
+// create mixer strip
+//---------------------------------------------------------
+
+Strip::Strip(Mixer* m, Track* t, bool align)
+ : QFrame()
+ {
+ setAttribute(Qt::WA_DeleteOnClose, true);
+ mixer = m;
+ _align = align;
+ setFrameStyle(QFrame::Panel | QFrame::Raised);
+ setLineWidth(2);
+
+ track = t;
+ setFixedWidth(STRIP_WIDTH);
+ layout = new QVBoxLayout;
+ layout->setMargin(0);
+ layout->setSpacing(0);
+ setLayout(layout);
+
+ //---------------------------------------------
+ // label
+ //---------------------------------------------
+
+ label = new QLabel;
+ label->setFixedHeight(LABEL_HEIGHT);
+ label->setTextFormat(Qt::PlainText);
+ label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
+ label->setLineWidth(2);
+ label->setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
+ updateLabel();
+ layout->addWidget(label);
+ connect(muse, SIGNAL(configChanged()), SLOT(configChanged()));
+ connect(track, SIGNAL(controllerChanged(int)), SLOT(controllerChanged(int)));
+ }
+
+//---------------------------------------------------------
+// Strip
+//---------------------------------------------------------
+
+Strip::~Strip()
+ {
+ }
+
+//---------------------------------------------------------
+// configChanged
+//---------------------------------------------------------
+
+void Strip::configChanged()
+ {
+ updateLabel();
+ }
+
+//---------------------------------------------------------
+// addAutomationButtons
+//---------------------------------------------------------
+
+void Strip::addAutomationButtons()
+ {
+ QHBoxLayout* aBox = new QHBoxLayout;
+ SimpleButton* ar = newAutoReadButton(this);
+ ar->setFixedSize(buttonSize);
+ ar->setChecked(track->autoRead());
+ aBox->addWidget(ar);
+ SimpleButton* aw = newAutoWriteButton(this);
+ aw->setFixedSize(buttonSize);
+ aw->setChecked(track->autoWrite());
+ aBox->addWidget(aw);
+ layout->addLayout(aBox);
+ connect(ar, SIGNAL(clicked(bool)), SLOT(autoReadToggled(bool)));
+ connect(aw, SIGNAL(clicked(bool)), SLOT(autoWriteToggled(bool)));
+ connect(track, SIGNAL(autoReadChanged(bool)), ar, SLOT(setChecked(bool)));
+ connect(track, SIGNAL(autoWriteChanged(bool)), aw, SLOT(setChecked(bool)));
+ }
+
+
diff --git a/muse/muse/mixer/strip.h b/muse/muse/mixer/strip.h
new file mode 100644
index 00000000..da59d39d
--- /dev/null
+++ b/muse/muse/mixer/strip.h
@@ -0,0 +1,57 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: strip.h,v 1.21 2006/01/12 14:49:13 wschweer Exp $
+//
+// (C) Copyright 2000-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __STRIP_H__
+#define __STRIP_H__
+
+#include "globaldefs.h"
+#include "gui.h"
+
+class Track;
+class Meter;
+class SimpleButton;
+class Mixer;
+
+static const QSize buttonSize(STRIP_WIDTH/2-2, STRIP_WIDTH/3);
+static const QSize entrySize(STRIP_WIDTH/2-2, 17);
+
+//---------------------------------------------------------
+// Strip
+//---------------------------------------------------------
+
+class Strip : public QFrame {
+ Q_OBJECT
+
+ protected:
+ Mixer* mixer;
+ Track* track;
+ QLabel* label;
+ QVBoxLayout* layout;
+
+ SimpleButton* solo;
+ SimpleButton* mute;
+ void updateLabel();
+ bool _align; // align elements for mixer app
+
+ void recordToggled(bool);
+ void addAutomationButtons();
+
+ public slots:
+ void resetPeaks();
+ virtual void songChanged(int) = 0;
+ virtual void controllerChanged(int) {}
+ void configChanged();
+
+ public:
+ Strip(Mixer* m, Track* t, bool align);
+ ~Strip();
+ Track* getTrack() const { return track; }
+ };
+
+#endif
+
diff --git a/muse/muse/mpevent.cpp b/muse/muse/mpevent.cpp
new file mode 100644
index 00000000..a3f549f4
--- /dev/null
+++ b/muse/muse/mpevent.cpp
@@ -0,0 +1,122 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "mpevent.h"
+
+#include "helper.h"
+#include "event.h"
+#include "midictrl.h"
+#include "muse/midi.h"
+
+//---------------------------------------------------------
+// MidiEvent
+//---------------------------------------------------------
+
+MidiEvent::MidiEvent(unsigned t, int tpe, const unsigned char* data, int len)
+ {
+ _time = t;
+ edata.setData(data, len);
+ _type = tpe;
+ }
+
+MidiEvent::MidiEvent(unsigned tick, int channel, const Event& e)
+ {
+ setChannel(channel);
+ setTime(tick);
+ switch(e.type()) {
+ case Note:
+ setType(ME_NOTEON);
+ setA(e.dataA());
+ setB(e.dataB());
+ break;
+ case Controller:
+ setType(ME_CONTROLLER);
+ setA(e.dataA()); // controller number
+ setB(e.dataB()); // controller value
+ break;
+ case PAfter:
+ setType(ME_POLYAFTER);
+ setA(e.dataA());
+ setB(e.dataB());
+ break;
+ case CAfter:
+ setType(ME_AFTERTOUCH);
+ setA(e.dataA());
+ setB(0);
+ break;
+ case Sysex:
+ setType(ME_SYSEX);
+ setData(e.eventData());
+ break;
+ default:
+ printf("MEvent::MEvent(): event type %d not implemented\n",
+ type());
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void MidiEvent::dump() const
+ {
+ printf("chan:%d ", _channel+1);
+ if (_type == 0x90) { // NoteOn
+ QString s = pitch2string(_a);
+ printf("NoteOn %3s(0x%02x) %3d\n", s.toLatin1().data(), _a, _b);
+ }
+ else if (_type == 0xf0) {
+ printf("SysEx len %d ", len());
+ int n = len() < 7 ? len() : 7;
+ unsigned char* p = data();
+ for (int i = 0; i < n; ++i)
+ printf("%02x ", *p++);
+ printf("\n");
+ }
+ else if (_type == 0xb0)
+ printf("Ctrl %d(0x%02x) %d(0x%02x)\n", _a, _a, _b, _b);
+ else if (_type == 0xc0)
+ printf("Prog %d(0x%02x)\n", _a, _a);
+ else if (_type == 0xd0)
+ printf("Aftertouch %d\n", _a);
+ else
+ printf("type:0x%02x a=%d(0x%02x) b=%d(0x%02x)\n", _type, _a, _a, _b, _b);
+ }
+
+//---------------------------------------------------------
+// operator <
+//---------------------------------------------------------
+
+bool MidiEvent::operator<(const MidiEvent& e) const
+ {
+ if (time() != e.time())
+ return time() < e.time();
+
+ // play note off events first to prevent overlapping
+ // notes
+
+ if (channel() == e.channel())
+ return type() == ME_NOTEOFF
+ || (type() == ME_NOTEON && dataB() == 0);
+
+ int map[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, 13, 14, 15 };
+ return map[channel()] < map[e.channel()];
+ }
diff --git a/muse/muse/mpevent.h b/muse/muse/mpevent.h
new file mode 100644
index 00000000..3712a607
--- /dev/null
+++ b/muse/muse/mpevent.h
@@ -0,0 +1,118 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MPEVENT_H__
+#define __MPEVENT_H__
+
+#include <set>
+#include "evdata.h"
+#include <ext/mt_allocator.h>
+
+#include "midi.h"
+
+class Event;
+class EvData;
+
+//---------------------------------------------------------
+// MidiEvent
+//---------------------------------------------------------
+
+class MidiEvent {
+ unsigned _time;
+ EvData edata;
+ unsigned char _channel, _type;
+ int _a, _b;
+
+ public:
+ MidiEvent() {}
+ MidiEvent(unsigned tm, int c, int t, int a, int b)
+ : _time(tm), _channel(c & 0xf), _type(t), _a(a), _b(b) {}
+ MidiEvent(unsigned t, int type, const unsigned char* data, int len);
+ MidiEvent(unsigned t, int tpe, EvData d) : _time(t), edata(d), _type(tpe) {}
+ MidiEvent(unsigned t, int channel, const Event& e);
+
+ ~MidiEvent() {}
+
+ MidiEvent& operator=(const MidiEvent& ed) {
+ _time = ed._time;
+ edata = ed.edata;
+ _channel = ed._channel;
+ _type = ed._type;
+ _a = ed._a;
+ _b = ed._b;
+ return *this;
+ }
+
+ int channel() const { return _channel; }
+ int type() const { return _type; }
+ int dataA() const { return _a; }
+ int dataB() const { return _b; }
+ unsigned time() const { return _time; }
+
+ void setChannel(int val) { _channel = val; }
+ void setType(int val) { _type = val; }
+ void setA(int val) { _a = val; }
+ void setB(int val) { _b = val; }
+ void setTime(unsigned val) { _time = val; }
+
+ const EvData& eventData() const { return edata; }
+ unsigned char* data() const { return edata.data; }
+ int len() const { return edata.dataLen; }
+ void setData(const EvData& e) { edata = e; }
+ void setData(const unsigned char* p, int len) { edata.setData(p, len); }
+ void dump() const;
+ bool isNote() const { return _type == ME_NOTEON; }
+ bool isNoteOff() const { return (_type == ME_NOTEOFF)||(_type == ME_NOTEON && _b == 0); }
+ bool operator<(const MidiEvent&) const;
+ };
+
+//---------------------------------------------------------
+// MPEventList
+//---------------------------------------------------------
+
+// typedef std::multiset<MidiEvent, std::less<MidiEvent>,
+// __gnu_cxx::__mt_alloc<MidiEvent> > MPEL;
+
+typedef std::multiset<MidiEvent, std::less<MidiEvent> > MPEL;
+
+struct MPEventList : public MPEL {
+ void add(const MidiEvent& ev) { MPEL::insert(ev); }
+ };
+
+typedef MPEventList::iterator iMPEvent;
+typedef MPEventList::const_iterator ciMPEvent;
+
+//---------------------------------------------------------
+// MREventList
+//---------------------------------------------------------
+
+// typedef std::list<MidiEvent, __gnu_cxx::__mt_alloc<MidiEvent> > MREL;
+
+typedef std::list<MidiEvent> MREL;
+
+struct MREventList : public MREL {
+ void add(const MidiEvent& ev) { MREL::push_back(ev); }
+ };
+
+typedef MREventList::iterator iMREvent;
+typedef MREventList::const_iterator ciMREvent;
+
+#endif
+
diff --git a/muse/muse/mtc.cpp b/muse/muse/mtc.cpp
new file mode 100644
index 00000000..54ed5584
--- /dev/null
+++ b/muse/muse/mtc.cpp
@@ -0,0 +1,131 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al/al.h"
+#include "mtc.h"
+
+//---------------------------------------------------------
+// MTC::time
+// converts MTC Time to seconds according to
+// global mtcType
+//---------------------------------------------------------
+
+double MTC::time() const
+ {
+ double time = _h * 3600 + _m * 60 + _s;
+ double ft = 0.0;
+ switch (AL::mtcType) {
+ case 0: // 24 frames sec
+ ft = 1.0/24.0;
+ break;
+ case 1: // 25
+ ft = 0.04;
+ break;
+ case 2: // 30 drop frame TODO
+ case 3: // 30 non drop frame
+ ft = 1.0/30.0;
+ break;
+ }
+ return time + ft *_f + 0.01 * ft * _sf;
+ }
+
+//---------------------------------------------------------
+// MTC
+//---------------------------------------------------------
+
+MTC::MTC(double t)
+ {
+ _h = int(t/3600);
+ t -= _h * 3600;
+ _m = int(t/60);
+ t -= _m * 60;
+ _s = int(t);
+ t -= _s;
+ double ft = 1.0/24.0;
+ switch (AL::mtcType) {
+ case 0: // 24 frames sec
+ ft = 1.0/24.0;
+ break;
+ case 1: // 25
+ ft = 0.04;
+ break;
+ case 2: // 30 drop frame
+ case 3: // 30 non drop frame
+ ft = 1.0/30.0;
+ break;
+ }
+ double frames = t / ft;
+ _f = int(frames);
+ frames -= _f;
+ _sf = int(frames * 100);
+ }
+
+//---------------------------------------------------------
+// incQuarter
+// increment MTC time one quarter frame time
+//---------------------------------------------------------
+
+void MTC::incQuarter()
+ {
+ int frames = 24;
+ switch (AL::mtcType) {
+ case 0:
+ frames = 24;
+ break;
+ case 1:
+ frames = 25;
+ break;
+ case 2:
+ case 3:
+ frames = 30;
+ break;
+ }
+ _sf += 25;
+ if (_sf >= 100) {
+ ++_f;
+ _sf -= 100;
+ }
+ if (_f == frames) {
+ ++_s;
+ _f = 0;
+ }
+ if (_s == 60) {
+ ++_m;
+ _s = 0;
+ }
+ if (_m == 60) {
+ ++_h;
+ _m = 0;
+ }
+ if (_h == 24) {
+ _h = 0;
+ }
+ }
+
+//---------------------------------------------------------
+// print
+//---------------------------------------------------------
+
+void MTC::print() const
+ {
+ printf("%02d:%02d:%02d:%02d:%02d", _h, _m, _s, _f, _sf);
+ }
+
+
diff --git a/muse/muse/mtc.h b/muse/muse/mtc.h
new file mode 100644
index 00000000..862bc5b1
--- /dev/null
+++ b/muse/muse/mtc.h
@@ -0,0 +1,68 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __MTC_H__
+#define __MTC_H__
+
+//---------------------------------------------------------
+// MTC
+//---------------------------------------------------------
+
+class MTC {
+ unsigned char _h, _m, _s, _f, _sf;
+
+ public:
+ MTC(int h, int m, int s, int f, int sf=0) {
+ _h = h;
+ _m = m;
+ _s = s;
+ _f = f;
+ _sf = sf;
+ }
+ MTC() {
+ _h = _m = _s = _f = _sf = 0;
+ }
+ MTC(double);
+ void set(int h, int m, int s, int f, int sf=0) {
+ _h = h;
+ _m = m;
+ _s = s;
+ _f = f;
+ _sf = sf;
+ }
+ void incQuarter();
+ void setH(int val) { _h = val; }
+ void setM(int val) { _m = val; }
+ void setS(int val) { _s = val; }
+ void setF(int val) { _f = val; }
+ void setSf(int val) { _sf = val; }
+
+ int h() const { return _h; }
+ int m() const { return _m; }
+ int s() const { return _s; }
+ int f() const { return _f; }
+ int sf() const { return _sf; }
+ double time() const;
+ void print() const;
+ };
+
+
+#endif
+
diff --git a/muse/muse/muse.cpp b/muse/muse/muse.cpp
new file mode 100644
index 00000000..19bc5ab1
--- /dev/null
+++ b/muse/muse/muse.cpp
@@ -0,0 +1,3048 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "config.h"
+#include <sys/mman.h>
+#include "muse.h"
+#include "transport.h"
+#include "widgets/bigtime.h"
+#include "arranger/arranger.h"
+#include "midiedit/pianoroll.h"
+#include "al/xml.h"
+#include "conf.h"
+#include "liste/listedit.h"
+#include "master/masteredit.h"
+#include "midiedit/drumedit.h"
+#include "mixer/mixer.h"
+#include "driver/audiodev.h"
+#include "waveedit/waveedit.h"
+#include "icons.h"
+#include "widgets/mixdowndialog.h"
+#include "midictrl.h"
+#include "widgets/filedialog.h"
+#include "plugin.h"
+#include "marker/markerview.h"
+#include "transpose.h"
+#include "appearance.h"
+#include "widgets/gatetime.h"
+#include "audio.h"
+#include "midiseq.h"
+#include "audioprefetch.h"
+#include "audiowriteback.h"
+#include "widgets/shortcutconfig.h"
+#include "gconfig.h"
+#include "ticksynth.h"
+#include "song.h"
+#include "awl/poslabel.h"
+#include "al/tempo.h"
+#include "shortcuts.h"
+#include "driver/alsamidi.h"
+#include "midiplugin.h"
+#include "midiedit/drummap.h"
+#include "widgets/utils.h"
+#include "instruments/editinstrument.h"
+#include "part.h"
+
+static pthread_t watchdogThread;
+
+static const char* fileOpenText =
+ QT_TR_NOOP("Click this button to open a <em>new song</em>.<br>"
+ "You can also select the <b>Open command</b> from the File menu.");
+static const char* fileSaveText =
+ QT_TR_NOOP("Click this button to save the song you are "
+ "editing. You will be prompted for a file name.\n"
+ "You can also select the Save command from the File menu.");
+static const char* fileNewText = QT_TR_NOOP("Create New Song");
+
+static const char* infoLoopButton = QT_TR_NOOP("loop between left mark and right mark");
+static const char* infoPunchinButton = QT_TR_NOOP("record starts at left mark");
+static const char* infoPunchoutButton = QT_TR_NOOP("record stops at right mark");
+static const char* infoStartButton = QT_TR_NOOP("rewind to start position");
+static const char* infoRewindButton = QT_TR_NOOP("rewind current position");
+static const char* infoForwardButton = QT_TR_NOOP("move current position");
+static const char* infoStopButton = QT_TR_NOOP("stop sequencer");
+static const char* infoPlayButton = QT_TR_NOOP("start sequencer play");
+static const char* infoRecordButton = QT_TR_NOOP("to record press record and then play");
+static const char* infoPanicButton = QT_TR_NOOP("send note off to all midi channels");
+
+#define PROJECT_LIST_LEN 6
+static QString* projectList[PROJECT_LIST_LEN];
+
+extern void initIcons();
+extern void initMidiSynth();
+extern bool initDummyAudio();
+extern void initVST();
+extern void initDSSI();
+extern bool initJackAudio();
+extern void exitJackAudio();
+
+int watchAudio, watchAudioPrefetch, watchMidi;
+pthread_t splashThread;
+MusE* muse;
+
+//
+// Arranger Snap values
+//
+
+struct RasterVal {
+ int val;
+ QString label;
+ };
+
+static RasterVal rasterTable[] = {
+ { 1, QT_TR_NOOP("Off") },
+ { 0, QT_TR_NOOP("Bar") },
+ { 2 * config.division, "1/2" },
+ { config.division, "1/4" },
+ { config.division/2, "1/8" },
+ { config.division/4, "1/16" }
+ };
+
+//---------------------------------------------------------
+// watchdog thread
+// realtime priorities are:
+// realTimePriority - priority of jack thread
+// realTimePriority+1 - priority of midi thread
+// realTimePriority+2 - priority of watchdog thread
+//---------------------------------------------------------
+
+static void* watchdog(void*)
+ {
+ int policy;
+ if ((policy = sched_getscheduler (0)) < 0)
+ printf("Cannot get current client scheduler: %s\n", strerror(errno));
+ if (policy != SCHED_FIFO)
+ printf("MusE: watchdog process _NOT_ running SCHED_FIFO\n");
+
+ int fatal = 0;
+ for (;;) {
+ watchAudio = 0;
+ watchMidi = 0;
+ static const int WD_TIMEOUT = 3;
+
+ int to = WD_TIMEOUT;
+ while (to > 0) // sleep can be interrupted by signal
+ to = sleep(to);
+
+ bool timeout = false;
+ if (watchMidi == 0)
+ timeout = true;
+ if (watchAudio == 0)
+ timeout = true;
+ if (watchAudio > 500000)
+ timeout = true;
+ if (watchMidi > (config.rtcTicks * WD_TIMEOUT * 2))
+ timeout = true;
+ if (timeout)
+ ++fatal;
+ else
+ fatal = 0;
+ if (fatal >= 3) {
+ printf("MusE: WatchDog: fatal error, realtime task timeout\n");
+ printf(" (%d,%d-%d) - stopping all services\n",
+ watchMidi, watchAudio, fatal);
+ break;
+ }
+// printf("wd %d %d %d\n", watchMidi, watchAudio, fatal);
+ }
+ audio->stop(true);
+ audioWriteback->stop(true);
+ audioPrefetch->stop(true);
+ fatalError("watchdog timeout");
+ return 0;
+ }
+
+//---------------------------------------------------------
+// seqStart
+//---------------------------------------------------------
+
+bool MusE::seqStart()
+ {
+ if (audioState != AUDIO_STOP) {
+ printf("seqStart(): already running\n");
+ return true;
+ }
+ audioState = AUDIO_START1;
+ if (!audio->start()) {
+ QMessageBox::critical( muse, tr("Failed to start audio!"),
+ tr("Was not able to start audio, check if jack is running.\n"));
+ return false;
+ }
+ //
+ // wait for jack callback
+ //
+ for (int i = 0; i < 60; ++i) {
+ if (audioState == AUDIO_START2)
+ break;
+ sleep(1);
+ }
+ if (audioState != AUDIO_START2) {
+ QMessageBox::critical( muse, tr("Failed to start audio!"),
+ tr("Was not able to start audio, check if jack is running.\n"));
+ }
+ //
+ // now its safe to ask the driver for realtime
+ // priority
+
+ realTimePriority = audioDriver->realtimePriority();
+
+ //
+ // create midi thread with a higher priority than JACK
+ //
+ midiSeq->start(realTimePriority ? realTimePriority + 1 : 0);
+
+ if (realTimePriority) {
+ //
+ // create watchdog thread with realTimePriority+2
+ //
+ int priority = realTimePriority + 2;
+ struct sched_param rt_param;
+ memset(&rt_param, 0, sizeof(rt_param));
+ rt_param.sched_priority = priority;
+
+ pthread_attr_t* attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t));
+ pthread_attr_init(attributes);
+
+ if (pthread_attr_setschedpolicy(attributes, SCHED_FIFO)) {
+ printf("MusE: cannot set FIFO scheduling class for RT thread\n");
+ }
+ if (pthread_attr_setschedparam (attributes, &rt_param)) {
+ // printf("Cannot set scheduling priority for RT thread (%s)\n", strerror(errno));
+ }
+ if (pthread_attr_setscope (attributes, PTHREAD_SCOPE_SYSTEM)) {
+ printf("MusE: Cannot set scheduling scope for RT thread\n");
+ }
+ if (pthread_attr_setinheritsched(attributes, PTHREAD_EXPLICIT_SCHED)) {
+ printf("Cannot set setinheritsched for RT thread\n");
+ }
+ int rv;
+ if ((rv = pthread_create(&watchdogThread, attributes, ::watchdog, 0)))
+ fprintf(stderr, "MusE: creating watchdog thread failed: %s\n",
+ strerror(rv));
+ pthread_attr_destroy(attributes);
+ }
+#if 0
+ audioPrefetch->start(0);
+ audioWriteback->start(0);
+#else
+ audioPrefetch->start(realTimePriority-5);
+ audioWriteback->start(realTimePriority-5);
+#endif
+ audioState = AUDIO_RUNNING;
+ //
+ // do connections
+ //
+ TrackList* tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ (*i)->activate2();
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// stop
+//---------------------------------------------------------
+
+void MusE::seqStop()
+ {
+ audio->msgIdle(true);
+ song->setStop(true);
+ song->setStopPlay(false);
+ midiSeq->stop(true);
+ audio->stop(true);
+ audioWriteback->stop(true);
+ audioPrefetch->stop(true);
+ if (realTimePriority)
+ pthread_cancel(watchdogThread);
+ audioState = AUDIO_STOP;
+ }
+
+//---------------------------------------------------------
+// seqRestart
+//---------------------------------------------------------
+
+bool MusE::seqRestart()
+ {
+ bool restartSequencer = audioState == AUDIO_RUNNING;
+ if (restartSequencer) {
+ if (audio->isPlaying()) {
+ audio->msgPlay(false);
+ while (audio->isPlaying())
+ qApp->processEvents();
+ }
+ seqStop();
+ }
+
+ if (!seqStart())
+ return false;
+
+ audioDriver->graphChanged();
+ return true;
+ }
+
+//---------------------------------------------------------
+// addProject
+//---------------------------------------------------------
+
+void addProject(const QFileInfo& f)
+ {
+ QString name(f.absoluteFilePath());
+ for (int i = 0; i < PROJECT_LIST_LEN; ++i) {
+ if (projectList[i] == 0)
+ break;
+ if (name == *projectList[i]) {
+ int dst = i;
+ int src = i+1;
+ int n = PROJECT_LIST_LEN - i - 1;
+ delete projectList[i];
+ for (int k = 0; k < n; ++k)
+ projectList[dst++] = projectList[src++];
+ projectList[dst] = 0;
+ break;
+ }
+ }
+ QString** s = &projectList[PROJECT_LIST_LEN - 2];
+ QString** d = &projectList[PROJECT_LIST_LEN - 1];
+ if (*d)
+ delete *d;
+ for (int i = 0; i < PROJECT_LIST_LEN-1; ++i)
+ *d-- = *s--;
+ projectList[0] = new QString(name);
+ }
+
+//---------------------------------------------------------
+// populateAddTrack
+// this is also used in "mixer"
+//---------------------------------------------------------
+
+void populateAddTrack(QMenu* m)
+ {
+ m->clear();
+ QAction* a;
+
+ a = m->addSeparator();
+ a->setText(QT_TR_NOOP("Midi"));
+ QFont f(a->font());
+ f.setBold(true);
+ a->setFont(f);
+
+ a = m->addAction(QIcon(*addtrack_addmiditrackIcon), QT_TR_NOOP("Add Midi Track"));
+ a->setData(Track::MIDI);
+
+ a = m->addAction(QIcon(*addtrack_addmiditrackIcon), QT_TR_NOOP("Add Midi Output Port"));
+ a->setData(Track::MIDI_OUT);
+
+ a = m->addAction(QIcon(*addtrack_addmiditrackIcon), QT_TR_NOOP("Add Midi Input Port"));
+ a->setData(Track::MIDI_IN);
+
+ QMenu* ps = m->addMenu(QMenu::tr("Add Midi Generator..."));
+
+ int idx = 5000;
+ for (iMidiPlugin i = midiPlugins.begin(); i != midiPlugins.end(); ++i) {
+ if ((*i)->type() != MEMPI_GENERATOR)
+ continue;
+ a = ps->addAction((*i)->name());
+ a->setData(idx);
+ }
+
+ if (!midiOnly) {
+ a = m->addSeparator();
+ a->setText(QT_TR_NOOP("Audio Strips"));
+ a->setFont(f);
+
+ a = m->addAction(QIcon(*addtrack_wavetrackIcon), QT_TR_NOOP("Add Wave Track"));
+ a->setData(Track::WAVE);
+ a = m->addAction(QIcon(*addtrack_audiooutputIcon), QT_TR_NOOP("Add Audio Output"));
+ a->setData(Track::AUDIO_OUTPUT);
+ a = m->addAction(QIcon(*addtrack_audiogroupIcon), QT_TR_NOOP("Add Audio Group"));
+ a->setData(Track::AUDIO_GROUP);
+ a = m->addAction(QIcon(*addtrack_audioinputIcon), QT_TR_NOOP("Add Audio Input"));
+ a->setData(Track::AUDIO_INPUT);
+ a = m->addAction(QIcon(*addtrack_auxsendIcon), QT_TR_NOOP("Add Aux Send"));
+ a->setData(Track::AUDIO_AUX);
+
+ ps = m->addMenu(QMenu::tr("Add Soft Synth..."));
+
+ int idx = 1000;
+ for (std::vector<Synth*>::iterator is = synthis.begin(); is != synthis.end(); ++is, ++idx) {
+ a = ps->addAction((*is)->name());
+ a->setData(idx);
+ }
+ }
+ m->connect(m, SIGNAL(triggered(QAction*)), song, SLOT(addTrack(QAction*)));
+ }
+
+//---------------------------------------------------------
+// setupTransportToolbar
+//---------------------------------------------------------
+
+void MusE::setupTransportToolbar(QToolBar* tb) const
+ {
+ tb->addAction(loopAction);
+ tb->addAction(punchinAction);
+ tb->addAction(punchoutAction);
+ tb->addAction(startAction);
+
+ QToolButton* rewindTb = new QToolButton;
+ rewindTb->setDefaultAction(rewindAction);
+ rewindTb->setAutoRepeat(true);
+ tb->addWidget(rewindTb);
+ tb->connect(rewindTb, SIGNAL(clicked()), song, SLOT(rewind()));
+
+ QToolButton* forwardTb = new QToolButton;
+ forwardTb->setDefaultAction(forwardAction);
+ forwardTb->setAutoRepeat(true);
+ tb->addWidget(forwardTb);
+ tb->connect(forwardTb, SIGNAL(clicked()), song, SLOT(forward()));
+
+ tb->addAction(stopAction);
+ tb->addAction(playAction);
+ tb->addAction(recordAction);
+ }
+
+//---------------------------------------------------------
+// MusE
+//---------------------------------------------------------
+
+MusE::MusE()
+ : QMainWindow()
+ {
+ setupUi(this);
+ setIconSize(ICON_SIZE);
+ setFocusPolicy(Qt::WheelFocus);
+
+ muse = this; // hack
+ midiSyncConfig = 0;
+ midiRemoteConfig = 0;
+ midiPortConfig = 0;
+ metronomeConfig = 0;
+ audioConfig = 0;
+ midiFileConfig = 0;
+ midiFilterConfig = 0;
+ midiInputTransform = 0;
+ midiRhythmGenerator = 0;
+ globalSettingsConfig = 0;
+ softSynthesizerConfig = 0;
+ midiTransformerDialog = 0;
+ shortcutConfig = 0;
+ appearance = 0;
+ editInstrument = 0;
+ appName = QString("MusE");
+ _raster = 0;
+ audioState = AUDIO_STOP;
+ bigtime = 0;
+ mixer1 = 0;
+ mixer2 = 0;
+ markerView = 0;
+ exportMidiDialog = 0;
+
+ song->blockSignals(true);
+ heartBeatTimer = new QTimer(this);
+ connect(heartBeatTimer, SIGNAL(timeout()), song, SLOT(beat()));
+
+ //---------------------------------------------------
+ // undo/redo
+ //---------------------------------------------------
+
+ undoAction = new QAction(QIcon(*undoIcon), tr("Und&o"), this);
+ undoAction->setShortcut(Qt::CTRL + Qt::Key_Z);
+ undoAction->setWhatsThis(tr("undo last change to song"));
+ undoAction->setEnabled(false);
+ undoAction->setData(-1);
+ connect(undoAction, SIGNAL(triggered()), song, SLOT(undo()));
+ redoAction = new QAction(QIcon(*redoIcon), tr("Re&do"), this);
+ redoAction->setShortcut(Qt::CTRL + Qt::Key_Y);
+ redoAction->setWhatsThis(tr("redo last undo"));
+ redoAction->setEnabled(false);
+ redoAction->setData(-1);
+ connect(redoAction, SIGNAL(triggered()), song, SLOT(redo()));
+
+ //---------------------------------------------------
+ // Transport
+ //---------------------------------------------------
+
+ loopAction = new QAction(QIcon(*loop1Icon), tr("Loop"), this);
+ loopAction->setWhatsThis(tr(infoLoopButton));
+ loopAction->setCheckable(true);
+ connect(loopAction, SIGNAL(toggled(bool)), song, SLOT(setLoop(bool)));
+
+ punchinAction = new QAction(QIcon(*punchin1Icon), tr("Punchin"), this);
+ punchinAction->setWhatsThis(tr(infoPunchinButton));
+ punchinAction->setCheckable(true);
+ connect(punchinAction, SIGNAL(toggled(bool)), song, SLOT(setPunchin(bool)));
+
+ punchoutAction = new QAction(QIcon(*punchout1Icon), tr("Punchout"), this);
+ punchoutAction->setWhatsThis(tr(infoPunchoutButton));
+ punchoutAction->setCheckable(true);
+ connect(punchoutAction, SIGNAL(toggled(bool)), song, SLOT(setPunchout(bool)));
+
+ startAction->setWhatsThis(tr(infoStartButton));
+ connect(startAction, SIGNAL(triggered()), song, SLOT(rewindStart()));
+
+// rewindAction = new QAction(QIcon(*frewindIcon), tr("Rewind"), this);
+ rewindAction->setWhatsThis(tr(infoRewindButton));
+
+// forwardAction = new QAction(QIcon(*fforwardIcon), tr("Forward"), this);
+ forwardAction->setWhatsThis(tr(infoForwardButton));
+
+// stopAction = new QAction(QIcon(*stopIcon), tr("Stop"), this);
+ stopAction->setWhatsThis(tr(infoStopButton));
+// stopAction->setCheckable(true);
+// stopAction->setChecked(true);
+ connect(stopAction, SIGNAL(triggered(bool)), song, SLOT(setStop(bool)));
+
+// playAction = new QAction(QIcon(*playIcon), tr("Play"), this);
+ playAction->setWhatsThis(tr(infoPlayButton));
+// playAction->setCheckable(true);
+// playAction->setChecked(false);
+ connect(playAction, SIGNAL(triggered(bool)), song, SLOT(setPlay(bool)));
+
+ recordAction = new QAction(*recordIcon, tr("Record"), this);
+ recordAction->setWhatsThis(tr(infoRecordButton));
+ recordAction->setCheckable(true);
+ connect(recordAction, SIGNAL(triggered(bool)), song, SLOT(setRecord(bool)));
+
+ panicAction = new QAction(QIcon(*panicIcon), tr("Panic"), this);
+ panicAction->setWhatsThis(tr(infoPanicButton));
+ connect(panicAction, SIGNAL(triggered()), song, SLOT(panic()));
+
+ initMidiInstruments();
+
+ if (alsaMidi.init()) {
+ QMessageBox::critical(NULL, "MusE fatal error.",
+ "MusE failed to initialize the\n"
+ "Alsa midi subsystem, check\n"
+ "your configuration.");
+ fatalError("init alsa failed");
+ }
+ midiDriver = &alsaMidi;
+
+ //----Actions
+
+ fileNewAction = new QAction(*filenewIcon, tr("&New"), this);
+ fileNewAction->setToolTip(tr(fileNewText));
+ fileNewAction->setWhatsThis(tr(fileNewText));
+
+ fileOpenAction = new QAction(QIcon(*openIcon), tr("&Open"), this);
+ fileOpenAction->setToolTip(tr(fileOpenText));
+ fileOpenAction->setWhatsThis(tr(fileOpenText));
+
+ fileSaveAction = new QAction(QIcon(*saveIcon), tr("&Save"), this);
+ fileSaveAction->setToolTip(tr(fileSaveText));
+ fileSaveAction->setWhatsThis(tr(fileSaveText));
+
+ pianoAction = new QAction(*pianoIconSet, tr("Pianoroll"), this);
+ connect(pianoAction, SIGNAL(triggered()), SLOT(startPianoroll()));
+
+ connect(fileNewAction, SIGNAL(triggered()), SLOT(loadTemplate()));
+ connect(fileOpenAction, SIGNAL(triggered()), SLOT(loadProject()));
+ connect(fileSaveAction, SIGNAL(triggered()), SLOT(save()));
+
+ //--------------------------------------------------
+ // Toolbar
+ //--------------------------------------------------
+
+ tools = new QToolBar(tr("File Buttons"));
+ addToolBar(tools);
+
+ tools->addAction(fileNewAction);
+ tools->addAction(fileOpenAction);
+ tools->addAction(fileSaveAction);
+ tools->addAction(QWhatsThis::createAction(this));
+
+ tools->addSeparator();
+ tools->addAction(undoAction);
+ tools->addAction(redoAction);
+
+ tools1 = new EditToolBar(this, arrangerTools);
+ addToolBar(tools1);
+
+ QToolBar* transportToolbar = addToolBar(tr("Transport"));
+ setupTransportToolbar(transportToolbar);
+
+ QToolBar* panicToolbar = new QToolBar(tr("Panic"), this);
+ addToolBar(panicToolbar);
+ panicToolbar->addAction(panicAction);
+
+ addToolBarBreak();
+
+ audio = new Audio();
+ audioPrefetch = new AudioPrefetch("Prefetch");
+ audioWriteback = new AudioWriteback("Writeback");
+ midiSeq = new MidiSeq("Midi");
+
+ //---------------------------------------------------
+ // MenuBar
+ //---------------------------------------------------
+
+ QMenuBar* mb = menuBar();
+
+ //-------------------------------------------------------------
+ // File
+ //-------------------------------------------------------------
+
+ menu_file = mb->addMenu(tr("&File"));
+
+ menu_file->addAction(fileNewAction);
+ menu_file->addAction(fileOpenAction);
+
+ openRecent = new QMenu(tr("Open &Recent"), this);
+ connect(openRecent, SIGNAL(aboutToShow()), this, SLOT(openRecentMenu()));
+ connect(openRecent, SIGNAL(triggered(QAction*)), this, SLOT(selectProject(QAction*)));
+
+ menu_ids[CMD_OPEN_RECENT] = menu_file->addMenu(openRecent);
+ menu_file->addSeparator();
+ menu_file->addAction(fileSaveAction);
+ menu_ids[CMD_SAVE_AS] = menu_file->addAction(tr("Save &As"), this, SLOT(saveAs()));
+ menu_file->addSeparator();
+ menu_ids[CMD_IMPORT_MIDI] = menu_file->addAction(*openIconS, tr("Import Midifile"));
+ connect(menu_ids[CMD_IMPORT_MIDI], SIGNAL(triggered()), this, SLOT(importMidi()));
+ menu_ids[CMD_EXPORT_MIDI] = menu_file->addAction(*saveIconS, tr("Export Midifile"));
+ connect(menu_ids[CMD_EXPORT_MIDI], SIGNAL(triggered()), this, SLOT(exportMidi()));
+ menu_file->addSeparator();
+
+ menu_ids[CMD_IMPORT_AUDIO] = menu_file->addAction(*openIconS, tr("Import Wave File"));
+ connect(menu_ids[CMD_IMPORT_AUDIO], SIGNAL(triggered()), this, SLOT(importWave()));
+ menu_ids[CMD_IMPORT_AUDIO]->setEnabled(!midiOnly);
+
+ menu_file->addSeparator();
+ menu_ids[CMD_QUIT] = menu_file->addAction(*exitIconS, tr("&Quit"));
+ connect(menu_ids[CMD_QUIT], SIGNAL(triggered()), this, SLOT(quitDoc()));
+ menu_file->addSeparator();
+
+ //-------------------------------------------------------------
+ // Edit
+ //-------------------------------------------------------------
+
+ menuEdit = mb->addMenu(tr("&Edit"));
+
+ menuEdit->addAction(undoAction);
+ menuEdit->addAction(redoAction);
+ menuEdit->addSeparator();
+
+ cutAction = menuEdit->addAction(*editcutIconSet, tr("C&ut"));
+ cutAction->setData(CMD_CUT);
+ cutAction->setShortcut(Qt::CTRL + Qt::Key_X);
+
+ copyAction = menuEdit->addAction(*editcopyIconSet, tr("&Copy"));
+ copyAction->setData(CMD_COPY);
+ copyAction->setShortcut(Qt::CTRL + Qt::Key_C);
+
+ pasteAction = menuEdit->addAction(*editpasteIconSet, tr("&Paste"));
+ pasteAction->setData(CMD_PASTE);
+ pasteAction->setShortcut(Qt::CTRL + Qt::Key_V);
+
+ menuEditActions[CMD_DELETE] = menuEdit->addAction(*deleteIcon, tr("&Delete Parts"));
+ menuEditActions[CMD_DELETE]->setData(CMD_DELETE);
+
+ menuEdit->addSeparator();
+ QAction* a;
+ a = menuEdit->addAction(QIcon(*edit_track_delIcon), tr("Delete Selected Tracks"));
+ a->setData(CMD_DELETE_TRACK);
+
+ addTrack = menuEdit->addMenu(*edit_track_addIcon, tr("Add Track"));
+ populateAddTrack(addTrack);
+
+ menuEdit->addSeparator();
+ select = menuEdit->addMenu(QIcon(*selectIcon), tr("Select"));
+ menuEditActions[CMD_SELECT_ALL] = select->addAction(QIcon(*select_allIcon), tr("Select &All"));
+ menuEditActions[CMD_SELECT_ALL]->setData(CMD_SELECT_ALL);
+ menuEditActions[CMD_SELECT_NONE] = select->addAction(QIcon(*select_deselect_allIcon), tr("&Deselect All"));
+ menuEditActions[CMD_SELECT_NONE]->setData(CMD_SELECT_NONE);
+ menuEditActions[CMD_SELECT_INVERT] = select->addAction(QIcon(*select_invert_selectionIcon), tr("Invert &Selection"));
+ menuEditActions[CMD_SELECT_INVERT]->setData(CMD_SELECT_INVERT);
+ menuEditActions[CMD_SELECT_ILOOP] = select->addAction(QIcon(*select_inside_loopIcon), tr("&Inside Loop"));
+ menuEditActions[CMD_SELECT_ILOOP]->setData(CMD_SELECT_ILOOP);
+ menuEditActions[CMD_SELECT_OLOOP] = select->addAction(QIcon(*select_outside_loopIcon), tr("&Outside Loop"));
+ menuEditActions[CMD_SELECT_OLOOP]->setData(CMD_SELECT_OLOOP);
+ menuEditActions[CMD_SELECT_PARTS] = select->addAction(QIcon(*select_all_parts_on_trackIcon), tr("All &Parts on Track"));
+ menuEditActions[CMD_SELECT_PARTS]->setData(CMD_SELECT_PARTS);
+
+ menuEdit->addSeparator();
+ menuEdit->addAction(pianoAction);
+ menu_ids[CMD_OPEN_DRUMS] = menuEdit->addAction(QIcon(*edit_drummsIcon), tr("Drums"), this, SLOT(startDrumEditor()), 0);
+ menu_ids[CMD_OPEN_LIST] = menuEdit->addAction(QIcon(*edit_listIcon), tr("List"), this, SLOT(startListEditor()), 0);
+
+ menu_ids[CMD_OPEN_GRAPHIC_MASTER] = menuEdit->addAction(QIcon(*mastertrack_graphicIcon),tr("Mastertrack"));
+ connect(menu_ids[CMD_OPEN_GRAPHIC_MASTER], SIGNAL(triggered()), SLOT(startMasterEditor()));
+
+ menuEdit->addSeparator();
+ connect(menuEdit, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+ connect(select, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+
+ midiEdit = menuEdit->addMenu(QIcon(*edit_midiIcon), tr("Midi"));
+// menu_ids[CMD_OPEN_MIDI_TRANSFORM] = midiEdit->addAction(QIcon(*midi_transformIcon), tr("Midi &Transform"), this, SLOT(startMidiTransformer()), 0);
+
+#if 0 // TODO
+ midiEdit->insertItem(tr("Modify Gate Time"), this, SLOT(modifyGateTime()));
+ midiEdit->insertItem(tr("Modify Velocity"), this, SLOT(modifyVelocity()));
+ midiEdit->insertItem(tr("Crescendo"), this, SLOT(crescendo()));
+ midiEdit->insertItem(tr("Transpose"), this, SLOT(transpose()));
+ midiEdit->insertItem(tr("Thin Out"), this, SLOT(thinOut()));
+ midiEdit->insertItem(tr("Erase Event"), this, SLOT(eraseEvent()));
+ midiEdit->insertItem(tr("Note Shift"), this, SLOT(noteShift()));
+ midiEdit->insertItem(tr("Move Clock"), this, SLOT(moveClock()));
+ midiEdit->insertItem(tr("Copy Measure"), this, SLOT(copyMeasure()));
+ midiEdit->insertItem(tr("Erase Measure"), this, SLOT(eraseMeasure()));
+ midiEdit->insertItem(tr("Delete Measure"), this, SLOT(deleteMeasure()));
+ midiEdit->insertItem(tr("Create Measure"), this, SLOT(createMeasure()));
+ midiEdit->insertItem(tr("Mix Track"), this, SLOT(mixTrack()));
+#endif
+ menu_ids[CMD_TRANSPOSE] = midiEdit->addAction(QIcon(*midi_transposeIcon), tr("Transpose"));
+ connect(menu_ids[CMD_TRANSPOSE], SIGNAL(triggered()), this, SLOT(transpose()));
+
+ //-------------------------------------------------------------
+ // View
+ //-------------------------------------------------------------
+
+ menuView = mb->addMenu(tr("&View"));
+
+ tr_id = menuView->addAction(QIcon(*view_transport_windowIcon), tr("Transport Panel"));
+ tr_id->setCheckable(true);
+ connect(tr_id, SIGNAL(toggled(bool)), this, SLOT(showTransport(bool)));
+ bt_id = menuView->addAction(QIcon(*view_bigtime_windowIcon), tr("Bigtime window"));
+ bt_id->setCheckable(true);
+ connect(bt_id, SIGNAL(toggled(bool)), this, SLOT(showBigtime(bool)));
+ aid1a = menuView->addAction(QIcon(*mixerSIcon), tr("Mixer 1"));
+ aid1a->setCheckable(true);
+ connect(aid1a, SIGNAL(toggled(bool)), this, SLOT(showMixer1(bool)));
+ aid1b = menuView->addAction(QIcon(*mixerSIcon), tr("Mixer 2"));
+ aid1b->setCheckable(true);
+ connect(aid1b, SIGNAL(toggled(bool)), this, SLOT(showMixer2(bool)));
+ mk_id = menuView->addAction(QIcon(*view_markerIcon), tr("Marker"));
+ mk_id->setCheckable(true);
+ connect(mk_id , SIGNAL(toggled(bool)), this, SLOT(showMarker(bool)));
+
+ //-------------------------------------------------------------
+ // Structure
+ //-------------------------------------------------------------
+
+ menuStructure = mb->addMenu(tr("&Structure"));
+
+ menu_ids[CMD_GLOBAL_CUT] = menuStructure->addAction(tr("Global Cut"));
+ connect(menu_ids[CMD_GLOBAL_CUT], SIGNAL(triggered()), this, SLOT(globalCut()));
+
+ menu_ids[CMD_GLOBAL_INSERT] = menuStructure->addAction(tr("Global Insert"));
+ connect(menu_ids[CMD_GLOBAL_INSERT], SIGNAL(triggered()), this, SLOT(globalInsert()));
+
+ menu_ids[CMD_GLOBAL_SPLIT] = menuStructure->addAction(tr("Global Split"));
+ connect(menu_ids[CMD_GLOBAL_SPLIT], SIGNAL(triggered()), this, SLOT(globalSplit()));
+
+ menu_ids[CMD_COPY_RANGE] = menuStructure->addAction(tr("Copy Range"));
+ connect(menu_ids[CMD_COPY_RANGE], SIGNAL(triggered()), this, SLOT(copyRange()));
+
+ menu_ids[CMD_COPY_RANGE]->setEnabled(false);
+ menuStructure->addSeparator();
+
+ menu_ids[CMD_CUT_EVENTS] = menuStructure->addAction(tr("Cut Events"));
+ connect(menu_ids[CMD_CUT_EVENTS], SIGNAL(triggered()), this, SLOT(cutEvents()));
+
+ menu_ids[CMD_CUT_EVENTS]->setEnabled(false);
+
+ //-------------------------------------------------------------
+ // Midi
+ //-------------------------------------------------------------
+
+ menu_functions = mb->addMenu(tr("&Midi"));
+
+ menu_ids[CMD_MIDI_EDIT_INSTRUMENTS] = menu_functions->addAction(QIcon(*midi_edit_instrumentIcon), tr("Edit Instrument"));
+ connect(menu_ids[CMD_MIDI_EDIT_INSTRUMENTS], SIGNAL(triggered()), this, SLOT(startEditInstrument()));
+ //TODO:
+ // menu_ids[CMD_MIDI_EDIT_INSTRUMENTS]->setEnabled(false);
+
+// midiInputPlugins = menu_functions->addMenu(QIcon(*midi_inputpluginsIcon), tr("Input Plugins"));
+// midiInputPlugins->menuAction()->setShortcut(Qt::Key_P);
+// mpid0 = midiInputPlugins->addAction(QIcon(*midi_inputplugins_transposeIcon), tr("Transpose"));
+// mpid0->setData(0);
+// mpid3 = midiInputPlugins->addAction(QIcon(*midi_inputplugins_remote_controlIcon), tr("Midi Remote Control"));
+// mpid3->setData(3);
+//TD connect(midiInputPlugins, SIGNAL(triggered(QAction*)), SLOT(startMidiInputPlugin(QAction*)));
+
+ menu_functions->addSeparator();
+ menu_ids[CMD_MIDI_RESET] = menu_functions->addAction(QIcon(*midi_reset_instrIcon), tr("Reset Instr."));
+ connect(menu_ids[CMD_MIDI_RESET], SIGNAL(triggered()), this, SLOT(resetMidiDevices()));
+ menu_ids[CMD_MIDI_INIT] = menu_functions->addAction(QIcon(*midi_init_instrIcon), tr("Init Instr."));
+ connect(menu_ids[CMD_MIDI_INIT], SIGNAL(triggered()), this, SLOT(initMidiDevices()));
+ menu_ids[CMD_MIDI_LOCAL_OFF] = menu_functions->addAction(QIcon(*midi_local_offIcon), tr("local off"));
+ connect(menu_ids[CMD_MIDI_LOCAL_OFF], SIGNAL(triggered()), this, SLOT(localOff()));
+
+ //-------------------------------------------------------------
+ // Audio
+ //-------------------------------------------------------------
+
+ menu_audio = mb->addMenu(tr("&Audio"));
+
+ menu_ids[CMD_AUDIO_BOUNCE_TO_TRACK] = menu_audio->addAction(QIcon(*audio_bounce_to_trackIcon), tr("Bounce to Track"));
+ connect(menu_ids[CMD_AUDIO_BOUNCE_TO_TRACK], SIGNAL(triggered()), this, SLOT(bounceToTrack()));
+
+ menu_ids[CMD_AUDIO_BOUNCE_TO_FILE] = menu_audio->addAction(QIcon(*audio_bounce_to_fileIcon), tr("Bounce to File"));
+ connect(menu_ids[CMD_AUDIO_BOUNCE_TO_FILE], SIGNAL(triggered()), this, SLOT(bounceToFile()));
+ menu_audio->setEnabled(!midiOnly);
+ menu_ids[CMD_AUDIO_RESTART] = menu_audio->addAction(QIcon(*audio_restartaudioIcon), tr("Restart Audio"));
+ connect(menu_ids[CMD_AUDIO_RESTART], SIGNAL(triggered()), this, SLOT(seqRestart()));
+
+ //-------------------------------------------------------------
+ // Settings
+ //-------------------------------------------------------------
+
+ menuSettings = mb->addMenu(tr("Setti&ngs"));
+
+ menu_ids[CMD_GLOBAL_CONFIG] = menuSettings->addAction(QIcon(*settings_globalsettingsIcon), tr("Global Settings"));
+ connect(menu_ids[CMD_GLOBAL_CONFIG], SIGNAL(triggered()), this, SLOT(configGlobalSettings()));
+ menu_ids[CMD_CONFIG_SHORTCUTS] = menuSettings->addAction(QIcon(*settings_configureshortcutsIcon), tr("Configure shortcuts"));
+ connect(menu_ids[CMD_CONFIG_SHORTCUTS], SIGNAL(triggered()), this, SLOT(configShortCuts()));
+
+ follow = menuSettings->addMenu(QIcon(*settings_follow_songIcon), tr("follow song"));
+ //follow->menuAction()->setShortcut(Qt::Key_F);
+ fid0 = follow->addAction(tr("dont follow Song"));
+ fid0->setData(CMD_FOLLOW_NO);
+ fid0->setCheckable(true);
+ fid1 = follow->addAction(tr("follow page"));
+ fid1->setData(CMD_FOLLOW_JUMP);
+ fid1->setCheckable(true);
+ fid2 = follow->addAction(tr("follow continuous"));
+ fid2->setData(CMD_FOLLOW_CONTINUOUS);
+ fid2->setCheckable(true);
+ fid0->setChecked(TimeCanvas::followMode == FOLLOW_NO);
+ fid1->setChecked(TimeCanvas::followMode == FOLLOW_JUMP);
+ fid2->setChecked(TimeCanvas::followMode == FOLLOW_CONTINUOUS);
+ connect(follow, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+
+ menuSettings->addSeparator();
+ menu_ids[CMD_CONFIG_MIDISYNC] = menuSettings->addAction(QIcon(*settings_midisyncIcon), tr("Midi Sync"));
+ connect(menu_ids[CMD_CONFIG_MIDISYNC], SIGNAL(triggered()), this, SLOT(configMidiSync()));
+ menu_ids[CMD_MIDI_FILE_CONFIG] = menuSettings->addAction(QIcon(*settings_midifileexportIcon), tr("Midi File Export"));
+ connect(menu_ids[CMD_MIDI_FILE_CONFIG], SIGNAL(triggered()), this, SLOT(configMidiFile()));
+ menuSettings->addSeparator();
+ menu_ids[CMD_APPEARANCE_SETTINGS] = menuSettings->addAction(QIcon(*settings_appearance_settingsIcon), tr("Appearance settings"));
+ connect(menu_ids[CMD_APPEARANCE_SETTINGS], SIGNAL(triggered()), this, SLOT(configAppearance()));
+
+ //---------------------------------------------------
+ // Help
+ //---------------------------------------------------
+
+ mb->addSeparator();
+ menu_help = mb->addMenu(tr("&Help"));
+
+ menu_ids[CMD_OPEN_HELP] = menu_help->addAction(tr("&Manual"));
+ connect(menu_ids[CMD_OPEN_HELP], SIGNAL(triggered()), this, SLOT(startHelpBrowser()));
+ menu_ids[CMD_OPEN_HOMEPAGE] = menu_help->addAction(tr("&MusE homepage"));
+ connect(menu_ids[CMD_OPEN_HOMEPAGE], SIGNAL(triggered()), this, SLOT(startHomepageBrowser()));
+ menu_help->addSeparator();
+ menu_ids[CMD_OPEN_BUG] = menu_help->addAction(tr("&Report Bug..."));
+ connect(menu_ids[CMD_OPEN_BUG], SIGNAL(triggered()), this, SLOT(startBugBrowser()));
+ menu_help->addSeparator();
+ a = menu_help->addAction(tr("&About MusE"));
+ a->setIcon(QIcon(*museIcon));
+ connect(a, SIGNAL(triggered()), this, SLOT(about()));
+ a = menu_help->addAction(tr("About&Qt"));
+ connect(a, SIGNAL(triggered()), this, SLOT(aboutQt()));
+ menu_help->addSeparator();
+ a = QWhatsThis::createAction(this);
+ a->setText(tr("What's &This?"));
+ menu_help->addAction(a);
+ menu_ids[CMD_START_WHATSTHIS] = a;
+
+ //---------------------------------------------------
+ // ToolBar
+ //---------------------------------------------------
+
+ QToolBar* aToolBar = addToolBar(tr("Arranger"));
+
+ QLabel* label = new QLabel(tr("Cursor"));
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ label->setIndent(3);
+ aToolBar->addWidget(label);
+
+ Awl::PosLabel* cursorPos = new Awl::PosLabel;
+ aToolBar->addWidget(cursorPos);
+ cursorPos->setFixedHeight(25);
+
+ label = new QLabel(tr("Snap"));
+ label->setIndent(5);
+ aToolBar->addWidget(label);
+
+ QComboBox* raster = new QComboBox;
+ raster->setFixedHeight(24);
+ aToolBar->addWidget(raster);
+ for (unsigned i = 0; i < sizeof(rasterTable)/sizeof(*rasterTable); i++)
+ raster->addItem(rasterTable[i].label, i);
+ raster->setCurrentIndex(1);
+ connect(raster, SIGNAL(activated(int)), SLOT(setRaster(int)));
+
+ // Song len
+ label = new QLabel(tr("Len"));
+ label->setIndent(5);
+ aToolBar->addWidget(label);
+
+ // song length is limited to 10000 bars; the real song len is limited
+ // by overflows in tick computations
+ //
+ QSpinBox* lenEntry = new QSpinBox;
+ lenEntry->setFixedHeight(24);
+ lenEntry->setRange(1, 10000);
+ aToolBar->addWidget(lenEntry);
+ lenEntry->setValue(song->len());
+ connect(lenEntry, SIGNAL(valueChanged(int)), song, SLOT(setMeasureLen(int)));
+ connect(song, SIGNAL(measureLenChanged(int)), lenEntry, SLOT(setValue(int)));
+
+ label = new QLabel(tr("Pitch"));
+ label->setIndent(5);
+ aToolBar->addWidget(label);
+
+ QSpinBox* globalPitchSpinBox = new QSpinBox;
+ globalPitchSpinBox->setFixedHeight(24);
+ globalPitchSpinBox->setRange(-127, 127);
+ aToolBar->addWidget(globalPitchSpinBox);
+ globalPitchSpinBox->setValue(song->globalPitchShift());
+ globalPitchSpinBox->setToolTip(tr("midi pitch"));
+ globalPitchSpinBox->setWhatsThis(tr("global midi pitch shift"));
+ connect(globalPitchSpinBox, SIGNAL(valueChanged(int)), SLOT(globalPitchChanged(int)));
+
+ label = new QLabel(tr("Tempo"));
+ label->setIndent(5);
+ aToolBar->addWidget(label);
+
+ globalTempoSpinBox = new QSpinBox;
+ globalTempoSpinBox->setFixedHeight(24);
+ globalTempoSpinBox->setRange(50, 200);
+ aToolBar->addWidget(globalTempoSpinBox);
+ globalTempoSpinBox->setSuffix(QString("%"));
+ globalTempoSpinBox->setValue(AL::tempomap.globalTempo());
+ globalTempoSpinBox->setToolTip(tr("midi tempo"));
+ globalTempoSpinBox->setWhatsThis(tr("midi tempo"));
+ connect(globalTempoSpinBox, SIGNAL(valueChanged(int)), SLOT(globalTempoChanged(int)));
+
+ QToolButton* tempo50 = new QToolButton;
+ tempo50->setFixedHeight(24);
+ aToolBar->addWidget(tempo50);
+ tempo50->setText(QString("50%"));
+ connect(tempo50, SIGNAL(clicked()), SLOT(setTempo50()));
+
+ QToolButton* tempo100 = new QToolButton;
+ tempo100->setFixedHeight(24);
+ aToolBar->addWidget(tempo100);
+ tempo100->setText(tr("N"));
+ connect(tempo100, SIGNAL(clicked()), SLOT(setTempo100()));
+
+ QToolButton* tempo200 = new QToolButton;
+ tempo200->setFixedHeight(24);
+ aToolBar->addWidget(tempo200);
+ tempo200->setText(QString("200%"));
+ connect(tempo200, SIGNAL(clicked()), SLOT(setTempo200()));
+
+ //---------------------------------------------------
+ // Central Widget
+ //---------------------------------------------------
+
+ arranger = new Arranger(this);
+ setCentralWidget(arranger);
+
+ connect(tools1, SIGNAL(toolChanged(int)), SLOT(setTool(int)));
+ connect(arranger, SIGNAL(editPart(Part*)), SLOT(startEditor(Part*)));
+//TODO1 connect(arranger, SIGNAL(dropSongFile(const QString&)), SLOT(loadProjectFile(const QString&)));
+//TODO1 connect(arranger, SIGNAL(dropMidiFile(const QString&)), SLOT(importMidi(const QString&)));
+ connect(arranger, SIGNAL(cursorPos(const AL::Pos&,bool)), cursorPos, SLOT(setValue(const AL::Pos&,bool)));
+
+ //---------------------------------------------------
+ // read list of "Recent Projects"
+ //---------------------------------------------------
+
+ QString prjPath(getenv("HOME"));
+ prjPath += QString("/.musePrj");
+ FILE* f = fopen(prjPath.toLatin1().data(), "r");
+ if (f == 0) {
+ if (debugMsg) {
+ fprintf(stderr, "open projectfile <%s> failed: %s",
+ prjPath.toLatin1().data(), strerror(errno));
+ }
+ for (int i = 0; i < PROJECT_LIST_LEN; ++i)
+ projectList[i] = 0;
+ }
+ else {
+ for (int i = 0; i < PROJECT_LIST_LEN; ++i) {
+ char buffer[256];
+ if (fgets(buffer, 256, f)) {
+ int n = strlen(buffer);
+ if (n && buffer[n-1] == '\n')
+ buffer[n-1] = 0;
+ projectList[i] = *buffer ? new QString(buffer) : 0;
+ }
+ else
+ break;
+ }
+ fclose(f);
+ }
+
+ initMidiSynth();
+
+ transport = new Transport;
+ connect(transport, SIGNAL(closed()), SLOT(transportClosed()));
+
+ QClipboard* cb = QApplication::clipboard();
+ connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged()));
+ connect(cb, SIGNAL(selectionChanged()), SLOT(clipboardChanged()));
+ song->blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// setRaster
+//---------------------------------------------------------
+
+void MusE::setRaster(int val)
+ {
+ _raster = rasterTable[val].val;
+ emit rasterChanged(_raster);
+ }
+
+//---------------------------------------------------------
+// setHeartBeat
+//---------------------------------------------------------
+
+void MusE::setHeartBeat()
+ {
+ heartBeatTimer->start(1000/config.guiRefresh);
+ }
+
+//---------------------------------------------------------
+// resetDevices
+//---------------------------------------------------------
+
+void MusE::resetMidiDevices()
+ {
+ audio->msgResetMidiDevices();
+ }
+
+//---------------------------------------------------------
+// initMidiDevices
+//---------------------------------------------------------
+
+void MusE::initMidiDevices()
+ {
+ audio->msgInitMidiDevices();
+ }
+
+//---------------------------------------------------------
+// localOff
+//---------------------------------------------------------
+
+void MusE::localOff()
+ {
+ audio->msgLocalOff();
+ }
+
+//---------------------------------------------------------
+// loadProjectFile
+// load *.med, *.mid, *.kar
+//
+// template - if true, load file but do not change
+// project name
+//---------------------------------------------------------
+
+// for drop:
+void MusE::loadProjectFile(const QString& name)
+ {
+ loadProjectFile(name, false, false);
+ }
+
+void MusE::loadProjectFile(const QString& name, bool songTemplate, bool loadAll)
+ {
+ //
+ // stop audio threads if running
+ //
+ bool restartSequencer = audioState == AUDIO_RUNNING;
+ if (restartSequencer) {
+ if (audio->isPlaying()) {
+ audio->msgPlay(false);
+ while (audio->isPlaying())
+ qApp->processEvents();
+ }
+ seqStop();
+ }
+ loadProjectFile1(name, songTemplate, loadAll);
+ if (restartSequencer)
+ seqStart();
+ audio->msgSeek(song->cPos());
+ }
+
+//---------------------------------------------------------
+// loadProjectFile1
+// load *.med, *.mid, *.kar
+//
+// template - if true, load file but do not change
+// project name
+// loadAll - load song data + configuration data
+//---------------------------------------------------------
+
+void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll)
+ {
+ if (mixer1)
+ mixer1->clear();
+ if (mixer2)
+ mixer2->clear();
+ if (song->dirty) {
+ int n = 0;
+ n = QMessageBox::warning(this, appName,
+ tr("The current Project contains unsaved data\n"
+ "Load overwrites current Project:\n"
+ "Save Current Project?"),
+ tr("&Save"), tr("&Overwrite"), tr("&Abort"), 0, 2);
+ switch (n) {
+ case 0:
+ if (!save()) // abort if save failed
+ return;
+ break;
+ case 1:
+ break;
+ case 2:
+ return;
+ default:
+ printf("InternalError: gibt %d\n", n);
+ }
+ }
+ foreach(QWidget* w, QApplication::topLevelWidgets()) {
+ if (!w->isVisible())
+ continue;
+ if (strcmp("DrumEdit", w->metaObject()->className()) == 0)
+ w->close();
+ else if (strcmp("PianoRoll", w->metaObject()->className()) == 0)
+ w->close();
+ else if (strcmp("MasterEdit", w->metaObject()->className()) == 0)
+ w->close();
+ else if (strcmp("WaveEdit", w->metaObject()->className()) == 0)
+ w->close();
+ else if (strcmp("ListEdit", w->metaObject()->className()) == 0)
+ w->close();
+ }
+
+ emit startLoadSong();
+
+ song->clear(false);
+ QFileInfo fi(name);
+ if (songTemplate) {
+ if (!fi.isReadable()) {
+ QMessageBox::critical(this, QString("MusE"),
+ tr("Cannot read template"));
+ return;
+ }
+ project.setFile("untitled");
+ }
+ else {
+ museProject = fi.absolutePath();
+ project.setFile(name);
+ }
+ QString ex = fi.suffix().toLower();
+ if (ex.isEmpty() || ex == "med") {
+ //
+ // read *.med file
+ //
+ QFile* f = new QFile(ex.isEmpty() ? name + ".med" : name);
+ if (f->open(QIODevice::ReadOnly)) {
+ int rv = read(f, !loadAll);
+ f->close();
+ if (rv) {
+ QMessageBox::critical(this, QString("MusE"),
+ tr("File read error"));
+ setUntitledProject();
+ }
+ }
+ delete f;
+ }
+ else if (ex == "mid" || ex == "kar") {
+ if (importMidi(name, false)) {
+ setUntitledProject();
+ }
+ }
+ else {
+ QMessageBox::critical(this, QString("MusE"),
+ tr("Unknown File Format"));
+ setUntitledProject();
+ }
+ if (!songTemplate) {
+ addProject(project);
+ setWindowTitle(QString("MusE: Song: ") + project.baseName());
+ }
+ song->dirty = false;
+
+ tr_id->setChecked(config.transportVisible);
+ bt_id->setChecked(config.bigTimeVisible);
+
+ if (loadAll) {
+ //
+ // dont emit song->update():
+ song->blockSignals(true);
+
+ showBigtime(config.bigTimeVisible);
+ showMixer1(config.mixer1Visible);
+ showMixer2(config.mixer2Visible);
+ resize(config.geometryMain.size());
+ move(config.geometryMain.topLeft());
+
+ if (config.transportVisible)
+ transport->show();
+ transport->move(config.geometryTransport.topLeft());
+ showTransport(config.transportVisible);
+
+ song->blockSignals(false);
+ }
+ transport->setMasterFlag(song->masterFlag());
+ punchinAction->setChecked(song->punchin());
+ punchoutAction->setChecked(song->punchout());
+ loopAction->setChecked(song->loop());
+ clipboardChanged(); // enable/disable "Paste"
+ selectionChanged(); // enable/disable "Copy" & "Paste"
+ song->setLen(song->len()); // emit song->lenChanged() signal
+
+ // song->update();
+ //
+ // add connected channels
+ //
+ MidiChannelList* mcl = song->midiChannel();
+ TrackList* tl = song->tracks();
+ for (iMidiChannel i = mcl->begin(); i != mcl->end(); ++i) {
+ MidiChannel* mc = (MidiChannel*)*i;
+ if (mc->noInRoute() || song->trackExists(mc))
+ continue;
+ tl->push_back(mc);
+ }
+
+ arranger->endLoadSong();
+ song->updatePos();
+ //
+ // send "cur" controller values to devices
+ //
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ (*i)->blockSignals(true);
+ CtrlList* cl = (*i)->controller();
+ for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) {
+ Ctrl* ctrl = ic->second;
+ if (ctrl->type() & Ctrl::INT) {
+ CVal val;
+ val = ctrl->curVal();
+ ctrl->setCurVal(CTRL_VAL_UNKNOWN);
+ song->setControllerVal(*i, ctrl, val);
+ }
+ }
+ (*i)->blockSignals(false);
+ }
+ }
+
+//---------------------------------------------------------
+// setUntitledProject
+//---------------------------------------------------------
+
+void MusE::setUntitledProject()
+ {
+ QString name("untitled");
+ museProject = QFileInfo(name).absolutePath();
+ project.setFile(name);
+ }
+
+//---------------------------------------------------------
+// MusE::loadProject
+//---------------------------------------------------------
+
+void MusE::loadProject()
+ {
+ QStringList pattern;
+ const char** p = med_midi_file_pattern;
+ while (*p)
+ pattern << *p++;
+ QString fn = getOpenFileName(QString("."), pattern, this,
+ tr("MusE: load project"));
+ if (!fn.isEmpty()) {
+ museProject = QFileInfo(fn).absolutePath();
+ loadProjectFile(fn, false, true); // load all
+ }
+ }
+
+//---------------------------------------------------------
+// loadTemplate
+//---------------------------------------------------------
+
+void MusE::loadTemplate()
+ {
+ QString start(museGlobalShare);
+ start += "/templates";
+ QString fn = QFileDialog::getOpenFileName(
+ this,
+ tr("MusE: load template"),
+ start,
+ medFilePattern
+ );
+ if (!fn.isEmpty()) {
+ loadProjectFile(fn, true, true);
+ setUntitledProject();
+ }
+ }
+
+//---------------------------------------------------------
+// save
+//---------------------------------------------------------
+
+bool MusE::save()
+ {
+ if (project.baseName() == "untitled"
+ || (!project.suffix().isEmpty() && project.suffix() != "med")) {
+ return saveAs();
+ }
+ else
+ return save(project.filePath(), false);
+ return true;
+ }
+
+//---------------------------------------------------------
+// save
+//---------------------------------------------------------
+
+bool MusE::save(const QString& fname, bool overwriteWarn)
+ {
+ QString backupCommand;
+
+ QString name(fname);
+ QFileInfo info(name);
+ QString zip;
+
+ if (info.completeSuffix() == "") {
+ name += ".med";
+ info.setFile(name);
+ }
+ if (overwriteWarn && info.exists()) {
+ QString s(QWidget::tr("File\n") + name + QWidget::tr("\nexists"));
+ int rv = QMessageBox::warning(this,
+ QWidget::tr("MusE: write"),
+ s,
+ QWidget::tr("Overwrite"),
+ QWidget::tr("Quit"), QString::null, 0, 1);
+ switch(rv) {
+ case 0: // overwrite
+ break;
+ case 1: // quit
+ return 0;
+ }
+ }
+ char* tmpName = tempnam(info.absolutePath().toLatin1().data(), "MusE");
+ FILE* fp = fopen(tmpName, "w");
+ if (fp == 0) {
+ QString s("Creating temp file failed: ");
+ s += strerror(errno);
+ QMessageBox::critical(this,
+ tr("MusE: Create tmp file failed"), s);
+ return false;
+ }
+ QFile file;
+ file.open(fp, QIODevice::WriteOnly);
+ Xml xml(&file);
+ write(xml);
+ if (ferror(fp)) {
+ QString s = QString("Write File\n") + name + QString("\nfailed: ")
+ + QString(strerror(errno));
+ QMessageBox::critical(this,
+ tr("MusE: Write File failed"), s);
+ fclose(fp);
+ unlink(tmpName);
+ return false;
+ }
+ file.close();
+ fclose(fp);
+ if (!overwriteWarn && !song->backupWritten()) {
+ //
+ // create backup file
+ //
+ if (info.exists()) {
+ QString backupName = "." + name + ",";
+ rename(name.toLatin1().data(), backupName.toLatin1().data());
+ song->setBackupWritten(true);
+ }
+ }
+ rename(tmpName, name.toLatin1().data());
+ song->dirty = false;
+ SndFile::updateRecFiles();
+ return true;
+ }
+
+//---------------------------------------------------------
+// quitDoc
+//---------------------------------------------------------
+
+void MusE::quitDoc()
+ {
+ close();
+ }
+
+//---------------------------------------------------------
+// closeEvent
+//---------------------------------------------------------
+
+void MusE::closeEvent(QCloseEvent*)
+ {
+ song->setStop(true);
+ //
+ // wait for sequencer
+ //
+ while (audio->isPlaying()) {
+ qApp->processEvents();
+ }
+ //
+ // delete all wave files created in this session and not
+ // referenced any more
+ //
+
+ if (song->dirty) {
+ int n = 0;
+ n = QMessageBox::warning(this, appName,
+ tr("The current Project contains unsaved data\n"
+ "Save Current Project?"),
+ tr("&Save"), tr("&Nosave"), tr("&Abort"), 0, 2);
+ if (n == 0) {
+ if (!save()) // dont quit if save failed
+ return;
+ }
+ else if (n == 2)
+ return;
+ //
+ // delete all wave files created in this session and not
+ // referenced any more
+ // delete all if we drop the song
+ //
+ SndFile::cleanupRecFiles(n == 1);
+ }
+ else
+ SndFile::cleanupRecFiles(true);
+ seqStop();
+
+ // save "Open Recent" list
+ QString prjPath(getenv("HOME"));
+ prjPath += "/.musePrj";
+ FILE* f = fopen(prjPath.toLatin1().data(), "w");
+ if (f) {
+ for (int i = 0; i < PROJECT_LIST_LEN; ++i) {
+ fprintf(f, "%s\n", projectList[i] ? projectList[i]->toLatin1().data() : "");
+ }
+ fclose(f);
+ }
+ exitJackAudio();
+ SynthIList* sl = song->syntis();
+ for (iSynthI i = sl->begin(); i != sl->end(); ++i)
+ delete *i;
+
+ // Cleanup temporary wavefiles + peakfiles used for undo
+ for (std::list<QString>::iterator i = temporaryWavFiles.begin(); i != temporaryWavFiles.end(); i++) {
+ QString filename = *i;
+ QFileInfo f(filename);
+ QDir d = f.dir();
+ d.remove(filename);
+ d.remove(f.baseName() + ".wca");
+ }
+ qApp->quit();
+ }
+
+//---------------------------------------------------------
+// showTransport
+//---------------------------------------------------------
+
+void MusE::showTransport(bool flag)
+ {
+ transport->setShown(flag);
+ tr_id->setChecked(flag);
+ if (flag)
+ transport->setValues();
+ }
+
+//---------------------------------------------------------
+// saveAs
+//---------------------------------------------------------
+
+bool MusE::saveAs()
+ {
+ QStringList pattern;
+ const char** p = med_file_pattern;
+ while (*p)
+ pattern << *p++;
+
+ QString name = getSaveFileName(QString(""), pattern, this,
+ tr("MusE: Save As"));
+ bool ok = false;
+ if (!name.isEmpty()) {
+ ok = save(name, true);
+ if (ok) {
+ project.setFile(name);
+ setWindowTitle(tr("MusE: Song: ") + project.baseName());
+ addProject(project);
+ museProject = project.absolutePath();
+ }
+ }
+
+ return ok;
+ }
+
+//---------------------------------------------------------
+// printVersion
+//---------------------------------------------------------
+
+static void printVersion(const char* prog)
+ {
+ fprintf(stderr, "%s: Linux Music Editor; Version %s\n", prog, VERSION);
+ }
+
+//---------------------------------------------------------
+// startEditor
+//---------------------------------------------------------
+
+void MusE::startEditor(PartList* pl, int type)
+ {
+ switch (type) {
+ case 0: startPianoroll(pl); break;
+ case 1: startListEditor(pl); break;
+ case 3: startDrumEditor(pl); break;
+ case 4: startWaveEditor(pl); break;
+ }
+ }
+
+//---------------------------------------------------------
+// startEditor
+//---------------------------------------------------------
+
+void MusE::startEditor(Part* part, int type)
+ {
+ PartList* pl = new PartList();
+ pl->add(part);
+ startEditor(pl, type);
+ }
+
+//---------------------------------------------------------
+// startEditor
+//---------------------------------------------------------
+
+void MusE::startEditor(Part* part)
+ {
+ PartList* pl = new PartList();
+ pl->add(part);
+ Track* track = part->track();
+ switch (track->type()) {
+ case Track::MIDI:
+ {
+ MidiTrack* t = (MidiTrack*)track;
+ MidiChannel* mc = t->channel();
+ if (mc && mc->useDrumMap())
+ startDrumEditor(pl);
+ else
+ startPianoroll(pl);
+ }
+ break;
+ case Track::WAVE:
+ startWaveEditor(pl);
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// getMidiPartsToEdit
+//---------------------------------------------------------
+
+PartList* MusE::getMidiPartsToEdit()
+ {
+ PartList* pl = song->getSelectedMidiParts();
+ if (pl->empty()) {
+ QMessageBox::critical(this, QString("MusE"), tr("Nothing to edit"));
+ delete pl;
+ return 0;
+ }
+ return pl;
+ }
+
+//---------------------------------------------------------
+// startPianoroll
+//---------------------------------------------------------
+
+void MusE::startPianoroll()
+ {
+ PartList* pl = getMidiPartsToEdit();
+ if (pl == 0)
+ return;
+ startPianoroll(pl);
+ }
+
+void MusE::startPianoroll(PartList* pl)
+ {
+ PianoRoll* pianoroll = new PianoRoll(pl, false);
+ pianoroll->show();
+ connect(muse, SIGNAL(configChanged()), pianoroll, SLOT(configChanged()));
+ }
+
+//---------------------------------------------------------
+// startListEditor
+//---------------------------------------------------------
+
+void MusE::startListEditor()
+ {
+// PartList* pl = getMidiPartsToEdit();
+// if (pl == 0)
+// return;
+// startListEditor(pl);
+ startListEditor(0);
+ }
+
+void MusE::startListEditor(PartList* /*pl*/)
+ {
+// ListEdit* listEditor = new ListEdit(0, pl);
+// listEditor->show();
+ }
+
+//---------------------------------------------------------
+// startMasterEditor
+//---------------------------------------------------------
+
+void MusE::startMasterEditor()
+ {
+ MasterEdit* masterEditor = new MasterEdit();
+ masterEditor->show();
+ }
+
+//---------------------------------------------------------
+// startDrumEditor
+//---------------------------------------------------------
+
+void MusE::startDrumEditor()
+ {
+ PartList* pl = getMidiPartsToEdit();
+ if (pl == 0)
+ return;
+ startDrumEditor(pl);
+ }
+
+void MusE::startDrumEditor(PartList* pl)
+ {
+ DrumEdit* drumEditor = new DrumEdit(pl, false);
+ drumEditor->show();
+ connect(muse, SIGNAL(configChanged()), drumEditor, SLOT(configChanged()));
+ }
+
+//---------------------------------------------------------
+// startWaveEditor
+//---------------------------------------------------------
+
+void MusE::startWaveEditor()
+ {
+ PartList* pl = song->getSelectedWaveParts();
+ if (pl->empty()) {
+ QMessageBox::critical(this, QString("MusE"), tr("Nothing to edit"));
+ delete pl;
+ return;
+ }
+ startWaveEditor(pl);
+ }
+
+void MusE::startWaveEditor(PartList* pl)
+ {
+ WaveEdit* waveEditor = new WaveEdit(pl);
+ waveEditor->show();
+ connect(muse, SIGNAL(configChanged()), waveEditor, SLOT(configChanged()));
+ }
+
+//---------------------------------------------------------
+// fileMenu
+//---------------------------------------------------------
+
+void MusE::openRecentMenu()
+ {
+ openRecent->clear();
+ for (int i = 0; i < PROJECT_LIST_LEN; ++i) {
+ if (projectList[i] == 0)
+ break;
+ const char* path = projectList[i]->toLatin1().data();
+ const char* p = strrchr(path, '/');
+ if (p == 0)
+ p = path;
+ else
+ ++p;
+ QAction* a = openRecent->addAction(QString(p));
+ a->setData(i);
+ }
+ }
+
+//---------------------------------------------------------
+// selectProject
+//---------------------------------------------------------
+
+void MusE::selectProject(QAction* a)
+ {
+ if (a == 0)
+ return;
+ int id = a->data().toInt();
+ if (id < 0)
+ return;
+ assert(id < PROJECT_LIST_LEN);
+ QString* name = projectList[id];
+ if (name == 0)
+ return;
+ loadProjectFile(*name, false, true);
+ }
+
+//---------------------------------------------------------
+// kbAccel
+//---------------------------------------------------------
+
+void MusE::kbAccel(int key)
+ {
+ if (key == shortcuts[SHRT_TOGGLE_METRO].key) {
+ song->setClick(!song->click());
+ }
+ else if (key == shortcuts[SHRT_PLAY_TOGGLE].key) {
+ if (audio->isPlaying())
+ //song->setStopPlay(false);
+ song->setStop(true);
+ else if (song->cpos() != song->lpos())
+ song->setPos(0, song->lPos());
+ else {
+ Pos p(0, AL::TICKS);
+ song->setPos(0, p);
+ }
+ }
+ else if (key == shortcuts[SHRT_STOP].key) {
+ //song->setPlay(false);
+ song->setStop(true);
+ }
+ else if (key == shortcuts[SHRT_PLAY_SONG].key ) {
+ song->setPlay(true);
+ }
+ else if (key == shortcuts[SHRT_GOTO_LEFT].key) {
+ if (!song->record())
+ song->setPos(0, song->lPos());
+ }
+ else if (key == shortcuts[SHRT_GOTO_RIGHT].key) {
+ if (!song->record())
+ song->setPos(0, song->rPos());
+ }
+ else if (key == shortcuts[SHRT_TOGGLE_LOOP].key) {
+ song->setLoop(!song->loop());
+ }
+ else if (key == shortcuts[SHRT_START_REC].key) {
+ if (!audio->isPlaying()) {
+ song->setRecord(!song->record());
+ }
+ }
+ else if (key == shortcuts[SHRT_OPEN_TRANSPORT].key) {
+ showTransport(!tr_id->isChecked());
+ }
+ else if (key == shortcuts[SHRT_OPEN_BIGTIME].key) {
+ showBigtime(!bt_id->isChecked());
+ }
+ else if (key == shortcuts[SHRT_OPEN_MIXER].key) {
+ showMixer1(!aid1a->isChecked());
+ }
+ else {
+ if (debugMsg)
+ printf("unknown kbAccel 0x%x\n", key);
+ }
+ }
+
+//---------------------------------------------------------
+// MuseApplication
+//---------------------------------------------------------
+
+class MuseApplication : public QApplication {
+ MusE* muse;
+
+ public:
+ MuseApplication(int& argc, char** argv)
+ : QApplication(argc, argv)
+ {
+ muse = 0;
+ }
+
+ void setMuse(MusE* m) {
+ muse = m;
+ }
+
+ bool notify(QObject* receiver, QEvent* event) {
+ bool flag = QApplication::notify(receiver, event);
+ if (event->type() == QEvent::KeyPress) {
+ QKeyEvent* ke = (QKeyEvent*)event;
+ bool accepted = ke->isAccepted();
+ if (!accepted) {
+ muse->kbAccel(ke->key());
+ return true;
+ }
+ }
+ return flag;
+ }
+ };
+
+//---------------------------------------------------------
+// usage
+//---------------------------------------------------------
+
+static void usage(const char* prog, const char* txt)
+ {
+ fprintf(stderr, "%s: %s\nusage: %s flags midifile\n Flags:",
+ prog, txt, prog);
+ fprintf(stderr, " -v print version\n");
+ fprintf(stderr, " -m MIDI only mode\n");
+ fprintf(stderr, " -d debug mode: no threads, no RT\n");
+ fprintf(stderr, " -D debug mode: enable some debug messages\n");
+ fprintf(stderr, " -i debug mode: trace midi Input\n");
+ fprintf(stderr, " -o debug mode: trace midi Output\n");
+ fprintf(stderr, " -s debug mode: trace sync\n");
+ fprintf(stderr, " -p don't load LADSPA plugins\n");
+#ifdef VST_SUPPORT
+ fprintf(stderr, " -V don't load VST plugins\n");
+#endif
+#ifdef DSSI_SUPPORT
+ fprintf(stderr, " -I don't load DSSI plugins\n");
+#endif
+ }
+
+//---------------------------------------------------------
+// catchSignal
+// only for debugging
+//---------------------------------------------------------
+
+#if 0
+static void catchSignal(int sig)
+ {
+ if (debugMsg)
+ fprintf(stderr, "MusE: signal %d catched\n", sig);
+ if (sig == SIGSEGV) {
+ fprintf(stderr, "MusE: segmentation fault\n");
+ abort();
+ }
+ if (sig == SIGCHLD) {
+ M_DEBUG("caught SIGCHLD - child died\n");
+ int status;
+ int n = waitpid (-1, &status, WNOHANG);
+ if (n > 0) {
+ fprintf(stderr, "SIGCHLD for unknown process %d received\n", n);
+ }
+ }
+ }
+#endif
+
+//---------------------------------------------------------
+// main
+//---------------------------------------------------------
+
+int main(int argc, char* argv[])
+ {
+ puts(PACKAGEVERSION);
+
+ museUser = QString(getenv("MUSEHOME"));
+ if (museUser.isEmpty())
+ museUser = QString(getenv("HOME"));
+ QString museGlobal;
+ const char* p = getenv("MUSE");
+ if (p)
+ museGlobal = p;
+
+ if (museGlobal.isEmpty()) {
+ QString museGlobal(INSTPREFIX);
+ museGlobalLib = museGlobal + "/lib/" PACKAGEVERSION;
+ museGlobalShare = museGlobal + "/share/" PACKAGEVERSION;
+ }
+ else {
+ museGlobalLib = museGlobal + "/lib/" PACKAGEVERSION;
+ museGlobalShare = museGlobal + "/share/" PACKAGEVERSION;
+ }
+ museProject = museProjectInitPath; //getcwd(0, 0);
+ configName = QString(getenv("HOME")) + QString("/." PACKAGEVERSION);
+
+ srand(time(0)); // initialize random number generator
+ initMidiController();
+ MuseApplication app(argc, argv);
+
+ config.fonts[0] = new QFont(QString("arial"), 10, QFont::Normal);
+ config.fonts[1] = new QFont(QString("arial"), 8, QFont::Normal);
+ config.fonts[2] = new QFont(QString("arial"), 10, QFont::Normal);
+ config.fonts[3] = new QFont(QString("arial"), 8, QFont::Bold);
+ config.fonts[4] = new QFont(QString("arial"), 8, QFont::Bold); // simple buttons, timescale numbers
+ config.fonts[5] = new QFont(QString("Lucidatypewriter"), 14, QFont::Bold);
+
+ initShortCuts();
+ gmDrumMap.initGm(); // init default drum map
+ readConfiguration();
+
+ QApplication::setFont(*config.fonts[0]);
+
+ // SHOW MUSE SPLASH SCREEN
+ if (config.showSplashScreen) {
+ QPixmap splsh(":/xpm/splash.png");
+
+ if (!splsh.isNull()) {
+ QSplashScreen* muse_splash = new QSplashScreen(splsh,
+ Qt::WindowStaysOnTopHint);
+ muse_splash->show();
+ QTimer* stimer = new QTimer(0);
+ muse_splash->connect(stimer, SIGNAL(timeout()), muse_splash, SLOT(close()));
+ stimer->start(6000);
+ }
+ }
+ char c;
+ QString opts("mvdDiosP:p");
+
+#ifdef VST_SUPPORT
+ opts += "V";
+#endif
+#ifdef DSSI_SUPPORT
+ opts += "I";
+#endif
+ while ((c = getopt(argc, argv, opts.toLatin1().data())) != EOF) {
+ switch (c) {
+ case 'v': printVersion(argv[0]); return 0;
+ case 'd':
+ debugMode = true;
+ realTimePriority = false;
+ break;
+ case 'm': midiOnly = true; break;
+ case 'D': debugMsg = true; break;
+ case 'i': midiInputTrace = true; break;
+ case 'o': midiOutputTrace = true; break;
+ case 's': debugSync = true; break;
+ case 'p': loadPlugins = false; break;
+ case 'V': loadVST = false; break;
+ case 'I': loadDSSI = false; break;
+ default: usage(argv[0], "bad argument"); return -1;
+ }
+ }
+ if (midiOnly) {
+ loadDSSI = false;
+ loadPlugins = false;
+ loadVST = false;
+ }
+
+ bool useJACK = !(debugMode || midiOnly);
+ if (useJACK) {
+ if (initJackAudio()) {
+ if (!debugMode)
+ {
+ QMessageBox::critical(NULL, "MusE fatal error",
+ "MusE failed to find a Jack audio server.\n"
+ "Check that Jack was started.\n"
+ "If Jack was started check that it was\n"
+ "started as the same user as MusE.");
+ // fatalError("cannot start JACK");
+ }
+ else
+ {
+ fprintf(stderr, "fatal error: no JACK audio server found\n");
+ fprintf(stderr, "no audio functions available\n");
+ fprintf(stderr, "*** experimental mode -- no play possible ***\n");
+ }
+ useJACK = false;
+ debugMode = true;
+ }
+ }
+ if (!useJACK)
+ initDummyAudio();
+
+ argc -= optind;
+ ++argc;
+
+ if (debugMsg) {
+ printf("global lib: <%s>\n", museGlobalLib.toLatin1().data());
+ printf("global share: <%s>\n", museGlobalShare.toLatin1().data());
+ printf("muse home: <%s>\n", museUser.toLatin1().data());
+ printf("project dir: <%s>\n", museProject.toLatin1().data());
+ printf("config file: <%s>\n", configName.toLatin1().data());
+ }
+
+ static QTranslator translator;
+ QString lo(QLocale::system().name());
+
+ if (lo != "C") {
+ QString loc("muse_");
+ loc += lo;
+ if (translator.load(loc, QString(".")) == false) {
+ QString lp(museGlobalShare);
+ lp += QString("/locale");
+ if (translator.load(loc, lp) == false) {
+ printf("no locale <%s> in <%s>\n", loc.toLatin1().data(), lp.toLatin1().data());
+ }
+ }
+ qApp->installTranslator(&translator);
+ }
+
+ if (loadPlugins) {
+ initPlugins();
+ initMidiPlugins();
+ }
+ if (loadVST)
+ initVST();
+ if (loadDSSI)
+ initDSSI();
+
+ initIcons();
+ if (!midiOnly)
+ initMetronome();
+
+ if (debugMsg) {
+ QStringList list = app.libraryPaths();
+ QStringList::Iterator it = list.begin();
+ printf("QtLibraryPath:\n");
+ while(it != list.end()) {
+ printf(" <%s>\n", (*it).toLatin1().data());
+ ++it;
+ }
+ }
+
+ song = new Song();
+ muse = new MusE();
+ app.setMuse(muse);
+ muse->setWindowIcon(*museIcon);
+
+ //---------------------------------------------------
+ // load project
+ // if no songname entered on command line:
+ // startMode: 0 - load last song
+ // 1 - load default template
+ // 2 - load configured start song
+ //---------------------------------------------------
+
+ QString name;
+ bool useTemplate = false;
+ if (argc >= 2)
+ name = argv[optind];
+ else if (config.startMode == 0) {
+ if (argc < 2)
+ name = projectList[0] ? *projectList[0] : QString("untitled");
+ else
+ name = argv[0];
+ }
+ else if (config.startMode == 1) {
+ name = museGlobalShare + QString("/templates/default.med");
+ useTemplate = true;
+ }
+ else if (config.startMode == 2)
+ name = config.startSong;
+ muse->loadProjectFile(name, useTemplate, true);
+ muse->changeConfig(false);
+
+ if (!debugMode) {
+ if (mlockall(MCL_CURRENT | MCL_FUTURE))
+ perror("WARNING: Cannot lock memory:");
+ }
+ muse->show();
+ muse->seqStart();
+ int n = app.exec();
+ if (n)
+ fprintf(stderr, "app end %d\n", n);
+ return n;
+ }
+
+//---------------------------------------------------------
+// setFollow
+//---------------------------------------------------------
+
+void MusE::setFollow(FollowMode fm)
+ {
+ TimeCanvas::followMode = fm;
+ fid0->setChecked(fm == FOLLOW_NO);
+ fid1->setChecked(fm == FOLLOW_JUMP);
+ fid2->setChecked(fm == FOLLOW_CONTINUOUS);
+ changeConfig(true); // save settings
+ }
+
+//---------------------------------------------------------
+// cmd
+// some cmd's from pulldown menu
+//---------------------------------------------------------
+
+void MusE::cmd(QAction* a)
+ {
+ int cmd = a->data().toInt();
+ TrackList* tracks = song->tracks();
+ int l = song->lpos();
+ int r = song->rpos();
+
+ switch(cmd) {
+ case CMD_CUT:
+//TODO1 arranger->cmd(Arranger::CMD_CUT_PART);
+ break;
+ case CMD_COPY:
+//TODO1 arranger->cmd(Arranger::CMD_COPY_PART);
+ break;
+ case CMD_PASTE:
+//TODO1 arranger->cmd(Arranger::CMD_PASTE_PART);
+ break;
+ case CMD_DELETE:
+ song->startUndo();
+ if (song->msgRemoveParts()) {
+ song->endUndo(SC_PART_REMOVED);
+ break;
+ }
+ else {
+ // if there are no selected parts, delete
+ // selected tracks
+ //
+ audio->msgRemoveTracks();
+ }
+ song->endUndo(SC_TRACK_REMOVED);
+ break;
+ case CMD_DELETE_TRACK:
+ song->startUndo();
+ audio->msgRemoveTracks();
+ song->endUndo(SC_TRACK_REMOVED);
+ break;
+
+ case CMD_SELECT_ALL:
+ case CMD_SELECT_NONE:
+ case CMD_SELECT_INVERT:
+ case CMD_SELECT_ILOOP:
+ case CMD_SELECT_OLOOP:
+ for (iTrack i = tracks->begin(); i != tracks->end(); ++i) {
+ PartList* parts = (*i)->parts();
+ for (iPart p = parts->begin(); p != parts->end(); ++p) {
+ bool f = false;
+ int t1 = p->second->tick();
+ int t2 = t1 + p->second->lenTick();
+ bool inside =
+ ((t1 >= l) && (t1 < r))
+ || ((t2 > l) && (t2 < r))
+ || ((t1 <= l) && (t2 > r));
+ switch(cmd) {
+ case CMD_SELECT_INVERT:
+ f = !p->second->selected();
+ break;
+ case CMD_SELECT_NONE:
+ f = false;
+ break;
+ case CMD_SELECT_ALL:
+ f = true;
+ break;
+ case CMD_SELECT_ILOOP:
+ f = inside;
+ break;
+ case CMD_SELECT_OLOOP:
+ f = !inside;
+ break;
+ }
+ p->second->setSelected(f);
+ }
+ (*i)->partListChanged(); // repaints canvaswidget
+ }
+ song->update();
+ break;
+
+ case CMD_SELECT_PARTS:
+ for (iTrack i = tracks->begin(); i != tracks->end(); ++i) {
+ if (!(*i)->selected())
+ continue;
+ PartList* parts = (*i)->parts();
+ for (iPart p = parts->begin(); p != parts->end(); ++p)
+ p->second->setSelected(true);
+ }
+ song->update();
+ break;
+ case CMD_FOLLOW_NO:
+ setFollow(FOLLOW_NO);
+ break;
+ case CMD_FOLLOW_JUMP:
+ setFollow(FOLLOW_JUMP);
+ break;
+ case CMD_FOLLOW_CONTINUOUS:
+ setFollow(FOLLOW_CONTINUOUS);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// clipboardChanged
+//---------------------------------------------------------
+
+void MusE::clipboardChanged()
+ {
+#if 0 //TD
+ QString subtype("partlist");
+ QMimeSource* ms = QApplication::clipboard()->data(QClipboard::Clipboard);
+ if (ms == 0)
+ return;
+ bool flag = false;
+ for (int i = 0; ms->format(i); ++i) {
+// printf("Format <%s\n", ms->format(i));
+ if ((strncmp(ms->format(i), "text/midipartlist", 17) == 0)
+ || strncmp(ms->format(i), "text/wavepartlist", 17) == 0) {
+ flag = true;
+ break;
+ }
+ }
+ pasteAction->setEnabled(flag);
+#endif
+ }
+
+//---------------------------------------------------------
+// selectionChanged
+//---------------------------------------------------------
+
+void MusE::selectionChanged()
+ {
+ int k = 0;
+ TrackList* tl = song->tracks();
+ for (iTrack t = tl->begin(); t != tl->end(); ++t)
+ k += (*t)->selected();
+ cutAction->setEnabled(k == 1);
+ copyAction->setEnabled(k == 1);
+ song->updateSelectedTrack();
+ }
+
+//---------------------------------------------------------
+// transpose
+//---------------------------------------------------------
+
+void MusE::transpose()
+ {
+ Transpose *w = new Transpose();
+ w->show();
+ }
+
+//---------------------------------------------------------
+// modifyGateTime
+//---------------------------------------------------------
+
+void MusE::modifyGateTime()
+ {
+ GateTime* w = new GateTime(this);
+ w->show();
+ }
+
+//---------------------------------------------------------
+// modifyVelocity
+//---------------------------------------------------------
+
+void MusE::modifyVelocity()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// crescendo
+//---------------------------------------------------------
+
+void MusE::crescendo()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// thinOut
+//---------------------------------------------------------
+
+void MusE::thinOut()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// eraseEvent
+//---------------------------------------------------------
+
+void MusE::eraseEvent()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// noteShift
+//---------------------------------------------------------
+
+void MusE::noteShift()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// moveClock
+//---------------------------------------------------------
+
+void MusE::moveClock()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// copyMeasure
+//---------------------------------------------------------
+
+void MusE::copyMeasure()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// eraseMeasure
+//---------------------------------------------------------
+
+void MusE::eraseMeasure()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// deleteMeasure
+//---------------------------------------------------------
+
+void MusE::deleteMeasure()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// createMeasure
+//---------------------------------------------------------
+
+void MusE::createMeasure()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// mixTrack
+//---------------------------------------------------------
+
+void MusE::mixTrack()
+ {
+ printf("not implemented\n");
+ }
+
+//---------------------------------------------------------
+// configAppearance
+//---------------------------------------------------------
+
+void MusE::configAppearance()
+ {
+ if (!appearance)
+ appearance = new Appearance(arranger);
+ appearance->resetValues();
+ appearance->show();
+ }
+
+//---------------------------------------------------------
+// loadTheme
+//---------------------------------------------------------
+
+void MusE::loadTheme(const QString& s)
+ {
+ if (style()->objectName() != s)
+ QApplication::setStyle(s);
+ }
+
+//---------------------------------------------------------
+// configChanged
+// - called whenever configuration has changed
+// - when configuration has changed by user, call with
+// writeFlag=true to save configuration in ~/.MusE
+//---------------------------------------------------------
+
+void MusE::changeConfig(bool writeFlag)
+ {
+ if (writeFlag)
+ writeGlobalConfiguration();
+ loadTheme(config.style);
+ QApplication::setFont(*config.fonts[0]);
+ updateConfiguration();
+ emit configChanged();
+ }
+
+//---------------------------------------------------------
+// configShortCuts
+//---------------------------------------------------------
+
+void MusE::configShortCuts()
+ {
+ if (!shortcutConfig)
+ shortcutConfig = new ShortcutConfig(this);
+ shortcutConfig->_config_changed = false;
+ if (shortcutConfig->exec())
+ changeConfig(true);
+ }
+
+//---------------------------------------------------------
+// globalCut
+// - remove area between left and right locator
+// - do not touch muted track
+// - cut master track
+//---------------------------------------------------------
+
+void MusE::globalCut()
+ {
+ int lpos = song->lpos();
+ int rpos = song->rpos();
+ if ((lpos - rpos) >= 0)
+ return;
+
+ song->startUndo();
+ MidiTrackList* tracks = song->midis();
+ for (iMidiTrack it = tracks->begin(); it != tracks->end(); ++it) {
+ MidiTrack* track = *it;
+ if (track->mute())
+ continue;
+ PartList* pl = track->parts();
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ Part* part = p->second;
+ int t = part->tick();
+ int l = part->lenTick();
+ if (t + l <= lpos)
+ continue;
+ if ((t >= lpos) && ((t+l) <= rpos)) {
+ audio->msgRemovePart(part, false);
+ }
+ else if ((t < lpos) && ((t+l) > lpos) && ((t+l) <= rpos)) {
+ // remove part tail
+ int len = lpos - t;
+ Part* nPart = new Part(*part);
+ nPart->setLenTick(len);
+ //
+ // cut Events in nPart
+ EventList* el = nPart->events();
+ iEvent ie = el->lower_bound(t + len);
+ for (; ie != el->end();) {
+ iEvent i = ie;
+ ++ie;
+ audio->msgDeleteEvent(i->second, nPart, false);
+ }
+ audio->msgChangePart(part, nPart, false);
+ }
+ else if ((t < lpos) && ((t+l) > lpos) && ((t+l) > rpos)) {
+ //----------------------
+ // remove part middle
+ //----------------------
+
+ Part* nPart = new Part(*part);
+ EventList* el = nPart->events();
+ iEvent is = el->lower_bound(lpos);
+ iEvent ie = el->upper_bound(rpos);
+ for (iEvent i = is; i != ie;) {
+ iEvent ii = i;
+ ++i;
+ audio->msgDeleteEvent(ii->second, nPart, false);
+ }
+
+ ie = el->lower_bound(rpos);
+ for (; ie != el->end();) {
+ iEvent i = ie;
+ ++ie;
+ Event event = i->second;
+ Event nEvent = event.clone();
+ nEvent.setTick(nEvent.tick() - (rpos-lpos));
+ audio->msgChangeEvent(event, nEvent, nPart, false);
+ }
+ nPart->setLenTick(l - (rpos-lpos));
+ audio->msgChangePart(part, nPart, false);
+ }
+ else if ((t >= lpos) && (t < rpos) && (t+l) > rpos) {
+ // TODO: remove part head
+ }
+ else if (t >= rpos) {
+ Part* nPart = new Part(*part);
+ int nt = part->tick();
+ nPart->setTick(nt - (rpos -lpos));
+ audio->msgChangePart(part, nPart, false);
+ }
+ }
+ }
+ // TODO: cut tempo track
+ // TODO: process marker
+ song->endUndo(SC_TRACK_MODIFIED | SC_PART_MODIFIED | SC_PART_REMOVED);
+ }
+
+//---------------------------------------------------------
+// globalInsert
+// - insert empty space at left locator position upto
+// right locator
+// - do not touch muted track
+// - insert in master track
+//---------------------------------------------------------
+
+void MusE::globalInsert()
+ {
+ unsigned lpos = song->lpos();
+ unsigned rpos = song->rpos();
+ if (lpos >= rpos)
+ return;
+
+ song->startUndo();
+ MidiTrackList* tracks = song->midis();
+ for (iMidiTrack it = tracks->begin(); it != tracks->end(); ++it) {
+ MidiTrack* track = *it;
+ //
+ // process only non muted midi tracks
+ //
+ if (track->mute())
+ continue;
+ PartList* pl = track->parts();
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ Part* part = p->second;
+ unsigned t = part->tick();
+ int l = part->lenTick();
+ if (t + l <= lpos)
+ continue;
+ if (lpos >= t && lpos < (t+l)) {
+ Part* nPart = new Part(*part);
+ nPart->setLenTick(l + (rpos-lpos));
+ EventList* el = nPart->events();
+
+ iEvent i = el->end();
+ while (i != el->begin()) {
+ --i;
+ if (i->first < lpos)
+ break;
+ Event event = i->second;
+ Event nEvent = i->second.clone();
+ nEvent.setTick(nEvent.tick() + (rpos-lpos));
+ audio->msgChangeEvent(event, nEvent, nPart, false);
+ }
+ audio->msgChangePart(part, nPart, false);
+ }
+ else if (t > lpos) {
+ Part* nPart = new Part(*part);
+ nPart->setTick(t + (rpos -lpos));
+ audio->msgChangePart(part, nPart, false);
+ }
+ }
+ }
+ // TODO: process tempo track
+ // TODO: process marker
+ song->endUndo(SC_TRACK_MODIFIED | SC_PART_MODIFIED | SC_PART_REMOVED);
+ }
+
+//---------------------------------------------------------
+// globalSplit
+// - split all parts at the song position pointer
+// - do not touch muted track
+//---------------------------------------------------------
+
+void MusE::globalSplit()
+ {
+ int pos = song->cpos();
+ song->startUndo();
+ TrackList* tracks = song->tracks();
+ for (iTrack it = tracks->begin(); it != tracks->end(); ++it) {
+ Track* track = *it;
+ PartList* pl = track->parts();
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ Part* part = p->second;
+ int p1 = part->tick();
+ int l0 = part->lenTick();
+ if (pos > p1 && pos < (p1+l0)) {
+ Part* p1;
+ Part* p2;
+ track->splitPart(part, pos, p1, p2);
+ audio->msgChangePart(part, p1, false);
+ audio->msgAddPart(p2, false);
+ break;
+ }
+ }
+ }
+ song->endUndo(SC_TRACK_MODIFIED | SC_PART_MODIFIED | SC_PART_INSERTED);
+ }
+
+//---------------------------------------------------------
+// copyRange
+// - copy space between left and right locator position
+// to song position pointer
+// - dont process muted tracks
+// - create a new part for every track containing the
+// copied events
+//---------------------------------------------------------
+
+void MusE::copyRange()
+ {
+ QMessageBox::critical(this,
+ tr("MusE: Copy Range"),
+ tr("not implemented")
+ );
+ }
+
+//---------------------------------------------------------
+// cutEvents
+// - make sure that all events in a part end where the
+// part ends
+// - process only marked parts
+//---------------------------------------------------------
+
+void MusE::cutEvents()
+ {
+ QMessageBox::critical(this,
+ tr("MusE: Cut Events"),
+ tr("not implemented")
+ );
+ }
+
+//---------------------------------------------------------
+// checkRegionNotNull
+// return true if (rPos - lPos) <= 0
+//---------------------------------------------------------
+
+bool MusE::checkRegionNotNull()
+ {
+ int start = song->lPos().frame();
+ int end = song->rPos().frame();
+ if (end - start <= 0) {
+ QMessageBox::critical(this,
+ tr("MusE: Bounce"),
+ tr("set left/right marker for bounce range")
+ );
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// resetAllRecordFlags
+//---------------------------------------------------------
+
+static void resetAllRecordFlags()
+ {
+ WaveTrackList* wtl = song->waves();
+ for (iWaveTrack i = wtl->begin(); i != wtl->end(); ++i) {
+ if((*i)->recordFlag())
+ song->setRecordFlag(*i, false);
+ }
+ MidiTrackList* mtl = song->midis();
+ for (iMidiTrack i = mtl->begin(); i != mtl->end(); ++i) {
+ if((*i)->recordFlag())
+ song->setRecordFlag(*i, false);
+ }
+ }
+
+//---------------------------------------------------------
+// bounceToTrack
+//---------------------------------------------------------
+
+void MusE::bounceToTrack()
+ {
+ if (checkRegionNotNull())
+ return;
+ // search target track
+ TrackList* tl = song->tracks();
+ WaveTrack* track = 0;
+ for (iTrack it = tl->begin(); it != tl->end(); ++it) {
+ Track* t = *it;
+ if (t->selected()) {
+ if (track) {
+ QMessageBox::critical(this,
+ tr("MusE: Bounce to Track"),
+ tr("more than one target track selected")
+ );
+ return;
+ }
+ if (t->type() != Track::WAVE) {
+ QMessageBox::critical(this,
+ tr("MusE: Bounce to Track"),
+ tr("wrong target track type,\nselect wave track as target")
+ );
+ return;
+ }
+ track = (WaveTrack*)t;
+ }
+ }
+ if (track == 0) {
+ QMessageBox::critical(this,
+ tr("MusE: Bounce to Track"),
+ tr("no target track selected")
+ );
+ return;
+ }
+ song->bounceTrack = track;
+ song->setRecord(true);
+ resetAllRecordFlags();
+ song->setRecordFlag(track, true);
+ audio->msgBounce();
+ }
+
+//---------------------------------------------------------
+// bounceToFile
+//---------------------------------------------------------
+
+void MusE::bounceToFile()
+ {
+ if (checkRegionNotNull())
+ return;
+ SndFile* sf = getSndFile(0, this);
+ if (sf == 0)
+ return;
+ OutputList* ol = song->outputs();
+ AudioOutput* ao = ol->front();
+ if (ao == 0) {
+ QMessageBox::critical(this,
+ tr("MusE: Bounce to File"),
+ tr("no output track found")
+ );
+ return;
+ }
+ ao->setRecFile(sf);
+ song->setRecord(true);
+ resetAllRecordFlags();
+ song->setRecordFlag(ao, true);
+ audio->msgBounce();
+ }
+
+//---------------------------------------------------------
+// startEditInstrument
+//---------------------------------------------------------
+
+void MusE::startEditInstrument()
+ {
+ if (editInstrument == 0)
+ editInstrument = new EditInstrument(this);
+ editInstrument->show();
+ }
+
+//---------------------------------------------------------
+// updateConfiguration
+// called whenever the configuration has changed
+//---------------------------------------------------------
+
+void MusE::updateConfiguration()
+ {
+ fileOpenAction->setShortcut(shortcuts[SHRT_OPEN].key);
+ fileNewAction->setShortcut(shortcuts[SHRT_NEW].key);
+ fileSaveAction->setShortcut(shortcuts[SHRT_SAVE].key);
+
+ menuEditActions[CMD_DELETE]->setShortcut(shortcuts[SHRT_DELETE].key);
+ menu_ids[CMD_OPEN_RECENT]->setShortcut(shortcuts[SHRT_OPEN_RECENT].key);
+//TD menu_ids[CMD_LOAD_TEMPLATE]->setShortcut(shortcuts[SHRT_LOAD_TEMPLATE].key);
+ menu_ids[CMD_SAVE_AS]->setShortcut(shortcuts[SHRT_SAVE_AS].key);
+ menu_ids[CMD_IMPORT_MIDI]->setShortcut(shortcuts[SHRT_IMPORT_MIDI].key);
+ menu_ids[CMD_EXPORT_MIDI]->setShortcut(shortcuts[SHRT_EXPORT_MIDI].key);
+ menu_ids[CMD_IMPORT_AUDIO]->setShortcut(shortcuts[SHRT_IMPORT_AUDIO].key);
+ menu_ids[CMD_QUIT]->setShortcut(shortcuts[SHRT_QUIT].key);
+ menu_ids[CMD_OPEN_DRUMS]->setShortcut(shortcuts[SHRT_OPEN_DRUMS].key);
+ menu_ids[CMD_OPEN_LIST]->setShortcut(shortcuts[SHRT_OPEN_LIST].key);
+ menu_ids[CMD_OPEN_GRAPHIC_MASTER]->setShortcut(shortcuts[SHRT_OPEN_GRAPHIC_MASTER].key);
+ menu_ids[CMD_TRANSPOSE]->setShortcut(shortcuts[SHRT_TRANSPOSE].key);
+
+ menuEditActions[CMD_SELECT_ALL]->setShortcut(shortcuts[SHRT_SELECT_ALL].key);
+ menuEditActions[CMD_SELECT_NONE]->setShortcut(shortcuts[SHRT_SELECT_NONE].key);
+ menuEditActions[CMD_SELECT_INVERT]->setShortcut(shortcuts[SHRT_SELECT_INVERT].key);
+ menuEditActions[CMD_SELECT_ILOOP]->setShortcut(shortcuts[SHRT_SELECT_ILOOP].key);
+ menuEditActions[CMD_SELECT_OLOOP]->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key);
+ menuEditActions[CMD_SELECT_PARTS]->setShortcut(shortcuts[SHRT_SELECT_PRTSTRACK].key);
+
+ tr_id->setShortcut(shortcuts[SHRT_OPEN_TRANSPORT].key);
+ tr_id->setShortcutContext(Qt::ApplicationShortcut);
+ bt_id->setShortcut(shortcuts[SHRT_OPEN_BIGTIME].key);
+ bt_id->setShortcutContext(Qt::ApplicationShortcut);
+ mk_id->setShortcut(shortcuts[SHRT_OPEN_MARKER].key);
+ mk_id->setShortcutContext(Qt::ApplicationShortcut);
+
+ pianoAction->setShortcut(shortcuts[SHRT_OPEN_PIANO].key); //pianoroll
+
+ menu_ids[CMD_GLOBAL_CUT]->setShortcut(shortcuts[SHRT_GLOBAL_CUT].key);
+ menu_ids[CMD_GLOBAL_INSERT]->setShortcut(shortcuts[SHRT_GLOBAL_INSERT].key);
+ menu_ids[CMD_GLOBAL_SPLIT]->setShortcut(shortcuts[SHRT_GLOBAL_SPLIT].key);
+ menu_ids[CMD_COPY_RANGE]->setShortcut(shortcuts[SHRT_COPY_RANGE].key);
+ menu_ids[CMD_CUT_EVENTS]->setShortcut(shortcuts[SHRT_CUT_EVENTS].key);
+
+ menu_ids[CMD_MIDI_EDIT_INSTRUMENTS]->setShortcut(shortcuts[SHRT_MIDI_EDIT_INSTRUMENTS].key);
+ //aid1a
+ //aid1b // mixer 1
+ // aid2;
+ // aid3;
+ //mpid0 // midi plugin transpose
+ //mpid3 // midi remote control
+
+ menu_ids[CMD_MIDI_RESET]->setShortcut(shortcuts[SHRT_MIDI_RESET].key);
+ menu_ids[CMD_MIDI_INIT]->setShortcut(shortcuts[SHRT_MIDI_INIT].key);
+ menu_ids[CMD_MIDI_LOCAL_OFF]->setShortcut(shortcuts[SHRT_MIDI_LOCAL_OFF].key);
+
+ menu_ids[CMD_AUDIO_BOUNCE_TO_TRACK]->setShortcut(shortcuts[CMD_AUDIO_BOUNCE_TO_TRACK].key);
+ menu_ids[CMD_AUDIO_BOUNCE_TO_FILE]->setShortcut(shortcuts[CMD_AUDIO_BOUNCE_TO_FILE].key);
+
+ menu_ids[CMD_GLOBAL_CONFIG]->setShortcut(shortcuts[SHRT_GLOBAL_CONFIG].key);
+ menu_ids[CMD_CONFIG_SHORTCUTS]->setShortcut(shortcuts[SHRT_CONFIG_SHORTCUTS].key);
+
+ // Follow options
+ fid0->setShortcut(shortcuts[SHRT_FOLLOW_NO].key);
+ fid1->setShortcut(shortcuts[SHRT_FOLLOW_JUMP].key);
+ fid2->setShortcut(shortcuts[SHRT_FOLLOW_CONTINUOUS].key);
+
+ menu_ids[CMD_CONFIG_MIDISYNC]->setShortcut(shortcuts[SHRT_CONFIG_MIDISYNC].key);
+ menu_ids[CMD_MIDI_FILE_CONFIG]->setShortcut(shortcuts[SHRT_MIDI_FILE_CONFIG].key);
+ menu_ids[CMD_APPEARANCE_SETTINGS]->setShortcut(shortcuts[SHRT_APPEARANCE_SETTINGS].key);
+
+ menu_ids[CMD_OPEN_HELP]->setShortcut(shortcuts[SHRT_OPEN_HELP].key);
+// menu_ids[CMD_OPEN_HOMEPAGE]->setShortcut(shortcuts[SHRT_OPEN_HOMEPAGE].key);
+// menu_ids[CMD_OPEN_BUG]->setShortcut(shortcuts[SHRT_OPEN_BUG].key);
+ menu_ids[CMD_START_WHATSTHIS]->setShortcut(shortcuts[SHRT_START_WHATSTHIS].key);
+#if 0 //TD
+ menuEdit->setShortcut(shortcuts[SHRT_OPEN_MIDI_TRANSFORM].key, menu_ids[CMD_OPEN_MIDI_TRANSFORM]);
+
+ master->setShortcut(shortcuts[SHRT_OPEN_LIST_MASTER].key, menu_ids[CMD_OPEN_LIST_MASTER]);
+
+ menuView->setShortcut(shortcuts[SHRT_OPEN_MIXER].key, aid1a);
+
+ menuSettings->setShortcut(shortcuts[SHRT_CONFIG_METRONOME].key, menu_ids[CMD_CONFIG_METRONOME]);
+ menuSettings->setShortcut(shortcuts[SHRT_CONFIG_AUDIO_PORTS].key, menu_ids[CMD_CONFIG_AUDIO_PORTS]);
+
+ menu_audio->setShortcut(shortcuts[SHRT_AUDIO_RESTART].key, menu_ids[CMD_AUDIO_RESTART]);
+
+// menuAutomation->setShortcut(shortcuts[SHRT_MIXER_SNAPSHOT].key, menu_ids[CMD_MIXER_SNAPSHOT]);
+// menuAutomation->setShortcut(shortcuts[SHRT_MIXER_AUTOMATION_CLEAR].key, menu_ids[CMD_MIXER_AUTOMATION_CLEAR]);
+
+
+
+// select->setShortcut(shortcuts[SHRT_DESEL_PARTS].key, CMD_SELECT_NONE);
+
+ midiInputPlugins->setShortcut(shortcuts[SHRT_MIDI_INPUT_TRANSPOSE].key, 0);
+ midiInputPlugins->setShortcut(shortcuts[SHRT_MIDI_INPUT_TRANSFORM].key, 1);
+ midiInputPlugins->setShortcut(shortcuts[SHRT_MIDI_INPUT_FILTER].key, 2);
+ midiInputPlugins->setShortcut(shortcuts[SHRT_MIDI_REMOTE_CONTROL].key, 3);
+ midiInputPlugins->setShortcut(shortcuts[SHRT_RANDOM_RHYTHM_GENERATOR].key, 4);
+
+ addTrack->setShortcut(shortcuts[SHRT_ADD_MIDI_TRACK].key, Track::MIDI);
+ addTrack->setShortcut(shortcuts[SHRT_ADD_WAVE_TRACK].key, Track::WAVE);
+ addTrack->setShortcut(shortcuts[SHRT_ADD_AUDIO_OUTPUT].key, Track::AUDIO_OUTPUT);
+ addTrack->setShortcut(shortcuts[SHRT_ADD_AUDIO_GROUP].key, Track::AUDIO_GROUP);
+ addTrack->setShortcut(shortcuts[SHRT_ADD_AUDIO_INPUT].key, Track::AUDIO_INPUT);
+ addTrack->setShortcut(shortcuts[SHRT_ADD_AUDIO_AUX].key, Track::AUDIO_AUX);
+#endif
+ }
+
+//---------------------------------------------------------
+// showBigtime
+//---------------------------------------------------------
+
+void MusE::showBigtime(bool on)
+ {
+ if (on && bigtime == 0) {
+ bigtime = new BigTime(0);
+ bigtime->setPos(0, song->cpos(), false);
+ connect(song, SIGNAL(posChanged(int,const AL::Pos&, bool)), bigtime, SLOT(setPos(int,const AL::Pos&, bool)));
+ connect(muse, SIGNAL(configChanged()), bigtime, SLOT(configChanged()));
+ connect(bigtime, SIGNAL(closed()), SLOT(bigtimeClosed()));
+ bigtime->resize(config.geometryBigTime.size());
+ bigtime->move(config.geometryBigTime.topLeft());
+ }
+ if (bigtime)
+ bigtime->setShown(on);
+ bt_id->setChecked(on);
+ }
+
+//---------------------------------------------------------
+// showMarker
+//---------------------------------------------------------
+
+void MusE::showMarker(bool on)
+ {
+ if (on && markerView == 0) {
+ markerView = new MarkerView;
+ connect(markerView, SIGNAL(closed()), SLOT(markerClosed()));
+ }
+ if (markerView)
+ markerView->setShown(on);
+ mk_id->setChecked(on);
+ }
+
+//---------------------------------------------------------
+// markerClosed
+//---------------------------------------------------------
+
+void MusE::markerClosed()
+ {
+ mk_id->setChecked(false);
+ markerView = 0;
+ }
+
+//---------------------------------------------------------
+// bigtimeClosed
+//---------------------------------------------------------
+
+void MusE::bigtimeClosed()
+ {
+ bt_id->setChecked(false);
+ }
+
+//---------------------------------------------------------
+// transportClosed
+//---------------------------------------------------------
+
+void MusE::transportClosed()
+ {
+ tr_id->setChecked(false);
+ }
+
+//---------------------------------------------------------
+// showMixer1
+//---------------------------------------------------------
+
+void MusE::showMixer1(bool on)
+ {
+ if (on && mixer1 == 0) {
+ mixer1 = new Mixer(this, &(config.mixer1));
+ connect(mixer1, SIGNAL(closed()), SLOT(mixer1Closed()));
+ mixer1->resize(config.mixer1.geometry.size());
+ mixer1->move(config.mixer1.geometry.topLeft());
+ }
+ if (mixer1)
+ mixer1->setShown(on);
+ aid1a->setChecked(on);
+ }
+
+//---------------------------------------------------------
+// showMixer2
+//---------------------------------------------------------
+
+void MusE::showMixer2(bool on)
+ {
+ if (on && mixer2 == 0) {
+ mixer2 = new Mixer(this, &(config.mixer2));
+ connect(mixer2, SIGNAL(closed()), SLOT(mixer2Closed()));
+ mixer2->resize(config.mixer2.geometry.size());
+ mixer2->move(config.mixer2.geometry.topLeft());
+ }
+ if (mixer2)
+ mixer2->setShown(on);
+ aid1b->setChecked(on);
+ }
+
+//---------------------------------------------------------
+// mixer1Closed
+//---------------------------------------------------------
+
+void MusE::mixer1Closed()
+ {
+ aid1a->setChecked(false);
+ }
+
+//---------------------------------------------------------
+// mixer2Closed
+//---------------------------------------------------------
+
+void MusE::mixer2Closed()
+ {
+ aid1b->setChecked(false);
+ }
+
+//---------------------------------------------------------
+// transportWindow
+//---------------------------------------------------------
+
+QWidget* MusE::transportWindow()
+ {
+ return transport;
+ }
+
+//---------------------------------------------------------
+// bigtimeWindow
+//---------------------------------------------------------
+
+QWidget* MusE::bigtimeWindow()
+ {
+ return bigtime;
+ }
+
+//---------------------------------------------------------
+// mixer1Window
+//---------------------------------------------------------
+
+QWidget* MusE::mixer1Window()
+ {
+ return mixer1;
+ }
+
+//---------------------------------------------------------
+// mixer2Window
+//---------------------------------------------------------
+
+QWidget* MusE::mixer2Window()
+ {
+ return mixer2;
+ }
+
+//---------------------------------------------------------
+// focusInEvent
+//---------------------------------------------------------
+
+void MusE::focusInEvent(QFocusEvent* ev)
+ {
+ if (mixer1)
+ mixer1->raise();
+ if (mixer2)
+ mixer2->raise();
+ raise();
+ QMainWindow::focusInEvent(ev);
+ }
+
+//---------------------------------------------------------
+// setTool
+//---------------------------------------------------------
+
+void MusE::setTool(int tool)
+ {
+ tools1->set(tool);
+ arranger->setTool(tool);
+ }
+
+//---------------------------------------------------------
+// globalPitchChanged
+//---------------------------------------------------------
+
+void MusE::globalPitchChanged(int val)
+ {
+ song->setGlobalPitchShift(val);
+ }
+
+//---------------------------------------------------------
+// globalTempoChanged
+//---------------------------------------------------------
+
+void MusE::globalTempoChanged(int val)
+ {
+ audio->msgSetGlobalTempo(val);
+ song->update(SC_TEMPO);
+ }
+
+//---------------------------------------------------------
+// setTempo50
+//---------------------------------------------------------
+
+void MusE::setTempo50()
+ {
+ setGlobalTempo(50);
+ }
+
+//---------------------------------------------------------
+// setTempo100
+//---------------------------------------------------------
+
+void MusE::setTempo100()
+ {
+ setGlobalTempo(100);
+ }
+
+//---------------------------------------------------------
+// setTempo200
+//---------------------------------------------------------
+
+void MusE::setTempo200()
+ {
+ setGlobalTempo(200);
+ }
+
+//---------------------------------------------------------
+// setGlobalTempo
+//---------------------------------------------------------
+
+void MusE::setGlobalTempo(int val)
+ {
+ globalTempoSpinBox->setValue(val);
+ }
+
diff --git a/muse/muse/muse.h b/muse/muse/muse.h
new file mode 100644
index 00000000..df9267c5
--- /dev/null
+++ b/muse/muse/muse.h
@@ -0,0 +1,308 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __APP_H__
+#define __APP_H__
+
+#define VERSION "1.0"
+#define PACKAGEVERSION "1.0"
+#define INSTPREFIX "/usr/bin"
+
+#include "ui_muse.h"
+#include "cobject.h"
+#include "widgets/tools.h"
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+class Part;
+class PartList;
+class Transport;
+class BigTime;
+class Arranger;
+class Track;
+class MidiSyncConfig;
+class MRConfig;
+class MetronomeConfig;
+class AudioConf;
+class MidiFileConfig;
+class MidiFilterConfig;
+class MarkerView;
+class GlobalSettingsConfig;
+class MidiInputTransformDialog;
+class MidiTransformerDialog;
+class RhythmGen;
+class MidiTrack;
+class ShortcutConfig;
+class Appearance;
+class EditInstrument;
+class Mixer;
+class ExportMidiDialog;
+
+extern void configMidiController();
+
+//---------------------------------------------------------
+// MusE
+//---------------------------------------------------------
+
+class MusE : public QMainWindow, public Ui::MuseBase
+// class MusE : public QMainWindow
+ {
+ Q_OBJECT
+ enum {
+ CMD_CUT, CMD_COPY, CMD_PASTE, CMD_DELETE,
+ CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT,
+ CMD_SELECT_ILOOP, CMD_SELECT_OLOOP, CMD_SELECT_PARTS,
+ CMD_FOLLOW_NO, CMD_FOLLOW_JUMP, CMD_FOLLOW_CONTINUOUS,
+ CMD_DELETE_TRACK
+ };
+
+ //File menu items:
+ enum { CMD_OPEN_RECENT=0, CMD_LOAD_TEMPLATE, CMD_SAVE_AS, CMD_IMPORT_MIDI,
+ CMD_EXPORT_MIDI, CMD_IMPORT_AUDIO, CMD_QUIT, CMD_OPEN_DRUMS,
+ CMD_OPEN_LIST, CMD_OPEN_LIST_MASTER, CMD_GLOBAL_CONFIG,
+ CMD_OPEN_GRAPHIC_MASTER, CMD_OPEN_MIDI_TRANSFORM, CMD_TRANSPOSE,
+ CMD_GLOBAL_CUT, CMD_GLOBAL_INSERT, CMD_GLOBAL_SPLIT, CMD_COPY_RANGE,
+ CMD_CUT_EVENTS, CMD_CONFIG_SHORTCUTS, CMD_CONFIG_METRONOME, CMD_CONFIG_MIDISYNC,
+ CMD_MIDI_FILE_CONFIG, CMD_APPEARANCE_SETTINGS, CMD_CONFIG_AUDIO_PORTS,
+ CMD_MIDI_EDIT_INSTRUMENTS, CMD_MIDI_RESET, CMD_MIDI_INIT, CMD_MIDI_LOCAL_OFF,
+ CMD_MIXER_SNAPSHOT, CMD_MIXER_AUTOMATION_CLEAR, CMD_OPEN_HELP, CMD_OPEN_HOMEPAGE,
+ CMD_OPEN_BUG, CMD_START_WHATSTHIS,
+ CMD_AUDIO_BOUNCE_TO_FILE, CMD_AUDIO_BOUNCE_TO_TRACK, CMD_AUDIO_RESTART,
+ CMD_LAST };
+
+ QAction* menu_ids[CMD_LAST];
+
+ QAction* fileSaveAction;
+ QAction* fileOpenAction;
+ QAction* pianoAction;
+ QAction* fileNewAction;
+ QString appName;
+
+ QFileInfo project;
+ QToolBar *tools;
+ EditToolBar *tools1;
+ int _raster;
+
+ Transport* transport;
+ QAction* tr_id;
+ BigTime* bigtime;
+ QAction* bt_id;
+ MarkerView* markerView;
+ QAction* mk_id;
+ Mixer* mixer1;
+ QAction* aid1a;
+ Mixer* mixer2;
+ QAction* aid1b;
+
+ EditInstrument* editInstrument;
+
+ QMenu *menu_file, *menuView, *menuSettings, *menu_help;
+ QMenu *menuEdit, *menuStructure;
+ QAction* menuEditActions[CMD_DELETE_TRACK + 1];
+ QMenu* menu_audio;
+ QMenu* menu_functions;
+ QMenu* select, *master, *midiEdit, *addTrack;
+ QMenu* follow;
+ QMenu* midiInputPlugins;
+
+ QAction* aid2;
+ QAction* aid3;
+ QAction* fid0;
+ QAction* fid1;
+ QAction* fid2;
+ QAction* cutAction;
+ QAction* copyAction;
+ QAction* pasteAction;
+
+ QWidget* midiPortConfig;
+ QWidget* softSynthesizerConfig;
+ MidiSyncConfig* midiSyncConfig;
+ MRConfig* midiRemoteConfig;
+ RhythmGen* midiRhythmGenerator;
+ MetronomeConfig* metronomeConfig;
+ AudioConf* audioConfig;
+ MidiFileConfig* midiFileConfig;
+ GlobalSettingsConfig* globalSettingsConfig;
+ MidiFilterConfig* midiFilterConfig;
+ MidiInputTransformDialog* midiInputTransform;
+ ShortcutConfig* shortcutConfig;
+ Appearance* appearance;
+ ExportMidiDialog* exportMidiDialog;
+
+ MidiTransformerDialog* midiTransformerDialog;
+ QMenu* openRecent;
+ QSpinBox* globalTempoSpinBox;
+
+ //------------------------------------------
+
+ bool readMidi(FILE*);
+ bool read(QFile*, bool skipConfig);
+ void read10(QDomNode);
+ void read20(QDomNode);
+ void processTrack(MidiTrack* track);
+
+ void write(Xml& xml) const;
+ bool save(const QString&, bool);
+ void setUntitledProject();
+
+ void setFollow(FollowMode);
+ void readConfigParts(QDomNode);
+ void readCtrl(QDomNode, int port, int channel);
+ void readToplevels(QDomNode);
+ PartList* getMidiPartsToEdit();
+ Part* readPart(QDomNode);
+ bool checkRegionNotNull();
+ void loadProjectFile1(const QString&, bool songTemplate, bool loadAll);
+ void writeGlobalConfiguration(Xml&) const;
+ void writeConfiguration(Xml&) const;
+ void updateConfiguration();
+
+ virtual void focusInEvent(QFocusEvent*);
+
+ signals:
+ void configChanged();
+ void rasterChanged(int);
+ void startLoadSong();
+
+ private slots:
+ void loadProject();
+ bool save();
+ void configGlobalSettings();
+ void quitDoc();
+ void about();
+ void aboutQt();
+ void startHelpBrowser();
+ void startHomepageBrowser();
+ void startBugBrowser();
+ void launchBrowser(QString &whereTo);
+ void importMidi();
+ void importWave();
+ bool importWave(const QString&);
+ void exportMidi();
+
+ void configMidiSync();
+ void configMidiFile();
+ void configShortCuts();
+ void configAppearance();
+ void startMasterEditor();
+ void startListEditor();
+ void startListEditor(PartList*);
+ void startDrumEditor();
+ void startDrumEditor(PartList* pl);
+ void startEditor(Part*);
+ void startEditor(PartList*, int);
+ void startPianoroll();
+ void startPianoroll(PartList* pl);
+ void startWaveEditor();
+ void startWaveEditor(PartList*);
+// void startMidiTransformer();
+ void writeGlobalConfiguration() const;
+ void startEditInstrument();
+
+ void openRecentMenu();
+ void selectProject(QAction*);
+ void cmd(QAction*);
+ void clipboardChanged();
+ void transpose();
+ void modifyGateTime();
+ void modifyVelocity();
+ void crescendo();
+ void thinOut();
+ void eraseEvent();
+ void noteShift();
+ void moveClock();
+ void copyMeasure();
+ void eraseMeasure();
+ void deleteMeasure();
+ void createMeasure();
+ void mixTrack();
+ void globalCut();
+ void globalInsert();
+ void globalSplit();
+ void copyRange();
+ void cutEvents();
+ void bounceToTrack();
+ void resetMidiDevices();
+ void initMidiDevices();
+ void localOff();
+ void bigtimeClosed();
+ void transportClosed();
+ void markerClosed();
+ void mixer1Closed();
+ void mixer2Closed();
+ void setRaster(int);
+ void syncChanged();
+
+ public slots:
+ bool saveAs();
+ void bounceToFile();
+ void closeEvent(QCloseEvent*e);
+ void loadProjectFile(const QString&);
+ void loadProjectFile(const QString&, bool songTemplate, bool loadAll);
+ void loadTheme(const QString&);
+ bool seqStart();
+ void loadTemplate();
+ void showTransport(bool flag);
+ void showBigtime(bool);
+ void showMixer1(bool);
+ void showMixer2(bool);
+ void showMarker(bool on);
+ void importMidi(const QString &file);
+ void globalPitchChanged(int val);
+ void globalTempoChanged(int val);
+ bool seqRestart();
+ void setTempo50();
+ void setTempo100();
+ void setTempo200();
+ void setGlobalTempo(int val);
+ void setTool(int);
+ void startEditor(Part*, int);
+
+ public:
+ MusE();
+ Arranger* arranger;
+ QRect configGeometryMain;
+ bool importMidi(const QString name, bool merge);
+ void kbAccel(int);
+ void changeConfig(bool writeFlag);
+
+ void seqStop();
+ void setHeartBeat();
+ QWidget* transportWindow();
+ QWidget* bigtimeWindow();
+ QWidget* mixer1Window();
+ QWidget* mixer2Window();
+ bool importWaveToTrack(QString& name, Track* track);
+
+ void selectionChanged();
+
+ int version; // last *.med file version
+ // 0xaabb aa - major version, bb minor version
+ int raster() const { return _raster; }
+ void setupTransportToolbar(QToolBar* tb) const;
+ };
+
+extern MusE* muse;
+
+#endif
+
diff --git a/muse/muse/muse.qrc b/muse/muse/muse.qrc
new file mode 100644
index 00000000..b5132647
--- /dev/null
+++ b/muse/muse/muse.qrc
@@ -0,0 +1,19 @@
+<!DOCTYPE RCC>
+<RCC version="1.0">
+ <qresource>
+ <file>xpm/muse_icon_64x64.png</file>
+ <file>xpm/splash.png</file>
+ <file>xpm/filenew.png</file>
+ <file>xpm/fileopen.png</file>
+ <file>xpm/filesave.png</file>
+ <file>xpm/punchin.xpm</file>
+ <file>xpm/punchout.xpm</file>
+ <file>xpm/loop.xpm</file>
+ <file>xpm/start.xpm</file>
+ <file>xpm/stop.xpm</file>
+ <file>xpm/play.xpm</file>
+ <file>xpm/frewind.xpm</file>
+ <file>xpm/fforward.xpm</file>
+ </qresource>
+</RCC>
+
diff --git a/muse/muse/muse.ui b/muse/muse/muse.ui
new file mode 100644
index 00000000..e8fda401
--- /dev/null
+++ b/muse/muse/muse.ui
@@ -0,0 +1,87 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MuseBase</class>
+ <widget class="QMainWindow" name="MuseBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>600</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE</string>
+ </property>
+ <widget class="QWidget" name="centralwidget" />
+ <widget class="QMenuBar" name="menubar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>35</height>
+ </rect>
+ </property>
+ </widget>
+ <action name="startAction" >
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/start.xpm</iconset>
+ </property>
+ <property name="text" >
+ <string>start action</string>
+ </property>
+ </action>
+ <action name="rewindAction" >
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/frewind.xpm</iconset>
+ </property>
+ <property name="text" >
+ <string>rewind</string>
+ </property>
+ </action>
+ <action name="forwardAction" >
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/fforward.xpm</iconset>
+ </property>
+ <property name="text" >
+ <string>forward</string>
+ </property>
+ </action>
+ <action name="stopAction" >
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/stop.xpm</iconset>
+ </property>
+ <property name="text" >
+ <string>stop</string>
+ </property>
+ </action>
+ <action name="playAction" >
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="checked" >
+ <bool>false</bool>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/play.xpm</iconset>
+ </property>
+ <property name="text" >
+ <string>play</string>
+ </property>
+ </action>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources>
+ <include location="../muse.qrc" />
+ </resources>
+ <connections/>
+</ui>
diff --git a/muse/muse/part.cpp b/muse/muse/part.cpp
new file mode 100644
index 00000000..e2ead652
--- /dev/null
+++ b/muse/muse/part.cpp
@@ -0,0 +1,551 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "part.h"
+#include "track.h"
+#include "globals.h"
+#include "event.h"
+#include "audio.h"
+#include "al/tempo.h"
+
+const char* partColorNames[] = {
+ "Default",
+ "Refrain",
+ "Bridge",
+ "Intro",
+ "Coda",
+ "Chorus",
+ "Solo",
+ "Brass",
+ "Percussion",
+ "Drums",
+ "Guitar",
+ "Bass",
+ "Flute",
+ "Strings",
+ "Keyboard",
+ "Piano",
+ "Saxophon",
+ };
+
+CloneList cloneList;
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void Part::init()
+ {
+ _raster = -1; // invalid
+ _quant = -1;
+ _xmag = -1.0;
+
+ _selected = false;
+ _mute = false;
+ _colorIndex = 0;
+ _fillLen = 0;
+ _events->incRef(1);
+ _events->incARef(1);
+ if (_track->type() == Track::WAVE)
+ setType(AL::FRAMES);
+ }
+
+//---------------------------------------------------------
+// Part
+//---------------------------------------------------------
+
+Part::Part(Track* t)
+ {
+ _track = t;
+ _events = new EventList;
+ init();
+ }
+
+Part::Part(const Part& p)
+ : PosLen(p)
+ {
+ _track = p._track;
+ _selected = p._selected;
+ _mute = p._mute;
+ _colorIndex = p._colorIndex;
+ _name = p._name;
+ _events = p._events;
+ _quant = p._quant;
+ _raster = p._raster;
+ _xmag = p._xmag;
+ _fillLen = p._fillLen;
+ _events->incRef(1);
+ }
+
+Part::Part(const Part& p, EventList* el)
+ : PosLen(p)
+ {
+ _track = p._track;
+ _selected = p._selected;
+ _mute = p._mute;
+ _colorIndex = p._colorIndex;
+ _name = p._name;
+ _quant = p._quant;
+ _raster = p._raster;
+ _xmag = p._xmag;
+ _fillLen = p._fillLen;
+ _events = el;
+ _events->incRef(1);
+ _events->incARef(1);
+ }
+
+//---------------------------------------------------------
+// Part
+//---------------------------------------------------------
+
+Part::Part(Track* t, EventList* el)
+ {
+ _track = t;
+ _events = el;
+ init();
+ }
+
+//---------------------------------------------------------
+// Part
+//---------------------------------------------------------
+
+Part::~Part()
+ {
+ _events->incRef(-1);
+ if (_events->refCount() <= 0)
+ delete _events;
+ }
+
+//---------------------------------------------------------
+// addEvent
+//---------------------------------------------------------
+
+iEvent Part::addEvent(Event& p)
+ {
+ return _events->add(p);
+ }
+
+//---------------------------------------------------------
+// index
+//---------------------------------------------------------
+
+int PartList::index(Part* part)
+ {
+ int index = 0;
+ for (iPart i = begin(); i != end(); ++i, ++index)
+ if (i->second == part) {
+ return index;
+ }
+ printf("PartList::index(): not found!\n");
+ abort();
+// return 0;
+ }
+
+//---------------------------------------------------------
+// find
+//---------------------------------------------------------
+
+Part* PartList::find(int idx)
+ {
+ int index = 0;
+ for (iPart i = begin(); i != end(); ++i, ++index)
+ if (index == idx)
+ return i->second;
+ return 0;
+ }
+
+//---------------------------------------------------------
+// findPart
+// search for part which contains tick
+//---------------------------------------------------------
+
+Part* PartList::findPart(unsigned tick)
+ {
+ iPart i = lower_bound(tick);
+ if (i != begin())
+ --i;
+ for (; i != end(); ++i) {
+ unsigned tick1 = i->second->tick();
+ unsigned tick2 = tick1 + i->second->lenTick();
+
+ if (tick >= tick2)
+ continue;
+ if (tick >= tick1)
+ return i->second;
+ if (tick < tick1)
+ break;
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// add
+//---------------------------------------------------------
+
+iPart PartList::add(Part* part)
+ {
+ return insert(std::pair<const unsigned, Part*> (part->tick(), part));
+ }
+
+//---------------------------------------------------------
+// remove
+//---------------------------------------------------------
+
+void PartList::remove(Part* part)
+ {
+ iPart i;
+ for (i = begin(); i != end(); ++i) {
+ if (i->second == part) {
+ erase(i);
+ return;
+ }
+ }
+printf("remove part: not found\n");
+ assert(i != end());
+ }
+
+//---------------------------------------------------------
+// splitPart
+// split part "part" at "tick" position
+// create two new parts p1 and p2
+//---------------------------------------------------------
+
+void Track::splitPart(Part* part, int tickpos, Part*& p1, Part*& p2)
+ {
+ int l1 = 0; // len of first new part (ticks or samples)
+ int l2 = 0; // len of second new part
+
+ int samplepos = AL::tempomap.tick2frame(tickpos);
+
+ switch (type()) {
+ case WAVE:
+ l1 = samplepos - part->frame();
+ l2 = part->lenFrame() - l1;
+ break;
+ case MIDI:
+ l1 = tickpos - part->tick();
+ l2 = part->lenTick() - l1;
+ break;
+ default:
+ return;
+ }
+
+ if (l1 <= 0 || l2 <= 0)
+ return;
+
+ p1 = newPart(part); // new left part
+ p2 = newPart(part); // new right part
+
+ switch (type()) {
+ case WAVE:
+ p1->setLenFrame(l1);
+ p2->setFrame(samplepos);
+ p2->setLenFrame(l2);
+ break;
+ case MIDI:
+ p1->setLenTick(l1);
+ p2->setTick(tickpos);
+ p2->setLenTick(l2);
+ break;
+ default:
+ break;
+ }
+
+ EventList* se = part->events();
+ EventList* de1 = p1->events();
+ EventList* de2 = p2->events();
+
+ if (type() == WAVE) {
+ int ps = part->frame();
+ int d1p1 = p1->frame();
+ int d2p1 = p1->endFrame();
+ int d1p2 = p2->frame();
+ int d2p2 = p2->endFrame();
+ for (iEvent ie = se->begin(); ie != se->end(); ++ie) {
+ Event event = ie->second;
+ int s1 = event.frame() + ps;
+ int s2 = event.endFrame() + ps;
+
+ if ((s2 > d1p1) && (s1 < d2p1)) {
+ Event si = event.mid(d1p1 - ps, d2p1 - ps);
+ de1->add(si);
+ }
+ if ((s2 > d1p2) && (s1 < d2p2)) {
+ Event si = event.mid(d1p2 - ps, d2p2 - ps);
+ si.setFrame(si.frame() - l1); //??
+ si.setFrame(0); //??
+ de2->add(si);
+ }
+ }
+ }
+ else {
+ for (iEvent ie = se->begin(); ie != se->end(); ++ie) {
+ Event event = ie->second.clone();
+ int t = event.tick();
+ if (t >= l1) {
+ event.move(-l1);
+ de2->add(event);
+ }
+ else
+ de1->add(event);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// cmdSplitPart
+//---------------------------------------------------------
+
+void Song::cmdSplitPart(Part* part, const Pos& pos)
+ {
+ int tick = pos.tick();
+ int l1 = tick - part->tick();
+ int l2 = part->lenTick() - l1;
+ if (l1 <= 0 || l2 <= 0)
+ return;
+ Part* p1;
+ Part* p2;
+ part->track()->splitPart(part, tick, p1, p2);
+
+ startUndo();
+ audio->msgChangePart(part, p1, false);
+ audio->msgAddPart(p2, false);
+ endUndo(SC_TRACK_MODIFIED | SC_PART_MODIFIED | SC_PART_INSERTED);
+ part->track()->partListChanged();
+ }
+
+//---------------------------------------------------------
+// cmdGluePart
+//---------------------------------------------------------
+
+void Song::cmdGluePart(Part* oPart)
+ {
+ Track* track = oPart->track();
+ PartList* pl = track->parts();
+ Part* nextPart = 0;
+
+ for (iPart ip = pl->begin(); ip != pl->end(); ++ip) {
+ if (ip->second == oPart) {
+ ++ip;
+ if (ip == pl->end())
+ return;
+ nextPart = ip->second;
+ break;
+ }
+ }
+
+ Part* nPart = track->newPart(oPart);
+ nPart->setLenTick(nextPart->tick() + nextPart->lenTick() - oPart->tick());
+
+ // populate nPart with Events from oPart and nextPart
+
+ EventList* sl1 = oPart->events();
+ EventList* dl = nPart->events();
+
+ for (iEvent ie = sl1->begin(); ie != sl1->end(); ++ie)
+ dl->add(ie->second);
+
+ EventList* sl2 = nextPart->events();
+ int tickOffset = nextPart->tick() - oPart->tick();
+
+ for (iEvent ie = sl2->begin(); ie != sl2->end(); ++ie) {
+ Event event = ie->second.clone();
+ event.move(tickOffset);
+ dl->add(event);
+ }
+ startUndo();
+ audio->msgRemovePart(nextPart, false);
+ audio->msgChangePart(oPart, nPart, false);
+ endUndo(SC_PART_MODIFIED | SC_PART_REMOVED);
+ track->partListChanged();
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void Part::dump(int n) const
+ {
+ for (int i = 0; i < n; ++i)
+ putchar(' ');
+ printf("Part: <%s> ", _name.toLatin1().data());
+ for (int i = 0; i < n; ++i)
+ putchar(' ');
+ PosLen::dump();
+ }
+
+//---------------------------------------------------------
+// Part::write
+//---------------------------------------------------------
+
+void Part::write(Xml& xml) const
+ {
+ const EventList* el = events();
+ int id = -1;
+ bool dumpEvents = true;
+
+ if (el->arefCount() > 1) {
+ for (iClone i = cloneList.begin(); i != cloneList.end(); ++i) {
+ if (i->el == el) {
+ id = i->id;
+ dumpEvents = false;
+ break;
+ }
+ }
+ if (id == -1) {
+ id = cloneList.size();
+ ClonePart cp(el, id);
+ cloneList.push_back(cp);
+ }
+ }
+
+ if (id != -1)
+ xml.tag("part cloneId=\"%d\"", id);
+ else
+ xml.tag("part");
+ xml.strTag("name", _name);
+
+ PosLen::write(xml, "poslen");
+ xml.intTag("selected", _selected);
+ xml.intTag("color", _colorIndex);
+ if (_raster != -1)
+ xml.intTag("raster", _raster);
+ if (_quant != -1)
+ xml.intTag("quant", _quant);
+ if (_xmag != -1.0)
+ xml.doubleTag("xmag", _xmag);
+ for (ciCtrlCanvas i = ctrlCanvasList.begin(); i != ctrlCanvasList.end(); ++i)
+ xml.tagE("CtrlCanvas h=\"%d\" id=\"%d\"",
+ i->height, i->ctrlId);
+ if (_fillLen)
+ xml.intTag("fillLen", _fillLen);
+ if (_mute)
+ xml.intTag("mute", _mute);
+ if (dumpEvents) {
+ for (ciEvent e = el->begin(); e != el->end(); ++e)
+ e->second.write(xml, *this);
+ }
+ xml.etag("part");
+ }
+
+//---------------------------------------------------------
+// Part::read
+//---------------------------------------------------------
+
+void Part::read(QDomNode node)
+ {
+ int id = -1;
+ bool containsEvents = false;
+
+ ctrlCanvasList.clear();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ QString s(e.text());
+ int i = s.toInt();
+ if (tag == "name")
+ _name = s;
+ else if (tag == "poslen")
+ PosLen::read(node);
+ else if (tag == "selected")
+ _selected = i;
+ else if (tag == "color")
+ _colorIndex = i;
+ else if (tag == "raster")
+ _raster = i;
+ else if (tag == "quant")
+ _quant = i;
+ else if (tag == "xmag")
+ _xmag = s.toDouble();
+ else if (tag == "CtrlCanvas") {
+ CtrlCanvas c;
+ c.ctrlId = e.attribute("id","0").toInt();
+ c.height = e.attribute("h","50").toInt();
+ ctrlCanvasList.push_back(c);
+ }
+ else if (tag == "mute")
+ _mute = i;
+ else if (tag == "fillLen")
+ _fillLen = i;
+ else if (tag == "event") {
+ containsEvents = true;
+ EventType type = Wave;
+ if (_track->isMidiTrack())
+ type = Note;
+ Event e(type);
+ e.read(node);
+ // tickpos is relative to start of part
+ // TODO: better handling for wave event
+ e.move(-tick());
+ int tick = e.tick();
+ if ((tick < 0) || (tick >= int(lenTick()))) {
+ printf("ReadEvent: warning: event not in part: %d - %d - %d, discarded\n",
+ 0, tick, lenTick());
+ }
+ else {
+#if 0
+ if (e.type() == Controller) {
+ MidiChannel* mc = ((MidiTrack*)_track)->channel();
+ if (mc) {
+ CVal v;
+ v.i = e.dataB();
+ mc->addControllerVal(e.dataA(), tick, v);
+ }
+ else
+ _events->add(e);
+ }
+ else
+#endif
+ _events->add(e);
+ }
+ }
+ else if (tag == "cloneId")
+ id = i;
+ else
+ printf("MusE:read: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+
+ if (id != -1) {
+ // clone part
+ if (containsEvents) {
+ // add to cloneList:
+ ClonePart cp(_events, id);
+ cloneList.push_back(cp);
+ }
+ else {
+ // replace event list with clone event
+ // list
+ for (iClone i = cloneList.begin();
+ i != cloneList.end(); ++i) {
+ if (i->id == id) {
+ delete _events;
+ _events = (EventList*)(i->el);
+ _events->incRef(1);
+ _events->incARef(1);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+
diff --git a/muse/muse/part.h b/muse/muse/part.h
new file mode 100644
index 00000000..c98a7256
--- /dev/null
+++ b/muse/muse/part.h
@@ -0,0 +1,147 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __PART_H__
+#define __PART_H__
+
+#include "event.h"
+
+class Track;
+class MidiTrack;
+class WaveTrack;
+
+namespace AL {
+ class Xml;
+ };
+
+using AL::Xml;
+
+struct ClonePart {
+ const EventList* el;
+ int id;
+ ClonePart(const EventList* e, int i) : el(e), id(i) {}
+ };
+
+typedef std::list<ClonePart> CloneList;
+typedef CloneList::iterator iClone;
+extern CloneList cloneList;
+
+//---------------------------------------------------------
+// CtrlCanvas
+//---------------------------------------------------------
+
+struct CtrlCanvas {
+ int ctrlId;
+ int height;
+ };
+
+typedef std::list<CtrlCanvas> CtrlCanvasList;
+typedef CtrlCanvasList::iterator iCtrlCanvas;
+typedef CtrlCanvasList::const_iterator ciCtrlCanvas;
+
+//---------------------------------------------------------
+// Part
+//---------------------------------------------------------
+
+class Part : public AL::PosLen {
+ QString _name;
+ bool _selected;
+ bool _mute;
+ int _colorIndex;
+
+ // editor presets:
+ int _raster, _quant;
+ double _xmag;
+ CtrlCanvasList ctrlCanvasList;
+
+ // auto fill:
+ int _fillLen; // = 0 if no auto fill
+
+ void init();
+
+ protected:
+ Track* _track;
+ EventList* _events;
+
+ public:
+ Part(Track*);
+ Part(Track*, EventList*);
+ Part(const Part&, EventList*);
+ Part(const Part&);
+ ~Part();
+
+ CtrlCanvasList* getCtrlCanvasList() { return &ctrlCanvasList; }
+
+ const QString& name() const { return _name; }
+ void setName(const QString& s) { _name = s; }
+
+ bool selected() const { return _selected; }
+ void setSelected(bool f) { _selected = f; }
+
+ bool mute() const { return _mute; }
+ void setMute(bool b) { _mute = b; }
+
+ Track* track() const { return _track; }
+ void setTrack(Track*t) { _track = t; }
+
+ int colorIndex() const { return _colorIndex; }
+ void setColorIndex(int idx) { _colorIndex = idx; }
+
+ int raster() const { return _raster; }
+ void setRaster(int val) { _raster = val; }
+
+ int quant() const { return _quant; }
+ void setQuant(int val) { _quant = val; }
+
+ double xmag() const { return _xmag; }
+ void setXmag(double val) { _xmag = val; }
+
+ EventList* events() const { return _events; }
+ void setEventList(EventList* e) { _events = e; }
+ iEvent addEvent(Event& p);
+
+ int fillLen() const { return _fillLen; }
+ void setFillLen(int val) { _fillLen = val; }
+
+ void read(QDomNode);
+ void write(Xml&) const;
+ void dump(int n = 0) const;
+ };
+
+//---------------------------------------------------------
+// PartList
+//---------------------------------------------------------
+
+typedef std::multimap<unsigned, Part*, std::less<unsigned> > PL;
+typedef PL::iterator iPart;
+typedef PL::const_iterator ciPart;
+
+class PartList : public PL {
+ public:
+ Part* findPart(unsigned tick);
+ iPart add(Part*);
+ void remove(Part* part);
+ int index(Part*);
+ Part* find(int idx);
+ };
+
+extern const char* partColorNames[];
+#endif
+
diff --git a/muse/muse/plugin.cpp b/muse/muse/plugin.cpp
new file mode 100644
index 00000000..45183f34
--- /dev/null
+++ b/muse/muse/plugin.cpp
@@ -0,0 +1,875 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include <dlfcn.h>
+
+#include "al/al.h"
+#include "plugin.h"
+#include "plugingui.h"
+#include "al/xml.h"
+#include "fastlog.h"
+#include "ctrl.h"
+
+PluginList plugins;
+
+//---------------------------------------------------------
+// defaultValue
+//---------------------------------------------------------
+
+float ladspaDefaultValue(const LADSPA_Descriptor* plugin, int k)
+ {
+ LADSPA_PortRangeHint range = plugin->PortRangeHints[k];
+ LADSPA_PortRangeHintDescriptor rh = range.HintDescriptor;
+// bool isLog = LADSPA_IS_HINT_LOGARITHMIC(rh);
+ double val = 1.0;
+ float m = (rh & LADSPA_HINT_SAMPLE_RATE) ? float(AL::sampleRate) : 1.0f;
+ if (LADSPA_IS_HINT_DEFAULT_MINIMUM(rh)) {
+ val = range.LowerBound * m;
+ }
+ else if (LADSPA_IS_HINT_DEFAULT_LOW(rh)) {
+ if (LADSPA_IS_HINT_LOGARITHMIC(rh))
+ val = exp(fast_log10(range.LowerBound * m) * .75 +
+ log(range.UpperBound * m) * .25);
+ else
+ val = range.LowerBound*.75*m + range.UpperBound*.25*m;
+ }
+ else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(rh)) {
+ if (LADSPA_IS_HINT_LOGARITHMIC(rh))
+ val = exp(log(range.LowerBound * m) * .5 +
+ log10(range.UpperBound * m) * .5);
+ else
+ val = range.LowerBound*.5*m + range.UpperBound*.5*m;
+ }
+ else if (LADSPA_IS_HINT_DEFAULT_HIGH(rh)) {
+ if (LADSPA_IS_HINT_LOGARITHMIC(rh))
+ val = exp(log(range.LowerBound * m) * .25 +
+ log(range.UpperBound * m) * .75);
+ else
+ val = range.LowerBound*.25*m + range.UpperBound*.75*m;
+ }
+ else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(rh)) {
+ val = range.UpperBound*m;
+ }
+ else if (LADSPA_IS_HINT_DEFAULT_0(rh))
+ val = 0.0;
+ else if (LADSPA_IS_HINT_DEFAULT_1(rh))
+ val = 1.0;
+ else if (LADSPA_IS_HINT_DEFAULT_100(rh))
+ val = 100.0;
+ else if (LADSPA_IS_HINT_DEFAULT_440(rh))
+ val = 440.0;
+ return val;
+ }
+
+//---------------------------------------------------------
+// Plugin
+//---------------------------------------------------------
+
+Plugin::Plugin(const QFileInfo* f)
+ : fi(*f)
+ {
+ _instances = 0;
+ }
+
+//---------------------------------------------------------
+// LadpsaPlugin
+//---------------------------------------------------------
+
+LadspaPlugin::LadspaPlugin(const QFileInfo* f,
+ const LADSPA_Descriptor_Function ldf,
+ const LADSPA_Descriptor* d)
+ : Plugin(f), ladspa(ldf), plugin(d)
+ {
+ _inports = 0;
+ _outports = 0;
+ _parameter = 0;
+ for (unsigned k = 0; k < plugin->PortCount; ++k) {
+ LADSPA_PortDescriptor pd = d->PortDescriptors[k];
+ static const int CI = LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT;
+ if ((pd & CI) == CI) {
+ ++_parameter;
+ pIdx.push_back(k);
+ }
+ else if (pd & LADSPA_PORT_INPUT) {
+ ++_inports;
+ iIdx.push_back(k);
+ }
+ else if (pd & LADSPA_PORT_OUTPUT) {
+ ++_outports;
+ oIdx.push_back(k);
+ }
+ }
+ LADSPA_Properties properties = plugin->Properties;
+ _inPlaceCapable = !LADSPA_IS_INPLACE_BROKEN(properties);
+ if (_inports != _outports)
+ _inPlaceCapable = false;
+ }
+
+//---------------------------------------------------------
+// instantiate
+//---------------------------------------------------------
+
+void* LadspaPlugin::instantiate()
+ {
+ return plugin->instantiate(plugin, AL::sampleRate);
+ }
+
+//---------------------------------------------------------
+// loadPluginLib
+//---------------------------------------------------------
+
+static void loadPluginLib(QFileInfo* fi)
+ {
+ void* handle = dlopen(fi->filePath().toLatin1().data(), RTLD_NOW);
+ if (handle == 0) {
+ fprintf(stderr, "dlopen(%s) failed: %s\n",
+ fi->filePath().toLatin1().data(), dlerror());
+ return;
+ }
+ LADSPA_Descriptor_Function ladspa = (LADSPA_Descriptor_Function)dlsym(handle, "ladspa_descriptor");
+
+ if (!ladspa) {
+ const char *txt = dlerror();
+ if (txt) {
+ fprintf(stderr,
+ "Unable to find ladspa_descriptor() function in plugin "
+ "library file \"%s\": %s.\n"
+ "Are you sure this is a LADSPA plugin file?\n",
+ fi->filePath().toLatin1().data(),
+ txt);
+ return;
+ }
+ }
+ const LADSPA_Descriptor* descr;
+ for (int i = 0;; ++i) {
+ descr = ladspa(i);
+ if (descr == NULL)
+ break;
+ plugins.push_back(new LadspaPlugin(fi, ladspa, descr));
+ }
+ }
+
+//---------------------------------------------------------
+// loadPluginDir
+//---------------------------------------------------------
+
+static void loadPluginDir(const QString& s)
+ {
+ if (debugMsg)
+ printf("scan ladspa plugin dir <%s>\n", s.toLatin1().data());
+ QDir pluginDir(s, QString("*.so"), 0, QDir::Files);
+ if (pluginDir.exists()) {
+ QFileInfoList list = pluginDir.entryInfoList();
+ for (int i = 0; i < list.size(); ++i) {
+ QFileInfo fi = list.at(i);
+ loadPluginLib(&fi);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// initPlugins
+// search for LADSPA plugins
+//---------------------------------------------------------
+
+void initPlugins()
+ {
+ loadPluginDir(museGlobalLib + QString("/plugins"));
+
+ char* ladspaPath = getenv("LADSPA_PATH");
+ if (ladspaPath == 0)
+ ladspaPath = "/usr/lib/ladspa:/usr/local/lib/ladspa";
+
+ char* p = ladspaPath;
+ while (*p != '\0') {
+ char* pe = p;
+ while (*pe != ':' && *pe != '\0')
+ pe++;
+
+ int n = pe - p;
+ if (n) {
+ char* buffer = new char[n + 1];
+ strncpy(buffer, p, n);
+ buffer[n] = '\0';
+ loadPluginDir(QString(buffer));
+ delete[] buffer;
+ }
+ p = pe;
+ if (*p == ':')
+ p++;
+ }
+ }
+
+//---------------------------------------------------------
+// find
+//---------------------------------------------------------
+
+Plugin* PluginList::find(const QString& file, const QString& name)
+ {
+ for (iPlugin i = begin(); i != end(); ++i) {
+ if ((file == (*i)->lib()) && (name == (*i)->label()))
+ return *i;
+ }
+ printf("Plugin <%s> not found\n", name.toLatin1().data());
+ return 0;
+ }
+
+//---------------------------------------------------------
+// Pipeline
+//---------------------------------------------------------
+
+Pipeline::Pipeline()
+ : std::vector<PluginI*>()
+ {
+ for (int i = 0; i < PipelineDepth; ++i)
+ push_back(0);
+ }
+
+//---------------------------------------------------------
+// setChannels
+//---------------------------------------------------------
+
+void Pipeline::setChannels(int n)
+ {
+ for (int i = 0; i < PipelineDepth; ++i)
+ if ((*this)[i])
+ (*this)[i]->setChannels(n);
+ }
+
+//---------------------------------------------------------
+// insert
+// give ownership of object plugin to Pipeline
+//---------------------------------------------------------
+
+void Pipeline::insert(PluginI* plugin, int index)
+ {
+ (*this)[index] = plugin;
+ }
+
+//---------------------------------------------------------
+// isOn
+//---------------------------------------------------------
+
+bool Pipeline::isOn(int idx) const
+ {
+ PluginI* p = (*this)[idx];
+ if (p)
+ return p->on();
+ return false;
+ }
+
+//---------------------------------------------------------
+// setOn
+//---------------------------------------------------------
+
+void Pipeline::setOn(int idx, bool flag)
+ {
+ PluginI* p = (*this)[idx];
+ if (p) {
+ p->setOn(flag);
+ if (p->gui())
+ p->gui()->setOn(flag);
+ }
+ }
+
+//---------------------------------------------------------
+// label
+//---------------------------------------------------------
+
+QString Pipeline::label(int idx) const
+ {
+ PluginI* p = (*this)[idx];
+ if (p)
+ return p->label();
+ return QString("");
+ }
+
+//---------------------------------------------------------
+// name
+//---------------------------------------------------------
+
+QString Pipeline::name(int idx) const
+ {
+ PluginI* p = (*this)[idx];
+ if (p)
+ return p->name();
+ return QString("empty");
+ }
+
+//---------------------------------------------------------
+// hasNativeGui
+//---------------------------------------------------------
+
+bool Pipeline::hasNativeGui(int idx) const
+ {
+ PluginI* p = (*this)[idx];
+ if (p)
+ return p->hasNativeGui();
+ return false;
+ }
+
+//---------------------------------------------------------
+// empty
+//---------------------------------------------------------
+
+bool Pipeline::empty(int idx) const
+ {
+ PluginI* p = (*this)[idx];
+ return p == 0;
+ }
+
+//---------------------------------------------------------
+// move
+//---------------------------------------------------------
+
+void Pipeline::move(int idx, bool up)
+ {
+ PluginI* p1 = (*this)[idx];
+ if (up) {
+ (*this)[idx] = (*this)[idx-1];
+ (*this)[idx-1] = p1;
+ }
+ else {
+ (*this)[idx] = (*this)[idx+1];
+ (*this)[idx+1] = p1;
+ }
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void Pipeline::showGui(int idx, bool flag)
+ {
+ PluginI* p = (*this)[idx];
+ if (p)
+ p->showGui(flag);
+ }
+
+//---------------------------------------------------------
+// showNativeGui
+//---------------------------------------------------------
+
+void Pipeline::showNativeGui(int idx, bool flag)
+ {
+ PluginI* p = (*this)[idx];
+ if (p)
+ p->showNativeGui(flag);
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool Pipeline::guiVisible(int idx)
+ {
+ PluginI* p = (*this)[idx];
+ if (p)
+ return p->guiVisible();
+ return false;
+ }
+
+//---------------------------------------------------------
+// nativeGuiVisible
+//---------------------------------------------------------
+
+bool Pipeline::nativeGuiVisible(int idx)
+ {
+ PluginI* p = (*this)[idx];
+ if (p)
+ return p->nativeGuiVisible();
+ return false;
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void Pipeline::apply(int ports, unsigned long nframes, float** buffer1)
+ {
+ // prepare a second set of buffers in case a plugin is not
+ // capable of inPlace processing
+
+ float* buffer2[ports];
+ float data[nframes * ports];
+ for (int i = 0; i < ports; ++i)
+ buffer2[i] = data + i * nframes;
+
+ bool swap = false;
+
+ for (iPluginI ip = begin(); ip != end(); ++ip) {
+ PluginI* p = *ip;
+ if (p && p->on()) {
+ if (p->inPlaceCapable()) {
+ if (swap)
+ p->apply(nframes, ports, buffer2, buffer2);
+ else
+ p->apply(nframes, ports, buffer1, buffer1);
+ }
+ else {
+ if (swap)
+ p->apply(nframes, ports, buffer2, buffer1);
+ else
+ p->apply(nframes, ports, buffer1, buffer2);
+ swap = !swap;
+ }
+ }
+ }
+ if (swap) {
+ for (int i = 0; i < ports; ++i)
+ memcpy(buffer1[i], buffer2[i], sizeof(float) * nframes);
+ }
+ }
+
+//---------------------------------------------------------
+// PluginI
+//---------------------------------------------------------
+
+PluginI::PluginI(AudioTrack* t)
+ {
+ _track = t;
+ _plugin = 0;
+ instances = 0;
+ _gui = 0;
+ _on = true;
+ pif = 0;
+ initControlValues = false;
+ }
+
+//---------------------------------------------------------
+// PluginI
+//---------------------------------------------------------
+
+PluginI::~PluginI()
+ {
+ if (_plugin)
+ deactivate();
+ if (_gui)
+ delete _gui;
+ if (pif) {
+ for (int i = 0; i < instances; ++i) {
+ delete pif[i];
+ }
+ delete[] pif;
+ }
+ }
+
+//---------------------------------------------------------
+// range
+//---------------------------------------------------------
+
+void LadspaPlugin::range(int i, float* min, float* max) const
+ {
+ i = pIdx[i];
+ LADSPA_PortRangeHint range = plugin->PortRangeHints[i];
+ LADSPA_PortRangeHintDescriptor desc = range.HintDescriptor;
+ if (desc & LADSPA_HINT_TOGGLED) {
+ *min = 0.0;
+ *max = 1.0;
+ return;
+ }
+ float m = (desc & LADSPA_HINT_SAMPLE_RATE) ? float(AL::sampleRate) : 1.0f;
+
+ if (desc & LADSPA_HINT_BOUNDED_BELOW)
+ *min = range.LowerBound * m;
+ else
+ *min = 0.0;
+ if (desc & LADSPA_HINT_BOUNDED_ABOVE)
+ *max = range.UpperBound * m;
+ else
+ *max = 1.0;
+ }
+
+//---------------------------------------------------------
+// createPIF
+//---------------------------------------------------------
+
+PluginIF* LadspaPlugin::createPIF(PluginI* pi)
+ {
+ LadspaPluginIF* pif = new LadspaPluginIF(pi);
+ pif->init(pi->plugin());
+ return pif;
+ }
+
+//---------------------------------------------------------
+// LadspaPluginIF
+//---------------------------------------------------------
+
+LadspaPluginIF::LadspaPluginIF(PluginI* pi)
+ : PluginIF(pi)
+ {
+ descr = 0;
+ plugin = (LadspaPlugin*)(pi->plugin());
+ }
+
+//---------------------------------------------------------
+// init
+// return true on error
+//---------------------------------------------------------
+
+bool LadspaPluginIF::init(Plugin* pl)
+ {
+ handle = (LADSPA_Descriptor*) ((LadspaPlugin*)pl)->instantiate();
+ plugin = (LadspaPlugin*)pl;
+ descr = plugin->ladspaDescriptor();
+
+ int controlPorts = plugin->parameter();
+ controls = new LadspaPort[controlPorts];
+
+ for (int k = 0; k < controlPorts; ++k) {
+ controls[k].val = plugin->defaultValue(k);
+ descr->connect_port(handle, plugin->pIdx[k], &controls[k].val);
+ }
+ return handle == 0;
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void PluginI::apply(unsigned nframes, int ports, float** src, float** dst)
+ {
+ int oports = _plugin->outports();
+ int iports = _plugin->inports();
+
+ float* sp[iports * instances];
+ float* dp[oports * instances];
+
+ for (int i = 0; i < iports * instances; ++i)
+ sp[i] = src[i % ports];
+ for (int i = 0; i < oports * instances; ++i)
+ dp[i] = dst[i % ports];
+
+ float** spp = sp;
+ float** dpp = dp;
+ for (int i = 0; i < instances; ++i) {
+ pif[i]->apply(nframes, sp, dp);
+ spp += iports;
+ dpp += oports;
+ }
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void LadspaPluginIF::apply(unsigned nframes, float** src, float** dst)
+ {
+ int iports = plugin->inports();
+ int oports = plugin->outports();
+ int cports = plugin->parameter();
+
+ //
+ // update parameter
+ //
+ for (int i = 0; i < cports; ++i)
+ controls[i].val = pluginI->controllerList[i]->curVal().f;
+ //
+ // set connections
+ //
+ for (int k = 0; k < iports; ++k)
+ descr->connect_port(handle, plugin->iIdx[k], src[k]);
+ for (int k = 0; k < oports; ++k)
+ descr->connect_port(handle, plugin->oIdx[k], dst[k]);
+
+ descr->run(handle, nframes);
+ }
+
+//---------------------------------------------------------
+// setChannel
+//---------------------------------------------------------
+
+void PluginI::setChannels(int c)
+ {
+ if (channel == c)
+ return;
+ int ni = c / _plugin->outports();
+ if (ni == 0)
+ ni = 1;
+ channel = c;
+ if (ni == instances)
+ return;
+ channel = c;
+
+ // remove old instances:
+ deactivate();
+ for (int i = 0; i < instances; ++i)
+ delete pif[i];
+ delete pif;
+
+ instances = ni;
+ pif = new PluginIF*[instances];
+ for (int i = 0; i < instances; ++i) {
+ pif[i] = _plugin->createPIF(this);
+ if (pif[i] == 0)
+ return;
+ }
+ activate();
+ }
+
+//---------------------------------------------------------
+// defaultValue
+//---------------------------------------------------------
+
+float LadspaPlugin::defaultValue(int k) const
+ {
+ k = pIdx[k];
+ return ladspaDefaultValue(plugin, k);
+ }
+
+//---------------------------------------------------------
+// initPluginInstance
+// return true on error
+//---------------------------------------------------------
+
+bool PluginI::initPluginInstance(Plugin* plug, int c)
+ {
+ if (plug == 0) {
+ printf("initPluginInstance: zero plugin\n");
+ return true;
+ }
+ channel = c;
+ _plugin = plug;
+ _plugin->incInstances(1);
+ QString inst("-" + QString::number(_plugin->instances()));
+ _name = _plugin->name() + inst;
+ _label = _plugin->label() + inst;
+
+ instances = channel/plug->outports();
+ if (instances < 1)
+ instances = 1;
+ pif = new PluginIF*[instances];
+ for (int i = 0; i < instances; ++i) {
+ pif[i] = _plugin->createPIF(this);
+ if (pif[i] == 0)
+ return true;
+ }
+ activate();
+ return false;
+ }
+
+//---------------------------------------------------------
+// setParameter
+// set plugin instance controller value by name
+// return true on error
+//---------------------------------------------------------
+
+bool PluginI::setParameter(const QString& s, double val)
+ {
+ if (_plugin == 0)
+ return true;
+ int n = _plugin->parameter();
+ for (int i = 0; i < n; ++i) {
+ if (getParameterName(i) == s) {
+ setParam(i, val);
+ return false;
+ }
+ }
+ printf("PluginI:setControl(%s, %f) controller not found\n",
+ s.toLatin1().data(), val);
+ return true;
+ }
+
+//---------------------------------------------------------
+// saveConfiguration
+//---------------------------------------------------------
+
+void PluginI::writeConfiguration(Xml& xml)
+ {
+ writeConfiguration1(xml);
+ xml.etag("plugin"); // append endtag
+ }
+
+//---------------------------------------------------------
+// saveConfiguration
+//---------------------------------------------------------
+
+void PluginI::writeConfiguration1(Xml& xml)
+ {
+ xml.tag("plugin file=\"%s\" label=\"%s\" channel=\"%d\"",
+ _plugin->lib().toLatin1().data(), _plugin->label().toLatin1().data(), instances * _plugin->inports());
+ if (_on == false)
+ xml.intTag("on", _on);
+ if (guiVisible()) {
+ xml.intTag("gui", 1);
+ xml.geometryTag("geometry", _gui);
+ }
+ if (hasNativeGui() && nativeGuiVisible())
+ xml.intTag("nativeGui", 1);
+ }
+//---------------------------------------------------------
+// readConfiguration
+// return true on error
+//---------------------------------------------------------
+
+bool PluginI::readConfiguration(QDomNode node)
+ {
+ instances = 1;
+ QDomElement e = node.toElement();
+ QString file = e.attribute("file");
+ QString label = e.attribute("label");
+ channel = e.attribute("channel").toInt();
+
+ if (_plugin == 0) {
+ _plugin = plugins.find(file, label);
+ if (_plugin == 0)
+ return true;
+ if (initPluginInstance(_plugin, instances))
+ return true;
+ }
+ node = node.firstChild();
+ while (!node.isNull()) {
+ e = node.toElement();
+ int i = e.text().toInt();
+ QString tag(e.tagName());
+ if (tag == "on") {
+ bool flag = i;
+ _on = flag;
+ }
+ else if (tag == "gui") {
+ bool flag = i;
+ showGui(flag);
+ }
+ else if (tag == "nativeGui") {
+ bool flag = i;
+ showNativeGui(flag);
+ }
+ else if (tag == "geometry") {
+ QRect r(AL::readGeometry(node));
+ if (_gui) {
+ _gui->resize(r.size());
+ _gui->move(r.topLeft());
+ }
+ }
+ else
+ printf("MusE:PluginI: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ if (_gui)
+ _gui->updateValues();
+ return false;
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void PluginI::showGui()
+ {
+ if (_plugin) {
+ if (_gui == 0)
+ makeGui();
+ if (_gui->isVisible())
+ _gui->hide();
+ else
+ _gui->show();
+ }
+ }
+
+void PluginI::showGui(bool flag)
+ {
+ if (_plugin) {
+ if (flag) {
+ if (_gui == 0)
+ makeGui();
+ _gui->show();
+ }
+ else {
+ if (_gui)
+ _gui->hide();
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool PluginI::guiVisible() const
+ {
+ return _gui && _gui->isVisible();
+ }
+
+//---------------------------------------------------------
+// makeGui
+//---------------------------------------------------------
+
+void PluginI::makeGui()
+ {
+ _gui = new PluginGui(this);
+ }
+
+//---------------------------------------------------------
+// deactivate
+//---------------------------------------------------------
+
+void PluginI::deactivate()
+ {
+ for (int i = 0; i < instances; ++i) {
+ pif[i]->deactivate();
+ pif[i]->cleanup();
+ }
+ }
+
+//---------------------------------------------------------
+// setParam
+//---------------------------------------------------------
+
+void PluginI::setParam(int idx, float val)
+ {
+ if (_gui)
+ _gui->updateValue(idx, val);
+ for (int i = 0; i < instances; ++i)
+ pif[i]->setParam(idx, val);
+ }
+
+//---------------------------------------------------------
+// activate
+//---------------------------------------------------------
+
+void PluginI::activate()
+ {
+ for (int i = 0; i < instances; ++i)
+ pif[i]->activate();
+ }
+
+//---------------------------------------------------------
+// activate
+//---------------------------------------------------------
+
+void LadspaPluginIF::activate()
+ {
+ //
+ // TODO: init values?
+ //
+ if (descr->activate)
+ descr->activate(handle);
+ }
+#if 0
+//---------------------------------------------------------
+// controllerId
+//---------------------------------------------------------
+
+int PluginI::controllerId(int idx) const
+ {
+ return controllerList[idx]->id();
+ }
+#endif
+
diff --git a/muse/muse/plugin.h b/muse/muse/plugin.h
new file mode 100644
index 00000000..a31db428
--- /dev/null
+++ b/muse/muse/plugin.h
@@ -0,0 +1,341 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __PLUGIN_H__
+#define __PLUGIN_H__
+
+#include "ladspa.h"
+#include "globals.h"
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+class PluginIF;
+class PluginGui;
+class PluginI;
+class LadspaPluginIF;
+class AudioTrack;
+class Ctrl;
+
+#define AUDIO_IN (LADSPA_PORT_AUDIO | LADSPA_PORT_INPUT)
+#define AUDIO_OUT (LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT)
+
+//---------------------------------------------------------
+// Plugin
+//---------------------------------------------------------
+
+class Plugin {
+
+ protected:
+ int _instances;
+ QFileInfo fi;
+
+ public:
+ Plugin(const QFileInfo* f);
+ virtual ~Plugin() {}
+
+ int instances() const { return _instances; }
+ virtual void incInstances(int val) { _instances += val; }
+
+ QString lib() const { return fi.baseName(); }
+ QString path() const { return fi.absolutePath(); }
+
+ virtual QString label() const { return QString(); }
+ virtual QString name() const { return QString(); }
+ virtual unsigned long id() const { return 0; }
+ virtual QString maker() const { return QString(); }
+ virtual QString copyright() const { return QString(); }
+
+ virtual PluginIF* createPIF(PluginI*) = 0;
+
+ virtual void range(int, float* min, float* max) const {
+ *min = 0.0f;
+ *max = 1.0f;
+ }
+
+ virtual int parameter() const { return 0; }
+ virtual int inports() const { return 0; }
+ virtual int outports() const { return 0; }
+
+ virtual bool inPlaceCapable() const { return false; }
+
+ virtual bool isLog(int) const { return false; }
+ virtual bool isBool(int) const { return false; }
+ virtual bool isInt(int) const { return false; }
+ virtual float defaultValue(int) const { return 0.0f; }
+ };
+
+//---------------------------------------------------------
+// LadspaPlugin
+//---------------------------------------------------------
+
+class LadspaPlugin : public Plugin {
+ LADSPA_Descriptor_Function ladspa;
+ const LADSPA_Descriptor* plugin;
+
+ protected:
+ int _parameter;
+ std::vector<int> pIdx;
+
+ int _inports;
+ std::vector<int> iIdx;
+
+ int _outports;
+ std::vector<int> oIdx;
+
+ bool _inPlaceCapable;
+ friend class LadspaPluginIF;
+
+ public:
+ LadspaPlugin(const QFileInfo* f,
+ const LADSPA_Descriptor_Function,
+ const LADSPA_Descriptor* d);
+
+ virtual QString label() const { return QString(plugin->Label); }
+ virtual QString name() const { return QString(plugin->Name); }
+ virtual unsigned long id() const { return plugin->UniqueID; }
+ virtual QString maker() const { return QString(plugin->Maker); }
+ virtual QString copyright() const { return QString(plugin->Copyright); }
+
+ void* instantiate();
+ virtual void range(int i, float*, float*) const;
+ virtual int parameter() const { return _parameter; }
+ virtual int inports() const { return _inports; }
+ virtual int outports() const { return _outports; }
+
+ virtual bool inPlaceCapable() const { return _inPlaceCapable; }
+ virtual PluginIF* createPIF(PluginI*);
+ const LADSPA_Descriptor* ladspaDescriptor() const { return plugin; }
+
+ virtual bool isLog(int k) const {
+ LADSPA_PortRangeHint r = plugin->PortRangeHints[pIdx[k]];
+ return LADSPA_IS_HINT_LOGARITHMIC(r.HintDescriptor);
+ }
+ virtual bool isBool(int k) const {
+ return LADSPA_IS_HINT_TOGGLED(plugin->PortRangeHints[pIdx[k]].HintDescriptor);
+ }
+ virtual bool isInt(int k) const {
+ LADSPA_PortRangeHint r = plugin->PortRangeHints[pIdx[k]];
+ return LADSPA_IS_HINT_INTEGER(r.HintDescriptor);
+ }
+ virtual float defaultValue(int) const;
+ };
+
+//---------------------------------------------------------
+// PluginList
+//---------------------------------------------------------
+
+typedef std::list<Plugin*>::iterator iPlugin;
+
+class PluginList : public std::list<Plugin*> {
+ public:
+ Plugin* find(const QString&, const QString&);
+ PluginList() {}
+ };
+
+//---------------------------------------------------------
+// LadspaPort
+//---------------------------------------------------------
+
+struct LadspaPort {
+ float val;
+ };
+
+//---------------------------------------------------------
+// PluginIF
+// plugin instance interface
+//---------------------------------------------------------
+
+class PluginIF {
+ protected:
+ PluginI* pluginI;
+
+ public:
+ PluginIF(PluginI* pi) { pluginI = pi; }
+ virtual ~PluginIF() {}
+
+ PluginI* pluginInstance() { return pluginI; }
+
+ virtual void apply(unsigned nframes, float** src, float** dst) = 0;
+ virtual void activate() = 0;
+ virtual void deactivate() = 0;
+ virtual void cleanup() = 0;
+ virtual void setParam(int i, float val) = 0;
+ virtual float param(int i) const = 0;
+ virtual const char* getParameterName(int) const { return ""; }
+ virtual const char* getParameterLabel(int) const { return 0; }
+ virtual const char* getParameterDisplay(int, float) const { return 0; }
+ virtual bool hasGui() const { return false; }
+ virtual bool guiVisible() const { return false; }
+ virtual void showGui(bool) {}
+ };
+
+//---------------------------------------------------------
+// LadspaPluginIF
+//---------------------------------------------------------
+
+class LadspaPluginIF : public PluginIF {
+ const LADSPA_Descriptor* descr;
+ LADSPA_Handle handle; // per instance
+ LadspaPlugin* plugin;
+
+ LadspaPort* controls;
+
+ public:
+ LadspaPluginIF(PluginI* pi);
+
+ virtual void apply(unsigned nframes, float** src, float** dst);
+ virtual void activate();
+ virtual void deactivate() {
+ if (descr->deactivate)
+ descr->deactivate(handle);
+ }
+ virtual void cleanup() {
+ if (descr->cleanup)
+ descr->cleanup(handle);
+ }
+ virtual const char* getParameterName(int i) const {
+ return plugin->plugin->PortNames[plugin->pIdx[i]];
+ }
+ virtual void setParam(int i, float val) { controls[i].val = val; }
+ virtual float param(int i) const { return controls[i].val; }
+ bool init(Plugin*);
+ };
+
+//---------------------------------------------------------
+// PluginI
+// plugin instance
+//---------------------------------------------------------
+
+class PluginI {
+ Plugin* _plugin;
+ AudioTrack* _track;
+
+ int instances;
+ PluginIF** pif;
+
+ int channel;
+
+ PluginGui* _gui;
+ bool _on;
+
+ QString _name;
+ QString _label;
+
+ std::vector<Ctrl*> controllerList;
+
+ void makeGui();
+
+ protected:
+ bool initControlValues;
+ friend class LadspaPluginIF;
+
+ public:
+ PluginI(AudioTrack*);
+ ~PluginI();
+
+ Plugin* plugin() const { return _plugin; }
+ bool on() const { return _on; }
+ void setOn(bool val) { _on = val; }
+ PluginGui* gui() const { return _gui; }
+
+ bool initPluginInstance(Plugin*, int channels);
+ void setChannels(int);
+ void apply(unsigned nframes, int ports, float** b1, float** b2);
+
+ void activate();
+ void deactivate();
+ QString label() const { return _label; }
+ QString name() const { return _name; }
+ QString lib() const { return _plugin->lib(); }
+
+ AudioTrack* track() const { return _track; }
+
+ void writeConfiguration(Xml& xml);
+ void writeConfiguration1(Xml& xml); // without end tag!
+ bool readConfiguration(QDomNode);
+
+ void showGui();
+ void showGui(bool);
+ bool guiVisible() const;
+
+ bool hasNativeGui() const { return pif[0]->hasGui(); }
+ void showNativeGui(bool f) { return pif[0]->showGui(f); }
+ bool nativeGuiVisible() const { return pif[0]->guiVisible(); }
+
+ void setControllerList(Ctrl* cl) { controllerList.push_back(cl); }
+ Ctrl* controller(int idx) const { return controllerList[idx]; }
+ bool setParameter(const QString& s, double val);
+ void setParam(int i, float val);
+ float param(int i) const { return pif[0]->param(i); }
+
+ const char* getParameterName(int i) const { return pif[0]->getParameterName(i); }
+ const char* getParameterLabel(int i) const { return pif[0]->getParameterLabel(i); }
+ const char* getParameterDisplay(int i, float v) const { return pif[0]->getParameterDisplay(i, v); }
+
+ void range(int i, float* min, float* max) const {
+ _plugin->range(i, min, max);
+ }
+ float defaultValue(int i) const { return _plugin->defaultValue(i); }
+ bool inPlaceCapable() const { return _plugin->inPlaceCapable(); }
+
+ bool isLog(int k) const { return _plugin->isLog(k); }
+ bool isBool(int k) const { return _plugin->isBool(k); }
+ bool isInt(int k) const { return _plugin->isInt(k); }
+ };
+
+//---------------------------------------------------------
+// Pipeline
+// chain of connected efx inserts
+//---------------------------------------------------------
+
+const int PipelineDepth = 4;
+
+class Pipeline : public std::vector<PluginI*> {
+ public:
+ Pipeline();
+ void insert(PluginI* p, int index);
+ bool isOn(int idx) const;
+ void setOn(int, bool);
+ QString label(int idx) const;
+ QString name(int idx) const;
+ bool hasNativeGui(int idx) const;
+ void showGui(int, bool);
+ bool guiVisible(int);
+ bool nativeGuiVisible(int);
+ void showNativeGui(int, bool);
+ void apply(int ports, unsigned long nframes, float** buffer);
+ void move(int idx, bool up);
+ bool empty(int idx) const;
+ void setChannels(int);
+ PluginI* plugin(int idx) { return (*this)[idx]; }
+ };
+
+typedef Pipeline::iterator iPluginI;
+typedef Pipeline::const_iterator ciPluginI;
+
+extern void initPlugins();
+extern PluginList plugins;
+extern float ladspaDefaultValue(const LADSPA_Descriptor* plugin, int k);
+
+#endif
+
diff --git a/muse/muse/plugingui.cpp b/muse/muse/plugingui.cpp
new file mode 100644
index 00000000..c6b0ffcd
--- /dev/null
+++ b/muse/muse/plugingui.cpp
@@ -0,0 +1,767 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "fastlog.h"
+#include "widgets/filedialog.h"
+#include "plugin.h"
+#include "plugingui.h"
+#include "icons.h"
+#include "al/xml.h"
+
+#include "awl/floatentry.h"
+#include "awl/slider.h"
+#include "awl/checkbox.h"
+#include "awl/combobox.h"
+
+using Awl::FloatEntry;
+using Awl::Slider;
+using Awl::CheckBox;
+using Awl::ComboBox;
+
+static const char* preset_file_pattern[] = {
+ QT_TR_NOOP("presets (*.pre *.pre.gz *.pre.bz2)"),
+ QT_TR_NOOP("All Files (*)"),
+ 0
+ };
+
+int PluginDialog::selectedPlugType = SEL_SM;
+QStringList PluginDialog::sortItems = QStringList();
+
+//---------------------------------------------------------
+// PluginDialog
+// select Plugin dialog
+//---------------------------------------------------------
+
+PluginDialog::PluginDialog(QWidget* parent)
+ : QDialog(parent)
+ {
+ setWindowTitle(tr("MusE: select plugin"));
+ QVBoxLayout* layout = new QVBoxLayout(this);
+
+ pList = new QTreeWidget(this);
+ pList->setColumnCount(11);
+ pList->setSortingEnabled(true);
+ QStringList headerLabels;
+ headerLabels << tr("Lib");
+ headerLabels << tr("Label");
+ headerLabels << tr("Name");
+ headerLabels << tr("AI");
+ headerLabels << tr("AO");
+ headerLabels << tr("CI");
+ headerLabels << tr("CO");
+ headerLabels << tr("IP");
+ headerLabels << tr("id");
+ headerLabels << tr("Maker");
+ headerLabels << tr("Copyright");
+
+ int sizes[] = { 110, 110, 0, 30, 30, 30, 30, 30, 40, 110, 110 };
+ for (int i = 0; i < 11; ++i) {
+ if (sizes[i] == 0) {
+ pList->header()->setResizeMode(i, QHeaderView::Stretch);
+ }
+ else {
+ if (sizes[i] <= 40) // hack alert!
+ pList->header()->setResizeMode(i, QHeaderView::Custom);
+ pList->header()->resizeSection(i, sizes[i]);
+ }
+ }
+
+ pList->setHeaderLabels(headerLabels);
+
+ pList->setSelectionBehavior(QAbstractItemView::SelectRows);
+ pList->setSelectionMode(QAbstractItemView::SingleSelection);
+ pList->setAlternatingRowColors(true);
+
+ fillPlugs(selectedPlugType);
+ layout->addWidget(pList);
+
+ //---------------------------------------------------
+ // Ok/Cancel Buttons
+ //---------------------------------------------------
+
+ QBoxLayout* w5 = new QHBoxLayout;
+ layout->addLayout(w5);
+
+ QPushButton* okB = new QPushButton(tr("Ok"), this);
+ okB->setDefault(true);
+ QPushButton* cancelB = new QPushButton(tr("Cancel"), this);
+ okB->setFixedWidth(80);
+ cancelB->setFixedWidth(80);
+ w5->addWidget(okB);
+ w5->addSpacing(12);
+ w5->addWidget(cancelB);
+
+ QGroupBox* plugSelGroup = new QGroupBox;
+ plugSelGroup->setTitle("Show plugs:");
+ QHBoxLayout* psl = new QHBoxLayout;
+ plugSelGroup->setLayout(psl);
+
+ QButtonGroup* plugSel = new QButtonGroup(plugSelGroup);
+ onlySM = new QRadioButton;
+ onlySM->setText(tr("Mono and Stereo"));
+ onlySM->setCheckable(true);
+ plugSel->addButton(onlySM);
+ psl->addWidget(onlySM);
+ onlyS = new QRadioButton;
+ onlyS->setText(tr("Stereo"));
+ onlyS->setCheckable(true);
+ plugSel->addButton(onlyS);
+ psl->addWidget(onlyS);
+ onlyM = new QRadioButton;
+ onlyM->setText(tr("Mono"));
+ onlyM->setCheckable(true);
+ plugSel->addButton(onlyM);
+ psl->addWidget(onlyM);
+ allPlug = new QRadioButton;
+ allPlug->setText(tr("Show All"));
+ allPlug->setCheckable(true);
+ plugSel->addButton(allPlug);
+ psl->addWidget(allPlug);
+ plugSel->setExclusive(true);
+
+ switch(selectedPlugType) {
+ case SEL_SM: onlySM->setChecked(true); break;
+ case SEL_S: onlyS->setChecked(true); break;
+ case SEL_M: onlyM->setChecked(true); break;
+ case SEL_ALL: allPlug->setChecked(true); break;
+ }
+
+ plugSelGroup->setToolTip(tr("Select which types of plugins should be visible in the list.<br>"
+ "Note that using mono plugins on stereo tracks is not a problem, two will be used in parallell.<br>"
+ "Also beware that the 'all' alternative includes plugins that probably not are usable by MusE."));
+
+ w5->addSpacing(12);
+ w5->addWidget(plugSelGroup);
+ w5->addSpacing(12);
+
+ QLabel *sortLabel = new QLabel;
+ sortLabel->setText(tr("Search in 'Label' and 'Name':"));
+ w5->addWidget(sortLabel);
+ w5->addSpacing(2);
+
+ sortBox = new QComboBox(this);
+ sortBox->setEditable(true);
+ if (!sortItems.empty())
+ sortBox->addItems(sortItems);
+
+ sortBox->setMinimumSize(100, 10);
+ w5->addWidget(sortBox);
+ w5->addStretch(-1);
+
+ if (!sortBox->currentText().isEmpty())
+ fillPlugs(sortBox->currentText());
+ else
+ fillPlugs(selectedPlugType);
+
+
+ connect(pList, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), SLOT(accept()));
+ connect(cancelB, SIGNAL(clicked()), SLOT(reject()));
+ connect(okB, SIGNAL(clicked()), SLOT(accept()));
+ connect(plugSel, SIGNAL(buttonClicked(QAbstractButton*)), SLOT(fillPlugs(QAbstractButton*)));
+ connect(sortBox, SIGNAL(editTextChanged(const QString&)),SLOT(fillPlugs(const QString&)));
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void PluginDialog::accept()
+ {
+ if (!sortBox->currentText().isEmpty()) {
+ foreach (QString item, sortItems)
+ if(item == sortBox->currentText()) {
+ QDialog::accept();
+ return;
+ }
+ sortItems.push_front(sortBox->currentText());
+ }
+ QDialog::accept();
+ }
+
+//---------------------------------------------------------
+// value
+//---------------------------------------------------------
+
+Plugin* PluginDialog::value()
+ {
+ QTreeWidgetItem* item = pList->selectedItems().at(0);
+ if (item)
+ return plugins.find(item->text(0), item->text(1));
+printf("plugin not found\n");
+ return 0;
+ }
+
+//---------------------------------------------------------
+// fillPlugs
+//---------------------------------------------------------
+
+void PluginDialog::fillPlugs(QAbstractButton* ab)
+ {
+ if (ab == allPlug)
+ fillPlugs(SEL_ALL);
+ else if (ab == onlyM)
+ fillPlugs(SEL_M);
+ else if (ab == onlyS)
+ fillPlugs(SEL_S);
+ else if (ab == onlySM)
+ fillPlugs(SEL_SM);
+ }
+
+//---------------------------------------------------------
+// fillPlugs int
+//---------------------------------------------------------
+
+void PluginDialog::fillPlugs(int nbr)
+ {
+ pList->clear();
+ for (iPlugin i = plugins.begin(); i != plugins.end(); ++i) {
+ int ai = (*i)->inports();
+ int ao = (*i)->outports();
+ int ci = (*i)->parameter();
+ int co = 0;
+ bool addFlag = false;
+ switch (nbr) {
+ case SEL_SM: // stereo & mono
+ if ((ai == 1 || ai == 2) && (ao == 1 || ao ==2)) {
+ addFlag = true;
+ }
+ break;
+ case SEL_S: // stereo
+ if ((ai == 1 || ai == 2) && ao ==2) {
+ addFlag = true;
+ }
+ break;
+ case SEL_M: // mono
+ if (ai == 1 && ao == 1) {
+ addFlag = true;
+ }
+ break;
+ case SEL_ALL: // all
+ addFlag = true;
+ break;
+ }
+ if (addFlag) {
+ QTreeWidgetItem* item = new QTreeWidgetItem;
+ item->setText(0, (*i)->lib());
+ item->setText(1, (*i)->label());
+ item->setText(2, (*i)->name());
+ item->setText(3, QString().setNum(ai));
+ item->setText(4, QString().setNum(ao));
+ item->setText(5, QString().setNum(ci));
+ item->setText(6, QString().setNum(co));
+ item->setText(7, QString().setNum((*i)->inPlaceCapable()));
+ item->setText(8, QString().setNum((*i)->id()));
+ item->setText(9, (*i)->maker());
+ item->setText(10, (*i)->copyright());
+ pList->addTopLevelItem(item);
+ }
+ }
+ selectedPlugType = nbr;
+ }
+
+//---------------------------------------------------------
+// fillPlugs QString
+//---------------------------------------------------------
+
+void PluginDialog::fillPlugs(const QString &sortValue)
+ {
+ pList->clear();
+ for (iPlugin i = plugins.begin(); i != plugins.end(); ++i) {
+ int ai = (*i)->inports();
+ int ao = (*i)->outports();
+ int ci = (*i)->parameter();
+ int co = 0;
+
+ bool addFlag = false;
+
+ if ((*i)->label().toLower().contains(sortValue.toLower()))
+ addFlag = true;
+ else if ((*i)->name().toLower().contains(sortValue.toLower()))
+ addFlag = true;
+ if (addFlag) {
+ QTreeWidgetItem* item = new QTreeWidgetItem;
+ item->setText(0, (*i)->lib());
+ item->setText(1, (*i)->label());
+ item->setText(2, (*i)->name());
+ item->setText(3, QString().setNum(ai));
+ item->setText(4, QString().setNum(ao));
+ item->setText(5, QString().setNum(ci));
+ item->setText(6, QString().setNum(co));
+ item->setText(7, QString().setNum((*i)->inPlaceCapable()));
+ item->setText(8, QString().setNum((*i)->id()));
+ item->setText(9, (*i)->maker());
+ item->setText(10, (*i)->copyright());
+ pList->addTopLevelItem(item);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// getPlugin
+//---------------------------------------------------------
+
+Plugin* PluginDialog::getPlugin(QWidget* parent)
+ {
+ PluginDialog* dialog = new PluginDialog(parent);
+ if (dialog->exec())
+ return dialog->value();
+ return 0;
+ }
+
+static const char* presetOpenText = "<img source=\"fileopen\"> "
+ "Click this button to load a saved <em>preset</em>.";
+static const char* presetSaveText = "Click this button to save curent parameter "
+ "settings as a <em>preset</em>. You will be prompted for a file name.";
+static const char* presetBypassText = "Click this button to bypass effect unit";
+
+//---------------------------------------------------------
+// PluginGui
+//---------------------------------------------------------
+
+PluginGui::PluginGui(PluginI* p)
+ : QMainWindow(0)
+ {
+ plugin = p;
+ setWindowTitle(plugin->name());
+
+ QToolBar* tools = addToolBar(tr("File Buttons"));
+
+ QAction* fileOpen = tools->addAction(QIcon(*openIcon), tr("Load Preset"),
+ this, SLOT(load()));
+ fileOpen->setWhatsThis(tr(presetOpenText));
+ QAction* fileSave = tools->addAction(QIcon(*saveIcon), tr("Save Preset"),
+ this, SLOT(save()));
+ fileSave->setWhatsThis(tr(presetSaveText));
+
+ tools->addAction(QWhatsThis::createAction(this));
+
+ QAction* onOff = tools->addAction(QIcon(*exitIconS), tr("bypass plugin"));
+ onOff->setCheckable(true);
+ onOff->setChecked(plugin->on());
+ onOff->setWhatsThis(tr(presetBypassText));
+ connect(onOff, SIGNAL(triggered(bool)), SLOT(bypassToggled(bool)));
+
+ QString id;
+ id.setNum(plugin->plugin()->id());
+ QString name(museGlobalShare + QString("/plugins/") + id + QString(".ui"));
+
+ QWidget* mw; // main widget
+ QFile uifile(name);
+ if (uifile.exists()) {
+ //
+ // construct GUI from *.ui file
+ //
+ QFormBuilder builder;
+ //
+ // HACK:
+ //
+ QString path(museGlobalLib + "/designer");
+printf("build gui from ui <path><%s>\n", path.toLatin1().data());
+ builder.addPluginPath(path);
+
+ uifile.open(QFile::ReadOnly);
+ mw = builder.load(&uifile, this);
+ uifile.close();
+
+ setCentralWidget(mw);
+ connectPrebuiltGui(mw);
+ }
+ else {
+ mw = new QWidget(this);
+ setCentralWidget(mw);
+ QGridLayout* grid = new QGridLayout;
+ mw->setLayout(grid);
+ grid->setSpacing(2);
+
+ int n = plugin->plugin()->parameter();
+ resize(280, n*20+30);
+
+ QFontMetrics fm = fontMetrics();
+ int h = fm.height() + 4;
+
+ for (int i = 0; i < n; ++i) {
+ float lower;
+ float upper;
+ float dlower;
+ float dupper;
+ float val = plugin->param(i);
+ float dval = val;
+
+ plugin->range(i, &lower, &upper);
+ dlower = lower;
+ dupper = upper;
+
+ if (plugin->isLog(i)) {
+ if (lower == 0.0)
+ lower = 0.001;
+ dlower = fast_log10(lower)*20.0;
+ dupper = fast_log10(upper)*20.0;
+ if (val == 0.0f)
+ dval = dlower;
+ else
+ dval = fast_log10(val) * 20.0;
+ }
+ if (plugin->isBool(i)) {
+ CheckBox* cb = new CheckBox(mw);
+ cb->setId(i);
+ cb->setText(QString(plugin->getParameterName(i)));
+ cb->setChecked(plugin->param(i) > 0.5);
+ cb->setFixedHeight(h);
+ cb->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum));
+
+ GuiWidget w;
+ w.widget = cb;
+ w.parameter = i;
+ w.type = GuiWidget::CHECKBOX;
+ gw.push_back(w);
+ grid->addWidget(cb, i, 0, 1, 3);
+ connect(cb, SIGNAL(valueChanged(float,int)), SLOT(setController(float, int)));
+ }
+ else {
+ QLabel* label = new QLabel(QString(plugin->getParameterName(i)), mw);
+ label->setFixedHeight(20);
+ label->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum));
+ FloatEntry* e = new FloatEntry(mw);
+ e->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum));
+ e->setRange(lower, upper);
+ e->setId(i);
+ e->setFixedHeight(h);
+ e->setFrame(true);
+ GuiWidget w;
+ w.widget = e;
+ w.parameter = i;
+ w.type = GuiWidget::FLOAT_ENTRY;
+ gw.push_back(w);
+
+ Slider* s = new Slider(mw);
+ s->setId(i);
+ s->setLog(plugin->isLog(i));
+ s->setOrientation(Qt::Horizontal);
+ s->setFixedHeight(h);
+ s->setRange(dlower, dupper);
+ s->setLineStep((dupper-dlower)/100.0);
+ s->setPageStep((dupper-dlower)/10.0);
+ s->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum));
+ w.widget = s;
+ w.parameter = i;
+ w.type = GuiWidget::SLIDER;
+ gw.push_back(w);
+ grid->addWidget(label, i, 0);
+ grid->addWidget(e, i, 1);
+ const char* p = plugin->getParameterLabel(i);
+ if (p) {
+ QLabel* l = new QLabel(mw);
+ l->setFixedHeight(h);
+ l->setText(p);
+ grid->addWidget(l, i, 2);
+ }
+ grid->addWidget(s, i, 3);
+ connect(s, SIGNAL(valueChanged(float,int)), SLOT(setController(float,int)));
+ connect(e, SIGNAL(valueChanged(float,int)), SLOT(setController(float,int)));
+ }
+ updateValue(i, val);
+ }
+ grid->setColumnStretch(3, 10);
+ }
+ connect(plugin->track(), SIGNAL(autoReadChanged(bool)), SLOT(autoChanged()));
+ connect(plugin->track(), SIGNAL(autoWriteChanged(bool)), SLOT(autoChanged()));
+ connect(plugin->track(), SIGNAL(controllerChanged(int)), SLOT(controllerChanged(int)));
+ autoChanged();
+ }
+
+
+
+void PluginGui::connectPrebuiltGui(QWidget* wContainer)
+ {
+ QObjectList l = wContainer->children();
+ for (int i = 0; i < l.size(); ++i) {
+
+ QObject* obj = l.at(i);
+
+ const char* name = obj->objectName().toLatin1().data();
+
+ if (strcmp(obj->metaObject()->className(), "QFrame") == 0) {
+ connectPrebuiltGui((QWidget *)obj);
+ }
+ if (*name !='P')
+ continue;
+ GuiWidget w;
+ w.widget = (QWidget*)obj;
+ if (strcmp(obj->metaObject()->className(), "Awl::Slider") == 0) {
+ connect((Slider*)obj, SIGNAL(valueChanged(float,int)), SLOT(setController(float,int)));
+ w.type = GuiWidget::SLIDER;
+ w.parameter = ((Slider*)obj)->id();
+ }
+ else if (strcmp(obj->metaObject()->className(), "Awl::FloatEntry") == 0) {
+ connect((FloatEntry*)obj, SIGNAL(valueChanged(float,int)), SLOT(setController(float,int)));
+ w.type = GuiWidget::FLOAT_ENTRY;
+ w.parameter = ((FloatEntry*)obj)->id();
+ }
+ else if (strcmp(obj->metaObject()->className(), "Awl::CheckBox") == 0) {
+ w.type = GuiWidget::CHECKBOX;
+ w.parameter = ((CheckBox*)obj)->id();
+ connect(obj, SIGNAL(valueChanged(float, int)), SLOT(setController(float, int)));
+ }
+ else if (strcmp(obj->metaObject()->className(), "Awl::ComboBox") == 0) {
+ w.type = GuiWidget::COMBOBOX;
+ w.parameter = ((ComboBox*)obj)->id();
+ connect(obj, SIGNAL(valueChanged(float, int)), SLOT(setController(float,int)));
+ }
+ else {
+ printf("PluginGui::unknown widget class %s\n", obj->metaObject()->className());
+ continue;
+ }
+ gw.push_back(w);
+ }
+}
+
+
+//---------------------------------------------------------
+// PluginGui
+//---------------------------------------------------------
+
+PluginGui::~PluginGui()
+ {
+ }
+
+//---------------------------------------------------------
+// setController
+//---------------------------------------------------------
+
+void PluginGui::setController(float val, int param)
+ {
+ if (plugin->isInt(param))
+ val = rint(val);
+ CVal cval;
+ cval.f = val;
+ song->setControllerVal(plugin->track(), plugin->controller(param), cval);
+ }
+
+//---------------------------------------------------------
+// load
+//---------------------------------------------------------
+
+void PluginGui::load()
+ {
+ QString s("presets/plugins/");
+ s += plugin->plugin()->label();
+ s += "/";
+
+ QStringList pattern;
+ const char** p = preset_file_pattern;
+ while (*p)
+ pattern << *p++;
+ QString fn = getOpenFileName(s, pattern, this, tr("MusE: load preset"));
+ if (fn.isEmpty())
+ return;
+ QFile* qf = fileOpen(this, fn, QString(".pre"), QIODevice::ReadOnly, true);
+ if (qf == 0)
+ return;
+
+ QDomDocument doc;
+ int line, column;
+ QString err;
+ if (!doc.setContent(qf, false, &err, &line, &column)) {
+ QString col, ln, error;
+ col.setNum(column);
+ ln.setNum(line);
+ error = err + "\n at line: " + ln + " col: " + col;
+ printf("error reading med file: %s\n", error.toLatin1().data());
+ delete qf;
+ return;
+ }
+ QDomNode node = doc.documentElement();
+
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "muse") {
+ // QString version = e.attribute(QString("version"));
+ node = node.firstChild();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.tagName() == "plugin")
+ plugin->readConfiguration(node.firstChild());
+ else
+ printf("MusE:PluginGui: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+ else
+ printf("MusE: %s not supported\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ qf->close();
+ delete qf;
+ }
+
+//---------------------------------------------------------
+// save
+//---------------------------------------------------------
+
+void PluginGui::save()
+ {
+ QString s("presets/plugins/");
+ s += plugin->plugin()->label();
+ s += "/";
+
+ QStringList pattern;
+ const char** p = preset_file_pattern;
+ while (*p)
+ pattern << *p++;
+ QString fn = getSaveFileName(s, pattern, this,
+ tr("MusE: save preset"));
+ if (fn.isEmpty())
+ return;
+ QFile* f = fileOpen(this, fn, QString(".pre"), QIODevice::WriteOnly, true);
+ if (f == 0)
+ return;
+ Xml xml(f);
+ xml.header();
+ xml.tag("muse version=\"1.0\"");
+ plugin->writeConfiguration(xml);
+ xml.etag("muse");
+ f->close();
+ delete f;
+ }
+
+//---------------------------------------------------------
+// bypassToggled
+//---------------------------------------------------------
+
+void PluginGui::bypassToggled(bool val)
+ {
+ plugin->setOn(val);
+ song->update(SC_ROUTE);
+ }
+
+//---------------------------------------------------------
+// setOn
+//---------------------------------------------------------
+
+void PluginGui::setOn(bool val)
+ {
+ onOff->blockSignals(true);
+ onOff->setChecked(val);
+ onOff->blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// updateValue
+//---------------------------------------------------------
+
+void PluginGui::updateValue(int parameter, float value)
+ {
+ for (std::vector<GuiWidget>::iterator i = gw.begin(); i != gw.end(); ++i) {
+ int idx = i->parameter;
+ if (idx != parameter)
+ continue;
+ switch (i->type) {
+ case GuiWidget::SLIDER:
+ ((Slider*)(i->widget))->setValue(value);
+ break;
+ case GuiWidget::FLOAT_ENTRY:
+ {
+ const char* p = plugin->getParameterDisplay(idx, value);
+ if (p)
+ ((FloatEntry*)(i->widget))->setText(QString(p));
+ else
+ ((FloatEntry*)(i->widget))->setValue(value);
+ }
+ break;
+ case GuiWidget::CHECKBOX:
+ ((CheckBox*)(i->widget))->setValue(value);
+ break;
+ case GuiWidget::COMBOBOX:
+ ((ComboBox*)(i->widget))->setValue(value);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// updateValues
+//---------------------------------------------------------
+
+void PluginGui::updateValues()
+ {
+ int n = plugin->plugin()->parameter();
+ for (int i = 0; i < n; ++i) {
+ float val = plugin->param(i);
+ updateValue(i, val);
+ }
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void PluginGui::controllerChanged(int id)
+ {
+ float value = plugin->track()->ctrlVal(id).f;
+ for (std::vector<GuiWidget>::iterator i = gw.begin(); i != gw.end(); ++i) {
+ int idx = i->parameter;
+ if (plugin->controller(idx)->id() != id)
+ continue;
+ switch (i->type) {
+ case GuiWidget::SLIDER:
+ ((Slider*)(i->widget))->setValue(value);
+ break;
+ case GuiWidget::FLOAT_ENTRY:
+ {
+ const char* p = plugin->getParameterDisplay(idx, value);
+ if (p)
+ ((FloatEntry*)(i->widget))->setText(QString(p));
+ else
+ ((FloatEntry*)(i->widget))->setValue(value);
+ }
+ break;
+ case GuiWidget::CHECKBOX:
+ ((CheckBox*)(i->widget))->setValue(value);
+ break;
+ case GuiWidget::COMBOBOX:
+ ((ComboBox*)(i->widget))->setValue(value);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// autoChanged
+//---------------------------------------------------------
+
+void PluginGui::autoChanged()
+ {
+ bool ar = plugin->track()->autoRead();
+ bool aw = plugin->track()->autoWrite();
+
+ // controller are enabled if
+ // autoRead is off
+ // autoRead and autoWrite are on (touch mode)
+
+ bool ec = !ar || (ar && aw);
+
+ for (std::vector<GuiWidget>::iterator i = gw.begin(); i != gw.end(); ++i)
+ i->widget->setEnabled(ec);
+ }
+
+
diff --git a/muse/muse/plugingui.h b/muse/muse/plugingui.h
new file mode 100644
index 00000000..71c58a91
--- /dev/null
+++ b/muse/muse/plugingui.h
@@ -0,0 +1,122 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __PLUGINGUI_H__
+#define __PLUGINGUI_H__
+
+namespace Awl {
+ class FloatEntry;
+ };
+using Awl::FloatEntry;
+
+class Plugin;
+class PluginI;
+
+//---------------------------------------------------------
+// GuiParam
+//---------------------------------------------------------
+
+struct GuiParam {
+ enum {
+ GUI_SLIDER, GUI_SWITCH
+ };
+ int type;
+ FloatEntry* label;
+ QWidget* actuator; // Slider or Toggle Button (SWITCH)
+ };
+
+//---------------------------------------------------------
+// GuiWidget
+//---------------------------------------------------------
+
+struct GuiWidget {
+ enum {
+ SLIDER, FLOAT_ENTRY, CHECKBOX, COMBOBOX
+ } type;
+ QWidget* widget;
+ int parameter;
+ };
+
+//---------------------------------------------------------
+// PluginGui
+//---------------------------------------------------------
+
+class PluginGui : public QMainWindow {
+ Q_OBJECT
+
+ PluginI* plugin; // plugin instance
+ std::vector<GuiWidget> gw;
+
+ QToolButton* onOff;
+ void connectPrebuiltGui(QWidget* wContainer);
+
+ private slots:
+ void load();
+ void save();
+ void bypassToggled(bool);
+
+ void setController(float, int);
+ void autoChanged();
+
+ public:
+ PluginGui(PluginI*);
+ ~PluginGui();
+ void setOn(bool);
+ void updateValue(int, float);
+ void updateValues();
+
+ public slots:
+ void controllerChanged(int id);
+ };
+
+//---------------------------------------------------------
+// PluginDialog
+//---------------------------------------------------------
+
+enum { SEL_SM, SEL_S, SEL_M, SEL_ALL };
+
+class PluginDialog : public QDialog {
+ QTreeWidget* pList;
+ QRadioButton* allPlug;
+ QRadioButton* onlyM;
+ QRadioButton* onlyS;
+ QRadioButton* onlySM;
+
+ Q_OBJECT
+
+ public:
+ PluginDialog(QWidget* parent=0);
+ static Plugin* getPlugin(QWidget* parent);
+ Plugin* value();
+ void accept();
+
+ public slots:
+ void fillPlugs(QAbstractButton*);
+ void fillPlugs(int i);
+ void fillPlugs(const QString& sortValue);
+
+ private:
+ QComboBox *sortBox;
+ static int selectedPlugType;
+ static QStringList sortItems;
+ };
+
+#endif
+
diff --git a/muse/muse/qrc_muse.cxx b/muse/muse/qrc_muse.cxx
new file mode 100644
index 00000000..92546d12
--- /dev/null
+++ b/muse/muse/qrc_muse.cxx
@@ -0,0 +1,3836 @@
+/****************************************************************************
+** Resource object code
+**
+** Created: Wed May 3 11:19:32 2006
+** by: The Resource Compiler for Qt version 4.1.2-snapshot-20060303
+**
+** WARNING! All changes made in this file will be lost!
+*****************************************************************************/
+
+#include <QtCore/qglobal.h>
+
+static const unsigned char qt_resource_data[] = {
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/start.xpm
+ 0x0,0x0,0x1,0x53,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x20,0x73,0x74,0x61,
+ 0x72,0x74,0x5f,0x78,0x70,0x6d,0x5b,0x5d,0x20,0x3d,0x20,0x7b,0xa,0x22,0x31,0x37,
+ 0x20,0x31,0x32,0x20,0x32,0x20,0x31,0x22,0x2c,0xa,0x22,0x20,0x9,0x63,0x20,0x4e,
+ 0x6f,0x6e,0x65,0x22,0x2c,0xa,0x22,0x2e,0x9,0x63,0x20,0x23,0x30,0x30,0x30,0x30,
+ 0x30,0x30,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,
+ 0x2e,0x2e,0x20,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x22,0x2c,0xa,0x22,
+ 0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x2e,
+ 0x2e,0x2e,0x2e,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,
+ 0x2e,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,
+ 0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x2e,0x2e,0x2e,0x2e,
+ 0x2e,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,
+ 0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x2e,0x2e,
+ 0x2e,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,
+ 0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,
+ 0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x22,0x7d,
+ 0x3b,0xa,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/splash.png
+ 0x0,0x0,0xb1,0x3e,
+ 0x89,
+ 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,
+ 0x0,0x1,0x90,0x0,0x0,0x1,0x2c,0x8,0x6,0x0,0x0,0x0,0xed,0xb7,0xe5,0xc2,
+ 0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,
+ 0xa7,0x93,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,
+ 0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,
+ 0xd4,0xa,0x15,0x2,0x3,0x25,0xb,0xa1,0x18,0x7f,0x0,0x0,0x20,0x0,0x49,0x44,
+ 0x41,0x54,0x78,0xda,0xec,0xbd,0x67,0x97,0x1d,0xd7,0x79,0x2e,0xf8,0xec,0xbd,0xab,
+ 0x76,0xa5,0x93,0x3a,0x67,0x64,0x80,0xd1,0xe9,0x7e,0x99,0x8f,0xf3,0xef,0xe6,0xdb,
+ 0xcc,0x9a,0x3b,0x6b,0xd6,0xac,0x2b,0xfb,0x5e,0x7b,0x59,0xb4,0x6c,0xd9,0xa2,0x2c,
+ 0x5b,0xd6,0x15,0x2d,0xf1,0xda,0x56,0xa4,0x48,0x91,0x4a,0xb4,0x18,0x45,0x82,0x44,
+ 0x6a,0xa0,0x73,0x9f,0x73,0xea,0x54,0xae,0xda,0xf3,0x61,0x87,0x53,0xa7,0xd1,0x0,
+ 0x1b,0xe8,0x6e,0x10,0xd,0xd6,0xbb,0x4,0x35,0x42,0xa3,0xd9,0x38,0x61,0x3f,0xfb,
+ 0x7d,0xdf,0x27,0x10,0x0,0x2,0x4d,0x35,0xd5,0xd4,0x97,0x56,0x94,0x52,0x78,0xae,
+ 0x3,0xcb,0xb2,0x30,0xc,0x43,0x54,0xd5,0xf8,0x2d,0x69,0x5b,0x16,0xfe,0xf7,0xff,
+ 0xed,0xbf,0x20,0xf0,0x3d,0x54,0x55,0x85,0x4a,0x8,0x94,0x65,0x89,0x30,0x4a,0x70,
+ 0xeb,0xce,0x5d,0x4c,0xf5,0x3a,0xb0,0x2d,0xb,0x9e,0xe7,0x60,0x67,0x6f,0x80,0xf7,
+ 0x3e,0xfe,0xf4,0x89,0x7d,0xdf,0x96,0xc5,0xe0,0x38,0xe,0x2c,0xc6,0x40,0x8,0x1,
+ 0x1,0x40,0x29,0x81,0xc5,0x18,0x6c,0xdb,0x86,0xc3,0x6d,0xb4,0x3,0x1f,0xbd,0x4e,
+ 0x1b,0xbd,0x4e,0x1b,0x8c,0x31,0x8,0xf5,0x6f,0x20,0x84,0x0,0x0,0xb2,0x3c,0x47,
+ 0x38,0x8a,0xb0,0x3f,0xc,0x31,0x18,0x86,0xd8,0xd8,0xda,0x45,0x9c,0xa6,0x10,0xe2,
+ 0xd9,0x3f,0x96,0x18,0x63,0xe0,0x9c,0x83,0x73,0x1b,0x4,0x4,0x42,0x54,0x10,0x2,
+ 0xea,0xdf,0x2e,0xee,0x7b,0xc,0x28,0x21,0xa0,0x94,0x82,0x52,0xa,0xc6,0x28,0x6c,
+ 0xcb,0x82,0xc3,0x6d,0x58,0x8c,0x81,0xe9,0xe7,0x80,0x10,0x10,0x2,0x50,0x22,0x3f,
+ 0x87,0x51,0xa,0x42,0x29,0x20,0x84,0x7a,0xed,0x54,0x28,0xca,0x12,0x79,0x91,0xa3,
+ 0xc8,0x4b,0x94,0x55,0x89,0xaa,0x12,0xa8,0xaa,0xa,0x59,0x51,0x20,0x49,0x52,0x44,
+ 0x49,0x82,0xb2,0xac,0x8e,0xf6,0x1a,0x68,0xde,0xbe,0x4d,0x35,0xf5,0xe5,0x15,0x21,
+ 0x4,0x9e,0xeb,0xc2,0x73,0x39,0x44,0x25,0xee,0xbb,0xce,0x51,0x2a,0xf,0xd,0xd,
+ 0x1e,0x45,0x51,0x60,0x18,0x8e,0x70,0xfd,0xf6,0x3a,0xb6,0xb6,0xf7,0x60,0xd9,0xc,
+ 0xbd,0x4e,0x7,0x55,0x25,0xff,0xec,0x49,0x7d,0xcf,0xfa,0xe0,0xa3,0xea,0xd0,0xa2,
+ 0x4,0xa0,0x94,0xc1,0xb6,0x18,0xb8,0x6d,0xc3,0x73,0x1d,0xb4,0x83,0x0,0x73,0x33,
+ 0x3d,0xb8,0x8e,0x3,0x2,0xa0,0xaa,0x4a,0x8,0x21,0xff,0x7e,0x55,0x55,0x88,0x93,
+ 0x14,0xfb,0x83,0x21,0xa2,0x38,0xc1,0xdd,0xad,0x6d,0xc,0xc3,0x8,0x59,0x9e,0x7f,
+ 0x65,0x80,0xc3,0xb2,0x2c,0x9,0xa4,0x42,0xa0,0x52,0xe0,0x71,0x28,0x70,0x50,0x22,
+ 0x1,0xa1,0x6,0x1c,0xb6,0x6d,0x83,0xdb,0x96,0x4,0x8,0x3,0x1c,0x4,0x44,0x1,
+ 0x38,0xa5,0x14,0x94,0x10,0x8,0x0,0xa2,0xaa,0x50,0x56,0xa,0x38,0xf2,0x2,0x79,
+ 0x51,0xa0,0x2c,0x2b,0x54,0xa2,0x42,0x55,0x56,0x48,0xb3,0x1c,0x71,0x9a,0x20,0x4d,
+ 0x73,0x94,0x65,0xf9,0x48,0x1d,0x45,0x3,0x20,0x4d,0x35,0xf5,0x25,0x1e,0x24,0x9e,
+ 0xeb,0xc2,0x77,0x1d,0x70,0xdb,0x42,0x9a,0xe5,0xf7,0xbd,0x79,0x19,0x63,0x10,0x10,
+ 0xa8,0x2a,0x81,0xbc,0x28,0xb0,0xb3,0xd7,0xc7,0xa7,0x37,0x6f,0xa3,0x3f,0x1c,0x42,
+ 0x8,0x20,0xcb,0xa,0x88,0x4a,0xc8,0x83,0xe0,0x9,0x1c,0xbe,0x8c,0xc9,0xae,0xc3,
+ 0xb6,0x2c,0x50,0x32,0x3e,0xe0,0x18,0x63,0xe0,0xb6,0x5,0x87,0x73,0x4,0x9e,0x87,
+ 0x99,0xa9,0x2e,0x3a,0xad,0x0,0xb6,0x65,0xa1,0xaa,0x2a,0x94,0xaa,0xeb,0xa0,0x4,
+ 0x48,0xf3,0x1c,0xc3,0x70,0x84,0x41,0x38,0xc2,0xee,0xfe,0x0,0xdb,0x7b,0xfb,0x88,
+ 0xe2,0xe4,0x2b,0xf1,0x7c,0x3b,0x8e,0x3,0xc6,0x18,0x18,0xa5,0x10,0x42,0x82,0x45,
+ 0xf5,0xa0,0x8e,0x83,0x12,0x30,0xca,0xc6,0x8f,0xaf,0x65,0x81,0x73,0x5b,0x3e,0xf6,
+ 0xa,0x20,0x8,0x21,0x0,0x21,0x60,0x94,0x80,0x52,0x6,0x8b,0x49,0x40,0xd1,0xaf,
+ 0x99,0xb2,0x2c,0x51,0x14,0x25,0xd2,0x4c,0x82,0x43,0x59,0x55,0x10,0xaa,0x8b,0x4d,
+ 0xd2,0xc,0x51,0x92,0x20,0xcd,0xb2,0x89,0xae,0xf7,0x91,0xba,0xd0,0xe6,0x6d,0xdc,
+ 0x54,0x53,0x4f,0xbe,0x2c,0xcb,0x42,0xe0,0xfb,0xe0,0x36,0x83,0xeb,0x70,0x78,0xae,
+ 0x83,0xb2,0xba,0x7f,0x6c,0x60,0x31,0x6,0x51,0x9,0xa4,0x59,0x86,0xf5,0xad,0x6d,
+ 0xdc,0xba,0x73,0xf,0xc3,0x51,0x64,0xfe,0x3c,0x2f,0xa,0x8,0x21,0x50,0x94,0x25,
+ 0xb2,0xf4,0xf4,0x0,0x84,0x10,0x22,0xc7,0x52,0xe,0x7,0x23,0x14,0xf2,0xdc,0x22,
+ 0x60,0x8c,0xc2,0x62,0xc,0xe,0xb7,0xe1,0xb9,0x2e,0xba,0xed,0x16,0xa6,0xba,0x6d,
+ 0xf8,0x9e,0x7,0x0,0xe6,0xc0,0x22,0x84,0xa0,0x2c,0x2b,0x44,0x71,0x8c,0x41,0x38,
+ 0xc2,0xfe,0x20,0xc4,0xc6,0xf6,0xe,0xc2,0x28,0x46,0x59,0x96,0xcf,0xfc,0x73,0x6d,
+ 0xdb,0x36,0x2c,0xcb,0x2,0x55,0xa3,0xbb,0xaa,0xaa,0x0,0x21,0x20,0xe,0x0,0x87,
+ 0x1c,0x3,0x52,0xf3,0xc3,0x52,0xc0,0x6c,0x80,0x83,0x10,0x10,0x4a,0xcd,0x98,0x4a,
+ 0x82,0xc,0x5,0x63,0xc,0xb2,0x7f,0x91,0x8f,0x79,0x55,0x56,0xc8,0xf2,0x1c,0x79,
+ 0x51,0x20,0xcf,0xb,0x54,0xa2,0x42,0x59,0x56,0xc8,0xcb,0x12,0x71,0x92,0x22,0x4d,
+ 0x53,0xf5,0xfb,0xc7,0x1b,0x15,0x36,0x0,0xd2,0x54,0x53,0x4f,0xfa,0x40,0x61,0xc,
+ 0x81,0xef,0xc3,0xe1,0x16,0x5c,0xce,0x11,0xf8,0x1e,0x5c,0xce,0x27,0x80,0xa1,0x76,
+ 0x72,0x23,0x49,0x33,0x6c,0xed,0xee,0xe1,0xb3,0xdb,0xeb,0xc8,0xb2,0x49,0x90,0x28,
+ 0xcb,0x12,0x95,0x18,0xcf,0xb5,0x4f,0xa3,0x28,0xa5,0x70,0x1c,0xe,0x6e,0xdb,0xe6,
+ 0x0,0xa4,0x84,0x80,0xa9,0x71,0x95,0xc3,0x6d,0x4,0x9e,0x87,0xe9,0x5e,0x7,0xbd,
+ 0x4e,0x1b,0xb6,0x65,0xc9,0x43,0x4c,0x1,0x22,0x21,0x4,0x59,0x9e,0x63,0x38,0x8a,
+ 0x30,0x1a,0x45,0xb8,0xb7,0xbd,0x8b,0xdd,0xfd,0x3e,0xe2,0x24,0x7d,0xe6,0x3b,0xe,
+ 0xdb,0xb6,0x61,0xd7,0x1e,0x37,0x21,0x2a,0xf5,0x71,0xc,0x1c,0xa4,0x3e,0xaa,0xa2,
+ 0x6c,0x62,0x54,0xe5,0x38,0x1c,0xb6,0x75,0x60,0x54,0xa5,0xc6,0x9a,0x7a,0x54,0x45,
+ 0x64,0xff,0x2,0x51,0x9,0xf5,0x3a,0x28,0x90,0x65,0x12,0x3c,0xaa,0x4a,0x8e,0xc7,
+ 0xf2,0xbc,0x40,0x14,0x27,0x88,0x93,0x14,0x45,0x59,0x9e,0xd8,0x8e,0xa9,0x1,0x90,
+ 0xa6,0x9a,0x7a,0x82,0xe5,0x38,0xe,0x7c,0xcf,0x81,0xcb,0x39,0x5c,0xd7,0x81,0xef,
+ 0xba,0x8,0x3c,0x17,0xe,0xe7,0xd8,0xda,0xdd,0xc3,0xc1,0x25,0x48,0x59,0x14,0xf8,
+ 0xe4,0xc6,0x2d,0x6c,0xee,0xec,0x99,0x3,0xb9,0x5e,0x95,0x10,0x6a,0x9,0x5a,0x9c,
+ 0xca,0xfe,0xc0,0xb6,0x6d,0xb8,0xae,0x5c,0x94,0x43,0x40,0xed,0x3a,0x28,0xb8,0x2d,
+ 0x6f,0xd5,0xbe,0xe7,0xa2,0xd3,0xa,0x30,0xdd,0xeb,0x20,0xf0,0x3c,0xd5,0xd,0x15,
+ 0xd0,0xe7,0x53,0x55,0x55,0x18,0x8e,0x22,0xc,0xc3,0x11,0x76,0xfb,0x43,0x6c,0xee,
+ 0xec,0x22,0x3c,0xc,0x28,0x9f,0x31,0xe0,0xe0,0x5c,0x2,0x2e,0x21,0x6a,0x39,0xe,
+ 0x21,0x3b,0xe,0xa1,0x3e,0x6a,0xe0,0x20,0x44,0x82,0x31,0x93,0x5d,0x84,0x24,0x20,
+ 0xc8,0x51,0xa0,0x6d,0x31,0xd3,0x65,0x0,0xc4,0xec,0xc3,0xf4,0x8,0x4c,0x3,0x51,
+ 0x55,0x55,0xc8,0x8b,0x2,0x69,0x96,0x21,0x2f,0xe4,0xc8,0x4a,0x88,0xa,0x45,0x51,
+ 0x21,0xcb,0x33,0xc4,0x49,0x8a,0x38,0x49,0xf,0xed,0x70,0x1b,0x0,0x69,0xaa,0xa9,
+ 0x33,0x50,0x84,0x10,0x70,0xdb,0x46,0xcb,0xf7,0xe0,0x70,0x1b,0xae,0xe3,0x20,0xf0,
+ 0x5c,0x78,0x9e,0x4,0x11,0x7d,0xd8,0x1c,0x5c,0x82,0xe8,0x37,0xff,0x83,0x46,0xd,
+ 0x66,0xa6,0x5d,0x95,0xc8,0xcb,0x93,0x3b,0x20,0x28,0xa5,0x66,0x51,0xce,0xd4,0x2d,
+ 0x97,0x52,0x2,0xcb,0x62,0xb0,0x2c,0xb,0x9e,0xe3,0xc0,0xf3,0x1c,0xcc,0xf6,0xba,
+ 0xe8,0xb6,0x5b,0xb0,0x2c,0x66,0xba,0xe,0x7d,0xbb,0xcd,0xf2,0x1c,0x83,0xa1,0xdc,
+ 0x75,0x6c,0x6c,0xef,0x60,0x7f,0x10,0x3e,0xd3,0x4b,0xf2,0xfa,0x72,0x7c,0x62,0x54,
+ 0x85,0x31,0x70,0xd4,0x5f,0xf,0x6,0x38,0x28,0x83,0x65,0xc9,0x51,0x26,0xb7,0x6d,
+ 0x3,0x10,0x72,0x4c,0x28,0x3f,0x32,0xca,0xc0,0x18,0xad,0x75,0x1c,0xf2,0xb9,0x2f,
+ 0x72,0x79,0x71,0xd0,0x3b,0x8e,0xa2,0x2c,0x51,0x96,0x72,0xe7,0x11,0xc5,0x9,0xb2,
+ 0x3c,0x3f,0x15,0xe0,0x68,0x0,0xa4,0xa9,0xa6,0x9e,0x20,0x78,0x78,0xae,0x6b,0x3a,
+ 0xf,0xdf,0x75,0xe1,0x79,0xf2,0xd7,0x9e,0xeb,0xc2,0x73,0x1c,0x8,0x8,0x9,0x6,
+ 0x87,0x74,0x18,0xf,0x2d,0x1,0x39,0xa2,0x28,0x4a,0x94,0x27,0xc4,0xc2,0xb2,0x2d,
+ 0xb,0x8e,0xeb,0x9a,0x85,0x2c,0x5,0x40,0x6b,0xb4,0x51,0x87,0x73,0x4c,0x77,0x3b,
+ 0x98,0xea,0x76,0xe0,0x79,0xe,0x0,0xa0,0x28,0xd5,0xc8,0x8a,0x10,0x94,0x55,0x85,
+ 0x28,0x4e,0x10,0x8e,0x22,0x6c,0xee,0xec,0x62,0x7b,0x77,0x1f,0xa3,0x38,0x79,0x66,
+ 0xa9,0xb9,0x72,0x39,0xce,0xc1,0x98,0x65,0x96,0xe3,0x1a,0x34,0xe4,0x4f,0xab,0xfa,
+ 0x8b,0x1,0x94,0x28,0xa6,0x94,0x79,0x4c,0xb9,0xa4,0xe3,0x5a,0x63,0x2a,0xee,0x4,
+ 0x65,0x97,0x1e,0x0,0xe,0x35,0xa6,0x4a,0xd2,0xc,0x79,0x9e,0x9b,0xc7,0xbe,0x50,
+ 0xfb,0x8d,0x28,0x8e,0x91,0xe5,0xc5,0x13,0x79,0xbc,0x1b,0x0,0x69,0xaa,0xa9,0x53,
+ 0x2c,0x4a,0x8,0x7c,0xdf,0x83,0xe7,0xba,0x70,0xb8,0xec,0x40,0x3c,0x35,0xba,0xf2,
+ 0x3c,0x7,0x8e,0x6d,0x83,0x31,0x8a,0xbc,0x28,0x50,0x14,0x8f,0xbe,0x4c,0xd6,0x4b,
+ 0xd8,0xa2,0x28,0x8e,0x7d,0xd3,0x24,0x84,0xc0,0x71,0x1c,0xb9,0xeb,0xa0,0xea,0x10,
+ 0x23,0xb2,0xeb,0xb0,0x6d,0xb9,0xaf,0x69,0x7,0x1,0x7a,0xdd,0x36,0x3a,0xed,0x16,
+ 0x6c,0xc6,0x24,0xc3,0x4a,0xd1,0x73,0x85,0x10,0xc8,0xb2,0x1c,0x83,0x30,0xc4,0xfe,
+ 0xfe,0x10,0x9b,0xbb,0xbb,0xd8,0x1b,0xc,0x8f,0xac,0x29,0x38,0x6b,0x25,0x1f,0x97,
+ 0x87,0x75,0x1c,0xa,0xe1,0x75,0xc7,0xa1,0x76,0x1b,0x8c,0xb1,0x9,0x30,0xd6,0x3a,
+ 0x1a,0x4a,0x35,0x78,0xe8,0xcf,0xa3,0x20,0x44,0x8f,0xaa,0x2a,0xe4,0x65,0x85,0x2c,
+ 0xcb,0x90,0x65,0x5,0xb2,0x42,0xb1,0xaa,0xca,0x12,0x79,0x51,0x22,0x1c,0x45,0xc8,
+ 0x14,0x45,0xf7,0x49,0x2,0x75,0x3,0x20,0x4d,0x35,0x75,0x5a,0xe0,0x41,0x29,0x3c,
+ 0xcf,0x55,0x54,0x5d,0xe,0xcf,0x75,0x11,0x28,0x0,0xf1,0x5c,0x7,0xe,0xe7,0xb5,
+ 0x83,0x47,0xa0,0xaa,0x1e,0x83,0x8d,0x24,0xa0,0x28,0xbe,0xa5,0xd4,0x91,0x1c,0xeb,
+ 0x16,0x2d,0xe9,0xc4,0x54,0x8b,0xd1,0x28,0x85,0xad,0x6e,0xd7,0xae,0xe3,0xa0,0xdb,
+ 0xe,0x30,0x3b,0x35,0x5,0xcf,0xd5,0x5d,0x87,0xa4,0x85,0x12,0x35,0x4e,0x19,0x45,
+ 0x31,0xc2,0x51,0x84,0x8d,0xed,0x1d,0x6c,0xed,0xee,0x23,0x49,0x53,0x3c,0x8b,0x4d,
+ 0x7,0xa3,0x14,0x36,0xe7,0x7,0x96,0xe3,0xe2,0x81,0xc0,0xa1,0x97,0xe2,0x72,0x77,
+ 0x64,0x83,0x73,0xe,0xd7,0xe1,0xa6,0xc3,0x33,0x5d,0x87,0xea,0x36,0x2c,0xc6,0x40,
+ 0x34,0x47,0x5a,0xc8,0xc7,0x39,0xcd,0x32,0xd5,0x71,0x14,0x28,0xab,0x12,0xa5,0xd2,
+ 0x6f,0x44,0x71,0x82,0x24,0x95,0x8b,0xf1,0x2f,0x5,0x44,0x9b,0xb7,0x79,0x53,0x4d,
+ 0x9d,0xce,0x58,0xa3,0xd3,0xa,0xe0,0x3a,0xdc,0x30,0xad,0xe4,0xd8,0xca,0x85,0xcb,
+ 0x39,0xb8,0x6d,0x19,0x35,0x76,0x59,0x56,0x8,0x47,0x23,0xe4,0x8f,0x71,0x8,0xe8,
+ 0x25,0x6a,0xf1,0x98,0x37,0x4f,0x29,0xa,0xb4,0xe1,0x39,0xae,0xbc,0x1,0x63,0xac,
+ 0xeb,0xd0,0x37,0xe4,0x76,0x20,0x97,0xe4,0x9d,0x56,0xb,0x8c,0x11,0x43,0x7,0xd5,
+ 0xe8,0x10,0xa7,0x29,0xc2,0x51,0x8c,0xad,0xdd,0x3d,0x6c,0xed,0xee,0x63,0x30,0xc,
+ 0x8f,0x4d,0xf,0x7d,0x5a,0x9f,0xd3,0xc9,0xe5,0x78,0x7d,0x54,0x25,0xcc,0x81,0xf,
+ 0xa2,0x55,0xe3,0x72,0x97,0x51,0xdf,0x1b,0x39,0xdc,0x36,0x9d,0x85,0xee,0x3a,0xe4,
+ 0x2e,0x44,0xee,0x38,0x8,0x8,0x40,0x60,0x34,0x1c,0x71,0x92,0x20,0x55,0x8c,0xaa,
+ 0xb2,0x94,0xcb,0xf2,0x2c,0xcd,0x31,0x4a,0x12,0xa4,0x69,0xfa,0xa5,0x3f,0xce,0xd,
+ 0x80,0x34,0xd5,0xd4,0x89,0x8f,0x36,0x2c,0xd3,0x69,0xb8,0x8e,0x14,0xd6,0xf9,0x9e,
+ 0x6b,0x3a,0xf,0x4d,0xbf,0x94,0xa3,0xa7,0x12,0xdb,0x7b,0xfb,0xf8,0xfc,0x10,0x8a,
+ 0xee,0x51,0x4a,0xb3,0xb0,0x24,0xf3,0xe6,0xd1,0xe,0x93,0xfb,0xbb,0xe,0x79,0x5b,
+ 0xb6,0x2d,0xd9,0x75,0x78,0xae,0x83,0x4e,0xab,0x85,0x99,0x5e,0x57,0x2a,0xe5,0x41,
+ 0xcc,0x41,0xa6,0x81,0x6f,0x14,0xc7,0xe8,0xf,0x86,0xd8,0xda,0xeb,0x63,0x73,0x7b,
+ 0xf7,0x99,0x5c,0x92,0x4b,0x91,0xa4,0xd,0xeb,0x0,0x1d,0x77,0x2,0x38,0x4c,0xd7,
+ 0xa9,0x29,0xb6,0x4a,0xc3,0xa1,0xf6,0x1b,0x92,0x8c,0xc0,0x26,0xc6,0x54,0x63,0x56,
+ 0x15,0x55,0x5f,0x57,0x32,0xb6,0xd2,0x34,0x47,0x96,0xe7,0xb2,0xe3,0x28,0x4a,0x94,
+ 0x65,0x81,0xbc,0x28,0x4d,0xb7,0x91,0x66,0xf9,0x53,0xb3,0x4f,0x6a,0x0,0xa4,0xa9,
+ 0xa6,0x4e,0xb0,0x1c,0xdd,0x6d,0x38,0x1c,0x9e,0x27,0x47,0x56,0xbe,0xeb,0x9a,0x91,
+ 0x95,0xad,0x16,0xa5,0x42,0x0,0x59,0x5e,0x60,0x63,0x7b,0x7,0x1f,0x7e,0xfa,0x39,
+ 0x92,0x34,0x83,0x6d,0x3d,0xfa,0xdb,0x51,0x54,0x2,0xa5,0xa8,0xe,0x5d,0xc0,0x7f,
+ 0xd1,0xf7,0xe9,0x38,0x8e,0x54,0x30,0xd7,0xe6,0xf3,0xba,0xeb,0x68,0x5,0x3e,0x66,
+ 0x7a,0x52,0x4d,0xce,0x18,0x33,0x8b,0x5b,0xb9,0x75,0x1,0x92,0x34,0x45,0x18,0x46,
+ 0xd8,0xde,0xdb,0xc7,0xdd,0xcd,0x6d,0x44,0x49,0xf2,0xd8,0x6a,0xe6,0xa7,0xbd,0xe3,
+ 0xb0,0xac,0xfb,0x97,0xe3,0x10,0xfa,0x91,0x50,0xc0,0x41,0x6a,0xc0,0xa1,0xf6,0x1b,
+ 0x9e,0xeb,0xc0,0xb6,0x74,0xc7,0x31,0xb9,0x1c,0x67,0x8c,0xa9,0x9f,0x4b,0xe0,0xa8,
+ 0xaa,0x31,0xe5,0x36,0xc9,0x32,0x14,0x45,0xa9,0x7e,0x2f,0x47,0x1c,0x27,0x18,0xc5,
+ 0xc9,0x4,0x3d,0xfa,0xa9,0xb9,0x2c,0x35,0x6f,0xf9,0xa6,0x9a,0x3a,0x21,0xf0,0x70,
+ 0x38,0x5a,0x41,0x0,0xcf,0x91,0x4c,0xab,0x56,0xa0,0xf6,0x1d,0x8e,0x4,0xf,0xcb,
+ 0x62,0x66,0xec,0x14,0xa7,0x29,0x6e,0xdc,0xbe,0x87,0x1b,0x77,0xee,0x22,0xcd,0xb2,
+ 0xda,0x48,0xe4,0x91,0x21,0xc4,0x58,0x53,0x1c,0xa5,0x28,0xa5,0x70,0x5d,0x7,0xdc,
+ 0xe6,0xea,0x36,0xc,0x58,0x54,0xb2,0x81,0x38,0xb7,0xe1,0xbb,0x2e,0x7a,0x9d,0x16,
+ 0xa6,0xba,0x1d,0xb8,0x8a,0x1d,0x96,0x65,0x39,0xca,0xaa,0x4,0x40,0x50,0x94,0x5,
+ 0xe2,0x24,0xc5,0xf6,0xee,0x3e,0xb6,0x76,0xf7,0xb0,0xbb,0x3f,0x50,0xc0,0xf2,0xc,
+ 0x75,0x90,0x8c,0xc9,0x1d,0x87,0x35,0x1e,0x33,0xea,0x8e,0x43,0x6b,0x38,0x20,0x27,
+ 0x55,0x13,0x6a,0x7c,0x8b,0x59,0x70,0x5d,0xe,0x47,0x8d,0xb9,0xa4,0x91,0xe1,0x41,
+ 0xe0,0x50,0x6,0x87,0x84,0x2,0xca,0x6e,0x24,0x49,0x13,0x24,0x69,0x86,0x24,0xcb,
+ 0x50,0x16,0x25,0xb2,0xa2,0x44,0x9a,0xa5,0x92,0x86,0x9b,0xe5,0x72,0x3c,0xf9,0xb4,
+ 0x3e,0x56,0xcd,0xdb,0xbe,0xa9,0xa6,0x8e,0x5f,0x9e,0xe7,0xc2,0x77,0x5d,0xf8,0x8e,
+ 0xec,0x40,0x2,0xcf,0x85,0xef,0x79,0x70,0x1d,0x2e,0x29,0x9e,0x4a,0x49,0x5c,0x55,
+ 0x15,0x92,0x34,0xc5,0x47,0x9f,0xde,0xc0,0xfa,0xe6,0xd6,0x24,0xf3,0x8a,0x3c,0xde,
+ 0x7f,0x5b,0x54,0xe2,0x48,0xb3,0x70,0xdb,0xb6,0x6a,0x3e,0x56,0x35,0x86,0x95,0x65,
+ 0xc9,0x51,0x9b,0xef,0xc9,0xae,0xa3,0xad,0xbb,0xe,0x39,0x73,0xd7,0xd7,0xde,0x34,
+ 0xcb,0x30,0xc,0x47,0xd8,0xda,0xdd,0xc7,0xfa,0xc6,0xd6,0x33,0xe7,0x9a,0x7b,0xd8,
+ 0x72,0x5c,0x2,0x34,0x0,0x51,0x19,0xf1,0x5f,0x1d,0x38,0x18,0x65,0xb0,0x6d,0x6,
+ 0xd7,0x71,0xe0,0x70,0x7,0xe,0xb7,0xc6,0xc0,0x1,0x32,0xf1,0x79,0x92,0x96,0x2b,
+ 0x7f,0x2f,0xcf,0x73,0x64,0x79,0x81,0x28,0xd1,0x20,0x51,0x1a,0x1a,0xee,0x28,0x8e,
+ 0x91,0xa6,0xd9,0xa9,0xea,0x37,0x1a,0x0,0x69,0xaa,0xa9,0xa7,0xa0,0x8,0x21,0xf0,
+ 0x3c,0xf,0x9d,0xc0,0x37,0x87,0x70,0xe0,0x4b,0x6d,0x87,0xe7,0xba,0xd2,0x86,0x82,
+ 0x49,0x2a,0x66,0x55,0x55,0xd8,0xda,0xdd,0xc7,0x27,0x37,0x6e,0x61,0x7b,0x67,0xef,
+ 0xbe,0x5b,0x25,0x55,0x94,0xcd,0x47,0xeb,0x3f,0xf4,0x1e,0xa4,0x7a,0xf8,0xf7,0xe8,
+ 0x4a,0xb5,0xbb,0x3e,0xc0,0x18,0x25,0x46,0xf1,0x1c,0x78,0x2e,0x3a,0xad,0x16,0xa6,
+ 0x7b,0x1d,0x38,0x9c,0x1b,0x3a,0xae,0x3e,0xc0,0xf2,0xbc,0xc0,0x28,0x8a,0xb0,0xdb,
+ 0x1f,0x60,0x7d,0x63,0x1b,0x83,0x70,0xf4,0xd0,0xff,0xde,0x59,0x1d,0x55,0x1d,0xb6,
+ 0x1c,0xaf,0x33,0xaa,0xa8,0xf6,0xff,0xa2,0xcc,0x98,0x47,0x4a,0x1f,0x33,0x17,0xb6,
+ 0x3d,0xf6,0xa9,0x32,0xe,0xc5,0x94,0x18,0x1,0xa0,0xee,0x64,0xf2,0xbc,0x40,0x9c,
+ 0x24,0x88,0x92,0x14,0x79,0x9e,0xa3,0x2c,0x2b,0x24,0x59,0x66,0xac,0x5e,0xf2,0xbc,
+ 0x38,0x53,0xa0,0xdc,0x0,0x48,0x53,0x4d,0x3d,0x66,0x51,0x4a,0xe1,0xbb,0x8e,0x59,
+ 0x98,0xb7,0x7c,0xcf,0xfc,0xdc,0xa9,0xd9,0x9d,0x3,0x40,0x51,0x14,0xd8,0xd8,0xd9,
+ 0xc5,0x47,0x9f,0xde,0xc0,0x70,0x14,0x3d,0x60,0x24,0xf1,0x78,0x7,0x87,0xa8,0xa9,
+ 0xbf,0x1f,0xd4,0x75,0x70,0xcb,0x1a,0xdb,0x82,0x33,0x69,0x45,0x22,0xc5,0x8d,0x2e,
+ 0xa6,0x7b,0x5d,0xb4,0x7d,0x1f,0x96,0xcd,0xcc,0x4d,0x58,0x28,0xf,0xa5,0x34,0xcb,
+ 0xb1,0x3f,0x18,0x62,0x6b,0x67,0xf,0x9b,0x3b,0xbb,0x48,0xd2,0xec,0x19,0x3,0xe,
+ 0x1b,0x96,0x65,0x1b,0xea,0xf2,0x78,0x54,0x35,0xf9,0x7c,0x68,0x1a,0xae,0xc5,0x24,
+ 0xa3,0xca,0x55,0x63,0x4a,0x7d,0x41,0xa8,0x53,0x71,0xd,0x70,0x50,0x65,0x7c,0x8,
+ 0x98,0x6e,0x23,0x4e,0x12,0x63,0xa9,0x2e,0x69,0xb8,0x31,0xe2,0x24,0x43,0x51,0x14,
+ 0x67,0x92,0xb9,0xd6,0x0,0x48,0x53,0x4d,0x3d,0xd6,0xe1,0x43,0xd1,0xa,0x2,0xf8,
+ 0x4a,0x14,0xd8,0xa,0x7c,0xd9,0x79,0x28,0xc1,0xa0,0xb6,0xdc,0x16,0x42,0x20,0xcd,
+ 0x72,0xdc,0x5c,0xbf,0x87,0xcf,0x6e,0xde,0x41,0x94,0x24,0xf,0xed,0x26,0x1e,0xa7,
+ 0x2a,0x71,0xff,0x8,0x8b,0xaa,0xcc,0xe,0xcf,0x75,0x27,0xba,0xe,0xa9,0x43,0x90,
+ 0x56,0x2a,0xd3,0xdd,0xe,0x3a,0xed,0x0,0x81,0xeb,0xa2,0x54,0x5d,0x87,0xd6,0x13,
+ 0x14,0x45,0x89,0x51,0x1c,0x63,0x6f,0x7f,0x80,0x9b,0xeb,0xf7,0x30,0x8a,0xe3,0x67,
+ 0x66,0x49,0x3e,0xb1,0x1c,0x67,0xd4,0x78,0x54,0x55,0xd5,0x61,0xe2,0x3f,0x62,0xac,
+ 0x46,0xb8,0x22,0x18,0xf8,0xae,0x63,0x9e,0xdf,0xfb,0x81,0x83,0x4a,0xfa,0x2e,0xa3,
+ 0x66,0x9,0x1e,0xc5,0x9,0x92,0x24,0x45,0x9a,0xe7,0x28,0x8b,0x12,0x49,0x96,0x21,
+ 0x8c,0x62,0x24,0xc9,0x97,0xa7,0xdf,0x68,0x0,0xa4,0xa9,0xa6,0xbe,0xac,0x37,0x8d,
+ 0x65,0xa1,0x15,0xf8,0xa6,0xfb,0x68,0xfb,0x3e,0x7c,0x35,0xb6,0xd2,0xcb,0x72,0x4a,
+ 0x9,0x44,0x25,0x30,0x8a,0x13,0x7c,0xfa,0xf9,0x2d,0xdc,0xba,0xb7,0x81,0x3c,0x2f,
+ 0xbe,0x78,0x1e,0xf5,0x18,0x33,0xac,0xaa,0x12,0x13,0x22,0x42,0xcb,0x92,0xdd,0x85,
+ 0x65,0x31,0xc5,0xb2,0x92,0xd4,0x5c,0xdb,0xb6,0xe0,0x3a,0xe,0xda,0x81,0x8f,0x4e,
+ 0x2b,0x40,0xaf,0xd3,0x6,0xa1,0x4,0xb9,0xa,0x1a,0x92,0x8e,0xae,0x15,0x92,0x2c,
+ 0x47,0x7f,0x30,0xc4,0x9d,0x8d,0x2d,0xec,0xf6,0x7,0x8f,0x45,0x2f,0x7e,0x3a,0x9f,
+ 0x37,0xa9,0x1c,0xb7,0x2d,0x4b,0xed,0x28,0x6a,0xdd,0xdb,0x41,0x9f,0x2a,0xd3,0x6d,
+ 0x48,0xa,0x6f,0xe0,0xb9,0x70,0x1c,0x3e,0x76,0xc0,0xad,0xb3,0xaa,0xd4,0x62,0x5c,
+ 0x5b,0x8e,0x48,0x2b,0x97,0x58,0xd1,0x6e,0x33,0xe3,0x8c,0x1b,0xab,0xb4,0xbf,0x3a,
+ 0x50,0x9f,0xf9,0xc7,0xb4,0x39,0xe,0x9a,0x6a,0xea,0xd1,0xc0,0xa3,0x1d,0xf8,0xf0,
+ 0x3d,0x17,0x2d,0xdf,0x43,0xcb,0xf7,0xe0,0x2b,0x9d,0x7,0xb7,0x2d,0x93,0x32,0x27,
+ 0x84,0x40,0x3f,0x1c,0xe1,0x93,0xcf,0x6f,0xe1,0xf6,0xdd,0x8d,0x23,0x8d,0x27,0xc4,
+ 0x63,0x20,0x88,0xb4,0x32,0x91,0x6e,0xaf,0x84,0x10,0xa9,0x41,0xf1,0x3c,0x79,0xa8,
+ 0x69,0x86,0x90,0xc5,0xe0,0x72,0xa9,0x41,0x69,0xb7,0x7c,0x4c,0x77,0xbb,0x70,0x1c,
+ 0x19,0xa3,0x9a,0x65,0x72,0xe,0xaf,0x3d,0x96,0x46,0x71,0x8c,0xad,0x9d,0x3d,0xdc,
+ 0xdb,0xda,0xc6,0x20,0x8c,0x9e,0x89,0x25,0xb9,0x34,0x86,0xb4,0xc1,0x6d,0x3e,0x6,
+ 0xe,0xc5,0xa6,0x92,0xc0,0x7b,0xa0,0xe3,0x50,0xae,0xb8,0x7a,0xbf,0xe1,0x2a,0x4b,
+ 0xf5,0x31,0x70,0x40,0x8d,0xbc,0x24,0x6d,0x97,0x59,0x16,0x18,0x25,0x28,0x2b,0x81,
+ 0x28,0x4e,0xcc,0x12,0x3c,0x2b,0xa,0x14,0x45,0x81,0xc1,0x28,0x42,0x1c,0xa7,0xc8,
+ 0xb2,0xec,0x99,0x13,0x58,0x36,0x0,0xd2,0x54,0x53,0x47,0x2c,0xc7,0x91,0xaa,0xec,
+ 0xc0,0x93,0x16,0xec,0xed,0x56,0x20,0x95,0xe5,0x35,0x17,0x55,0x2,0x20,0x2f,0xb,
+ 0xec,0xf7,0x87,0xf8,0xed,0xfb,0x1f,0x63,0x10,0x8e,0x1e,0xa9,0x9b,0x78,0xf4,0x92,
+ 0x9a,0x12,0x69,0xad,0x2e,0xd,0xf9,0x98,0x3a,0x8,0x2d,0x35,0xe3,0x77,0x1d,0xb9,
+ 0x9f,0xe9,0x75,0xdb,0x68,0x7,0x1,0x28,0x21,0x26,0x37,0x42,0x8f,0x6e,0xe2,0x24,
+ 0x41,0x7f,0x18,0xe2,0xd6,0xdd,0xd,0xec,0xf5,0x87,0xcf,0xc4,0x92,0x5c,0xef,0x38,
+ 0x38,0xe7,0x26,0x3a,0x56,0x7b,0x76,0x49,0x7b,0x75,0xf9,0xa0,0x93,0xda,0xb2,0x5b,
+ 0x33,0xd2,0xe4,0xf3,0x3a,0xce,0x7b,0xa7,0x13,0x96,0x23,0x1a,0x98,0x2d,0x10,0x25,
+ 0xae,0x1c,0x45,0xa9,0xda,0x67,0xa4,0xc6,0xe8,0x30,0x49,0x52,0x84,0x51,0xfc,0xcc,
+ 0xd1,0x9c,0x1b,0x0,0x69,0xaa,0xa9,0x47,0x39,0xa2,0x9,0x91,0x96,0x1e,0x2d,0x1f,
+ 0xbe,0xeb,0xa2,0xdd,0xf2,0x11,0x78,0x72,0x61,0xee,0x3a,0x92,0xf6,0x69,0x29,0xa6,
+ 0x55,0x96,0x15,0xb8,0x7d,0x6f,0x3,0x9f,0x7e,0x7e,0xb,0x83,0x27,0x90,0x7b,0xa1,
+ 0x23,0x4d,0x5d,0xc7,0x95,0x4b,0xdb,0x9a,0x9a,0x5c,0xdf,0xa0,0x3b,0xad,0x0,0xdd,
+ 0x76,0xb,0xae,0xcb,0x21,0x4,0x8c,0xf5,0x37,0x20,0x7d,0x96,0x86,0xa3,0x8,0xeb,
+ 0x9b,0xdb,0xd8,0xde,0xd9,0x43,0x94,0x9c,0x7d,0xd7,0x5c,0x1d,0xe4,0xc4,0x6d,0x7b,
+ 0x62,0x54,0x75,0x50,0xfc,0x47,0x28,0xc0,0xa8,0x65,0x80,0xc3,0x73,0x1c,0x95,0xd1,
+ 0x22,0x63,0x67,0xf5,0xee,0x68,0x3c,0xae,0x1a,0xb,0x5,0x9,0x91,0xdd,0x5b,0x94,
+ 0xc8,0x8e,0x23,0xcb,0xa4,0x7a,0x3c,0x4e,0x12,0x8c,0x22,0x39,0xba,0x3a,0xc9,0xe0,
+ 0xa6,0x6,0x40,0x9a,0x6a,0xea,0x8c,0x82,0x87,0xe7,0xb9,0x68,0x7,0x3e,0x2,0x35,
+ 0xb6,0x92,0x1e,0x57,0x8e,0x1,0xf,0x4a,0xe5,0x22,0x36,0xcd,0x32,0x7c,0x72,0xe3,
+ 0x36,0x3e,0xbb,0x75,0x7,0xe9,0x23,0xee,0xd,0xe,0x89,0x2,0xf9,0xe2,0xd1,0x8c,
+ 0x1a,0x59,0x9,0x21,0x60,0xd1,0xf1,0xf8,0xc5,0x73,0x38,0xb8,0x2d,0xd5,0xe4,0xdd,
+ 0x76,0x80,0x56,0xe0,0x1b,0x35,0xb9,0xb6,0x1a,0xa9,0x84,0x40,0x92,0xa6,0xd8,0xd9,
+ 0xeb,0x63,0x7d,0x73,0xb,0xfb,0xcf,0x80,0x6b,0xae,0x4c,0x4e,0x54,0xb,0x6e,0xc6,
+ 0xd4,0x5e,0x63,0xec,0x55,0x55,0xd7,0x70,0x18,0xbf,0x2f,0x9d,0xa8,0xe8,0x7b,0x70,
+ 0xb8,0x23,0x9d,0x2,0xea,0xc0,0x1,0x2,0xc6,0x8,0x2c,0x66,0xc9,0x50,0x2d,0x42,
+ 0x90,0xa9,0x25,0xb8,0x6,0x8e,0x3c,0x2f,0x30,0x8a,0x13,0x84,0x51,0x84,0x24,0xcd,
+ 0x9e,0x29,0x8a,0x73,0x3,0x20,0x4d,0x35,0x75,0xc,0xf0,0x8,0x7c,0x4f,0x82,0x47,
+ 0xed,0x63,0xe0,0xba,0xe0,0x66,0x2e,0x2e,0xf7,0x1d,0x7b,0x83,0x10,0x9f,0xde,0xb8,
+ 0x85,0x3b,0xf7,0x36,0x8f,0xb1,0x20,0x3d,0x3a,0x84,0x38,0xca,0x98,0x4f,0xa6,0xd6,
+ 0x11,0x45,0xcd,0xb5,0xc1,0x6d,0xe9,0xc3,0xd5,0xf2,0x7d,0x74,0xda,0x2d,0xb8,0xe,
+ 0x57,0x4c,0xb0,0xcc,0x84,0x3d,0x65,0x59,0x8e,0x61,0x14,0xe3,0xce,0xbd,0xd,0x6c,
+ 0xef,0xee,0x3f,0x32,0xd8,0x3d,0xfd,0x1d,0x7,0x1,0xaa,0x5a,0xa,0xa0,0x2,0xe,
+ 0xbd,0xf0,0x96,0x19,0xee,0xd2,0xeb,0xcb,0x75,0x65,0x46,0x8b,0x76,0xc0,0xd5,0x9e,
+ 0x54,0x32,0xc4,0x89,0xc2,0xb6,0x2d,0x30,0xca,0x20,0x20,0x90,0xa4,0x19,0x46,0xb5,
+ 0xe5,0x78,0x9a,0xa4,0x18,0x25,0x29,0x92,0x24,0x41,0x92,0xe5,0x5f,0x29,0xe0,0x68,
+ 0x0,0xa4,0xa9,0xa6,0xbe,0xe0,0x36,0xeb,0xfb,0x52,0x20,0x18,0x78,0x2e,0x3a,0xed,
+ 0x16,0x2,0x6f,0x6c,0x90,0xa8,0x33,0x20,0x2a,0x51,0x61,0x38,0x1c,0xe1,0xdd,0xf,
+ 0x3e,0xc6,0x6e,0x7f,0x70,0x8c,0x43,0xe4,0x68,0x2d,0x8,0x21,0x4,0xae,0xe3,0xc0,
+ 0xf3,0x5c,0xc3,0xb0,0x92,0x4c,0x21,0xc9,0xb0,0xf2,0x5d,0x17,0xbd,0x6e,0x1b,0x2d,
+ 0xdf,0x83,0xc5,0x18,0x8a,0xb2,0x54,0x1a,0x3,0x39,0xc6,0x49,0xb3,0x1c,0xeb,0x5b,
+ 0x5b,0xd8,0xdc,0xda,0x45,0xff,0x8c,0xbb,0xe6,0x6a,0xe5,0x38,0xd7,0x5d,0x20,0xf4,
+ 0x7e,0xa3,0x9a,0x60,0x55,0xb1,0x5a,0x86,0x38,0xb7,0x6d,0xf8,0x9e,0x87,0x96,0xef,
+ 0xca,0xd1,0xa3,0x2,0x60,0xd,0x1a,0x3a,0x3a,0x96,0xdb,0x92,0x8a,0x2d,0x9d,0x3,
+ 0x32,0xc,0xc2,0x10,0x49,0x96,0x21,0x4d,0x33,0x24,0x69,0x8e,0x30,0x8a,0x30,0x8a,
+ 0x22,0x69,0xa3,0xff,0x8c,0x8f,0xa9,0x1a,0x0,0x69,0xaa,0xa9,0x47,0xbc,0xd1,0xb6,
+ 0x5b,0x1,0x5a,0xaa,0xeb,0xd0,0x1f,0x5d,0x57,0xdb,0x71,0xcb,0xc5,0x6a,0x59,0x56,
+ 0xb8,0xb9,0x7e,0xf,0x1f,0x5f,0xbf,0xf1,0x68,0xcb,0xf2,0xc7,0x2c,0xae,0xf2,0xc9,
+ 0x39,0xe7,0xa0,0xea,0x86,0xcc,0xed,0xb1,0x36,0xa1,0xd3,0xe,0xd0,0xe,0x7c,0x38,
+ 0x8e,0x63,0x44,0x80,0x65,0x25,0xf,0xd3,0x34,0x97,0x82,0xc0,0xbb,0x9b,0xdb,0xd8,
+ 0xde,0xdd,0x3f,0xd3,0x8b,0x5d,0xa3,0x1c,0x57,0x79,0x2a,0x93,0xca,0x71,0x31,0x71,
+ 0x9,0xb0,0x2c,0xc9,0xa8,0x72,0x6c,0x1b,0x41,0x30,0xe,0xf6,0x62,0x35,0x2a,0xae,
+ 0x84,0xd,0x2,0xca,0x8,0x6c,0xcb,0x86,0x6d,0x5b,0x28,0x8b,0x12,0xfd,0x30,0x44,
+ 0x38,0x8a,0x8d,0xa5,0x7a,0x9a,0xa6,0x66,0x74,0xf5,0xac,0x86,0x64,0x35,0x0,0xd2,
+ 0x54,0x53,0xc7,0x28,0xdb,0xb6,0xcd,0xb8,0xaa,0xe5,0x7b,0xe8,0xb5,0x5b,0x2a,0x14,
+ 0x4a,0x26,0xf5,0xc9,0x39,0xb8,0xf4,0x85,0xba,0x71,0xe7,0x1e,0xfe,0x70,0xfd,0xe6,
+ 0x43,0xc5,0x81,0x8f,0x36,0xc0,0x12,0xf,0xec,0x86,0x6c,0xdb,0x86,0xef,0x7b,0x60,
+ 0x84,0xc0,0xa2,0x72,0xf7,0xc1,0x6d,0xb9,0xf8,0x35,0x9d,0x92,0xee,0x3a,0x8a,0x2,
+ 0x45,0x59,0xaa,0x90,0xaa,0xa,0x71,0x92,0xe2,0xee,0xe6,0x16,0x36,0xb6,0x77,0x11,
+ 0x46,0xf1,0x99,0xbd,0x31,0xd7,0x47,0x55,0x94,0x4e,0x9a,0x1c,0x12,0xf9,0xb,0x93,
+ 0x23,0x3e,0x76,0xc5,0xe5,0x8,0x7c,0xe9,0x53,0x56,0xb7,0x54,0xaf,0x77,0x74,0x96,
+ 0xb2,0x25,0x21,0x94,0xa2,0x2a,0x2b,0xc,0x86,0x21,0xc2,0x28,0x46,0x14,0xc7,0x48,
+ 0xd2,0xc,0x51,0x9c,0x60,0x38,0x8a,0x9e,0x29,0xfd,0x46,0x3,0x20,0x4d,0x35,0x75,
+ 0xd2,0x37,0x7c,0x6e,0xa3,0xd3,0x6a,0x49,0x7d,0x47,0xe0,0x4b,0x10,0x9,0x3c,0x15,
+ 0x0,0x65,0x2b,0x4f,0x2b,0x82,0x70,0x14,0xe1,0x93,0xcf,0x6f,0xe1,0xfa,0xad,0x3b,
+ 0x27,0x7b,0xa0,0x88,0xc3,0xf,0x4d,0xdf,0xf3,0xd4,0xe1,0x27,0xf,0x46,0x1d,0x2f,
+ 0xeb,0x3a,0xb2,0xeb,0x8,0x3c,0x69,0x1f,0x2f,0x20,0x19,0x56,0x95,0x3a,0x54,0xf3,
+ 0xa2,0xc4,0xf6,0xee,0x1e,0xd6,0x37,0xb6,0xb0,0xbb,0x3f,0x38,0x13,0xe6,0x7c,0xf,
+ 0x1a,0x55,0x71,0xb5,0x1c,0x67,0x8c,0x61,0xbc,0x18,0x97,0xf1,0xb1,0x72,0xc9,0xa1,
+ 0x92,0xff,0x2c,0xad,0xe1,0x70,0x24,0xdd,0xda,0xf7,0x26,0x9c,0x71,0x15,0xce,0x48,
+ 0x17,0x62,0xcb,0x82,0xcb,0xe5,0xf8,0x2b,0xcb,0x72,0xc,0x6,0x3,0xc4,0xa9,0x74,
+ 0xc1,0x4d,0xd3,0xc,0x61,0x14,0x21,0x1c,0xc5,0x48,0xf3,0xec,0x99,0xb3,0xaa,0x6f,
+ 0x0,0xa4,0xa9,0xa6,0x4e,0xa8,0x8,0x91,0x33,0xef,0x5e,0xa7,0x5,0xdf,0x73,0xd1,
+ 0x6d,0xb5,0xd0,0x6e,0xf9,0xf0,0x54,0x6e,0xb9,0xcd,0x2c,0x50,0x26,0x6f,0xa7,0xc3,
+ 0x51,0x88,0x77,0x3f,0xf8,0x3,0xb6,0x76,0xf7,0x4f,0x14,0x3c,0x1e,0x64,0xc4,0xab,
+ 0xb3,0xb3,0x2d,0xc6,0x60,0x2b,0x3b,0xd,0xd9,0x75,0xb8,0x68,0xf9,0x3e,0x5a,0xbe,
+ 0xf,0x4a,0x9,0x8a,0xb2,0x52,0xdf,0x8f,0x40,0x51,0x56,0x8,0xc3,0x10,0xf7,0xb6,
+ 0xf7,0xb0,0xb1,0xb5,0x73,0x62,0x1d,0xd2,0x13,0x3f,0x9c,0x2c,0x29,0xcc,0x94,0x9e,
+ 0x62,0xd4,0x78,0x55,0x8d,0x2d,0xd5,0x85,0x1a,0x3d,0x49,0x60,0xe5,0xb6,0x2d,0xa9,
+ 0xcb,0x9e,0x8b,0xc0,0xf3,0xc,0xe8,0x93,0x5a,0xec,0xac,0x7c,0xae,0xe5,0x12,0x9d,
+ 0x10,0x82,0x28,0x49,0x10,0x45,0x9,0x86,0x51,0x84,0x24,0x49,0xd5,0xbe,0x63,0xf4,
+ 0xd4,0x5,0x37,0x35,0x0,0xd2,0x54,0x53,0x4f,0x69,0xb9,0xae,0x83,0x4e,0x10,0xa0,
+ 0xd3,0xa,0xd0,0xa,0x64,0xf7,0x11,0x78,0x9e,0x4c,0x92,0xb3,0xe5,0xe1,0x25,0x44,
+ 0x85,0x8d,0xed,0x5d,0x7c,0x74,0xfd,0x73,0x6c,0xee,0xec,0x3d,0xb1,0xef,0x8d,0x52,
+ 0x22,0xb3,0x3a,0x94,0xf3,0xab,0xb6,0x22,0x69,0x7,0x3e,0x38,0xb7,0x1,0x0,0x79,
+ 0x9e,0x9b,0x64,0xc2,0xb2,0x94,0x9,0x87,0xb7,0xd6,0xef,0x61,0x6f,0x10,0x9e,0x49,
+ 0x66,0x10,0x63,0x14,0xb6,0xcd,0xf,0x0,0x87,0x80,0xa8,0xc6,0x63,0x3e,0x19,0xbd,
+ 0xcb,0xc,0xfb,0xcc,0x57,0xc6,0x90,0xbe,0x27,0xb3,0x4e,0x2c,0x46,0x15,0x37,0x5a,
+ 0xfa,0x84,0x49,0xf2,0x81,0x72,0xdc,0x5,0x90,0xe6,0x5,0x86,0xe1,0x8,0xc3,0x51,
+ 0x64,0x2c,0x46,0x86,0xe1,0x8,0xd1,0x53,0x1a,0xdc,0xd4,0x0,0x48,0x53,0x4d,0x3d,
+ 0x85,0x9d,0x47,0xe0,0x79,0x98,0xea,0x76,0xd0,0xe,0x7c,0x74,0x3b,0x92,0x69,0xe5,
+ 0x3a,0xf2,0xf0,0xb2,0x94,0x98,0x2c,0xcd,0x72,0x7c,0x7e,0x7b,0x1d,0x1f,0x7e,0xfa,
+ 0x39,0xe2,0x24,0x3d,0x9d,0xef,0x85,0x92,0x43,0xc7,0x24,0x94,0x52,0xe3,0xc3,0xd4,
+ 0xe,0x24,0x3d,0xd7,0x73,0x1d,0x50,0x2a,0xcd,0xfa,0x8a,0xb2,0x4,0x84,0xb4,0x21,
+ 0xe9,0xf,0x47,0x58,0xdf,0xdc,0xc2,0xdd,0xad,0xed,0xc9,0x9c,0x91,0x33,0x3,0x1c,
+ 0x3a,0x2,0x56,0x29,0xc7,0x35,0xd,0xb7,0x3a,0x90,0xfc,0xa7,0x72,0x4c,0x74,0x0,
+ 0x96,0xd6,0xe5,0xd8,0xb5,0x68,0x5e,0xe9,0xf,0x56,0x81,0x32,0xa,0x9f,0x4b,0x37,
+ 0xe2,0x4a,0x8,0xc,0x47,0x91,0xb4,0x1b,0x89,0x62,0xd5,0x7d,0xc4,0xf2,0xf7,0x92,
+ 0xf4,0x2b,0x49,0xc3,0x6d,0x0,0xa4,0xa9,0xa6,0x1e,0xeb,0x66,0x2f,0xdd,0x74,0x7b,
+ 0xdd,0x36,0xa6,0x3a,0x6d,0xb4,0x7d,0x1f,0xed,0x96,0x6f,0x7c,0x8f,0xe4,0xac,0x1d,
+ 0x88,0x93,0x4,0x7f,0xb8,0x71,0xb,0x9f,0x7c,0x76,0xf3,0x54,0xf5,0x12,0x94,0x50,
+ 0x54,0x28,0xf,0xed,0x40,0xea,0x1a,0x14,0x47,0x75,0x1d,0x72,0x49,0x5e,0xa1,0x12,
+ 0x42,0x26,0x4,0xee,0xec,0xe3,0xce,0xe6,0x26,0x6,0xc3,0xd1,0x99,0x1b,0xbb,0x98,
+ 0xe5,0xb8,0x62,0x55,0x99,0x51,0x95,0x9c,0x3b,0x19,0xb0,0xa7,0x8a,0x3c,0xe0,0xd8,
+ 0xb6,0xf1,0x22,0xf3,0x5c,0xe9,0x41,0xa6,0x69,0xbc,0x3a,0x1b,0x85,0x51,0xa,0x87,
+ 0x7b,0xe0,0xb6,0x85,0xbc,0x2c,0x31,0x8c,0x22,0xf4,0x87,0x23,0xc4,0x71,0x8c,0x28,
+ 0x4e,0x31,0x1c,0x8d,0x10,0x46,0x9,0xb2,0x2c,0x3b,0xb3,0xbb,0xa1,0x6,0x40,0x9a,
+ 0x6a,0xea,0x4b,0x2,0x8f,0xa9,0x4e,0x7,0x53,0xbd,0xe,0xa6,0xba,0x1d,0xf4,0x3a,
+ 0x6d,0xd3,0x79,0xe8,0x5b,0x6c,0x25,0x4,0xc2,0x51,0x84,0xdf,0xbc,0xf7,0x11,0xee,
+ 0x6c,0x6c,0x9e,0xea,0x8d,0x9e,0x73,0x1b,0x2e,0xe7,0x8,0xa3,0xf8,0xbe,0x3f,0xb3,
+ 0x2d,0xb,0xbd,0x6e,0xb,0x2d,0xdf,0x87,0xc5,0x18,0xca,0xaa,0x42,0x55,0xca,0x25,
+ 0x79,0x51,0x95,0x18,0x86,0x11,0x6e,0xdc,0xb9,0x8b,0xad,0x9d,0xbd,0x33,0xc7,0x10,
+ 0x32,0xca,0x71,0x25,0xd6,0x33,0x1d,0x87,0x98,0x4,0xe,0xc6,0x28,0x6c,0x5,0x32,
+ 0x1a,0x48,0xbd,0x9a,0xa5,0x3a,0x0,0x99,0x9,0x2f,0x84,0x4,0xe,0xf5,0x67,0xd2,
+ 0xd0,0x32,0xc4,0x30,0x94,0x5d,0x47,0x18,0x45,0x18,0x84,0x11,0xc2,0xe8,0xec,0x5,
+ 0x37,0x35,0x0,0xd2,0x54,0x53,0x4f,0x41,0xd9,0x96,0x85,0x4e,0xbb,0x85,0x85,0xd9,
+ 0x59,0x4c,0x4f,0x75,0x31,0xd5,0xed,0xa0,0xe5,0x7b,0x72,0x4,0xc2,0x18,0x8,0x91,
+ 0x87,0xd1,0x9d,0x8d,0x4d,0xbc,0xfb,0xfe,0xc7,0x58,0xdf,0xdc,0x3a,0xb5,0x83,0x46,
+ 0xe7,0x93,0xfb,0xae,0x87,0xaa,0x2a,0x71,0xd8,0xe0,0xdd,0xb6,0x2c,0xf8,0xae,0x7,
+ 0x46,0xa9,0x11,0xad,0x55,0x55,0x85,0x34,0xcd,0xb0,0xdb,0xef,0xe3,0xce,0xc6,0xd6,
+ 0x99,0x33,0x3f,0x64,0x4c,0xc6,0xe8,0x3a,0x8e,0x63,0xbc,0xaa,0x74,0x64,0xac,0x7e,
+ 0xc,0xea,0x39,0x1c,0xe,0xe7,0x26,0xac,0xcb,0xf7,0x5c,0x69,0x37,0xa2,0x32,0xc5,
+ 0xb5,0x93,0xb0,0x36,0x41,0x24,0x84,0x20,0xcd,0x32,0xec,0xee,0xf7,0x31,0x8a,0x12,
+ 0x8c,0xa2,0x8,0xc3,0x28,0x42,0x18,0x46,0x88,0x92,0xe4,0x2b,0x2f,0xfc,0x6b,0x0,
+ 0xa4,0xa9,0xa6,0x1e,0xf7,0xc5,0x6e,0x59,0x98,0x99,0x9e,0xc6,0xec,0x74,0xf,0x8b,
+ 0x73,0xb3,0x98,0xee,0x76,0xd1,0xa,0xc6,0x63,0x2b,0x42,0x64,0xe4,0xe8,0xfa,0xfa,
+ 0x3a,0xde,0xfe,0xed,0xef,0xb1,0xb3,0xdf,0x3f,0xb5,0xc3,0xc6,0xb6,0x2c,0x78,0x6a,
+ 0x51,0x6f,0x5b,0xc,0x79,0xfe,0x80,0x8c,0x42,0xe5,0xe3,0x54,0xaa,0xae,0xa3,0x2c,
+ 0x4b,0xc,0x47,0x23,0xdc,0xdd,0xdc,0xc1,0xd6,0xce,0x2e,0xe2,0x34,0x3d,0x33,0x14,
+ 0x53,0xa2,0x42,0xae,0x1c,0x87,0x83,0x91,0xf1,0x92,0x5b,0xd3,0x72,0x89,0x8e,0x8c,
+ 0x65,0x32,0x32,0xd6,0x75,0xa5,0x40,0xb2,0x1d,0x4,0xa,0x38,0xa4,0xf1,0xa1,0x10,
+ 0x92,0x69,0x26,0x44,0x25,0x1f,0x47,0x15,0x9a,0x95,0x66,0x39,0x86,0xe1,0x8,0x61,
+ 0x14,0x23,0x1c,0xc5,0x18,0x45,0x11,0xfa,0xc3,0x10,0x51,0x92,0x34,0xc2,0xbf,0x6,
+ 0x40,0x9a,0x6a,0xea,0xf1,0xcb,0x75,0x1c,0xcc,0xcf,0x4c,0x63,0x79,0x71,0x11,0xf3,
+ 0xb3,0xd3,0x98,0x9b,0x9e,0x42,0xe0,0xcb,0x5c,0xf,0xa6,0xc6,0x20,0xc3,0x30,0xc4,
+ 0xbb,0x1f,0x7c,0x8c,0x77,0xfe,0xf3,0xf7,0xa7,0xb6,0x2c,0xa7,0x94,0x4a,0x8d,0x82,
+ 0x12,0xfd,0x31,0x46,0xe1,0x70,0xdb,0xe4,0x53,0x1c,0xac,0x3c,0x2f,0x94,0x73,0xae,
+ 0xdc,0x75,0x6c,0xed,0xee,0xe3,0xde,0xd6,0xb6,0x64,0xb,0x15,0xe5,0x99,0x0,0xf,
+ 0xaa,0x14,0xf3,0x5c,0x5,0x32,0x19,0x1a,0xae,0xce,0x31,0x81,0x64,0x5e,0x31,0x2d,
+ 0x98,0x74,0x1d,0x69,0x95,0xef,0x4a,0x1,0xa7,0x65,0xc9,0x7d,0x54,0x55,0x9,0x19,
+ 0xca,0x45,0x94,0x2a,0x9f,0x73,0x50,0x4a,0x15,0x83,0x2a,0xc2,0x70,0x34,0xc2,0x40,
+ 0x8d,0xab,0xf6,0x7,0x83,0x86,0x86,0xdb,0x0,0x48,0x53,0x4d,0x1d,0xbf,0x82,0xc0,
+ 0xc7,0xc2,0xcc,0x2c,0x96,0x17,0xe7,0xb1,0xba,0xb4,0x88,0x99,0x5e,0xf,0xdd,0x4e,
+ 0x5b,0xe6,0x96,0xdb,0x72,0x56,0x3e,0x8,0x43,0xbc,0xf1,0xce,0x6f,0xf0,0xfe,0x1f,
+ 0x3e,0x3d,0x35,0xf0,0xb0,0x2c,0x6b,0x22,0x67,0xc2,0xb6,0xa5,0xc5,0x86,0xe7,0x3a,
+ 0xf,0x4c,0x2b,0x2c,0xca,0x12,0x59,0x51,0x20,0x1b,0x65,0xd8,0xd8,0xde,0xc5,0xde,
+ 0x60,0x80,0x2c,0x2f,0xc6,0xc,0xac,0xa7,0x1c,0x38,0xb4,0x72,0xdc,0xb2,0x98,0x9,
+ 0xda,0x9a,0xf4,0xa9,0xa2,0x92,0x7d,0xa5,0x54,0xf5,0xad,0x20,0x40,0x3b,0xf0,0xc0,
+ 0xf9,0xb8,0x2b,0x2c,0xcb,0xa,0x65,0x59,0x4a,0x67,0x64,0xd7,0x81,0x65,0x59,0x0,
+ 0x4,0xa2,0x24,0x41,0x38,0x8a,0x30,0x8a,0x62,0xc,0xc2,0x8,0xfb,0xc3,0x21,0x46,
+ 0xa3,0x18,0x59,0x51,0x34,0x8c,0xaa,0x6,0x40,0x9a,0x6a,0xea,0xf8,0x23,0x13,0xdf,
+ 0xf3,0x70,0x6e,0x79,0x19,0x6b,0xcb,0x4b,0x58,0x5d,0x5a,0xc4,0xec,0xf4,0x34,0xba,
+ 0xca,0x18,0x51,0xe7,0x56,0xdf,0x5a,0xbf,0x87,0x1f,0xfc,0xf8,0xa7,0x78,0xef,0xa3,
+ 0x8f,0x4f,0xc5,0x5c,0x50,0xe7,0x89,0x68,0x55,0xb4,0x65,0x31,0x70,0x35,0xb3,0xf7,
+ 0x5c,0x69,0x8c,0x38,0xc,0x23,0x1c,0x26,0x45,0x4f,0xb3,0x1c,0xb7,0xd6,0x37,0x10,
+ 0xab,0xa4,0xbb,0xb2,0x2a,0x91,0xa6,0x4f,0xb7,0xa5,0x46,0x1d,0x38,0x6c,0x5b,0x1e,
+ 0x31,0x52,0xc7,0x51,0xd5,0x3e,0x87,0x28,0xe0,0xb0,0xe1,0xb9,0xdc,0x38,0x0,0x78,
+ 0x2a,0x8b,0x3,0x90,0xb9,0xec,0x45,0x59,0x82,0x51,0x2a,0x13,0x1f,0xb9,0x8d,0xaa,
+ 0xac,0x30,0x8a,0x13,0xc,0xc2,0x10,0xc3,0x51,0x84,0x30,0x8a,0xb1,0xdf,0x1f,0x60,
+ 0x14,0x25,0xcf,0x74,0x70,0x53,0x3,0x20,0x4d,0x35,0xf5,0x84,0xf,0xb1,0x6e,0xbb,
+ 0x8d,0x95,0xc5,0x5,0x5c,0xbd,0x78,0x11,0x2b,0x4b,0x8b,0x58,0x98,0x9b,0x45,0xb7,
+ 0xd5,0x82,0xab,0x58,0x3a,0x59,0x96,0xe1,0xfd,0x3f,0x7c,0x82,0x7f,0xfa,0xc1,0xeb,
+ 0xb8,0xb5,0x7e,0xf7,0x54,0xc0,0x83,0x31,0x6,0xdf,0xf7,0xe0,0x39,0x32,0x6b,0x42,
+ 0x2b,0xcb,0x75,0x92,0xa1,0x8e,0x4c,0x25,0xf4,0x70,0x37,0xde,0x34,0xcb,0xf0,0xf9,
+ 0xad,0x3b,0xf2,0x10,0x56,0x7,0xf1,0x53,0xf,0x1c,0x5c,0xa,0xf9,0xc6,0x29,0x80,
+ 0x63,0x46,0x15,0x21,0x80,0xc5,0x2c,0x70,0x2e,0xa3,0x77,0x3b,0x2a,0xd5,0xd1,0x73,
+ 0x1d,0x30,0x2a,0x49,0xc,0x59,0x51,0xa0,0x2c,0x4a,0x30,0x46,0xd1,0xf2,0x3d,0xd8,
+ 0xb6,0x85,0xa2,0x28,0x31,0xc,0x47,0xd8,0xeb,0xf,0x11,0x8e,0x22,0xec,0xf,0x43,
+ 0x84,0x4a,0x4,0xd8,0x0,0x47,0x3,0x20,0x4d,0x35,0x75,0xa2,0x7,0x59,0xaf,0xd3,
+ 0xc1,0xc5,0x73,0x6b,0xb8,0xb8,0xb6,0x86,0x4b,0xe7,0xcf,0x61,0x6e,0x7a,0xa,0x53,
+ 0xbd,0xae,0xea,0x3c,0x2c,0xe4,0x79,0x8e,0xb7,0x7f,0xf7,0x2e,0x5e,0xfd,0x9f,0xff,
+ 0x8a,0xad,0x9d,0x9d,0x53,0x39,0x98,0x1d,0xce,0xe1,0xab,0xd4,0x42,0x8b,0xca,0x91,
+ 0x95,0xef,0x79,0x70,0xb9,0xb4,0x14,0x97,0xca,0x68,0x69,0xe2,0x67,0x12,0x56,0xf,
+ 0xa9,0xa7,0xdd,0x72,0x5d,0xba,0xde,0x4a,0x56,0xd5,0x7d,0xc0,0xa1,0x96,0xe3,0x8c,
+ 0x52,0x50,0x2a,0xed,0x58,0x2,0xa5,0xa4,0x6f,0xd7,0x8,0xc,0x72,0x24,0x57,0xa0,
+ 0x28,0x2b,0x50,0x42,0xe4,0xd2,0xdc,0xb6,0x51,0x96,0x25,0xf6,0xf6,0x7,0x18,0x29,
+ 0x43,0xc3,0xdd,0xfd,0x3e,0x6,0xc3,0xf0,0x4c,0x91,0x7,0x1a,0x0,0x69,0xaa,0xa9,
+ 0xb3,0xf2,0x82,0xb6,0x2c,0xcc,0x4d,0x4f,0xe3,0xca,0xc5,0xb,0x78,0xee,0xf2,0x25,
+ 0x9c,0x5b,0x5e,0xc6,0xf2,0xc2,0x2,0x3a,0xed,0x96,0x62,0xeb,0x50,0xec,0xf5,0xfb,
+ 0xf8,0xfb,0xef,0xfe,0xb,0xfe,0xe3,0x8d,0x37,0x11,0x8e,0x4e,0xde,0x86,0x5d,0x1b,
+ 0x20,0xfa,0x6a,0x5e,0xcf,0x6d,0x6,0xcf,0x71,0xe0,0x38,0x5c,0x1,0x8,0x87,0xe3,
+ 0x48,0x83,0x3f,0x1c,0xb8,0xa5,0x9f,0x35,0xa0,0xe6,0xdc,0x86,0xc3,0x1d,0x63,0x72,
+ 0xa8,0xe6,0x55,0x0,0x84,0x54,0x8d,0x2b,0xe0,0x74,0x38,0x47,0xe0,0x49,0x9b,0x18,
+ 0x69,0x50,0xe9,0x80,0x31,0x8a,0xb2,0xac,0x4c,0x8a,0x1f,0xb7,0x6d,0x74,0xdb,0x1e,
+ 0x8,0x24,0xa3,0x6a,0x67,0x6f,0x1f,0x83,0x30,0x44,0x7f,0x38,0xc2,0x70,0x38,0x42,
+ 0x3f,0xc,0xcf,0x7c,0xf8,0xd5,0xb3,0x54,0x84,0x90,0x6,0x40,0x9a,0x3a,0x99,0xf2,
+ 0x3d,0xf,0x95,0xa8,0x90,0x9c,0xd2,0x2,0xfa,0x28,0x65,0x5b,0x16,0x96,0x17,0x17,
+ 0x70,0xe5,0xc2,0x5,0x5c,0xbb,0x74,0x9,0x17,0xcf,0xad,0x61,0x7e,0x76,0x16,0x33,
+ 0x53,0x3d,0x9,0x1e,0x84,0xe0,0xfa,0xcd,0x9b,0xf8,0xd6,0xf7,0xbe,0x8f,0x7f,0xff,
+ 0xf9,0x1b,0xc8,0xf3,0x93,0x3f,0x8c,0xb8,0xd2,0x2c,0x70,0xe5,0xa3,0xe5,0xa8,0xa0,
+ 0x27,0x1d,0x44,0xe5,0xb9,0x52,0xc7,0x40,0x29,0x55,0x4c,0x24,0x20,0xcb,0x73,0x14,
+ 0xe5,0xd9,0x19,0xc3,0x50,0x4a,0x60,0xdb,0x5c,0x65,0xa3,0x58,0xa0,0x4,0x26,0x93,
+ 0x43,0x1e,0x2c,0x90,0x1a,0xe,0xe5,0x8a,0xdb,0xd2,0x49,0x8e,0xbe,0xec,0xbe,0x64,
+ 0xbc,0xae,0x7c,0xad,0x94,0x42,0xc8,0xae,0xc4,0x97,0x5a,0x97,0x2c,0xcf,0x31,0x8,
+ 0x47,0x18,0x86,0x11,0x76,0xfb,0x7d,0xec,0xf,0x42,0x8c,0xe2,0xb8,0x11,0xfe,0x3d,
+ 0x45,0xa0,0xa1,0x9d,0x3,0x6c,0xcb,0x6a,0x0,0xa4,0xa9,0x93,0x79,0x51,0xad,0x2c,
+ 0x2e,0x22,0xce,0x12,0xdc,0xbe,0x73,0xf7,0x4b,0xf9,0x1e,0x38,0xe7,0x58,0x5e,0x5c,
+ 0xc0,0x4b,0xd7,0xae,0xe1,0xb9,0xcb,0x97,0x71,0xe9,0xdc,0x39,0x2c,0x2d,0xcc,0xa3,
+ 0xd7,0x69,0xc3,0x73,0x5d,0x54,0x65,0x85,0xdf,0x7f,0xfc,0x31,0xfe,0xdb,0xd7,0x5f,
+ 0xc1,0x7b,0x1f,0xff,0xe1,0xc4,0xc1,0x83,0x52,0xa,0x4f,0x19,0xfa,0x49,0x6d,0x87,
+ 0x55,0x3,0xd,0x7,0x9e,0x23,0xf3,0x44,0x98,0xc5,0x8c,0xf3,0xae,0x66,0x7f,0x7d,
+ 0x7e,0xfb,0x2e,0xf6,0x7,0xe1,0x99,0x78,0x9e,0xa5,0x57,0x95,0xd,0xdb,0xb6,0x15,
+ 0x1d,0x57,0x18,0x52,0x15,0x51,0x96,0xea,0xb6,0xc5,0xc,0x55,0xb9,0xd7,0x69,0xcb,
+ 0x5,0xb8,0xca,0xf0,0x28,0x55,0x3e,0x49,0x25,0x4,0xb8,0x65,0x21,0x70,0x1d,0x10,
+ 0x0,0xa3,0x38,0x41,0x14,0xc7,0x6a,0x4c,0x35,0xc0,0xfe,0x60,0x88,0x30,0x8a,0x1a,
+ 0xfd,0xc6,0x53,0xd2,0x69,0x6a,0xd0,0xb0,0x2c,0xa6,0x22,0x7e,0x9b,0x11,0x56,0x53,
+ 0x27,0x36,0x36,0x62,0x68,0xb5,0x3c,0xb0,0x98,0x1a,0x93,0xbf,0x27,0xda,0xfd,0xf8,
+ 0x3e,0x2e,0xac,0xae,0xe0,0xf9,0x2b,0x57,0xf0,0xd2,0xb5,0x6b,0xb8,0xb0,0xb6,0x86,
+ 0xa5,0xf9,0x39,0xf4,0xba,0x5d,0xb8,0x8e,0x83,0x38,0x49,0xf0,0x93,0x5f,0xbe,0x8d,
+ 0xaf,0xbd,0xf2,0x8a,0x5c,0x96,0x9f,0xf0,0xf7,0xc7,0xb9,0x8d,0xc0,0xf3,0xcd,0x4e,
+ 0xc3,0xe1,0x92,0x9a,0xab,0x17,0xe4,0xe,0xe7,0xc6,0x76,0x43,0x3b,0xcb,0xa6,0x69,
+ 0x8e,0x7b,0xdb,0xdb,0xb8,0x75,0x77,0x3,0x7b,0xfd,0xa1,0xf1,0xb8,0x7a,0x5a,0xf,
+ 0x10,0xdb,0xb6,0xe1,0x28,0x1d,0x7,0xc1,0x78,0xec,0x46,0x20,0x8d,0x20,0x75,0x7e,
+ 0xb8,0xa7,0x3a,0x8e,0x76,0x2b,0x30,0x8e,0xc6,0x20,0x40,0x9e,0x15,0x48,0x33,0xe9,
+ 0x72,0xeb,0xaa,0xaf,0x23,0x0,0x8c,0xa2,0x18,0xc3,0xd1,0x8,0xfb,0xfd,0x21,0xf6,
+ 0xfa,0x43,0xc,0xa3,0x8,0x71,0x23,0xfc,0xfb,0xd2,0x6b,0xc,0x18,0xd2,0x17,0x8e,
+ 0x52,0x6a,0xf4,0x3b,0x65,0x59,0x2a,0x42,0x47,0xd5,0x0,0x48,0x53,0x27,0x31,0x3a,
+ 0xb2,0xc1,0x2d,0x1b,0x25,0x17,0x26,0x7b,0xe1,0x49,0x8e,0xce,0x2e,0xac,0xad,0xe2,
+ 0x4f,0x5e,0x78,0x1,0xcf,0x5f,0xb9,0x82,0x2b,0x17,0x2e,0x60,0x51,0x81,0x87,0x63,
+ 0x73,0x14,0x45,0x81,0x7f,0xfc,0xfe,0xbf,0xe2,0xef,0xfe,0xe9,0x9f,0xb0,0xbe,0xb1,
+ 0x71,0xe2,0x37,0x72,0xd7,0x95,0xa6,0x7e,0xd2,0xfa,0xfd,0xc0,0xb8,0x4a,0x75,0x1d,
+ 0x96,0x65,0x81,0x52,0x62,0x54,0xe5,0xfb,0xc3,0x10,0x9f,0xdd,0xbc,0x83,0x7b,0x5b,
+ 0x3b,0x86,0x41,0xf4,0x34,0x4e,0x67,0x8,0x21,0xb0,0x6d,0x5b,0xea,0x56,0x94,0x8e,
+ 0x3,0x66,0x54,0x25,0x94,0xdd,0x88,0x8c,0x8d,0x75,0x1d,0x47,0xe5,0xa8,0x4,0x8,
+ 0x7c,0xd9,0x85,0x11,0x10,0x64,0x79,0x8e,0x24,0xcb,0x40,0x9,0x95,0xba,0x1b,0x6e,
+ 0x43,0x88,0xa,0x51,0x9c,0x22,0x8c,0x22,0xec,0xed,0xf,0xb0,0xb3,0xdf,0xc7,0xde,
+ 0x60,0x88,0x3c,0xcb,0xcf,0x74,0x46,0xfb,0x59,0x9f,0x22,0xc8,0x9d,0x96,0xa,0x4f,
+ 0xb3,0x2c,0x10,0xfd,0x4c,0x8b,0xa,0x55,0x55,0x2a,0x2a,0xb6,0xc,0xf2,0xd2,0xcf,
+ 0x53,0x3,0x20,0x4d,0x9d,0xc8,0xd,0xdc,0xe6,0x36,0xca,0xaa,0x2,0xa5,0x54,0x29,
+ 0xa7,0x4f,0xff,0x5,0xdf,0xeb,0x74,0x70,0xf5,0xd2,0x25,0xfc,0xd1,0xf3,0xcf,0xe1,
+ 0xe5,0xe7,0x9f,0xc7,0xda,0xf2,0x12,0x56,0x16,0x97,0xd0,0xe,0x2,0x70,0x6e,0xe3,
+ 0xd6,0xfa,0x3a,0xbe,0xf6,0xca,0x37,0xf0,0x8f,0xaf,0xbd,0x86,0xe2,0x84,0xa9,0x9e,
+ 0xb6,0x6d,0x49,0x25,0xbb,0xeb,0xa8,0x9b,0x37,0x87,0xeb,0xb8,0xaa,0xf3,0xe0,0xe0,
+ 0x36,0x37,0x2e,0xb1,0x44,0x8d,0xab,0xa2,0x24,0xc5,0xe7,0xb7,0xee,0xe0,0xce,0xc6,
+ 0x16,0xa2,0xf8,0x60,0xc8,0xd3,0xd3,0x73,0x70,0xea,0x8e,0xc3,0x75,0xa5,0xe0,0xd1,
+ 0x20,0x9c,0x2,0xf,0x39,0x7,0xb7,0x94,0x4f,0x97,0x83,0x4e,0xbb,0xa5,0x22,0x80,
+ 0x7d,0x70,0x5b,0xda,0xa6,0xa7,0x59,0x86,0x3c,0x2f,0x8c,0x65,0xbe,0xc5,0x18,0xb2,
+ 0xa2,0x40,0x7f,0x38,0xc4,0xee,0xfe,0x40,0x8e,0xaa,0xf6,0xfa,0xe8,0x87,0xe1,0x99,
+ 0xb4,0x9e,0x7f,0x56,0x46,0x53,0x96,0x65,0x99,0x4e,0x83,0xdb,0x36,0x40,0x8,0xaa,
+ 0xaa,0x82,0xa8,0x2a,0x63,0x50,0x59,0x19,0xd,0x8f,0x30,0x8e,0x9,0x42,0x2d,0xf0,
+ 0x1a,0x0,0x69,0xea,0x4,0xda,0x5d,0xa,0x46,0xa4,0x29,0x9e,0x6d,0x59,0xa7,0xb2,
+ 0x9c,0x3e,0xf8,0xc2,0xef,0x75,0x3b,0x78,0xfe,0xf2,0x15,0xfc,0xc9,0x4b,0x2f,0xe2,
+ 0x85,0x2b,0x57,0x70,0xf1,0xdc,0x39,0xcc,0xcf,0xce,0xa2,0xd7,0xe9,0x80,0x10,0xe0,
+ 0x83,0x4f,0x3e,0xc5,0xff,0xfd,0x17,0x7f,0x81,0x5f,0xbc,0xf3,0xab,0x13,0x5,0xf,
+ 0xdd,0x75,0x4,0xbe,0x7,0xc7,0xb6,0xe1,0x3a,0xd2,0x52,0x43,0x6b,0x19,0xf4,0x2d,
+ 0xdb,0xd2,0x6d,0x3f,0xa4,0x1d,0xc9,0xee,0x7e,0x1f,0x37,0xee,0xdc,0xc5,0xbd,0xad,
+ 0x9d,0x43,0xed,0xc3,0x9f,0x86,0x5,0xb1,0x16,0x3c,0x72,0xce,0xf,0x74,0x1c,0x32,
+ 0xc0,0xc9,0x2c,0x50,0x2d,0xcb,0x2c,0xc5,0xbb,0xed,0x40,0x46,0xee,0xda,0x16,0xa0,
+ 0xd8,0x53,0x59,0x9e,0x3,0x44,0x8d,0xaa,0x2c,0x4b,0x52,0x71,0xfb,0x3,0xf4,0x87,
+ 0x21,0x76,0xfb,0x3,0xec,0xec,0xf5,0x11,0xa7,0x29,0x8a,0xa2,0x9,0x6e,0xfa,0x32,
+ 0x41,0xc3,0xb6,0xc7,0x4c,0x40,0x42,0x20,0x81,0x43,0x48,0xe0,0x80,0x80,0x1a,0xf5,
+ 0xd6,0x40,0xa3,0x1a,0xfb,0x96,0x49,0xda,0x79,0x3,0x20,0x4d,0x9d,0x40,0x59,0x94,
+ 0x81,0x28,0x56,0x11,0xe7,0x36,0xa2,0x38,0x3e,0xd5,0x37,0xc0,0xfc,0xec,0xc,0x9e,
+ 0xbb,0x7c,0x5,0xff,0xe5,0x8f,0x5e,0x96,0xb,0xf3,0xf3,0xe7,0x31,0x3f,0x33,0x83,
+ 0x76,0x10,0x0,0x84,0xe0,0x27,0x6f,0xbe,0x89,0xff,0xf3,0x6b,0x7f,0x8e,0xf7,0x3f,
+ 0xfe,0xf8,0x44,0xf7,0x1d,0x8c,0x31,0x73,0x70,0x4a,0x2f,0x26,0x19,0x68,0xe4,0x79,
+ 0xe,0x5c,0xc7,0x31,0xbb,0xe,0x1d,0xa3,0x2a,0x84,0x40,0x14,0x27,0xb8,0x7e,0xf3,
+ 0x36,0x6e,0xae,0x6f,0x20,0xcd,0xb2,0xa7,0x76,0x7c,0xa1,0x83,0x9c,0xb8,0x6d,0x9b,
+ 0x11,0x95,0x36,0x38,0xa4,0x84,0x9a,0xe4,0x3f,0x9,0x1a,0x52,0x35,0xee,0xfb,0xae,
+ 0xb4,0x98,0x2f,0x2b,0xa4,0x69,0x8e,0xac,0xc8,0x61,0x31,0x6,0xdf,0x73,0x41,0x8,
+ 0x41,0x51,0x14,0xe8,0xf,0x86,0xd8,0x1b,0x86,0xd8,0xde,0xdd,0xc3,0xde,0xfe,0x0,
+ 0x71,0x92,0x36,0xf9,0x1b,0x4f,0xf2,0xb9,0x5,0x40,0x19,0x9b,0xe8,0x34,0x2c,0xc6,
+ 0x0,0x2,0x35,0x8e,0x92,0xdd,0x85,0xc0,0x58,0xb7,0x53,0x19,0xa0,0xd0,0x11,0xc2,
+ 0x98,0x20,0x4b,0xa0,0x46,0x9a,0x68,0x0,0xa4,0xa9,0xe3,0x1f,0xea,0xca,0x6,0x5d,
+ 0x40,0x48,0x6a,0x9f,0x65,0x9d,0xf8,0xc8,0x8,0xaa,0xbb,0x59,0x9c,0x9b,0xc3,0xcb,
+ 0x2f,0x3c,0x8f,0x3f,0x79,0xf1,0x45,0xbc,0x78,0xf5,0x1a,0x56,0x97,0x96,0x30,0x3f,
+ 0x3b,0x83,0x20,0x8,0x30,0x8a,0x22,0x7c,0xf3,0x9f,0xbf,0x8b,0x57,0x5e,0x7d,0x15,
+ 0xb7,0xee,0xdc,0x39,0xb1,0x79,0xba,0xbe,0x99,0x6b,0xe7,0x5e,0x97,0x73,0xb8,0xae,
+ 0x83,0x40,0xa9,0xc9,0xe5,0xf2,0x5c,0xde,0xda,0xa9,0xda,0x1,0x65,0x79,0x8e,0xbb,
+ 0x9b,0xdb,0xf8,0xfc,0xf6,0x5d,0xec,0xf5,0x7,0x5f,0x78,0x68,0x7e,0x19,0x9a,0xb8,
+ 0xc9,0xe5,0xb8,0xa4,0xe3,0x6a,0xf0,0x90,0x59,0xe3,0x4,0x36,0x63,0x4a,0xbf,0xe2,
+ 0x9a,0x1d,0x87,0xe7,0x70,0x30,0x8b,0xa1,0x28,0x4a,0x8c,0xa2,0x18,0x45,0x51,0x4a,
+ 0x9f,0x2f,0xd7,0x5,0x20,0xd5,0xf3,0xfd,0xa1,0xb4,0x1a,0xd9,0xd8,0xda,0xc5,0x28,
+ 0x8a,0x1a,0xe1,0xdf,0x13,0x7e,0x5e,0x75,0xa7,0x21,0x33,0xe5,0x39,0x4c,0xc0,0x23,
+ 0xc6,0x9d,0x86,0x50,0xc0,0x60,0x32,0x58,0x74,0xd2,0xfc,0x41,0xd0,0x38,0xf8,0x3e,
+ 0x92,0xed,0x28,0x8,0x9a,0x1d,0x48,0x53,0x27,0x72,0xb0,0x33,0x0,0x4,0xa2,0x12,
+ 0xc6,0xdf,0xe8,0xc4,0x77,0xe,0x96,0x85,0xa5,0x85,0x5,0xfc,0xd1,0xb,0xcf,0xe3,
+ 0xcf,0x5e,0x7e,0x19,0xd7,0x2e,0x5d,0xc6,0xc5,0x73,0x6b,0x98,0xe9,0xf5,0xe0,0xfb,
+ 0x3e,0x6,0xc3,0x10,0xaf,0x7c,0xfb,0x55,0xfc,0xb7,0xbf,0xfe,0x3a,0xc2,0xd1,0xe8,
+ 0xc4,0x36,0xa,0x94,0x52,0xf8,0xbe,0x8f,0x96,0xef,0xc2,0x55,0x37,0xf4,0xc0,0x77,
+ 0x8d,0x53,0x2c,0x57,0x86,0x8c,0x8c,0x52,0x10,0xb5,0x28,0xef,0xf,0x43,0xdc,0xb8,
+ 0x7d,0x17,0x9f,0xdd,0x5e,0x3f,0xd2,0x7c,0x9f,0xa8,0x1f,0x8f,0xb,0x6e,0x7a,0x54,
+ 0xa6,0x3f,0x1e,0x56,0x7a,0x2f,0xa5,0x47,0x65,0xb6,0x6d,0xc3,0x73,0xdd,0xc3,0x47,
+ 0x55,0x94,0xc2,0x62,0xcc,0x24,0xff,0xf5,0x3a,0x6d,0x95,0x13,0x2f,0x3f,0x3f,0xcf,
+ 0x4b,0x84,0xa3,0x48,0x1,0x87,0x14,0x4d,0x52,0x4a,0x90,0xa4,0x19,0x46,0x51,0x84,
+ 0x9d,0xbd,0x1,0xb6,0x76,0xf7,0xd0,0xf,0xc3,0x46,0xbf,0xf1,0x4,0xbb,0x48,0x3d,
+ 0x5e,0xb4,0xd5,0x12,0x9c,0x52,0xf9,0xca,0x12,0xba,0xab,0xd0,0xa0,0x21,0xc6,0x1d,
+ 0xc6,0xa1,0x1f,0x2b,0x31,0xf9,0x82,0x24,0xfa,0x3,0x1,0x25,0x0,0x1,0x5,0x61,
+ 0x4,0x94,0xd0,0x6,0x40,0x9a,0x3a,0x89,0xc3,0xdd,0x56,0x33,0xd4,0x12,0x94,0xc8,
+ 0x8,0xd6,0x93,0x1c,0x63,0xb9,0xae,0x83,0xb,0x6b,0xe7,0xf0,0xa7,0x2f,0xbd,0x88,
+ 0x3f,0x7e,0xe1,0x5,0x5c,0xbb,0x74,0x9,0xcb,0xb,0xb,0x98,0x9d,0x9e,0x81,0x6d,
+ 0x5b,0xf8,0xe4,0xf3,0x1b,0xf8,0x3f,0xfe,0xeb,0x7f,0xc5,0x1b,0xef,0xbc,0x83,0x24,
+ 0x4d,0x4f,0xec,0xd,0xc9,0x39,0x97,0xb6,0xe2,0x8e,0x3,0xce,0xe5,0xc2,0xd8,0xf7,
+ 0x3c,0x39,0xb2,0x52,0x60,0xa2,0x73,0xd3,0x1,0x82,0x24,0x49,0xf1,0xf9,0x9d,0x75,
+ 0x5c,0xbf,0xb9,0x8e,0x28,0x8e,0x8f,0xe,0x62,0xe4,0xc1,0x3b,0x10,0x49,0xfd,0x25,
+ 0x13,0x39,0x19,0xfa,0x86,0xa9,0xf9,0xf9,0xfa,0xcf,0xeb,0x75,0xf0,0xeb,0xe9,0x20,
+ 0x2a,0x3d,0xd2,0x93,0x8e,0xb6,0xea,0x6c,0xa8,0x79,0x55,0x71,0x6b,0x2c,0xfe,0xeb,
+ 0xb6,0x5b,0x68,0x5,0x1e,0x7c,0xd7,0x5,0xa1,0x4,0x79,0x5e,0xa0,0x1f,0x8e,0xa4,
+ 0x6a,0xdc,0xb2,0xc1,0x7d,0xe,0x51,0x9,0xc4,0x49,0x62,0xf6,0x1b,0xdb,0xbb,0xfb,
+ 0x18,0x86,0xa3,0x66,0x4c,0xf5,0x84,0x3a,0x8d,0x89,0xd1,0x94,0x25,0x29,0xd6,0x9a,
+ 0xed,0xa7,0x93,0x2b,0xf,0x7,0xb,0x61,0xc6,0x51,0xf7,0x5,0x9,0x10,0xf5,0xba,
+ 0x20,0x32,0x83,0x9e,0x50,0xaa,0xb2,0xe8,0x95,0x4d,0x8d,0xa6,0x67,0x35,0x23,0xac,
+ 0xa6,0x4e,0xa2,0x38,0xb7,0xd4,0x2d,0xb7,0x32,0x7,0x9d,0xe3,0x70,0xa4,0xe9,0xf1,
+ 0x67,0xfe,0x81,0xef,0xe3,0xfc,0xda,0x2a,0xfe,0xec,0xe5,0x97,0xf1,0x47,0xcf,0x3d,
+ 0x8f,0xab,0x1e,0x8a,0xcd,0x12,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x97,0x2e,
+ 0x62,0x65,0x71,0x9,0x53,0xdd,0x2e,0x8,0x21,0xf8,0xd5,0xbb,0xef,0xe2,0xff,0xfa,
+ 0xda,0x9f,0xe3,0xed,0xdf,0xfe,0xf6,0xc4,0x4c,0xf5,0xa8,0x72,0x7f,0x6d,0xf9,0x3e,
+ 0x5c,0x57,0x8e,0xac,0x2,0xcf,0x35,0x56,0xec,0xe3,0xdc,0x74,0xf9,0x86,0x2a,0xcb,
+ 0xa,0xdb,0x7b,0x7b,0xb8,0x7e,0xf3,0xe,0xee,0x6d,0xef,0x3c,0xd0,0x9a,0xfd,0x61,
+ 0x8,0x52,0x7f,0x13,0xd7,0xc7,0xf,0x4c,0xcd,0xaf,0xf5,0xe3,0xaa,0x3b,0x8e,0x3a,
+ 0x60,0xe8,0xc3,0x40,0x1f,0x1c,0xf5,0x5f,0x1f,0x4,0x13,0x93,0x1d,0x7e,0xe0,0x80,
+ 0xd7,0xe7,0x42,0x29,0xe4,0x48,0xb2,0xd3,0xe,0x30,0xdd,0xeb,0x80,0x31,0x26,0x19,
+ 0x55,0x85,0xcc,0x60,0xb7,0x2c,0xd9,0x99,0x54,0x55,0x85,0xd1,0x28,0xc2,0xfe,0x20,
+ 0xc4,0xd6,0xee,0x1e,0xf6,0xfa,0x72,0xbf,0x71,0xd6,0x62,0x75,0xcf,0x5a,0x97,0x41,
+ 0x8,0x99,0x0,0xd,0xad,0x2d,0x2,0xe4,0x4e,0xa3,0x12,0x93,0xa0,0x21,0x6a,0x8b,
+ 0x8b,0xc3,0x5e,0xf,0x7,0x9a,0xc,0xf3,0xdf,0xa0,0xaa,0xa3,0x36,0x17,0x18,0xd4,
+ 0x78,0x82,0x2,0x0,0x45,0x33,0xc2,0x6a,0xea,0x84,0x0,0xc4,0xe6,0x66,0x4c,0xa2,
+ 0xd5,0xc8,0xe,0xe7,0xc8,0x8e,0x11,0xe8,0x43,0x54,0x27,0xf3,0xdc,0xa5,0xcb,0xf8,
+ 0x93,0x97,0x5e,0xc2,0x1f,0xbf,0xf8,0x2,0x2e,0xae,0x9d,0xc3,0xf2,0xe2,0x22,0xba,
+ 0xed,0x36,0x8,0x1,0xfe,0xf1,0xb5,0xef,0xe3,0xcf,0xff,0xe6,0x1b,0xb8,0x7e,0xe3,
+ 0xc6,0x89,0x8d,0x49,0x38,0xb7,0xd1,0xf2,0x3,0xa3,0x28,0xd7,0xc0,0xe1,0xab,0x45,
+ 0x39,0x57,0x16,0xe,0x52,0xd7,0x1,0x84,0xa3,0x8,0x37,0xef,0x6e,0xe0,0x93,0xcf,
+ 0x6f,0x22,0x79,0x4c,0xc0,0xa4,0x84,0x80,0x80,0x18,0xb0,0xe0,0x9c,0xc3,0xb6,0x6d,
+ 0xf3,0xe6,0x3d,0xf8,0xb1,0xde,0x71,0x98,0xdb,0x66,0xd,0x10,0xea,0x8f,0x45,0x1d,
+ 0x54,0xe,0xfe,0xbe,0x7e,0x9c,0x27,0x47,0x5d,0x15,0xd2,0x7c,0x80,0x38,0xcd,0x10,
+ 0xc5,0xa9,0x14,0x42,0xda,0x36,0x5c,0x97,0x83,0xdb,0xe,0xca,0xaa,0x44,0x18,0xc5,
+ 0xd8,0xdd,0xef,0x63,0x6b,0x77,0xf,0xbb,0xfb,0x3,0x24,0x69,0xd6,0x8c,0xa9,0x4e,
+ 0x11,0x34,0xea,0x9d,0x86,0xee,0x42,0x89,0x5e,0x82,0x43,0x6b,0x33,0xc6,0xfb,0x8c,
+ 0xf1,0xf3,0x7e,0xa0,0xdb,0x38,0x0,0x16,0xf5,0x4b,0x5,0x25,0x44,0x2e,0xdb,0xb5,
+ 0x19,0xa6,0x6a,0x43,0x48,0x2d,0xe8,0x4c,0x0,0x20,0x2,0x10,0x44,0x98,0xaf,0xd4,
+ 0x0,0x48,0x53,0xc7,0x1f,0x61,0x71,0x1b,0x42,0x0,0x45,0x55,0xa9,0x83,0x95,0xa8,
+ 0xa5,0x72,0xfa,0x58,0x94,0x5e,0xed,0xa6,0x7b,0xed,0xd2,0x25,0xfc,0xe9,0xcb,0x2f,
+ 0xe3,0xc5,0xab,0x57,0x71,0xe5,0xe2,0x45,0xc9,0xb4,0x6a,0xb5,0xb0,0xd7,0xef,0xe3,
+ 0x3b,0xaf,0xbd,0x86,0xbf,0xf8,0xc6,0x37,0xb0,0xbb,0xbf,0x7f,0x22,0x87,0x17,0x21,
+ 0x4,0xbe,0xef,0xa1,0x1d,0x4,0x70,0x95,0x92,0xdc,0xf7,0x1c,0xd9,0x85,0x38,0x8e,
+ 0x11,0xa,0x52,0xa5,0xc4,0xce,0xf3,0x1c,0xeb,0x1b,0x5b,0xf8,0xc3,0xe7,0xb7,0xb0,
+ 0x3f,0xc,0x8f,0xa5,0x7d,0x21,0x2a,0xa5,0x90,0x9a,0xc3,0x61,0xc,0x10,0xf5,0x1b,
+ 0xa1,0xce,0xc9,0xd0,0xc,0xaf,0x3a,0x78,0x3c,0xec,0xe3,0x83,0xba,0x91,0x7,0xde,
+ 0x46,0x9,0xc1,0x40,0x45,0xc3,0x72,0xdb,0xc2,0x54,0xa7,0x8d,0x5e,0xa7,0x5,0x8b,
+ 0x31,0xc,0x47,0x23,0x6c,0x6c,0xed,0xa0,0x3f,0xc,0x9b,0xc4,0xbf,0x53,0x4,0xd,
+ 0x76,0x80,0x39,0x65,0xa6,0x46,0x40,0x8d,0x35,0xa5,0x41,0xa3,0x6,0x14,0xb5,0xdf,
+ 0xab,0x77,0xb5,0xa4,0xd6,0x6a,0x12,0xf5,0x1e,0x93,0x61,0x5e,0xe3,0x71,0x28,0xad,
+ 0x8d,0xa7,0xc4,0xf8,0xbf,0x26,0xff,0xa7,0x81,0x84,0xc8,0x5d,0x88,0x1e,0x71,0x35,
+ 0x0,0xd2,0xd4,0xb1,0xcb,0xa2,0x14,0x80,0x40,0x55,0xca,0x1d,0x88,0x20,0x80,0x65,
+ 0xcb,0x59,0xfa,0xa3,0x2,0x8,0x21,0x4,0xbd,0x6e,0x17,0xcf,0x5f,0xb9,0x8c,0x3f,
+ 0x7b,0xe9,0x65,0xbc,0xf8,0xdc,0x35,0x5c,0x58,0x5d,0xc5,0xc2,0xdc,0x2c,0x7c,0xd7,
+ 0xc3,0xe6,0xf6,0x36,0xfe,0xdb,0x2b,0xaf,0xe0,0x7b,0xaf,0xbf,0x8e,0xfe,0x70,0x78,
+ 0x32,0xdf,0xbf,0xd2,0x35,0x74,0x5a,0x2d,0x78,0xe,0x87,0xe7,0x4a,0xd7,0x5c,0x29,
+ 0xa,0xd4,0x5d,0xc7,0xd8,0x0,0x71,0x38,0x1c,0xe1,0xd3,0x1b,0xb7,0x71,0xeb,0xee,
+ 0x6,0xa2,0x24,0x39,0xf6,0xb8,0xcc,0xf3,0x3c,0x3,0x1c,0xf,0xeb,0xe,0x74,0x97,
+ 0x71,0xb0,0xab,0xa8,0x3,0x86,0xfe,0x9c,0x2f,0x2,0xf,0x49,0xd1,0x25,0xf,0x7c,
+ 0xe,0xf4,0xd7,0x28,0xcb,0x12,0x49,0x9a,0x61,0x6b,0x6f,0x1f,0x16,0x63,0xc8,0x8b,
+ 0x2,0xc3,0x61,0x78,0x2a,0x2c,0xbb,0xa6,0xd3,0xa0,0x63,0x7d,0x46,0x6d,0xb7,0x26,
+ 0x8c,0xe7,0x98,0x98,0x58,0x82,0x1f,0x4,0xb,0x51,0x23,0x42,0x98,0x8f,0xe6,0x22,
+ 0xa2,0xd2,0x1f,0x29,0x53,0xf1,0xc1,0xea,0xeb,0x13,0x62,0x3e,0x8f,0xd4,0x2e,0x27,
+ 0x12,0x90,0x24,0x80,0x8,0xd5,0x89,0x68,0x40,0xa9,0x53,0x7a,0x1b,0x0,0x69,0xea,
+ 0x58,0xc5,0x28,0x5,0x65,0xc,0x95,0x9a,0xbf,0x52,0x46,0x21,0x84,0xd4,0x86,0x38,
+ 0xdc,0x46,0xfc,0x8,0x94,0x5e,0xcb,0xb2,0x30,0x33,0x3d,0x8d,0x3f,0x7d,0xf1,0x5,
+ 0xbc,0xfc,0xfc,0xb,0x78,0xf1,0xea,0x55,0xac,0xad,0xac,0x60,0xba,0xd7,0x83,0xc3,
+ 0x1d,0xfc,0xe6,0xbd,0xdf,0xe3,0xff,0xf9,0x1f,0x7f,0x89,0xb7,0x7f,0xf3,0x9b,0x13,
+ 0x59,0xd2,0xca,0x88,0x54,0xc5,0x32,0xf2,0x3d,0x23,0x6,0x94,0xe3,0x2b,0xc9,0xae,
+ 0xb2,0x6d,0xcb,0x4,0x1d,0x25,0x49,0x8a,0xbb,0x9b,0xdb,0x78,0xef,0xf,0x9f,0x1d,
+ 0x9b,0xe9,0x45,0x8,0x81,0xe3,0x38,0x70,0x1c,0x67,0x2,0x14,0xea,0xc0,0x52,0x7,
+ 0x86,0xf1,0x1b,0x1b,0x13,0x0,0xf1,0xb0,0x1f,0xf,0xea,0x30,0x1e,0xd6,0x7d,0x1c,
+ 0x6,0x5c,0x44,0xa9,0x93,0x33,0xe4,0x46,0x48,0x99,0xe7,0x39,0xb2,0xac,0x19,0x5d,
+ 0x1d,0xe7,0xf9,0xd7,0xfb,0x8c,0xfa,0xbe,0x8b,0x92,0x1a,0x60,0x28,0xdb,0x90,0x31,
+ 0xbd,0xf6,0x7e,0xb0,0xd0,0xfe,0x54,0x63,0x26,0x9f,0x14,0x5,0x4a,0x40,0x22,0x93,
+ 0x80,0xc1,0xa8,0xa2,0x6a,0xcb,0x4e,0x83,0xd6,0xb7,0xe5,0xd0,0x7b,0x30,0x72,0x0,
+ 0x94,0x14,0x68,0x8,0x6d,0x46,0x40,0x50,0xa7,0xfb,0x36,0x0,0xd2,0xd4,0xf1,0x6e,
+ 0xef,0x8a,0xc2,0x2a,0x44,0x25,0xe7,0xf8,0x94,0xa2,0x12,0x2,0x25,0xa3,0x6a,0x9e,
+ 0x7f,0x34,0x4a,0xaf,0x65,0x59,0x58,0x5e,0x58,0xc0,0xf3,0x57,0xae,0xe0,0x4f,0x5f,
+ 0x7a,0x19,0x57,0x2e,0x5e,0xc4,0xea,0xb2,0x5c,0x96,0x53,0x4a,0xf1,0x83,0x1f,0xff,
+ 0x8,0x7f,0xf9,0x77,0xdf,0xc4,0x47,0x9f,0x7c,0x72,0x22,0xe0,0x61,0x59,0x16,0x5a,
+ 0xad,0x0,0xdd,0x76,0xb,0x9d,0x20,0x40,0xe0,0xb9,0x68,0x7,0x3e,0x1c,0x87,0x4f,
+ 0x74,0x1c,0x94,0x12,0x14,0x45,0x89,0xbd,0xfe,0x10,0x1f,0x7e,0xfa,0x39,0xee,0x6e,
+ 0x6e,0x4b,0xa5,0xf5,0x31,0xbb,0xe,0xae,0x14,0xdf,0xe2,0x1,0x59,0x20,0x7,0xbb,
+ 0x90,0x3a,0x80,0x3c,0x8,0x28,0x1e,0xb4,0xe7,0x78,0x9c,0xc3,0xed,0xb0,0x5f,0xd7,
+ 0x3f,0xea,0x3,0x2f,0xcb,0xb2,0xa6,0x1b,0x79,0x94,0xb,0x97,0x62,0xd1,0x49,0xb5,
+ 0xbf,0xa5,0x48,0xd,0xc2,0x1c,0xdc,0xf2,0x62,0x0,0x3c,0x9c,0x39,0x25,0xea,0x4f,
+ 0xe,0xa8,0xfe,0x78,0x0,0x34,0xac,0xda,0x38,0x54,0xa7,0x41,0x6a,0x80,0x41,0x1d,
+ 0x6c,0x50,0x7b,0x7e,0x9,0x8c,0x51,0xa6,0x0,0x19,0x8b,0x9,0x1,0x79,0x49,0xac,
+ 0x24,0x99,0xa2,0x54,0xd4,0xe0,0x6,0x40,0x9a,0x3a,0x56,0x39,0xca,0xa6,0x3b,0x2f,
+ 0xa,0xc,0xc3,0x11,0x3a,0xed,0x16,0x2c,0x8b,0xc9,0x17,0x99,0xca,0x83,0x48,0x92,
+ 0xe4,0xa1,0x22,0x32,0xce,0xb9,0xd4,0x78,0x3c,0xf7,0x1c,0xfe,0xf8,0x45,0x49,0xd3,
+ 0x5d,0x9a,0x5f,0xc0,0x54,0xb7,0x87,0x34,0xcb,0xf0,0xbf,0x7e,0xfa,0x53,0xfc,0xbf,
+ 0x7f,0xf9,0x97,0xd8,0xd9,0xdb,0x3b,0xf6,0x8d,0x57,0x8b,0x2,0xa7,0x7a,0x5d,0x74,
+ 0xdb,0x2d,0xf4,0xda,0x6d,0x74,0x3b,0x32,0x23,0xdd,0x75,0x1d,0xd8,0x8c,0x29,0x76,
+ 0x95,0x7c,0xc3,0xc,0x47,0x23,0x5c,0xbf,0x79,0x1b,0x9f,0x7c,0x7e,0xb,0x83,0xf0,
+ 0xf8,0xe1,0x53,0x94,0x52,0xb8,0xae,0xb,0xcb,0xb2,0xbe,0xb0,0x5b,0x38,0x8c,0x69,
+ 0x75,0xd8,0x48,0xea,0x71,0x80,0xe3,0x28,0x23,0xac,0xc3,0x7e,0x7d,0x70,0x3f,0xc3,
+ 0xb9,0x24,0x50,0x34,0x20,0xf2,0x70,0xd0,0x30,0xfb,0xc,0x6d,0x71,0x33,0x11,0x24,
+ 0xa6,0xfc,0xa6,0x1e,0x30,0x9a,0x32,0x2d,0xc6,0x21,0x80,0xae,0x77,0x19,0x96,0xc5,
+ 0x4c,0x7,0x33,0x66,0x66,0xd5,0x0,0xa2,0xa6,0xe5,0x98,0x0,0xb,0x68,0x0,0xc2,
+ 0xc4,0x45,0xa5,0xee,0x87,0x55,0x15,0x25,0x8a,0xaa,0x32,0x53,0x86,0xfa,0xeb,0xad,
+ 0x1,0x90,0xa6,0x8e,0x7,0x20,0x8e,0x3,0x42,0x28,0xca,0xa2,0xc4,0x70,0x34,0xc2,
+ 0x70,0x34,0xc2,0xf2,0xc2,0x1c,0x2c,0x4b,0x9a,0xea,0x15,0xb6,0x5,0x6e,0xf3,0x7,
+ 0xea,0x33,0x3c,0xd7,0xc5,0xda,0xf2,0x12,0xfe,0xe8,0xf9,0x17,0xf0,0xc2,0xb5,0x6b,
+ 0xb8,0x74,0xfe,0x1c,0x96,0x17,0x16,0xd1,0xa,0x2,0xec,0xec,0xed,0xe1,0xaf,0xff,
+ 0xe1,0x1f,0xf0,0x83,0x1f,0xfd,0x8,0x7b,0xfd,0xfe,0x89,0xbc,0x91,0x3b,0xed,0x16,
+ 0xa6,0xbb,0x5d,0xcc,0x4c,0xf5,0x30,0xd5,0xed,0xa2,0xd7,0x69,0x4b,0x5f,0x2b,0x95,
+ 0xe1,0x21,0xdf,0x9c,0x32,0xec,0x68,0x7d,0x77,0xb,0xbf,0x7a,0xf7,0x7d,0x6c,0xed,
+ 0xec,0x9d,0x8,0x45,0x58,0x83,0x47,0x7d,0x3c,0xf5,0x45,0x4b,0xee,0xc3,0x7e,0xef,
+ 0x41,0x3b,0x8d,0xa3,0x80,0xc5,0x51,0xc1,0xa5,0x7e,0x50,0x1d,0xfc,0xfb,0x7,0x17,
+ 0xfc,0x9a,0x31,0x96,0x3d,0xa5,0x56,0x2d,0x5f,0xc6,0x78,0x4a,0x83,0x86,0xd1,0x67,
+ 0x48,0xab,0x86,0x71,0x27,0x29,0xaa,0x7,0x76,0x18,0x75,0x8d,0x6,0xc6,0x84,0xa8,
+ 0xb1,0x1e,0x48,0x3,0x86,0xea,0x34,0x34,0x60,0x10,0xc5,0xe6,0xc3,0x7d,0xa0,0x81,
+ 0x89,0x1d,0xc7,0xc1,0x8b,0xc0,0x78,0x2c,0x2a,0x50,0x96,0x15,0x8a,0xb2,0x44,0xa9,
+ 0xe2,0x85,0x45,0x55,0xa1,0x82,0xa6,0x8,0xcb,0x91,0x5a,0x59,0xa,0x54,0xa2,0x44,
+ 0x59,0x36,0x23,0xac,0xa6,0x8e,0xb,0x20,0x9c,0x2b,0xdf,0xa3,0x12,0x79,0x51,0xa2,
+ 0x28,0xa,0xdc,0xbe,0xbb,0x89,0xf3,0xab,0x4b,0xb0,0x2d,0x86,0xbc,0x90,0x9a,0x90,
+ 0xc3,0x0,0x84,0x73,0x1b,0xe7,0x57,0x57,0xf1,0xc2,0xd5,0xab,0x78,0xf1,0xb9,0xe7,
+ 0x70,0x69,0x4d,0x26,0x8,0xba,0xae,0x8b,0xf5,0x8d,0xd,0xfc,0xd5,0x37,0xbf,0x89,
+ 0xff,0xf5,0xd3,0x9f,0x9e,0x88,0x87,0x94,0x6d,0xdb,0x98,0xee,0xf5,0x30,0x37,0x33,
+ 0x85,0xb9,0xe9,0x69,0xcc,0xcf,0xcc,0xa0,0xdb,0x69,0xa1,0xe5,0xfb,0xb5,0x9c,0xb,
+ 0xa0,0x12,0x15,0xf6,0x7,0x43,0xfc,0xe6,0xbd,0xf,0xf1,0xc1,0xa7,0x9f,0x21,0x1c,
+ 0x45,0x27,0x48,0x11,0xe6,0x72,0x11,0xff,0x90,0x5d,0xc5,0x51,0x81,0xe4,0x28,0x6c,
+ 0xaa,0x2f,0xfa,0xf3,0x87,0xfd,0x9d,0x83,0x3b,0x97,0x83,0xa3,0xb4,0xfa,0x47,0xd,
+ 0x8e,0xa7,0x65,0x61,0x73,0x96,0x40,0xc3,0xb6,0x2c,0xd8,0x9c,0x83,0x52,0x2,0x42,
+ 0xc6,0xf9,0x2f,0x66,0xa7,0x50,0x23,0x42,0x7c,0x31,0x63,0x4a,0x36,0x2a,0x9a,0x81,
+ 0x67,0xa9,0x1f,0x72,0x97,0x51,0x1b,0x4d,0x19,0x80,0x20,0xa8,0xe1,0xc6,0x78,0x41,
+ 0x5e,0xdb,0x8b,0xe8,0xfc,0x16,0x28,0x50,0x28,0x95,0xe0,0xb0,0xac,0x24,0x20,0x54,
+ 0xa2,0x52,0xbf,0x1e,0x8f,0xad,0x64,0x27,0xa2,0xde,0xdf,0x65,0x89,0xa2,0x28,0x8d,
+ 0x53,0x6f,0x3,0x20,0x4d,0x1d,0xf3,0x60,0xb6,0x0,0x8,0xe4,0x45,0x61,0xa8,0xac,
+ 0x69,0x96,0xe1,0xc6,0xed,0x75,0x2c,0x2f,0xcc,0xc3,0xb1,0x6d,0x64,0x8a,0x59,0xa2,
+ 0x19,0x59,0x4,0x40,0xa7,0xd3,0xc6,0xf9,0x95,0x55,0xfc,0xf1,0xb,0x2f,0xe0,0xf2,
+ 0xc5,0x8b,0xb8,0xb0,0xba,0x8a,0xb9,0x99,0x19,0x38,0xdc,0xc1,0x4f,0xdf,0x7c,0x13,
+ 0xaf,0xfc,0xe3,0xb7,0xf1,0xf1,0xa7,0xd7,0x8f,0x6d,0x86,0x48,0x29,0x41,0xa7,0xd5,
+ 0xc6,0xec,0xcc,0x34,0x56,0x16,0xe6,0xb1,0x30,0x37,0x87,0xb9,0xe9,0x69,0x4c,0xf5,
+ 0xba,0x52,0x18,0xc8,0xb9,0xa4,0xc7,0xa,0x81,0xfe,0x70,0x80,0x77,0x3f,0xf8,0x8,
+ 0x6f,0xfc,0xea,0x37,0xb8,0xbb,0xb9,0x75,0xa2,0xb,0x62,0xc7,0x71,0x54,0x94,0x6b,
+ 0x79,0xe8,0xe8,0xe9,0x41,0xe0,0x70,0x94,0x2e,0xe3,0x49,0x2c,0xb2,0xeb,0xa0,0x71,
+ 0x10,0x50,0x26,0xc6,0x29,0xea,0xdf,0xf8,0x55,0x19,0x4d,0x69,0xe6,0x94,0xc5,0x98,
+ 0xb4,0xf,0x21,0x98,0xe8,0x28,0xe,0xd3,0x63,0x4c,0x80,0xc7,0x1,0xd0,0x18,0x3f,
+ 0x8e,0x74,0xc,0x18,0x9a,0x6e,0x4b,0x88,0x1,0x8a,0xfa,0x1e,0x43,0x61,0xc5,0x7d,
+ 0x63,0x46,0x43,0x1,0x27,0x44,0x59,0xb0,0xcb,0xef,0x21,0x2f,0x4a,0x94,0x45,0x89,
+ 0x52,0x81,0x45,0x55,0x55,0xb5,0x3f,0x7,0xca,0xb2,0x40,0x59,0x55,0xea,0x52,0x58,
+ 0x20,0xcf,0xb,0x94,0x55,0x79,0xa8,0x73,0x72,0x3,0x20,0x4d,0x3d,0xfe,0xe1,0x4c,
+ 0x8,0x6c,0x65,0x89,0x91,0x15,0x93,0x9a,0x80,0x34,0xcb,0x71,0x77,0x73,0xb,0x4b,
+ 0x73,0xb3,0x70,0xb8,0xd,0x47,0x1,0x8,0x21,0x4,0xed,0x56,0xb,0x17,0xd7,0xd6,
+ 0x70,0xed,0xd2,0x65,0x5c,0xbe,0x70,0x1,0x2b,0xb,0xb,0xe8,0xb4,0xdb,0xc8,0xf3,
+ 0x1c,0x3f,0x7f,0xe7,0x6d,0xfc,0xcd,0xab,0xdf,0xc6,0x9d,0xbb,0x77,0x8f,0x6d,0x86,
+ 0xe8,0x70,0x8e,0x6e,0xb7,0x83,0xd5,0xc5,0x45,0x2c,0xcd,0xcf,0x63,0x65,0x71,0x41,
+ 0x59,0xbe,0xb7,0xd1,0x6e,0x5,0x2a,0x66,0x95,0x22,0xcf,0x32,0xac,0x6f,0x6e,0xe2,
+ 0x87,0x3f,0x7d,0x3,0xbf,0x7b,0xff,0x3,0xc,0x4f,0x60,0xd7,0x71,0xb0,0xfb,0xe1,
+ 0xdc,0x96,0x37,0xbc,0x3,0xf4,0xda,0x87,0xed,0x36,0x1e,0xa7,0xd3,0x38,0x49,0xc0,
+ 0x78,0x50,0x47,0xf2,0x20,0x20,0xd1,0x87,0xdf,0xb3,0xc,0x20,0x5a,0xc8,0x67,0x98,
+ 0x53,0x94,0x9a,0x91,0x91,0x5c,0x82,0xd7,0xf6,0x16,0x8a,0x4d,0x75,0x10,0x34,0xc6,
+ 0x60,0xa1,0x34,0x15,0x6a,0x2c,0xc5,0xd8,0x78,0xf9,0xad,0x69,0xbc,0x94,0x8c,0xbf,
+ 0x3e,0x21,0x63,0xa4,0x20,0x7,0x9e,0x1b,0xfd,0x7e,0x3c,0x28,0x34,0xad,0x2a,0x3d,
+ 0x92,0x2a,0x51,0x94,0x95,0x5a,0x82,0xb,0x3,0x1a,0x75,0xa6,0x9f,0x6,0x8c,0x2c,
+ 0x97,0x97,0xc1,0xa3,0x90,0x55,0x1a,0x0,0x69,0xea,0xf1,0x1,0x84,0xc9,0x18,0x53,
+ 0x8,0x20,0x89,0xef,0x1f,0x51,0x25,0x69,0x86,0xbb,0x9b,0xdb,0x58,0x5a,0x9c,0x83,
+ 0x1f,0xf8,0x88,0xd3,0x14,0xed,0x20,0xc0,0xa5,0xf3,0xe7,0x71,0xf5,0xd2,0x45,0x5c,
+ 0x39,0x7f,0x1e,0x8b,0xf3,0x73,0x68,0xb7,0x5a,0x88,0xe3,0x18,0xdf,0x7d,0xfd,0x75,
+ 0xfc,0xf0,0x47,0x3f,0xc2,0xfe,0x60,0x70,0xec,0xae,0xc3,0xf7,0x3c,0x2c,0x2a,0xd0,
+ 0xb8,0xb8,0xb6,0x86,0x95,0xc5,0x45,0x9,0x1e,0xdd,0xe,0x2,0xd7,0x5,0x77,0xe4,
+ 0xf2,0x77,0xbf,0x3f,0xc0,0xcf,0xdf,0xf9,0x35,0x7e,0xf8,0x93,0x9f,0xe1,0xee,0xe6,
+ 0xe6,0x89,0xc7,0xdd,0x6a,0x5b,0x14,0x3d,0x3f,0x3e,0xa8,0xe5,0x38,0xea,0xf8,0xea,
+ 0xcb,0xae,0x7,0xa9,0xd8,0xf,0x8e,0xb3,0xf4,0x28,0xe7,0x59,0x1,0x91,0x49,0x25,
+ 0xb8,0x25,0x5d,0x8b,0x15,0x68,0x18,0x17,0x5b,0x15,0xba,0x74,0x18,0x73,0xea,0x7e,
+ 0xc6,0x94,0x3c,0xd8,0x25,0xfd,0x9d,0x9a,0xb1,0x97,0xde,0x6b,0x50,0xa5,0x2,0xd7,
+ 0x23,0xa7,0x31,0x39,0xb7,0xfe,0x4d,0x61,0xa2,0xbb,0x20,0x94,0x80,0x11,0x6a,0x0,
+ 0xa1,0x12,0x2,0x79,0x5e,0xa0,0x28,0x64,0x27,0x61,0x40,0x43,0x2f,0xec,0x2b,0x21,
+ 0x1,0x45,0x8d,0xa4,0xd2,0x2c,0x47,0xa9,0x3e,0xe7,0x51,0x5f,0x7b,0xd,0x80,0x34,
+ 0xf5,0xf8,0xb7,0x31,0xa5,0xf5,0x10,0x42,0x20,0xc9,0xe,0x5f,0x92,0x27,0x59,0x86,
+ 0xdd,0xbd,0x3e,0x82,0xc0,0xc7,0xdc,0xcc,0x34,0x96,0x17,0x16,0xf0,0xdc,0xe5,0x4b,
+ 0x38,0xb7,0xb2,0x82,0xb9,0xd9,0x59,0xb8,0x8e,0x83,0xf5,0x8d,0xd,0x7c,0xff,0xdf,
+ 0xfe,0xd,0x3f,0x7f,0xfb,0xed,0x63,0x9b,0x21,0x72,0xce,0xd1,0xeb,0x74,0xb0,0xba,
+ 0xbc,0x84,0x8b,0xab,0xab,0xb8,0xb0,0xb6,0x8a,0xd5,0xe5,0x65,0xcc,0x4e,0x4f,0xa3,
+ 0xd7,0xe9,0xa0,0xe5,0x4b,0xd1,0x5e,0x1c,0xc7,0xf8,0xf5,0xef,0xdf,0xc3,0x3f,0xff,
+ 0xe0,0x87,0xf8,0xdd,0xfb,0x1f,0x20,0x3e,0xa6,0x20,0xf0,0x81,0xdf,0x8f,0x2d,0xa3,
+ 0x5d,0xab,0xaa,0x94,0x8b,0xc8,0xfa,0xc,0xfc,0x29,0x7,0x8d,0xa3,0x82,0xca,0x61,
+ 0x3b,0x91,0x33,0x7d,0x31,0x32,0x76,0xe8,0xc,0xb6,0x65,0x83,0x59,0xc,0x84,0x8c,
+ 0xe9,0xb6,0xc6,0xb1,0x56,0x18,0x45,0x84,0xc9,0xd2,0x90,0xb8,0x71,0x0,0x34,0xb4,
+ 0x2e,0x83,0xc8,0xaf,0x69,0x59,0xc,0x16,0xb3,0x60,0x99,0x5,0x38,0xb9,0x8f,0xdd,
+ 0xa6,0x41,0xc8,0xec,0x37,0x6a,0xfb,0xb,0x76,0xc0,0xb,0xad,0xac,0x2a,0x64,0x85,
+ 0x4,0x8c,0xa2,0x94,0xe2,0xcf,0xaa,0xc6,0xa4,0xd2,0x3f,0x2f,0xca,0x12,0x99,0x2,
+ 0x96,0xfa,0x1e,0xe3,0x38,0xd5,0x0,0x48,0x53,0xc7,0x68,0xe7,0xe5,0xfc,0x57,0x8,
+ 0x81,0x2c,0x7b,0xb0,0x36,0x22,0x8a,0x13,0x78,0x9e,0x87,0x95,0xc5,0x45,0x9c,0x5b,
+ 0x59,0xc1,0xe2,0xfc,0x3c,0x7a,0xdd,0x2e,0x6c,0xcb,0xc2,0x8d,0xdb,0x77,0xf0,0x9d,
+ 0xd7,0x5e,0xc3,0x7b,0x1f,0x7f,0x7c,0xac,0x5,0xac,0xa6,0x94,0x2e,0x2f,0xcc,0x63,
+ 0x6d,0x69,0x9,0xcf,0x5d,0xb9,0x82,0xf3,0xab,0x2b,0x58,0x5e,0x58,0xc0,0xc2,0xdc,
+ 0x1c,0xba,0xed,0x16,0x3c,0xd7,0x3,0xa3,0x14,0xfb,0x83,0x3e,0xfe,0xe9,0x7,0xaf,
+ 0xe3,0xbb,0x3f,0x7c,0x1d,0x77,0x37,0x36,0x4e,0x2d,0x87,0x5b,0x7e,0x4f,0xb6,0xf1,
+ 0x28,0xaa,0x1e,0xe0,0x4b,0xf5,0x2c,0xd4,0x41,0x30,0x39,0xb8,0x84,0x3f,0xb,0x9d,
+ 0x86,0xf1,0x22,0xd3,0x3e,0x64,0xd4,0x98,0x76,0xd4,0xd4,0xd9,0xe2,0x0,0xc5,0x76,
+ 0xd2,0xcb,0xb6,0xae,0xfe,0x1e,0xef,0x32,0x2c,0xd8,0x96,0xec,0x34,0xf4,0x2,0x5c,
+ 0x9b,0x5a,0xd6,0x97,0xe0,0x35,0x44,0x92,0x5d,0x8,0x25,0x26,0x77,0x9e,0x12,0xd9,
+ 0xb1,0xe8,0xd7,0x51,0x59,0xca,0xa5,0x76,0x5e,0x14,0x66,0xe9,0xad,0xbb,0xf,0xfd,
+ 0xfa,0xca,0xb2,0x2,0x45,0x59,0x20,0xcf,0x73,0xb9,0xf7,0x50,0xc0,0x72,0x92,0xd5,
+ 0x0,0x48,0x53,0xc7,0x0,0x10,0x79,0x43,0x2b,0xab,0xea,0x81,0xe,0xb4,0xb6,0x6d,
+ 0x63,0x66,0xaa,0x87,0xa5,0xb9,0x79,0x5c,0x5c,0x5b,0xc5,0xc2,0xdc,0x1c,0x3a,0xad,
+ 0x16,0xca,0xb2,0xc4,0xaf,0xde,0xfd,0x4f,0xfc,0xcb,0xeb,0x3f,0xc4,0xf6,0xee,0xf1,
+ 0xf4,0x1d,0x16,0x63,0x98,0xea,0x76,0xb1,0xba,0xbc,0x84,0xe7,0x2f,0x5f,0xc6,0xc5,
+ 0xf3,0xe7,0xd5,0xd8,0x6a,0x1,0xd3,0xbd,0x29,0x74,0xda,0x6d,0xd8,0xb6,0x85,0x24,
+ 0x49,0xf0,0x6f,0x3f,0xfb,0x39,0xfe,0xe2,0x1b,0x7f,0x8b,0x8f,0xae,0x5f,0x3f,0x75,
+ 0xc6,0x10,0x57,0x91,0xa1,0xe6,0xa6,0xa7,0x6f,0xa9,0xcf,0xb8,0x7a,0xfb,0xac,0xfc,
+ 0xfb,0xea,0xae,0xc7,0x3a,0xde,0x75,0x12,0xf8,0x84,0x11,0xd1,0x1d,0xec,0x30,0x4c,
+ 0xfe,0x52,0x8d,0xf5,0x54,0x5f,0x7e,0xeb,0x71,0x97,0xc5,0x26,0x3d,0xcc,0xea,0x82,
+ 0x3e,0xd4,0xbf,0x16,0xc6,0xd6,0xfd,0x4c,0x5b,0xf5,0x2b,0xeb,0x1c,0x8,0x81,0xa2,
+ 0x2c,0x91,0xa4,0xa9,0xd9,0x53,0xd4,0xf7,0x69,0x95,0x10,0x66,0x5c,0x95,0x17,0x5,
+ 0xb2,0x2c,0x3f,0xb1,0xe,0xa3,0x1,0x90,0xa6,0x4e,0xef,0xc5,0xa3,0x16,0x7d,0x59,
+ 0x96,0xa3,0x12,0xf7,0xcf,0xbc,0x6d,0xcb,0xc2,0x54,0xa7,0x83,0x85,0xd9,0x59,0xcc,
+ 0xcf,0xcd,0xa0,0xdb,0x6e,0xc3,0xe1,0x1c,0x71,0x12,0xe3,0xcd,0x5f,0xff,0x1a,0x6f,
+ 0xff,0xf6,0xb7,0xd8,0xdd,0x7f,0x7c,0x7d,0x87,0xb4,0x3,0xe1,0x58,0x98,0x9b,0xc3,
+ 0x85,0xd5,0x55,0x5c,0xbd,0x78,0x11,0x2f,0x5c,0xbd,0x8a,0xb5,0xe5,0x65,0x2c,0xcd,
+ 0xcf,0x63,0xba,0xd7,0x83,0xef,0x7b,0x20,0x20,0xb8,0x71,0xfb,0xe,0xbe,0xfe,0xea,
+ 0xab,0x78,0xed,0xdf,0xff,0x1d,0x77,0x37,0x37,0x9f,0xc8,0x21,0xe7,0x38,0xf6,0x84,
+ 0xf1,0xa1,0x1e,0x69,0x34,0x41,0xe0,0x5f,0x5e,0x97,0x61,0xec,0xd0,0x2d,0xb,0xec,
+ 0xc0,0x12,0x1c,0x18,0xe7,0x80,0xdf,0xd7,0x61,0xd4,0x2c,0x43,0xf4,0xd3,0x28,0xa9,
+ 0xba,0x44,0x2,0x86,0x65,0xab,0xd8,0x5f,0xcb,0x0,0x89,0xa6,0xf1,0x4e,0x8c,0xf5,
+ 0xc,0xfb,0x4a,0x8e,0xc3,0x88,0xfa,0x5c,0x56,0xcb,0x78,0xa9,0x94,0x80,0x2f,0x53,
+ 0x9d,0x83,0x1c,0x4d,0x95,0xaa,0xcb,0x10,0x28,0xcb,0x42,0x7e,0xac,0x2a,0x5,0x16,
+ 0xc5,0x18,0x54,0x8c,0xbe,0xe4,0x9,0x9d,0x1,0xcd,0xcb,0xaa,0xa9,0xc7,0x2d,0x5b,
+ 0x59,0x31,0xe4,0x79,0x8e,0xa2,0x98,0x5c,0x3e,0x3b,0x2a,0x8c,0x69,0x6e,0x66,0x1a,
+ 0x73,0xd3,0xd3,0xe8,0xb6,0xdb,0xb0,0x2c,0xb,0xc3,0x30,0xc4,0xaf,0x7f,0xff,0x3e,
+ 0xde,0xff,0xf8,0xe3,0x63,0xed,0x1d,0x28,0xa5,0x98,0xee,0x75,0xb1,0x30,0x37,0x87,
+ 0xe7,0x2e,0x5f,0xc6,0x8b,0x57,0xaf,0xe2,0xe2,0xb9,0x73,0x38,0xbf,0xba,0x8a,0xb9,
+ 0x99,0x69,0xf4,0x3a,0x5d,0xb8,0xae,0x83,0x51,0x14,0xe3,0xdb,0xdf,0xff,0x9f,0xf8,
+ 0xab,0x6f,0xfe,0x3d,0x3e,0x3c,0x21,0x1b,0x94,0x23,0x8f,0xaf,0x6c,0xc9,0xbc,0x1a,
+ 0x7,0x36,0x41,0x99,0x4d,0x92,0xc6,0x43,0xea,0x9,0x82,0xc6,0x61,0x4b,0x70,0x32,
+ 0x41,0xb7,0x5,0x4,0xaa,0x43,0x7d,0xa6,0x26,0xc0,0xc7,0x8c,0xba,0xc6,0x5d,0x86,
+ 0xad,0x32,0xc6,0xc7,0xac,0x29,0x32,0xa1,0xbf,0x10,0x35,0x97,0x5c,0xf9,0xba,0x25,
+ 0xa0,0x44,0xf9,0x53,0xa9,0xbf,0xa7,0x17,0xdb,0x79,0x51,0x20,0x49,0x33,0xb9,0x0,
+ 0x2f,0x25,0x20,0x94,0x66,0x87,0x51,0x22,0xcf,0x24,0x90,0x64,0x85,0x1c,0x4b,0x69,
+ 0xa1,0xdf,0x97,0xf9,0x4a,0x6a,0x0,0xa4,0xa9,0x63,0xdc,0xb0,0xa5,0x88,0x30,0x2b,
+ 0x24,0x4f,0x5c,0x37,0xe6,0x36,0xb7,0xd1,0x6d,0xb7,0x30,0xd5,0xed,0xa2,0xdb,0x69,
+ 0xc3,0x73,0x1d,0x50,0x42,0xb0,0xb3,0xbf,0x8f,0x8d,0xcd,0x4d,0xfc,0xee,0xbd,0xf7,
+ 0x8e,0x15,0x3c,0xe4,0xb9,0x2e,0xa6,0x7b,0x5d,0x5c,0xb9,0x78,0x9,0x57,0x2e,0x9c,
+ 0xc7,0x4b,0xd7,0xae,0xe1,0xc2,0xb9,0x73,0x58,0x5e,0x58,0xc0,0xdc,0xcc,0xc,0x2,
+ 0xdf,0x47,0x55,0x55,0x78,0xf3,0xd7,0xbf,0xc6,0xff,0xf8,0xdb,0x6f,0xe2,0x47,0xbf,
+ 0xf8,0x5,0x86,0x61,0xf8,0x44,0xf,0x6d,0x9d,0xe,0x7,0x88,0x71,0xec,0xac,0x0,
+ 0x2a,0x22,0xce,0xdc,0x7e,0xe0,0x2c,0x82,0x86,0xf6,0xea,0xe2,0x2a,0xde,0x95,0x60,
+ 0x92,0x39,0x66,0x5c,0x6d,0xf,0xe9,0x34,0xe,0x76,0x2c,0x94,0xca,0x2e,0x43,0xee,
+ 0x47,0xd4,0xc8,0x8b,0x31,0x93,0xd4,0x37,0x39,0x96,0x3a,0xe0,0x98,0x4b,0x24,0xd9,
+ 0x44,0x2e,0xe4,0xe5,0x32,0x9e,0x12,0x22,0xc7,0x4e,0x65,0x89,0x38,0x49,0xc6,0x7a,
+ 0x8b,0xa2,0x30,0x74,0xda,0xb2,0xaa,0x50,0x96,0x95,0xdc,0x5f,0x94,0x85,0x62,0x55,
+ 0x95,0x4f,0xbc,0xc3,0x68,0x0,0xa4,0xa9,0xd3,0x3,0x10,0xce,0x41,0x40,0x50,0x14,
+ 0xb2,0xa5,0xd6,0xb7,0xee,0xc0,0x77,0xd1,0x6e,0x5,0x68,0x5,0xbe,0x62,0x69,0x55,
+ 0xb8,0xb7,0xb9,0x85,0x3b,0x1b,0xf7,0xe0,0x72,0xfb,0xb1,0xc1,0x83,0x10,0x82,0x56,
+ 0xe0,0x63,0x79,0x71,0x11,0x97,0xd6,0xce,0xe1,0x4f,0x5f,0x7e,0x9,0xe7,0x57,0x56,
+ 0x71,0xe9,0xfc,0x39,0x2c,0x2d,0x2c,0x60,0xaa,0xdb,0x85,0xef,0x79,0xd8,0x1f,0xc,
+ 0xf0,0xca,0xb7,0x5e,0xc5,0x37,0xbe,0xf3,0x8f,0xb8,0x7e,0xe3,0xe6,0x13,0x4f,0xc9,
+ 0xd3,0x7e,0x5b,0x2,0xe2,0x7e,0x51,0x17,0x25,0xca,0xa4,0xae,0x1,0x91,0x93,0x7e,
+ 0xcc,0x19,0x63,0xc6,0xe,0x5d,0x6b,0x28,0x26,0x26,0x86,0x42,0x3a,0xd,0x4c,0x28,
+ 0xc0,0xcd,0x41,0x5f,0x53,0x74,0x13,0x18,0xe5,0xb7,0x6d,0x5b,0x70,0x6c,0xae,0xbc,
+ 0xa6,0x74,0x6e,0x6,0x1d,0x83,0x46,0xad,0x6b,0xd1,0x5f,0x5b,0x33,0xb8,0xb4,0x10,
+ 0x50,0x77,0x19,0x7a,0x57,0x98,0xe5,0x5,0xb2,0x3c,0x57,0xda,0xc,0xf9,0x43,0x28,
+ 0x6a,0x6d,0x9a,0xe7,0xc8,0xf3,0xa2,0x26,0xe0,0xab,0x9e,0xea,0xd7,0x49,0x3,0x20,
+ 0x4d,0x3d,0x76,0xb9,0xae,0x3,0x42,0x80,0xa2,0x28,0x41,0x88,0x54,0x5b,0xfb,0x8e,
+ 0x83,0x20,0xf0,0xe1,0xb9,0xe,0x2c,0x4b,0x8e,0xb7,0x3e,0xd9,0xd8,0xc2,0xe7,0xb7,
+ 0x6f,0x3,0x0,0x2e,0x9f,0x5b,0x5,0xa5,0xe4,0xa1,0xe6,0x8a,0xf,0x2,0xab,0x99,
+ 0xa9,0x29,0x5c,0x3a,0x7f,0xe,0x2f,0x5c,0xbd,0x8a,0xcb,0xe7,0x2f,0xe0,0xda,0xe5,
+ 0x4b,0x58,0x5d,0x5a,0xc2,0xec,0xf4,0x34,0x5a,0x41,0x80,0xa2,0x28,0xf0,0xdd,0x1f,
+ 0xbe,0x8e,0xaf,0xbd,0xf2,0xa,0x7e,0xf9,0xdb,0xdf,0x3e,0x71,0x2d,0x2,0x55,0x49,
+ 0x8c,0x9e,0xe7,0xc1,0xb6,0xa8,0xb1,0x61,0xd7,0x7c,0x7d,0x50,0x2,0x1,0x69,0x77,
+ 0x2f,0x88,0x62,0x65,0x35,0x2f,0xa3,0xc7,0x6,0xc,0xed,0xc3,0x65,0xa9,0x78,0x61,
+ 0x8b,0x59,0xb5,0x7d,0xc3,0x81,0xfc,0x8c,0x3,0x1d,0xc6,0x98,0x2d,0x6,0x10,0x42,
+ 0x8d,0x90,0xcf,0x56,0x39,0x36,0xb2,0xe3,0x60,0x66,0xb1,0x4e,0x29,0x35,0xa1,0x4e,
+ 0xda,0xa1,0xb6,0x2c,0xe5,0xd7,0xa2,0x3a,0xc6,0x99,0x31,0x38,0xc6,0xc6,0x84,0x18,
+ 0xc0,0x88,0xa3,0x48,0x9,0xf4,0xe4,0xa8,0xb7,0xaa,0x24,0x68,0x68,0x45,0x78,0x9a,
+ 0xe5,0xc8,0xf2,0x4c,0x75,0x18,0x67,0x8b,0x64,0xd1,0x0,0x48,0x53,0x8f,0xff,0xe2,
+ 0x61,0xc,0x50,0x5e,0x3f,0x3a,0xb5,0x2f,0xf0,0x3d,0x78,0xe,0x7,0xa3,0x14,0x49,
+ 0x92,0xe2,0xce,0xfe,0x26,0x36,0x54,0x4e,0x38,0x63,0xc,0x95,0xa8,0x60,0x31,0xb,
+ 0x59,0x75,0x34,0x4b,0x74,0x4a,0x9,0x3c,0xd7,0xc3,0xea,0xf2,0x12,0x2e,0x9d,0x3b,
+ 0x87,0xe7,0xaf,0x5c,0xc1,0xb5,0x4b,0x97,0x70,0x61,0x75,0xd,0xcb,0x8b,0x8b,0x98,
+ 0xea,0x76,0xe1,0x38,0x1c,0xd7,0x6f,0xdc,0xc4,0xd7,0xbf,0xf5,0x2d,0x7c,0xe7,0xb5,
+ 0xd7,0xb0,0xb1,0xbd,0x7d,0xe2,0x82,0xc0,0x87,0x7e,0x8f,0x2a,0xdb,0xc3,0xf3,0x5c,
+ 0x38,0x8e,0x3,0x9b,0x52,0x14,0x65,0x21,0xf,0x2d,0xd5,0x75,0x40,0x75,0x1d,0xa6,
+ 0xb,0x11,0x92,0x61,0x23,0x9e,0xe0,0xf7,0xf9,0x2c,0x80,0x6,0x35,0x7,0xbd,0xd,
+ 0xdb,0xb6,0xcc,0x48,0x68,0xc,0x1a,0xd5,0x21,0x6e,0xb6,0x7,0x17,0xe0,0x63,0x17,
+ 0x5b,0xdb,0x96,0x63,0x29,0xdb,0xb2,0xd5,0x8e,0x44,0x66,0x67,0x10,0x4a,0x8c,0x39,
+ 0xa1,0xce,0xe6,0x28,0x6b,0x6,0x88,0x72,0x3c,0xa6,0x47,0x53,0x16,0x28,0xa1,0xa8,
+ 0x84,0xd2,0x5a,0xa4,0x12,0x14,0xf2,0x22,0x47,0xa1,0x3a,0xe,0xbd,0x4,0xcf,0x73,
+ 0xc9,0x92,0xca,0x8a,0x62,0xc2,0xb0,0xf0,0xac,0x5e,0x24,0x1a,0x0,0x69,0xea,0xb1,
+ 0xf,0x4d,0xe9,0x21,0x25,0x7f,0xad,0xd3,0xfb,0xb4,0x31,0x61,0x92,0xa6,0xd8,0xda,
+ 0xdd,0xc3,0x7e,0x7f,0x68,0xb8,0xe7,0x95,0x62,0x91,0x70,0x6e,0x1f,0x29,0x53,0xc3,
+ 0xb2,0x2c,0x4c,0xf5,0xba,0x38,0xb7,0xb2,0x82,0x97,0xae,0x5d,0xc3,0xd5,0x8b,0x17,
+ 0x71,0xf5,0xe2,0x25,0xac,0x2c,0x2e,0x62,0x6e,0x66,0x6,0x9d,0x4e,0x1b,0x79,0x96,
+ 0xe1,0x5b,0xff,0xf2,0x3d,0x7c,0xfd,0xd5,0x57,0xf1,0xbb,0xf7,0xde,0x3b,0x11,0xe3,
+ 0xc5,0x47,0xe9,0x38,0x38,0xe7,0x26,0x88,0xca,0x62,0xf2,0xc6,0xa,0x0,0x65,0x55,
+ 0x1a,0xf1,0x18,0x8,0x20,0x8,0xa0,0xd6,0x20,0xb5,0x12,0x0,0xe8,0x13,0x5,0xbb,
+ 0xb3,0x3a,0x9a,0xaa,0x3b,0xdb,0xca,0x6e,0xa0,0x1e,0xb7,0x7a,0xc0,0xa0,0x50,0x8f,
+ 0xa5,0x80,0xb1,0x6a,0x1b,0x30,0xcb,0x6f,0x6e,0xdb,0x32,0xf3,0x45,0x5,0x86,0x59,
+ 0xa,0x30,0x68,0x4d,0xbf,0xa2,0x55,0xdd,0x7a,0xfc,0x49,0xa9,0xb4,0xed,0xb1,0x6d,
+ 0x4b,0x76,0x19,0x4a,0x58,0x58,0x56,0x2,0x59,0x9e,0x21,0xcb,0x72,0xe4,0x45,0x81,
+ 0xd4,0x50,0x68,0x4b,0x64,0x79,0x2e,0xc1,0x22,0x97,0x4b,0xef,0x4c,0x69,0x36,0xaa,
+ 0x67,0x68,0x74,0xd9,0x0,0x48,0x53,0x8f,0x7d,0x78,0x32,0x23,0x86,0x2,0x7c,0xd7,
+ 0x85,0xab,0x96,0xea,0x51,0x92,0x60,0x63,0x7b,0x17,0x71,0x92,0x1e,0x6a,0x81,0xe1,
+ 0xd8,0x36,0xc2,0x2f,0x38,0x34,0x7c,0xcf,0xc3,0xd2,0xfc,0x3c,0x2e,0x9d,0x3f,0x87,
+ 0xab,0x97,0x2e,0xe1,0xa5,0x6b,0xcf,0x61,0x75,0x69,0x9,0x2b,0x4b,0x4b,0xe8,0x75,
+ 0x3a,0xe0,0xb6,0x8d,0xdf,0xfc,0xfe,0x3d,0x7c,0xf3,0x3b,0xdf,0xc1,0xbf,0xa8,0x78,
+ 0xdb,0x27,0xd5,0xfa,0x33,0x4a,0xc1,0x1d,0x15,0x7b,0xeb,0x38,0x63,0xff,0x22,0x2a,
+ 0x77,0x40,0x0,0x50,0x14,0x39,0x0,0x6,0x42,0xd4,0x18,0x8b,0x12,0x54,0x15,0x1,
+ 0x29,0x9,0x2a,0x42,0x30,0x1e,0xae,0x55,0xcf,0xa4,0xb0,0xf0,0xb8,0xa0,0x51,0x4f,
+ 0xea,0xd3,0xc1,0x48,0x75,0xcd,0xc5,0x83,0xf4,0x19,0x1a,0x34,0x28,0xc6,0xa6,0x84,
+ 0xb6,0x6d,0x83,0xab,0x70,0x33,0x6e,0xdb,0x13,0xb4,0x59,0xfd,0x75,0x85,0xa2,0xc5,
+ 0x56,0xa5,0x34,0xd,0x24,0x44,0x76,0xd8,0xae,0xc3,0xd,0xd3,0x8a,0x2a,0x4d,0x4f,
+ 0x5e,0x14,0x28,0x8a,0xc,0x49,0x9a,0xca,0x8e,0x42,0xb1,0xa2,0xf4,0xee,0x22,0xcb,
+ 0x72,0xa4,0x79,0x81,0xbc,0xc8,0x8d,0x5e,0xe3,0x99,0x9d,0x42,0x34,0x2f,0xd7,0xa6,
+ 0x1e,0xa7,0x38,0x97,0x6f,0x44,0xf9,0x7e,0x95,0x8a,0x6b,0x4a,0x29,0xc2,0x51,0x84,
+ 0xed,0xdd,0x7d,0x24,0xf,0xe8,0x4,0x84,0x90,0xc,0xa5,0x87,0x1,0x53,0xb7,0x23,
+ 0xd,0x10,0xaf,0x5e,0xba,0x84,0x97,0x9e,0xbb,0x86,0x73,0x2b,0xab,0xb8,0x72,0xfe,
+ 0x3c,0xa6,0xa6,0xa6,0xd0,0x69,0xb5,0x90,0xa4,0x29,0xbe,0xf3,0xda,0xf7,0xf1,0xff,
+ 0xfd,0xf5,0xd7,0x71,0x7b,0x7d,0xfd,0xd8,0x9,0x81,0x8f,0x72,0xb0,0x71,0xce,0xd1,
+ 0xa,0x7c,0xb8,0xdc,0x1,0xb7,0x99,0x61,0xe8,0xc8,0x51,0x88,0x6d,0xac,0x5d,0xc2,
+ 0x28,0x6,0x50,0x49,0xda,0x2e,0x15,0x10,0x60,0x10,0x4a,0x41,0x5c,0x94,0x95,0x1c,
+ 0x6b,0x15,0xf2,0xb0,0x62,0x42,0x3c,0xf5,0xcb,0xd2,0x27,0xd5,0x69,0x70,0xce,0xd,
+ 0x3d,0x5c,0xbf,0xbe,0xc,0xd,0x56,0x88,0x3,0xd4,0x5b,0xa1,0xd8,0x55,0x63,0x9b,
+ 0xf,0x4a,0xc7,0x5d,0x86,0x6d,0x5b,0xf0,0x1c,0xc7,0x84,0x2d,0x59,0x2a,0x70,0x89,
+ 0x10,0x82,0xaa,0xe6,0x9,0xa5,0x1f,0x7b,0x46,0xa9,0xe9,0x4e,0x5c,0x67,0x6c,0xbd,
+ 0x5f,0x89,0xa,0x69,0x9a,0x2b,0x60,0x90,0xfb,0xa,0x6d,0x38,0x98,0x66,0x39,0xd2,
+ 0x34,0x93,0x9a,0xd,0x5,0x26,0x5f,0xa5,0xb,0x41,0x3,0x20,0x4d,0x3d,0x72,0xd9,
+ 0xb6,0x85,0xc0,0xf7,0xc0,0x98,0x65,0x6e,0x7c,0x10,0xc0,0xf6,0xee,0x1e,0xf6,0x6,
+ 0xe1,0x43,0x97,0xd7,0x42,0x8,0xa3,0xcc,0x3d,0x78,0x80,0xb8,0x8e,0x83,0xb9,0x99,
+ 0x19,0x5c,0xbd,0x74,0x11,0xcf,0x5d,0xbe,0x8c,0x4b,0xe7,0xce,0xe3,0xf2,0xf9,0xf3,
+ 0x98,0x9f,0x9d,0xc5,0xcc,0xf4,0x34,0x20,0x4,0x7e,0xf2,0xe6,0x9b,0xf8,0xab,0xbf,
+ 0xff,0x26,0x7e,0xf9,0x9b,0xdf,0x9e,0x9a,0x7f,0xd5,0x61,0xa0,0xe6,0x3a,0xe,0x2,
+ 0xdf,0x83,0xeb,0x38,0xb0,0x6d,0x6,0x4a,0x28,0x6c,0xc6,0xc0,0xb9,0x54,0x31,0x7b,
+ 0xe,0x97,0x37,0x5d,0x5b,0x8e,0xe7,0x24,0x63,0xa7,0x66,0x75,0xae,0xf,0x2e,0xc5,
+ 0xf7,0xcf,0xf2,0x1c,0x34,0xcb,0x8c,0x80,0xd,0x84,0x18,0xd3,0xbb,0xaf,0x4a,0x69,
+ 0x1d,0x84,0xce,0xd0,0x18,0x7b,0x3c,0xd5,0x46,0x51,0xf7,0xa9,0xbf,0xc5,0xe4,0x18,
+ 0x95,0x52,0x50,0xaa,0x96,0xdf,0x2a,0x26,0x98,0x2b,0x7d,0x86,0xb6,0x5b,0xd7,0x5d,
+ 0x8b,0xb6,0x0,0x29,0x4d,0x97,0x41,0x60,0x59,0xc,0xbe,0xe7,0xc9,0xb,0x91,0x8a,
+ 0x30,0x2e,0x4b,0x29,0xe2,0xcb,0xf2,0x1c,0x49,0x9a,0xa9,0x31,0x94,0x4,0x88,0x24,
+ 0x4d,0x91,0x15,0x5,0xd2,0x34,0x47,0x9a,0x67,0xcf,0x7c,0x87,0xd1,0x0,0x48,0x53,
+ 0x27,0xe,0x1e,0x72,0x61,0xce,0xd5,0x1,0x29,0x9d,0x3f,0xf7,0x7,0x43,0xf4,0x87,
+ 0xe1,0x17,0xbe,0x99,0x2a,0x21,0x40,0xd4,0xe8,0xab,0x7e,0x40,0xb7,0x83,0x0,0x2b,
+ 0x4b,0x4b,0xb8,0x72,0xe1,0x2,0xae,0x5d,0xbe,0x8c,0x2b,0x17,0xce,0x63,0x75,0x69,
+ 0x9,0xb,0x73,0x73,0xf0,0x3d,0x1f,0xf7,0x36,0x37,0xf1,0xcf,0x3f,0xf8,0x1,0x5e,
+ 0xfd,0xde,0xf7,0xb0,0xbe,0xb1,0xf1,0x44,0x18,0x56,0x94,0x52,0x38,0xe,0x97,0x71,
+ 0xb7,0x8e,0x3,0xce,0x95,0x6b,0x2a,0x63,0xe0,0xea,0x71,0xe0,0xca,0xaa,0x9d,0xdb,
+ 0x6a,0xcc,0xc1,0x98,0xb9,0xcd,0xa,0x21,0x26,0xc2,0x80,0xf4,0x8d,0x5a,0x1e,0x44,
+ 0x99,0xa4,0x83,0x22,0x95,0x7,0x66,0x9,0x75,0x70,0x3e,0x5b,0x33,0xf2,0x83,0x97,
+ 0x4,0xdd,0x21,0xd8,0x4a,0x9f,0xc1,0xe8,0x98,0x12,0x6b,0x6e,0xee,0x75,0xd0,0x98,
+ 0xd0,0x65,0xc0,0x68,0x2f,0x6c,0x35,0x92,0x72,0xb8,0x7a,0xfc,0xb5,0xbd,0x3a,0x53,
+ 0xbe,0x51,0x94,0x8c,0x3d,0xa3,0xca,0x12,0x55,0x29,0xbf,0x96,0x65,0x31,0xb8,0xae,
+ 0x63,0x3a,0xd,0xc6,0xb4,0xf2,0x5b,0x20,0x49,0x33,0xa4,0x59,0xed,0x47,0x9a,0x21,
+ 0x53,0xe2,0xbe,0x34,0xcb,0xcc,0x88,0xaa,0x2c,0xab,0x66,0xe4,0xd8,0x0,0x48,0x53,
+ 0x8f,0xfa,0xe6,0xb7,0x2d,0xb,0xae,0xc3,0xe5,0xb2,0x9c,0x73,0x39,0x9e,0x11,0xc0,
+ 0xce,0x5e,0x5f,0xa,0xf5,0x8e,0xf0,0x75,0xb4,0xfd,0xf5,0x78,0x14,0xc6,0x31,0xdd,
+ 0xeb,0xe1,0xd2,0xb9,0x73,0xb8,0x72,0xe1,0x2,0xae,0x5c,0xbc,0x88,0xb,0x6b,0x6b,
+ 0x58,0x5a,0x58,0x40,0xaf,0xdb,0x81,0x10,0xc0,0x7f,0xbc,0xf1,0x6,0xbe,0xf6,0xca,
+ 0x2b,0xf8,0xf8,0xfa,0x75,0xa4,0xc7,0x74,0xeb,0x3d,0x7a,0xc7,0xc1,0xe1,0xfb,0x3e,
+ 0x7c,0xd7,0x51,0xb7,0x59,0x2a,0xf,0x2d,0x5b,0x3e,0x6,0xe,0xe7,0x66,0x4c,0xa2,
+ 0xe7,0xe3,0xb4,0x96,0xcb,0xc0,0x14,0x90,0x58,0x8c,0x99,0xd9,0xbb,0x16,0x17,0xe6,
+ 0x45,0x61,0xc0,0x44,0x5e,0x8f,0x5,0x48,0x4e,0x50,0x10,0x82,0x2,0x25,0x48,0x55,
+ 0x3d,0x31,0xc5,0xfc,0x93,0x2,0xd,0xcd,0x9a,0x92,0x19,0x1a,0xba,0x3,0x1d,0x33,
+ 0xa5,0x4c,0xe7,0xa5,0xcc,0xa,0xc7,0x49,0x7a,0x63,0x21,0x9f,0x7e,0xfd,0xe9,0x2e,
+ 0x43,0x83,0x36,0x53,0xf4,0x5d,0x69,0x97,0x2f,0x5,0x7a,0x45,0x56,0x40,0x54,0x72,
+ 0xf9,0x6d,0x59,0xc,0x8e,0x27,0x9f,0x33,0xd,0x30,0x72,0x97,0x91,0x63,0x14,0xc7,
+ 0x48,0xd3,0xc,0x71,0x92,0x22,0xcb,0x73,0xa4,0x69,0x8e,0x28,0x4d,0xd4,0xcf,0x33,
+ 0xe4,0x45,0x39,0x91,0xe1,0xd2,0x54,0x3,0x20,0x4d,0x3d,0xc6,0x21,0xc0,0x55,0x28,
+ 0x94,0xe7,0xba,0xe0,0xb6,0xa5,0xbc,0x7e,0x24,0x80,0x24,0x69,0x7a,0x64,0x1a,0xa2,
+ 0x9e,0x50,0x30,0x4a,0xe1,0x79,0x1e,0x96,0xe7,0xe7,0x71,0x7e,0x6d,0xd,0xd7,0x2e,
+ 0x5d,0xc2,0xc5,0x73,0x6b,0x58,0x5d,0x5a,0xc6,0xdc,0xcc,0xc,0x5c,0xc7,0xc1,0x87,
+ 0x9f,0x7c,0x8a,0xef,0x7c,0xff,0xfb,0xf8,0xf1,0x9b,0x6f,0x62,0x67,0x77,0xf7,0x9,
+ 0x8c,0x54,0x28,0x1c,0xee,0x20,0xf0,0x7d,0x78,0x9e,0x3,0x8b,0x51,0x70,0xcd,0xbc,
+ 0xb1,0x6d,0x70,0xce,0xe1,0x70,0x5b,0xa6,0x18,0x2a,0xa1,0x58,0xdd,0x5a,0x3b,0x4a,
+ 0x13,0xec,0xec,0xf6,0xb1,0xb9,0xb3,0x2b,0x75,0x1,0x5c,0x8a,0xda,0x1c,0xd5,0xa5,
+ 0x58,0x4c,0xa6,0x37,0x12,0x2,0x94,0xa5,0x8d,0x9c,0x17,0x2a,0x4a,0xd4,0x36,0x87,
+ 0x25,0x21,0x72,0x84,0x42,0x4c,0x3e,0x43,0x75,0x66,0xac,0xb3,0xea,0x8a,0x6c,0xdd,
+ 0x75,0x71,0xb5,0x4b,0xd0,0xe2,0xbb,0x71,0x46,0xc6,0x61,0x69,0x8c,0x72,0x9f,0xc1,
+ 0x94,0xf3,0x2c,0x37,0x5d,0x6,0x37,0x9d,0x9e,0x6d,0x59,0x4a,0xd1,0x3d,0x76,0xc9,
+ 0x95,0x51,0xab,0x52,0xcc,0xa,0x21,0x60,0x59,0x16,0x2,0xcf,0x33,0x7f,0x47,0xfb,
+ 0x4b,0x49,0xe5,0x77,0x8a,0x24,0x49,0x11,0xa7,0xa9,0x4,0x8b,0x24,0x46,0x9a,0x15,
+ 0x48,0xb2,0x14,0x69,0x2a,0xb5,0x18,0xa7,0xe1,0x5a,0xdb,0x0,0x48,0x53,0x5f,0x79,
+ 0xf0,0x70,0x5d,0x39,0xc6,0x21,0x52,0xfc,0x61,0x28,0x8f,0x8f,0x32,0x3,0x16,0x0,
+ 0x4,0x25,0xe8,0x75,0xbb,0x58,0x9c,0x9f,0xc3,0xd5,0x8b,0x97,0x70,0x61,0x75,0x15,
+ 0x17,0xcf,0x9d,0xc3,0xe2,0xfc,0x3c,0xa6,0xa7,0x7a,0x10,0x42,0xe0,0xdf,0x7f,0xfe,
+ 0x73,0xfc,0xcd,0xb7,0xbf,0x8d,0x4f,0x6f,0xdc,0x38,0x75,0xd7,0x5c,0xaa,0x97,0xe3,
+ 0xad,0x0,0xbe,0xe3,0x80,0x3b,0x1c,0x16,0xa5,0xb5,0xb9,0x7a,0xed,0x10,0xb3,0xad,
+ 0x9,0x81,0x19,0x0,0x64,0x79,0x8e,0xdb,0xf7,0xb6,0x70,0xfb,0xee,0x6,0x76,0xf6,
+ 0xfa,0x10,0x0,0x56,0x16,0xe7,0x10,0x78,0xae,0xca,0x7f,0xb0,0x8c,0x57,0x92,0xbc,
+ 0x68,0x93,0x49,0x4d,0x83,0x4a,0x75,0x34,0x89,0x7e,0xac,0x44,0x59,0xd0,0x43,0xc2,
+ 0x80,0x9e,0x4e,0xa7,0xdb,0xba,0xab,0x2d,0x3d,0x60,0xe,0xa8,0x75,0x14,0xf2,0x7b,
+ 0xaf,0x26,0xb4,0x19,0xba,0x1,0xd3,0xc9,0x7c,0xda,0x2a,0xc4,0x56,0x4b,0x6c,0xd7,
+ 0x74,0x79,0xb6,0x51,0x81,0xb,0x65,0x1,0xa2,0xc7,0x49,0x55,0x55,0x99,0xee,0xc4,
+ 0xe1,0x5c,0x45,0x14,0x6b,0x53,0x42,0x21,0x47,0x51,0xb9,0x1c,0x47,0xc5,0xb1,0x4,
+ 0x8e,0x28,0x4e,0x24,0x80,0x64,0x39,0xb2,0x2c,0x3b,0xf3,0x5a,0x8c,0x6,0x40,0x9a,
+ 0x7a,0x2a,0x4b,0x2b,0xab,0x1d,0x6e,0x1b,0x3a,0xa3,0xa8,0x4,0xfa,0x61,0x88,0x4e,
+ 0xbb,0x65,0x6c,0x22,0x8e,0x7a,0xa8,0x51,0x4a,0x31,0x1c,0x45,0xe8,0xb4,0x5a,0xb8,
+ 0xb0,0xb2,0x86,0x73,0x2b,0xcb,0xb8,0x7c,0xfe,0x2,0x96,0x16,0x16,0x30,0x37,0x3b,
+ 0x3,0x97,0x3b,0xf8,0xe8,0x93,0x4f,0xf0,0x57,0x7f,0xff,0xf,0xc7,0x36,0x5b,0x3c,
+ 0xf2,0xa8,0xca,0x75,0xd0,0xe,0x2,0x99,0x8f,0xae,0xfe,0x8d,0xbc,0x76,0x90,0x39,
+ 0x8e,0x6d,0xba,0x10,0xc6,0x2c,0x30,0x3a,0xee,0x12,0xf6,0x7,0x21,0xee,0x6e,0x6e,
+ 0xe3,0xe6,0xfa,0x3d,0xc,0xc2,0xd1,0x64,0x52,0x5f,0x29,0xc6,0xcc,0x1f,0x26,0x17,
+ 0xb9,0xd2,0xdf,0x48,0xaa,0x90,0xab,0xaa,0x2,0xc1,0x38,0xca,0x54,0xd4,0x3c,0xb3,
+ 0xca,0x8a,0xa1,0x62,0x95,0x71,0x65,0xad,0xaa,0xf1,0xcf,0xeb,0x39,0xdb,0x5f,0x56,
+ 0x18,0x95,0xa6,0xbf,0x6a,0x1b,0x74,0xc9,0x72,0xb2,0xd4,0x8,0xaf,0x3e,0x8a,0x82,
+ 0xea,0xa0,0xea,0xf6,0xe8,0x7a,0x97,0x41,0xc0,0xa8,0xf4,0x87,0xe2,0xdc,0x36,0x63,
+ 0x51,0x47,0x8d,0xa7,0xf4,0x2,0x5c,0xef,0x41,0xe4,0x52,0xbb,0x30,0x76,0x21,0xb6,
+ 0x65,0xa1,0x1d,0xf8,0x6a,0x94,0x65,0x4b,0x91,0x6a,0x55,0x21,0xcb,0xb,0x44,0x71,
+ 0x82,0x51,0x14,0x23,0x4a,0x52,0xc4,0x49,0x8a,0x38,0x49,0x90,0xa4,0x29,0xa2,0x44,
+ 0xd2,0x6e,0x9b,0xe,0xa3,0x1,0x90,0xa6,0x9e,0x8,0x78,0xc8,0x1b,0xb7,0xa3,0x18,
+ 0x2a,0x65,0x59,0x62,0x7f,0x18,0x22,0x49,0x52,0xb4,0x5a,0x1,0xa0,0xe6,0xce,0x47,
+ 0x79,0x2b,0x32,0xc6,0xd0,0xa,0x2,0x74,0x82,0x0,0x2b,0xb,0xb,0x38,0xb7,0xba,
+ 0x8a,0x95,0xc5,0x45,0xcc,0x4e,0x4f,0x21,0xf0,0x7d,0xec,0xec,0xee,0xe1,0x67,0xbf,
+ 0x7c,0xb,0x3f,0xfd,0xe5,0xdb,0x32,0xf,0xfd,0x14,0x77,0x0,0x4c,0x59,0x4e,0xb4,
+ 0x2,0xf,0x81,0xef,0xab,0x25,0x39,0x37,0x4b,0x71,0x5b,0x19,0xdf,0x49,0x1,0xdb,
+ 0xf8,0x36,0xd,0x1,0xe4,0x55,0x89,0xfd,0xfe,0x10,0x37,0xee,0xdc,0xc5,0xf6,0xee,
+ 0x3e,0x86,0xa3,0xe8,0xbe,0x85,0xbe,0x10,0x2,0xa5,0x28,0xc7,0xb6,0xde,0xc0,0x44,
+ 0x2a,0x5c,0x59,0x8e,0xd9,0x56,0xda,0xdd,0x15,0x90,0xfb,0x11,0x4a,0x29,0x58,0x35,
+ 0x99,0xf5,0x20,0x2a,0x49,0x25,0x2d,0x6b,0xc1,0x41,0xa2,0xaa,0x5,0x54,0xd5,0x6c,
+ 0x3b,0xea,0x87,0xf7,0x38,0x5a,0xf5,0x38,0x1d,0xe8,0xb8,0x63,0x62,0x4a,0xa5,0x6d,
+ 0x69,0xfb,0x90,0x5a,0x9a,0x9e,0x26,0x0,0xe8,0x7f,0xbf,0xc9,0x5,0x37,0xb6,0xe5,
+ 0xc4,0xfc,0xfb,0x1c,0x87,0xc3,0xb1,0x65,0x57,0xe7,0xb9,0x8e,0x4,0x1,0xc5,0xc2,
+ 0xd2,0xe3,0xa6,0xbc,0x28,0x91,0x66,0xd2,0x68,0x50,0x33,0xf7,0xf4,0xc2,0xdc,0xe1,
+ 0xdc,0x68,0x43,0x84,0xd0,0xcb,0xef,0x11,0x46,0x71,0x82,0x28,0x8a,0x91,0xa4,0x19,
+ 0x86,0xa3,0x91,0x64,0x50,0xe5,0x4f,0x2e,0x1b,0xa3,0x1,0x90,0xa6,0x9a,0x2,0x54,
+ 0xae,0x81,0x6d,0xe,0x54,0xcb,0x62,0xc8,0xf3,0x1c,0x83,0x50,0xbe,0x29,0xe5,0xd8,
+ 0x87,0x8e,0x29,0xa8,0xf,0x79,0x63,0x12,0x40,0x69,0x27,0x2,0xcc,0xcf,0xce,0x60,
+ 0x71,0x6e,0xe,0xab,0x4b,0x4b,0x58,0x5a,0x58,0xc0,0x74,0xaf,0x7,0xc6,0x18,0xde,
+ 0xfd,0xe0,0x7d,0xfc,0xe0,0x47,0x3f,0xc2,0x1f,0xae,0x7f,0x86,0xfc,0x14,0xc7,0x55,
+ 0x7a,0x39,0xde,0xa,0x2,0x74,0xdb,0x6d,0x4,0xbe,0x87,0x96,0xef,0x23,0xf0,0x3d,
+ 0xf8,0x9e,0xb,0x47,0xdd,0x64,0x19,0x1b,0xe7,0x50,0xb,0x95,0x65,0x9e,0x66,0x39,
+ 0xee,0x6e,0x6e,0xe3,0xd6,0xbd,0xd,0xdc,0xdd,0xd8,0x46,0x96,0x65,0xf,0x5,0xce,
+ 0xfd,0x7e,0x88,0x95,0x85,0x79,0x93,0x71,0xad,0xf5,0x6,0xe3,0x19,0x7b,0x55,0x3,
+ 0x10,0xd,0x1e,0xd5,0x44,0x57,0x51,0xd7,0x3c,0x68,0x0,0xa9,0x94,0x4b,0x6b,0xa9,
+ 0xba,0x98,0x42,0x81,0x89,0x98,0xc8,0xe5,0x1e,0xeb,0x24,0x4c,0x43,0xa0,0xff,0xff,
+ 0x8b,0xce,0x50,0xcd,0x2a,0x1e,0xff,0x44,0x52,0x96,0xb9,0xad,0xe,0x79,0x36,0x6,
+ 0xc,0xfd,0xdc,0x1f,0x92,0xb2,0x48,0xd4,0x6c,0x4a,0x3b,0xd1,0xba,0x9c,0xc3,0x75,
+ 0x39,0x3c,0xc5,0xe0,0xe3,0x5c,0x2e,0xd5,0x99,0x1a,0x35,0x95,0xaa,0x7b,0xc8,0xf2,
+ 0x5c,0xc6,0xff,0xaa,0x2e,0x23,0xf0,0x3d,0xd5,0x99,0x58,0x2a,0x6b,0x5d,0x82,0xf0,
+ 0x28,0x8e,0x11,0xc5,0x29,0xa2,0x38,0xc6,0x20,0x8c,0x10,0xc7,0x31,0x46,0x71,0xa2,
+ 0x94,0xe0,0x72,0xb4,0xd5,0xc0,0x45,0x3,0x20,0x4d,0x3d,0x71,0xf0,0x90,0x37,0x3d,
+ 0x47,0x31,0x87,0x28,0x1,0xe2,0x38,0xc1,0x60,0x14,0x4d,0xec,0x22,0x94,0x80,0x17,
+ 0xe2,0x21,0x67,0x12,0xd3,0x23,0xa2,0x96,0xb4,0x76,0x5f,0x5e,0x98,0xc7,0xdc,0xcc,
+ 0x8c,0x89,0xb3,0xdd,0xda,0xd9,0xc1,0x4f,0xde,0x7a,0xb,0x1f,0x5f,0xff,0xc,0xfd,
+ 0xc1,0xe0,0xd4,0x6e,0x88,0x7a,0x54,0xd5,0x6d,0xb7,0xd1,0x6d,0xb7,0xd1,0x69,0x5,
+ 0xe8,0x75,0xbb,0x68,0x7,0x3e,0xda,0x41,0xb,0xbe,0x57,0x23,0x6,0x0,0x6a,0x5c,
+ 0x54,0xa2,0x2c,0xb,0x6c,0x6e,0xef,0xe1,0xce,0xbd,0x7b,0xb8,0xb1,0x7e,0xf,0x5b,
+ 0x3b,0x7b,0xc8,0xf2,0xec,0x48,0xb7,0xfa,0xa8,0x36,0x7e,0x13,0x42,0xd2,0x44,0x35,
+ 0x0,0x54,0xb5,0x7c,0x10,0xa6,0xb2,0x29,0x2a,0x42,0x0,0x41,0xcd,0x83,0x4b,0x40,
+ 0xcc,0x21,0x4c,0x6a,0xb7,0xfa,0xb2,0x14,0x35,0x17,0x57,0x69,0xf1,0x5d,0xa8,0x8e,
+ 0xa6,0xde,0x9d,0xd4,0x3b,0x93,0x31,0xc6,0x4f,0xa0,0xc9,0xf8,0xfb,0x9b,0xe8,0x36,
+ 0x6a,0xf0,0x41,0x94,0x5d,0x8b,0xe3,0xc0,0x66,0x16,0x8,0x25,0x86,0x25,0x85,0x89,
+ 0xf1,0xd9,0xe4,0xbf,0x47,0xef,0x75,0x3c,0xd7,0x31,0x1e,0x69,0x9e,0x61,0xb3,0x31,
+ 0x63,0xa6,0x99,0xe5,0x39,0xe2,0x22,0x45,0xa9,0x3a,0x4,0x8b,0x31,0x35,0x32,0xf4,
+ 0xe1,0x3a,0xdc,0x8,0x4e,0xcb,0xb2,0x42,0x92,0x66,0x88,0x92,0x14,0xc3,0x70,0x84,
+ 0x51,0x14,0x23,0x8c,0x62,0xc4,0x71,0x22,0xf3,0x33,0x8a,0xa2,0xe9,0x30,0x1a,0x0,
+ 0x69,0xea,0x4b,0x7f,0x31,0xa8,0xf9,0xbf,0xa3,0xd4,0xc0,0x84,0x0,0x71,0x92,0x61,
+ 0x30,0x1a,0xdd,0x37,0x52,0xaa,0xbb,0x9e,0x1e,0x56,0x5a,0x5c,0xe7,0x7b,0x1e,0xa6,
+ 0xbb,0x1d,0x4c,0xf5,0xba,0xe8,0xb4,0xdb,0xf0,0x5c,0x17,0x42,0x54,0x78,0xf7,0xc3,
+ 0xf,0xf0,0x9f,0xef,0x7f,0x88,0x9b,0xeb,0xeb,0xa7,0x36,0xae,0xd2,0xca,0xf1,0x6e,
+ 0xbb,0x8d,0x5e,0xa7,0x8d,0xf9,0xd9,0x19,0x74,0xda,0x6d,0x4c,0x77,0xbb,0x98,0xea,
+ 0x76,0xd1,0xa,0x2,0x49,0xd3,0x55,0x29,0x72,0xd2,0xdb,0xa8,0x44,0x9e,0xe7,0xd8,
+ 0xdc,0xde,0xc1,0x87,0xd7,0x6f,0xe0,0x77,0xef,0x7d,0x88,0xfe,0x30,0x7c,0x64,0xb5,
+ 0xbb,0x10,0x2,0xc3,0xd1,0x8,0xae,0xc3,0xcd,0xe,0xa3,0xee,0xb4,0x6a,0x7c,0xb2,
+ 0xa8,0x0,0x11,0x4,0x8c,0x8a,0xf1,0xe1,0x4d,0x25,0x13,0x89,0x68,0x4b,0x72,0x4a,
+ 0xc6,0x4e,0xb0,0x95,0xfc,0x1e,0xb,0x95,0x54,0x97,0x17,0x5,0xf2,0x52,0xba,0xba,
+ 0xca,0xf1,0x98,0xec,0x4e,0x4a,0x51,0x3,0x92,0xc3,0xa2,0x58,0x4d,0x8b,0x35,0xd9,
+ 0x7d,0x90,0xda,0xd,0x81,0x12,0x6a,0xa8,0xb7,0xc0,0xd8,0xf8,0x51,0xdc,0xb7,0x0,
+ 0xa7,0x4a,0x1f,0xa4,0xf7,0x65,0xe,0x7c,0xd7,0x35,0x3a,0xd,0xcb,0xb2,0x0,0x21,
+ 0x64,0x87,0x91,0x65,0x48,0xb2,0xcc,0xd0,0x94,0x2d,0x26,0x75,0x19,0xae,0xc3,0x4d,
+ 0xb7,0x2b,0x84,0x40,0x51,0x54,0x8,0x47,0x31,0x46,0x71,0x8c,0x70,0x14,0xa1,0x3f,
+ 0xc,0x31,0x8a,0x12,0xc4,0x89,0xec,0x32,0x9a,0x3d,0x46,0x3,0x20,0x4d,0x3d,0x45,
+ 0x65,0xdb,0xa,0x3c,0xd4,0x22,0xb9,0xaa,0x2a,0xf4,0x7,0x31,0x92,0x2c,0x3b,0xf4,
+ 0x66,0x47,0xa4,0x4b,0xdd,0x7d,0xe7,0x10,0xa5,0x4,0xdc,0xe6,0x52,0x47,0xe1,0xc9,
+ 0x5c,0x90,0x4e,0xab,0x85,0xc0,0x93,0xc0,0xb1,0x7e,0xef,0x1e,0x3e,0xfa,0xf4,0x33,
+ 0xdc,0xbe,0x7b,0xf7,0xd4,0x72,0x3a,0xb4,0x72,0xbc,0xd3,0x91,0x60,0x31,0x3f,0x3b,
+ 0x83,0x85,0xd9,0x39,0xcc,0x4c,0x4f,0x61,0x6e,0x7a,0x1a,0x53,0xbd,0xae,0x5a,0xc0,
+ 0xca,0xc3,0x8d,0x42,0x2e,0xb8,0xf7,0x87,0x3,0xdc,0xb8,0x75,0x1b,0x6f,0xfd,0xe6,
+ 0x77,0xf8,0xed,0x7b,0xef,0xa3,0x3f,0x3c,0x5e,0x8,0xd5,0xe6,0xf6,0x1e,0xa6,0x3a,
+ 0x1d,0xe5,0x83,0xa5,0x98,0x3e,0xa2,0xf6,0xf8,0x51,0xb9,0xf9,0x38,0x8,0x7a,0x5a,
+ 0x47,0xa2,0xfd,0xc6,0xe8,0x1,0xb1,0x9d,0xde,0xa5,0x14,0x65,0x89,0x22,0xd7,0xd6,
+ 0xe0,0x85,0x8c,0x3e,0x2d,0xa4,0x70,0x4e,0x76,0x3b,0x63,0x6,0x97,0xd0,0xb,0x78,
+ 0xfd,0x5c,0x1d,0xf6,0x9c,0xd6,0xa2,0x57,0x29,0xa5,0xa0,0xea,0x7b,0x98,0x48,0xe8,
+ 0x23,0x0,0xa3,0xc4,0x5c,0x36,0x5c,0xc7,0x81,0xe7,0xc9,0x4e,0xc3,0xf7,0x1c,0x70,
+ 0x4b,0x83,0x80,0xec,0xbc,0x92,0x2c,0xc7,0x28,0x4a,0xc,0x63,0x8a,0x31,0xa,0xcf,
+ 0x71,0x8c,0x29,0xa1,0xa5,0x28,0xb9,0x79,0x5e,0x22,0x49,0x52,0x84,0x51,0x84,0x7e,
+ 0x38,0x42,0x38,0x8a,0x30,0x18,0x8e,0xc,0x5b,0xaa,0xd1,0x62,0x34,0x0,0xd2,0xd4,
+ 0x53,0x58,0x3a,0xd3,0x59,0x72,0xee,0xe5,0x22,0xb3,0x28,0x4b,0x8c,0xd4,0x32,0xf2,
+ 0x81,0x7f,0x8f,0x92,0x3,0x47,0x1f,0xc,0xef,0x9f,0xab,0xf1,0x85,0xef,0xba,0x70,
+ 0xb9,0x3,0x42,0x9,0xe2,0x34,0xc5,0xe7,0xb7,0xd7,0xb1,0xb1,0xb5,0x35,0xc1,0x58,
+ 0x3a,0xe9,0x7f,0x8b,0xeb,0xc8,0x91,0xd9,0xcc,0x54,0xf,0xb,0x73,0x73,0x58,0x98,
+ 0x9d,0xc5,0xda,0xb2,0xcc,0xc,0x99,0x99,0x9a,0x92,0xa1,0x53,0xbe,0x67,0xf6,0x1d,
+ 0x55,0x55,0x62,0x7f,0x30,0xc4,0x7,0xef,0x7f,0x80,0xd7,0x7f,0xf2,0x53,0x7c,0x7a,
+ 0xe3,0x26,0xb6,0x77,0x77,0x4f,0x4,0xdc,0xf6,0x7,0x43,0xec,0xf5,0x7,0x98,0xee,
+ 0x75,0xef,0xef,0xd5,0x8,0x40,0x41,0x6b,0x3b,0x7,0x7d,0xeb,0x57,0xb,0x6b,0x2a,
+ 0xb5,0x10,0x94,0x50,0xa3,0xb9,0xd1,0x4b,0x63,0xd,0x28,0x94,0x28,0xd5,0x75,0x49,
+ 0x8d,0x9b,0x2c,0xa5,0xf2,0xd7,0x72,0xe1,0x2e,0xf7,0xb,0xda,0x5,0xb9,0xbe,0xdc,
+ 0x1e,0x7f,0xd4,0xdf,0xd9,0xf8,0x32,0x20,0x9f,0x5f,0xf5,0xdf,0x14,0x42,0xe5,0x7f,
+ 0xd7,0x85,0x94,0x8e,0x71,0x20,0xd6,0xdd,0xaa,0x65,0x59,0x10,0x42,0x2e,0xbf,0x23,
+ 0x35,0x5a,0x2a,0xca,0xd2,0x80,0xa0,0x66,0xb9,0x71,0xdb,0x36,0xdd,0x5e,0x92,0xa4,
+ 0xd8,0x1b,0xc,0x11,0xc5,0x31,0xfa,0x83,0x11,0xc2,0x28,0x92,0x4b,0xf0,0xec,0x6c,
+ 0x66,0x63,0x34,0x0,0xd2,0xd4,0x57,0xe,0x3c,0x64,0xe7,0x21,0xd9,0x56,0x94,0x52,
+ 0xe4,0x45,0x89,0x70,0x14,0x3d,0xf4,0x0,0x95,0x7,0x9c,0xf6,0x79,0x92,0x7b,0x13,
+ 0x9b,0x52,0xa3,0x17,0x71,0xd4,0xc2,0x94,0x73,0x1b,0x20,0x2,0xfb,0xfb,0x3,0x6c,
+ 0xee,0xee,0x62,0xbf,0x3f,0x38,0x15,0x85,0xf5,0x18,0x38,0x2,0xcc,0x4e,0x4f,0x63,
+ 0x61,0x76,0x16,0x2b,0x4b,0x8b,0x58,0x5b,0x5e,0xc1,0xdc,0xcc,0xc,0x56,0x16,0x17,
+ 0x31,0xd5,0xed,0xa0,0xab,0x46,0x68,0x96,0x25,0x95,0xcb,0x5b,0x3b,0xdb,0xf8,0xd1,
+ 0x2f,0xde,0xc4,0xbf,0xfe,0xc7,0x8f,0xf0,0xde,0xc7,0x7f,0xc0,0x30,0xc,0x4f,0xf4,
+ 0xfb,0x2a,0xab,0xa,0x9f,0xdd,0xbe,0xb,0x57,0x1d,0xb4,0xd2,0xf9,0x55,0x8e,0xac,
+ 0x6a,0xe1,0x14,0xa0,0x35,0xa6,0x93,0x89,0x48,0x55,0xac,0xa5,0xfa,0xc8,0xe8,0x3e,
+ 0xda,0x6e,0x2d,0xac,0x8a,0x51,0xa,0xc1,0x98,0x9a,0x29,0x11,0x50,0x52,0x82,0x55,
+ 0x54,0xed,0x6,0x34,0x80,0x4c,0xe6,0x63,0x1c,0xec,0x44,0xf4,0x88,0x4c,0x5f,0x10,
+ 0x6c,0x15,0xaa,0xe4,0x3a,0xe,0x2,0xcf,0x85,0xa7,0x1c,0x97,0x75,0x97,0xa,0xc8,
+ 0x7d,0x51,0x9a,0x49,0x45,0xb7,0xee,0x32,0x74,0x22,0xa3,0xf4,0xe,0xe3,0x8a,0xb1,
+ 0x45,0x90,0xe5,0x5,0x62,0x5,0x1a,0xc3,0x30,0xc4,0xfe,0x20,0x44,0x38,0x8a,0xc,
+ 0xd8,0x34,0xb6,0xf6,0xd,0x80,0x34,0x75,0x96,0xc0,0xc3,0xb2,0x4c,0xc6,0x1,0x21,
+ 0x4,0x69,0x96,0x61,0x14,0x27,0x47,0x7a,0x23,0x13,0xa2,0x6f,0xcf,0x14,0xed,0x56,
+ 0x0,0x21,0x4,0x6c,0x75,0xd8,0x68,0x1e,0x7f,0x9a,0x65,0xd8,0xde,0xdd,0x9b,0x60,
+ 0x6f,0x9d,0xf4,0xa8,0xca,0xe1,0x1c,0x9d,0x76,0xb,0xb3,0xd3,0xd3,0x98,0x9d,0x9e,
+ 0xc6,0x85,0xd5,0x55,0xac,0x2d,0x2f,0xe3,0xdc,0xca,0xa,0xe6,0x66,0x67,0x31,0x37,
+ 0x3d,0x8d,0xe9,0x5e,0xf,0x41,0xe0,0xc3,0xe5,0x1c,0x49,0x9a,0xe2,0xfa,0xcd,0x9b,
+ 0xf8,0xee,0xf,0x5f,0xc7,0x1b,0x6f,0xbf,0x83,0xf7,0x3e,0xfa,0x8,0xa3,0x38,0x3e,
+ 0xb5,0x9b,0x6e,0x92,0xa6,0xf8,0xec,0xd6,0x3a,0xce,0xaf,0x2c,0x82,0x73,0x3e,0x39,
+ 0x12,0x52,0x2,0x3a,0x43,0x71,0xd5,0x96,0xe5,0x86,0x1a,0x2b,0x8f,0x75,0xad,0xf9,
+ 0xa8,0xfb,0x43,0x69,0x5a,0x70,0x7d,0xb4,0x53,0x7,0x13,0xe9,0x4e,0x2b,0x40,0x2a,
+ 0x15,0x5e,0xf5,0x10,0xed,0x88,0xfe,0x7a,0x4,0x0,0xb3,0xc7,0x19,0x27,0xda,0xb6,
+ 0xc6,0x73,0x5d,0x43,0x6b,0x6,0x80,0x34,0xcb,0x10,0x8e,0x22,0xa3,0xcd,0xd0,0x56,
+ 0x23,0xe3,0xbd,0x7,0x57,0x6a,0xfb,0xa,0x49,0x9a,0x62,0x67,0xaf,0x8f,0x41,0x18,
+ 0xa2,0x3f,0xc,0x31,0x1c,0x45,0x88,0xe2,0xc4,0xb0,0xd1,0x9a,0xfe,0xa2,0x1,0x90,
+ 0xa6,0xce,0x58,0xe9,0xcc,0x66,0x47,0xef,0x0,0x28,0x41,0x14,0x27,0x48,0xd3,0xec,
+ 0xc8,0x8b,0x49,0xed,0xfb,0x24,0x3b,0x10,0x39,0xa6,0xd0,0x22,0x30,0x4a,0x29,0x6,
+ 0xc3,0x11,0xfa,0xc3,0x10,0x71,0x9a,0x9e,0xf8,0xe1,0xac,0xb3,0xd7,0x3b,0xff,0xc4,
+ 0xe3,0x5,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0xed,0x36,0xa6,0xba,0x1d,0x2c,
+ 0x2d,0x2c,0xe0,0xdc,0xf2,0x32,0x56,0x97,0x96,0xb1,0xb6,0xb2,0x8c,0xe5,0xc5,0x45,
+ 0x2c,0x28,0x7,0xdf,0x4e,0xab,0x5,0xdf,0xf3,0x0,0x0,0xbf,0xff,0xf0,0x43,0x7c,
+ 0xeb,0x7b,0xdf,0xc3,0xbf,0xfc,0xf0,0x75,0xac,0x6f,0x6c,0x20,0x8a,0xe3,0x27,0xf2,
+ 0x78,0xef,0xf,0x86,0x48,0xd2,0x14,0x4b,0xf3,0xb3,0x98,0x9b,0x9e,0x32,0x3e,0x59,
+ 0x75,0x8d,0xc5,0x38,0x5e,0x95,0x4c,0xc,0x93,0xf4,0x2e,0x41,0x2f,0xbf,0x8d,0x36,
+ 0x44,0xd9,0x8c,0x57,0x9a,0xbe,0xab,0xf6,0x13,0x1a,0x80,0x28,0xa5,0x6a,0xfc,0x44,
+ 0xc6,0x34,0x5b,0xfd,0x35,0xc,0x28,0x55,0xe6,0xf5,0xa0,0x95,0xdc,0xad,0xc0,0x1b,
+ 0x2f,0xc1,0x6d,0xb,0x20,0x4,0x79,0x91,0x23,0xcb,0xa,0x24,0x61,0xa4,0xba,0x8c,
+ 0x72,0xfc,0x1c,0xb4,0x2,0xa9,0xeb,0xe0,0x1c,0x42,0x54,0xc8,0xb2,0x2,0x83,0x61,
+ 0x88,0xbd,0xc1,0x10,0x83,0xa1,0x4,0x8d,0x48,0xd3,0x6b,0xcb,0xb2,0x19,0x49,0x35,
+ 0x0,0xd2,0xd4,0x59,0x7,0xf,0x3d,0xcb,0xb6,0xd4,0xb2,0x7c,0x14,0xa5,0x8f,0xc4,
+ 0x32,0x62,0x8c,0x81,0xe9,0x4c,0xf,0x2,0x35,0x7,0x67,0x60,0x94,0x21,0xc9,0x32,
+ 0xc,0x86,0x23,0xc,0x47,0xd1,0x89,0x8f,0x24,0x28,0x25,0x70,0xb8,0x83,0x4e,0xa7,
+ 0x83,0xe9,0x5e,0x7,0xcb,0xb,0x8b,0x58,0x5b,0x5a,0xc2,0x85,0xb5,0x35,0x9c,0x5b,
+ 0x59,0xc5,0xc2,0xdc,0x2c,0xa6,0xba,0x5d,0x74,0xdb,0x6d,0xcc,0xcf,0xcd,0x22,0xf0,
+ 0x7c,0x6c,0xef,0xed,0xe1,0xcd,0x5f,0xfd,0xa,0x7f,0xf7,0x4f,0xff,0x8c,0xd7,0x7f,
+ 0xf2,0x13,0xec,0xf5,0xfb,0x5f,0xca,0x21,0x96,0xa4,0x19,0x3e,0xbb,0xb5,0x8e,0xad,
+ 0x9d,0x3d,0xb4,0x5b,0x1,0x66,0xa6,0x7a,0x70,0x1d,0x79,0x5b,0x57,0x30,0x62,0x0,
+ 0xa5,0x5e,0xe2,0x40,0xb6,0xb7,0xfe,0x51,0x55,0x42,0x99,0x10,0x8e,0x97,0xe3,0x44,
+ 0x3,0x3b,0x5,0x84,0x50,0xfb,0x12,0xa3,0x8,0x17,0x13,0x39,0xe0,0x8c,0x32,0xe3,
+ 0xac,0xec,0xbb,0x32,0x8e,0xd7,0x56,0x97,0x9,0x8,0x82,0x34,0xcf,0xb0,0x3f,0xc,
+ 0x4d,0x40,0x92,0x36,0x25,0xf4,0x5d,0xae,0x3c,0xc1,0x38,0xa0,0x72,0x4c,0xc2,0x51,
+ 0x84,0x7b,0x9b,0x5b,0xd8,0xde,0x1b,0x60,0x10,0x4a,0xc0,0xc8,0xb2,0xfc,0x99,0x31,
+ 0x84,0x6c,0xaa,0x1,0x90,0xa6,0x50,0x8f,0xf4,0x94,0x5d,0x42,0x51,0x96,0x88,0xe3,
+ 0xe4,0x91,0x16,0xc6,0x32,0xa5,0xcd,0x86,0xad,0xc4,0x6f,0xa4,0xe6,0x3c,0x3b,0x18,
+ 0xc9,0xb9,0x76,0x96,0x9d,0x6c,0xc0,0x13,0x21,0x4,0x8e,0xc3,0xd1,0x6e,0xb5,0x30,
+ 0xdd,0xeb,0x61,0x71,0x6e,0xe,0xcb,0x8b,0x8b,0xb8,0x74,0xee,0x1c,0xce,0xad,0xac,
+ 0x60,0x65,0x71,0x9,0xb,0x73,0xb3,0xf0,0x3d,0xf,0x4,0xf2,0x46,0x7e,0xf3,0xf6,
+ 0x1d,0xfc,0xc7,0x1b,0x6f,0xe0,0x3f,0xde,0x78,0x3,0xef,0xfc,0xf6,0x77,0xd8,0xd9,
+ 0xdf,0x3f,0x75,0x4f,0xad,0xa3,0x54,0x18,0x49,0x6a,0xea,0xf6,0xde,0x3e,0x3c,0x95,
+ 0x31,0xe2,0x7b,0x2e,0x7c,0xd7,0x85,0xef,0xb9,0xe3,0x4e,0x4,0xc4,0x8c,0xb8,0xea,
+ 0x5d,0xc7,0x7d,0xca,0x73,0x61,0xb4,0x7c,0xe3,0xc7,0xb,0x6a,0xd7,0xa2,0x98,0x72,
+ 0x2,0x4a,0x9f,0xa1,0x94,0xf1,0xbe,0xe7,0x4a,0x71,0x9e,0xa3,0x3a,0x46,0x42,0x95,
+ 0xf2,0x3b,0x33,0xf9,0x17,0x1a,0x64,0x2d,0x8b,0xa1,0xdb,0x6e,0x29,0x4f,0x2f,0xf9,
+ 0x3c,0xa7,0x69,0x86,0xfd,0xc1,0x10,0xbb,0xfb,0x3,0xc,0x86,0x21,0xc2,0x28,0x96,
+ 0xe9,0x7c,0x45,0x21,0xa9,0xc3,0xcd,0x5b,0xad,0x1,0x90,0xa6,0x9e,0x31,0xf0,0xa0,
+ 0x14,0x36,0xb3,0x8c,0xe6,0xa1,0x28,0xb,0xc4,0x49,0x76,0xe4,0x2e,0x61,0x9c,0xe3,
+ 0x20,0x47,0x1d,0xba,0x3,0xa1,0x84,0x20,0x4b,0x53,0xc,0xc2,0x11,0xa2,0xe4,0x64,
+ 0xc7,0x55,0x7a,0x19,0xdb,0xa,0x7c,0xcc,0x4e,0xcf,0x60,0x61,0x6e,0x6,0xcb,0x8b,
+ 0x4b,0x72,0xcf,0xb1,0xb2,0x82,0xf3,0x2b,0xab,0x98,0x9f,0x9d,0xc1,0x54,0xb7,0x27,
+ 0xc7,0x70,0x51,0x84,0x77,0x3f,0xfa,0x0,0x3f,0xf9,0xc5,0x5b,0xf8,0xd1,0x2f,0x7e,
+ 0x81,0xcf,0x6e,0xde,0x42,0xf2,0x4,0xec,0xdf,0x1f,0xb5,0x84,0x90,0x99,0x20,0x79,
+ 0x5e,0x60,0x10,0x8e,0xc,0x30,0xeb,0x54,0x43,0x9d,0x6f,0xd1,0x6e,0xb5,0x26,0x4,
+ 0x75,0x80,0x5e,0x72,0xb,0x69,0xca,0x68,0xc0,0x4,0x13,0xc0,0xa2,0x3d,0xb6,0x34,
+ 0x3,0xca,0xe1,0x5c,0x59,0xb5,0x70,0xb8,0xae,0x63,0x82,0xad,0xb2,0x3c,0xc7,0x30,
+ 0x94,0xbb,0x8c,0xbc,0x28,0x1,0x8,0x95,0xa,0x68,0xc1,0xb1,0x39,0x6c,0x5b,0x1e,
+ 0xf,0x3a,0xef,0x65,0x30,0x1c,0x61,0xaf,0x3f,0xc0,0x70,0x34,0x42,0x14,0xa7,0x28,
+ 0xbf,0x62,0x1,0x58,0x4d,0x35,0x0,0xf2,0x15,0xed,0x3c,0x98,0xf2,0x77,0x92,0xcb,
+ 0xf2,0x24,0x9b,0xbc,0x65,0x1e,0xed,0xef,0x4b,0x1b,0x6d,0x6d,0xae,0x48,0xd5,0x12,
+ 0x9d,0x10,0x8a,0xe1,0x48,0xda,0x48,0x9c,0xe4,0x98,0x8d,0xdb,0x36,0xda,0xed,0x16,
+ 0x66,0x7a,0x3d,0xcc,0xcd,0xcc,0xe0,0xf2,0xf9,0xf3,0x58,0x51,0x99,0xe8,0x2b,0x8b,
+ 0x8b,0x58,0x98,0x9d,0xc3,0xdc,0xcc,0xc,0x3c,0xcf,0xc5,0xce,0xce,0xe,0xde,0xfc,
+ 0xd5,0xaf,0xf1,0x6f,0x3f,0xff,0x19,0x7e,0xfe,0xf6,0x3b,0xd8,0xd8,0x96,0x56,0x23,
+ 0x67,0xa9,0xb4,0xae,0x23,0x49,0x33,0x33,0x66,0xc,0xe3,0x14,0x2d,0xdf,0x83,0x6d,
+ 0xdb,0xa0,0x8a,0x36,0x6d,0xc6,0x5c,0xb5,0xdc,0xc,0xa2,0xac,0xd2,0x6d,0x6b,0x3c,
+ 0x96,0xe2,0xdc,0x56,0xb6,0x21,0xda,0xc9,0x96,0xa1,0x50,0x14,0x5b,0xe9,0x42,0x9b,
+ 0xa3,0x12,0x2,0x54,0xa5,0xf2,0xb5,0x7c,0xcf,0x68,0x32,0x8a,0xb2,0xc4,0x30,0x8a,
+ 0xd4,0x28,0x72,0x84,0xbd,0xc1,0xd0,0xc4,0xb6,0x56,0x65,0x63,0x11,0xd2,0x54,0x3,
+ 0x20,0x5f,0x9d,0x27,0x58,0xe5,0x56,0xd8,0x96,0x5,0x10,0xa8,0xb4,0xb5,0xa3,0x8d,
+ 0x98,0x34,0x53,0xcb,0x52,0xe0,0xa3,0x6f,0xc8,0xcc,0x52,0x4e,0xa9,0xfa,0xf3,0x28,
+ 0x39,0xb1,0x8e,0xc3,0xb6,0x2d,0xb4,0x5a,0x2d,0x4c,0x77,0xbb,0x58,0x9c,0x9b,0xc3,
+ 0xda,0xf2,0xa,0xce,0xaf,0xae,0xe2,0xc2,0xda,0x1a,0x16,0x66,0x67,0x31,0x37,0x3b,
+ 0x8b,0xe9,0x5e,0xf,0x9d,0x56,0xb,0x55,0x55,0xe1,0xc7,0xbf,0x78,0x13,0xff,0xf0,
+ 0xdd,0xef,0xe2,0xa7,0x6f,0xbd,0x85,0xfe,0x60,0x70,0xaa,0x5e,0x5a,0xa7,0x59,0xba,
+ 0xc3,0x73,0x5d,0x7,0x36,0x97,0x59,0x24,0x8c,0x4a,0x7d,0xc7,0x78,0xf4,0x26,0xee,
+ 0x1b,0x49,0x6a,0xe7,0xe0,0xc0,0xf7,0x8c,0x75,0x88,0xe7,0x3a,0x92,0xd6,0xb,0xa0,
+ 0x28,0x4a,0x8c,0x22,0xb9,0x93,0xd0,0x4b,0x6c,0x42,0xe5,0xe3,0x6c,0x5b,0x32,0x90,
+ 0x9,0x4,0xc8,0xb2,0x1c,0x5b,0x3b,0x3,0xb9,0xfc,0xe,0x43,0x8c,0x46,0x9,0x52,
+ 0xa5,0x18,0x6f,0x16,0xdf,0x4d,0x35,0x0,0xf2,0x15,0x2b,0x2,0x80,0x59,0xc,0xb6,
+ 0x65,0x83,0x29,0xef,0xa1,0x24,0xcb,0x8e,0x1c,0x5,0x2b,0x9d,0x68,0x2d,0x58,0x4a,
+ 0xdf,0xa1,0xa9,0xb9,0x65,0x21,0xb9,0xfc,0x8b,0x73,0xe3,0x43,0x5f,0x5b,0x5d,0x1c,
+ 0x7,0x38,0xb8,0x6d,0x4b,0xe0,0xe8,0x75,0xb1,0xb2,0xb8,0x84,0xd5,0xa5,0x45,0x5c,
+ 0x58,0x3b,0x87,0xb5,0x95,0x65,0x2c,0xcd,0xcd,0x63,0x7e,0x76,0x16,0x9d,0x4e,0x1b,
+ 0xbe,0xeb,0x61,0xfd,0xde,0x3d,0xfc,0xf4,0xad,0xb7,0xf0,0xdf,0xff,0xf6,0x6f,0xf1,
+ 0xfe,0xc7,0x1f,0x63,0x14,0x45,0x67,0xef,0xf9,0x51,0xbb,0x23,0xae,0x83,0xaa,0x94,
+ 0xb6,0xc2,0xec,0xd1,0xeb,0x9e,0x23,0x4a,0x36,0x42,0x29,0x33,0x9,0x87,0xbe,0x8a,
+ 0x65,0xd,0x7c,0xf,0xae,0xeb,0x48,0x77,0x5a,0x48,0xed,0x49,0x9c,0xa4,0x28,0x54,
+ 0xee,0x7a,0x59,0xa9,0x2e,0xc3,0xb6,0xe0,0x71,0x47,0x76,0x8e,0x10,0x48,0xb3,0x1c,
+ 0xbb,0xfd,0x3e,0x6,0xe1,0x8,0xbb,0x7b,0x3,0x84,0x51,0x64,0xe2,0x5a,0x9b,0x6a,
+ 0xaa,0x1,0x90,0xaf,0x32,0x78,0x28,0x75,0xb9,0x1c,0x5d,0x10,0x23,0xf6,0x3a,0x2a,
+ 0x2b,0xc6,0xaa,0x75,0x1d,0x5c,0xfd,0x5c,0x80,0x20,0x8e,0x13,0x84,0x51,0xac,0x4,
+ 0x71,0x74,0xe2,0xf0,0x3f,0xe,0x70,0xf8,0xbe,0x87,0xa9,0x4e,0x17,0xb,0xf3,0x73,
+ 0x58,0x59,0x5c,0xc4,0x85,0xd5,0x35,0xac,0x2c,0x2d,0x19,0x3a,0x6e,0xb7,0xd3,0x81,
+ 0xcd,0x18,0xb6,0x77,0x76,0xf1,0x9d,0xd7,0x5e,0xc3,0x2f,0xde,0x79,0x7,0x1f,0x7d,
+ 0xfa,0x29,0xf6,0x4f,0xd1,0x80,0xf1,0xd4,0x9e,0x17,0x95,0xa1,0xc1,0x39,0x87,0x63,
+ 0x8f,0x43,0x98,0xc8,0x81,0xe,0x83,0xa8,0xf1,0x20,0xa5,0xc4,0x74,0x7f,0x2e,0x1f,
+ 0xeb,0x32,0xf4,0x68,0x4a,0x9b,0x28,0x86,0x49,0x3a,0x6,0x0,0xd5,0x65,0x48,0x80,
+ 0xd2,0x5d,0x4c,0x89,0xc1,0x70,0x24,0x77,0x19,0xca,0x90,0xb0,0x11,0xf0,0x35,0xd5,
+ 0x0,0x48,0x53,0x87,0x82,0x87,0x4e,0xcd,0xcb,0x8b,0x2,0x59,0x5e,0x1c,0xe9,0xa0,
+ 0x35,0x9,0x79,0x6a,0xa1,0xab,0x69,0x9d,0x45,0x59,0x61,0x14,0xc5,0x48,0x95,0x2f,
+ 0x96,0x74,0xe9,0x1d,0xab,0x15,0xec,0x47,0xec,0x40,0xe4,0xa8,0xca,0x86,0xe7,0xb9,
+ 0x98,0xee,0x74,0x31,0x3b,0x33,0x8d,0xe5,0x85,0x45,0xc9,0xa8,0x5a,0x5a,0xc2,0xea,
+ 0x92,0xb4,0x1e,0x99,0xea,0xf5,0xc0,0x6d,0x1b,0xd7,0x6f,0xdc,0xc4,0xf7,0x5e,0xff,
+ 0x21,0x7e,0xfc,0xe6,0x9b,0xb8,0x79,0xe7,0xce,0x53,0xc1,0xa6,0x7a,0x94,0xd1,0x14,
+ 0x63,0x4c,0xba,0xd1,0xaa,0x5,0x39,0x63,0xc,0x4c,0xd9,0xbc,0x93,0x3,0x6e,0x86,
+ 0x94,0xca,0x5,0xb8,0x65,0x59,0xc6,0x98,0xd0,0x75,0x1d,0xb8,0x5c,0x2e,0xb5,0xb5,
+ 0x33,0x6f,0x96,0x17,0x28,0x62,0x1d,0xe5,0x5a,0x41,0xc6,0xc8,0x4a,0x53,0x43,0x4a,
+ 0x8,0xf2,0xb2,0x44,0x9c,0x24,0x18,0x86,0x11,0x6,0x4a,0xf5,0xdd,0x68,0x31,0x9a,
+ 0x6a,0x0,0xa4,0xa9,0x87,0x1f,0x56,0x8a,0xaf,0x4f,0x0,0xa3,0x14,0x3e,0xfa,0xc8,
+ 0x8a,0x19,0x9a,0xaf,0x56,0x1d,0x47,0x2a,0xd1,0xad,0x3e,0xda,0x90,0x42,0x35,0x32,
+ 0x1,0x58,0x8f,0x2,0x1c,0xbe,0xeb,0xa2,0x1d,0x4,0xe8,0x75,0x3b,0x58,0x59,0x94,
+ 0xd9,0x20,0x3a,0x23,0x64,0x6e,0x66,0x6,0xd3,0xbd,0x1e,0xa2,0x38,0xc1,0xcf,0xdf,
+ 0xfa,0x25,0x7e,0xf2,0xd6,0x5b,0xf8,0xd5,0x7f,0xbe,0x8b,0xf5,0x7b,0xf7,0x8e,0x3c,
+ 0x7e,0xfb,0xb2,0x1,0x9c,0x52,0xaa,0x72,0xd4,0x39,0x1c,0x65,0x1c,0x28,0x59,0x51,
+ 0xda,0x9e,0x64,0x6c,0x7f,0xe,0x50,0xa3,0xe4,0x3e,0x18,0xe7,0xaa,0x53,0x10,0xe5,
+ 0x68,0x4a,0x9a,0xd,0xea,0x5c,0x11,0x99,0xec,0xa7,0xbc,0xaf,0x54,0xd8,0x97,0x34,
+ 0x23,0x8c,0xb1,0x3f,0x18,0x22,0x8c,0x22,0xc4,0x49,0xa6,0xa8,0xb5,0xcd,0xe2,0xbb,
+ 0xa9,0x6,0x40,0x9a,0xfa,0x82,0x83,0x8b,0x29,0x85,0x39,0x0,0x79,0x43,0x3d,0xc2,
+ 0x81,0x5b,0x1f,0x77,0x69,0x53,0x3c,0x4a,0x8,0x8a,0xbc,0x40,0x9c,0x4a,0x81,0xe1,
+ 0xc1,0xb,0x2b,0x55,0xb1,0xae,0x5a,0xbd,0x56,0xa7,0x99,0x3e,0xf0,0x7b,0x63,0xc,
+ 0xbe,0xe7,0xc1,0xf5,0x5c,0x74,0x82,0x0,0x73,0xd3,0xd3,0x58,0x98,0x9b,0xc3,0xda,
+ 0xf2,0x32,0xe6,0x67,0xe7,0xb0,0x30,0x37,0x87,0xa9,0x5e,0xf,0x94,0x10,0xfc,0xdb,
+ 0xcf,0x7e,0x86,0x1f,0xff,0xe2,0x17,0x78,0xef,0xa3,0x8f,0x30,0xc,0xc3,0x33,0x21,
+ 0x48,0xd3,0x3b,0x23,0x97,0x73,0x38,0xca,0x22,0x5e,0xee,0x34,0x88,0xc9,0xd9,0x18,
+ 0x77,0x1b,0x63,0x4d,0x86,0x6d,0x31,0x69,0x15,0xa2,0xe8,0xd1,0x8e,0xb2,0x95,0x11,
+ 0x80,0x4,0x85,0x34,0x35,0x96,0x25,0xf5,0xc7,0x12,0xea,0x82,0xb0,0xdb,0xf,0x31,
+ 0x8a,0x62,0xc,0x86,0x23,0x8c,0xe2,0x18,0x99,0x8a,0x6c,0x6d,0xaa,0xa9,0x6,0x40,
+ 0x9a,0x7a,0x84,0xce,0x83,0xaa,0x99,0x78,0x85,0x3c,0x2f,0x8e,0x64,0x49,0xa2,0xe9,
+ 0xa2,0x1a,0x3c,0xa8,0xa,0xc,0x1a,0xa9,0xcc,0x85,0x7,0x8d,0x3a,0x8c,0x8,0x31,
+ 0x49,0x51,0xa,0x1,0x50,0x99,0xbb,0x51,0x4d,0x64,0x76,0xb,0x35,0xf3,0x67,0x4a,
+ 0x87,0xe0,0xc0,0xf7,0x3c,0xa9,0x12,0x9f,0x99,0xc1,0xfc,0xec,0xac,0xf9,0x11,0xf8,
+ 0x3e,0xb6,0xb6,0xb7,0xf1,0x93,0x37,0xdf,0xc4,0xcf,0xdf,0x7e,0x1b,0xb7,0xee,0xdc,
+ 0x39,0x35,0xab,0xf7,0x13,0x5,0x6c,0xa6,0xbc,0xbf,0xd4,0x6e,0x42,0x8f,0xd,0xb5,
+ 0x1d,0x89,0xde,0x6b,0x90,0x9a,0xc3,0xae,0xad,0x22,0x73,0xa5,0xf1,0x24,0x87,0x6d,
+ 0x33,0xb5,0x3,0x21,0xa8,0x84,0x30,0x56,0xec,0xf7,0x3d,0xf6,0x84,0x20,0x49,0x52,
+ 0x29,0xe2,0xab,0x59,0x84,0xe4,0x79,0xde,0xe4,0x62,0x34,0xf5,0xe5,0xbd,0xf,0x80,
+ 0xa6,0xbb,0x3d,0xcb,0x55,0x17,0x8c,0x55,0x42,0xc8,0x91,0xc5,0x17,0x1c,0x28,0xfa,
+ 0xf0,0x63,0x94,0x1a,0x93,0x3c,0x4a,0x8,0xf2,0xa2,0x30,0x56,0xda,0xf,0x1a,0xcd,
+ 0x58,0x96,0x5,0xdf,0xf3,0x30,0xd5,0xeb,0x1a,0x8b,0x8c,0xa2,0xac,0x50,0xa8,0xff,
+ 0xae,0x50,0xd9,0x13,0x5a,0x39,0x4d,0x29,0x5,0x23,0x32,0xd6,0x76,0xba,0xdb,0xc5,
+ 0x74,0xaf,0x87,0xd9,0xe9,0x29,0xf4,0x3a,0x5d,0x4,0xbe,0x8f,0x28,0x49,0xf0,0xe1,
+ 0x27,0x9f,0xe0,0xf3,0x5b,0xb7,0xb1,0xb1,0xbd,0x8d,0xf4,0x29,0x14,0xfe,0xd5,0x81,
+ 0x53,0xb2,0xa0,0x38,0x5c,0xb5,0xc8,0xd6,0xe3,0x29,0x3,0x1a,0x64,0x6c,0xcd,0xce,
+ 0xf4,0xe3,0x6c,0xc6,0x53,0x96,0xe9,0xf2,0x98,0xa1,0x41,0x8b,0xb1,0xd5,0x7a,0xcd,
+ 0x30,0xb1,0x14,0x2,0x65,0x51,0x62,0x18,0x8d,0x30,0x1c,0x46,0x26,0x58,0x29,0xcd,
+ 0xb,0x54,0x4d,0x98,0x52,0x53,0x4d,0x7,0xd2,0xd4,0x89,0x74,0x1e,0xd6,0x98,0xbe,
+ 0x79,0x14,0xd,0x84,0x66,0x2,0x31,0xc5,0xee,0xd1,0x4c,0x9e,0x28,0x49,0xf1,0xff,
+ 0xb3,0xf7,0xe6,0x51,0x92,0x5d,0xf5,0x99,0xe0,0x77,0xef,0x5b,0x63,0x8f,0xc8,0xad,
+ 0xb2,0xb2,0x54,0xaa,0x4d,0xbb,0x84,0xd0,0x6,0x48,0x20,0xc0,0x2,0xe1,0xc1,0xa0,
+ 0x16,0xd2,0xc1,0xee,0x16,0x6,0x8d,0x3d,0x36,0x60,0x79,0x18,0x36,0xf7,0xcc,0x70,
+ 0xc,0xc6,0x20,0xdb,0x87,0x3,0x6e,0xb7,0xc1,0x6d,0x63,0x18,0x63,0xcb,0x6d,0xc,
+ 0x36,0x32,0x42,0x36,0x58,0xd0,0xd,0x42,0xb4,0x65,0x49,0x25,0x40,0x48,0x68,0xab,
+ 0x92,0x6a,0xdf,0x73,0xaf,0xcc,0xc8,0x58,0xdf,0x76,0xef,0x9d,0x3f,0xee,0x7d,0x2f,
+ 0xde,0x8b,0x8c,0xda,0xa4,0xaa,0x52,0x56,0xe9,0x7e,0x3a,0xa1,0x8c,0x88,0x8a,0xe5,
+ 0xc5,0x5b,0x7e,0xdf,0xfd,0x6d,0xdf,0x2f,0x18,0x40,0x3e,0xf1,0xeb,0xf3,0xb9,0x1c,
+ 0x1c,0x55,0x3a,0x4a,0xd,0x43,0x19,0x30,0xb9,0xb2,0xb6,0x95,0xaa,0x2f,0x80,0x3e,
+ 0xb9,0xd,0xf4,0x6,0x19,0x11,0xb9,0xc2,0x36,0x28,0x41,0x18,0x86,0xd8,0x73,0x60,
+ 0x3f,0x26,0xa7,0x67,0xb0,0xef,0xd0,0x21,0x74,0xba,0xde,0x8a,0x4d,0xec,0x26,0xf9,
+ 0xc,0xdb,0x56,0xc9,0x6c,0xb9,0xf,0x24,0xa1,0xa2,0x57,0x76,0x8b,0x9e,0x12,0xae,
+ 0x94,0x8c,0x31,0x61,0x59,0xbd,0xfe,0x19,0x49,0x32,0x3d,0xd2,0x48,0x66,0x73,0xc4,
+ 0xcf,0x8,0x1,0x2f,0x8,0xe1,0x79,0x3e,0x9a,0xed,0xe,0xea,0xcd,0x6,0xda,0x1d,
+ 0x29,0x70,0x19,0xe9,0x90,0x94,0x86,0xf6,0x40,0x34,0x4e,0xaa,0xe7,0xa1,0xbc,0x6,
+ 0xaa,0x4a,0x34,0x8f,0x27,0x4f,0x10,0x7b,0x1d,0xa6,0x6a,0x4,0xa4,0x84,0x20,0xc,
+ 0x23,0xf8,0x61,0x38,0xb0,0x94,0xd3,0x32,0x4d,0x14,0x8a,0x5,0xe4,0x73,0x39,0x49,
+ 0x36,0x2a,0x3f,0x92,0xa8,0xbd,0x12,0x92,0xb9,0xa5,0x9,0x84,0xb,0xe,0xce,0x94,
+ 0xe4,0xb8,0xe0,0x49,0x43,0x9a,0x63,0xc9,0x59,0xeb,0x93,0xd3,0x33,0xa7,0x74,0xe,
+ 0xfa,0x8b,0x9,0x4d,0x51,0x4a,0x95,0x4e,0x94,0xa5,0xe6,0xa5,0xdb,0x30,0x4d,0xa,
+ 0x83,0x1a,0x59,0x4f,0x43,0xbd,0xd6,0xa0,0x71,0x1e,0x49,0x7a,0x1a,0xa6,0x61,0x80,
+ 0xc6,0x65,0xd4,0xa4,0x4f,0x1c,0x51,0xfd,0x5c,0xc6,0x39,0x82,0x50,0x12,0x46,0xa3,
+ 0x25,0xcb,0x6b,0x93,0x41,0x4c,0x51,0xa4,0x3d,0xc,0xd,0xed,0x81,0x68,0x9c,0xba,
+ 0xb0,0x95,0x69,0xc8,0x19,0xf,0x61,0x74,0xec,0x3a,0x7e,0x92,0x8c,0x48,0x25,0x30,
+ 0xd,0x13,0xa6,0x21,0x7,0xd,0x75,0x95,0xb1,0x1a,0x64,0xaa,0x2c,0xcb,0x42,0xb5,
+ 0x52,0x81,0x1b,0x7b,0x1d,0xa9,0xf1,0xaa,0x54,0xad,0xb2,0x93,0xb1,0xab,0x86,0x91,
+ 0x19,0x87,0xca,0x39,0x4f,0x46,0xaa,0xc6,0x73,0x1f,0x18,0x97,0x61,0xae,0x20,0x8a,
+ 0xd0,0xf1,0x3c,0x50,0x15,0xa,0x5a,0x29,0x21,0x2b,0x59,0x2,0xab,0xe6,0x60,0x28,
+ 0x4f,0xc3,0x34,0x65,0xb9,0x6d,0x5a,0x6a,0x3d,0x99,0xfa,0x47,0x7b,0x5d,0xfa,0x6,
+ 0x95,0x52,0x31,0x54,0x75,0x8f,0x53,0x42,0x81,0x1,0xcd,0xf9,0x42,0x8,0x95,0xbb,
+ 0xe8,0xaa,0x7e,0xc,0x39,0x1b,0x23,0x1e,0xc4,0xa4,0xa1,0xa1,0x9,0x44,0xe3,0x94,
+ 0xaf,0x8e,0xd,0x4a,0xd5,0x5c,0xec,0x63,0xcb,0x4c,0x50,0x45,0x36,0xb1,0xf7,0x1,
+ 0x48,0x69,0xf1,0xa3,0xe5,0x4a,0x4c,0xd3,0x44,0xb5,0x52,0x41,0x21,0x9f,0xeb,0x19,
+ 0x49,0xb5,0xc2,0x8e,0x2b,0xb6,0xe2,0x38,0x7e,0x4c,0x22,0x52,0x8f,0x9,0x49,0x5e,
+ 0x84,0x31,0x6,0xce,0x7a,0xb3,0xbb,0x99,0x9a,0xd7,0x1d,0x31,0x86,0x30,0xc,0x13,
+ 0x79,0x95,0xc5,0x7a,0xfd,0x25,0xd1,0xad,0x4a,0xe7,0x33,0x72,0x6a,0xda,0x5e,0xce,
+ 0xb1,0xd5,0x7e,0x22,0x29,0x4f,0x83,0xa8,0x4a,0x35,0x9a,0x90,0x45,0x5c,0xee,0x9c,
+ 0x90,0xa8,0xfa,0xed,0x84,0x90,0xc4,0xa9,0x17,0x0,0x3c,0xcf,0x47,0xd7,0xf3,0xd1,
+ 0xee,0x76,0x31,0xb7,0xb0,0x88,0x66,0xab,0xdd,0x2b,0xad,0xd5,0x1e,0x86,0xc6,0xa,
+ 0xb7,0x35,0xf1,0x75,0x92,0xdc,0x8,0x1,0x51,0x36,0x24,0x5e,0x34,0x6a,0x2,0x39,
+ 0x83,0x40,0xd5,0xa,0x98,0x71,0x7e,0xcc,0x52,0xcd,0x34,0xd9,0xc4,0xa1,0x94,0x48,
+ 0x55,0x68,0x1d,0xeb,0xbd,0xc5,0x42,0x1e,0x8e,0x6d,0x29,0x23,0x6f,0xc0,0x52,0x83,
+ 0xa7,0x12,0x22,0x32,0x64,0x38,0xa7,0x77,0x72,0x91,0x84,0x40,0xe2,0x30,0x8d,0x49,
+ 0x29,0xb8,0xc9,0x61,0x31,0x43,0x6d,0xaf,0x89,0x50,0x91,0x88,0xc,0xf1,0xc8,0xca,
+ 0xa3,0x62,0xb1,0x80,0xa5,0x25,0x76,0x5a,0x4a,0x4f,0x29,0x25,0xaa,0xa,0xca,0x42,
+ 0xa1,0x90,0x47,0x4e,0x4d,0x4f,0x74,0x1d,0x27,0x11,0x9c,0x34,0x54,0x62,0x23,0xee,
+ 0xd7,0x88,0xc5,0x6,0x25,0x79,0xf6,0x8,0x23,0x3d,0xa7,0x1c,0x90,0x25,0xb7,0x8c,
+ 0x71,0x39,0x85,0x71,0xb1,0x9e,0x34,0xf0,0xb5,0x53,0xb3,0x31,0x34,0x69,0x68,0xac,
+ 0x28,0x72,0x50,0x84,0x10,0x5f,0xc7,0x49,0x71,0x8d,0x41,0x13,0x81,0x4e,0x92,0x1a,
+ 0x1c,0x97,0xb8,0xd5,0xf1,0x54,0x4b,0x8,0x4d,0x20,0x67,0x1a,0x38,0xe7,0xc7,0xcc,
+ 0x77,0x50,0x42,0x94,0x8c,0x89,0x34,0x78,0x82,0xb,0xf8,0x51,0x4,0x76,0x84,0x70,
+ 0x55,0x7f,0xe8,0xca,0xb1,0x6d,0xd9,0x8d,0x6e,0x9a,0x4a,0x7,0x4b,0x12,0x88,0x61,
+ 0x50,0x98,0x54,0x86,0xc2,0xd2,0x27,0x1d,0x4d,0xe6,0x70,0xa7,0x8b,0x57,0xe5,0xff,
+ 0xb9,0xa9,0xaa,0x8c,0xb8,0xf4,0x46,0x18,0x63,0x8,0xc2,0x8,0x66,0x40,0x61,0x10,
+ 0x2,0xce,0x19,0xc2,0x20,0x3c,0xe1,0x79,0xe4,0x4,0x40,0x2e,0x9f,0x87,0xe7,0x1d,
+ 0x7d,0x4,0x6f,0x9c,0x4,0xcf,0x39,0x2e,0xdc,0x9c,0x8b,0x42,0xce,0x85,0xeb,0x38,
+ 0x89,0xc4,0xb9,0x63,0x4b,0xc5,0xda,0xb8,0xb0,0x40,0x5e,0x30,0x22,0x91,0x4d,0x17,
+ 0x82,0x67,0x72,0x3e,0x34,0x35,0xab,0x3c,0x62,0x11,0x3a,0x5d,0xf,0x8d,0x66,0xb,
+ 0xb,0xf5,0x6,0x96,0xd4,0xd8,0x56,0x3d,0x4c,0x49,0x63,0x25,0x90,0x44,0xfa,0xbc,
+ 0x8d,0x23,0x8,0xfd,0x64,0x21,0xef,0xcb,0xeb,0x24,0x36,0xe,0xe9,0x8a,0x40,0x21,
+ 0x38,0x20,0xa0,0xae,0xb1,0xd4,0xf4,0x4b,0xf5,0x3a,0x4d,0x20,0x67,0x10,0x8e,0x65,
+ 0x94,0xe4,0x1c,0xec,0x9e,0xd7,0x41,0x40,0x54,0xd8,0x28,0x3a,0xee,0xb9,0xd,0xb2,
+ 0xac,0x57,0x86,0x6b,0xec,0x78,0x3e,0x85,0x4a,0xc,0x27,0x27,0x61,0x2a,0xf,0x20,
+ 0x4f,0xd4,0x54,0x42,0xbd,0xb7,0x5c,0x49,0x9d,0x8c,0x6a,0x14,0x2b,0xe7,0x60,0x9c,
+ 0xc1,0x32,0xa3,0x64,0xb5,0xcf,0x18,0x87,0xe7,0xf9,0x68,0x77,0x4e,0x6c,0x82,0x61,
+ 0x21,0x9f,0x47,0xb1,0x58,0x0,0x63,0x2c,0x93,0x47,0x89,0xfb,0x2d,0x6c,0xd5,0xd0,
+ 0x17,0xf,0x6a,0x72,0x1d,0x7,0xc5,0x7c,0x1e,0xf9,0x9c,0x8b,0x42,0xbe,0x80,0x52,
+ 0xb1,0x0,0xd7,0x76,0xe0,0x38,0xb6,0xca,0x29,0x19,0x6a,0xc2,0x9f,0x24,0xb9,0x28,
+ 0xa,0x11,0x45,0x11,0xc2,0x30,0x54,0x73,0x2f,0x38,0x7c,0x3f,0x40,0xa7,0xeb,0xa3,
+ 0xdd,0x96,0x3,0xa1,0x16,0x97,0x1a,0x68,0x76,0xba,0xf0,0x3c,0x5f,0x4b,0x84,0x68,
+ 0x9c,0x56,0xef,0x21,0x5d,0xbc,0xd2,0x23,0x6,0x79,0x2d,0xc6,0xe1,0x6a,0x6a,0x50,
+ 0x24,0x23,0x93,0x7,0x7c,0x46,0x1c,0x6a,0x85,0x0,0x78,0x3c,0x9f,0x3e,0x1e,0xa1,
+ 0x9c,0x1a,0xa5,0x2c,0xb8,0xe8,0x23,0x96,0x98,0x69,0x74,0xe,0xe4,0xac,0x3a,0xb1,
+ 0xe2,0x38,0x65,0x6c,0xc,0xc3,0x28,0x44,0x74,0x82,0xea,0xaa,0xf1,0x67,0x48,0x12,
+ 0xa1,0xb0,0xd4,0x14,0xc3,0x24,0xf,0x42,0x65,0x8e,0x20,0xbd,0x92,0x19,0x54,0x8d,
+ 0x15,0x4f,0xd4,0x93,0x33,0xb8,0xd3,0x4,0x62,0x2a,0x2f,0x46,0xc6,0x52,0xc3,0x30,
+ 0x82,0xab,0x72,0xf,0x27,0x42,0x20,0xa3,0x23,0xc3,0x30,0xc,0x3,0x4b,0x8d,0x66,
+ 0xb2,0x1d,0xa6,0x69,0xa2,0x54,0x2c,0xc0,0xb1,0x2d,0xe4,0x73,0x39,0x45,0x1e,0x39,
+ 0x54,0xca,0x65,0x54,0x4b,0x25,0x94,0x4b,0x25,0x94,0x8a,0x45,0x14,0xf2,0x79,0x14,
+ 0xf2,0xf9,0x84,0x20,0xa5,0x67,0x27,0x49,0x22,0x8,0x7c,0x29,0x79,0xef,0xfb,0xf0,
+ 0x7c,0x1f,0xf5,0x66,0x3,0x87,0xa6,0xa7,0x71,0x78,0x71,0x9,0x33,0x73,0xf3,0xa8,
+ 0x37,0x64,0x3,0x9f,0x16,0x21,0xd4,0x38,0x2d,0x1e,0x84,0xa,0x33,0x19,0x94,0xca,
+ 0x2a,0xc8,0x74,0xc8,0x49,0x2d,0x18,0xe3,0x5,0x5d,0xcf,0xf3,0x4f,0xdd,0x13,0x69,
+ 0xa2,0x90,0xcf,0x29,0xe7,0x3a,0x43,0x20,0xe9,0xfb,0x49,0x19,0x7e,0xec,0x85,0xa7,
+ 0x49,0x44,0x8d,0xc0,0x8c,0xd7,0x4a,0x9a,0x40,0xce,0x2,0xa4,0x8d,0x3e,0x51,0x42,
+ 0x7a,0xc7,0x13,0xae,0x1a,0x14,0xfa,0x92,0x62,0x7e,0xaa,0x9,0x4e,0xa9,0xc1,0x1a,
+ 0x94,0xc0,0x8c,0x27,0x12,0xaa,0x50,0x56,0xcf,0xfd,0xed,0x23,0x8d,0x3e,0xf,0xa4,
+ 0xe7,0x89,0xc8,0x15,0xd,0xe3,0x2,0xcc,0x20,0x20,0x54,0xa,0x9,0x6,0x81,0xc,
+ 0x27,0x19,0x94,0x20,0x3c,0x81,0xdf,0x3b,0x3a,0x34,0xc,0x42,0x8,0xe6,0xe,0x2f,
+ 0x80,0x52,0x8a,0xa1,0x5a,0x45,0x76,0x85,0x5b,0x16,0xca,0xc5,0x22,0x26,0x56,0xad,
+ 0xc2,0x50,0xad,0x86,0x5a,0xa5,0x82,0xa1,0x5a,0xd,0x15,0x45,0x1e,0xe5,0x62,0x11,
+ 0x8e,0x6d,0x4b,0x51,0x43,0xd5,0x7c,0xc9,0x19,0x43,0x10,0x6,0x68,0xb7,0xdb,0xd8,
+ 0x3f,0x39,0x89,0xd9,0xc3,0xb,0xd8,0xb9,0x77,0x1f,0xb6,0xef,0xde,0x8b,0x43,0xd3,
+ 0xd3,0xe8,0x7a,0x3e,0x82,0x20,0xd0,0xf5,0xee,0x1a,0x27,0xdd,0x83,0xc8,0x54,0x37,
+ 0x1a,0x46,0x36,0x69,0x4d,0x9,0x28,0x35,0x6,0x10,0x82,0x32,0xe5,0xa9,0xfb,0xbd,
+ 0x1c,0xa2,0x48,0xf3,0x46,0x96,0x52,0x6,0x3e,0x4e,0xbd,0x27,0x9,0x61,0xf1,0xc4,
+ 0xe3,0xe8,0x5d,0xbb,0xa2,0xef,0x75,0x42,0x7b,0x20,0x67,0x3,0xe2,0xa1,0x43,0x94,
+ 0xc8,0x86,0x40,0xce,0xd9,0xb,0x8a,0xbf,0xc7,0x15,0x56,0x34,0x25,0xd0,0x27,0xf3,
+ 0xc9,0x24,0x75,0xb2,0xcb,0x6a,0xa4,0x44,0xa9,0x57,0xbd,0xbe,0x97,0x3d,0xcf,0x9e,
+ 0xb3,0xc9,0xfa,0x25,0x9,0x61,0x11,0x10,0xc2,0x1,0x61,0xc0,0xa4,0x1c,0x91,0x4a,
+ 0x4c,0xc7,0x25,0xc9,0xc7,0x43,0x1c,0xa6,0x69,0xa2,0x58,0xc8,0xa3,0x5a,0x29,0x3,
+ 0x0,0x5c,0xc7,0x46,0x33,0xc,0xe1,0x58,0x72,0x46,0x86,0xeb,0x38,0x18,0x1b,0x1e,
+ 0xc2,0x45,0xe7,0x9d,0x87,0x8d,0xeb,0xd6,0x63,0xb8,0x56,0x43,0xb5,0x52,0x46,0x21,
+ 0x2f,0xfb,0x59,0x5c,0x35,0x77,0x43,0x8,0x1,0xcf,0xf7,0xd1,0x68,0x36,0xb1,0x7d,
+ 0xf7,0x6e,0x3c,0xfe,0xcc,0x33,0xd8,0xb2,0x6d,0x1b,0xf6,0x1d,0x3c,0x84,0xe9,0xd9,
+ 0x39,0x74,0xba,0x5d,0xdd,0x8f,0xa1,0xf1,0xa2,0x8,0xa2,0x97,0x37,0xeb,0xfd,0x35,
+ 0x8c,0x6c,0xf1,0x49,0x42,0x26,0xea,0x3a,0x13,0x7d,0x64,0x21,0x54,0xee,0x21,0x6d,
+ 0xfc,0xb3,0xa7,0xa4,0x38,0x2e,0x72,0x48,0xae,0xcd,0xa3,0x10,0x4a,0xef,0x79,0x75,
+ 0xcd,0xaa,0x86,0xd7,0x1e,0x17,0xf5,0x9e,0x8f,0xa1,0x9,0xe4,0x4c,0xf5,0x3a,0x52,
+ 0xf1,0x4f,0x0,0xc7,0x55,0x99,0x75,0x24,0xe2,0x88,0x9b,0xe1,0xa4,0x1b,0x9c,0x5e,
+ 0x21,0xa9,0x55,0x10,0x21,0xa9,0xa,0xab,0xde,0xca,0xc7,0xc8,0x24,0xe2,0x48,0xa6,
+ 0x2d,0x35,0xce,0xb5,0x71,0xc1,0x25,0xb1,0x9,0x1,0x80,0x1,0x9c,0x24,0x49,0xf8,
+ 0x98,0x98,0x38,0x17,0x47,0xec,0xb6,0x8e,0x2f,0xba,0x7c,0x3e,0x97,0x34,0xf6,0xd5,
+ 0xca,0x15,0xc,0xd7,0xaa,0x8,0xc2,0x10,0x85,0x7c,0x1e,0xad,0x76,0x1b,0x9d,0xae,
+ 0x87,0xd1,0xa1,0x2a,0x5c,0xc7,0x1,0x25,0x2,0x42,0x30,0x8c,0xe,0xd7,0x70,0xc1,
+ 0xc6,0xf3,0x30,0x32,0x3c,0xc,0x37,0x9f,0x87,0x69,0x18,0x58,0xac,0xd7,0x71,0xe0,
+ 0xd0,0x21,0x3c,0xf6,0xf3,0x9f,0xe3,0xe7,0xcf,0x3e,0x8b,0xa7,0xb6,0x3e,0x87,0xdd,
+ 0xfb,0xf6,0xa1,0xd1,0x6a,0x21,0xc,0x43,0x7d,0x62,0x69,0x1c,0x57,0x68,0x29,0x4d,
+ 0x12,0xfd,0xc4,0x90,0xd6,0x3e,0x8b,0x1f,0xa7,0x8d,0x6e,0xd6,0x99,0xc8,0xe6,0x17,
+ 0x8e,0x4c,0x16,0x47,0x37,0xfc,0xc7,0x43,0x18,0xd9,0xef,0x5f,0x16,0xec,0xea,0xbd,
+ 0x2f,0xf6,0x40,0xe2,0xdf,0x9c,0xb9,0x20,0x1,0x22,0xe4,0x50,0x32,0x10,0x4d,0x20,
+ 0x67,0x74,0xc8,0x4a,0x1a,0x5f,0xfe,0x82,0x4a,0x44,0x93,0x13,0x5e,0x91,0x43,0x9c,
+ 0x78,0x13,0x42,0xa8,0xce,0x76,0x96,0x88,0x23,0xa6,0x59,0x81,0x71,0xe,0xa2,0x24,
+ 0x53,0x84,0x0,0x4c,0x21,0x92,0xd1,0xa8,0x94,0xf6,0x3c,0x92,0xf8,0x82,0x60,0x8c,
+ 0x80,0x81,0x3,0x9c,0x43,0x10,0x2,0x41,0x7a,0x55,0x4c,0x10,0x2,0x8c,0x71,0x34,
+ 0xdb,0xed,0x44,0x2e,0x9e,0x24,0xf9,0x17,0x39,0x3b,0x23,0x9f,0xcb,0x21,0xe7,0x38,
+ 0x28,0x16,0xf2,0x28,0x15,0x8a,0xa8,0x96,0xcb,0xa8,0x56,0x2a,0xc8,0xbb,0x2e,0x4c,
+ 0x23,0x40,0x21,0x97,0x7,0x1,0x41,0xb3,0xdd,0x41,0xd7,0xf,0x30,0x52,0xab,0x82,
+ 0x10,0xe0,0xe0,0xe4,0x41,0x3c,0x6e,0x9a,0x98,0x99,0x9d,0xc5,0xaa,0x55,0xe3,0x98,
+ 0x9a,0x9f,0xc7,0x93,0xcf,0x6e,0xc5,0xd6,0x6d,0xdb,0xb0,0xff,0xe0,0x41,0x4c,0xcd,
+ 0xcc,0x20,0x8a,0x22,0x2d,0x13,0xa2,0x31,0x90,0x20,0x62,0x8f,0x9b,0x2a,0xf5,0x81,
+ 0x74,0x48,0x29,0x26,0x86,0xb4,0xc7,0x81,0xa4,0x80,0x64,0xb9,0x55,0xe6,0xaa,0x92,
+ 0x69,0x50,0xb8,0xe8,0xa8,0xc4,0xd0,0xb7,0xda,0x1f,0xf8,0x5c,0x3a,0xa4,0x35,0xe8,
+ 0x7,0xd,0xf4,0x32,0x48,0x26,0xcc,0x1c,0xd7,0x4e,0xf6,0x92,0xeb,0xf2,0x1a,0x15,
+ 0x42,0x92,0x84,0xfa,0xd3,0x23,0x24,0x11,0xbf,0x4b,0x57,0x61,0x9d,0x59,0x27,0x37,
+ 0x7a,0x8d,0x3d,0x52,0x84,0x8f,0x9f,0x70,0xb8,0x2a,0xee,0x22,0x97,0x9,0x3a,0x9a,
+ 0xc,0x30,0x22,0xaa,0xbf,0x24,0x8a,0x22,0x38,0x8e,0x85,0x28,0x72,0x93,0x26,0x40,
+ 0x93,0x19,0xa0,0x54,0x80,0x13,0x1,0x42,0x38,0xa2,0x78,0xc5,0xc4,0x39,0x18,0x97,
+ 0x7d,0x1e,0xa6,0x61,0xc2,0x34,0xb9,0xea,0xa3,0x20,0x20,0x2,0x32,0xbf,0xc0,0x65,
+ 0xde,0x23,0x96,0x24,0x67,0xaa,0x12,0x2b,0x8a,0x64,0x39,0x6f,0xb3,0xd5,0x42,0xa3,
+ 0xd9,0x4a,0xe4,0xd0,0xf3,0x39,0x57,0x8a,0x15,0xf6,0x91,0xc6,0xc8,0xd0,0x10,0x86,
+ 0xab,0x35,0x8c,0xc,0xf,0xc3,0xa0,0x14,0x53,0xb3,0x33,0x2a,0x84,0xe5,0x80,0x50,
+ 0x59,0xe,0x7c,0x68,0x7a,0x16,0x6b,0xc7,0xc7,0xc0,0x18,0xc7,0xee,0xfd,0x7,0xb0,
+ 0x65,0xfb,0x2e,0xb4,0x3b,0x5d,0x1c,0xae,0x37,0xd0,0xe9,0x76,0xe1,0xfb,0xbe,0x26,
+ 0xc,0x8d,0x3e,0x92,0x50,0xd7,0x80,0x61,0x66,0x2a,0xc,0xe3,0x6b,0x85,0x50,0x2a,
+ 0x65,0xf8,0x53,0x61,0xda,0xb4,0x75,0x4e,0xec,0xb3,0xc8,0x26,0xaa,0x7,0x93,0x41,
+ 0x3f,0x61,0xc,0xf2,0x22,0x8e,0xb0,0x10,0xec,0x7f,0xed,0x91,0xfe,0xad,0xbf,0xe2,
+ 0x2a,0x2e,0x3b,0x57,0xec,0x96,0xee,0xeb,0x88,0x9f,0x27,0x7d,0x8a,0x56,0xa2,0x8f,
+ 0x94,0x84,0x48,0x7b,0x49,0x24,0x45,0x56,0xba,0x91,0xf0,0x8c,0xf3,0x3c,0xd2,0x5e,
+ 0xc7,0x9,0x7b,0x2d,0x49,0xc5,0x6,0x49,0x9a,0xe1,0x4,0xa4,0x9a,0x6e,0x10,0x6,
+ 0xe0,0x4c,0x96,0xed,0x2d,0x35,0xda,0x52,0x6a,0xdc,0x34,0x93,0xf8,0xac,0x50,0x2b,
+ 0x29,0x53,0xc8,0x15,0x18,0x57,0xdd,0xf0,0x94,0x31,0x84,0x51,0xa4,0x56,0x65,0x46,
+ 0xd2,0x27,0x11,0xc7,0x73,0x93,0x12,0x5e,0x95,0xac,0x8e,0x65,0xe0,0x1b,0xed,0xe,
+ 0x1a,0xcd,0x16,0x16,0x9b,0x2d,0x38,0xae,0x83,0x72,0xb9,0x84,0x9c,0xeb,0xa2,0x90,
+ 0xcf,0xa3,0x52,0x2a,0xa1,0x56,0xa9,0x62,0x64,0x78,0x8,0xa3,0x43,0xc3,0x18,0x1e,
+ 0x1a,0xc2,0x48,0xad,0x86,0x5a,0xb5,0x82,0x6a,0xa5,0x8a,0x99,0xd9,0x19,0xcc,0x2d,
+ 0xcc,0xc3,0x71,0x1c,0xe4,0x72,0xae,0xec,0x75,0x11,0x2,0xed,0x4e,0x17,0x9b,0x9f,
+ 0x78,0x1a,0x41,0x18,0xa2,0xd3,0xf5,0xf4,0x5c,0x8c,0x97,0x21,0x31,0xf4,0x13,0x44,
+ 0x3a,0xb4,0x14,0x37,0x89,0x9a,0x86,0xb9,0xac,0x0,0x64,0x19,0x29,0xf4,0x5b,0x69,
+ 0x21,0x96,0x27,0xa6,0x7,0x85,0x89,0x84,0x58,0x1e,0x12,0x1a,0x18,0xbe,0x3a,0x4a,
+ 0xc4,0x60,0x0,0x91,0x64,0xb6,0x93,0x10,0xd0,0xf8,0x77,0xc6,0xa4,0x41,0x7a,0xb9,
+ 0x94,0x98,0x20,0x90,0xf2,0x27,0xd2,0x9e,0xd1,0xe0,0xef,0xee,0x2b,0xbd,0x4f,0x88,
+ 0xb1,0xb7,0x49,0xf2,0xbb,0x44,0xef,0x3e,0x74,0x8,0xeb,0x8c,0x42,0xdc,0xc4,0x73,
+ 0x22,0xe1,0xaa,0x8c,0xfb,0x4d,0x52,0xbd,0x1b,0x0,0xfc,0x20,0x1c,0x18,0x2,0xb,
+ 0xc2,0x10,0xcd,0x76,0x47,0x96,0xb8,0xca,0x19,0xaa,0xe0,0x82,0xc3,0x62,0x26,0x58,
+ 0x22,0x61,0x42,0xd5,0xe7,0xf5,0x3e,0x33,0x26,0x28,0x64,0xc4,0x15,0x7b,0x25,0xbc,
+ 0x41,0x18,0x62,0xa1,0xde,0x44,0xa3,0xdd,0x46,0xab,0xd3,0x5,0x67,0xb2,0x2b,0x7d,
+ 0x6c,0x78,0x18,0xa5,0x62,0x11,0x43,0xd5,0x2a,0x6a,0x95,0x2a,0x56,0x8d,0x8e,0x62,
+ 0x64,0x68,0x8,0x23,0x43,0xc3,0x18,0x1e,0x92,0x15,0x54,0x95,0x72,0x59,0x56,0x6b,
+ 0x11,0x8a,0xe9,0xd9,0x59,0xd8,0x96,0xd,0x8,0xc8,0x26,0x47,0x6a,0x80,0x81,0x81,
+ 0x10,0xa0,0xdd,0xf5,0x94,0x16,0x97,0x26,0x8f,0xb3,0xd1,0x3,0xc7,0x0,0x31,0xcf,
+ 0x34,0x41,0x18,0x86,0x91,0x94,0xb6,0xa6,0xc9,0xa4,0x67,0x84,0x7,0x57,0x1c,0xd,
+ 0xc,0x2b,0xd,0xc,0x21,0x1d,0x83,0x20,0x8e,0x18,0x36,0x3a,0x92,0xb9,0x4e,0x7b,
+ 0x45,0x48,0x11,0x80,0xca,0x3b,0xa6,0x25,0x75,0x52,0xbf,0xbf,0x3f,0x5a,0x96,0x21,
+ 0x98,0x1,0xf6,0x41,0xa4,0xa3,0x57,0x20,0x47,0xfe,0x3d,0xf1,0x6f,0x4a,0x7d,0x46,
+ 0xbc,0xdb,0x4,0x1,0x88,0xc8,0xe,0x61,0xd6,0x4,0x72,0x6,0x21,0x3e,0xa8,0xa4,
+ 0xaf,0xd3,0x3c,0x3e,0x21,0x78,0x6a,0x16,0x47,0xfc,0x7a,0x19,0xf6,0xca,0x4a,0x8d,
+ 0xc4,0x92,0x22,0x47,0x22,0x22,0x21,0x4,0x1a,0xcd,0x16,0x2c,0xd3,0x0,0x17,0x1c,
+ 0x51,0xc4,0xe0,0x44,0x91,0x94,0x1,0x31,0xc,0x18,0xaa,0x9,0xd0,0x50,0x2e,0x3e,
+ 0x1d,0xd4,0x7,0x92,0xca,0x83,0x70,0x95,0x57,0x99,0x5f,0xac,0x63,0x61,0xa9,0x1,
+ 0x21,0xe4,0x7c,0x90,0x72,0xb1,0x88,0x6a,0xa5,0x82,0x5a,0xa5,0x82,0xb1,0x11,0x49,
+ 0x1a,0xa3,0xc3,0xc3,0x18,0x19,0x1e,0xc6,0x50,0xa5,0x8a,0x6a,0xa5,0xc,0xc7,0x71,
+ 0xd0,0xe9,0x7a,0xd8,0xb6,0x73,0x17,0x76,0xee,0xdd,0x8b,0xa7,0xb7,0x6c,0x41,0xc4,
+ 0x23,0x5c,0xfd,0x8a,0x57,0x24,0xf3,0xd9,0xd,0xd3,0x0,0x9,0xe5,0x85,0x41,0x65,
+ 0x5b,0x2d,0x6c,0xdb,0x7e,0x49,0x34,0xb6,0x34,0x4e,0x4e,0x78,0x29,0x2d,0xb3,0x91,
+ 0x4d,0x50,0xa7,0xbd,0x69,0x59,0x81,0x88,0x23,0x56,0x25,0x65,0x97,0xd1,0x99,0x5e,
+ 0x86,0xe3,0xf1,0x20,0x6,0xba,0x22,0x3,0xa8,0x61,0xc0,0x75,0x94,0x10,0x40,0xba,
+ 0x91,0x8f,0xa8,0xe2,0x17,0x90,0xc4,0x6b,0x88,0x75,0xd4,0xd0,0x47,0x1e,0x69,0xe3,
+ 0x7d,0xd4,0xc8,0xd6,0xb2,0xdf,0x82,0x65,0x1a,0xeb,0x2,0x0,0x11,0x47,0x4c,0xa9,
+ 0x2f,0x97,0x64,0xef,0x23,0x19,0xd1,0x47,0x78,0x34,0xf5,0x6,0x4d,0x20,0x67,0x10,
+ 0xe4,0xbc,0x6c,0x59,0xaa,0xea,0x38,0x76,0x4a,0x9,0xb7,0x17,0x3f,0xe5,0x5c,0x26,
+ 0xba,0x65,0x53,0x5c,0x80,0x4e,0xa7,0x3,0x2,0xe5,0xca,0x1b,0x14,0xbe,0x1f,0x20,
+ 0x3c,0x8e,0x39,0xe9,0x5c,0x8,0x1c,0xae,0x37,0xe0,0x5,0x1,0x8a,0x85,0x3c,0x72,
+ 0xb6,0x2d,0x9,0x24,0x96,0x2b,0x4f,0xd5,0xaf,0x93,0x94,0x62,0x6d,0xfa,0x9a,0x8a,
+ 0x3d,0x8f,0x30,0x62,0x6a,0x20,0x52,0x17,0x86,0x61,0xa0,0x50,0xc8,0xa1,0x52,0x2a,
+ 0xa3,0x5a,0x2e,0x63,0x74,0x64,0x4,0xc3,0xb5,0x1a,0x46,0x87,0x86,0x51,0xab,0xd5,
+ 0x90,0x73,0x5d,0x8,0xce,0x31,0x39,0x33,0x83,0x7f,0x7b,0x74,0x33,0xb6,0xed,0xdc,
+ 0x85,0x3,0x93,0x93,0x38,0x34,0x3d,0x85,0x76,0xb7,0x8b,0x30,0xc,0x71,0xe5,0x65,
+ 0x97,0xc2,0xb6,0x2d,0x30,0xc6,0x94,0x46,0x57,0x2c,0xb3,0x2e,0x64,0x69,0x24,0x97,
+ 0x67,0xb9,0xe3,0x38,0xb2,0x7f,0x43,0x97,0xe2,0xae,0x28,0x72,0xe8,0xf7,0x1c,0xd2,
+ 0xe1,0x55,0xd3,0x34,0x93,0xb8,0x7d,0x5c,0xd9,0x47,0x94,0x5,0x4b,0xca,0x5c,0x33,
+ 0x61,0x24,0x71,0xc4,0x50,0x91,0xe8,0x23,0x86,0xe5,0x9c,0x20,0x8e,0x9c,0x4b,0x18,
+ 0xe0,0xf9,0x64,0xef,0x8b,0xe5,0xbf,0x27,0xe5,0x45,0x10,0x4a,0x14,0x79,0xa4,0x4a,
+ 0xe1,0xd3,0xcb,0xf9,0x23,0x30,0xd2,0xa0,0xda,0xa8,0xfe,0x77,0x88,0xc,0x5b,0x2c,
+ 0xf,0xb5,0x1d,0x8d,0xf2,0x32,0x4a,0x11,0x62,0xb9,0x2b,0x14,0x7f,0x17,0x4f,0xfe,
+ 0x31,0xfb,0x37,0x7d,0x2d,0x69,0x2d,0xac,0x33,0xe8,0xc2,0x73,0x1d,0x7,0xe5,0x52,
+ 0x51,0xc9,0xab,0xdb,0xaa,0x33,0x9c,0x26,0x55,0x22,0x71,0x22,0x2c,0x26,0xf,0xa9,
+ 0x3b,0x95,0x83,0xeb,0x38,0x88,0x18,0x83,0x6d,0x99,0x20,0x84,0x22,0x8a,0x22,0xd4,
+ 0x1b,0xd,0xb4,0xdb,0x9d,0x63,0x93,0x8,0xe7,0x68,0x2a,0xc9,0x71,0xc7,0xb6,0xe5,
+ 0xbc,0x6f,0xc7,0x96,0x23,0x59,0xe3,0x71,0xac,0x24,0x55,0xc2,0x9b,0x6a,0x3d,0x67,
+ 0x4a,0xd2,0x9d,0xa9,0x1c,0x49,0xc4,0x18,0x2c,0x35,0x98,0xaa,0x5c,0x2a,0xa1,0x5a,
+ 0x29,0xa3,0x56,0xae,0xa0,0x52,0x2a,0x21,0xef,0xba,0x38,0x5c,0x5f,0xc4,0xee,0xfd,
+ 0xfb,0x31,0x3d,0x3b,0x8b,0x5d,0xfb,0xf7,0x63,0xfe,0xf0,0x61,0xb4,0x3b,0x1d,0xf8,
+ 0x3,0x8,0xa0,0x56,0x29,0xc3,0xb6,0x2c,0x4,0x41,0x8,0x4a,0xd,0x35,0x8e,0x97,
+ 0x42,0x30,0x96,0xb9,0x68,0x63,0xd2,0xd5,0x9e,0xc8,0x4b,0x43,0x12,0x49,0x4f,0x51,
+ 0x2c,0x83,0xa3,0xee,0xa7,0x3b,0xa8,0x7b,0x1a,0x6a,0xcb,0x2d,0x69,0x62,0xde,0x63,
+ 0x7b,0xc7,0xb3,0x32,0x1a,0xd9,0x15,0x78,0x3f,0x41,0x1c,0xdf,0xa2,0x21,0x1d,0x90,
+ 0x21,0x71,0x77,0x37,0x51,0x8d,0xae,0xea,0xba,0x92,0x1e,0x7c,0x2a,0x1c,0x8c,0x78,
+ 0xbb,0x93,0xe5,0x7a,0xcf,0x73,0x10,0x29,0xaf,0xe1,0x88,0x71,0xa4,0x1e,0x71,0x89,
+ 0x54,0x89,0x93,0xe8,0x6b,0xa4,0x8a,0x17,0x85,0x42,0xc,0x26,0x8e,0xfe,0x32,0xdb,
+ 0xc,0xd1,0x65,0x72,0x20,0x14,0x47,0x62,0xc,0x91,0xf6,0xba,0x62,0x99,0x12,0x91,
+ 0xe,0x65,0x21,0x33,0xa6,0x3a,0xee,0x50,0x17,0x3a,0x84,0x75,0xe6,0x20,0x97,0x73,
+ 0x51,0x29,0x95,0x90,0x73,0x1d,0xa9,0x8c,0xab,0x2a,0x96,0x8c,0x44,0xa6,0xdd,0x48,
+ 0x86,0x44,0x25,0x6,0x5b,0x49,0xa7,0x3b,0x96,0x99,0xe4,0x38,0x84,0x10,0x30,0x4d,
+ 0x3,0x15,0x51,0x42,0xa0,0x24,0xdd,0x8f,0x7,0x8c,0x71,0x74,0xba,0x1e,0x3a,0x5d,
+ 0x4f,0xba,0xb0,0x6a,0xae,0x48,0x2e,0xe7,0xc2,0xb5,0x1d,0x10,0x9a,0x8e,0x9b,0x8a,
+ 0x8c,0xda,0x27,0x54,0x22,0x33,0xee,0xfe,0xb6,0x4c,0x13,0x11,0x8b,0x50,0x5f,0x5a,
+ 0xc2,0x62,0x7d,0x9,0x8f,0x3d,0xfd,0x34,0x1a,0xcd,0x26,0x3a,0x9d,0x2e,0xba,0xbe,
+ 0x7f,0x5c,0xf2,0x20,0x63,0xc3,0xa3,0x70,0x6c,0x7,0x9e,0x1f,0xc0,0x8c,0x3f,0xdb,
+ 0xb2,0xd1,0xe5,0x9e,0xfc,0x7e,0x75,0xd1,0x8,0xc1,0xa5,0xca,0xae,0x65,0xe9,0x1e,
+ 0x8f,0x93,0x40,0xc,0x99,0x10,0x53,0x4a,0x3e,0xa6,0x97,0x5f,0x8b,0x3b,0xaa,0x53,
+ 0x9e,0xe9,0xc0,0x10,0x69,0xbf,0x9,0x14,0x3,0x42,0x47,0x62,0x20,0x19,0x1c,0xf5,
+ 0xb9,0x14,0xb9,0x64,0x43,0x48,0xbd,0x4,0x33,0x4d,0x91,0x3,0x55,0xe7,0xa6,0xfc,
+ 0x77,0x55,0x99,0xa8,0xac,0x2f,0x8d,0xbd,0x9f,0x7e,0x6b,0x7c,0x84,0xef,0xce,0xac,
+ 0xcc,0x55,0xe8,0x38,0xd3,0xc9,0x1d,0x13,0x41,0x6a,0x5a,0x67,0xb6,0x9b,0xfc,0xc8,
+ 0x14,0x27,0x8b,0xc2,0x48,0x46,0x11,0x37,0x73,0x3f,0x45,0x2e,0x22,0xe5,0x31,0x8,
+ 0xd1,0x93,0x1e,0x89,0xe5,0x4b,0x78,0xdc,0xe3,0xa1,0xc8,0x38,0x21,0x8e,0xd4,0x86,
+ 0x70,0xce,0x93,0xea,0x2b,0x91,0xfa,0x37,0x21,0xb0,0x2c,0x67,0xa2,0x9,0xe4,0xc,
+ 0xb8,0x70,0xf3,0xae,0x9b,0xac,0xb2,0xe3,0x2a,0xaa,0x64,0x85,0x47,0x8,0xc,0x83,
+ 0x24,0xa4,0xc2,0xc,0x9a,0xcc,0xe5,0x96,0x7f,0x5,0xc0,0x8,0x38,0x63,0x60,0x49,
+ 0x58,0x89,0xbd,0x20,0x59,0x8e,0x74,0x55,0x8b,0x65,0x59,0xe0,0x5c,0xa0,0xeb,0x7b,
+ 0x89,0xa1,0x88,0x1b,0x12,0x8d,0xd4,0x8a,0x33,0xbe,0x38,0x39,0xe7,0x58,0x6a,0x34,
+ 0x11,0x46,0x72,0x1e,0x48,0x10,0x86,0xc9,0x24,0xc5,0x13,0x2d,0xa,0x18,0x1e,0xaa,
+ 0xc1,0xb2,0xcc,0xde,0x60,0x27,0xdb,0x86,0x65,0x99,0xf0,0xfc,0x74,0xa8,0x41,0x4a,
+ 0xb1,0x73,0x21,0x60,0xaa,0xce,0xf3,0xe8,0x38,0x9,0x53,0x13,0x4,0x59,0xa6,0xda,
+ 0x1a,0x4b,0xf0,0xcb,0x61,0x59,0x3d,0xaf,0x21,0x26,0x8f,0x81,0x11,0x76,0x31,0x58,
+ 0x56,0x43,0xc,0xc,0xb7,0x8,0xc,0xcc,0xe6,0x66,0x4c,0x69,0x8a,0x90,0xe2,0x30,
+ 0x57,0xd2,0xe8,0xda,0xf3,0x78,0xe2,0x3c,0x49,0x9c,0xf7,0x4b,0x2a,0xb0,0xb0,0x9c,
+ 0x58,0xe2,0xcf,0xc5,0x51,0x42,0x44,0x22,0xc9,0xa1,0x20,0x31,0xba,0x3d,0xb5,0xda,
+ 0x5e,0x61,0x8b,0x40,0xd6,0x93,0x10,0x7d,0xb2,0x22,0xc9,0x3e,0x53,0x3,0xc7,0x48,
+ 0x1f,0x49,0xd,0x16,0x3c,0xec,0x91,0x92,0x48,0x75,0x87,0x67,0x8c,0xbb,0xe8,0xa9,
+ 0xe4,0x72,0xb5,0x5f,0x79,0xc6,0xf0,0xf7,0x6d,0x4f,0xa6,0xa2,0xac,0x9f,0xac,0xb3,
+ 0x53,0x45,0x33,0x5e,0x8a,0x40,0xd6,0x53,0xe1,0x9a,0x40,0x56,0x3c,0x12,0x65,0x5d,
+ 0x12,0x1f,0xca,0xf8,0xa4,0xe1,0xb2,0x26,0x5b,0x9d,0x24,0x94,0x0,0x96,0x49,0x41,
+ 0x99,0x0,0x8b,0x48,0x32,0x74,0x8a,0xa6,0x4e,0x4c,0x39,0x21,0x30,0x42,0x18,0x84,
+ 0x99,0xea,0x93,0x63,0x92,0x86,0x12,0x72,0x8b,0xe7,0x8a,0xa4,0x6b,0xc9,0x63,0xd,
+ 0xae,0xb8,0x2,0x26,0xbe,0x50,0x39,0x17,0xf0,0x42,0x1f,0x41,0x18,0xc1,0xf,0x64,
+ 0xde,0xe5,0x64,0xcc,0xc4,0xb0,0x4c,0x13,0x95,0x52,0x49,0x4e,0x49,0x54,0xdb,0x62,
+ 0xab,0x31,0xb9,0xb2,0xff,0x44,0xf4,0x4c,0x42,0xdc,0x1c,0x2f,0x4,0x2c,0x25,0x9a,
+ 0xf8,0x72,0x26,0x91,0x65,0xf9,0x7,0x42,0x92,0xe3,0x6a,0xd0,0x5e,0xf5,0x52,0xd2,
+ 0x28,0xa7,0x8e,0xef,0xd1,0x92,0xc6,0xd2,0xd8,0xf0,0x23,0x10,0xc3,0xb1,0x49,0x21,
+ 0x59,0x47,0xb,0xb5,0xf2,0x4f,0xf2,0x1f,0x3d,0x43,0x2b,0x7b,0x95,0x8c,0xa4,0xb9,
+ 0xcf,0xa0,0x6,0xc,0x43,0x29,0x25,0x90,0x5e,0x2f,0x43,0x4f,0x1d,0x9a,0x1c,0x7d,
+ 0x47,0xa8,0x1e,0xa5,0x74,0xf7,0x37,0x17,0x69,0xc9,0x1d,0xae,0x94,0x99,0x45,0xa2,
+ 0xa6,0x90,0x5e,0x79,0xa7,0xcb,0x62,0x9,0x96,0x4f,0xab,0xcc,0x12,0x31,0xe9,0x4b,
+ 0x48,0x8b,0x6c,0xf8,0xad,0x4f,0x6c,0x34,0x69,0xc0,0x55,0xa1,0xe8,0x74,0x19,0x3c,
+ 0x32,0xa1,0x24,0xf4,0x79,0x7,0xcb,0xfb,0x4f,0x44,0x3f,0x69,0xa7,0xe5,0xda,0xd3,
+ 0xc7,0x4e,0x72,0x1,0xc0,0x39,0x78,0xa2,0xc2,0x2b,0x43,0x55,0x3c,0xf3,0xdd,0xc8,
+ 0x10,0x13,0xb4,0x9c,0xfb,0xca,0x87,0x10,0x2,0x9c,0x71,0x70,0xc6,0x64,0xef,0x5,
+ 0x91,0xf3,0x29,0x58,0xca,0x7d,0x25,0x4,0x8,0xe3,0x93,0x37,0x5e,0x3d,0xa8,0x93,
+ 0x51,0x5e,0x4,0x5c,0x49,0x94,0x47,0xf0,0x7d,0x1f,0x21,0x8b,0x8e,0xb8,0xfa,0x4,
+ 0x7a,0xf2,0x21,0x86,0x41,0x33,0x39,0x34,0x9a,0xba,0x28,0xc,0x42,0x93,0x11,0xae,
+ 0xf1,0x89,0x1a,0x84,0x21,0x82,0x30,0x92,0x24,0x15,0x45,0x60,0xec,0xe4,0xf,0x51,
+ 0xca,0xe7,0x72,0x28,0x16,0xf2,0xb0,0x4c,0x4b,0xc6,0xac,0x49,0x6f,0xb4,0x2c,0x25,
+ 0x4,0xb1,0x29,0xa3,0x0,0xb8,0xc,0x64,0x81,0xa7,0x48,0x24,0x9e,0x96,0x78,0x56,
+ 0x7b,0xf,0x84,0x2c,0x17,0xe6,0x53,0x83,0xb1,0x7a,0x8d,0xa8,0x2a,0x86,0x4f,0x96,
+ 0x57,0xfe,0x2c,0x8b,0xab,0xf4,0x25,0x4e,0xb3,0xb9,0xe9,0x1,0xd9,0x5c,0x81,0x24,
+ 0x84,0x49,0x68,0x36,0x8c,0x14,0x2f,0x8a,0xd2,0x72,0x36,0x66,0x5a,0x15,0x21,0xf6,
+ 0x20,0x88,0xd4,0x48,0x3,0xe9,0x79,0x18,0xd9,0x4a,0xa5,0xde,0xb7,0x72,0x21,0x6,
+ 0x1a,0x47,0xae,0x2a,0x12,0x85,0x32,0x8c,0x9c,0xb3,0xbe,0x98,0x3e,0x92,0x5,0x59,
+ 0x3a,0x9f,0xd0,0xf3,0xbc,0x94,0x3c,0x7a,0xaa,0x8a,0x31,0x9e,0x3a,0x99,0x84,0xc5,
+ 0x48,0x76,0xc8,0x12,0x4f,0x7d,0x76,0x7c,0xd,0x32,0xc1,0xb3,0xd7,0xa4,0x88,0x8d,
+ 0x73,0xea,0x1a,0x85,0xc8,0x8c,0x3e,0x80,0xe8,0x6f,0xe2,0x93,0xdb,0x1a,0xbf,0x36,
+ 0xed,0x29,0xc4,0xc7,0x25,0x9,0xa7,0x31,0x9e,0x31,0xfc,0x3c,0xb1,0x9,0x22,0x13,
+ 0xda,0x4a,0xcb,0x12,0x65,0x43,0x6b,0xc7,0xf,0x4d,0x20,0x2b,0x1c,0x8c,0x73,0x44,
+ 0x2c,0x42,0xc4,0x7a,0xc3,0x5f,0x4,0x4,0x60,0x8,0x0,0x46,0xd2,0xa3,0xc1,0x18,
+ 0x43,0x18,0x46,0x20,0xa4,0x37,0x93,0x5c,0x26,0xd2,0xa3,0x64,0xae,0x85,0xef,0xfb,
+ 0x32,0xf1,0x4c,0xa4,0x28,0xa1,0x69,0x4a,0xa3,0x62,0x9a,0x26,0x2c,0xd3,0xca,0x88,
+ 0xbe,0xc5,0x2b,0xd0,0xc0,0xf3,0xe1,0x79,0x5d,0x19,0x2a,0xe8,0x13,0x81,0x8b,0x22,
+ 0x6,0x9f,0x87,0x8,0xc3,0x8,0x11,0x3b,0x35,0x84,0xd1,0x8f,0x6a,0xb9,0x8c,0x52,
+ 0xb1,0x98,0x68,0x80,0x9,0x81,0xa4,0xa4,0x59,0x56,0x60,0x9,0x70,0x95,0x1a,0x8d,
+ 0xff,0x4f,0x52,0xee,0xbb,0xc,0xbd,0x9d,0x99,0xd3,0x1,0x7,0x76,0x50,0x53,0x99,
+ 0xe3,0x89,0xf7,0x1,0x48,0xb6,0x59,0x94,0xd0,0x6c,0xcf,0xc0,0x20,0xa3,0x1f,0xc7,
+ 0xb6,0x91,0x5a,0x11,0xf,0xa,0x29,0xd,0x6a,0x40,0x4b,0xbe,0x4b,0x25,0xa0,0x7b,
+ 0x84,0x85,0x6c,0x13,0x9f,0xf2,0x72,0x8c,0x3e,0x1d,0xb4,0x24,0x27,0x91,0xea,0x92,
+ 0x4e,0x77,0x47,0x8b,0xbe,0x95,0x2f,0x17,0x5c,0x36,0xbc,0xaa,0xe7,0x63,0xc9,0x1d,
+ 0xae,0x64,0x71,0x92,0x55,0x7c,0x9a,0x58,0xfb,0x42,0x57,0xc9,0xf9,0x42,0x7a,0x44,
+ 0x66,0xf4,0x57,0x13,0x8a,0x6c,0x92,0xba,0x3f,0x27,0xd0,0xfb,0xbe,0xf8,0xfb,0x95,
+ 0xe6,0x5b,0x8a,0x24,0xe2,0xc5,0x1b,0xe7,0xb1,0x24,0x3a,0x4f,0xad,0xe0,0x5,0x7a,
+ 0xb3,0x99,0xb2,0xe4,0xc3,0x15,0xe1,0x81,0x73,0x70,0xf4,0x8,0x30,0xe,0x43,0xc5,
+ 0x9e,0x49,0x2c,0x91,0x92,0x78,0x28,0xe9,0xe3,0x27,0xc4,0x69,0x51,0x8f,0xd6,0x4,
+ 0x72,0x6,0xa0,0xdd,0xf1,0x12,0x57,0x5d,0x9e,0x90,0x3c,0xe9,0x2,0x37,0xd2,0xf3,
+ 0x8a,0x49,0x90,0x94,0x3a,0xc6,0xcd,0x74,0xa1,0xf2,0x6,0x2,0x3f,0x84,0x1f,0x45,
+ 0x0,0xa1,0x52,0x63,0xaa,0x50,0x84,0xa5,0xc8,0x23,0x26,0x11,0x23,0x5d,0x5b,0xaf,
+ 0x6c,0xa,0xe7,0xc,0xad,0x56,0xb,0x9d,0x6e,0x37,0x89,0x39,0x33,0xc6,0xb1,0xb8,
+ 0xb4,0x84,0x30,0x3c,0xfd,0xb3,0xbd,0x27,0xc6,0x57,0xa1,0x52,0x2a,0x25,0xdd,0xe7,
+ 0x8c,0x33,0x98,0x49,0xe8,0xc5,0x90,0x97,0x3b,0xe7,0x48,0x7,0xe8,0x8,0x5,0xa8,
+ 0x90,0x61,0x35,0x42,0x8,0x6c,0xdb,0xce,0xc,0xa1,0x5a,0x49,0xe4,0xd0,0x5b,0xfd,
+ 0x52,0x29,0xaf,0x91,0xf2,0x22,0xa4,0x2,0x72,0xcf,0xf0,0x1d,0x87,0xfb,0x7a,0xd4,
+ 0xb0,0x92,0x18,0xe0,0x35,0xc4,0x61,0xc9,0xde,0x8a,0xbb,0x47,0xc,0x66,0x6a,0x70,
+ 0x51,0x2c,0xeb,0xdf,0x3b,0xf7,0xa4,0xc7,0x40,0x53,0xde,0x45,0xaf,0xa9,0x54,0x65,
+ 0xa5,0x44,0xaf,0x1f,0x23,0xbb,0xe2,0x96,0x8b,0x1d,0xce,0xb8,0x32,0xca,0x42,0xce,
+ 0x8d,0x8f,0xc3,0x28,0x32,0xe6,0x94,0xf2,0x36,0x44,0x92,0x43,0x88,0x3d,0x4,0x83,
+ 0x1a,0x32,0xac,0x99,0xa,0xc3,0x2d,0x9b,0x24,0x19,0x57,0x59,0xa1,0x27,0xf4,0x99,
+ 0x31,0xf6,0xaa,0xa9,0x96,0xab,0xd0,0x4e,0x14,0xf5,0xe4,0x77,0x12,0x29,0x1e,0xd6,
+ 0xfb,0x77,0x49,0x10,0x22,0x35,0xeb,0xa6,0xe7,0x55,0x8,0x91,0xda,0x76,0x45,0xd0,
+ 0x4c,0x11,0x8d,0x8c,0x40,0x8b,0xec,0xe7,0x20,0xad,0x80,0x3b,0xe0,0xf8,0xad,0x50,
+ 0x68,0x2,0x39,0x3,0x10,0x84,0x21,0xda,0x5d,0x25,0x80,0x66,0x21,0x39,0xe1,0x29,
+ 0x25,0x60,0x7d,0x8d,0x7c,0x48,0x5d,0x1c,0x8c,0x49,0x6d,0xab,0x20,0xc,0x11,0x44,
+ 0xc,0x44,0x91,0x87,0x63,0xdb,0xb0,0x1d,0xb,0x6e,0xdc,0xdb,0x61,0x9a,0x99,0xfe,
+ 0x8e,0xf8,0x73,0xe2,0x8b,0xa6,0x98,0xcf,0xc1,0xf3,0xfd,0xa4,0xc7,0xc4,0xf,0x2,
+ 0x10,0x4a,0xb0,0xb8,0xb8,0x4,0xff,0x34,0x96,0xc8,0x12,0x0,0x23,0x43,0xc3,0x28,
+ 0xe4,0xf3,0x8,0x22,0x39,0xdb,0x3d,0x8,0x2,0x98,0x96,0x34,0xb4,0x96,0x65,0x81,
+ 0x44,0x11,0x58,0x1c,0xcf,0x8d,0x57,0xc9,0x90,0xf6,0x47,0xf6,0xcb,0x88,0xa4,0x8,
+ 0xe0,0x74,0x55,0x66,0xa5,0x1b,0xca,0xd2,0x6,0x56,0x36,0x62,0xaa,0x59,0xec,0xa9,
+ 0x91,0xa3,0xe9,0x32,0xd7,0xd8,0x88,0xf,0xe,0x13,0x89,0x3e,0x65,0xd,0xb1,0xac,
+ 0xeb,0x8c,0xf4,0xdd,0x21,0xa0,0x20,0x44,0x64,0x35,0xd1,0x28,0x85,0xa9,0x9a,0x42,
+ 0x13,0x95,0x1,0x2a,0x3d,0x6,0x2b,0x29,0x17,0xa7,0x19,0x52,0xa0,0xcb,0x7a,0x7f,
+ 0xa4,0xcf,0x10,0xe7,0xb9,0x58,0xac,0x7b,0xc6,0x78,0x42,0xf4,0x11,0xe3,0xd2,0x70,
+ 0xaa,0x91,0x3,0x8c,0xf1,0x65,0x61,0x13,0x83,0x26,0x5d,0x75,0x30,0x8,0x5,0x31,
+ 0xe5,0xa2,0x25,0xce,0xb1,0xa5,0x7b,0x90,0x7a,0xc9,0x72,0xd2,0x23,0x94,0x78,0xa4,
+ 0xb2,0xda,0x86,0x38,0x54,0xc4,0x39,0x47,0x18,0x4,0x89,0x97,0x12,0xab,0x57,0x47,
+ 0x11,0x4b,0xae,0x15,0xc6,0x38,0x22,0xce,0xa4,0x61,0x67,0x3c,0xe5,0xf5,0x8,0x30,
+ 0xd5,0x78,0x2b,0x9,0x44,0xe5,0x48,0x58,0xb6,0x5a,0x29,0x1b,0x8a,0x4a,0x85,0x99,
+ 0xfa,0xbd,0xbd,0xb3,0x8,0x9a,0x40,0xce,0x10,0x78,0xbe,0x3c,0xf9,0x73,0xae,0x3,
+ 0xbb,0x6f,0x86,0x77,0x52,0xd5,0x91,0xba,0x78,0xe2,0x5e,0x90,0x30,0x8a,0xe0,0x87,
+ 0x11,0xc,0x6a,0xc0,0x71,0x4c,0xb8,0x8e,0x9d,0x8c,0x78,0x75,0x1c,0x1b,0x76,0x8a,
+ 0x40,0xa4,0x98,0x9c,0x9a,0x6c,0x26,0xd2,0x2b,0x2f,0xd9,0xc0,0x18,0x8b,0x20,0x86,
+ 0x91,0x93,0x34,0x34,0x4e,0xcf,0xcc,0xc1,0x3b,0x4d,0xab,0x79,0xcb,0xb2,0x70,0xee,
+ 0x9a,0xd5,0xb0,0x2d,0xb,0x11,0xe3,0xf0,0x7c,0x1f,0x5d,0xcf,0x4b,0x92,0xfc,0xae,
+ 0xe3,0x20,0xa0,0xb2,0xd7,0x85,0x30,0xd9,0x7b,0x22,0xb8,0x24,0xf,0x2a,0x93,0x22,
+ 0x49,0x3e,0xc4,0x34,0xcd,0x93,0x2a,0x79,0x42,0xfa,0x2a,0x80,0x28,0x35,0x7a,0xe5,
+ 0xd6,0xa6,0x91,0xac,0x88,0xcd,0xbe,0xdc,0x44,0xbf,0x81,0xcf,0x26,0xa8,0xd3,0x24,
+ 0x21,0x6,0x7a,0x15,0x4,0xe9,0x58,0x7c,0x56,0x49,0x36,0xed,0xbd,0x18,0x94,0x24,
+ 0x4d,0x97,0x69,0x15,0x83,0x58,0x51,0x40,0x6e,0x17,0xc9,0xc8,0x80,0xa4,0x73,0x4,
+ 0x4c,0x85,0x4d,0x0,0xa1,0xce,0x2b,0xa6,0x9a,0x44,0xa3,0xa4,0xdf,0xa7,0x97,0xf8,
+ 0xcd,0xe6,0x0,0x44,0x2a,0xdc,0x15,0xef,0xb,0xcb,0x34,0xe1,0x3a,0x46,0x12,0xda,
+ 0xea,0x85,0xe3,0xcc,0xa4,0x28,0x3,0x20,0xa0,0x46,0x2f,0xbc,0x95,0xce,0xeb,0x71,
+ 0xce,0x11,0x32,0x26,0xf5,0xd5,0x94,0x8,0xa8,0x5c,0x2c,0x45,0xc9,0xb9,0x1f,0x85,
+ 0x72,0x9c,0x33,0xe3,0x42,0x86,0x72,0x19,0x3,0x63,0xbd,0x90,0x6f,0x4f,0xa3,0x2d,
+ 0x1e,0x39,0xc0,0x53,0x89,0x63,0x9e,0x29,0x5b,0x15,0x83,0xf6,0xbf,0x86,0x26,0x90,
+ 0x33,0x9,0x61,0x14,0x21,0x6a,0x33,0x18,0x5d,0xa,0xdb,0x52,0x86,0x49,0x29,0x88,
+ 0xc6,0x86,0x23,0x5e,0xf9,0x44,0x9c,0x81,0x45,0xf2,0x42,0x22,0x84,0xc0,0x72,0x4d,
+ 0xd8,0x96,0x9,0xd7,0xb5,0x91,0x77,0x5d,0x38,0x8e,0xd,0x47,0x11,0x51,0x3c,0xef,
+ 0x3c,0xee,0xe6,0x8e,0xf3,0xe6,0x71,0x7c,0x9a,0x12,0xf9,0x1d,0x6,0x97,0xc9,0x73,
+ 0x83,0x52,0x18,0xaa,0xba,0x4b,0x70,0x81,0xfd,0x87,0x26,0x4f,0x4b,0x28,0xcb,0x71,
+ 0x1c,0x9c,0xbf,0x61,0x3,0xc,0xc3,0x4,0xe7,0x5d,0x1c,0x5e,0x58,0x40,0x10,0xf8,
+ 0x68,0x77,0xda,0x68,0xb6,0x5a,0x8a,0x58,0x8d,0x9e,0xd7,0x15,0x86,0x60,0x11,0x43,
+ 0x4,0x96,0x90,0x88,0xe0,0xbd,0x95,0xa1,0x6d,0xdb,0xf0,0x3c,0xef,0xa8,0xdb,0x3e,
+ 0xa8,0xbc,0x55,0x96,0xb4,0x1a,0x99,0xea,0x33,0xd3,0x32,0x61,0x1a,0xa9,0x4a,0x35,
+ 0x64,0x1b,0xd3,0x6,0x85,0x97,0x7a,0x8e,0x44,0x1f,0x49,0xf4,0x7b,0x2e,0x0,0x90,
+ 0xf2,0x34,0xd3,0x1e,0x4c,0xcf,0x5b,0xe8,0x91,0x82,0xdd,0xa7,0x16,0x20,0x73,0xc,
+ 0x48,0x92,0xe7,0xf1,0xe6,0xc4,0x21,0x98,0x78,0x85,0xee,0xf9,0xa1,0xf4,0x32,0x95,
+ 0x81,0x8d,0x57,0xeb,0xf1,0xf8,0x5e,0x9e,0x22,0x91,0x4c,0x19,0x6c,0xaa,0x5c,0x36,
+ 0x5e,0x90,0xc4,0x23,0x90,0xb3,0xe3,0x90,0x7b,0xdb,0x1a,0x7b,0x4b,0xb1,0x17,0x23,
+ 0x8d,0x3c,0x4b,0x88,0xa8,0xeb,0xf9,0xf0,0x83,0x30,0xc9,0xad,0x85,0x51,0x84,0x30,
+ 0x8c,0x10,0x44,0x21,0x38,0x93,0x24,0x16,0x45,0x91,0x9a,0xbe,0xc9,0xfa,0xd4,0x9e,
+ 0xfb,0xc2,0x4b,0xe9,0x52,0xd7,0x4c,0x3f,0x86,0x86,0x26,0x90,0x97,0x19,0x84,0x10,
+ 0x89,0xcc,0x7a,0xb2,0xf2,0xcd,0xd4,0xed,0xa7,0xba,0x47,0x21,0x54,0x79,0x23,0x55,
+ 0x17,0xb7,0x9,0xdb,0xb4,0xd4,0x5f,0x53,0x8d,0xa8,0x95,0x17,0x79,0x22,0xc3,0x8e,
+ 0x38,0x99,0x27,0xe3,0x3e,0x2,0x14,0x1c,0x5c,0xc5,0xdc,0xe3,0x1b,0x85,0x10,0x26,
+ 0x1c,0x9b,0xa3,0x50,0xc8,0x25,0x43,0x9d,0x4e,0x35,0x8a,0xf9,0x3c,0xd6,0xac,0x5e,
+ 0xd,0xc3,0xa0,0xf0,0x7c,0x1f,0x73,0x87,0xf,0x43,0x8,0x8e,0xa9,0x99,0x59,0x4c,
+ 0xcd,0x1d,0x46,0x21,0xe7,0xa2,0x58,0xc8,0x23,0xef,0xba,0x28,0xe6,0xf3,0xf0,0x82,
+ 0x0,0x41,0x10,0x80,0x4,0xa1,0x5c,0x7d,0x72,0xe,0x6c,0x1e,0xeb,0x23,0x0,0x0,
+ 0x20,0x0,0x49,0x44,0x41,0x54,0x4a,0x69,0x26,0x4e,0xdd,0xd3,0xcc,0x12,0x6a,0x80,
+ 0x16,0x4d,0x3a,0xa6,0x4d,0xc3,0x90,0xa4,0xa4,0x3c,0x89,0xb8,0x49,0xce,0x4c,0x19,
+ 0x43,0xa2,0xb4,0x36,0x8,0x6,0x35,0x3f,0xa7,0xba,0x88,0xfb,0x87,0x5,0xf5,0xf2,
+ 0xc5,0x3d,0xf,0x22,0x5d,0xe,0x4a,0x7a,0x1e,0x42,0x5c,0x3d,0x15,0x7b,0xf,0x86,
+ 0x41,0x25,0x59,0xa9,0xed,0x89,0x4b,0x58,0xe3,0xf3,0x21,0x5e,0x4d,0x27,0x71,0xf7,
+ 0x88,0xab,0x62,0xc,0x59,0x68,0xc1,0x18,0x53,0x24,0xc1,0x93,0x58,0x7d,0xe2,0x3d,
+ 0x28,0xe2,0x22,0x49,0x33,0x9d,0xf4,0x9a,0x62,0x25,0x3,0xd3,0x30,0x92,0x70,0xa7,
+ 0xa1,0xee,0x3b,0x96,0x95,0x4a,0x98,0x4b,0x8f,0x41,0x26,0xb7,0x45,0x52,0xe,0x1b,
+ 0x87,0x8b,0xe4,0x31,0x9,0xe5,0x98,0xe0,0x30,0x54,0x4d,0xaf,0x92,0x1c,0xfc,0x30,
+ 0x44,0x14,0x32,0x15,0xee,0x52,0xe1,0x25,0xde,0xf3,0xe,0xd2,0x49,0x6a,0x91,0xd9,
+ 0xbf,0x67,0x5f,0x68,0x48,0x13,0x88,0xc6,0x69,0x88,0xad,0xc7,0x86,0x87,0xa4,0xea,
+ 0xd7,0x63,0xb9,0x1d,0xb9,0x4a,0xe4,0x82,0x67,0x42,0x1a,0x32,0xd1,0xd9,0x7b,0x6c,
+ 0x19,0x32,0xf9,0x68,0x59,0x66,0xe2,0xc1,0xc8,0x5c,0x7,0x4b,0x56,0xa1,0xe0,0xb2,
+ 0x21,0x8f,0xa4,0x56,0xc6,0x54,0x25,0x5b,0x2d,0xc3,0x80,0xeb,0xd8,0xa7,0x85,0x40,
+ 0xd6,0x9d,0x73,0xe,0x86,0x2a,0x15,0x44,0x8c,0x63,0x7a,0x66,0x6,0x8b,0x4b,0x75,
+ 0x84,0x51,0x88,0xd9,0xc3,0x8b,0x52,0x76,0xa5,0xdd,0x41,0xb3,0xdd,0x81,0x41,0x29,
+ 0xca,0xc5,0x2,0xca,0xa5,0x2,0xa,0xf9,0x3c,0x4c,0x33,0x44,0x18,0xca,0xd5,0xac,
+ 0x40,0xb6,0x51,0xce,0x34,0xc,0x70,0xae,0xf2,0x43,0x2a,0x8c,0x67,0x9a,0x66,0x26,
+ 0x1,0x4c,0x90,0xaa,0xa,0x2,0x52,0x64,0xd1,0xdf,0x98,0xd5,0x1f,0xe6,0x48,0xcb,
+ 0x5c,0xd0,0x94,0x78,0x1e,0x49,0x8e,0x81,0xac,0x88,0x33,0x12,0x79,0xfd,0xf8,0xbb,
+ 0x33,0xd,0x71,0x20,0x99,0xa6,0x34,0xc1,0x24,0x21,0x84,0x51,0x24,0x13,0xcf,0xe9,
+ 0xbc,0x43,0x2a,0x94,0x94,0x94,0x6d,0xa6,0xd2,0x22,0x31,0x39,0x24,0xe1,0x2b,0x45,
+ 0x88,0xb1,0x27,0x4a,0x33,0x3d,0x3d,0xf1,0x9c,0x8c,0x1e,0x49,0x45,0x11,0x4b,0x42,
+ 0x45,0x61,0x14,0xa1,0xd3,0xe9,0x62,0x29,0x6a,0xc1,0xf,0x3,0xf8,0x81,0xf4,0xf8,
+ 0xba,0x9e,0x87,0x20,0x8,0x11,0x71,0xae,0xfa,0x7f,0x98,0xaa,0xd4,0x63,0x19,0xaf,
+ 0x47,0x8,0x2c,0xeb,0x63,0xd0,0xd0,0x4,0xa2,0x71,0x2a,0x49,0x43,0x59,0x81,0xb8,
+ 0xe7,0x23,0x31,0x58,0x29,0x39,0x21,0xce,0xb3,0x9d,0xa8,0x24,0x31,0x6e,0xb2,0xea,
+ 0x43,0xa4,0xaa,0x4a,0x78,0x52,0x19,0x22,0x92,0x10,0x89,0x20,0xaa,0x8b,0x3b,0x35,
+ 0x39,0x30,0x53,0x59,0x92,0xaa,0x20,0x39,0x9d,0x17,0xfe,0x25,0xe7,0x9f,0x7,0xdb,
+ 0xb6,0xb1,0x38,0x37,0x8f,0xbd,0x7,0xf,0x80,0x31,0x86,0xc5,0xa5,0x26,0x18,0x63,
+ 0x99,0xc6,0x38,0x4a,0x8,0x42,0xce,0xd1,0xf6,0x2,0x98,0x96,0xd,0x47,0xe5,0x7b,
+ 0xd2,0x2a,0xaf,0x46,0xaa,0x24,0x39,0x9,0x1,0xf6,0xe2,0x46,0x29,0x5d,0xa0,0xb4,
+ 0x24,0x4,0xe9,0x55,0xcb,0xa4,0x15,0xee,0xfa,0x24,0x26,0x32,0x1a,0x4a,0x29,0x19,
+ 0xfd,0x2c,0x79,0xd0,0xc1,0xdf,0x29,0x4,0x22,0xce,0xc1,0xc3,0x48,0x56,0xe8,0x64,
+ 0x1a,0xcc,0xd0,0xeb,0x1f,0x40,0xb6,0x5f,0x20,0x1d,0x26,0x4b,0x2a,0xb6,0x52,0x79,
+ 0x10,0x53,0xc9,0x9c,0x27,0x4,0xa2,0xf4,0x67,0x8,0xa1,0x49,0x95,0x13,0xe3,0x1c,
+ 0xdd,0xae,0x27,0x7b,0x79,0x58,0x84,0x30,0x94,0xaa,0x1,0xbe,0xf2,0x14,0x58,0x24,
+ 0xe7,0xc6,0x44,0x7d,0x39,0x8f,0xc4,0x7b,0xe1,0xe9,0x7c,0x81,0xf6,0xa,0x34,0x81,
+ 0x68,0xac,0x28,0x24,0x33,0xe,0x54,0x6c,0x3d,0x9e,0x2c,0x19,0x87,0x9b,0xd8,0x11,
+ 0xba,0xcb,0x59,0x1c,0xb,0x56,0xd,0x89,0x71,0x53,0xa1,0xf4,0x54,0x54,0xb9,0x6f,
+ 0x10,0x4a,0x59,0xf4,0x74,0xa8,0x8c,0xf3,0x64,0x85,0xcb,0xd4,0xea,0x31,0xa9,0xa0,
+ 0x89,0x58,0x12,0x87,0x3e,0xd5,0xdd,0xdd,0x84,0x10,0xe4,0x73,0x2e,0x2e,0xbb,0xe8,
+ 0x22,0x0,0x4,0xfb,0xe,0x1d,0xc0,0xf4,0xcc,0xc,0x62,0xdd,0xad,0x55,0x63,0xa3,
+ 0x49,0x68,0xc9,0xb6,0xec,0x64,0x55,0xdd,0x2b,0x39,0xb5,0x92,0x24,0x71,0x3a,0xd4,
+ 0x12,0x87,0x81,0xd2,0xe1,0x41,0xae,0xaa,0x85,0x18,0x53,0xa1,0x1e,0x16,0xa9,0x95,
+ 0xfc,0x72,0xf1,0xba,0x8c,0x97,0x42,0x7a,0xc9,0xde,0x8c,0x8c,0xf7,0xb2,0xfe,0x3c,
+ 0x69,0x64,0x19,0x63,0x99,0xee,0xe7,0x74,0x87,0xf1,0x20,0xe3,0x1b,0x7f,0x26,0x35,
+ 0x28,0x4c,0x62,0xf4,0x24,0x3c,0xd4,0xb9,0xc0,0x38,0x4f,0x44,0x2c,0x5,0xe7,0x0,
+ 0x1,0xc2,0x88,0xc1,0x8b,0x82,0x24,0xa7,0xe1,0x7b,0x1,0xc2,0x38,0x77,0xa0,0x4,
+ 0x2e,0xe3,0x90,0x56,0x94,0xaa,0x96,0xca,0x6c,0x93,0xbe,0xec,0x34,0x34,0x81,0x9c,
+ 0x1d,0x88,0xc3,0x53,0x72,0x65,0x8a,0xe3,0x4e,0x4,0xa,0xce,0x11,0x86,0x61,0x52,
+ 0x4a,0x19,0x27,0xd6,0x89,0x2a,0x45,0x8c,0xa2,0xa8,0x37,0xbe,0x53,0x55,0x73,0x49,
+ 0xdb,0x96,0xaa,0x7a,0x89,0x1b,0x9c,0x14,0xa1,0x44,0x51,0x84,0x48,0x25,0xaa,0x63,
+ 0x91,0xc5,0x17,0x1e,0x86,0xeb,0xd5,0xf4,0xa7,0xbb,0xe0,0xd,0x35,0x7f,0xda,0xb2,
+ 0x4c,0x6c,0x5c,0xb7,0xe,0xeb,0xd7,0x9e,0x83,0xfa,0xd2,0x12,0x76,0xed,0xdd,0x83,
+ 0x76,0xb7,0x23,0x55,0x86,0x6d,0xb,0xa3,0xc3,0xb5,0xcc,0x78,0xde,0x74,0x85,0x91,
+ 0xe3,0xd8,0x58,0x3d,0x36,0xae,0x2a,0xcd,0xe4,0x9c,0xf5,0x58,0x16,0x43,0xf6,0xcc,
+ 0x88,0xc,0xa9,0xfa,0x81,0xf,0xcf,0xf7,0x65,0xd3,0x65,0x28,0xe3,0xf5,0xd2,0xa8,
+ 0x8a,0x65,0x7a,0x45,0xcb,0x5c,0xc3,0xbe,0xfe,0xa,0xd1,0x3f,0xea,0x34,0x33,0x5f,
+ 0x5a,0x76,0x82,0x73,0xc1,0x7b,0xd5,0x3f,0x89,0x17,0xd2,0xcb,0x61,0x9,0x21,0x94,
+ 0x91,0x8f,0x10,0x31,0x29,0x8d,0xf,0xc1,0xe1,0x87,0x51,0x92,0xe4,0x8e,0xab,0xa1,
+ 0x92,0x63,0xc4,0x97,0xe7,0xb,0xb4,0x57,0xa0,0xa1,0x9,0xe4,0xe5,0x4e,0x20,0xe2,
+ 0x85,0x19,0x0,0x1,0xa0,0xeb,0x5,0x28,0xe4,0x42,0x59,0x2,0x1b,0x19,0x3d,0x59,
+ 0x9,0x43,0x80,0xf3,0xf4,0xc0,0xa9,0x4c,0xcf,0x72,0x46,0xfa,0x21,0x5d,0xe5,0x12,
+ 0x45,0x11,0x82,0x20,0x44,0xa3,0xd5,0x46,0x70,0x1c,0xfd,0x14,0xfd,0x43,0x82,0x64,
+ 0x98,0xc5,0xe8,0xcd,0xa2,0x1e,0x20,0xc4,0x68,0xa6,0x74,0x9a,0x2e,0xda,0xb4,0x9,
+ 0xd5,0x4a,0x5,0xcf,0xef,0xd8,0x8e,0xb9,0xf9,0x79,0x30,0x26,0xc5,0x5c,0x72,0x8e,
+ 0xdb,0xab,0x16,0x3,0x92,0x8e,0x79,0x99,0xef,0x91,0x33,0xd6,0x2f,0xbf,0xe4,0x12,
+ 0x54,0x4a,0xe5,0xa4,0x69,0xd2,0x52,0xe2,0x8a,0x49,0xa9,0x73,0x10,0xc0,0xb,0x7c,
+ 0x78,0x9e,0x87,0xae,0xd7,0x45,0xbb,0xd3,0x46,0xab,0xdd,0x46,0xb7,0xdb,0x45,0xa7,
+ 0xdb,0x91,0xb1,0x7d,0x25,0xff,0x92,0x16,0x6,0x4c,0x4b,0x42,0xa4,0x8f,0x4f,0x6c,
+ 0xfc,0x23,0x26,0x7b,0x66,0xa4,0x32,0x72,0xa4,0xfa,0x72,0x24,0x51,0xa5,0xe5,0xee,
+ 0xfd,0x20,0x94,0x83,0xbb,0x54,0xce,0xa9,0x57,0xf5,0x24,0x92,0x30,0x56,0x72,0xec,
+ 0xb5,0x67,0xa0,0xa1,0x9,0x44,0xe3,0x74,0x23,0x8,0xa5,0xb1,0x4f,0xe6,0xaa,0xb,
+ 0x1,0x96,0x34,0x66,0x91,0x44,0xce,0x1a,0x89,0x97,0xd3,0x23,0x91,0x74,0xe2,0x33,
+ 0x36,0x82,0xf1,0xe7,0xd5,0x97,0x9a,0x3,0x87,0x4,0xc5,0x31,0xf7,0x38,0xc7,0x60,
+ 0x18,0x66,0xd2,0xa9,0x1c,0x37,0xc7,0xc5,0xc9,0x62,0x69,0xd4,0x65,0x49,0xb1,0x63,
+ 0xdb,0x49,0x8f,0x49,0xce,0x75,0x61,0xab,0xc7,0x57,0x5c,0x7a,0x29,0x7c,0xdf,0xc3,
+ 0xf3,0x3b,0xb7,0xa3,0xeb,0x79,0x60,0x5c,0x36,0xc3,0xd9,0x44,0x55,0x41,0xa9,0xca,
+ 0xa5,0x44,0x5a,0xc3,0xa0,0x30,0x28,0xc0,0x78,0x4,0x22,0x38,0xae,0xbc,0xec,0x32,
+ 0xc,0xd5,0x86,0x92,0x3e,0x84,0x38,0x44,0xe5,0x7,0x1,0xba,0x5e,0x17,0x9d,0x76,
+ 0x7,0xad,0x76,0xb,0x8d,0x56,0xb,0x8d,0x66,0x3,0xd3,0x73,0xb3,0x58,0x58,0xac,
+ 0x4b,0x12,0x50,0x9,0xe0,0x6e,0xd7,0xef,0xf5,0x15,0x70,0x86,0x76,0xbb,0xdb,0xeb,
+ 0xf4,0xf,0x42,0xd9,0x64,0xe9,0x7,0x9,0x1,0x64,0x9a,0xe5,0xb8,0xc8,0x14,0x3a,
+ 0x68,0x68,0x68,0x2,0xd1,0x38,0xa3,0xd0,0xf5,0x3,0x14,0x19,0x97,0x4d,0x89,0x9c,
+ 0xf7,0xea,0xf5,0x63,0x9,0x93,0xd4,0xc,0xe6,0xb4,0x84,0x73,0x94,0xc,0x85,0x52,
+ 0xdd,0xbb,0xaa,0xc4,0xd2,0x8f,0x18,0x5c,0xd7,0x81,0xb,0x37,0xd1,0xce,0x22,0x7d,
+ 0x42,0x73,0x89,0x1a,0x51,0x3c,0x5b,0x9d,0x33,0x55,0xe5,0x43,0x60,0x5b,0x36,0x72,
+ 0xae,0x8b,0x9c,0xeb,0xa2,0x58,0x28,0xa0,0x58,0x28,0xa2,0x58,0x28,0xa0,0x5c,0x2c,
+ 0xa2,0x90,0xcf,0x23,0x9f,0xcf,0xcb,0x2a,0x2a,0xc3,0xc0,0x39,0xab,0xc7,0x71,0x68,
+ 0x7a,0xa,0xf3,0xb,0xb,0x88,0x98,0x54,0xbb,0x92,0x5a,0x7b,0x34,0x2b,0xce,0x97,
+ 0x1e,0xf6,0x23,0x1b,0x3f,0xf0,0xf4,0xd6,0x67,0x51,0x2e,0x97,0x71,0xd5,0x2b,0xaf,
+ 0x44,0xb9,0x5c,0x81,0xe7,0x77,0x30,0x35,0x33,0x8d,0x46,0xa3,0x81,0xc5,0xc5,0x3a,
+ 0x1a,0xcd,0x26,0x2c,0xcb,0x4,0x63,0x11,0xe,0x4e,0x4d,0x63,0xeb,0xf6,0xed,0x98,
+ 0x3b,0x7c,0x18,0x8d,0x56,0xb,0x5d,0xcf,0x93,0x6a,0xc2,0x41,0x8,0x3f,0xc,0x7a,
+ 0x2,0x7d,0x22,0x35,0x58,0xa7,0xbf,0xd9,0x4c,0x43,0x43,0x13,0x88,0xc6,0xd9,0x6,
+ 0xce,0x39,0xf2,0x39,0x17,0xf9,0x7c,0xe,0xd3,0xb3,0x73,0x70,0x6d,0xd9,0x89,0xde,
+ 0x93,0xf3,0x26,0xcb,0x66,0xe7,0x84,0x61,0x84,0x56,0x47,0x56,0xe6,0xf0,0x94,0x74,
+ 0x77,0xac,0x9a,0x91,0x90,0x84,0x12,0x76,0x93,0x71,0x7e,0x82,0xf4,0x50,0x92,0x74,
+ 0x82,0x99,0x26,0x5d,0xc8,0xe,0xa,0xf9,0x3c,0xca,0x6a,0xb4,0x6d,0xad,0x5a,0x45,
+ 0xad,0x52,0x45,0xb5,0x52,0x41,0xa5,0x5c,0x41,0xb9,0x58,0x44,0xa5,0x5c,0x42,0x3e,
+ 0x9f,0x47,0x18,0x4,0xa0,0x44,0x60,0xef,0xfe,0xfd,0x8,0x82,0x0,0x8c,0x31,0x18,
+ 0xa6,0x89,0x4e,0xa7,0xd,0x21,0x38,0x82,0x20,0x4c,0x8c,0x3a,0x63,0x2,0x9e,0xef,
+ 0xa9,0x50,0x50,0x3c,0x58,0x8b,0xe3,0x7f,0xfe,0xfb,0x23,0xb0,0x6d,0x7,0x4,0x4,
+ 0x11,0x63,0xf0,0x7c,0x5f,0xe5,0x17,0x64,0x85,0x91,0x6d,0x9a,0xb8,0xfc,0xa2,0xb,
+ 0xf0,0xdc,0xae,0x3d,0x58,0x6a,0x36,0x8f,0x6b,0xb0,0x95,0x86,0x86,0x26,0x10,0x8d,
+ 0xb3,0x1e,0x69,0x99,0xf6,0x66,0xbb,0xa3,0x3a,0x7d,0x65,0x82,0x78,0xa4,0x56,0x85,
+ 0x6d,0x5b,0x8,0x23,0x86,0xc0,0xf3,0x11,0x45,0x2c,0x49,0x83,0x70,0x2e,0xd0,0xf5,
+ 0x7c,0x29,0x6c,0x27,0x44,0x32,0x7,0xa1,0x37,0x0,0x87,0xf4,0xbc,0x96,0xf4,0xfc,
+ 0x83,0x94,0x56,0x52,0xba,0x5c,0x35,0x1b,0x22,0xe3,0x8,0x59,0x84,0x20,0xc,0xd0,
+ 0xf1,0x3c,0x18,0xad,0x36,0xda,0x9d,0x2e,0xa6,0x66,0x67,0x93,0xbe,0x16,0x4a,0x28,
+ 0x1a,0xcd,0x26,0x5e,0x75,0xc5,0x2b,0x71,0xde,0xba,0x73,0x30,0x33,0x37,0x7,0xce,
+ 0x5,0x9a,0xed,0x36,0xb6,0xed,0xda,0x23,0x3b,0x95,0x95,0x26,0x96,0x10,0x62,0x99,
+ 0xa,0xe9,0x89,0x78,0x4,0x41,0x10,0x60,0x71,0xa9,0x8e,0x5a,0xa5,0x84,0x46,0xb3,
+ 0xa9,0x4f,0x1a,0xd,0xd,0x4d,0x20,0x2f,0x3f,0x92,0xe8,0xaf,0x6a,0xca,0xc8,0x61,
+ 0x10,0xa0,0xd9,0x6a,0xa3,0xd9,0x6e,0xab,0x52,0x4d,0x2,0xc7,0xb1,0x31,0xb1,0x6a,
+ 0xc,0x9d,0xae,0x87,0xf9,0xc5,0x3a,0xe6,0x17,0x67,0x33,0x69,0xf4,0xb8,0x81,0x30,
+ 0x3d,0x93,0x81,0xf6,0x79,0x15,0x89,0xb1,0x16,0xb1,0xc0,0x5c,0x5a,0x8a,0xbb,0x77,
+ 0x3f,0xe,0xff,0xf4,0x42,0x3e,0xd9,0xd1,0x9c,0xfd,0xc3,0x72,0x38,0x93,0x93,0x13,
+ 0xd7,0x4e,0x8c,0xc3,0x32,0x1,0xcf,0xf7,0xc0,0xb9,0x40,0xbd,0xd1,0xc4,0x42,0x7d,
+ 0xe9,0xa4,0xef,0xc3,0xf9,0xc5,0x3a,0xce,0x5b,0x77,0x2e,0x26,0x67,0xe7,0xc0,0x3c,
+ 0x5f,0x9f,0x54,0x1a,0x1a,0x9a,0x40,0xce,0x2e,0xd0,0x54,0xdf,0x42,0x5a,0x81,0x37,
+ 0x5e,0xe1,0x67,0xa7,0x35,0xc7,0x6,0x5c,0x75,0xa8,0xab,0x46,0xb8,0x5e,0xdf,0x1a,
+ 0x5,0x57,0x72,0x1e,0x61,0x24,0x85,0xe9,0x58,0xc4,0xd4,0x6b,0x48,0x86,0x44,0xfa,
+ 0x47,0x75,0x1e,0x39,0xfe,0x2f,0x6,0x4f,0x27,0x7d,0x81,0x28,0xe6,0xf3,0x18,0xae,
+ 0x55,0x30,0x39,0x35,0x99,0xc8,0x71,0xcc,0xcc,0xcd,0x9f,0x92,0x7d,0x3b,0xbf,0xb8,
+ 0x84,0xb,0x37,0x52,0x8c,0xd4,0xaa,0x38,0x34,0x3d,0xab,0x73,0x1a,0x1a,0x1a,0x9a,
+ 0x40,0xce,0x52,0xf2,0x50,0xc6,0x9b,0xa7,0xbb,0xcd,0xd5,0x1d,0x92,0x16,0x5a,0x4a,
+ 0x89,0xf6,0x11,0x8,0x14,0x72,0x2e,0xf2,0xf9,0x3c,0x16,0xea,0x72,0x9e,0x7,0x67,
+ 0x3c,0x79,0x7d,0xc7,0xb,0xe0,0x29,0x5d,0xa8,0x93,0x49,0x2,0x2f,0x6,0xc3,0xb5,
+ 0x1a,0x8a,0x85,0x3c,0xa6,0xa6,0xa5,0x60,0x63,0x43,0x85,0xba,0x4e,0x5,0x84,0x10,
+ 0x58,0x5c,0x6a,0x60,0x6c,0xa8,0x86,0x99,0xb9,0x79,0xd9,0x73,0xa1,0xa1,0xa1,0x71,
+ 0x64,0x9b,0xa4,0x77,0xc1,0x99,0x83,0xfe,0x89,0x68,0xbc,0x7f,0x42,0x9a,0x6a,0xf4,
+ 0x8b,0x52,0x95,0x52,0xf1,0xfd,0xb8,0x7a,0xaa,0x50,0x2c,0x60,0xed,0x9a,0x71,0x50,
+ 0x4a,0x93,0x72,0x53,0x10,0xf9,0x19,0x41,0x18,0xf4,0x7a,0x19,0x56,0xc8,0x6f,0x1e,
+ 0x1e,0xaa,0xf5,0xc6,0x72,0x72,0x81,0xc5,0xfa,0xd2,0x29,0x9d,0xe3,0x31,0x39,0x3b,
+ 0x87,0xa1,0x5a,0x5,0x96,0x6d,0xeb,0x13,0x4e,0x43,0x43,0x13,0xc8,0xd9,0x49,0x20,
+ 0x83,0x6e,0xb1,0xa7,0x71,0xf4,0xf,0x81,0xea,0xc4,0x96,0xf,0x59,0x3c,0xf7,0x0,
+ 0x38,0xbe,0x29,0x77,0xa7,0x19,0x13,0xab,0xc6,0xd0,0x68,0x36,0x0,0x0,0x41,0x18,
+ 0x61,0xbe,0x5e,0x4f,0xbc,0xae,0x53,0x1,0xdf,0xf,0xe1,0xd8,0x36,0x72,0x8e,0x26,
+ 0x10,0xd,0xd,0x4d,0x20,0x1a,0x7d,0xfc,0x21,0x96,0x91,0x52,0xfc,0xd7,0xa4,0x2b,
+ 0x2b,0xa2,0x49,0x8,0xc1,0x39,0xab,0xc7,0xd1,0xe9,0x76,0x1,0x42,0xe0,0x5,0x1,
+ 0x96,0x1a,0x8d,0x53,0xfa,0x9d,0x61,0x14,0xa1,0xd3,0xed,0x22,0x9f,0xcb,0x65,0x42,
+ 0x86,0x1a,0x1a,0x1a,0x9a,0x40,0x34,0x81,0xf4,0x2d,0xde,0x13,0xa1,0x40,0x1,0x98,
+ 0xa6,0xb1,0xa2,0xb6,0xb5,0x90,0xcf,0xa1,0x5c,0x2c,0xc8,0xd9,0x27,0x2,0x68,0x34,
+ 0xdb,0xe8,0xbe,0x8,0xdd,0xad,0xe3,0x41,0xc4,0x18,0xea,0x8d,0x26,0x2a,0xa5,0xe2,
+ 0x8a,0xf4,0xc8,0x34,0x34,0x34,0x81,0x68,0xbc,0x64,0x88,0x5,0xf6,0x92,0xc7,0xaa,
+ 0x31,0x50,0xac,0x40,0xa1,0xbd,0x55,0x23,0x23,0x4a,0x31,0x58,0xaa,0xcc,0xce,0x2f,
+ 0x2c,0x9c,0xf2,0xdc,0x8c,0xcc,0x5,0x45,0xc8,0xbb,0xb9,0x44,0xfd,0x58,0x43,0x43,
+ 0x43,0x13,0x88,0x6,0x96,0x37,0xd7,0x71,0xd6,0x9b,0xce,0x47,0x8d,0x95,0x75,0x3a,
+ 0xac,0x19,0x5f,0x95,0xf4,0x9e,0x44,0x61,0x84,0xc5,0xa5,0xa5,0xd3,0xf2,0xbd,0x51,
+ 0x14,0x49,0xd5,0x5e,0xc3,0xd0,0x27,0x8c,0x86,0x86,0x26,0x10,0x8d,0xc,0x89,0xa4,
+ 0xbb,0x45,0x84,0xe8,0xcd,0x52,0x5f,0x49,0x27,0x26,0xa5,0x18,0xaa,0x55,0x93,0xa1,
+ 0x27,0x4b,0xad,0x16,0x5a,0xa7,0xa8,0x7c,0xb7,0x1f,0xed,0xae,0x97,0xcc,0x15,0xd7,
+ 0xd0,0xd0,0xd0,0x4,0xa2,0x11,0x7b,0x1c,0x6a,0xf0,0x50,0xc6,0x23,0x91,0x3d,0x87,
+ 0x3d,0x9d,0xab,0x15,0x0,0xcb,0x34,0x51,0x2b,0x97,0x13,0x62,0x5b,0x6a,0xb6,0xe0,
+ 0x7,0xc1,0x69,0xf9,0xee,0x4e,0xd7,0x53,0x52,0xf2,0x9a,0x40,0x34,0x34,0x34,0x81,
+ 0x68,0xa4,0x19,0x23,0x33,0x57,0x44,0x24,0xff,0x1,0x8c,0xaf,0x1c,0x2f,0xc4,0x75,
+ 0x1d,0xac,0x1e,0x1b,0x49,0xc2,0x6b,0x4b,0x8d,0xe6,0x29,0x9f,0x7c,0x98,0x26,0x55,
+ 0xc7,0xb2,0x33,0xd3,0xa,0x35,0x34,0x34,0x34,0x81,0x68,0xa0,0x3f,0x84,0x85,0x24,
+ 0x84,0x75,0xba,0xc,0xf4,0xf1,0xa0,0x98,0x2f,0x20,0x9f,0xcb,0xcb,0xfc,0x7,0xe3,
+ 0xa7,0x2d,0xff,0x21,0x41,0x60,0x9a,0x46,0x46,0xce,0x45,0x43,0x43,0x63,0x39,0xb4,
+ 0x94,0xc9,0xd9,0xba,0x32,0x50,0x53,0xf9,0xc,0x43,0xca,0xb4,0x43,0x0,0x11,0x8b,
+ 0x7a,0x33,0xd4,0xb3,0xf3,0x57,0xa5,0x3a,0x6e,0xb8,0x72,0x8,0xa4,0x5a,0x29,0x27,
+ 0xc6,0x3c,0x8c,0xa2,0xd3,0x4a,0x20,0x52,0x61,0x98,0x9e,0xd2,0x86,0x45,0xd,0xd,
+ 0x4d,0x20,0x1a,0x2b,0x6,0x84,0x10,0x39,0x67,0xc3,0x75,0x61,0x5b,0x72,0xfe,0x37,
+ 0x25,0x40,0xd7,0xf7,0x11,0x86,0x91,0xd4,0xbd,0xe2,0x6a,0x60,0x47,0xca,0x3,0x89,
+ 0x67,0x80,0x8,0x81,0xe3,0x1a,0x4d,0x7b,0xba,0x70,0xee,0xc4,0xea,0xc4,0x57,0xf2,
+ 0x7c,0x1f,0xdd,0xd3,0xa8,0x8e,0x6b,0x9a,0x26,0x22,0x2e,0xe5,0x5f,0x34,0x34,0x34,
+ 0x34,0x81,0x9c,0xd5,0xb0,0x2c,0xb,0xe5,0x92,0x9c,0xe4,0x17,0x45,0xc,0xed,0x4e,
+ 0x47,0x6a,0x46,0x45,0xd1,0xb2,0xbe,0xf,0x4a,0x89,0x9a,0xdb,0xad,0x1e,0x13,0xa,
+ 0x8,0xd9,0xf,0x12,0xad,0x20,0xf1,0xc0,0x91,0xa1,0x9a,0xdc,0x46,0x2e,0xd0,0x6e,
+ 0x77,0x4e,0xeb,0x80,0xa7,0xbc,0xeb,0x22,0xc,0x42,0xd9,0xc0,0xa8,0xa1,0xa1,0xa1,
+ 0x9,0xe4,0x6c,0x45,0x21,0x9f,0xc7,0xe8,0x48,0xd,0x9e,0x17,0xe0,0xd0,0xd4,0x4c,
+ 0x32,0xfc,0xe9,0x28,0xbe,0x8a,0x32,0xc6,0xf2,0x35,0x86,0x9c,0xb,0x8b,0x20,0x8,
+ 0x65,0x88,0x6b,0x5,0xc0,0xb1,0x6d,0x54,0x4a,0x25,0x8,0x8,0x30,0xc1,0x31,0x7b,
+ 0xf8,0xf0,0xe9,0xdd,0xa7,0x85,0x3c,0x1a,0xad,0xf6,0x8a,0x22,0x54,0xd,0xd,0x4d,
+ 0x20,0x1a,0x27,0x15,0xb9,0x9c,0x8b,0xe1,0x5a,0x5,0x8b,0x8b,0x4b,0x68,0xa9,0x49,
+ 0x83,0xc7,0x42,0xe2,0x81,0x0,0xb0,0x6d,0x1b,0x8e,0xed,0x0,0x90,0xe1,0xab,0x95,
+ 0x12,0xb2,0x29,0xe4,0x73,0xc8,0xe5,0x5c,0x45,0x76,0xb2,0x2,0xeb,0x74,0x81,0x12,
+ 0x39,0xab,0xbd,0xd1,0x6c,0x82,0x71,0x4d,0x20,0x1a,0x1a,0x47,0xbd,0x5e,0xf4,0x2e,
+ 0x38,0x43,0x99,0xdf,0x34,0x30,0x3a,0x54,0x43,0xbd,0xd1,0xc4,0x52,0xb3,0x75,0x5c,
+ 0xe4,0x11,0x7b,0x20,0x80,0x1c,0x4f,0x5b,0x2a,0xe4,0x61,0x59,0x52,0x99,0x37,0x8a,
+ 0x58,0xa2,0x8b,0xf5,0xd2,0x13,0x48,0x1,0x39,0xc7,0x81,0x10,0xb2,0x2b,0xbc,0xe3,
+ 0x79,0xa7,0xed,0xbb,0xd,0xd3,0x84,0x6d,0x9a,0x72,0x9f,0x32,0x3d,0x17,0x5d,0x43,
+ 0x43,0x13,0xc8,0x59,0x88,0x4a,0xa9,0x4,0x21,0x4,0x9a,0xad,0xf6,0x9,0xae,0xb0,
+ 0xe5,0x5f,0xdb,0xb6,0x7a,0xcd,0x72,0xca,0x50,0xaf,0x14,0xe4,0x73,0x2e,0x1c,0xc7,
+ 0x1,0x21,0xd2,0x33,0xa,0x4e,0x53,0x3,0x61,0xec,0xfd,0x44,0x3c,0x42,0xab,0xdd,
+ 0xd6,0x13,0x9,0x35,0x34,0x34,0x81,0x9c,0x9d,0xa8,0x56,0xca,0x68,0x34,0x5b,0x2f,
+ 0xc0,0xc8,0xc9,0x31,0xb8,0xae,0xe3,0x48,0xfd,0x2b,0xd5,0xeb,0xb0,0x92,0x2a,0xb0,
+ 0xa,0xf9,0x3c,0x1c,0xdb,0x82,0x0,0xe0,0x7,0xf1,0x94,0xc4,0xd3,0x70,0x31,0x50,
+ 0x8a,0xa1,0x4a,0x19,0x9d,0x4e,0xf7,0x94,0x4d,0x3d,0xd4,0xd0,0xd0,0x4,0xa2,0xf1,
+ 0x92,0xc2,0x34,0xd,0x18,0x6,0x85,0xe7,0xbf,0x30,0xc3,0x1a,0xcf,0x52,0xe7,0x9c,
+ 0xc3,0xb2,0x4c,0x8,0x21,0xe0,0x7,0x2b,0x87,0x40,0x72,0xae,0x3,0x42,0x28,0x20,
+ 0x4,0xba,0x9e,0x77,0xda,0x3c,0x90,0x5a,0xa5,0x8c,0x7c,0x2e,0x87,0x46,0xab,0x85,
+ 0x70,0x5,0x79,0x64,0x1a,0x1a,0x9a,0x40,0x34,0x4e,0x1a,0x6c,0xcb,0x2,0x25,0xe4,
+ 0x5,0x95,0x99,0x4a,0xf2,0x80,0x94,0x34,0x1,0x60,0x18,0x86,0x5c,0xe9,0xfb,0xc1,
+ 0x8a,0xf9,0x7d,0xae,0xe3,0xc8,0xee,0x78,0x0,0x81,0x1f,0x9e,0x96,0x6,0xc7,0x5c,
+ 0xce,0xc5,0xe8,0xf0,0x10,0x40,0x8,0x16,0xea,0x4b,0x3a,0x7c,0xa5,0xa1,0xa1,0x9,
+ 0xe4,0xec,0x84,0x65,0x5a,0x0,0xf0,0xa2,0x7b,0x23,0x28,0x1,0x4c,0xc3,0x84,0xe0,
+ 0x62,0x45,0xad,0xb8,0xb,0xf9,0x3c,0x8,0x0,0x8,0x20,0x64,0xe1,0x29,0xef,0x1,
+ 0xc9,0xe7,0x72,0x38,0x67,0xf5,0x38,0xf2,0xf9,0x3c,0xa6,0x66,0xe6,0x4e,0x6b,0xd3,
+ 0xa2,0x86,0xc6,0x99,0xc,0x5d,0xc6,0x7b,0x26,0x82,0xe0,0x45,0xe8,0x34,0xc5,0xdd,
+ 0xe8,0xf2,0x83,0x2c,0xd3,0x0,0xe7,0x7c,0x45,0x11,0x48,0x29,0x5f,0x48,0x7e,0x5f,
+ 0x18,0x46,0x27,0x50,0x61,0x76,0xa2,0x4,0x4a,0x50,0xc8,0xe7,0xb1,0x66,0x62,0x1c,
+ 0x95,0x52,0x19,0xfb,0xf,0x1d,0x3a,0xcd,0x9a,0x5b,0x1a,0x1a,0x9a,0x40,0x34,0x4e,
+ 0x37,0x54,0x78,0xe5,0x85,0xcc,0xf1,0x88,0x5f,0xcd,0x38,0x7,0x21,0x4,0x86,0x61,
+ 0x20,0xe2,0xec,0xb4,0x76,0x7a,0x1f,0xb,0xd5,0x4a,0x9,0x50,0xbf,0x2d,0x64,0xec,
+ 0x94,0x84,0x93,0x4c,0xc3,0xc0,0xf0,0x50,0xd,0xab,0x57,0xad,0x42,0xa5,0x54,0xc4,
+ 0xae,0xbd,0xfb,0x30,0x3b,0x7f,0x78,0x45,0xed,0x7,0xd,0xd,0x4d,0x20,0x1a,0x27,
+ 0x1d,0xb1,0x3c,0x89,0x69,0x18,0x8,0x4e,0xd0,0xe0,0x9,0x2e,0x87,0x7f,0x30,0xc6,
+ 0x14,0x81,0x50,0xb4,0x3b,0xde,0x8a,0xfa,0x7d,0xb9,0x5c,0x4e,0x76,0xab,0x8,0x81,
+ 0x30,0x8,0x81,0x93,0x38,0xc8,0xd6,0x34,0x4d,0x54,0x4a,0x45,0x4c,0xac,0x1a,0xc3,
+ 0x70,0x6d,0x8,0x5d,0xdf,0xc3,0x93,0xcf,0x6e,0x45,0xa3,0xd5,0xd2,0x79,0xf,0xd,
+ 0xd,0x4d,0x20,0x67,0x3f,0x82,0x30,0x2,0x8,0x85,0x65,0x99,0x27,0x5c,0x7e,0x1b,
+ 0x31,0x6,0x21,0x64,0x79,0x6c,0x21,0x97,0x83,0x65,0x9a,0xe8,0x7a,0xf5,0x15,0xf5,
+ 0xfb,0x2a,0xc5,0xa2,0xf4,0x40,0x0,0x70,0xce,0x4e,0xca,0xac,0x76,0xa9,0x17,0x56,
+ 0xc4,0xc4,0xd8,0x18,0x86,0x6b,0x55,0x30,0xc6,0x71,0x70,0x6a,0xa,0x87,0xa6,0x67,
+ 0xd0,0xf5,0x3c,0x7d,0x52,0x69,0x68,0x68,0x2,0x79,0xb9,0x10,0x48,0x8,0xc1,0x39,
+ 0x4c,0xf3,0xc4,0xf,0x9f,0x1f,0x4,0x60,0x11,0x3,0x53,0x25,0xbc,0x94,0xd2,0x15,
+ 0xd7,0xf3,0x60,0xd9,0x36,0x8,0x8,0x8,0x5e,0x5c,0xa1,0x0,0xa5,0x14,0x8e,0x63,
+ 0x63,0xa4,0x56,0xc3,0xf8,0xd8,0x28,0xa,0xb9,0x3c,0x22,0xc6,0x70,0x68,0x7a,0x6,
+ 0x7,0x26,0xa7,0xe0,0xf9,0x3a,0x59,0xae,0xa1,0xa1,0x9,0xe4,0x65,0x6,0x21,0x4,
+ 0x1a,0xad,0x16,0x5c,0xc7,0xc1,0x12,0x4e,0x4c,0x27,0xaa,0xeb,0x79,0xe8,0xfa,0x3e,
+ 0x38,0xe7,0xc8,0xb9,0x2e,0x8,0xc1,0x8a,0xab,0x3a,0x32,0x28,0x45,0x5c,0x23,0x70,
+ 0xa2,0x33,0x39,0x64,0x93,0xa4,0x8d,0x52,0xb1,0x88,0x5a,0xa5,0x82,0xa1,0x6a,0x5,
+ 0x51,0xc4,0xb0,0xd4,0x68,0x62,0xd7,0xbe,0xfd,0x68,0xb7,0x3b,0x92,0x80,0x75,0xb8,
+ 0x4a,0x43,0x43,0x13,0xc8,0xcb,0x15,0x8d,0x46,0x13,0x63,0xa3,0x23,0x27,0xfc,0xbe,
+ 0x28,0x62,0x98,0x3b,0xbc,0x0,0xc1,0x5,0x72,0xae,0xb,0xce,0xc5,0x8a,0xea,0x42,
+ 0x7,0xe4,0x8c,0x12,0x20,0xe,0x61,0x9d,0x98,0xa1,0xcf,0xb9,0x2e,0xd6,0x8c,0x8f,
+ 0x83,0x52,0x82,0x4e,0xd7,0xc3,0xf4,0xdc,0x1c,0x3a,0x5d,0xf,0xd1,0x31,0x55,0x8a,
+ 0x35,0x34,0x34,0x34,0x81,0xbc,0x4c,0xe0,0x5,0x1,0xda,0x9d,0xe,0x6a,0x95,0xca,
+ 0x9,0x97,0x9e,0x2e,0x2e,0x35,0x60,0x5b,0x16,0xa,0x79,0x17,0x41,0x10,0xae,0xa8,
+ 0x26,0x42,0x4a,0x8,0x28,0xa1,0xaa,0x8c,0x57,0x64,0xc6,0xef,0x1e,0xf,0x3a,0xdd,
+ 0x2e,0x76,0xed,0xdb,0xa7,0xab,0xa9,0x34,0x34,0x4e,0xc7,0xf5,0xaa,0x77,0xc1,0x99,
+ 0x9,0xc6,0x38,0xda,0x9d,0x2e,0x72,0x39,0x7,0x8e,0x6d,0x9d,0xf0,0xfb,0x2d,0xd3,
+ 0x84,0x63,0xdb,0xf0,0xc3,0x60,0x65,0x79,0x20,0x84,0x80,0xaa,0x29,0x89,0x71,0x1e,
+ 0xe4,0x44,0xa1,0xc9,0x43,0x43,0x43,0x13,0x88,0xc6,0xb1,0xbc,0x10,0xcf,0x87,0xe7,
+ 0xf9,0x18,0x19,0x1a,0x42,0x3e,0x97,0x3b,0xa1,0xf7,0x3a,0x8e,0xd,0xcb,0x32,0xe1,
+ 0xf9,0x3e,0x82,0x15,0xa4,0x83,0x45,0x29,0x45,0x2c,0xf8,0x28,0x6f,0x14,0x44,0x1f,
+ 0x6a,0xd,0xd,0x4d,0x20,0x1a,0x27,0xd9,0xb,0xe1,0x1c,0x1d,0xcf,0x43,0x14,0x85,
+ 0x18,0x1f,0x1d,0xc6,0xd8,0xc8,0x30,0x1c,0xc7,0x3e,0xae,0xf7,0xe6,0x73,0xe,0x4c,
+ 0xc3,0x84,0xef,0x87,0xa7,0xac,0xd3,0xfb,0x85,0x39,0x20,0x29,0xf2,0xa0,0x4,0x6,
+ 0x95,0x13,0x13,0x35,0x34,0x34,0x56,0x1e,0x74,0xe,0xe4,0xc,0x47,0x10,0x4,0xf0,
+ 0x3,0x1b,0xa6,0x11,0xa0,0x56,0x2e,0xa1,0x52,0x2a,0xa2,0xde,0x68,0xa2,0xbe,0xd4,
+ 0x38,0xa2,0x3c,0x9,0xa5,0x14,0x8e,0x6d,0x83,0x52,0x82,0x76,0xa7,0xb3,0xa2,0x7e,
+ 0xf,0x41,0x2c,0xb4,0x22,0x73,0x21,0xd4,0xd0,0xe4,0xa1,0xa1,0xa1,0x9,0x44,0xe3,
+ 0x94,0x80,0x73,0x81,0x76,0xa7,0xb,0x4a,0x29,0xc,0x83,0xc2,0x71,0x1c,0xe9,0x8d,
+ 0xc,0xd7,0xd0,0x68,0xb5,0x31,0xbf,0x50,0x87,0xef,0xfb,0x99,0x72,0x58,0xcb,0x34,
+ 0xe1,0xaa,0x90,0x57,0xab,0xbd,0xb2,0x7a,0x40,0x8,0x21,0x40,0xca,0xb,0xa1,0xd4,
+ 0x0,0x25,0x4,0x4c,0x57,0x50,0x69,0x68,0x68,0x2,0xd1,0x38,0xf9,0x8,0xa3,0x8,
+ 0x9e,0xe7,0xc3,0x56,0x8d,0x81,0x84,0x48,0xc9,0xf7,0xe1,0x5a,0x15,0xe5,0x72,0x9,
+ 0xad,0x56,0x1b,0x4b,0x8d,0x26,0x5a,0x9d,0x2e,0xa2,0x28,0x82,0x69,0x1a,0x70,0xd4,
+ 0x1c,0x90,0xee,0xa,0x6b,0xa6,0xa3,0x54,0xe6,0x3c,0x62,0x2,0x31,0xa8,0xf1,0x22,
+ 0x84,0x23,0x35,0x34,0x34,0x34,0x81,0x68,0x1c,0x13,0x5d,0xcf,0x4b,0x3a,0xcb,0x9,
+ 0x91,0xf5,0x4b,0x42,0x8,0x98,0xa6,0x89,0xe1,0x5a,0x5,0xa3,0xc3,0x35,0xb4,0xda,
+ 0x5d,0xd4,0x1b,0xd,0x44,0x61,0x4,0xc7,0xb6,0x11,0x31,0x86,0x70,0x85,0xf5,0x80,
+ 0x28,0x37,0x4,0x84,0x48,0x32,0xb1,0x4c,0x43,0xe7,0x40,0x34,0x34,0x34,0x81,0x68,
+ 0x9c,0x4a,0x8,0x0,0xad,0x4e,0x7,0x94,0x52,0x55,0x6,0x4b,0x12,0xd5,0x76,0x21,
+ 0xc,0x50,0x2a,0x50,0xc8,0xb9,0xb0,0x2d,0x13,0x8b,0x4b,0xd,0xa9,0x81,0xd5,0xf5,
+ 0x56,0x54,0x2,0x3d,0xe1,0xf,0x40,0xe6,0x3f,0x28,0x85,0x63,0x5b,0x30,0xd,0xa,
+ 0x3d,0x20,0x50,0x43,0x43,0x13,0x88,0xc6,0x29,0x4,0x63,0x1c,0xad,0x76,0x7,0xa6,
+ 0x61,0x24,0xcd,0x78,0x24,0x95,0x96,0x86,0x10,0x60,0x9c,0xc3,0x34,0xc,0x98,0x86,
+ 0x81,0x56,0xbb,0xbd,0x42,0x7b,0x26,0x94,0x7,0x42,0x8,0x6c,0xdb,0x81,0x61,0x18,
+ 0xfa,0xe0,0x6a,0x68,0x68,0x2,0xd1,0x38,0xd5,0x8,0xa3,0x8,0x4b,0xcd,0x56,0x12,
+ 0xf6,0x21,0x31,0x7f,0x10,0x40,0x10,0x2,0x16,0x31,0x35,0x53,0xdd,0x40,0xc7,0xf3,
+ 0x4e,0x58,0x2a,0xe4,0xb4,0x51,0x48,0xec,0x81,0x38,0xb6,0x26,0x10,0xd,0xd,0x4d,
+ 0x20,0x1a,0xa7,0xb,0x41,0x18,0xa2,0xd9,0x6a,0x81,0x90,0x62,0x26,0x27,0x2,0x83,
+ 0x82,0x71,0xe,0x43,0x85,0xb9,0x82,0x60,0x85,0xea,0x43,0xc9,0x42,0x2c,0x10,0x42,
+ 0x60,0x99,0xa6,0x6a,0x2e,0xd4,0xd0,0xd0,0xd0,0x4,0xa2,0x71,0x5a,0xe0,0xf9,0x1,
+ 0x84,0x68,0x82,0xaa,0x84,0x74,0x9c,0x13,0xe1,0x9c,0xc3,0xb6,0xec,0xc4,0x5b,0x59,
+ 0x99,0x90,0x2e,0x13,0xa5,0x14,0x96,0x65,0xc9,0x44,0xba,0x86,0x86,0x86,0x26,0x10,
+ 0x8d,0xd3,0x7,0x3f,0x8,0xb1,0xb8,0xd4,0x0,0xe7,0x45,0x14,0xb,0x32,0xb1,0xce,
+ 0x38,0x83,0x61,0xc8,0x39,0xe8,0x51,0xc4,0x56,0xe8,0x96,0x8b,0xa4,0x13,0xdd,0xb6,
+ 0x6c,0x38,0xb6,0xa3,0xf,0xa6,0x86,0x86,0x26,0x10,0x8d,0x97,0x86,0x44,0x9a,0x20,
+ 0x94,0xa2,0x44,0x29,0x4,0x17,0xa0,0x54,0x86,0xb2,0xfc,0x60,0xe5,0xe,0x54,0x22,
+ 0x4,0xa0,0x20,0xb0,0x2d,0x13,0x79,0xd7,0xd5,0x7,0x52,0x43,0x43,0x13,0x88,0xc6,
+ 0x4b,0x81,0x30,0x8a,0x30,0xbf,0x50,0x7,0x25,0x24,0x19,0xd6,0xc4,0x18,0x83,0xef,
+ 0x87,0x2b,0x72,0x7b,0x65,0x56,0x86,0x80,0xa8,0x10,0x56,0xa1,0x90,0xd3,0x7,0x51,
+ 0x43,0x63,0x5,0x42,0x67,0x27,0x5f,0x26,0x60,0x8c,0x61,0x51,0xe9,0x63,0x11,0xf5,
+ 0x38,0x88,0x56,0x62,0x13,0xa1,0x64,0x10,0xa5,0x68,0x2,0xcb,0x34,0x91,0xd3,0x1e,
+ 0x88,0x86,0x86,0xf6,0x40,0x34,0x5e,0x5a,0x78,0x7e,0x0,0xd3,0xf0,0xc0,0x5,0x10,
+ 0x46,0x6c,0xc5,0xe6,0x40,0x4,0x4,0x64,0x71,0x18,0x81,0x61,0x18,0x4a,0xf8,0x91,
+ 0xea,0x39,0x1f,0x1a,0x1a,0xda,0x3,0xd1,0x78,0x69,0x49,0x44,0x8e,0x77,0x6d,0xb6,
+ 0x3a,0x2b,0xb2,0x84,0xd7,0xa0,0x6,0xc0,0x5,0xe2,0x40,0x96,0x61,0x18,0xc8,0xe7,
+ 0x72,0xb0,0x2c,0xbd,0xd6,0xd1,0xd0,0xd0,0x1e,0x88,0xc6,0x4b,0x8a,0x88,0x71,0x2c,
+ 0x2c,0x2d,0xad,0xa8,0x21,0x52,0x69,0x10,0x22,0xa9,0x23,0xa6,0x36,0x4a,0x8,0x72,
+ 0xae,0x83,0x42,0x2e,0x77,0xdc,0xa3,0x77,0x29,0xa5,0x30,0x55,0xf3,0x21,0xe3,0x1c,
+ 0x8c,0x31,0x7d,0xe0,0x35,0x34,0x34,0x81,0x68,0x9c,0xc,0x4c,0xcd,0xcc,0x3,0x2b,
+ 0x54,0x1e,0xdd,0xb1,0x1d,0x30,0xc6,0x94,0x77,0x24,0x0,0x2,0xe4,0x72,0x39,0x38,
+ 0xf6,0xb1,0x7,0x65,0x51,0x42,0x30,0x3a,0x32,0x8c,0x35,0xab,0x57,0xa1,0x54,0x2c,
+ 0xc1,0xf,0x2,0xcc,0x2f,0x2c,0x62,0x7e,0x61,0x11,0xad,0x56,0xb,0x91,0x16,0xd4,
+ 0xd2,0xd0,0xd0,0x4,0xa2,0xf1,0xe2,0x20,0x56,0x28,0x79,0x58,0xa6,0x89,0x52,0xb1,
+ 0x80,0xdd,0x7,0xf6,0x23,0x37,0xeb,0x80,0xb,0x1,0x83,0x52,0x58,0xa6,0x5,0xcb,
+ 0x36,0x41,0x8,0x39,0xe2,0xb6,0x13,0x0,0xe3,0x63,0xa3,0xb8,0xfc,0xe2,0xb,0xe1,
+ 0x38,0x36,0x1a,0xed,0xe,0x16,0xea,0x75,0x34,0x9b,0x92,0x38,0x5c,0xd7,0x45,0xb7,
+ 0xdb,0xd5,0xde,0x88,0x86,0x86,0x26,0x10,0x8d,0xb3,0x9,0x84,0x0,0x43,0xd5,0x2a,
+ 0x36,0xad,0x5f,0x8b,0x6a,0xa5,0x82,0xa7,0x9f,0x7f,0x1e,0xad,0x56,0x1b,0x41,0x18,
+ 0xa1,0x58,0xc8,0x63,0xd5,0xf0,0x30,0x72,0x8e,0xb,0xc3,0x30,0x8e,0xe8,0x45,0x14,
+ 0x8b,0x5,0x5c,0x75,0xd9,0xc5,0xa8,0x56,0xca,0x68,0xb4,0x5a,0xd8,0xb6,0x73,0x17,
+ 0xe6,0xf,0x2f,0x82,0x1a,0x6,0x82,0x20,0x90,0xb2,0x28,0x96,0x5,0xce,0xf9,0x8a,
+ 0x25,0x50,0xd,0xd,0x4d,0x20,0x1a,0x1a,0x27,0x88,0x91,0xa1,0x1a,0xae,0xbd,0xea,
+ 0x95,0x30,0xc,0x3,0x3b,0xf6,0xec,0xc7,0xe4,0xcc,0x2c,0x22,0xc6,0x11,0x85,0x21,
+ 0x6c,0xc7,0xc6,0xd4,0xcc,0x1c,0xaa,0xa5,0x3c,0x2c,0xf3,0xc8,0x4,0x72,0xfe,0x86,
+ 0x75,0xd8,0xb4,0x7e,0x1d,0x4a,0x85,0x3c,0xf6,0x1c,0x38,0x88,0x20,0x8,0x60,0x18,
+ 0x14,0x9e,0xef,0x27,0x84,0x21,0xa5,0xee,0xa9,0xf6,0x42,0x34,0x34,0x34,0x81,0x68,
+ 0x9c,0xd,0xb0,0x4c,0x13,0x97,0x9c,0x7f,0x1e,0xc6,0x46,0x86,0xf1,0xfc,0xce,0xdd,
+ 0x38,0x34,0x35,0x9d,0x8c,0xe8,0xd,0xc2,0x10,0x9e,0xef,0x83,0x73,0x1,0xd3,0xa0,
+ 0xb0,0x6d,0x1b,0x5d,0x6f,0x70,0xf7,0xfc,0x2b,0x2e,0xba,0x18,0x1b,0xd7,0xad,0x47,
+ 0x3e,0xe7,0xa2,0xde,0x6c,0x23,0x8,0x42,0x8,0x21,0xfa,0xbc,0xd,0x1,0xdb,0x32,
+ 0xd1,0xd5,0x4,0xa2,0xa1,0x71,0x52,0xa0,0xcb,0x78,0x35,0x5e,0x52,0xac,0x1a,0x1d,
+ 0xc1,0xf9,0x1b,0xd6,0x61,0x7c,0x64,0x18,0xd3,0xb3,0xf3,0x70,0x1d,0x1b,0x84,0x12,
+ 0xf8,0x41,0x90,0x10,0x0,0x8b,0x22,0x8,0xc1,0x51,0x2c,0xe4,0xe5,0x98,0x5b,0x83,
+ 0xc2,0x30,0x8c,0xd4,0x8d,0xe2,0xfc,0xd,0x1b,0xb1,0x76,0x62,0x2d,0x4a,0xc5,0x2a,
+ 0xce,0x5d,0xb3,0xe,0x96,0x65,0xa3,0x52,0xae,0xa2,0x5a,0xae,0xc8,0xf9,0x28,0x94,
+ 0xa0,0x54,0x28,0xc0,0xb1,0x2d,0xbd,0xd3,0x35,0x34,0xb4,0x7,0xa2,0x71,0x36,0x60,
+ 0x6c,0x64,0x4,0xe7,0x6f,0xd8,0x4,0xd7,0x75,0xe0,0x3a,0x2e,0xe,0x4d,0xcf,0x80,
+ 0xb1,0x6c,0xc3,0x20,0xa5,0x4,0x8e,0x65,0xa2,0x90,0xcf,0xc3,0x30,0xc,0x58,0x86,
+ 0x9,0x6a,0x1a,0x10,0x9c,0x43,0xc8,0xe1,0xbd,0x8,0xa2,0x8,0x23,0xc3,0x23,0x60,
+ 0x8c,0xa3,0x56,0x1b,0xc6,0xaf,0xdf,0xf6,0x2e,0x3c,0xf3,0xfc,0x36,0x2c,0x2c,0x1c,
+ 0xc6,0xcc,0xdc,0x34,0x4,0x7,0xce,0x5d,0x33,0x81,0x67,0xb7,0x6f,0xd7,0x3b,0x5d,
+ 0x43,0x43,0x13,0x88,0xc6,0xd9,0x80,0x72,0xa9,0x84,0xf3,0x37,0x9d,0xf,0xce,0x39,
+ 0x5e,0xf7,0xaa,0x57,0x63,0xf7,0xfe,0x3,0x58,0x33,0x3e,0x86,0x66,0xab,0x85,0x20,
+ 0xf4,0x41,0x40,0x70,0xce,0xea,0xd5,0xa8,0x94,0xa,0xa0,0xa6,0x89,0x52,0xb1,0x8,
+ 0x2e,0x38,0x84,0x40,0x92,0x10,0xe7,0x9c,0xe3,0xc9,0xad,0x5b,0x70,0xe9,0x85,0x17,
+ 0xe3,0x8a,0xcb,0x2e,0xc3,0xd0,0xd8,0x2a,0x5c,0xfe,0xaa,0x57,0xe3,0xe1,0x87,0x1e,
+ 0xc2,0x63,0x8f,0xfd,0x4,0x41,0xe0,0xc1,0x75,0x5c,0x4c,0x4e,0x4f,0xe3,0xf1,0x67,
+ 0x9f,0xd5,0x3b,0x5d,0x43,0xe3,0x24,0xc1,0x0,0xf0,0x69,0xbd,0x1b,0x34,0x5e,0x2a,
+ 0xe4,0x73,0x79,0xbc,0xed,0xcd,0x37,0x62,0xf5,0xf8,0x4,0xd6,0x9d,0xbb,0xe,0xc5,
+ 0x52,0x19,0xe3,0xab,0xc6,0x61,0x59,0x16,0x5c,0xc7,0xc4,0x6b,0xaf,0xb9,0x6,0x57,
+ 0x5e,0x7a,0x29,0x28,0x25,0xe8,0xfa,0x1e,0x4,0xa0,0xc6,0xf4,0x8a,0x78,0xe8,0x22,
+ 0x40,0x80,0x46,0xb3,0x85,0x1d,0xbb,0x77,0x61,0x7a,0x6e,0x16,0xd4,0x34,0x51,0x18,
+ 0x19,0xc2,0xfa,0x89,0x9,0x5c,0x7e,0xe9,0x25,0xb8,0x78,0xe3,0x26,0x10,0x0,0x9b,
+ 0x1f,0x7f,0x2,0x7,0x27,0x27,0x11,0xe9,0x1c,0x88,0x86,0xc6,0x49,0x81,0x92,0xae,
+ 0xd3,0xd0,0x78,0x69,0x90,0x73,0x5d,0xfc,0xf5,0x9f,0x7e,0x1,0xaf,0x7f,0xcd,0x75,
+ 0xb0,0x5c,0x7,0xc8,0xb9,0xd8,0xb9,0x63,0x27,0xb6,0x3c,0xf5,0x24,0xc,0x3,0x38,
+ 0x6f,0xfd,0x3a,0x3c,0xb5,0xe5,0x59,0xfc,0xdb,0xe6,0xcd,0x58,0x58,0x5a,0x2,0x17,
+ 0x2,0x82,0xb,0x70,0xe5,0x79,0x8,0x21,0xc0,0x5,0x7,0xe7,0xf2,0x31,0x4,0x50,
+ 0x2a,0x15,0x51,0xad,0xd,0xa1,0x98,0xcf,0xa3,0x52,0xa9,0x20,0xf4,0x3d,0x4c,0x4e,
+ 0x4d,0x63,0xfb,0xee,0xdd,0x68,0xb4,0x5a,0xe8,0x76,0x3d,0xb4,0xdb,0x6d,0x5d,0xce,
+ 0xab,0xa1,0xa1,0x9,0x44,0xe3,0x4c,0x45,0xa9,0x58,0xc0,0x86,0xb5,0xe7,0xe0,0xd5,
+ 0x57,0x5d,0x85,0xff,0xeb,0x37,0xef,0xc0,0xba,0x75,0xeb,0x61,0xf,0x57,0xc1,0x19,
+ 0x47,0xfd,0xd0,0x24,0x76,0xed,0xde,0x8e,0x67,0x9f,0xdb,0x82,0x7,0x37,0x6f,0xc6,
+ 0xdc,0xc2,0x42,0x92,0x54,0x17,0x42,0xa,0x2e,0xc6,0x4,0xc2,0x38,0x7,0x67,0x1c,
+ 0x5c,0x8,0x30,0xc6,0xc0,0x18,0x7,0xe3,0xc,0x9c,0x73,0x79,0x9f,0x31,0x70,0x2e,
+ 0x10,0x31,0x86,0x88,0x31,0x30,0xc6,0x10,0x45,0x11,0x3a,0x9d,0xe,0x82,0x20,0xd0,
+ 0x7,0x42,0x43,0x43,0x13,0x88,0xc6,0x99,0x84,0x5a,0xa5,0x8c,0xb,0x37,0x6d,0xc0,
+ 0x50,0xad,0xa,0xcb,0x34,0xb1,0x61,0xdd,0x6,0x9c,0xb7,0x61,0x23,0x2c,0xd7,0x45,
+ 0x24,0x4,0xa6,0xe,0x1e,0xc4,0xde,0xfd,0x7b,0xb0,0x50,0x5f,0x82,0xe7,0x7b,0x89,
+ 0xf2,0x4a,0x42,0x20,0x7d,0x9e,0x7,0xe3,0xc,0x9c,0x71,0x45,0x10,0x92,0x34,0x62,
+ 0x1d,0xac,0xe4,0xaf,0x22,0x16,0x16,0x31,0x70,0x21,0x10,0x45,0x11,0xba,0xdd,0x2e,
+ 0xc2,0x30,0xd4,0x7,0x44,0x43,0x43,0x13,0x88,0xc6,0x99,0x80,0xe1,0x6a,0x5,0x97,
+ 0x5c,0x78,0x3e,0xaa,0x95,0x92,0xaa,0xa1,0xca,0x86,0xa5,0x78,0xe2,0x69,0xc4,0xde,
+ 0x6,0x0,0x21,0xa4,0xc8,0xa2,0x88,0xe5,0xde,0xd5,0x6b,0xb9,0xf2,0x3a,0xb8,0x24,
+ 0x88,0x28,0x8a,0x7a,0x44,0x91,0xfa,0x9b,0x90,0x4b,0xfc,0x58,0x49,0xc3,0x73,0xce,
+ 0xd1,0xe9,0x74,0xb4,0x4e,0x96,0x86,0xc6,0xb,0x80,0xae,0xc2,0xd2,0x38,0xad,0x28,
+ 0x15,0xa,0xb8,0xe4,0xc2,0x4d,0xa8,0x94,0x8a,0x2a,0x19,0x8e,0x14,0x59,0xa8,0x1b,
+ 0xe7,0x10,0x0,0x38,0x17,0xa9,0xd9,0x20,0x42,0x55,0x5e,0x9,0x55,0x85,0x25,0x7a,
+ 0x21,0xaa,0xc4,0xc3,0x60,0xc9,0x63,0x9e,0x78,0x1e,0xbd,0x70,0x96,0x10,0x5c,0x12,
+ 0x55,0x9f,0x9c,0x89,0x6d,0xdb,0x29,0x1,0x47,0xd,0xd,0xd,0x4d,0x20,0x1a,0x2b,
+ 0xef,0x64,0x33,0xc,0xac,0x5d,0x33,0x8e,0x4a,0xa9,0x4,0x4a,0x49,0x42,0xa,0x48,
+ 0x79,0x15,0x49,0xf3,0xa0,0x4a,0x96,0x27,0x9e,0x86,0x0,0x44,0x2a,0x64,0xc5,0x93,
+ 0xdc,0x87,0x24,0xa,0xde,0x47,0x16,0x3d,0xef,0x84,0x83,0x73,0xa6,0xf2,0x23,0x3c,
+ 0x79,0x6d,0x9a,0x2c,0x64,0x73,0xa2,0xa1,0xbd,0x10,0xd,0xd,0x4d,0x20,0x1a,0x2b,
+ 0x15,0xa3,0xc3,0x43,0x98,0x58,0x35,0xaa,0x42,0x51,0x69,0x3,0x2e,0x4b,0x73,0x9,
+ 0x91,0xcf,0xc5,0x4,0x10,0x1b,0x7b,0xae,0xc,0x7f,0x92,0x30,0x8f,0x49,0x24,0xf3,
+ 0x3a,0x91,0xdc,0x17,0x29,0x82,0x11,0x5c,0xa4,0x48,0x45,0x24,0x9f,0x19,0x23,0x26,
+ 0x2c,0xd3,0x34,0x35,0x81,0x68,0x68,0x68,0x2,0xd1,0x58,0xa9,0x18,0x1b,0xae,0xc1,
+ 0x30,0xc,0x19,0x46,0x22,0x22,0x59,0xf9,0x53,0x22,0xf3,0x20,0x51,0x4,0x30,0x96,
+ 0xa,0x4f,0x45,0x2a,0xc,0xa5,0x3c,0x8d,0x38,0x7c,0xc5,0x54,0xc5,0x55,0x9a,0x44,
+ 0xe2,0x7f,0x4b,0x7b,0x28,0x3c,0x21,0x90,0x2c,0xd9,0xf4,0x87,0xaa,0x96,0x6b,0x66,
+ 0x69,0x68,0x68,0x68,0x2,0xd1,0x58,0x31,0xb0,0x2d,0xb,0xe5,0x52,0x31,0x59,0xfd,
+ 0x53,0x42,0x60,0x50,0x3,0x6,0xa5,0x30,0x4d,0x43,0x92,0x6,0xe3,0x0,0xa4,0xc1,
+ 0x8f,0xa2,0x5e,0xc9,0x6d,0x9c,0xcb,0xc8,0x10,0x86,0xe8,0xf3,0x44,0x52,0x49,0xf5,
+ 0xde,0x63,0x99,0x4f,0x61,0xf1,0xbf,0x31,0xb6,0xcc,0xfb,0x89,0xef,0xb,0x21,0x60,
+ 0x18,0x86,0x56,0xea,0xd5,0xd0,0xd0,0x4,0xa2,0xb1,0xd2,0x50,0x29,0x17,0xe1,0x3a,
+ 0x8e,0x4c,0x9c,0xb,0x59,0x71,0x45,0x48,0xaf,0x8,0x50,0xf6,0x69,0x48,0xaf,0x23,
+ 0x8a,0x22,0x44,0x2c,0x4a,0x48,0x84,0xc7,0xb9,0xd,0x45,0x32,0x8c,0xb,0x8,0xc1,
+ 0x93,0x10,0x55,0x96,0x40,0x7a,0xa1,0xae,0x58,0xee,0x64,0x90,0xe7,0xb1,0x2c,0x7,
+ 0x42,0x29,0x8,0x84,0x26,0x10,0xd,0xd,0x4d,0x20,0x1a,0x2b,0xd,0xd5,0x72,0x5,
+ 0xe5,0x52,0x19,0x40,0x2f,0x57,0xa1,0xcc,0x37,0x18,0xe3,0x8,0xa3,0x28,0xb9,0x31,
+ 0x26,0x7b,0x35,0x58,0x42,0x1e,0x3d,0xf,0x84,0x1d,0x33,0x64,0xc5,0x33,0xe5,0xc0,
+ 0x69,0xaf,0xa4,0x9f,0x3c,0x8,0x21,0xca,0x13,0xa2,0x30,0xc,0xa,0x99,0x2,0xd1,
+ 0x3d,0x21,0x1a,0x1a,0x9a,0x40,0x34,0x56,0x14,0xca,0xa5,0x12,0xaa,0x95,0x2a,0x8,
+ 0xa0,0x8,0x21,0x2,0xe3,0x2c,0x49,0x72,0xb,0x41,0x60,0x99,0x5c,0x95,0xec,0x52,
+ 0x50,0x1a,0xc1,0x54,0x79,0x90,0xb8,0x7f,0x23,0x5d,0xb6,0xcb,0x79,0xdc,0x61,0xde,
+ 0xab,0xbe,0x2,0x0,0xe,0x2,0x30,0x6,0x80,0xc8,0x72,0xe0,0xbe,0xb2,0x5d,0xa1,
+ 0x3c,0x1f,0x83,0x12,0x50,0x2a,0x65,0xe1,0x4d,0xc3,0x80,0x65,0x9a,0x68,0xb3,0xae,
+ 0x3e,0x50,0x1a,0x1a,0x9a,0x40,0x34,0x56,0x1a,0x1c,0xdb,0x46,0xa5,0x54,0x56,0x46,
+ 0x5c,0x7a,0x1c,0x91,0xf2,0x38,0xa2,0x28,0x2,0xa5,0x21,0x8,0x31,0x60,0x9a,0x11,
+ 0x4c,0x33,0x40,0x14,0xf5,0xf2,0x1f,0xbd,0xe6,0x40,0x59,0x92,0x9b,0xf4,0x7e,0x64,
+ 0xfa,0x3d,0x24,0x99,0x44,0x7d,0xa4,0xc2,0x7,0x94,0xed,0x2,0x0,0x25,0x72,0x42,
+ 0x61,0xec,0x7d,0x98,0x86,0x81,0xc5,0x46,0x43,0x1f,0x28,0xd,0xd,0x4d,0x20,0x1a,
+ 0x2b,0xd,0xfb,0xe,0x4d,0xe2,0xad,0x37,0xbc,0x9,0x84,0x10,0x69,0xe8,0xa3,0x10,
+ 0x61,0x14,0x21,0x8,0x2,0x4,0x61,0x98,0xdc,0xa2,0x88,0x21,0x8,0x3,0x84,0xa1,
+ 0xcc,0x83,0xb0,0x58,0xbf,0x2a,0xe2,0xaa,0x2,0x2b,0xdd,0x61,0xce,0x32,0xa1,0x2d,
+ 0x96,0xee,0x9,0x51,0xa4,0x91,0x8,0xf6,0x92,0x5e,0xc8,0x2a,0x7e,0x4c,0x9,0x1,
+ 0xa1,0xb2,0x17,0xbe,0xdd,0xed,0x22,0x8a,0x74,0xfe,0x43,0x43,0x43,0x13,0x88,0xc6,
+ 0x8a,0xc3,0xfc,0xe1,0xc3,0x70,0x9d,0x1c,0x72,0x39,0x17,0x42,0x8,0x99,0x24,0xf,
+ 0x23,0xf8,0x81,0x8f,0x20,0xc,0xe1,0xfb,0x81,0x22,0xe,0x49,0x20,0x41,0x14,0x4a,
+ 0xcf,0x23,0x62,0x8,0x93,0x2e,0x73,0xd6,0x47,0x20,0x3d,0xd,0x2c,0xe9,0x6d,0x88,
+ 0x44,0x6,0x85,0xa4,0x49,0x43,0x79,0x1a,0x94,0x52,0xf5,0x38,0xe,0x61,0x11,0x10,
+ 0x10,0x44,0x2c,0xc4,0xf3,0x3b,0x77,0xeb,0x83,0xa4,0xa1,0xa1,0x9,0x44,0x63,0x25,
+ 0xc2,0xf,0x2,0x3c,0xf5,0xdc,0x56,0xfc,0xe2,0x1b,0xdf,0x8,0x20,0xf6,0x42,0x22,
+ 0xf8,0x41,0x80,0x50,0xcd,0x3e,0x8f,0xef,0xfb,0x81,0x22,0x90,0xb0,0x57,0x8d,0x95,
+ 0x24,0xd7,0x59,0xb6,0x32,0x2b,0xe9,0x11,0x11,0xbd,0x49,0x21,0x20,0x32,0x44,0x45,
+ 0x8,0x4d,0xe5,0x3a,0x28,0xc,0x6a,0x80,0x52,0xa,0xd3,0xa4,0xa0,0x84,0x4a,0x2,
+ 0x21,0xc0,0xfe,0x83,0x87,0x30,0xb7,0xb0,0xa0,0xf,0x92,0x86,0x86,0x26,0x10,0x8d,
+ 0x95,0x8a,0xcd,0x8f,0x3d,0x86,0xd7,0xbf,0xe6,0x3a,0x8c,0x8f,0x8d,0x1,0x90,0x4d,
+ 0x83,0xd2,0xeb,0x8,0x11,0x26,0x21,0x2c,0x49,0x2a,0x81,0x7a,0x2e,0x8c,0x22,0xe9,
+ 0x91,0x4,0x61,0xaf,0xb4,0x37,0x8a,0x92,0x10,0x55,0x3a,0xbf,0x21,0x43,0x54,0x48,
+ 0xc8,0x81,0xaa,0x79,0xe9,0xa6,0x61,0xc0,0x34,0x65,0xa2,0x3c,0xf6,0x44,0xc,0x2a,
+ 0x43,0x59,0xb,0xf5,0x45,0x3c,0xbb,0x6d,0x3b,0x82,0x40,0x57,0x5f,0x69,0x68,0x68,
+ 0x2,0xd1,0x58,0xb1,0xd8,0x77,0xf0,0x0,0xbe,0xfb,0xc3,0xfb,0xf1,0x5b,0xff,0xfb,
+ 0xaf,0xc3,0x71,0x1c,0x19,0xca,0x8a,0xa2,0xc4,0xa3,0x88,0x49,0x80,0x71,0xe,0x3f,
+ 0xf0,0xe1,0xfb,0x1,0x3c,0xdf,0x83,0xe7,0x79,0xe8,0x74,0x3d,0x84,0x51,0x28,0x6f,
+ 0x61,0xd4,0x13,0x47,0x5c,0xd6,0xcf,0x41,0x40,0x89,0xf4,0x38,0x2c,0xcb,0x84,0x65,
+ 0x9a,0x70,0x1d,0x1b,0xae,0xe3,0xc0,0xb6,0x4c,0xd9,0x48,0xa8,0x92,0xed,0x7,0x27,
+ 0xa7,0x70,0xff,0x83,0xf,0x69,0xef,0x43,0x43,0x43,0x13,0x88,0xc6,0x4a,0x7,0xe7,
+ 0x1c,0x3f,0xf8,0xb7,0x1f,0x61,0x7c,0x6c,0x15,0xde,0x75,0xeb,0xaf,0xc0,0x71,0xec,
+ 0xa4,0x4a,0x8a,0x10,0x2,0xd7,0x75,0x51,0xcc,0x17,0xe0,0xba,0x39,0x8,0x8,0x78,
+ 0x9e,0x8f,0x4e,0xb7,0x83,0x46,0xa3,0x81,0xa5,0x66,0x3,0x9e,0xe7,0x49,0x42,0xf1,
+ 0x3d,0x84,0x51,0xa4,0xe4,0x4d,0x62,0x12,0x11,0xa0,0x54,0x7a,0x1e,0x86,0x61,0xc0,
+ 0xb1,0x2c,0xe4,0x5c,0x7,0xf9,0x5c,0xe,0xa5,0x42,0xe,0xae,0xe3,0x80,0xb,0xae,
+ 0x72,0x2d,0x21,0x1e,0xfa,0xc9,0x4f,0xf1,0xad,0xef,0x7d,0x17,0xbb,0xf7,0xed,0xd7,
+ 0x32,0x26,0x1a,0x1a,0x9a,0x40,0x34,0xce,0x4,0xf8,0x41,0x80,0xbf,0xff,0xe6,0x37,
+ 0x40,0x8,0xc5,0x3b,0x7e,0xe9,0x6d,0x18,0x1f,0x5d,0x95,0x18,0x70,0xc7,0x71,0x50,
+ 0x2c,0x14,0x31,0x3c,0x3c,0x2,0xa7,0x58,0x84,0x30,0x29,0xa2,0x20,0x44,0xd0,0x6a,
+ 0xa2,0xbe,0xb0,0x80,0xa5,0x46,0x3,0xcd,0x56,0x13,0xed,0x4e,0x1b,0x5d,0xcf,0x43,
+ 0x10,0x6,0x4a,0x86,0xbd,0xe7,0xbd,0x18,0x6,0x85,0x65,0x98,0x70,0x1d,0xb,0xf9,
+ 0x5c,0xe,0x39,0xd7,0x81,0xeb,0xd8,0x10,0x2,0xe8,0x7a,0x1e,0xa6,0x66,0xe6,0x70,
+ 0xff,0xbf,0xff,0x3b,0xbe,0xf3,0x83,0xef,0xe3,0xf0,0x62,0x5d,0x93,0x87,0x86,0xc6,
+ 0x8b,0x80,0x1e,0x28,0xa5,0xf1,0x92,0xc0,0x32,0x2d,0x5c,0x76,0xf1,0xc5,0xf8,0xe4,
+ 0x47,0x3f,0x86,0xf3,0x37,0x9d,0x7,0x0,0xa0,0x94,0xc0,0xb6,0x6c,0x94,0xcb,0x25,
+ 0x14,0x8a,0x25,0xd8,0x85,0x1c,0x28,0x35,0x80,0x30,0x42,0xd0,0xe9,0xa0,0xd9,0x6a,
+ 0xa2,0xd9,0x6e,0xa1,0xdd,0x69,0xc3,0xf3,0x3c,0x4,0x41,0xa0,0x9a,0x11,0xe5,0xfc,
+ 0x10,0x83,0x2,0x86,0x61,0xc0,0x30,0xc,0xd8,0x96,0x5,0xdb,0x32,0x61,0x9a,0x6,
+ 0xc,0x42,0x31,0x7b,0x78,0x1e,0xdf,0x7b,0xe0,0x1,0x7c,0xe7,0xfb,0xdf,0xc7,0xce,
+ 0xbd,0x7b,0xe1,0xf9,0xbe,0x3e,0x8,0x1a,0x1a,0x9a,0x40,0x34,0xce,0x64,0x54,0x4a,
+ 0x65,0xbc,0xfe,0xda,0xd7,0xe2,0xa6,0xb7,0xbc,0x15,0xaf,0xb8,0xf4,0x52,0xac,0x19,
+ 0x1b,0x87,0x65,0x5b,0x2a,0xd9,0x6d,0xc0,0x30,0x8,0x0,0x92,0x8c,0xa2,0x95,0x89,
+ 0xf4,0x30,0x69,0x1c,0x14,0x10,0x80,0x10,0xb2,0xaf,0x43,0x25,0xc8,0x29,0x25,0xe0,
+ 0x51,0x84,0x7d,0x87,0xe,0x61,0xef,0x81,0x3,0xf8,0xfa,0xb7,0xbe,0x89,0xad,0x3b,
+ 0x76,0x60,0x76,0x7e,0x5e,0x4b,0xb6,0x6b,0x68,0x68,0x2,0xd1,0x38,0x9b,0x60,0x18,
+ 0x6,0x8a,0xf9,0x2,0x2e,0x38,0xef,0x3c,0x5c,0xff,0xea,0x6b,0x71,0xcd,0x15,0x57,
+ 0x62,0xed,0xc4,0x39,0x98,0x18,0x5f,0x5,0xc7,0x76,0x94,0xd0,0x61,0x2f,0x44,0x25,
+ 0x0,0x30,0x16,0x29,0x8d,0xab,0x48,0x89,0x30,0x86,0x58,0x6a,0x34,0xb1,0x6d,0xd7,
+ 0xe,0xec,0xd8,0xb3,0x1b,0xcf,0x6d,0xdf,0x8e,0xe7,0x76,0xee,0xc0,0xe4,0xf4,0x34,
+ 0x16,0xea,0x75,0x2d,0x92,0xa8,0xa1,0xa1,0x9,0x44,0xe3,0xac,0x3f,0x21,0x9,0x41,
+ 0xce,0xcd,0xa1,0x54,0x2c,0x60,0x64,0x78,0x4,0x1b,0xd6,0x9e,0x8b,0x6a,0xa5,0x2,
+ 0xd7,0x71,0x51,0x2c,0xe4,0x31,0x3a,0x3c,0x2,0xc7,0xb6,0x31,0xbf,0x70,0x18,0x9e,
+ 0xef,0x63,0xa9,0xb1,0x84,0xf9,0x85,0x5,0x1c,0x9a,0x9a,0xc2,0xe2,0xd2,0x12,0x16,
+ 0x16,0x17,0xd0,0xf1,0x3c,0x84,0xa1,0x2e,0xcb,0xd5,0xd0,0xd0,0x4,0xa2,0xf1,0xb2,
+ 0x27,0x94,0xf4,0x8d,0xaa,0xbf,0x5c,0xe5,0x3d,0x44,0xdc,0xf,0xa2,0x93,0xe1,0x1a,
+ 0x1a,0x9a,0x40,0x34,0x34,0x34,0x34,0x34,0xce,0xc,0x50,0xbd,0xb,0x34,0x34,0x34,
+ 0x34,0x34,0x34,0x81,0x68,0x68,0x68,0x68,0x68,0x68,0x2,0xd1,0xd0,0xd0,0xd0,0x38,
+ 0x5b,0xf0,0xa9,0x4f,0x7d,0xa,0xb7,0xdf,0x7e,0xfb,0x59,0xf7,0xbb,0x74,0xe,0x44,
+ 0x43,0x43,0x43,0xe3,0x38,0x71,0xdd,0x75,0xd7,0xe1,0xfa,0xeb,0xaf,0xc7,0xee,0xdd,
+ 0xbb,0xf1,0xad,0x6f,0x7d,0xeb,0xb8,0xdf,0x77,0xed,0xb5,0xd7,0xe2,0x81,0x7,0x1e,
+ 0x40,0xa1,0x50,0xd0,0x1e,0xc8,0x59,0xc3,0x9e,0x4,0xb8,0xf3,0xd3,0x1f,0xc7,0xc7,
+ 0x3f,0xf6,0x1,0x7d,0x65,0x68,0x68,0xac,0x0,0xe4,0x72,0x39,0xe4,0xf3,0xf9,0x1,
+ 0xd7,0x2a,0x59,0x11,0xc6,0x77,0xcf,0x9e,0x3d,0xd8,0xbc,0x79,0x33,0xfe,0xe0,0xf,
+ 0xfe,0xe0,0x84,0xde,0xf7,0xd8,0x63,0x8f,0xa1,0xd5,0x6a,0x1,0x0,0x4a,0xa5,0x12,
+ 0x2e,0xb8,0xe0,0x2,0x18,0x86,0x71,0x56,0x1c,0x33,0xf1,0x72,0xbc,0xd9,0xb6,0x25,
+ 0xfe,0xbf,0x2f,0x7f,0x41,0xf8,0xcd,0xed,0xe2,0xf9,0xc7,0xff,0x49,0x10,0xf2,0xf2,
+ 0xdc,0xf,0xfa,0xa6,0x6f,0x27,0xe3,0x56,0x28,0x14,0xc4,0x5b,0xdf,0xfa,0x56,0x41,
+ 0x8,0x11,0xbf,0xf0,0xb,0xbf,0x20,0x3e,0xf2,0x91,0x8f,0x88,0x5b,0x6f,0xbd,0x55,
+ 0x58,0x96,0xb5,0xec,0xb5,0xb7,0xdc,0x72,0x8b,0xf8,0xd2,0x97,0xbe,0x24,0xbe,0xfb,
+ 0xdd,0xef,0x8a,0xef,0x7d,0xef,0x7b,0xe2,0xbd,0xef,0x7d,0x6f,0xf2,0x6f,0x37,0xdc,
+ 0x70,0x83,0xa8,0xd7,0xeb,0xe2,0xfe,0xfb,0xef,0xcf,0xbc,0xe7,0xe1,0x87,0x1f,0x16,
+ 0x3f,0xff,0xf9,0xcf,0x85,0xeb,0xba,0xc9,0x73,0x37,0xdf,0x7c,0xb3,0xf8,0xca,0x57,
+ 0xbe,0x22,0x1e,0x78,0xe0,0x1,0xf1,0x9d,0xef,0x7c,0x47,0xbc,0xe3,0x1d,0xef,0xc8,
+ 0xbc,0xe7,0x8f,0xfe,0xe8,0x8f,0xc4,0xdf,0xfd,0xdd,0xdf,0x9,0x4a,0xa9,0xb8,0xe5,
+ 0x96,0x5b,0xc4,0x3d,0xf7,0xdc,0x23,0xbe,0xfb,0xdd,0xef,0x8a,0xd1,0xd1,0xd1,0xcc,
+ 0xeb,0x8e,0xf5,0x39,0xf1,0xcd,0x75,0x5d,0x41,0x29,0x15,0x0,0xc4,0xe7,0x3f,0xff,
+ 0xf9,0x13,0xde,0x47,0xb,0xb,0xb,0xe2,0x2f,0xfe,0xe2,0x2f,0xc4,0xd6,0xad,0x5b,
+ 0xc5,0xe3,0x8f,0x3f,0x2e,0x76,0xef,0xde,0x2d,0xde,0xf0,0x86,0x37,0x9c,0xe9,0xc7,
+ 0xfe,0xd4,0x7e,0xc1,0xfa,0xb1,0x92,0xf8,0xc3,0x77,0xbd,0x4a,0x7c,0xe5,0xb7,0xdf,
+ 0x28,0xfe,0xf8,0xdd,0xaf,0x16,0xaf,0x58,0x5b,0x7b,0xc9,0x8d,0xf5,0xb5,0xd7,0xbe,
+ 0x46,0x3c,0xf9,0xc4,0x23,0x22,0x6c,0xef,0x11,0xb,0x7,0xff,0x4d,0x7c,0xff,0xef,
+ 0xdf,0x27,0x86,0x2b,0xae,0x36,0x4,0xfa,0xa6,0x6f,0x2f,0xf0,0xe6,0x38,0x8e,0x78,
+ 0xfc,0xf1,0xc7,0xc5,0x93,0x4f,0x3e,0x29,0x3e,0xfd,0xe9,0x4f,0x8b,0x5b,0x6f,0xbd,
+ 0x55,0xfc,0xcd,0xdf,0xfc,0x8d,0xd8,0xbc,0x79,0xb3,0xc8,0xe5,0x72,0xc9,0xeb,0xde,
+ 0xf7,0xbe,0xf7,0x89,0x7,0x1e,0x78,0x40,0x14,0x8b,0xc5,0xc4,0x28,0x7f,0xf3,0x9b,
+ 0xdf,0x14,0xff,0xf9,0x3f,0xff,0xe7,0xe4,0x35,0x9f,0xfa,0xd4,0xa7,0xc4,0xcd,0x37,
+ 0xdf,0x9c,0xf9,0xfc,0xb7,0xbd,0xed,0x6d,0xe2,0xdd,0xef,0x7e,0x77,0xf2,0xf8,0xc3,
+ 0x1f,0xfe,0xb0,0xf8,0xf6,0xb7,0xbf,0x2d,0x2a,0x95,0x8a,0xc8,0xe5,0x72,0x62,0xc3,
+ 0x86,0xd,0x62,0xcb,0x96,0x2d,0x99,0xd7,0xe4,0x72,0x39,0xd1,0x6a,0xb5,0xc4,0x3,
+ 0xf,0x3c,0x20,0xee,0xba,0xeb,0x2e,0xf1,0x9e,0xf7,0xbc,0x47,0xfc,0xc6,0x6f,0xfc,
+ 0x46,0x66,0x7b,0x8e,0xe7,0x73,0xd6,0xaf,0x5f,0x2f,0x1e,0x7a,0xe8,0x21,0xb1,0x73,
+ 0xe7,0x4e,0xf1,0xe8,0xa3,0x8f,0x8a,0xf,0x7f,0xf8,0xc3,0xe2,0xe3,0x1f,0xff,0xf8,
+ 0x9,0xef,0xa3,0x46,0xa3,0x21,0xfe,0xec,0xcf,0xfe,0x4c,0x10,0x42,0x4,0x0,0x71,
+ 0xd5,0x55,0x57,0x89,0x3,0x7,0xe,0x88,0x35,0x6b,0xd6,0x88,0xf3,0xcf,0x3f,0x5f,
+ 0x5c,0x77,0xdd,0x75,0x62,0xdd,0xba,0x75,0xc9,0xeb,0x2f,0xbb,0xec,0x32,0x71,0xfd,
+ 0xf5,0xd7,0x8b,0xe1,0xe1,0xe1,0x97,0x27,0x81,0xdc,0xfe,0x86,0xf3,0xc5,0xc2,0xd7,
+ 0x7e,0x43,0x78,0xff,0xfc,0x7f,0x8a,0xf6,0x3f,0xbd,0x5f,0xd4,0xff,0xee,0x37,0xc4,
+ 0xcc,0x97,0xde,0x2d,0xee,0xfb,0x9d,0xb7,0x88,0x8b,0x56,0x57,0x4e,0xfb,0x8f,0xbd,
+ 0xe3,0x9d,0x6f,0x10,0x8f,0x3d,0xfa,0xbf,0x44,0xe0,0x1d,0x16,0x51,0xf7,0x80,0x58,
+ 0x3c,0xf4,0xa0,0xf8,0xe1,0xd7,0x7f,0x4b,0xbc,0xff,0xd6,0x4b,0x84,0x69,0x50,0x6d,
+ 0x8,0xf4,0x4d,0xdf,0x5e,0xc4,0xed,0xae,0xbb,0xee,0x12,0x77,0xde,0x79,0x67,0xe6,
+ 0xb9,0xcf,0x7d,0xee,0x73,0x19,0x63,0x3b,0x35,0x35,0x25,0x36,0x6e,0xdc,0x98,0x79,
+ 0x4d,0xb5,0x5a,0x15,0x3b,0x76,0xec,0x48,0xc,0xeb,0x3b,0xde,0xf1,0xe,0xf1,0x5b,
+ 0xbf,0xf5,0x5b,0x22,0x9f,0xcf,0x8b,0x7b,0xee,0xb9,0x47,0x98,0xa6,0x29,0xee,0xba,
+ 0xeb,0x2e,0x71,0xc5,0x15,0x57,0x8,0x0,0xc2,0x30,0xc,0xb1,0xb0,0xb0,0x20,0xaa,
+ 0xd5,0x6a,0xe6,0x73,0x5e,0xff,0xfa,0xd7,0x8b,0x9f,0xfc,0xe4,0x27,0x99,0xe7,0x3a,
+ 0x9d,0x8e,0xb8,0xe3,0x8e,0x3b,0x6,0x6e,0xef,0xf1,0x7e,0xce,0xcf,0x7e,0xf6,0x33,
+ 0x71,0xdb,0x6d,0xb7,0x25,0xef,0xf9,0xec,0x67,0x3f,0x2b,0x3e,0xf9,0xc9,0x4f,0x9e,
+ 0xf0,0xfe,0x69,0x36,0x9b,0x22,0x9f,0xcf,0x67,0x9e,0xfb,0xf8,0xc7,0x3f,0x2e,0x3e,
+ 0xfa,0xd1,0x8f,0x8a,0xeb,0xae,0xbb,0x4e,0x2c,0x2c,0x2c,0x88,0x35,0x6b,0xd6,0x24,
+ 0xff,0xf6,0xc8,0x23,0x8f,0x88,0x1f,0xfd,0xe8,0x47,0x62,0xfd,0xfa,0xf5,0x2b,0xf6,
+ 0x98,0x9f,0x32,0x39,0xf7,0xdb,0x5e,0xbd,0x1,0x7f,0xfe,0x9b,0xd7,0xc3,0xc9,0x59,
+ 0x30,0xca,0x43,0x30,0xed,0x2,0x30,0xb5,0x17,0x84,0x0,0xd7,0x5e,0x3c,0x8e,0xff,
+ 0xf9,0xb1,0xb7,0xe2,0xbf,0xdc,0x5c,0x7a,0x81,0x6c,0x0,0x0,0x20,0x0,0x49,0x44,
+ 0x41,0x54,0xf7,0x34,0xbe,0xf4,0xc0,0xf3,0xa7,0xbc,0x8b,0xb8,0x9c,0xb7,0xf1,0xc5,
+ 0xcf,0xfc,0xbf,0x78,0xcf,0x7,0x7f,0x17,0x40,0x8,0x16,0xb6,0xb0,0x34,0xb7,0x3,
+ 0x3f,0x7b,0xf0,0x1f,0xf1,0xed,0x6f,0xff,0x4,0x7f,0xff,0xdd,0xed,0x88,0xd4,0x40,
+ 0x23,0xd,0xd,0x8d,0x17,0x86,0x66,0xb3,0xb9,0x2c,0xb1,0xfc,0xf,0xff,0xf0,0xf,
+ 0xf8,0xf2,0x97,0xbf,0x8c,0xcf,0x7c,0xe6,0x33,0x28,0x16,0x8b,0x18,0x1f,0x1f,0xc7,
+ 0xde,0xbd,0x7b,0x33,0xaf,0xa9,0xd7,0xeb,0x70,0x1c,0x7,0xe5,0x72,0x19,0x4b,0x4b,
+ 0x4b,0xd8,0xb2,0x65,0xb,0xde,0xf9,0xce,0x77,0xe2,0xb9,0xe7,0x9e,0xc3,0x3b,0xdf,
+ 0xf9,0x4e,0xbc,0xe9,0x4d,0x6f,0xc2,0xb9,0xe7,0x9e,0x8b,0xe7,0x9f,0x7f,0x1e,0x0,
+ 0x50,0xa9,0x54,0x50,0xab,0xd5,0xf0,0xbd,0xef,0x7d,0xf,0x4b,0x4b,0x4b,0x6a,0x64,
+ 0xb1,0x81,0xe1,0xe1,0xe1,0x65,0x62,0x99,0xae,0xeb,0xe2,0xcb,0x5f,0xfe,0xf2,0xc0,
+ 0xed,0x3d,0x9e,0xcf,0x71,0x5d,0x17,0x7,0xf,0x1e,0xc4,0x37,0xbe,0xf1,0xd,0x0,
+ 0x0,0x63,0xc,0xbf,0xff,0xfb,0xbf,0x8f,0xf,0x7d,0xe8,0x43,0x27,0xbc,0x7f,0x3a,
+ 0x9d,0xe,0x3a,0x9d,0x4e,0xe6,0xb9,0x83,0x7,0xf,0x62,0x62,0x62,0x2,0x8f,0x3e,
+ 0xfa,0x28,0x76,0xec,0xd8,0x81,0x89,0x89,0x9,0x1c,0x3a,0x74,0x8,0xe3,0xe3,0xe3,
+ 0x18,0x1a,0x1a,0xc2,0xd5,0x57,0x5f,0xbd,0xec,0x3d,0x2b,0x9,0x27,0x95,0x40,0x36,
+ 0x6e,0xdc,0x80,0xf9,0xf9,0xc3,0xe0,0x81,0x8f,0xf,0x5c,0x7f,0x11,0xbc,0x8e,0x2f,
+ 0x33,0xd5,0x79,0xe,0xc3,0x71,0x11,0x4,0x2,0x61,0x27,0x0,0x67,0x1c,0xb6,0x49,
+ 0xf1,0xbb,0xff,0xe1,0x95,0x78,0xf5,0xa6,0x51,0xfc,0xf6,0xdf,0x6e,0x46,0x27,0x38,
+ 0x35,0x2a,0xa9,0x37,0x5c,0xb9,0x1,0x7f,0xf9,0x37,0xff,0x1d,0x17,0x5d,0xf1,0x6a,
+ 0x8,0xde,0x1,0xf,0xdb,0x38,0x3c,0xf9,0x34,0x9e,0x78,0xf8,0x5e,0x3c,0xf6,0xfd,
+ 0xed,0x10,0x75,0x7,0xff,0xdb,0xd5,0x97,0x61,0xf3,0xb6,0x3d,0x98,0x5d,0x58,0xd2,
+ 0x56,0x40,0x43,0xe3,0x5,0x82,0x73,0x8e,0x62,0xb1,0x98,0x79,0x6e,0x7c,0x7c,0x1c,
+ 0x4b,0x4b,0xf2,0xba,0x6a,0xb5,0x5a,0x38,0x74,0xe8,0x10,0x46,0x46,0x46,0x30,0x3b,
+ 0x3b,0x9b,0x79,0x4d,0xb1,0x58,0x44,0xb3,0xd9,0x4,0x0,0xec,0xde,0xbd,0x1b,0x6f,
+ 0x7d,0xeb,0x5b,0x71,0xfe,0xf9,0xe7,0xe3,0xde,0x7b,0xef,0xc5,0x27,0x3f,0xf9,0x49,
+ 0x54,0xab,0x55,0x78,0x9e,0x7,0x0,0x58,0x5c,0x5c,0xc4,0xfc,0xfc,0x3c,0xde,0xf3,
+ 0x9e,0xf7,0x60,0xf7,0xee,0xdd,0x47,0xdc,0x1e,0xd7,0x75,0x41,0x8,0x39,0xe2,0xbf,
+ 0x1f,0xcf,0xe7,0xc,0xd,0xd,0x61,0xe7,0xce,0x9d,0x99,0xe7,0x82,0x20,0x18,0x98,
+ 0xe8,0x3f,0x1a,0x6c,0xdb,0xc6,0xd8,0xd8,0x18,0x5e,0xf9,0xca,0x57,0xe2,0xa9,0xa7,
+ 0x9e,0x4a,0xa,0x3,0x6e,0xbb,0xed,0x36,0x7c,0xe6,0x33,0x9f,0x49,0xc8,0xf6,0x13,
+ 0x9f,0xf8,0x4,0x6e,0xb9,0xe5,0x16,0x7c,0xee,0x73,0x9f,0xc3,0xf6,0xed,0xdb,0x57,
+ 0x34,0x79,0x0,0x27,0xb1,0xa,0x2b,0x9f,0x73,0xb0,0xf9,0xdf,0xef,0xc3,0xcc,0xcc,
+ 0xc,0x9e,0xda,0xb2,0x5,0x97,0x7e,0xf0,0xbf,0xa2,0x5e,0xba,0x8,0x3b,0xb7,0xce,
+ 0x61,0xd7,0x8f,0xb7,0x62,0xd7,0x8f,0x1e,0xc2,0xec,0xfe,0x79,0x2c,0x2d,0x7a,0x68,
+ 0x35,0x2,0x74,0xdb,0x11,0x42,0x9f,0xe1,0x17,0x2e,0x58,0x85,0x7f,0xf9,0xe8,0x8d,
+ 0xb8,0xfe,0xc2,0x55,0x27,0xf5,0x87,0x39,0x96,0x81,0xcf,0xff,0xfe,0x7,0xf1,0xc3,
+ 0x9f,0x6e,0xc1,0x45,0x57,0x5c,0x3,0x1e,0x35,0x10,0x79,0x8b,0x98,0xdc,0xb5,0x19,
+ 0x3f,0x7e,0xe0,0x1f,0xf1,0xf,0x5f,0xff,0x9,0x16,0xe,0x87,0x30,0x8,0x81,0x45,
+ 0x29,0xce,0x5d,0x35,0xaa,0x2d,0x80,0x86,0xc6,0x8b,0x80,0x61,0x18,0xf8,0xc4,0x27,
+ 0x3e,0x91,0x54,0x17,0x15,0x8b,0x45,0x7c,0xea,0x53,0x9f,0xc2,0x3d,0xf7,0xdc,0x93,
+ 0xbc,0xe6,0x8b,0x5f,0xfc,0x22,0xbe,0xf6,0xb5,0xaf,0x21,0x97,0xcb,0x1,0x0,0x2c,
+ 0xcb,0xc2,0x17,0xbe,0xf0,0x5,0xdc,0x75,0xd7,0x5d,0xe0,0x9c,0x27,0x44,0x74,0xe0,
+ 0xc0,0x1,0x14,0x8b,0x45,0xfc,0xda,0xaf,0xfd,0x1a,0x5e,0xfb,0xda,0xd7,0xe2,0xc1,
+ 0x7,0x1f,0x4c,0x3e,0x43,0x8,0x81,0xbb,0xef,0xbe,0x1b,0xbf,0xf3,0x3b,0xbf,0x3,
+ 0xd3,0x34,0x33,0xdf,0x3f,0x34,0x34,0x94,0x3c,0x2e,0x95,0x4a,0xc9,0x77,0xc,0xc2,
+ 0xf1,0x7c,0xce,0xe4,0xe4,0x24,0xd6,0xaf,0x5f,0x9f,0xf9,0xf7,0xd,0x1b,0x36,0xe0,
+ 0xb6,0xdb,0x6e,0x3b,0xa1,0x7d,0x73,0xd9,0x65,0x97,0x1,0x0,0xee,0xbd,0xf7,0x5e,
+ 0xdc,0x7e,0xfb,0xed,0x78,0xfb,0xdb,0xdf,0x8e,0x6f,0x7d,0xeb,0x5b,0x98,0x9c,0x9c,
+ 0xc4,0xc3,0xf,0x3f,0xc,0x0,0xf8,0xea,0x57,0xbf,0x8a,0x37,0xbf,0xf9,0xcd,0xf8,
+ 0xd5,0x5f,0xfd,0x55,0xbc,0xeb,0x5d,0xef,0xc2,0x1f,0xff,0xf1,0x1f,0xaf,0xf8,0x63,
+ 0x7e,0xd2,0x8,0xe4,0x9a,0x2b,0x2f,0xc0,0xc8,0xd8,0x8,0x5c,0xd7,0xc1,0xc6,0x8d,
+ 0x9b,0x50,0x5b,0x7f,0x31,0x2e,0x7c,0xf7,0x27,0x71,0xd5,0x67,0xfe,0x5,0xeb,0x3e,
+ 0xf0,0x17,0x10,0x57,0xbc,0x1d,0x5b,0xf,0x78,0xd8,0xb5,0xbf,0x81,0xc9,0x99,0xe,
+ 0x16,0x16,0xba,0x68,0x34,0x43,0x74,0xda,0x11,0x36,0x54,0xa,0xf8,0xda,0x1d,0x6f,
+ 0xc4,0x9f,0xdc,0x7e,0x2d,0x6a,0x5,0xfb,0x45,0x6f,0xcb,0xfa,0x89,0x51,0x3c,0xf9,
+ 0xd3,0x7,0xf1,0x91,0x3b,0x3f,0xf,0x6a,0x8,0x8,0xe6,0x21,0xec,0x2e,0x60,0xcf,
+ 0xd6,0xfb,0xf1,0xc8,0xf,0xbf,0x89,0x3f,0xfe,0xe2,0x8f,0xf0,0xf3,0x6d,0xb,0x88,
+ 0xb8,0x90,0x2b,0x14,0x2,0xb8,0x8e,0xad,0x2d,0x80,0x86,0xc6,0x8b,0x40,0xb9,0x5c,
+ 0x46,0xab,0xd5,0xc2,0x13,0x4f,0x3c,0x81,0x7f,0xfc,0xc7,0x7f,0xc4,0x8e,0x1d,0x3b,
+ 0xb0,0x7f,0xff,0x7e,0xdc,0x75,0xd7,0x5d,0xc9,0x6b,0x3e,0xfb,0xd9,0xcf,0xe2,0xe1,
+ 0x87,0x1f,0xc6,0xb3,0xcf,0x3e,0x8b,0xef,0x7f,0xff,0xfb,0x78,0xf2,0xc9,0x27,0x71,
+ 0xf0,0xe0,0x41,0xfc,0xee,0xef,0xfe,0x6e,0xe6,0xb3,0x7e,0xf0,0x83,0x1f,0xe0,0xfe,
+ 0xfb,0xef,0x47,0xab,0xd5,0xc2,0xe3,0x8f,0x3f,0x8e,0xfb,0xef,0xbf,0x3f,0xf3,0xef,
+ 0x1f,0xfb,0xd8,0xc7,0xe0,0xba,0x2e,0xb6,0x6c,0xd9,0x82,0x87,0x1f,0x7e,0x18,0x9b,
+ 0x37,0x6f,0xc6,0xbd,0xf7,0xde,0x8b,0x6b,0xae,0xb9,0x6,0x40,0xaf,0xef,0x22,0x26,
+ 0xa3,0xa7,0x9e,0x7a,0xa,0x6f,0x7b,0xdb,0xdb,0x96,0x6d,0xf3,0xb1,0x3e,0x7,0x0,
+ 0xee,0xbc,0xf3,0x4e,0xfc,0xe5,0x5f,0xfe,0x25,0xde,0xf4,0xa6,0x37,0xe1,0xa6,0x9b,
+ 0x6e,0xc2,0xbf,0xfe,0xeb,0xbf,0xe2,0xe2,0x8b,0x2f,0xc6,0xd,0x37,0xdc,0x70,0xdc,
+ 0xfb,0xe6,0xa2,0x8b,0x2e,0xc2,0x6f,0xff,0xf6,0x6f,0xe3,0x75,0xaf,0x7b,0x1d,0xce,
+ 0x3b,0xef,0x3c,0xdc,0x7a,0xeb,0xad,0xb8,0xf7,0xde,0x7b,0xf1,0xbe,0xf7,0xbd,0x2f,
+ 0xe3,0x11,0xfd,0xd5,0x5f,0xfd,0x15,0xbe,0xfe,0xf5,0xaf,0xe3,0xee,0xbb,0xef,0xc6,
+ 0x23,0x8f,0x3c,0xb2,0xe2,0x8f,0x79,0xa6,0x91,0x30,0x1e,0xc8,0x13,0x4f,0x75,0x33,
+ 0xc,0x63,0xe0,0xe3,0x98,0x8d,0xd3,0xe3,0x40,0x6f,0xf9,0xa5,0x57,0xe1,0x4f,0xbf,
+ 0xf0,0xa7,0x20,0xd4,0x84,0xe0,0x1c,0x10,0xc,0x2,0x0,0xa1,0x16,0xa8,0x91,0x7,
+ 0x31,0x72,0x0,0x28,0x5a,0xf3,0x53,0x78,0xfe,0xfe,0x7b,0xb0,0xe3,0xfe,0xff,0x81,
+ 0xb2,0x43,0x51,0xce,0x59,0x28,0x14,0x2c,0xe4,0x5c,0x3,0xb9,0x9c,0x81,0x39,0x61,
+ 0xe2,0xff,0xf9,0xc6,0x13,0xd8,0x3e,0xb9,0x94,0x51,0x61,0x8d,0x5d,0xbe,0xf4,0xdf,
+ 0x7e,0x54,0xf3,0x16,0xfe,0x8f,0xf7,0xfc,0x27,0xdc,0x7e,0xc7,0x87,0x30,0x32,0x32,
+ 0x4,0xf0,0xe,0x78,0xd4,0x45,0x7b,0x71,0x3f,0x76,0x6d,0xf9,0x11,0x9e,0x7c,0xf4,
+ 0x61,0xfc,0xed,0xbf,0x3c,0x8f,0xe7,0xf6,0x35,0x71,0xf5,0xb9,0x63,0x38,0x7f,0xb8,
+ 0x8,0xa,0x60,0xaa,0x13,0x62,0xba,0x13,0xe0,0xb9,0xfd,0xd3,0xe0,0x42,0x92,0x4a,
+ 0xbc,0x2f,0xe2,0xfb,0xe9,0xed,0x48,0x76,0xde,0x51,0xdc,0x63,0xd,0x8d,0x97,0x1b,
+ 0xee,0xba,0xeb,0x2e,0x7c,0xfa,0xd3,0x9f,0x46,0x10,0x4,0xb8,0xfc,0xf2,0xcb,0x71,
+ 0xf0,0xe0,0x41,0x6c,0xdd,0xba,0xf5,0x88,0xde,0xca,0xf0,0xf0,0x30,0xea,0xf5,0x3a,
+ 0x82,0x20,0x78,0xe1,0x91,0x6,0xc7,0x41,0xa5,0x52,0xc1,0xfc,0xfc,0x7c,0xe2,0xc1,
+ 0x2c,0x33,0x72,0x84,0xc0,0xb6,0x6d,0x4,0x41,0x70,0xc4,0x11,0xc6,0xc7,0xfa,0x1c,
+ 0xd3,0x34,0x71,0xf9,0xe5,0x97,0xc3,0x30,0xc,0x3c,0xf3,0xcc,0x33,0x8,0xc3,0xf0,
+ 0x94,0xcc,0x98,0xb9,0xfa,0xea,0xab,0xf1,0xd5,0xaf,0x7e,0x15,0x37,0xdc,0x70,0x43,
+ 0x26,0xcc,0x77,0x3a,0x11,0x45,0x11,0x18,0x63,0x60,0x8c,0x65,0xee,0xa7,0x6f,0xf1,
+ 0x7e,0x24,0xaa,0x42,0x22,0xd9,0x49,0xb6,0x6d,0xc3,0xb2,0xac,0x23,0xfe,0x8d,0xef,
+ 0xc7,0x4,0x22,0x84,0x0,0xe7,0x1c,0x63,0xe5,0x6,0xd6,0xaf,0x29,0xc3,0xeb,0x2c,
+ 0xa1,0xdd,0x98,0x87,0xd7,0x59,0x42,0x18,0x7a,0x80,0xe0,0x30,0x2c,0x7,0x8e,0x5b,
+ 0x42,0xb1,0x32,0x82,0xca,0xf0,0x3a,0x94,0x86,0x2f,0x0,0x88,0x8b,0x83,0xcf,0x3e,
+ 0x8e,0x7,0xbf,0xf4,0x5,0x14,0x10,0x61,0xb4,0xe2,0xa2,0x56,0x75,0x90,0x77,0xc,
+ 0xc,0x6d,0x5c,0x8b,0x9d,0x6c,0x8,0x3f,0x9d,0xb6,0x61,0x38,0x79,0xd8,0xb6,0xd,
+ 0xc7,0x71,0x60,0x9a,0x26,0x4c,0xd3,0x4c,0x4d,0x9e,0x53,0xe,0x94,0xe0,0x18,0x35,
+ 0xda,0xb8,0xe2,0xfa,0x37,0xa1,0x30,0xb4,0xa,0x10,0x1e,0x78,0xd4,0x1,0xb,0x9a,
+ 0x38,0x3c,0xb9,0x5,0xdb,0x9f,0xfe,0x11,0x9e,0xf9,0xf9,0xe,0x2c,0x90,0xb,0xc1,
+ 0xcd,0xa,0xba,0x9d,0x36,0xa6,0x7f,0xfa,0x20,0x6a,0xe,0x1,0x17,0x92,0x40,0x66,
+ 0x3b,0x21,0x36,0x5d,0x7e,0x35,0x8a,0xe5,0x72,0xd2,0xcc,0x54,0x2c,0x16,0x91,0xcf,
+ 0xe7,0x91,0xcf,0xe7,0xe1,0x38,0xe,0x2c,0xcb,0x4a,0x88,0x74,0x10,0xa1,0x68,0x68,
+ 0xbc,0x9c,0x71,0xfd,0xf5,0xd7,0xe3,0x99,0x67,0x9e,0x49,0x72,0x1e,0x2b,0x15,0x62,
+ 0x5,0x4b,0xff,0x9f,0x73,0xce,0x39,0xb0,0x6d,0xfb,0xa8,0xb9,0x9d,0xe3,0xf2,0xc,
+ 0x5e,0x84,0x6d,0xf2,0x7d,0x1f,0x41,0x10,0x20,0x8,0x82,0xcc,0xfd,0xf4,0x63,0xce,
+ 0x39,0xee,0xbb,0xef,0xbe,0xac,0x7,0x62,0x9a,0xe6,0x51,0xc9,0x23,0xfd,0x37,0x7d,
+ 0x20,0x84,0x10,0x78,0xef,0x7f,0x7c,0x25,0x2e,0xde,0x58,0x42,0xfd,0xf0,0x2c,0x16,
+ 0xe7,0xeb,0x68,0x37,0x3b,0x8,0xc2,0x10,0x10,0x72,0xb5,0xe1,0xb8,0x16,0xf2,0xa5,
+ 0x1c,0x8a,0x95,0x32,0xaa,0xb5,0x51,0xc,0x8f,0x9f,0x8b,0xb1,0xb5,0x97,0xa3,0x58,
+ 0xbb,0x0,0xfb,0x9f,0x79,0x2,0xdf,0xfb,0xc2,0x7f,0xc5,0xa8,0x4b,0xb1,0x7e,0xbc,
+ 0x82,0x6a,0xc5,0x46,0x6d,0x55,0x19,0x73,0xc8,0xe3,0xff,0xfe,0xdb,0x87,0x31,0xd3,
+ 0x8,0x33,0xa4,0x91,0x36,0xde,0x57,0x4e,0xe4,0xf0,0x91,0xdf,0xf9,0x8,0x2e,0x7c,
+ 0xdd,0x2f,0x1,0x60,0x10,0xac,0x3,0x16,0x75,0xe0,0x35,0xa7,0x71,0x70,0xd7,0x8f,
+ 0xf1,0xfc,0x53,0x8f,0xe2,0xc1,0x87,0x77,0xe3,0xc1,0x67,0x9a,0xe8,0xfa,0x1c,0x9c,
+ 0x73,0x94,0x2c,0x8a,0xd7,0x4e,0x54,0x50,0xb1,0x29,0x1a,0x1,0xc3,0x64,0x27,0xc4,
+ 0x6c,0x37,0xc4,0xa1,0x7a,0x1b,0x2,0x24,0x21,0x89,0x98,0xb0,0xd2,0xde,0xd7,0x20,
+ 0x8f,0x48,0x43,0xe3,0xe5,0x8e,0xd7,0xbf,0xfe,0xf5,0xb8,0xf3,0xce,0x3b,0xb1,0xb0,
+ 0xb0,0x80,0x47,0x1e,0x79,0x4,0x9f,0xff,0xfc,0xe7,0x5f,0x56,0x86,0xff,0x64,0xa0,
+ 0x58,0x2c,0xe2,0x4f,0xfe,0xe4,0x4f,0xf0,0x81,0xf,0x7c,0xe0,0x25,0x9d,0xa0,0x19,
+ 0x93,0x44,0x18,0x86,0x47,0x24,0x93,0xd8,0x4b,0x3b,0x22,0x81,0xf4,0x7b,0x1c,0xfd,
+ 0x7f,0xd3,0x7,0x53,0x8,0x81,0x5b,0xae,0x2f,0xc1,0x15,0x1e,0xda,0x1d,0x1f,0x11,
+ 0xe3,0x3d,0x17,0x7,0x32,0xc7,0x40,0x29,0x81,0x65,0x18,0x70,0x73,0x16,0xca,0xb5,
+ 0x22,0xaa,0x43,0x15,0xc,0x8f,0x8e,0x61,0x78,0x6c,0x3d,0xc6,0xd7,0x5f,0x81,0x42,
+ 0xf5,0x42,0x6c,0xfe,0xe7,0x6f,0xe0,0xc7,0xf7,0x7e,0xb,0x17,0xaf,0x2a,0x61,0xfd,
+ 0x9a,0x2a,0x8a,0x39,0xc0,0x9e,0x18,0xc7,0x17,0xff,0xfd,0x10,0x7e,0xfa,0xcc,0x6e,
+ 0xd4,0x3b,0xc,0x95,0xbc,0x85,0xb5,0x43,0x2e,0x5e,0x31,0x96,0xc3,0xf5,0x6f,0x78,
+ 0x1d,0xae,0xfd,0xd5,0xf,0x82,0x5a,0x79,0x80,0x7b,0x60,0x61,0xb,0xa1,0xb7,0x84,
+ 0xc5,0xe9,0xe7,0xb1,0x73,0xeb,0x43,0xd8,0xf6,0xf4,0x56,0xfc,0xf0,0xa7,0x87,0x31,
+ 0xd9,0xcc,0x63,0x76,0x76,0x56,0xe,0x21,0x12,0x2,0xeb,0xcb,0x2e,0x5e,0xbd,0xba,
+ 0x4,0xc7,0x20,0x58,0xf4,0x19,0xf6,0x35,0x3,0xcc,0x77,0x43,0x1c,0xaa,0xb7,0x6,
+ 0x12,0x48,0xbf,0xd7,0xa3,0x9,0x44,0x43,0x63,0x30,0x6c,0xdb,0x6,0xe7,0xfc,0xa4,
+ 0xce,0x9e,0x17,0x2f,0x83,0x61,0x61,0x7f,0xf8,0x87,0x7f,0x88,0x8b,0x2f,0xbe,0x18,
+ 0xa3,0xa3,0xa3,0xf8,0xc6,0x37,0xbe,0x81,0x2f,0x7d,0xe9,0x4b,0x2f,0x39,0x81,0xc4,
+ 0xa4,0x11,0x86,0xe1,0x11,0x9,0xc4,0x3c,0x59,0x7,0xad,0xb5,0xd4,0x6,0x71,0x4,
+ 0x8,0x25,0x10,0x51,0x9c,0x47,0x30,0xb0,0x67,0x8e,0x63,0xb1,0xe9,0xc1,0x31,0x9,
+ 0x4a,0x39,0x8a,0xb1,0x4a,0x88,0x66,0xcb,0x43,0x63,0xa1,0x85,0x4e,0xa3,0x85,0x6e,
+ 0xb7,0xd,0xaf,0xd3,0xc0,0xd0,0xf8,0x1,0x5c,0x77,0xcb,0x7f,0xc0,0xd5,0x6f,0xbb,
+ 0x15,0xdf,0xfa,0xd3,0xcf,0x62,0xcf,0xd3,0x5b,0x71,0xe5,0xfa,0x61,0x4c,0x88,0x19,
+ 0x7c,0xec,0xd,0xa3,0x30,0x5f,0x5f,0x96,0xc4,0xc4,0x38,0x30,0xbc,0x11,0x95,0x37,
+ 0xde,0xe,0xb3,0xb2,0x6,0xe0,0x3e,0x78,0x50,0x47,0x14,0x34,0xd0,0xaa,0x1f,0xc4,
+ 0xfe,0x1d,0x3f,0xc6,0x8e,0xa7,0x9f,0xc0,0xcf,0x9f,0x39,0x84,0x47,0xb6,0x34,0x31,
+ 0xb7,0xc4,0x30,0x31,0x51,0x5,0xe7,0xd2,0xfb,0x80,0x10,0x98,0x28,0x3a,0xb0,0xa8,
+ 0xc,0x5f,0x45,0x5c,0x20,0xe2,0xbd,0x89,0x76,0x71,0x58,0xee,0x78,0xf6,0x85,0x50,
+ 0xf9,0x12,0xd,0xd,0xd,0x89,0x17,0x93,0xcf,0x38,0x51,0x1b,0x74,0x36,0x11,0xcb,
+ 0xef,0xfd,0xde,0xef,0x1,0x40,0x52,0xc1,0xf6,0x52,0xfc,0xb6,0x23,0xd9,0xb2,0x41,
+ 0x36,0x31,0x71,0x3a,0x4e,0xc6,0x41,0x16,0x42,0xc0,0x74,0x1c,0xac,0x3f,0x7f,0x8,
+ 0x4f,0x6f,0x99,0x5,0xe5,0xc,0x85,0x9c,0x9,0xc6,0x38,0x66,0x97,0x4,0xb6,0xed,
+ 0xf3,0x52,0x1b,0x29,0x30,0x56,0x75,0xb0,0x76,0x34,0xc0,0xa6,0xba,0x87,0x89,0x7a,
+ 0xb,0xc1,0x26,0x1f,0x5c,0x44,0x10,0x9c,0x61,0xf4,0x9c,0xcb,0xf0,0xeb,0x7f,0xf8,
+ 0xa7,0x8,0xfd,0x10,0x93,0xdb,0xb6,0x22,0x9c,0xd9,0xd,0x8f,0xfa,0x70,0x8b,0x45,
+ 0xe4,0xce,0xb9,0x0,0xce,0xf8,0x26,0xe9,0x71,0x8,0x1f,0x22,0x6a,0x20,0xf2,0x1b,
+ 0xf0,0x5a,0xb3,0x98,0xdc,0xfb,0x4,0x76,0x3c,0xf3,0x63,0xec,0xd9,0xb1,0x1f,0x3f,
+ 0xde,0x52,0xc7,0x64,0xab,0x84,0xd9,0x7a,0x94,0x24,0x7c,0x62,0xef,0xa3,0x60,0x19,
+ 0xa8,0xb8,0x26,0x98,0x10,0x88,0x4,0xd0,0x8d,0x38,0x42,0x2e,0xc0,0x84,0x48,0x1c,
+ 0xb2,0xf8,0x37,0x1d,0x6d,0xc7,0x69,0x68,0x68,0x9c,0x1a,0xcc,0x4d,0x4d,0xeb,0x9d,
+ 0x70,0xa,0x31,0x34,0x36,0x3a,0x90,0x38,0xd2,0x29,0x89,0xe3,0x25,0xec,0x93,0xd6,
+ 0x48,0xd8,0x60,0x65,0xfc,0xaf,0x27,0x23,0x3c,0xf6,0x54,0x13,0xbf,0x74,0x5,0x5,
+ 0x63,0x1c,0x61,0xc4,0xb0,0x77,0xb2,0x99,0x79,0x5d,0xb7,0xeb,0x63,0x8a,0x9,0xec,
+ 0x3a,0xd0,0xc1,0xb3,0xc3,0x35,0xac,0x19,0xf1,0x70,0xe5,0x54,0x13,0x97,0x5e,0xdc,
+ 0xc0,0xf9,0x97,0x9,0x10,0x50,0x44,0x7e,0x7,0xa5,0x91,0x4d,0x58,0xff,0xca,0x2b,
+ 0x1,0xf2,0x9a,0xf4,0x4f,0x0,0xc0,0x0,0xde,0x46,0xe8,0xd7,0xe1,0xb7,0xe7,0x30,
+ 0x77,0xf0,0x19,0x6c,0x7b,0xf2,0x21,0xec,0xdd,0xb5,0xf,0xbb,0xf7,0x2f,0xe1,0xc9,
+ 0x7d,0x2,0xfb,0xa6,0xba,0xb0,0x6d,0x86,0x72,0xb9,0x8c,0xc3,0x87,0xf,0x67,0x88,
+ 0xa0,0x68,0x9b,0xa0,0x4,0xf0,0x23,0x81,0x50,0x8,0x74,0x98,0x40,0xc8,0x39,0xfa,
+ 0x1b,0xd1,0xd3,0xef,0xd1,0x24,0xa2,0xa1,0x71,0x7a,0xb1,0x6d,0xd7,0x4e,0xbd,0x13,
+ 0x4e,0x1,0x2e,0xdc,0x74,0xde,0xc0,0x8,0x4b,0xbf,0xf7,0x71,0xbc,0x24,0x72,0xd2,
+ 0x8,0xe4,0xa1,0x9f,0x4d,0xca,0x6a,0xac,0xa,0x81,0x69,0x10,0x14,0xa,0xe,0xf6,
+ 0x4c,0xb5,0xe0,0x87,0xf2,0xb,0x2d,0xcb,0x42,0x18,0xca,0x64,0x78,0x1c,0x1f,0xf5,
+ 0xfc,0x10,0xcf,0xed,0x69,0x63,0xcf,0x94,0x8d,0x7f,0x7b,0xa6,0x89,0x2b,0x1f,0x3f,
+ 0x80,0x5f,0xfa,0xc5,0x4b,0x71,0xde,0x25,0xaf,0x41,0xe0,0x37,0x51,0xac,0xac,0x81,
+ 0x9d,0x1f,0x2,0x35,0x5d,0x10,0x62,0x40,0x88,0x8,0x2c,0x6c,0xc3,0x6f,0x1d,0xc6,
+ 0xfc,0xe4,0x73,0x78,0xfe,0xe9,0x7,0xb1,0xeb,0xb9,0xdd,0x38,0xbc,0xd0,0xc1,0x53,
+ 0xfb,0x19,0xb6,0xec,0x6e,0xc0,0x30,0x2d,0x94,0x4a,0x25,0xd4,0xeb,0x75,0xc,0xd,
+ 0xd,0x81,0x73,0x8e,0x20,0x8,0x92,0xef,0xcf,0xdb,0x6,0xba,0x11,0x47,0x40,0x8,
+ 0x2,0x26,0xd0,0x9,0x19,0x7c,0x26,0xc3,0x58,0x47,0xf3,0x38,0x34,0x89,0x68,0x68,
+ 0x9c,0x7a,0xe8,0xeb,0xec,0xd4,0x23,0x5d,0xa6,0x3c,0x28,0x6c,0x75,0x22,0x9e,0xc8,
+ 0x32,0x2,0x79,0xa1,0x31,0xfd,0xf8,0x7d,0x25,0x57,0x3e,0x36,0x28,0xc5,0xcc,0x62,
+ 0xaf,0x92,0x80,0x52,0xa,0xcb,0xb2,0xe0,0xba,0x2e,0x66,0x66,0x66,0xb0,0x6a,0xd5,
+ 0xaa,0xa4,0x4d,0x9f,0x10,0x3,0xf3,0xd,0x86,0x7f,0x79,0x78,0x1a,0xdb,0x26,0x3,
+ 0xac,0x1b,0x79,0x1a,0x37,0x5c,0xbb,0xe,0x6b,0x37,0x6d,0xc0,0xc8,0xaa,0x75,0x70,
+ 0xb,0x55,0x10,0x42,0xe0,0xb5,0x1b,0x98,0x9d,0xde,0x89,0x83,0xbb,0xf7,0x62,0x7a,
+ 0x72,0x1,0xf5,0xa6,0x8f,0x7d,0xb,0x4,0x4f,0x3c,0xbf,0x88,0xe1,0xd1,0x9,0x84,
+ 0xd1,0x22,0xc2,0x88,0x61,0xd5,0xaa,0x55,0x58,0x58,0x58,0x48,0xca,0x7c,0x9b,0xcd,
+ 0x26,0xaa,0xd5,0xaa,0xac,0xf1,0x6,0x41,0x33,0xe0,0x30,0x8,0xe0,0x73,0x81,0x56,
+ 0xc8,0x10,0x44,0x1c,0x1,0xe3,0x3,0x35,0xb9,0xf4,0x9,0xad,0xa1,0xa1,0xf1,0x82,
+ 0xb0,0xfd,0x21,0xe0,0xf0,0x73,0x80,0x25,0x80,0x75,0xaf,0x5,0x6c,0x1b,0xa8,0x5c,
+ 0x78,0xc2,0x1f,0x33,0x39,0x39,0x85,0x5c,0xce,0x45,0xad,0x56,0x3b,0xa9,0x4,0x42,
+ 0x8,0xe9,0x15,0x3b,0xa5,0xa,0x83,0x4e,0x24,0xfa,0x62,0xbe,0x58,0x83,0x99,0x8e,
+ 0x9f,0x11,0x42,0x90,0xb3,0xd5,0xf0,0x97,0x52,0x1e,0x87,0xe,0xcf,0x26,0x65,0x5e,
+ 0x51,0x14,0xa1,0x52,0x29,0x83,0x31,0xe,0xc7,0x71,0x90,0xcf,0xe7,0xb1,0xb0,0xb0,
+ 0x80,0xf1,0xf1,0x71,0x50,0x4a,0x51,0xaf,0xd7,0x51,0x2c,0x96,0xb0,0x6f,0xda,0xc7,
+ 0x9e,0x49,0x8e,0x47,0x9f,0x7b,0x16,0x17,0xad,0xdd,0x85,0x55,0x15,0x3,0x96,0x65,
+ 0x62,0xa8,0x44,0x51,0xf7,0x8,0xf2,0x6,0xc3,0xe1,0xae,0x8d,0xa5,0xa6,0x8f,0xad,
+ 0x7b,0x1a,0x18,0x1a,0x5b,0x8b,0x76,0x77,0xe,0xa3,0x94,0x2e,0xf3,0x20,0xa2,0x28,
+ 0x2,0x21,0x4,0xbe,0xef,0xa3,0x5a,0xad,0x82,0x52,0x8a,0x6e,0xc8,0xb0,0x14,0xc8,
+ 0xe7,0x3,0xc6,0xd1,0xa,0x18,0xbc,0x88,0x23,0x88,0x98,0x3e,0xe1,0x35,0x34,0xb4,
+ 0xf7,0x71,0x4c,0xfc,0xec,0xf1,0x27,0xf0,0x9d,0xfb,0xee,0x43,0xb7,0xeb,0x2d,0xfb,
+ 0xb7,0x3b,0xde,0xff,0x5e,0x6c,0x5c,0xb5,0xa,0xe1,0x17,0x3e,0x1,0xfb,0x82,0x2,
+ 0xf0,0xd6,0xf,0x1,0xa5,0x9e,0x4c,0xd3,0xe4,0xde,0xe7,0x70,0xf7,0x3f,0xff,0xf,
+ 0x4c,0xce,0xcc,0x27,0xcf,0xd5,0x6a,0x35,0xac,0x99,0x58,0x8d,0xab,0xaf,0xba,0xa,
+ 0x97,0x5d,0x7a,0x9,0x0,0xa0,0xdb,0xf5,0xf0,0x9d,0xfb,0xee,0xc3,0x96,0xad,0x5b,
+ 0x51,0xab,0xd5,0x90,0x73,0x73,0x58,0x58,0x5c,0xc4,0x9a,0x89,0xd5,0x0,0x80,0x85,
+ 0xc5,0x45,0x4c,0x4e,0x4e,0xd,0xdc,0xbe,0xb7,0xdc,0xf8,0x66,0x6c,0xdb,0xb2,0x5,
+ 0x3f,0xfd,0xc9,0x4f,0x70,0xf1,0x25,0x97,0xe0,0xc6,0xb7,0xdc,0x88,0x57,0xbf,0xa6,
+ 0x97,0xa,0x60,0x8c,0xd,0x6c,0xce,0x4e,0xdb,0xf2,0xe3,0xcd,0xff,0x9e,0x74,0x35,
+ 0xde,0x72,0x9e,0xa0,0x52,0xca,0x21,0xa,0x23,0x2c,0x34,0x18,0x28,0x95,0x8c,0x66,
+ 0x52,0x8e,0x6a,0xb5,0x8a,0x6d,0xdb,0xb6,0x63,0xed,0xda,0xb5,0x30,0x4d,0x13,0x84,
+ 0x10,0xc,0xf,0xf,0x23,0x8,0x2,0x2c,0x2e,0x2e,0xe2,0x9c,0x73,0xce,0xc1,0x9e,
+ 0x3d,0x7b,0xb0,0x76,0xed,0x5a,0xec,0xdf,0xbf,0x1f,0xb3,0xdd,0x1a,0x1e,0x7b,0x6e,
+ 0x2f,0x36,0x6c,0xdc,0x80,0x7d,0x7b,0xf7,0x60,0xdd,0xfa,0x75,0x38,0x70,0x60,0x12,
+ 0x80,0x6c,0xb8,0xa9,0xb7,0xe,0x63,0x64,0x5c,0x12,0x47,0xbd,0x5e,0x4f,0xd4,0x3c,
+ 0x83,0x20,0x80,0x61,0x18,0x68,0xb7,0xdb,0x28,0x95,0x4a,0xe8,0x76,0xbb,0x10,0x42,
+ 0x80,0x52,0x8a,0x66,0xc0,0xd4,0xce,0x2,0x2,0xc6,0xd1,0x8d,0x4,0x22,0xc6,0x11,
+ 0xa9,0x64,0xfb,0x91,0xba,0xcd,0x75,0xb5,0x95,0x86,0x86,0x6,0x0,0x5c,0x73,0xf5,
+ 0x55,0x70,0x5d,0x17,0x7f,0xf7,0xf7,0x5f,0x3,0x0,0xfc,0x97,0xcf,0x4a,0x31,0xc4,
+ 0x87,0x1e,0x7e,0x4,0x7,0x9f,0xdb,0x85,0xe1,0xcf,0xfe,0x35,0xf2,0xaf,0xd9,0x4,
+ 0xfc,0xca,0x7,0x97,0xbd,0x77,0x62,0xfd,0xc5,0xf8,0xf5,0x5f,0x5b,0x85,0xcf,0xff,
+ 0xf9,0x5f,0x60,0x62,0xf5,0x4,0xee,0x78,0xff,0x7b,0xf1,0xb3,0xc7,0x9f,0xc0,0xdd,
+ 0xdf,0xbc,0x7,0xcf,0x6e,0xd9,0x8a,0x3b,0xde,0xff,0x5e,0x4c,0xac,0x9e,0xc0,0x97,
+ 0xbf,0xf2,0x15,0x4c,0x4e,0x4e,0xe1,0x3f,0xfd,0xca,0x2f,0xe3,0x9a,0xab,0xaf,0x4a,
+ 0x48,0xe5,0xcb,0x5f,0xf9,0xa,0x72,0x6e,0xe,0x1f,0xfd,0xd0,0x7,0xf1,0xf9,0xff,
+ 0xf6,0xe7,0x98,0x9c,0x9c,0xc2,0x5b,0x6e,0x7c,0x33,0x7e,0xf1,0xc6,0x37,0x3,0x0,
+ 0x7e,0xf0,0xc3,0x7,0x0,0x0,0xaf,0xb9,0x56,0x12,0xc6,0x3f,0xdf,0x7b,0x2f,0x6e,
+ 0x7c,0xcb,0x8d,0x99,0x6d,0xe8,0x27,0x90,0xfe,0xdb,0x91,0xaa,0x50,0x7,0xd9,0xc0,
+ 0x17,0x4c,0x20,0xfd,0x5f,0x14,0x7f,0x79,0x25,0x7,0xd4,0x86,0xcb,0x98,0x9a,0x6e,
+ 0x21,0x62,0x0,0xa5,0xb2,0x17,0xc4,0x34,0x80,0x20,0x8,0x65,0x1e,0x22,0x9f,0xc7,
+ 0xbe,0x7d,0xfb,0x30,0x31,0x31,0x81,0x6e,0xb7,0x8b,0xa5,0xa5,0x25,0x8c,0x8d,0x8d,
+ 0xc1,0x34,0x4d,0x70,0x2e,0x3d,0x14,0xce,0x39,0x72,0xb9,0x1c,0x8,0xa5,0x10,0x2,
+ 0xb0,0x6c,0x17,0xf3,0xf3,0x8b,0x18,0x19,0x19,0xc1,0xf4,0xf4,0x74,0xf2,0x63,0x3c,
+ 0xcf,0x83,0x6d,0xdb,0x68,0xb7,0xdb,0xa8,0x56,0x65,0xa8,0xab,0xd9,0x6c,0xa2,0x52,
+ 0xa9,0xa0,0xd5,0x6a,0x61,0x78,0x78,0x18,0x9e,0xe7,0x25,0xe4,0x50,0x72,0x28,0xea,
+ 0x7e,0x4,0x2,0x80,0x9,0x1,0x21,0xe4,0xe,0x1a,0xd4,0xb8,0xa3,0xc9,0x43,0x43,
+ 0xe3,0xa5,0xf5,0x3e,0x26,0x27,0xa7,0xf0,0xd0,0x23,0x8f,0x20,0x97,0xcb,0x61,0x71,
+ 0x71,0x11,0xbf,0x76,0xfb,0x7b,0x12,0x2f,0x60,0xcb,0xd6,0xad,0x58,0xbd,0x7a,0x35,
+ 0x16,0x17,0x17,0x71,0xcd,0xd5,0x57,0x61,0xa8,0x56,0xc3,0xdd,0xdf,0x94,0x72,0xf2,
+ 0xd7,0xbf,0xee,0xb5,0xb8,0xec,0xd2,0x4b,0xb0,0xb8,0xb8,0x98,0x3c,0x37,0x31,0xb1,
+ 0x3a,0xb3,0x6a,0xdf,0xb8,0x71,0x3,0x5e,0x75,0xf5,0x55,0xa8,0xd5,0x6a,0xe8,0x76,
+ 0x3d,0x3c,0xf4,0xc8,0x23,0xf0,0x3c,0xf,0xae,0xeb,0x62,0x71,0x71,0x31,0xb1,0x2f,
+ 0xfd,0x9e,0xc6,0xcd,0x37,0xbd,0x1d,0xb9,0x9c,0x3b,0x80,0x58,0xae,0xc6,0xcc,0xef,
+ 0x7d,0x3,0x7c,0xa1,0x3,0xfb,0x37,0x3f,0x78,0xc4,0xdf,0x5a,0x1b,0x1a,0xc2,0xcd,
+ 0x37,0xdd,0x84,0x9f,0x3d,0xfe,0x44,0x42,0x48,0x77,0x7f,0x53,0xa,0x4e,0xee,0xda,
+ 0xbd,0x7,0x3f,0x7b,0xfc,0x9,0x4c,0x4e,0x4e,0x61,0xd3,0xc6,0x8d,0x9,0x79,0x0,
+ 0x40,0x2e,0xe7,0xe2,0x8e,0xf7,0xbd,0xf,0xff,0xa4,0xc4,0x29,0x73,0x6e,0x6e,0xd9,
+ 0x67,0xbf,0xea,0xea,0xab,0xb0,0xb0,0xb8,0x88,0x4d,0x1b,0x37,0xe2,0xd5,0xaf,0x79,
+ 0xd,0x3e,0xf8,0xe1,0xe5,0xb2,0xf3,0xb1,0xad,0xeb,0x27,0x8e,0xb8,0xc7,0x2d,0x6e,
+ 0x79,0xe8,0xf7,0x42,0x6,0x1d,0x23,0x7a,0xac,0xd0,0xd4,0x89,0xc0,0xa0,0x80,0x6b,
+ 0x1b,0xc8,0x97,0x72,0x38,0xb8,0x10,0x42,0xea,0x14,0x2a,0xb1,0x42,0xb,0x98,0x9a,
+ 0x9a,0xc2,0xf8,0xf8,0x78,0xd2,0x9c,0x52,0x2c,0x16,0x31,0x3b,0x3b,0x8b,0x42,0xa1,
+ 0x80,0x7c,0x3e,0x8f,0xa5,0xa5,0x25,0x54,0xab,0x55,0x4,0x41,0x0,0xd7,0x75,0x93,
+ 0xc7,0x73,0x73,0x73,0x18,0x19,0x19,0x41,0xa7,0xd3,0x41,0x3e,0x9f,0x97,0xe1,0x27,
+ 0x95,0x18,0x5f,0x5c,0x5c,0x44,0xb9,0x5c,0x46,0x14,0x45,0x89,0x57,0xd3,0xe9,0x74,
+ 0x90,0xcb,0xe5,0x12,0xaf,0x83,0x10,0x82,0x30,0xc,0x51,0xcd,0xd9,0xb8,0x64,0x28,
+ 0x87,0x21,0xd7,0x40,0xc8,0x38,0x38,0x17,0x99,0x12,0xdf,0x7e,0xd7,0xad,0xff,0xb9,
+ 0xa3,0xdd,0x34,0x34,0x34,0x4e,0x3e,0xfe,0xfb,0xdf,0x7f,0xd,0x37,0xdf,0x74,0x13,
+ 0x6e,0xbe,0xe9,0xed,0xc9,0x73,0x77,0x7f,0xf3,0x1e,0x6c,0xd9,0xba,0x15,0xff,0xf1,
+ 0x97,0x7f,0x19,0xbf,0x78,0xe3,0x9b,0x71,0xf3,0x4d,0x37,0xe1,0x3b,0xf7,0x7d,0x17,
+ 0xbb,0x76,0xef,0xc1,0xc6,0x8d,0x1b,0xd0,0xf5,0xba,0x49,0x28,0xa8,0x56,0xab,0xa1,
+ 0x56,0xab,0xa2,0x56,0xab,0x26,0x9f,0xb1,0x71,0xe3,0x6,0xdc,0xf1,0xfe,0xf7,0x62,
+ 0x71,0x71,0x11,0x5f,0xfa,0xab,0xbf,0x4e,0x56,0xf6,0x43,0xb5,0x1a,0x6e,0xbe,0xe9,
+ 0xed,0xf8,0xc5,0x1b,0xdf,0x8c,0x6b,0xae,0xbe,0xa,0x8b,0x8b,0x75,0x5c,0x7d,0xd5,
+ 0x55,0xd8,0xb5,0x7b,0x37,0xee,0x78,0xff,0x7b,0x71,0xc7,0xfb,0xdf,0x8b,0xb7,0xdc,
+ 0xf8,0xa6,0x23,0x6e,0x6b,0x2e,0xe7,0xc2,0xf9,0xf6,0x16,0xd8,0x6f,0x79,0xe3,0x31,
+ 0x7f,0xd7,0xa5,0x6a,0xfb,0x0,0x24,0x64,0x25,0x49,0xc1,0x4d,0x88,0xe5,0xd2,0x4b,
+ 0x2e,0x1e,0xf8,0x1d,0x31,0x89,0xe,0x42,0x4c,0x1e,0x47,0xc3,0x91,0xf4,0xad,0x18,
+ 0x63,0xcb,0x6c,0xe1,0x9,0x87,0xb0,0xfa,0x6b,0x82,0x4f,0x4,0xb6,0x9,0x14,0x8b,
+ 0x2e,0xc0,0x81,0xc5,0x26,0x3,0x25,0x4,0x4,0x40,0xa5,0x60,0x21,0x8c,0x7c,0x34,
+ 0x1a,0x2d,0x8c,0x8f,0x8f,0x27,0x3,0x53,0xa2,0x28,0x42,0x14,0x45,0x28,0x14,0xa,
+ 0x88,0xa2,0x8,0xcd,0x66,0x13,0xab,0x56,0xad,0xc2,0xdc,0xdc,0x1c,0xc6,0xc6,0xc6,
+ 0x30,0x3b,0x3b,0x8b,0xd5,0xab,0x57,0xe3,0xc0,0x81,0x3,0x19,0x49,0x66,0x4a,0x69,
+ 0xe2,0x65,0x2c,0x2d,0x2d,0xfd,0xff,0xed,0x9d,0x79,0x94,0x14,0xf5,0xd9,0xef,0x3f,
+ 0x55,0xd5,0xeb,0x4c,0xcf,0xc,0x3d,0x2c,0xc3,0xc,0x3,0xe,0x33,0x20,0xcc,0x0,
+ 0x2e,0x20,0xa0,0xc2,0x44,0x13,0xcd,0xaa,0xf1,0x5e,0xc5,0xbc,0xde,0x80,0xb,0xc9,
+ 0x89,0xef,0x9b,0x9c,0x1b,0x91,0x9b,0x78,0xe5,0x8d,0x4b,0xde,0xeb,0xbd,0x89,0x51,
+ 0xaf,0x37,0xe7,0x10,0x78,0x13,0xcd,0x89,0x87,0x70,0x95,0xdc,0x68,0x54,0x7c,0xa3,
+ 0x59,0xc,0x90,0xa0,0xc8,0xe0,0x10,0x40,0x5,0x99,0x1,0x99,0x85,0x65,0x16,0x66,
+ 0x60,0xb6,0x9e,0xde,0x6b,0xbb,0x7f,0xc,0x55,0x54,0x77,0x57,0xf7,0xcc,0xb0,0x88,
+ 0xc1,0xfa,0x9e,0xd3,0xa7,0xbb,0xab,0xab,0xab,0xea,0x57,0xcb,0xf3,0xfd,0x3d,0x3b,
+ 0x45,0x45,0x45,0x26,0x73,0x5a,0x33,0xc5,0xad,0xc5,0x10,0x93,0xc9,0x24,0xf3,0x4a,
+ 0x8b,0xf1,0xe9,0x9,0xa6,0x14,0xe8,0xc,0x26,0x34,0x62,0x8a,0x9a,0xa2,0xb6,0x9d,
+ 0x8d,0xa6,0x91,0x7e,0xbe,0xfe,0x51,0xb5,0x96,0xf3,0x45,0x86,0x8e,0x16,0xe7,0xe0,
+ 0x4c,0xd0,0xd7,0xd7,0xc7,0xfe,0x86,0x6,0xae,0x9a,0x37,0x97,0x5b,0x6e,0xbe,0x89,
+ 0xe6,0x96,0x16,0x76,0xed,0xde,0xc3,0x43,0xab,0xfe,0xbb,0xa9,0x5,0xf8,0xfd,0x3e,
+ 0x3e,0x7f,0xc3,0xd,0xac,0x7f,0xfe,0x5,0x6a,0x17,0x2f,0xca,0x98,0x99,0x67,0x73,
+ 0x3e,0x5f,0x35,0x6f,0x2e,0xbb,0x76,0xef,0x61,0xd7,0xee,0xdd,0xe6,0x77,0x3,0x55,
+ 0x95,0x95,0x74,0xd4,0x74,0x66,0x68,0x1a,0x86,0x70,0x6e,0xb6,0xd4,0xaa,0x32,0xcc,
+ 0x46,0x2d,0x2d,0xad,0xdc,0x74,0xe4,0x24,0x9e,0xb9,0xd5,0xc3,0x8e,0xcb,0xef,0xf3,
+ 0xe1,0xf7,0xf9,0xf8,0xcb,0xe6,0x2d,0x26,0x61,0xd4,0x2e,0x5e,0x44,0xd9,0x29,0x1f,
+ 0x87,0xa1,0x31,0x8d,0x4,0x2d,0x2d,0xad,0xfc,0x65,0xf3,0x16,0xe2,0xf1,0xf8,0x90,
+ 0xe6,0xf2,0xcf,0xc3,0x13,0x48,0xba,0xe6,0x61,0xd6,0x15,0x4,0x5b,0x12,0x19,0x71,
+ 0x22,0xe1,0x99,0x8,0x90,0xd3,0x2,0x18,0xfc,0x79,0x5e,0x34,0x5d,0x27,0x9a,0x84,
+ 0x42,0x8f,0x44,0x38,0xa9,0x52,0x56,0xec,0xe3,0xfd,0xa6,0x41,0x4,0x41,0x40,0x55,
+ 0x55,0xe2,0xf1,0x38,0x7e,0xbf,0x9f,0xe3,0xc7,0x8f,0x33,0x61,0xc2,0x4,0x64,0x59,
+ 0x26,0x12,0x89,0x10,0xc,0x6,0x91,0x24,0xc9,0xd4,0x40,0xc,0x42,0x30,0x88,0x40,
+ 0x92,0x24,0xc2,0xe1,0x30,0x85,0x85,0x85,0x44,0xa3,0x51,0x8a,0x8b,0x8b,0x9,0x85,
+ 0x42,0x66,0xc5,0x60,0x45,0x51,0xcc,0x42,0x87,0x86,0xf6,0x91,0x48,0x24,0x86,0x8a,
+ 0x20,0xea,0x2a,0xd3,0xe7,0x4c,0xe6,0x86,0x1b,0x67,0xd0,0x75,0xac,0x93,0xf7,0xf6,
+ 0x76,0xf0,0xe7,0xfa,0xa3,0x9c,0xec,0xb,0xa3,0xaa,0xa7,0x4f,0x92,0x55,0xd0,0xe5,
+ 0x72,0x2c,0xd,0x27,0x10,0x47,0xba,0xde,0xc5,0x4e,0x1c,0x76,0xdb,0x77,0xc8,0xc4,
+ 0xc1,0x48,0xef,0xbd,0xda,0xc5,0x8b,0x78,0xf1,0x77,0x2f,0xd3,0xdc,0xd2,0xc2,0x2d,
+ 0x37,0xdf,0x4c,0x73,0xcb,0x9e,0x53,0x5a,0x45,0x2a,0x29,0x18,0x1a,0x47,0x36,0xc7,
+ 0x72,0x3a,0x62,0xb1,0x38,0xbb,0x76,0xef,0xa1,0xaa,0xb2,0x92,0xfd,0xd,0x8d,0xb6,
+ 0xb3,0xf6,0xda,0xc5,0x8b,0x4c,0xa2,0x38,0xfd,0xde,0x6a,0xfa,0x1b,0x4e,0x93,0xca,
+ 0x54,0x62,0xb1,0x38,0x9d,0x9d,0x9d,0xa3,0x1a,0xb7,0xef,0x14,0x39,0x19,0x1a,0x88,
+ 0xcf,0xe7,0xcb,0xba,0x6e,0x73,0x4b,0xb,0xcd,0x2d,0xad,0xe6,0xf7,0x62,0xcb,0xf8,
+ 0x83,0xc1,0x31,0x54,0x55,0x4e,0x4d,0xf9,0x3d,0x17,0xc,0x1f,0x88,0x75,0xf2,0x6c,
+ 0x67,0x79,0x19,0xc9,0xf5,0x39,0x67,0x4e,0x74,0xe1,0x94,0xb6,0xe1,0xf5,0x7a,0xd0,
+ 0x35,0xd,0x8f,0x24,0xe2,0x12,0x5,0xdc,0x92,0x40,0x51,0x81,0x8b,0xa4,0x32,0x74,
+ 0x10,0x3d,0x3d,0x3d,0x8c,0x1d,0x3b,0x16,0x59,0x3e,0xed,0xf,0xe9,0xec,0xec,0x64,
+ 0xec,0xd8,0xb1,0xb8,0xdd,0x6e,0x7e,0xf5,0xab,0x5f,0x71,0xc9,0x25,0x97,0x9c,0xbe,
+ 0x88,0xb5,0xb5,0xb8,0xdd,0x6e,0xf2,0xf2,0xf2,0xf8,0xce,0x77,0xbe,0x43,0x6d,0x6d,
+ 0x2d,0x97,0x5c,0x72,0x9,0xc1,0x60,0xd0,0x2c,0xea,0x18,0x8f,0xc7,0xe9,0xed,0xed,
+ 0xa5,0xb9,0xb9,0x99,0xba,0xba,0x3a,0x36,0x6e,0xdc,0x88,0x2c,0xcb,0xb8,0xdd,0x6e,
+ 0x93,0xac,0x26,0xa,0x9,0xaa,0xab,0xc7,0xd1,0xdf,0xdb,0x4d,0xc9,0x25,0x73,0xb8,
+ 0xa7,0xf6,0x2e,0x56,0x3e,0x56,0x81,0xd7,0x3f,0x6,0x97,0xdb,0x6b,0xee,0x2f,0x91,
+ 0x88,0xd3,0xdf,0x3f,0x40,0x67,0x67,0x27,0x7b,0xf6,0xec,0x61,0xdb,0xb6,0x6d,0xbc,
+ 0xff,0xfe,0xfb,0x67,0xac,0x71,0x7c,0xd2,0xcb,0x9d,0x8c,0x84,0x38,0xce,0x74,0x52,
+ 0x71,0xb1,0x90,0xab,0x83,0xb,0x77,0x3f,0xde,0x72,0xf3,0x4d,0xf8,0x7c,0x3e,0xde,
+ 0xd9,0xbe,0xfd,0x94,0x26,0x32,0xcf,0xd6,0xff,0x30,0x1a,0xb4,0xb4,0xb4,0xd2,0xd9,
+ 0xd9,0xc9,0x87,0xfb,0x1b,0xf8,0x6f,0x2b,0xee,0xe3,0xf7,0x6f,0xfc,0x81,0x58,0x2c,
+ 0x96,0xf3,0x3f,0x86,0x70,0xb6,0x9a,0x9b,0xd2,0xb5,0x92,0xd9,0xb3,0x6a,0xe8,0x7c,
+ 0xec,0x3,0x92,0x7b,0x1a,0xf1,0xcc,0x9f,0x99,0x9b,0xc0,0xe2,0x71,0xfa,0xfa,0xfa,
+ 0xb9,0xe3,0x6b,0xb7,0x3,0xb0,0x69,0xf3,0x16,0x36,0x6d,0xde,0xc2,0xec,0x15,0xf7,
+ 0x59,0xb4,0xaf,0xfe,0x94,0x7d,0x6c,0xda,0xfc,0x57,0x9a,0x5b,0x5a,0xf0,0xfb,0x7d,
+ 0xfc,0xe0,0xc1,0x7,0x4d,0xcd,0x25,0x18,0xc,0x52,0x55,0x59,0x49,0x55,0x65,0x65,
+ 0x8a,0x66,0x34,0x9c,0x6,0x62,0x4c,0xcc,0xd3,0x27,0x77,0xa3,0x31,0x63,0x9d,0xd3,
+ 0x28,0x2c,0x45,0x13,0x10,0x45,0xd0,0xd1,0xc9,0xf7,0x49,0x20,0x80,0x47,0x12,0x8,
+ 0x78,0x4f,0x97,0x3f,0xf,0x87,0xc3,0x4c,0x9e,0x3c,0x99,0xbe,0xbe,0x3e,0x82,0xc1,
+ 0xa0,0x59,0xa3,0xdf,0xe5,0x72,0xa5,0xd4,0x99,0x37,0x10,0x89,0x44,0xf8,0xfa,0xd7,
+ 0xbf,0xce,0xca,0x95,0x2b,0xcd,0xe,0x63,0x19,0x4c,0xee,0xf3,0x51,0x56,0x56,0x46,
+ 0x59,0x59,0x19,0xb5,0xb5,0xb5,0xdc,0x77,0xdf,0x7d,0xac,0x59,0xb3,0x86,0x8d,0x1b,
+ 0x37,0x12,0x89,0x44,0x70,0x4b,0x22,0x57,0x4c,0x2e,0x62,0x5a,0xf5,0x3c,0xa6,0xce,
+ 0xbe,0x19,0x5f,0x5e,0x51,0xd6,0x31,0x78,0xbd,0x3e,0x4a,0x4a,0x7c,0x94,0x94,0x94,
+ 0x70,0xc5,0x15,0x57,0xf0,0xcd,0x6f,0x7e,0x93,0xbd,0x7b,0xf7,0xf2,0xc4,0x13,0x4f,
+ 0x70,0xe8,0xd0,0x21,0x34,0x4d,0xcb,0x28,0xe5,0x6e,0x77,0x11,0x3e,0xc9,0x2,0x53,
+ 0x10,0x4,0x2e,0xbf,0xfc,0x72,0x16,0x2c,0x58,0xc0,0xf4,0xe9,0xd3,0x29,0x29,0x29,
+ 0x19,0xa,0x15,0xf4,0xfb,0xcd,0xe2,0x91,0x76,0x37,0xdd,0x90,0x43,0x31,0x46,0x77,
+ 0x77,0x37,0xc7,0x8e,0x1d,0xe3,0xe0,0xc1,0x83,0xec,0xd8,0xb1,0x83,0x23,0x47,0x8e,
+ 0xc,0x9b,0xc9,0x9a,0x2b,0x61,0xc9,0x21,0x12,0x7,0xb9,0x4c,0x58,0x5f,0xb8,0xf1,
+ 0x6,0x66,0xd7,0xd4,0x98,0x91,0x49,0x1d,0x1d,0x9d,0xc4,0x62,0xf1,0x14,0x22,0xf9,
+ 0x70,0x7f,0x83,0x39,0x1b,0xb7,0xa,0x5e,0x3b,0x54,0x56,0x4e,0xe5,0xb,0x37,0xde,
+ 0xc0,0x33,0xbf,0xfc,0x15,0x2f,0xbe,0xfc,0x32,0x65,0xa5,0xa5,0xb6,0xb3,0x77,0x2b,
+ 0x59,0xa4,0x6b,0x1d,0xd9,0x90,0xbf,0x7c,0x11,0xc9,0x4d,0x5b,0xe1,0x5f,0x6e,0xcd,
+ 0xb9,0xde,0xfe,0xfd,0xa7,0xfb,0xa4,0xd4,0x2e,0x5a,0xc4,0x3b,0xdb,0xb7,0x9b,0x8e,
+ 0x7c,0xc3,0xb4,0xd6,0xdc,0xd2,0x92,0x62,0x56,0xab,0xac,0x9c,0x4a,0x73,0x4b,0xb,
+ 0x65,0xa5,0x65,0x59,0x49,0xb4,0xaa,0xb2,0x92,0xbf,0x6c,0xde,0x92,0xf3,0x78,0xd,
+ 0x19,0x66,0x58,0x69,0xec,0xac,0x49,0x23,0xf5,0x81,0x88,0xe7,0xf2,0x62,0x1b,0xc5,
+ 0x9,0x35,0x55,0xa7,0x20,0xcf,0x85,0x8,0x48,0xa2,0x80,0x20,0x89,0x69,0xa6,0x2e,
+ 0xc1,0x8c,0x76,0x8,0x85,0x42,0x14,0x16,0x16,0xa2,0x69,0x1a,0x7d,0x7d,0x7d,0x19,
+ 0x3,0xba,0xed,0xb6,0xdb,0x78,0xf4,0xd1,0x47,0xb3,0x92,0x87,0x1d,0xf2,0xf2,0xf2,
+ 0x58,0xb5,0x6a,0x15,0xf,0x3e,0xf8,0x20,0x9a,0xa6,0x91,0x27,0xe9,0xfc,0xe7,0x7b,
+ 0xbf,0x45,0xf5,0x82,0x65,0x39,0xc9,0x23,0x1b,0x2e,0xbb,0xec,0x32,0x9e,0x7b,0xee,
+ 0x39,0x16,0x2d,0x5a,0x34,0x22,0x67,0xfa,0x27,0x39,0x9b,0xbd,0xba,0xba,0x9a,0xf5,
+ 0xeb,0xd7,0xb3,0x76,0xed,0x5a,0xee,0xbe,0xfb,0x6e,0xae,0xb9,0xe6,0x1a,0x2a,0x2b,
+ 0x2b,0x9,0x6,0x83,0xf8,0x7c,0x3e,0x5b,0xf2,0x80,0xa1,0x4a,0xcd,0x81,0x40,0x80,
+ 0xf1,0xe3,0xc7,0x33,0x6b,0xd6,0x2c,0xbe,0xf4,0xa5,0x2f,0x71,0xff,0xfd,0xf7,0xf3,
+ 0xdb,0xdf,0xfe,0x96,0x67,0x9e,0x79,0x86,0x39,0x73,0xe6,0xe4,0xc,0x2e,0x70,0xb2,
+ 0xfc,0x1d,0x9c,0x9,0xc,0xff,0x42,0x59,0x59,0x29,0x65,0xa5,0x65,0x5c,0x35,0x6f,
+ 0x2e,0x65,0x65,0xa5,0x6c,0xda,0xb2,0x25,0x65,0xbd,0x77,0xb6,0xd7,0x51,0xbb,0x78,
+ 0x11,0xb5,0x8b,0x86,0xcc,0x4e,0x86,0xf0,0x8f,0xc5,0xe2,0xec,0x6f,0x68,0x30,0xfb,
+ 0xa9,0x5b,0x71,0xc7,0xd7,0x96,0x98,0xeb,0xf5,0xf5,0xf5,0xb1,0xed,0x9d,0xed,0x29,
+ 0xe4,0x31,0xa4,0x99,0xc4,0x6d,0x4d,0x5f,0x56,0x92,0xb2,0xae,0x13,0xb8,0xef,0xb,
+ 0x88,0xc5,0x79,0x24,0x9f,0x5b,0x93,0x9d,0x14,0x7b,0x7b,0x87,0xf2,0x48,0xe2,0x43,
+ 0x5a,0x8f,0xe1,0xc3,0x81,0xa1,0xe8,0xb2,0x59,0x35,0x35,0xf8,0xfd,0xbe,0x53,0xfe,
+ 0x99,0x3d,0xe6,0xff,0xd2,0xc7,0x60,0xfc,0xbf,0xc5,0x42,0x7e,0xbf,0x7f,0xe3,0xf,
+ 0xb6,0x63,0x4d,0x37,0x61,0x19,0xe,0xf3,0xf4,0x57,0xb6,0x67,0x37,0xeb,0x64,0x94,
+ 0x73,0xd0,0xf,0xc4,0xf8,0x2c,0xa,0x1a,0xdf,0xfc,0x72,0x31,0x3e,0xbf,0x87,0xa6,
+ 0xc3,0x31,0xb6,0xee,0xe8,0x44,0x3,0x16,0xce,0x1b,0xcf,0x8b,0x6f,0x36,0xa7,0x8,
+ 0xf8,0x40,0x20,0x80,0xd7,0xeb,0xa5,0xa7,0xa7,0x87,0x9,0x13,0x26,0x30,0x38,0x38,
+ 0x88,0xc7,0xe3,0xe1,0xc5,0x17,0x5f,0x64,0xca,0x94,0x29,0x29,0x6c,0x69,0x25,0x15,
+ 0x45,0x51,0x68,0x6d,0x6d,0xa5,0xbf,0xbf,0x9f,0x50,0x28,0x44,0x5e,0x5e,0x1e,0x45,
+ 0x45,0x45,0x4c,0x9d,0x3a,0xd5,0xec,0xb3,0x6c,0xc5,0x8f,0xfe,0xd7,0xff,0x24,0xda,
+ 0xdb,0xc5,0x8f,0x7f,0xba,0x6,0x41,0x48,0x25,0x27,0x39,0x99,0xa0,0xbb,0xa3,0x85,
+ 0x68,0xb8,0x9f,0x64,0x32,0x8e,0xcb,0xed,0x45,0x16,0x2,0x54,0x55,0x4d,0xb7,0xdd,
+ 0x56,0x34,0x1a,0x65,0xe9,0xd2,0xa5,0xb4,0xb7,0xb7,0xa7,0xcc,0x9a,0x8d,0xe3,0xb3,
+ 0xb,0xfb,0xb5,0x9b,0x5d,0x5f,0xa8,0x19,0xf7,0xf4,0xe9,0xd3,0xf9,0xf9,0xcf,0x7f,
+ 0x6e,0x3b,0xb6,0xb3,0xd6,0x3e,0x15,0x85,0x27,0x9e,0x78,0x82,0x37,0xde,0x78,0x23,
+ 0xeb,0x58,0x3f,0xa9,0xe7,0xc5,0xc1,0x27,0xc7,0x6c,0xa5,0xeb,0x3a,0x3d,0x5d,0xdd,
+ 0x66,0x2d,0xac,0xc7,0x9f,0xfc,0xdf,0xa6,0x7f,0xc3,0x8,0xe3,0x35,0x92,0xec,0xe2,
+ 0xf1,0x38,0xa5,0xa5,0xa5,0xec,0x6f,0x68,0x60,0x56,0x4d,0x8d,0x39,0xeb,0xfe,0xfd,
+ 0x1b,0x7f,0x60,0xd7,0xee,0xdd,0xe6,0x4c,0xbd,0xb4,0xb4,0x94,0xce,0xce,0x4e,0x66,
+ 0xd5,0xd4,0xb0,0xff,0x54,0x87,0xc4,0x7f,0xba,0xfd,0xf6,0x14,0x21,0x5d,0x59,0x39,
+ 0xd5,0xfc,0xcd,0xef,0xf3,0x13,0xc,0x8e,0xe1,0xb,0x37,0xde,0xc0,0xb6,0xed,0x75,
+ 0x74,0x74,0x74,0x52,0x59,0x39,0xd5,0x3c,0x6,0x23,0xa4,0xd8,0x20,0xe,0x63,0x5d,
+ 0xc3,0x2f,0xa3,0x47,0x22,0x28,0xbf,0x7c,0x1c,0x77,0x39,0x19,0x89,0x84,0xb1,0x81,
+ 0xe3,0xfc,0xfe,0xcd,0xb7,0xe9,0xeb,0xf,0x99,0xc4,0x68,0x44,0x87,0xad,0x7f,0xfe,
+ 0x5,0x53,0xb3,0x9a,0x37,0x77,0x2e,0xfb,0x1b,0x1a,0x52,0x12,0x9,0x9b,0x5b,0x5a,
+ 0x8,0x6,0x83,0xd4,0x2e,0xba,0x96,0xbe,0xfe,0xfe,0xac,0xfe,0x9e,0xab,0xe6,0xcd,
+ 0x4d,0xd1,0x5c,0xac,0x98,0x51,0x35,0x8d,0xde,0xd0,0x40,0x8a,0x3,0xdd,0xda,0x71,
+ 0x56,0x92,0x24,0x33,0x32,0xd5,0x28,0xcb,0x6f,0xbc,0xac,0x8d,0xa5,0x4e,0xb7,0xeb,
+ 0x18,0x45,0x3f,0x10,0xeb,0x6f,0xd9,0x8,0x64,0xf9,0x17,0x8b,0xf0,0xfb,0xbc,0xf4,
+ 0xe,0xe8,0xfc,0xc7,0x5f,0x8e,0x20,0x49,0x22,0x97,0x4e,0x2f,0xe0,0xf5,0x6d,0xc7,
+ 0x4c,0x21,0x21,0x8a,0x22,0xa5,0xa5,0xa5,0x84,0x42,0x21,0xf2,0xf3,0xf3,0x71,0xb9,
+ 0x5c,0x66,0xc8,0xee,0xb,0x2f,0xbc,0x90,0x42,0x20,0x6,0x7a,0x7a,0x7a,0x58,0xbd,
+ 0x7a,0x35,0x75,0x75,0x75,0x74,0x74,0x74,0x50,0x58,0x58,0x48,0x28,0x14,0xa2,0xa0,
+ 0xa0,0xc0,0xd4,0x62,0x16,0x2c,0x58,0xc0,0xf7,0xbf,0xff,0x7d,0x2a,0x2a,0x2a,0x4e,
+ 0x9b,0xc0,0xc2,0x61,0x12,0xd1,0x10,0xc5,0x13,0xca,0xcc,0x65,0x27,0x3b,0x5b,0xd8,
+ 0xfa,0xfa,0xb3,0x7c,0xf8,0xf7,0x6d,0x84,0x63,0x11,0x73,0xf9,0x7b,0x87,0xc2,0x34,
+ 0x1e,0x8b,0xe1,0xf5,0x7a,0xa9,0xad,0xad,0x65,0xe5,0xca,0x95,0xcc,0x9d,0x9b,0x7a,
+ 0x21,0xb6,0x6f,0xdf,0xce,0x8a,0x15,0x2b,0x32,0x1a,0x4b,0xe5,0x6a,0xbd,0xfb,0x49,
+ 0x69,0x85,0xfb,0xdc,0x73,0xcf,0x31,0x63,0xc6,0xc,0x5b,0x62,0xec,0xea,0xea,0xa2,
+ 0xb7,0xb7,0x97,0x44,0x22,0x81,0xa2,0x28,0x19,0xb3,0xe,0x23,0x98,0xc1,0xef,0xf7,
+ 0x13,0x8,0x4,0x98,0x38,0x71,0x22,0x85,0x85,0x85,0x29,0xeb,0x24,0x93,0x49,0xee,
+ 0xbc,0xf3,0x4e,0xe,0x1f,0x3e,0x9c,0x93,0x4c,0x73,0xe5,0xd7,0x38,0x24,0xe2,0x10,
+ 0x88,0x95,0x40,0xfe,0xa1,0x71,0xec,0x3d,0xe8,0x6e,0x0,0xbf,0x1f,0xca,0xe6,0x80,
+ 0xa0,0x9d,0x51,0x29,0x93,0x73,0x89,0x19,0x55,0xd3,0x38,0xd9,0xdf,0x97,0x12,0x7d,
+ 0x65,0x6d,0x55,0x6e,0x10,0x88,0x41,0x22,0x56,0x2,0xb1,0x36,0x98,0x32,0xae,0xd9,
+ 0xa8,0xfa,0x81,0xc,0xf7,0x70,0xb,0x2,0xe8,0xaa,0x8e,0xa6,0xe9,0x14,0x8f,0xf1,
+ 0x0,0x43,0x4e,0xf4,0x58,0x42,0x4e,0x31,0x5f,0x19,0x8e,0x1a,0x55,0x55,0x71,0xbb,
+ 0xdd,0x26,0x91,0x18,0x7,0x9d,0x8e,0xc3,0x87,0xf,0xf3,0xed,0x6f,0x7f,0x9b,0x23,
+ 0x47,0x8e,0x50,0x54,0x54,0x64,0xe,0x4c,0xd7,0x75,0x62,0xb1,0x18,0x6e,0xb7,0x9b,
+ 0x70,0x38,0xcc,0x5b,0x6f,0xbd,0xc5,0xdb,0x6f,0xbf,0xcd,0xba,0x75,0xeb,0x4c,0xc1,
+ 0x9f,0x1f,0x8,0x90,0x1f,0x8,0x98,0xdb,0x6a,0x39,0xb0,0x93,0x17,0x9f,0x7d,0x90,
+ 0x48,0x28,0x42,0x38,0x9a,0x30,0x97,0xb7,0x9f,0x88,0xb3,0xaf,0x75,0xd0,0xc,0xf9,
+ 0xdd,0xba,0x75,0x2b,0xdb,0xb7,0x6f,0xe7,0xf1,0xc7,0x1f,0xe7,0x8e,0x3b,0xee,0x30,
+ 0xd7,0xbb,0xf6,0xda,0x6b,0x29,0x2f,0x2f,0xa7,0xad,0xad,0xcd,0x3c,0x47,0xe2,0xa9,
+ 0x32,0x2a,0xd9,0xfa,0xa6,0xa7,0x3b,0xd2,0x2f,0x84,0x63,0x7d,0xe6,0xcc,0x99,0x19,
+ 0xe4,0xf1,0xee,0xbb,0xef,0xf2,0xec,0xb3,0xcf,0x72,0xf0,0xe0,0x41,0xf3,0xbc,0xe7,
+ 0x32,0xc5,0xa5,0x7f,0x9f,0x3d,0x7b,0x36,0x8f,0x3c,0xf2,0x8,0xd3,0xa6,0x4d,0x3,
+ 0x86,0x9a,0x9,0x2d,0x59,0xb2,0x84,0xa7,0x9f,0x7e,0xda,0x1c,0x63,0xb6,0xb1,0x66,
+ 0xfb,0xcd,0xe9,0xb1,0xe2,0xe0,0xa2,0xc1,0xe4,0x2b,0x87,0x5e,0x1f,0x23,0x7e,0xf0,
+ 0xe0,0x2a,0x6e,0x5d,0x72,0x5b,0x4a,0xe9,0x92,0x6c,0xb2,0xdd,0x4a,0x14,0xe9,0x35,
+ 0xb0,0x46,0xf2,0xfc,0xc3,0x39,0xf6,0x81,0x78,0x5d,0x98,0xc9,0x79,0x1e,0xaf,0x88,
+ 0xdf,0x3b,0xc4,0x6c,0x49,0x35,0x73,0x6,0x6a,0x68,0xd,0x86,0x2d,0x4e,0x92,0x24,
+ 0xdb,0x48,0x8,0x5d,0xd7,0x79,0xe0,0x81,0x7,0xe8,0xe9,0xe9,0x31,0xed,0x80,0x2e,
+ 0x97,0x8b,0x58,0x2c,0x86,0xc7,0xe3,0x21,0x1e,0x8f,0x23,0x49,0x92,0xe9,0x80,0x8f,
+ 0xc7,0xe3,0xac,0x5c,0xb9,0x92,0x48,0x24,0x92,0xb1,0xad,0x44,0x3c,0xc2,0xcb,0xbf,
+ 0xfa,0x21,0xe1,0x50,0x84,0xc1,0x70,0x1c,0x45,0xd1,0x50,0x14,0x8d,0x70,0x54,0xa6,
+ 0x6e,0x7f,0x7f,0x8a,0xfd,0xcf,0x20,0xb8,0x47,0x1f,0x7d,0x94,0xc6,0xc6,0xc6,0x14,
+ 0xc1,0xf7,0xb9,0xcf,0x7d,0x2e,0xc5,0x66,0x38,0x5c,0x22,0xe2,0x48,0x2f,0xc6,0xf9,
+ 0x9c,0xe1,0x5d,0x75,0xd5,0x55,0x29,0xcb,0x9a,0x9b,0x9b,0x79,0xe0,0x81,0x7,0x38,
+ 0x70,0xe0,0x80,0xed,0x38,0xac,0xcb,0x8c,0x73,0x91,0x6e,0x2f,0xdd,0xbb,0x77,0x2f,
+ 0x2b,0x57,0xae,0x4c,0x21,0xfd,0xb9,0x73,0xe7,0x66,0x6c,0x2f,0x3d,0xab,0x75,0x38,
+ 0x7f,0x91,0xe3,0x13,0x71,0xe0,0x60,0xf4,0xd8,0xbc,0x69,0x13,0xaf,0xbe,0xf2,0xca,
+ 0x88,0xe4,0x41,0x2e,0x5f,0xc7,0x68,0x92,0xa3,0xcf,0x69,0x26,0x7a,0x5c,0x6,0x59,
+ 0x55,0x50,0x35,0x15,0x45,0x56,0x18,0x5b,0xe4,0x43,0xd7,0x34,0x10,0xc4,0x8c,0xb4,
+ 0x79,0x23,0x73,0x3c,0x12,0x89,0x10,0x8,0x4,0xd0,0x34,0xd,0x59,0x96,0x33,0xf6,
+ 0xbb,0x6d,0xdb,0x36,0x8e,0x1c,0x39,0x42,0x34,0x1a,0xc5,0xeb,0xf5,0x12,0x8f,0xc7,
+ 0x11,0x45,0xd1,0x2c,0xd,0x6f,0x94,0x21,0xb1,0xa,0xb8,0x93,0x27,0x4f,0xf2,0xda,
+ 0xc6,0x57,0x33,0x8e,0x6f,0xef,0xdf,0x37,0xd1,0xdb,0xdb,0x43,0x28,0x92,0x20,0x9e,
+ 0x54,0x91,0x15,0xd,0x59,0xd1,0xd8,0x73,0x28,0x44,0x42,0xd6,0x32,0x84,0x9a,0xae,
+ 0xeb,0x28,0x8a,0xc2,0xba,0x75,0xeb,0x52,0xb6,0x33,0x67,0xce,0x9c,0xc,0xc7,0x93,
+ 0x9d,0xf0,0x1d,0xed,0xc5,0x38,0x9f,0xa8,0xaa,0xaa,0x4a,0xf9,0xfe,0xf2,0xcb,0x2f,
+ 0x9b,0xa4,0x9b,0x4e,0x9c,0xa3,0x79,0xb5,0xb5,0xb5,0xf1,0xa7,0x3f,0xfd,0x89,0xba,
+ 0xba,0x3a,0xea,0xea,0xea,0x68,0x6a,0x6a,0xca,0x4a,0x1e,0xa3,0x21,0x11,0x7,0xe,
+ 0x3e,0xd,0x68,0x6f,0x6b,0xa3,0xbd,0xad,0xcd,0xfc,0xbe,0xb3,0xbe,0x7e,0xd8,0xff,
+ 0xec,0xac,0xaf,0x27,0x14,0xa,0x65,0x2c,0xfb,0xc1,0x83,0xab,0x46,0x3c,0xa1,0x1c,
+ 0x6d,0x35,0x8d,0x51,0x77,0x24,0x3c,0x93,0x87,0x5a,0x55,0x41,0x91,0xb5,0x21,0x33,
+ 0x96,0xaa,0x32,0x7e,0x8c,0x97,0x93,0xbd,0x51,0xfc,0x1e,0x7b,0x13,0x86,0x35,0x1e,
+ 0x39,0x1c,0xe,0x93,0x97,0x97,0x97,0xb1,0xde,0xdb,0x6f,0xbf,0x6d,0xa,0x72,0xaf,
+ 0xd7,0x8b,0xaa,0xaa,0x88,0xa2,0x68,0x9a,0xb1,0x8c,0xd9,0xb1,0xb5,0x9e,0x95,0x2c,
+ 0xcb,0xbc,0x57,0xb7,0x8d,0x65,0x77,0xde,0x95,0xb2,0xad,0x3,0xfb,0xea,0x89,0x46,
+ 0x93,0x44,0xa3,0x32,0xfa,0x29,0xd7,0x4f,0x47,0x4f,0x9c,0xc3,0xc7,0x63,0xb6,0x85,
+ 0xc4,0x8c,0x65,0xdb,0xb6,0x6d,0x4b,0xd9,0xce,0xb4,0x69,0xd3,0x52,0xd4,0x3e,0xc0,
+ 0xcc,0x15,0x79,0xee,0xb9,0xe7,0x78,0xe6,0x99,0x67,0x32,0xb2,0xe2,0xed,0xcc,0x33,
+ 0xdf,0xfa,0xd6,0xb7,0x58,0xbe,0x7c,0x39,0x0,0x8b,0x17,0x2f,0x4e,0xd9,0x87,0xdf,
+ 0xef,0x67,0xd9,0xb2,0x65,0xd4,0xd6,0xd6,0x32,0x69,0xd2,0xa4,0x9c,0x49,0x46,0xaa,
+ 0xaa,0x12,0xa,0x85,0x38,0x70,0xe0,0x0,0xaf,0xbd,0xf6,0x1a,0xdb,0xb7,0x6f,0xcf,
+ 0xb8,0x8e,0x13,0x27,0x4e,0x4c,0xf9,0xcf,0xbe,0x7d,0xfb,0x6c,0x6f,0xa2,0x74,0x53,
+ 0xd6,0x70,0xd1,0x18,0x82,0x20,0xf0,0xd0,0x43,0xf,0x65,0x2c,0x1b,0x2e,0xbb,0x3f,
+ 0xbd,0x8a,0xb3,0x63,0xba,0x72,0xf0,0x69,0xc2,0xe7,0xae,0xbb,0xde,0x24,0x8e,0xef,
+ 0xae,0x18,0xaa,0x57,0xf5,0x7f,0x7f,0xfd,0x6b,0x93,0x18,0xee,0xf9,0xc6,0x37,0x78,
+ 0xe8,0x91,0x87,0xcd,0xf5,0x43,0xa1,0x10,0x3f,0xf9,0xd1,0x8f,0xa9,0xaf,0xaf,0x67,
+ 0xd2,0xa4,0x49,0x1c,0x68,0x6c,0x64,0x66,0x75,0x35,0xf,0x3d,0xf2,0x8,0x8d,0x8d,
+ 0xd,0x29,0xe4,0x71,0xd7,0xd2,0x65,0xe6,0xe7,0xef,0xae,0x58,0x61,0x5b,0xf,0xeb,
+ 0x5c,0xc9,0xfd,0x73,0x6a,0xc2,0xd2,0x1,0x59,0xd6,0x51,0x35,0xd,0x55,0xd5,0x18,
+ 0x5b,0xec,0x5,0x4,0x34,0xd9,0x3e,0x47,0x22,0x1c,0xe,0xe3,0xf3,0xf9,0xcc,0xcc,
+ 0x48,0x43,0xa3,0x48,0x37,0xb5,0x18,0x9a,0x89,0x41,0x10,0xc9,0x64,0xd2,0x2c,0xd3,
+ 0x2e,0x49,0x92,0xf9,0x2e,0xcb,0x32,0x92,0x24,0xe1,0x45,0xa3,0xb1,0xb1,0x21,0x93,
+ 0xed,0x8f,0x34,0x11,0x89,0x26,0x51,0x54,0x15,0x45,0xd5,0x88,0x27,0x55,0x3e,0x68,
+ 0x1a,0xcc,0x2a,0x18,0x8d,0xe5,0x3d,0x3d,0x3d,0x29,0x8c,0x5f,0x58,0x58,0x98,0x21,
+ 0x6c,0xad,0x17,0xc0,0x4e,0x8,0x8f,0x66,0xb6,0x2d,0x8a,0x22,0xab,0x57,0xaf,0x66,
+ 0xf9,0xf2,0xe5,0x54,0x55,0x55,0xe5,0x24,0xf,0x18,0xea,0xa3,0x1c,0xc,0x6,0xb9,
+ 0xe6,0x9a,0x6b,0x78,0xf2,0xc9,0x27,0x4d,0x52,0xb2,0x22,0xdd,0xe1,0xdd,0xd5,0xd5,
+ 0x65,0xab,0x79,0x18,0x44,0x3c,0x9c,0xe6,0x61,0xa7,0xb1,0xa4,0x6f,0xef,0x6c,0x6a,
+ 0x88,0x39,0x5a,0x89,0x83,0x8b,0x19,0x7f,0x7d,0x6b,0x2b,0xb7,0x2d,0x59,0x62,0x12,
+ 0xc7,0x81,0xc6,0x46,0x5e,0x7b,0xfd,0xf7,0x3c,0xff,0x9b,0xd,0x54,0xd7,0x54,0xb3,
+ 0x7e,0xdd,0x3a,0xd3,0x1c,0x15,0xa,0x85,0xb8,0x7b,0xd9,0x32,0xda,0xda,0xda,0xf8,
+ 0xeb,0x5b,0x5b,0x79,0xfe,0x37,0x1b,0xd8,0xf2,0xd6,0x56,0x6,0x7,0x87,0x96,0x2f,
+ 0x5c,0xb8,0x90,0x83,0xcd,0x4d,0xa6,0xdf,0xe3,0xf9,0xdf,0x6c,0xe0,0x60,0x73,0x13,
+ 0x7,0x9b,0x9b,0xce,0x2b,0x79,0xe4,0xd4,0x40,0x46,0xb2,0x3,0xbb,0xd2,0xbf,0xb1,
+ 0xb8,0x46,0xc1,0xa9,0x42,0x85,0xe3,0xc6,0x7a,0x10,0x5,0xd0,0x14,0x35,0x67,0x89,
+ 0x90,0x44,0x22,0x61,0x56,0xe0,0x4d,0xdf,0x5e,0x47,0x47,0x7,0xf1,0x78,0x1c,0xaf,
+ 0xd7,0x4b,0x34,0x1a,0xc5,0xed,0x76,0x93,0x48,0x24,0x4c,0xff,0x87,0xd7,0xeb,0x35,
+ 0x89,0xc3,0x10,0xdc,0x6e,0x41,0xc7,0x43,0x8c,0x44,0x3c,0x8a,0xd7,0x77,0x5a,0xab,
+ 0xe9,0xec,0x68,0x27,0x21,0x2b,0xa7,0xf6,0xb,0x87,0xda,0xa2,0xc4,0x12,0xea,0xb0,
+ 0xd1,0x54,0xc6,0x45,0x34,0x84,0x70,0x20,0x10,0xc8,0x69,0xa2,0x4a,0x5f,0x96,0x3e,
+ 0xdb,0x1e,0xe,0x8b,0x17,0x2f,0xa6,0xa6,0x66,0x28,0x74,0x31,0x12,0x89,0xf0,0xe6,
+ 0x9b,0x6f,0x72,0xe2,0xc4,0x89,0xec,0x6a,0xa4,0xcb,0x45,0x55,0x55,0x15,0xb5,0xb5,
+ 0xb5,0xb8,0x5c,0x2e,0x96,0x2f,0x5f,0xce,0x1f,0xff,0xf8,0x47,0xba,0xba,0xba,0xcc,
+ 0x75,0x2,0x96,0x40,0x2,0x80,0x1f,0xfe,0xf0,0x87,0x19,0x4,0x38,0x52,0x92,0x7b,
+ 0xea,0xa9,0xa7,0x38,0x76,0xec,0x58,0x56,0x7,0xf8,0x48,0xc6,0x79,0xa1,0x83,0xa,
+ 0x1c,0x38,0xb8,0xd0,0x28,0x9b,0x34,0x9,0x80,0x5,0xb,0x17,0xf2,0xef,0xcf,0xfc,
+ 0x2,0x80,0x49,0xe5,0xe5,0x7c,0x77,0xc5,0xa,0xfe,0xeb,0xb7,0xbf,0xc3,0x96,0x4d,
+ 0x9b,0xb9,0x6d,0xc9,0x12,0xd6,0xaf,0xfb,0x35,0x8d,0xd,0x8d,0x3c,0xff,0x9b,0xd,
+ 0x29,0x13,0x42,0x63,0xbd,0xf5,0xbf,0x5e,0x9f,0xa2,0xad,0x8c,0x54,0x8e,0x9f,0xb,
+ 0x13,0xf2,0xa8,0x8,0x64,0x24,0xf,0x79,0x6f,0x58,0x63,0x5c,0x50,0x45,0x53,0x55,
+ 0xa,0xc7,0xf8,0x70,0x49,0x22,0xba,0x9a,0xfd,0x7f,0x86,0x10,0x13,0x45,0xd1,0xf4,
+ 0x6f,0x58,0x11,0xa,0x85,0x32,0x6,0x9a,0xcd,0xae,0x3e,0xa4,0x52,0x69,0x14,0x79,
+ 0x44,0x66,0xce,0x18,0x43,0x3c,0x16,0x49,0x21,0x90,0xc1,0x50,0xc8,0x2c,0xdf,0x7e,
+ 0x32,0x24,0xd3,0xdc,0x11,0xb5,0x25,0x36,0x23,0xbc,0xcd,0x5a,0x87,0x4b,0x96,0xe5,
+ 0x14,0x81,0x9d,0x8d,0x54,0xad,0x33,0x70,0x63,0x2c,0xa3,0xcd,0xb8,0x9e,0x39,0xf3,
+ 0x74,0x19,0x84,0xc7,0x1e,0x7b,0x8c,0xba,0xba,0xba,0x11,0xfd,0xef,0xe6,0x9b,0x6f,
+ 0xe6,0x5f,0xff,0xf5,0x5f,0x71,0xb9,0x5c,0x5c,0x79,0xe5,0x95,0xfc,0xf9,0xcf,0x7f,
+ 0x36,0x7f,0xb3,0x16,0xa3,0x84,0xa1,0x12,0x31,0x67,0x8a,0x5f,0xfc,0xe2,0x17,0x39,
+ 0xb5,0x36,0xbb,0x89,0x85,0x1d,0x99,0x9e,0x29,0xc1,0x3a,0x70,0xf0,0xf,0x83,0x83,
+ 0x9b,0xa0,0x65,0x7,0xfa,0xa0,0x82,0x36,0xed,0x26,0xa4,0xb9,0x99,0xd1,0x51,0x33,
+ 0xab,0xab,0x6d,0xad,0x5,0x86,0xd5,0x63,0xe3,0xab,0x43,0xfe,0xdc,0x35,0xab,0x7f,
+ 0x96,0xb2,0xde,0xe0,0xe0,0xd0,0xef,0x8d,0xd,0xd,0x17,0x6c,0x78,0x67,0xa5,0x81,
+ 0xd8,0xa1,0x6b,0x40,0xa3,0xaa,0x4c,0x43,0xd5,0x34,0xe4,0xa4,0xcc,0xc4,0x71,0x79,
+ 0x24,0x55,0x25,0x43,0x58,0x18,0xc2,0x3a,0x91,0x48,0x98,0x85,0x13,0xed,0x42,0x78,
+ 0x43,0xa1,0x10,0x1e,0x8f,0x87,0x44,0x22,0x81,0x28,0x8a,0xa6,0xb9,0xcb,0x78,0x37,
+ 0xfc,0x28,0xc6,0xbb,0x1b,0x9d,0x92,0xd2,0x31,0x78,0xbd,0x1a,0xc9,0x44,0x6a,0x54,
+ 0x57,0x32,0x99,0x40,0xd7,0x21,0x12,0x1f,0x32,0x5d,0x69,0x9a,0x9e,0xb5,0x26,0x7e,
+ 0xfa,0xe7,0xc0,0xde,0x85,0xbb,0x0,0x0,0x10,0x8f,0x49,0x44,0x41,0x54,0x5c,0x59,
+ 0xd4,0xc3,0xcd,0xc4,0x47,0x1b,0xc6,0x6b,0x25,0xa8,0x13,0x27,0x4e,0x8c,0xf8,0xfa,
+ 0x6c,0xdd,0xba,0xd5,0xf4,0x23,0x35,0x37,0x37,0x67,0x98,0xb9,0xce,0x99,0xa9,0x32,
+ 0x8d,0xd0,0x47,0xe3,0xcf,0x70,0x48,0xc2,0xc1,0xa7,0x6,0x3b,0x7e,0x9,0xe1,0x7d,
+ 0x10,0x1c,0x8b,0xd0,0xff,0x11,0xda,0xb,0x7f,0x27,0xd9,0x72,0x3f,0xfe,0xdb,0xbf,
+ 0x34,0xaa,0xcd,0x18,0xbe,0x92,0x7f,0x7f,0xe6,0x17,0x19,0xa6,0xe8,0xb,0x8d,0x51,
+ 0x45,0x61,0x8d,0xe4,0xc1,0x3f,0x11,0x1a,0xf2,0x7f,0xa8,0xaa,0x86,0x2c,0xab,0x94,
+ 0x8e,0xf3,0x83,0x2a,0x50,0x14,0xf0,0xe6,0xd4,0x6c,0x92,0xc9,0xa4,0x6d,0x19,0xd,
+ 0xc3,0x69,0x6e,0x44,0x6d,0x19,0xe6,0x2a,0x59,0x96,0xcd,0xfa,0x59,0x46,0x18,0xaf,
+ 0xc7,0x25,0xe1,0x41,0x63,0xfa,0x8c,0x20,0xf1,0x48,0xc,0x5d,0x4f,0x25,0x24,0x1,
+ 0x1,0x55,0xd3,0xd8,0xfd,0x51,0xc8,0x2c,0xee,0x68,0xec,0x3f,0x5d,0xeb,0x30,0x92,
+ 0x6b,0x8c,0x97,0x9d,0xf9,0xce,0x6e,0x36,0x9d,0xcd,0xe7,0x31,0x9a,0xfa,0x32,0xc7,
+ 0x8e,0x1d,0x33,0x3f,0x3f,0xf4,0xd0,0x43,0x5c,0x7d,0xf5,0xd5,0xe4,0xe7,0xe7,0xa7,
+ 0xac,0xe3,0x76,0xbb,0x29,0x2c,0x2c,0xa4,0xa8,0xa8,0xc8,0x4c,0xec,0xc,0x87,0xc3,
+ 0xbc,0xf4,0xd2,0x4b,0xbc,0xf4,0xd2,0x4b,0x34,0x35,0x9d,0xdf,0x44,0xac,0x91,0x96,
+ 0x3a,0x70,0xe0,0xe0,0x53,0x89,0xbe,0x2e,0x68,0xfc,0x23,0x4c,0x99,0x7,0xd5,0x4b,
+ 0xa1,0xa4,0x14,0xa9,0x48,0x25,0xfa,0xec,0xab,0x67,0xbc,0xc9,0x3,0x96,0x74,0x82,
+ 0xb,0x81,0x11,0x75,0x24,0x3c,0x9b,0x7e,0x20,0x0,0xe1,0xb8,0x40,0x3c,0xa9,0xe1,
+ 0xf6,0xc,0x99,0xb1,0x26,0x94,0x7a,0xd9,0x7b,0xa0,0x87,0xf1,0x41,0x3f,0x3,0xe1,
+ 0x84,0xad,0xd0,0x31,0x4c,0x52,0x76,0x82,0xda,0xe3,0xf1,0x98,0xb3,0x56,0x63,0xbd,
+ 0xf4,0x82,0x5f,0xc6,0x31,0x17,0x78,0x24,0x66,0x94,0x17,0xe1,0x16,0x65,0x64,0x3d,
+ 0x53,0x9b,0x11,0x44,0x68,0x38,0x12,0x25,0x12,0x3f,0x6d,0x36,0xb3,0x23,0xf,0xab,
+ 0xe9,0xca,0xfa,0x79,0x34,0xe6,0x1a,0xeb,0xb1,0x8d,0x76,0xd6,0xbd,0x75,0xeb,0x56,
+ 0xee,0xbd,0xf7,0x5e,0x8a,0x8b,0x8b,0x99,0x3e,0x7d,0x3a,0x4f,0x3f,0xfd,0x34,0x80,
+ 0x99,0x25,0x6e,0x54,0x6,0x48,0xb9,0x5f,0xfb,0xfa,0xf8,0xe0,0x83,0xf,0xd8,0xb8,
+ 0x71,0x23,0xbb,0x77,0xef,0xce,0x38,0x26,0xab,0x9,0xe,0x86,0x12,0x22,0x13,0x89,
+ 0x44,0x4e,0x7,0x79,0xb6,0x7b,0x63,0x38,0x93,0x53,0xae,0xb1,0x3a,0xda,0x87,0x83,
+ 0x4f,0x3,0xf4,0x93,0xdd,0x8,0xa1,0x38,0x74,0xee,0x83,0x48,0x37,0xf4,0x9c,0x40,
+ 0xb,0x8b,0x28,0x6d,0x31,0xe2,0x5b,0xf,0xe0,0xbb,0x7e,0xe6,0x88,0xb7,0x55,0x5d,
+ 0x53,0x4d,0x63,0x43,0x23,0x9b,0x37,0x6d,0xce,0x99,0x20,0x78,0xde,0xc7,0x34,0x92,
+ 0x44,0xc2,0xb3,0xa9,0x90,0x2a,0x8,0x2,0x3a,0x70,0x62,0x40,0x1d,0xd2,0x40,0x14,
+ 0x95,0xc2,0x22,0x17,0x6e,0x97,0x88,0x96,0x54,0xb3,0xfe,0x4f,0x96,0x65,0x93,0x28,
+ 0xec,0x60,0x74,0x1f,0x34,0xb4,0xd,0xab,0xe0,0x32,0xde,0x3d,0x92,0x80,0x4b,0x14,
+ 0x98,0x59,0x1d,0x24,0x19,0x8b,0x63,0x77,0xf4,0xc7,0x7b,0x93,0x74,0xf4,0x24,0x33,
+ 0x84,0x61,0xba,0xd9,0xca,0xd0,0x3e,0x8c,0xde,0x22,0xc3,0x69,0x20,0xb9,0x2a,0xd1,
+ 0x9e,0x49,0x22,0xe1,0xe0,0xe0,0x20,0xdf,0xfb,0xde,0xf7,0x32,0xcc,0x50,0x5e,0xaf,
+ 0x97,0xfc,0xfc,0xfc,0xc,0xf2,0x80,0xa1,0x92,0xce,0xd7,0x5f,0x7f,0x3d,0xab,0x57,
+ 0xaf,0xe6,0xae,0xbb,0xee,0xca,0xd8,0x57,0x7a,0x92,0xa6,0xd1,0xb1,0x71,0x34,0x1d,
+ 0x17,0x87,0xf3,0x6b,0xd8,0xf9,0x93,0xd2,0x5f,0xe,0x1c,0x7c,0x1a,0xa0,0x49,0x85,
+ 0x24,0xe,0x78,0x60,0xd7,0x3e,0xa8,0xfb,0x1b,0xda,0xbe,0x6e,0x22,0x1f,0x15,0x21,
+ 0xb7,0x49,0xb8,0x2a,0xc6,0x99,0xcf,0xf9,0x48,0x60,0x84,0xf9,0x6e,0x7c,0xe5,0x15,
+ 0x1a,0x1b,0x52,0xb5,0x90,0x50,0x28,0xc4,0xe3,0x3f,0xfa,0x31,0x70,0xda,0x77,0x62,
+ 0xf5,0x89,0x58,0x73,0x4c,0xce,0x7,0xce,0xb9,0x6,0x2,0xd0,0xd5,0xaf,0x51,0x3e,
+ 0x56,0x43,0x75,0xab,0x24,0xe2,0x49,0xca,0x4b,0xf3,0xe9,0x6d,0xee,0xcf,0x98,0xad,
+ 0xa7,0x6b,0x13,0x8a,0xa2,0xd8,0xb2,0x9e,0x91,0xa9,0xae,0x28,0xa,0x6e,0xb7,0xdb,
+ 0x34,0x77,0x99,0x84,0xa2,0xaa,0x4,0xbc,0x6e,0x66,0x4c,0x2d,0x44,0x55,0x86,0xc8,
+ 0x43,0xb2,0x11,0x56,0xfb,0x5a,0x22,0x19,0xc2,0xcd,0x4a,0x16,0xc6,0xcb,0x4e,0x13,
+ 0xc9,0x55,0x9e,0x7c,0x38,0xd,0xe4,0x4c,0x98,0xbd,0xa9,0xa9,0x89,0x7b,0xee,0xb9,
+ 0x87,0x69,0xd3,0xa6,0x71,0xe9,0xa5,0x97,0x32,0x76,0xec,0x58,0xd3,0x54,0x95,0x4c,
+ 0x26,0xcd,0x9a,0x34,0x92,0x24,0x31,0x66,0xcc,0x18,0x66,0xcd,0x9a,0xc5,0xfc,0xf9,
+ 0xf3,0x11,0x4,0x81,0x7b,0xef,0xbd,0x97,0x2d,0x5b,0xb6,0xd0,0xde,0xde,0x6e,0x6e,
+ 0x6f,0x60,0x60,0x80,0xd2,0xd2,0xd3,0x1d,0xce,0x26,0x4d,0x9a,0x64,0x56,0x22,0xcd,
+ 0x65,0x76,0x4b,0xd7,0xb6,0xb2,0x69,0x1e,0xd9,0x22,0xd9,0x72,0x91,0xcd,0x27,0xa5,
+ 0x46,0x98,0x3,0x7,0xe7,0x1a,0x52,0xe5,0x25,0xf4,0xf7,0x5d,0x46,0xec,0xaf,0xcd,
+ 0x88,0x5e,0x8d,0xe4,0x9,0x17,0x89,0xfd,0x6e,0x3c,0x57,0x55,0xe3,0xaa,0x18,0xc7,
+ 0xce,0xfa,0x7a,0x36,0x6f,0xda,0x64,0x9a,0xa6,0x76,0xd6,0xd7,0xb3,0x60,0xe1,0x42,
+ 0x1a,0x1b,0x1a,0xd9,0xf8,0xca,0xab,0xe6,0xf2,0xcd,0x9b,0x36,0xb1,0x60,0xe1,0x42,
+ 0xee,0xf9,0xc6,0x37,0x58,0xbf,0x6e,0x1d,0x77,0x2f,0x5b,0xc6,0xdd,0xcb,0x97,0xb3,
+ 0xf0,0xea,0x85,0xb4,0xb5,0xb5,0xb1,0xf6,0x67,0x6b,0xcc,0x8,0xac,0x1b,0x3e,0x7f,
+ 0x23,0x9b,0x37,0x6d,0x62,0xed,0xcf,0xd6,0x10,0xa,0xd,0xd2,0x71,0xea,0xf9,0xff,
+ 0xc9,0x53,0x4f,0x7e,0x7c,0x26,0xac,0xb3,0xb5,0x67,0xb,0x82,0x40,0xd7,0x80,0x86,
+ 0xa2,0x6a,0xb8,0x64,0xd,0x45,0x96,0x29,0x2f,0xf5,0xd3,0x7a,0x34,0x84,0x5b,0x12,
+ 0x91,0x55,0x2d,0x6b,0x98,0xab,0x1d,0xc,0xdf,0x47,0x7a,0xc8,0xa9,0x21,0xd4,0x5c,
+ 0x92,0x84,0xa6,0xc8,0x4,0xb,0xfd,0xcc,0xb8,0xb4,0x80,0x68,0x28,0x8c,0x0,0x68,
+ 0x9a,0x6a,0x29,0x13,0x79,0x4a,0xd3,0x51,0xf5,0xc,0xd3,0x95,0x5d,0x51,0x31,0x2b,
+ 0x91,0x18,0xbf,0xf,0x47,0xb4,0xe1,0x70,0x98,0x40,0x20,0x60,0x5b,0x76,0x3e,0x9b,
+ 0x29,0xcb,0x98,0x31,0x84,0xc3,0xe1,0xac,0xe3,0x6f,0x6a,0x6a,0x1a,0xb1,0x3f,0xe3,
+ 0xcb,0x5f,0xfe,0x32,0xf,0x3f,0xfc,0x30,0xa2,0x28,0x72,0xf5,0xd5,0x57,0xf3,0x8a,
+ 0xa5,0xac,0x41,0x57,0x57,0x57,0x4a,0x74,0xd7,0x9c,0x39,0x73,0xf8,0xf0,0xc3,0xf,
+ 0xb3,0x92,0xc6,0x48,0xee,0x3,0x63,0x2c,0x6b,0xd7,0xae,0xa5,0xb4,0xb4,0xd4,0xc,
+ 0x8a,0xb8,0xf3,0xce,0x3b,0xb3,0x6a,0x21,0x76,0x9a,0x8a,0x3,0x7,0x17,0x23,0xa,
+ 0x7e,0xf0,0xcf,0xf4,0x3f,0xf0,0xff,0x48,0xfc,0xf5,0x0,0x7a,0x12,0x7c,0xd7,0xcd,
+ 0x64,0xdc,0xc6,0xa1,0x86,0x51,0xf5,0xef,0xd6,0x73,0xeb,0x6d,0xb7,0x99,0xeb,0xd6,
+ 0xbf,0x7b,0x8a,0x40,0x1a,0x1b,0x28,0x9b,0x34,0xc9,0xd4,0x3a,0x1a,0x1b,0x1a,0xa9,
+ 0xae,0xae,0xe6,0xa1,0x47,0x1e,0xe6,0xc6,0xcf,0xdf,0xc8,0xc6,0x57,0x5e,0x65,0x67,
+ 0x7d,0x3d,0x3b,0xeb,0xeb,0x29,0x2f,0x2f,0xe7,0xf9,0xd,0x2f,0x30,0xa9,0xbc,0x1c,
+ 0xc0,0xcc,0x2b,0x31,0xd6,0x59,0xb0,0x70,0xa1,0x6d,0x1e,0x48,0xae,0xe7,0x71,0xb4,
+ 0x13,0xdd,0x73,0xda,0x91,0xd0,0xd8,0x49,0x28,0x2e,0x10,0x4e,0xa8,0xb8,0xdd,0x12,
+ 0x8a,0xac,0x11,0x2c,0xc9,0xc3,0xe3,0x96,0x28,0xc9,0xf7,0xd2,0x16,0x8a,0x65,0xcc,
+ 0xd2,0xd,0x33,0x96,0x5d,0xa4,0x90,0x91,0xdf,0x61,0x74,0x18,0xb4,0x66,0xa2,0xf,
+ 0x75,0x41,0xd4,0xf1,0x4a,0xb0,0xf0,0xb2,0x20,0x89,0x68,0x14,0x34,0x0,0xd,0x45,
+ 0x51,0xcd,0x6c,0x73,0x3b,0xb3,0x53,0xba,0xc3,0xdc,0xaa,0x79,0xa4,0x6b,0x28,0x59,
+ 0xcd,0x75,0x16,0x42,0x38,0x7a,0xf4,0x28,0x35,0x35,0x35,0x5c,0x73,0xcd,0x35,0x39,
+ 0x23,0xae,0x8c,0xf1,0x4a,0x92,0xc4,0xfc,0xf9,0xf3,0x1,0x68,0x4b,0x53,0x33,0x67,
+ 0xcc,0x98,0xc1,0xe5,0x97,0x5f,0xe,0xc0,0xef,0x7e,0xf7,0xbb,0x11,0x93,0xfa,0x96,
+ 0x2d,0x5b,0x78,0xf8,0xe1,0xa1,0xd9,0x48,0x51,0x51,0x6a,0xdf,0x93,0xd6,0xd6,0x56,
+ 0xae,0xbb,0xee,0x3a,0xf3,0xfb,0xad,0xb7,0xde,0xca,0x4b,0x2f,0xbd,0x94,0xd2,0xc4,
+ 0x2b,0x9b,0xa3,0x3f,0x97,0xf6,0x31,0x7e,0xfc,0x78,0x16,0x2f,0x5e,0x6c,0x9a,0xd5,
+ 0x8e,0x1f,0x3f,0x9e,0x95,0x34,0x86,0xd3,0x4a,0x1c,0x38,0xb8,0x98,0xe0,0xb9,0x62,
+ 0xa,0x13,0x36,0xdb,0x97,0x17,0xc9,0x96,0xe0,0x67,0x90,0x80,0x1d,0x16,0x2c,0x5c,
+ 0x38,0xac,0xf,0xe4,0xb6,0x25,0x4b,0x72,0x6e,0x63,0xb4,0x1a,0xc6,0x70,0x38,0xeb,
+ 0x4c,0x74,0xfb,0x4e,0x73,0x70,0xbc,0x77,0xa8,0xc4,0x88,0xac,0x2a,0xc8,0xf1,0x38,
+ 0x93,0x26,0xe6,0x33,0x31,0xdf,0x8d,0x4b,0xcc,0xec,0x31,0x9e,0xcb,0xd4,0xe3,0x72,
+ 0xb9,0x32,0x1c,0xee,0x46,0x38,0xaf,0xc7,0xed,0x42,0xd0,0x75,0x66,0x56,0x8c,0x23,
+ 0x3f,0x0,0x8a,0xac,0x22,0x8,0x3a,0x9a,0x32,0xa4,0x1,0x9,0x59,0x98,0x37,0x57,
+ 0xb4,0x55,0xfa,0xf7,0x6c,0x82,0x2f,0x5d,0x48,0x1a,0xe5,0x4e,0x2a,0x2a,0x2a,0x58,
+ 0xb5,0x6a,0x95,0xad,0xd6,0x62,0x9e,0x74,0x51,0xe4,0xfe,0xfb,0xef,0x67,0xf2,0xe4,
+ 0xc9,0x0,0xec,0xd8,0xb1,0x23,0xe5,0xf7,0xea,0xea,0x6a,0x56,0xac,0x58,0xc1,0x8a,
+ 0x15,0x2b,0xb8,0xf2,0xca,0x91,0x57,0xf3,0xb4,0x6a,0x18,0xe9,0xf6,0xd5,0x5d,0xbb,
+ 0x76,0xa5,0x7c,0x9f,0x36,0x6d,0x1a,0x3f,0xfd,0xe9,0x4f,0x53,0xfe,0x33,0x92,0x19,
+ 0x87,0xf5,0x5c,0x54,0x57,0x57,0xb3,0x76,0xed,0xda,0x14,0x9f,0x4c,0xba,0xdf,0xc6,
+ 0x4e,0xe3,0x70,0xfc,0x21,0xe,0x1c,0x7c,0x32,0x31,0xda,0xe7,0xd2,0x75,0x3e,0xe,
+ 0x40,0x10,0x4,0xda,0x7a,0x54,0xa6,0x4e,0xd4,0x90,0x64,0x8d,0x64,0x42,0x61,0x72,
+ 0xb9,0x9f,0xb6,0x8e,0x30,0x93,0xa,0x7c,0x1c,0xd,0xc5,0x47,0x55,0xda,0xc2,0xea,
+ 0x3c,0xb7,0xa,0x36,0xaf,0x24,0x90,0x2f,0x9,0x5c,0x36,0xab,0x88,0x78,0x38,0xc,
+ 0x3a,0x68,0x82,0x8e,0x2c,0xab,0xa7,0xc8,0x43,0xc8,0x2a,0xf4,0xad,0x44,0x91,0xae,
+ 0x7d,0xa4,0x13,0x47,0xb6,0x48,0x2b,0xeb,0xf2,0xd,0x1b,0x36,0xf0,0xb5,0xaf,0x7d,
+ 0x8d,0xe2,0xe2,0x62,0x96,0x2e,0x5d,0x4a,0x6d,0x6d,0x2d,0xdb,0xb6,0x6d,0xa3,0xa7,
+ 0xa7,0x27,0x65,0xbf,0xc5,0xc5,0xc5,0x2c,0x5e,0xbc,0x98,0xf2,0x53,0x6a,0x67,0x5f,
+ 0x5f,0x1f,0x2f,0xbf,0xfc,0x72,0xca,0x76,0x3f,0xf8,0xe0,0x3,0xf3,0xf3,0x53,0x4f,
+ 0x3d,0x65,0xfa,0x33,0xec,0xf2,0x64,0xc,0x42,0x2a,0x2d,0x2d,0xe5,0x86,0x1b,0x4e,
+ 0xb7,0xb1,0x6c,0x48,0x4b,0x2e,0xda,0xb3,0x67,0xf,0x47,0x8f,0x1e,0x4d,0xe9,0xb5,
+ 0x52,0x5b,0x5b,0x4b,0x6d,0x6d,0x2d,0xe1,0x70,0x98,0x8e,0x8e,0xe,0x7a,0x7a,0x7a,
+ 0xcc,0x48,0xaf,0x74,0x6d,0x43,0x10,0x4,0x5c,0x2e,0x17,0x5e,0xaf,0x97,0x82,0x82,
+ 0x2,0xca,0xca,0xca,0xcc,0x6,0x3a,0xe9,0x5a,0x90,0x3,0x7,0x67,0x8b,0x19,0x55,
+ 0xd3,0x9c,0x93,0x70,0x1e,0x49,0x62,0xb4,0x1,0x2e,0x59,0x27,0xf8,0xe7,0x52,0x9d,
+ 0xb1,0xa2,0x27,0x2c,0x20,0x27,0x55,0x24,0x49,0x44,0x92,0x15,0xa,0xc6,0xf8,0xf0,
+ 0x7a,0x5d,0x94,0x1,0x27,0xa2,0x49,0xe2,0x6a,0x26,0x79,0x18,0xb5,0xae,0xb2,0x99,
+ 0x4f,0xc,0x22,0xd1,0x34,0xd,0xaf,0xcb,0x5,0x3a,0xcc,0xbb,0x6c,0x2,0x72,0x22,
+ 0x82,0xa6,0xa9,0x88,0xa2,0x80,0x9c,0x54,0x50,0x75,0xd,0x41,0x0,0x55,0xcb,0x34,
+ 0x61,0xa5,0x6b,0x1b,0xd9,0x32,0xcf,0xd3,0x93,0xb,0xb3,0x95,0x71,0x31,0x8e,0xad,
+ 0xbf,0xbf,0x9f,0xfb,0xee,0xbb,0x8f,0xd5,0xab,0x57,0x33,0x6e,0xdc,0x38,0x26,0x4f,
+ 0x9e,0xcc,0xd2,0xa5,0x4b,0x73,0x9f,0xa3,0x9e,0x1e,0x56,0xad,0x5a,0xc5,0xc0,0xc0,
+ 0x40,0xca,0xf9,0x6e,0x6d,0x6d,0xe5,0xf5,0xd7,0x5f,0xe7,0xab,0x5f,0xfd,0x2a,0x3e,
+ 0x9f,0x8f,0x9b,0x6e,0xba,0x69,0x54,0xe7,0x7e,0xe7,0xce,0x9d,0xec,0xdf,0xbf,0x3f,
+ 0xe3,0x3c,0xfe,0xe4,0x27,0x3f,0x61,0xcd,0x9a,0x35,0x19,0xf9,0x36,0x81,0x40,0x80,
+ 0x4b,0x2f,0xbd,0xf4,0xac,0x6f,0x4c,0xa3,0x98,0xe3,0x48,0xed,0xa9,0x8e,0x16,0xe2,
+ 0xc0,0xe,0xc5,0x13,0xc6,0x67,0xb4,0x12,0x30,0x5e,0x8a,0xa2,0x98,0xef,0xc6,0xe7,
+ 0xb3,0x69,0xc9,0xfa,0x69,0xd3,0x2a,0x72,0x11,0xc7,0x68,0x7d,0x22,0xc6,0x14,0xfd,
+ 0x8c,0x5b,0xda,0xda,0x5d,0x20,0xeb,0x85,0x9f,0x5b,0xa1,0x53,0x31,0xde,0x85,0xd7,
+ 0xe3,0xc2,0x9f,0xe7,0xa5,0xbb,0xb,0xe,0x1e,0xea,0x27,0x92,0x50,0xd8,0xdf,0x13,
+ 0x31,0x5,0xb6,0xcb,0xe5,0x4a,0x99,0xfd,0x1b,0x44,0xa2,0xeb,0xba,0x59,0x38,0x51,
+ 0xd7,0xf5,0x94,0x24,0xc2,0x42,0x9f,0x9b,0x8a,0x9,0x79,0xcc,0xbb,0xbc,0x88,0xe8,
+ 0x60,0x14,0x49,0x1c,0x6a,0x66,0x95,0x90,0x65,0x93,0x3c,0xfe,0xa3,0xae,0x87,0x68,
+ 0x3c,0xb5,0xd6,0x95,0x95,0x34,0x8c,0xcf,0x23,0xd5,0x46,0xac,0x1a,0x50,0xb6,0x5e,
+ 0x17,0x45,0x45,0x45,0xdc,0x71,0xc7,0x1d,0x7c,0xe6,0x33,0x9f,0x61,0xea,0xd4,0xa9,
+ 0x4,0x2,0x81,0x14,0xff,0x41,0x38,0x1c,0xe6,0xe8,0xd1,0xa3,0x6c,0xdf,0xbe,0x9d,
+ 0x57,0x5f,0x7d,0xd5,0x34,0x35,0xd9,0x45,0x24,0xdd,0x72,0xcb,0x2d,0x7c,0xe5,0x2b,
+ 0x5f,0x61,0xea,0xd4,0xa9,0xb6,0x95,0x8a,0xad,0x88,0xc7,0xe3,0xb4,0xb7,0xb7,0xf3,
+ 0xd6,0x5b,0x6f,0xb1,0x61,0xc3,0x86,0x94,0xbe,0xc8,0xd6,0x87,0x6a,0xde,0xbc,0x79,
+ 0x3c,0xfa,0xe8,0xa3,0x19,0xd5,0x79,0xcf,0x16,0x75,0x75,0x75,0x3c,0xfc,0xf0,0xc3,
+ 0x19,0x1a,0x97,0x5d,0x74,0xd6,0x48,0x9c,0xeb,0xe7,0x62,0x12,0xe3,0xe0,0x1f,0x3,
+ 0xd9,0x12,0x71,0xad,0xc4,0x90,0x4e,0x1e,0xc6,0x7b,0x7a,0xaf,0x1a,0x87,0x40,0x46,
+ 0x4e,0x20,0xe9,0x93,0xe9,0xe1,0x3a,0x12,0x8e,0xa8,0xa5,0xad,0x5d,0x2b,0xdb,0x6c,
+ 0x2d,0x6d,0xed,0x6e,0x2,0xeb,0x85,0x2f,0x1b,0xa3,0x31,0xbf,0x52,0xc2,0xe5,0x16,
+ 0xf1,0xfb,0x3c,0x4,0xa,0x2,0x6c,0xf9,0x5b,0x37,0x6e,0x1d,0x1a,0x4e,0x86,0xe9,
+ 0x4f,0xaa,0x29,0x4e,0x6c,0x2b,0x81,0x18,0xe5,0x4a,0xac,0x21,0xbe,0xe6,0xac,0x5f,
+ 0x53,0x9,0x6,0xbc,0x7c,0xe9,0x33,0x25,0xc4,0xc3,0x11,0xd0,0x34,0x44,0x51,0x20,
+ 0x91,0x4c,0x82,0x3e,0xd4,0x19,0xf1,0x9d,0x7d,0x21,0xe,0x77,0xc5,0x52,0x4e,0x5a,
+ 0x36,0x9f,0xc7,0x70,0xc9,0x84,0xe9,0x4e,0xf0,0x5c,0x15,0x67,0xed,0x2e,0x52,0x3a,
+ 0x11,0xe5,0x62,0xff,0xf3,0xf5,0x50,0x2,0x29,0x89,0x98,0xd7,0x5e,0x7b,0x2d,0xf3,
+ 0xe7,0xcf,0xa7,0xb2,0xb2,0x92,0x92,0x92,0x12,0xc6,0x8c,0x19,0x43,0x5e,0x5e,0x9e,
+ 0x49,0xe6,0x76,0x30,0x5a,0x5a,0xe,0xe,0xe,0xd2,0xdb,0xdb,0x4b,0x7b,0x7b,0x3b,
+ 0x1f,0x7d,0xf4,0x11,0x75,0x75,0x75,0xec,0xdd,0xbb,0x77,0xd4,0xa4,0x31,0x9c,0x93,
+ 0xdd,0x21,0x10,0x87,0x40,0xac,0xfd,0x7e,0xd2,0xb5,0x10,0xeb,0x2b,0x57,0x7d,0x3c,
+ 0x87,0x40,0xb2,0x6b,0x20,0x67,0xdb,0x13,0x7d,0x54,0x61,0xbc,0x23,0x7d,0xa0,0x8d,
+ 0x83,0xeb,0x1a,0x10,0x48,0xaa,0x2a,0x82,0x0,0xb2,0xac,0x12,0x8f,0xc5,0x98,0x5e,
+ 0x59,0xc4,0xc1,0x43,0xfd,0x4c,0x2b,0xce,0xe3,0xc3,0x13,0x61,0xe2,0xaa,0x96,0x32,
+ 0x18,0x23,0xca,0xca,0x2e,0x2f,0x41,0x10,0x4,0x14,0x59,0xa6,0xc0,0xe7,0xe6,0xb3,
+ 0xf3,0x27,0xa0,0xc4,0x63,0x68,0xaa,0x8a,0x24,0xa,0x24,0x92,0x32,0x9a,0xa6,0x23,
+ 0x89,0x2,0xed,0x3d,0x32,0x47,0xba,0x4f,0x17,0x66,0xb4,0xfa,0x3d,0xd2,0xc3,0x73,
+ 0xed,0xea,0x5e,0xd,0x97,0x49,0x6d,0x57,0x3,0x2a,0xd7,0xc,0x3a,0x5b,0x25,0xe2,
+ 0xb,0x71,0x23,0x19,0x37,0xc7,0xdb,0x6f,0xbf,0xcd,0xd6,0xad,0x5b,0x47,0x34,0x83,
+ 0xb3,0x13,0xf2,0xd9,0x34,0x87,0xf4,0x30,0xeb,0xd1,0xdc,0xe0,0x8e,0x59,0xcb,0x41,
+ 0x36,0x33,0x71,0xba,0xd0,0x33,0xa2,0x30,0xad,0xcf,0xb8,0x5d,0xe7,0x4b,0x7,0x64,
+ 0x7d,0x8e,0xed,0x26,0xca,0x29,0x11,0xae,0x23,0x90,0x55,0xae,0x5c,0x3b,0x39,0xdb,
+ 0x83,0x55,0x54,0xe8,0xec,0xd3,0x99,0x3c,0x6e,0xc8,0xb1,0x2d,0x4a,0x32,0x53,0x2a,
+ 0xa,0x69,0x39,0x2a,0xa1,0x26,0x55,0x2e,0x1b,0x1f,0xa0,0xa9,0x2f,0x4a,0x5f,0x52,
+ 0xcb,0x10,0xb2,0xd6,0x6a,0xb6,0x46,0xef,0x74,0x4d,0x53,0x9,0x78,0x24,0xe6,0xd5,
+ 0x8c,0xc3,0xe7,0x51,0x89,0x46,0x14,0x4,0x38,0xd5,0x9a,0x56,0x45,0x92,0x4,0x7a,
+ 0x7,0x15,0xde,0x6d,0x18,0xc8,0xc8,0x34,0x1f,0x4e,0xc3,0xb0,0x92,0x8,0x60,0xeb,
+ 0x48,0xb7,0x13,0x72,0xe9,0x21,0xae,0xb9,0x84,0xeb,0x27,0x41,0x38,0xda,0xe5,0xa3,
+ 0x8c,0x94,0x38,0xed,0x26,0x1b,0x76,0x45,0x23,0x73,0x91,0xc8,0x68,0xce,0x81,0x43,
+ 0x28,0xe,0x72,0xcd,0x9c,0xb3,0xf9,0x25,0x9d,0x5e,0x33,0xe4,0xc,0x99,0xcf,0x66,
+ 0xc6,0xca,0x36,0x89,0xce,0xc5,0x9,0xc2,0x95,0x57,0x5e,0x69,0x6b,0xc2,0xca,0x65,
+ 0xca,0x1a,0xa9,0x9,0x4b,0x51,0x14,0x44,0x25,0x44,0xb9,0xf7,0x30,0x2e,0x51,0xc4,
+ 0xed,0x96,0xf0,0xfb,0x3d,0x40,0x3e,0xdb,0x76,0x1c,0xc7,0x2b,0x9,0xb8,0x5,0x81,
+ 0xa2,0x92,0x22,0xe4,0xc2,0x62,0xe,0x77,0x44,0x90,0xa4,0xd3,0x49,0x83,0xd6,0x22,
+ 0x8b,0xb2,0x2c,0xa3,0xf4,0x75,0x33,0x7b,0xf6,0x14,0x66,0xcd,0xf0,0x73,0xac,0xe9,
+ 0x30,0xc9,0xa4,0xc,0xe8,0x24,0x13,0xa,0x8,0xa0,0xea,0x2,0xef,0x1d,0x86,0x81,
+ 0xa8,0x9e,0xa2,0x9e,0x59,0xc7,0xe5,0x72,0xb9,0x4c,0x5b,0x9f,0xd5,0x7,0x62,0xd5,
+ 0x50,0xec,0x42,0x79,0xad,0xe3,0x4c,0xb7,0xcd,0xa6,0xb7,0xb1,0xb5,0x92,0x91,0x35,
+ 0x39,0xd1,0xba,0xcd,0x5c,0x44,0x73,0xbe,0xcc,0x2,0x76,0x36,0x65,0x3b,0xbb,0xb2,
+ 0xb5,0x29,0x56,0x36,0x92,0xc9,0x36,0x86,0xf4,0x75,0xb2,0x15,0xaa,0x4c,0xf7,0x3d,
+ 0x7d,0x5c,0xa6,0x3d,0x7,0x9f,0x6c,0x13,0x96,0xd5,0xb7,0x68,0x75,0xa0,0x2b,0x8a,
+ 0x82,0x2c,0xcb,0x29,0x2f,0x63,0x99,0xd5,0x94,0x65,0xd7,0xe8,0xcd,0x31,0x61,0xa5,
+ 0xca,0x18,0xab,0x6c,0x32,0x5e,0x86,0x6c,0x34,0x42,0xf2,0x8d,0x73,0x66,0x3d,0xb7,
+ 0xd6,0x73,0x6f,0x9c,0x63,0x97,0xd5,0x99,0x6a,0x6c,0xcc,0x2a,0x60,0xed,0x3e,0x67,
+ 0xcb,0x8b,0x30,0x76,0x6a,0x8,0x17,0x51,0x14,0x51,0xc4,0x0,0x11,0x35,0x8f,0x80,
+ 0x10,0x45,0x4f,0x82,0x20,0xc9,0x4c,0x9c,0x28,0xf2,0x85,0xc5,0x55,0x74,0x7d,0xd4,
+ 0x4d,0x40,0xd4,0x10,0xd5,0x24,0x85,0x45,0x1a,0x4b,0x6f,0xff,0x2a,0x3b,0x76,0x7d,
+ 0x44,0xfd,0x9e,0x66,0x5c,0x9e,0x7c,0xbc,0x5e,0x2f,0x1d,0x1d,0x1d,0x14,0x17,0x17,
+ 0xe3,0x92,0xa3,0x54,0x96,0x8a,0xdc,0xf4,0x2f,0xf7,0xa2,0x28,0x71,0x6a,0xae,0xec,
+ 0x65,0xb0,0xaf,0x9d,0xe6,0xc6,0x5d,0xb4,0x1d,0x3e,0x4e,0x28,0x2c,0xf3,0xfe,0x31,
+ 0x88,0xc4,0x49,0x11,0x4e,0xe9,0x24,0x68,0x1d,0x87,0x5d,0xd1,0xc4,0x6c,0x5,0x15,
+ 0x73,0xcd,0x5e,0xd2,0xdb,0xdb,0x66,0x63,0xf7,0x8f,0x53,0x50,0x66,0x9b,0xfd,0x1b,
+ 0x33,0x37,0x2b,0xc1,0xea,0xba,0x9e,0xf2,0x9e,0x3e,0x9e,0x6c,0x24,0x92,0xcb,0x8c,
+ 0x65,0xdd,0x4f,0xb6,0x10,0xe8,0x5c,0xfe,0x12,0x87,0x40,0x3e,0x9d,0x48,0xd7,0x2c,
+ 0x8c,0xc9,0x8f,0xf5,0x5e,0x4d,0x7f,0xce,0xd2,0xfd,0x20,0x76,0x9d,0x42,0x1d,0x60,
+ 0x3b,0xb1,0xb3,0xca,0x76,0xe3,0x65,0x9d,0xe4,0xa6,0x4f,0x9a,0x8d,0x73,0x6d,0x6e,
+ 0x93,0x8c,0x82,0x1f,0xe7,0x1e,0xe3,0x83,0x3e,0xbe,0x7d,0xdb,0x2c,0xa,0x2,0x5e,
+ 0xa,0xb,0xf3,0x18,0x5f,0x52,0xcc,0xf4,0xd9,0xb,0x68,0xdb,0xd1,0xc0,0x89,0x8f,
+ 0xda,0xd0,0xe5,0x24,0x9,0x45,0x43,0xf5,0xf9,0xb8,0xea,0xf6,0xeb,0x50,0x84,0x24,
+ 0x9d,0x3,0xc5,0xec,0xdb,0xfb,0x3e,0xd,0x87,0xba,0x41,0x11,0xa8,0x10,0x7,0x58,
+ 0xfe,0x6f,0xff,0x86,0xa6,0xeb,0x24,0xe3,0x83,0xa8,0x72,0x8c,0x58,0xb8,0x87,0x23,
+ 0x7,0xdf,0xa5,0xa7,0xfb,0x4,0x3f,0x5d,0xf7,0x2e,0x47,0x8f,0xf,0x3a,0x77,0x89,
+ 0x3,0x7,0xe,0x1c,0x7c,0x4c,0x90,0x80,0xff,0x71,0xbe,0x77,0x12,0x8d,0x2b,0xc8,
+ 0x8a,0xc6,0xcc,0x29,0x41,0x44,0x49,0x40,0x12,0x45,0x10,0x92,0xd4,0xd4,0x7e,0xe,
+ 0x2d,0x3a,0x80,0x1e,0x4d,0xe0,0x15,0x74,0x48,0xca,0x1c,0x79,0xff,0x10,0x7d,0x3d,
+ 0xbd,0x4c,0xae,0xa9,0x61,0xda,0x14,0x1f,0xb3,0x66,0xcc,0x26,0x76,0xb4,0x95,0x7b,
+ 0x56,0x7d,0xf,0x6f,0x5e,0x21,0x9a,0x9a,0x44,0x40,0x5,0x5d,0xe1,0xc4,0xb1,0xfd,
+ 0xf4,0xf6,0x1c,0xe7,0x50,0x53,0x17,0x7f,0xd9,0x71,0xc4,0xb9,0x9a,0xe,0x1c,0x38,
+ 0x70,0x70,0xb1,0x11,0x8,0x40,0x7b,0x77,0x84,0xf2,0x92,0x7c,0xc6,0x16,0xfa,0x10,
+ 0x44,0x1,0x41,0xd0,0x91,0x24,0x95,0x9a,0xcf,0xfe,0x27,0x44,0x21,0x81,0xda,0x1f,
+ 0xc2,0xe7,0x2,0x17,0x3a,0xe2,0x60,0x92,0xbf,0x6d,0xff,0x80,0x9,0x15,0x53,0xf9,
+ 0x70,0xcf,0x41,0xfe,0xe9,0x9b,0x4b,0x28,0x18,0x37,0x19,0x5d,0x53,0xd0,0xb5,0x24,
+ 0xa0,0xd3,0x7f,0xa2,0x95,0xe3,0x6d,0x7,0xe9,0x3f,0xd9,0xcf,0xfa,0xd7,0xf6,0x32,
+ 0x10,0x4e,0x3a,0x57,0xd3,0x81,0x3,0x7,0xe,0x2e,0x46,0x2,0x1,0x38,0x7a,0x3c,
+ 0xcc,0x65,0xd3,0x8a,0xf1,0xba,0x24,0x4,0x74,0x74,0x64,0x24,0x49,0x67,0xfa,0xb5,
+ 0xb7,0x50,0x5c,0x31,0x89,0x78,0xdb,0x11,0xbc,0xe2,0x50,0x25,0xdd,0x22,0x51,0x63,
+ 0x77,0x5b,0x9c,0xff,0xb2,0xec,0x8b,0x8c,0x9f,0x52,0x83,0xa6,0x29,0xa8,0x4a,0x1c,
+ 0xd0,0x49,0x44,0xba,0x39,0x76,0x68,0x17,0x3,0xbd,0x3d,0x6c,0xad,0x6b,0x66,0xc7,
+ 0xbe,0x2e,0xe7,0x4a,0x3a,0x70,0xe0,0xc0,0xc1,0xc5,0x4c,0x20,0xb1,0x84,0x4a,0x38,
+ 0xa6,0x70,0x69,0x79,0x11,0xa2,0x8,0x3a,0x1a,0xba,0x1a,0x47,0x92,0x54,0x8a,0x2b,
+ 0xe6,0x31,0x79,0xf1,0x57,0x70,0xe9,0x7d,0x8,0x83,0x3,0x78,0x5d,0xf0,0xd9,0xe5,
+ 0xb7,0x33,0x71,0xea,0x6c,0x74,0x4d,0x41,0x53,0x12,0xe8,0xba,0x82,0x1c,0xf,0x71,
+ 0xf4,0xd0,0x4e,0x7a,0xba,0xdb,0x69,0x6d,0x3d,0xc1,0xb,0x7f,0x3c,0x88,0xac,0xa8,
+ 0xce,0x95,0x74,0xe0,0xc0,0x81,0x83,0x8b,0x99,0x40,0x0,0x3a,0x4f,0x46,0xf1,0x79,
+ 0x25,0xca,0x8a,0xf3,0x10,0x11,0xd0,0x50,0xd1,0x94,0x8,0x2e,0x49,0xa3,0x20,0x38,
+ 0x89,0xe0,0xac,0x2f,0x32,0x7e,0xee,0xb5,0x8c,0x9d,0x55,0x45,0xc1,0x84,0x72,0x74,
+ 0x4d,0x45,0x51,0xe2,0x68,0x6a,0x12,0x55,0x49,0x70,0xfc,0xc8,0x7,0x74,0x1d,0x6b,
+ 0xa2,0xfd,0x58,0x2f,0xbf,0xf9,0x73,0x33,0x9d,0x27,0x6,0x9c,0xab,0xe8,0xc0,0x81,
+ 0x3,0x7,0x17,0x0,0xae,0xb,0xb1,0xd3,0x3f,0xd5,0x1d,0xa5,0x20,0xcf,0xc3,0x95,
+ 0x97,0x8e,0x3,0x11,0x44,0x41,0x40,0x10,0xde,0x3,0xa0,0xe4,0x92,0xab,0xf0,0x17,
+ 0x4d,0x67,0x4c,0xa0,0xc,0x55,0x89,0xd2,0xd7,0x7d,0x88,0xfa,0x77,0xfe,0x86,0x9c,
+ 0x88,0x11,0xb,0x87,0xf8,0xdb,0xb6,0x7d,0x1c,0x3c,0xd2,0x47,0x3c,0x2a,0x13,0xf0,
+ 0x6,0x28,0x29,0x2e,0xa2,0xab,0xd7,0x21,0x11,0x7,0xe,0x1c,0x38,0xb8,0xe8,0x35,
+ 0x10,0x18,0xea,0x17,0xd2,0xd8,0xda,0x47,0x51,0x81,0x87,0x60,0xc0,0xd,0xaa,0x8e,
+ 0xaa,0x26,0x91,0x93,0x21,0xd0,0x13,0x78,0xdc,0x2,0x1e,0x5f,0x3e,0x92,0xbb,0x10,
+ 0x7f,0xa0,0x84,0x60,0xc1,0x4,0x7e,0xf7,0x7f,0xd6,0xb2,0xf7,0xfd,0xc3,0xe4,0x25,
+ 0x15,0xae,0x8,0xfa,0xa9,0x2a,0xf4,0x31,0xb1,0xc0,0xc7,0x94,0xf1,0x41,0x26,0x14,
+ 0x15,0x22,0xab,0x2a,0xa1,0x68,0xdc,0xb9,0xa2,0xe,0x1c,0x38,0x70,0x70,0x31,0x13,
+ 0x88,0x41,0x22,0x7,0x5a,0xfb,0x29,0xc,0x78,0x29,0xce,0x77,0xa1,0x2a,0xa,0xaa,
+ 0x2c,0x93,0x8c,0xf,0xa0,0x24,0x7,0x71,0x49,0x1a,0x1e,0x8f,0x84,0xe4,0xf6,0x71,
+ 0xec,0xc3,0x77,0x29,0x4f,0x74,0x72,0xd9,0xc4,0x2,0x2a,0xf2,0xdd,0x8c,0xf,0x78,
+ 0x18,0x97,0xe7,0x66,0xbc,0xdf,0xc5,0x44,0xbf,0x8b,0x8a,0x31,0x79,0xcc,0x9e,0x34,
+ 0x8e,0x3c,0xbf,0x8f,0x43,0xc7,0x7b,0x9d,0xab,0xea,0xc0,0x81,0x3,0x7,0x17,0x33,
+ 0x81,0xc0,0x50,0x6,0x63,0x63,0x6b,0x1f,0xb1,0xa4,0x4a,0xe9,0x38,0x1f,0x4a,0x52,
+ 0x46,0x91,0x65,0xe4,0xc4,0x20,0xf1,0xc8,0x49,0x34,0x25,0x42,0x4f,0xd7,0x31,0x1e,
+ 0xfb,0xc1,0x93,0x54,0xb8,0x14,0xc6,0xe4,0xb9,0x8,0x4e,0x28,0xc0,0x25,0x89,0x74,
+ 0xf4,0xc4,0x39,0xd0,0x17,0x67,0xef,0xc9,0x18,0xef,0x9d,0x8c,0xb2,0xb7,0x27,0x41,
+ 0x6b,0x5f,0x94,0x81,0x1,0xc7,0x9c,0xe5,0xc0,0x81,0x3,0x7,0x1f,0x7,0x3e,0x96,
+ 0x4c,0xf4,0x91,0x60,0x66,0x45,0x31,0xb7,0x5e,0x7f,0x9,0x5,0x79,0x1e,0x82,0x63,
+ 0x2,0x4,0xc7,0x15,0xd2,0xdc,0xae,0xf1,0xdb,0x37,0xf,0xe1,0x17,0x74,0xa6,0x16,
+ 0xf9,0x28,0xcf,0xf7,0xd0,0x14,0x4a,0x70,0x34,0x14,0x47,0xd6,0xc1,0xe3,0xf1,0xe2,
+ 0xf3,0xe7,0x51,0x58,0x54,0xc4,0xc9,0x93,0x27,0x33,0xda,0xb6,0x3a,0x70,0xe0,0xc0,
+ 0x81,0x83,0x4f,0x1,0x81,0x0,0x14,0x17,0xf9,0xb9,0x76,0x5e,0x5,0x8a,0xe6,0xa2,
+ 0xbb,0x5f,0x25,0x1c,0x55,0x4e,0x1d,0xa4,0x8e,0x4b,0x14,0x51,0x8c,0xa,0xbd,0x82,
+ 0x48,0x32,0x99,0x44,0x96,0x65,0x22,0x91,0x8,0xd1,0x68,0x94,0x58,0x2c,0xe6,0x5c,
+ 0x4d,0x7,0xe,0x1c,0x38,0xf8,0xb4,0x12,0x8,0xc,0x15,0xfc,0x9a,0x30,0x61,0x2,
+ 0xf9,0xf9,0xf9,0x43,0xc5,0x18,0x15,0x85,0x78,0x3c,0x4e,0x34,0x1a,0x5,0x20,0x1a,
+ 0x8d,0x9a,0x3d,0xbb,0x1d,0x38,0x70,0xe0,0xc0,0x81,0x43,0x20,0xe,0x1c,0x38,0x70,
+ 0xe0,0xe0,0x1f,0xc,0xa2,0x73,0xa,0x1c,0x38,0x70,0xe0,0xc0,0x81,0x43,0x20,0xe,
+ 0x1c,0x38,0x70,0xe0,0xc0,0x21,0x10,0x7,0xe,0x1c,0x38,0x70,0xe0,0x10,0x88,0x3,
+ 0x7,0xe,0x1c,0x38,0x70,0x8,0xc4,0x81,0x3,0x7,0xe,0x1c,0x38,0x70,0x8,0xc4,
+ 0x81,0x3,0x7,0xe,0x1c,0x9c,0x5,0xfe,0x3f,0xcd,0x86,0xd6,0x9a,0x3a,0x6c,0x32,
+ 0x8d,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/filesave.png
+ 0x0,0x0,0x2,0xfa,
+ 0x89,
+ 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,
+ 0x0,0x0,0x16,0x0,0x0,0x0,0x16,0x8,0x6,0x0,0x0,0x0,0xc4,0xb4,0x6c,0x3b,
+ 0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,
+ 0xa7,0x93,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,
+ 0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,
+ 0xd6,0x2,0x2,0xd,0x1f,0x2e,0xc1,0x2e,0x5e,0x7b,0x0,0x0,0x2,0x87,0x49,0x44,
+ 0x41,0x54,0x78,0xda,0xb5,0x95,0xcd,0x4a,0x5b,0x41,0x14,0xc7,0x7f,0x73,0x8d,0x34,
+ 0xa6,0x68,0x23,0x94,0x5a,0x50,0xe8,0x22,0xf,0x61,0x23,0x5,0xc9,0xba,0x8,0x7d,
+ 0x0,0xe9,0xc2,0x45,0x1f,0xa0,0xdc,0xb5,0xb,0x77,0x42,0xb0,0xcb,0x42,0x4a,0x37,
+ 0xdd,0x75,0xe1,0x1b,0x8,0xd9,0x69,0xdf,0x20,0xb5,0x70,0x37,0xfd,0xc,0x5a,0xd2,
+ 0x34,0x35,0xcd,0x9d,0x3b,0x5f,0x5d,0xc4,0x19,0xee,0x35,0x9,0xa8,0xd0,0x3,0xc3,
+ 0x7c,0xdc,0x99,0xff,0xf9,0xcd,0x99,0x33,0x73,0xe1,0x3f,0x99,0x0,0x88,0xe3,0xd8,
+ 0x1d,0x1e,0x1e,0x92,0xa6,0xf3,0x9c,0x9f,0x3f,0x44,0x88,0x8,0x70,0x38,0xe7,0xae,
+ 0x55,0x3,0x2c,0x2e,0x7e,0x63,0x7e,0x3e,0x65,0x67,0x67,0x87,0x66,0xb3,0x29,0x4,
+ 0x40,0xad,0x56,0x73,0x5b,0x5b,0x5b,0x0,0xc,0x5e,0x3f,0xe3,0x5e,0xe5,0x3e,0xc6,
+ 0x18,0x2c,0x1a,0x63,0x35,0xd6,0x19,0xac,0xb5,0xa1,0x5d,0x18,0x73,0x1a,0x80,0x2f,
+ 0xf5,0x7d,0xa2,0x28,0xa2,0xd3,0xe9,0xd0,0xeb,0xf5,0x44,0xc9,0xa3,0x97,0x4a,0xe3,
+ 0xe6,0xdb,0x74,0xf3,0xda,0xdb,0xb5,0xd6,0xe2,0x9c,0x43,0x6b,0x4d,0xa3,0xb1,0x8f,
+ 0xb5,0x36,0x7c,0x8b,0x0,0xc4,0x18,0x9c,0x66,0xb3,0x79,0xeb,0x98,0x9e,0x9c,0x9c,
+ 0x14,0xfa,0x25,0xe0,0x32,0x56,0x10,0xc7,0x31,0x0,0xc7,0x7,0x8e,0x72,0x15,0xa2,
+ 0x12,0xfc,0xfd,0x9,0xbf,0xbe,0x66,0xbc,0x7f,0x75,0x3c,0x53,0xf4,0x4d,0xba,0x41,
+ 0xbd,0x5e,0x67,0x6e,0x6e,0xae,0x28,0xec,0xb7,0xe5,0x6d,0xe3,0xa5,0xb8,0xb2,0xf4,
+ 0xe,0x4f,0xf,0x1a,0xa1,0xe7,0x9c,0xb,0x61,0xf0,0x75,0x1e,0xb0,0x40,0x9c,0x17,
+ 0x6e,0x3d,0x76,0x3c,0x7a,0x2,0x77,0x1f,0xc0,0xf0,0xc,0xce,0x3f,0xc2,0xe7,0x4f,
+ 0x67,0xfc,0xe8,0x7e,0xe7,0xf7,0x9f,0xfe,0x54,0xe2,0xab,0x16,0x84,0x95,0x52,0x61,
+ 0xf0,0xc5,0x7,0x31,0x65,0xc3,0x2b,0xc0,0xa,0xd6,0xda,0x2,0x6d,0x1e,0xc8,0x39,
+ 0x17,0xa8,0x83,0xb0,0x31,0x26,0x4c,0x78,0x2e,0xda,0x37,0x3a,0x38,0x4f,0x9c,0x77,
+ 0x32,0x95,0xf8,0x9d,0x6b,0x4,0xef,0xf9,0x38,0xe6,0x89,0xf2,0x63,0xd3,0x88,0x23,
+ 0x3f,0x49,0x6b,0x8d,0xd6,0x9a,0x76,0xbb,0x5d,0x10,0xc9,0x2f,0xcc,0xb,0xe4,0xed,
+ 0xe8,0xe8,0x68,0x82,0x58,0x0,0xac,0xad,0xad,0xb9,0xcd,0xcd,0xf1,0xc5,0xc8,0x87,
+ 0xe4,0x2a,0xb1,0x31,0x97,0xb7,0xcd,0x18,0xb4,0xd6,0x18,0x63,0x42,0x5b,0x6b,0x4d,
+ 0x96,0x65,0x24,0x49,0x42,0xbf,0xdf,0x17,0x85,0x50,0x44,0x51,0x74,0x6b,0x51,0xff,
+ 0xbd,0x70,0x78,0x7e,0x81,0xdf,0x8a,0x31,0x86,0x7e,0xbf,0x5f,0x88,0xa3,0xcf,0x0,
+ 0x5f,0xf2,0x8e,0xfc,0x73,0x30,0xf3,0xf0,0xfc,0xd5,0x1e,0xc,0x6,0xb4,0x5a,0x2d,
+ 0xaa,0xd5,0x2a,0x42,0x8,0x8c,0x31,0x28,0xa5,0x90,0x52,0x22,0xa5,0xc4,0x18,0x43,
+ 0xa7,0xd3,0xa1,0xd5,0x6a,0x51,0x2e,0x97,0x39,0x3d,0x3d,0xa5,0x52,0xa9,0x4c,0xe6,
+ 0x71,0xb7,0xdb,0x45,0xeb,0xf1,0x2b,0x25,0x84,0x40,0x8,0xc1,0xc2,0xc2,0x2,0xdb,
+ 0xdb,0xdb,0x94,0xcb,0x65,0x84,0x10,0xec,0xed,0xed,0x31,0x1a,0x8d,0x18,0xe,0x87,
+ 0x28,0xa5,0xb8,0xb8,0xb8,0x8,0x20,0xbe,0x9e,0x10,0x6,0xa,0xc4,0xc6,0x98,0x10,
+ 0xd7,0xe5,0xe5,0x65,0x46,0xa3,0xd1,0xcc,0xec,0x98,0x95,0x39,0x41,0x38,0x4f,0x6c,
+ 0xad,0x45,0x29,0x85,0xb5,0x96,0x34,0x4d,0xc9,0xb2,0xac,0x70,0x48,0x79,0xc7,0xbe,
+ 0x3d,0x55,0xb8,0x56,0xab,0x21,0xa5,0xc,0xaf,0x93,0xb5,0x96,0x2c,0xcb,0xb0,0xd6,
+ 0xd2,0xeb,0xf5,0x30,0xc6,0x20,0xa5,0x44,0x29,0x15,0x1c,0x78,0xe7,0x51,0x14,0x15,
+ 0x52,0xb4,0x20,0x9c,0x24,0x89,0x48,0x92,0xc4,0xad,0xaf,0xaf,0x17,0x26,0xee,0xee,
+ 0xee,0x86,0x89,0x69,0x9a,0xa2,0x94,0xa,0xe,0x9d,0x73,0x48,0x29,0x27,0x72,0x7f,
+ 0xaa,0xad,0xae,0xae,0xba,0x6a,0xb5,0xea,0x7f,0x64,0x37,0x2e,0x4b,0x4b,0x4b,0x2e,
+ 0x8e,0x63,0x7,0xf0,0xf,0x61,0x2b,0x76,0x30,0x23,0x14,0x65,0x22,0x0,0x0,0x0,
+ 0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/fforward.xpm
+ 0x0,0x0,0x1,0x56,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x20,0x66,0x66,0x6f,
+ 0x72,0x77,0x61,0x72,0x64,0x5f,0x78,0x70,0x6d,0x5b,0x5d,0x20,0x3d,0x20,0x7b,0xa,
+ 0x22,0x31,0x37,0x20,0x31,0x32,0x20,0x32,0x20,0x31,0x22,0x2c,0xa,0x22,0x20,0x9,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x22,0x2e,0x9,0x63,0x20,0x23,0x30,
+ 0x30,0x30,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,
+ 0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x20,0x22,
+ 0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,
+ 0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,
+ 0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,
+ 0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x22,0x2c,
+ 0xa,0x22,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x2e,0x2e,0x2e,
+ 0x2e,0x2e,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,
+ 0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x22,0x2c,0xa,
+ 0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,
+ 0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,
+ 0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x2e,0x2e,0x2e,
+ 0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,
+ 0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x7d,0x3b,0xa,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/fileopen.png
+ 0x0,0x0,0x3,0x77,
+ 0x89,
+ 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,
+ 0x0,0x0,0x16,0x0,0x0,0x0,0x16,0x8,0x6,0x0,0x0,0x0,0xc4,0xb4,0x6c,0x3b,
+ 0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,
+ 0xa7,0x93,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,
+ 0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,
+ 0xd6,0x2,0x2,0xd,0x1f,0x4,0x1a,0x95,0x97,0xad,0x0,0x0,0x3,0x4,0x49,0x44,
+ 0x41,0x54,0x78,0xda,0xb5,0x94,0x3b,0x6c,0x1c,0x55,0x14,0x86,0xbf,0x3b,0x33,0x1,
+ 0xdb,0x5a,0x21,0x2c,0x7,0x90,0x45,0xc0,0x81,0x40,0x22,0x82,0xd2,0xa0,0x74,0x91,
+ 0x68,0x10,0x2d,0x5,0x5,0x12,0x12,0x12,0xf,0x89,0x1e,0x6a,0x24,0x53,0xe1,0x9e,
+ 0xd0,0x20,0x1a,0xc4,0xa3,0x4a,0x41,0x1,0x5,0xa,0x32,0x5,0x10,0xac,0xc4,0x29,
+ 0x82,0xe2,0xc6,0x76,0xb2,0x49,0x14,0x7b,0xbd,0xc4,0xeb,0xc7,0xec,0x63,0x66,0xe7,
+ 0xce,0x7d,0x1c,0x8a,0x3b,0x6c,0x58,0xbc,0x4,0xe3,0x88,0x2b,0x5d,0xdd,0x39,0x33,
+ 0x67,0xfe,0x73,0xce,0x7f,0xfe,0x7b,0xe0,0x7f,0x5a,0x6a,0x9f,0x7e,0xf2,0x5f,0xff,
+ 0x55,0x7,0x0,0x1c,0x85,0x21,0x7f,0xc7,0x52,0xfb,0x0,0x55,0xfb,0xc,0xaa,0xe,
+ 0x5a,0xfa,0x3f,0xf9,0xc9,0x28,0x7f,0x75,0x1f,0xfd,0xb9,0x67,0xc6,0x3,0xe3,0xf8,
+ 0xf4,0x43,0xa2,0xe2,0x38,0x18,0xde,0xb3,0xb2,0xd1,0x56,0xf7,0xad,0x8a,0x33,0x27,
+ 0xe,0xcb,0xf9,0xb9,0xd7,0x98,0x78,0xe4,0x51,0x40,0x90,0xac,0xc7,0x8b,0xef,0x7d,
+ 0xc1,0xaf,0x2b,0x5b,0x7,0x6,0x57,0x67,0x4e,0x1c,0x96,0x73,0xb3,0xaf,0x32,0x7d,
+ 0xfc,0x14,0x8c,0x3d,0x8,0x46,0x43,0x59,0x50,0xec,0x6c,0xf2,0xf2,0xfb,0x9f,0xb3,
+ 0xfa,0x7b,0x76,0x4f,0x80,0x56,0xbb,0x3f,0x32,0x78,0x2,0x30,0xfd,0xe4,0xc,0x4c,
+ 0x8c,0x83,0xce,0xa1,0xb7,0x83,0x4f,0xef,0x10,0x97,0x9a,0x1f,0x3f,0x7a,0xe5,0x5f,
+ 0x33,0x7b,0xe9,0x83,0x6f,0x65,0x54,0x65,0x9,0x0,0x87,0x62,0xb0,0xe,0x7a,0x29,
+ 0xe9,0x8d,0x15,0xce,0x7e,0xb7,0xc4,0xe5,0x1b,0xdb,0xc8,0x5f,0xda,0x63,0xac,0xc7,
+ 0x38,0x8f,0xf5,0x52,0x3d,0xb,0xd6,0x85,0xf3,0xd9,0xc7,0x6a,0x72,0xed,0x4e,0x6f,
+ 0x4,0x30,0x80,0xce,0x91,0xee,0x16,0x3f,0x5c,0x59,0x63,0xc9,0x3d,0xc5,0xb9,0xb,
+ 0x97,0x88,0xa2,0x8,0xef,0x3d,0xd6,0x5a,0xb4,0xd6,0x68,0xad,0x29,0xcb,0xbb,0x67,
+ 0x51,0x68,0xca,0xb2,0x1c,0x7c,0x33,0xc6,0x22,0x22,0xcc,0xcd,0xcd,0x55,0xc0,0xde,
+ 0x81,0xee,0x92,0xa5,0x3b,0x7c,0xf9,0x53,0x9d,0xd9,0x4f,0xbf,0xa1,0xd3,0xe9,0xe0,
+ 0x9c,0xc3,0x39,0x47,0x51,0xf4,0x29,0x8a,0x82,0x3c,0xcf,0xd1,0x5a,0x53,0x14,0x5,
+ 0x45,0x51,0xd0,0xef,0xf7,0xab,0x5d,0x90,0xe7,0x3d,0xf2,0xbc,0x4f,0xbd,0x5e,0xa7,
+ 0xd1,0x68,0x54,0xc0,0xd6,0xe3,0xda,0x4d,0xce,0x2f,0xde,0x64,0xfc,0xe8,0x69,0x4e,
+ 0x9e,0x7c,0x9e,0x34,0xdd,0x65,0x6c,0x6c,0xc,0xa5,0x1e,0x20,0x8a,0x22,0x92,0x24,
+ 0x26,0x8a,0x14,0x71,0x1c,0xa3,0x54,0xa0,0x54,0xc4,0xe3,0x7d,0x8,0xae,0x75,0x42,
+ 0x59,0x6a,0x96,0x97,0x97,0x69,0x36,0x9b,0x2a,0x0,0xf7,0x77,0xd8,0xdd,0xda,0xe5,
+ 0xab,0xb,0xb7,0xf8,0xf0,0xb3,0x8f,0x59,0x5b,0xbb,0x4d,0xad,0x56,0x43,0x44,0x70,
+ 0xce,0x11,0x45,0xa0,0x54,0x44,0x14,0xc5,0xc4,0x71,0x4c,0x1c,0x47,0x44,0x51,0xb0,
+ 0xc3,0xbb,0x40,0x59,0xa7,0xd3,0x65,0x71,0xf1,0x32,0x0,0x51,0xe8,0x4c,0xc1,0xfc,
+ 0x95,0xdb,0x1c,0x7a,0xe2,0x5,0x26,0x27,0x27,0x11,0x11,0x44,0x4,0x6b,0x2d,0xc6,
+ 0x98,0x8a,0xcb,0xc0,0xa7,0x31,0x6,0x6b,0xed,0x80,0xa6,0x90,0x6d,0x49,0x96,0x65,
+ 0xcc,0xcf,0xcf,0xf,0xee,0x46,0x4,0x90,0xa5,0x6d,0xbe,0xfe,0xe5,0x26,0xaf,0xbf,
+ 0xf1,0x26,0xad,0x56,0xb,0x0,0xe7,0xdc,0x80,0xc3,0xc0,0x69,0x0,0xe,0xcd,0xa,
+ 0x1,0x42,0x10,0x83,0xd6,0x9a,0x7a,0xfd,0x3a,0xdb,0xdb,0xdb,0xc3,0xaa,0xf8,0x79,
+ 0x69,0x83,0xf1,0xa3,0xa7,0x39,0x76,0xec,0x69,0xb2,0x2c,0xc7,0x18,0x53,0xdd,0x6c,
+ 0x8f,0xf7,0x1e,0xe7,0x2c,0xc6,0xd8,0x4a,0xd,0xe5,0x9e,0xdd,0x6e,0x77,0x58,0x5d,
+ 0xbd,0xc6,0xe6,0x66,0x4b,0xd,0x1,0x9f,0xfd,0x7e,0x85,0x77,0x67,0x3f,0x61,0x7d,
+ 0x7d,0x9d,0x89,0x89,0x71,0x44,0x1c,0x49,0x92,0xa0,0x94,0xc2,0xfb,0xc0,0xb3,0xb5,
+ 0xb6,0xa2,0xc3,0xc,0x49,0xaf,0xdb,0xed,0xb1,0xb1,0xd1,0xe0,0xe2,0xc5,0x4b,0xc3,
+ 0x3a,0xfe,0xed,0x56,0xca,0x3b,0x6f,0xbf,0xc5,0x91,0x23,0x8f,0xd3,0x68,0x34,0x82,
+ 0xa4,0x75,0x59,0x35,0x28,0x1e,0x70,0xed,0x9c,0xab,0xca,0xbf,0x4b,0x45,0xaf,0x97,
+ 0xd1,0xe9,0x74,0x58,0x58,0x58,0xd8,0x33,0xdd,0x92,0xda,0xc3,0x53,0x3c,0xf3,0xdc,
+ 0x29,0xae,0x5e,0x5d,0x42,0xc4,0xf,0xba,0xfe,0xe7,0xa,0x54,0xf8,0x2a,0x6b,0x57,
+ 0xd1,0x62,0x10,0xf1,0x74,0xbb,0x3d,0xea,0xf5,0xeb,0x34,0x9b,0xcd,0xbd,0x43,0x68,
+ 0x6a,0x6a,0x4a,0x66,0x66,0x66,0xd0,0x5a,0xa3,0x14,0x95,0x46,0xd5,0xd0,0xd8,0xd,
+ 0x2a,0x1,0x11,0xc1,0x7b,0x5f,0xd9,0xe1,0x6c,0xb5,0xb6,0x48,0xd3,0x74,0xcf,0xac,
+ 0xf8,0x3,0x57,0x1f,0x27,0x41,0x3f,0xfd,0x5,0xa2,0x0,0x0,0x0,0x0,0x49,0x45,
+ 0x4e,0x44,0xae,0x42,0x60,0x82,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/play.xpm
+ 0x0,0x0,0x1,0x16,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x20,0x70,0x6c,0x61,
+ 0x79,0x5f,0x78,0x70,0x6d,0x5b,0x5d,0x20,0x3d,0x20,0x7b,0xa,0x22,0x31,0x32,0x20,
+ 0x31,0x32,0x20,0x32,0x20,0x31,0x22,0x2c,0xa,0x22,0x20,0x9,0x63,0x20,0x4e,0x6f,
+ 0x6e,0x65,0x22,0x2c,0xa,0x22,0x2e,0x9,0x63,0x20,0x23,0x30,0x30,0x30,0x30,0x30,
+ 0x30,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x7d,0x3b,0xa,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/punchout.xpm
+ 0x0,0x0,0x2,0xb,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x70,0x75,0x6e,0x63,
+ 0x68,0x6f,0x75,0x74,0x5f,0x78,0x70,0x6d,0x5b,0x5d,0x20,0x3d,0x20,0x7b,0xa,0x22,
+ 0x32,0x32,0x20,0x31,0x36,0x20,0x33,0x20,0x31,0x22,0x2c,0xa,0x22,0x2e,0x20,0x63,
+ 0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x66,0x20,0x63,0x20,
+ 0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x22,0x68,0x20,0x63,0x20,0x23,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,
+ 0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x66,0x66,0x66,0x22,
+ 0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x2e,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x2e,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x2e,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,
+ 0x22,0x66,0x66,0x66,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,
+ 0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x22,0x2c,0xa,0x7d,0x3b,0xa,0xa,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/frewind.xpm
+ 0x0,0x0,0x1,0x55,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x20,0x66,0x72,0x65,
+ 0x77,0x69,0x6e,0x64,0x5f,0x78,0x70,0x6d,0x5b,0x5d,0x20,0x3d,0x20,0x7b,0xa,0x22,
+ 0x31,0x37,0x20,0x31,0x32,0x20,0x32,0x20,0x31,0x22,0x2c,0xa,0x22,0x20,0x9,0x63,
+ 0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x22,0x2e,0x9,0x63,0x20,0x23,0x30,0x30,
+ 0x30,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,
+ 0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x22,0x2c,
+ 0xa,0x22,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,
+ 0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,
+ 0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x2e,0x2e,
+ 0x2e,0x2e,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,
+ 0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x20,0x20,
+ 0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x2e,0x2e,
+ 0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x2e,0x2e,0x2e,
+ 0x2e,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,
+ 0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x2e,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x20,0x20,
+ 0x2e,0x2e,0x2e,0x20,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x20,0x2e,
+ 0x2e,0x2e,0x20,0x20,0x20,0x20,0x2e,0x2e,0x2e,0x20,0x20,0x22,0x2c,0xa,0x22,0x20,
+ 0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,
+ 0x22,0x7d,0x3b,0xa,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/muse_icon_64x64.png
+ 0x0,0x0,0x1d,0x45,
+ 0x89,
+ 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,
+ 0x0,0x0,0x40,0x0,0x0,0x0,0x40,0x8,0x6,0x0,0x0,0x0,0xaa,0x69,0x71,0xde,
+ 0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0x0,0x0,0x0,0x0,0x0,0xf9,0x43,
+ 0xbb,0x7f,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x12,0x0,0x0,
+ 0xb,0x12,0x1,0xd2,0xdd,0x7e,0xfc,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,
+ 0xd4,0x5,0x1a,0x0,0x1a,0x39,0x5d,0x17,0xbe,0xc1,0x0,0x0,0x1c,0xd2,0x49,0x44,
+ 0x41,0x54,0x78,0x9c,0xdd,0x9b,0x69,0x98,0x1d,0x57,0x79,0xe7,0xff,0xe7,0xd4,0x72,
+ 0xf7,0xa5,0xbb,0x6f,0x6f,0x6a,0xa9,0xd5,0x92,0xac,0x7d,0x5f,0x2c,0xd9,0x92,0x2c,
+ 0x5b,0x5e,0xe4,0x7d,0x7,0x83,0x6d,0x4c,0x70,0x80,0x60,0x86,0x0,0x43,0x2,0x9,
+ 0x49,0x6c,0x78,0x2,0x19,0x6,0x86,0xe5,0x9,0x21,0x9,0x63,0x48,0xe0,0x9,0xb1,
+ 0x6,0xc,0xb6,0x8c,0x1d,0xaf,0x18,0xc9,0x2d,0xd9,0x92,0x65,0xd9,0xda,0xf7,0xa5,
+ 0xb5,0xb4,0xba,0x5b,0xad,0x5e,0x6e,0xdf,0x5b,0xb7,0x6e,0x55,0x9d,0x7d,0x3e,0xb4,
+ 0x6c,0x64,0x23,0xcb,0x2d,0x59,0x9e,0xf,0xf3,0xbf,0x5f,0xdf,0xba,0x75,0xde,0x5f,
+ 0xbd,0xef,0x7b,0xde,0x3a,0xe7,0x14,0x99,0x34,0x69,0x12,0xfe,0x7f,0xd0,0xfe,0xfd,
+ 0xfb,0x88,0x12,0xa5,0x6f,0x28,0x36,0xc8,0x67,0xce,0xbf,0xf1,0x9b,0x23,0xbd,0x8e,
+ 0x7e,0x90,0x83,0xfa,0x7f,0xa5,0xfd,0xfb,0x77,0xbb,0x46,0x79,0xf,0x2b,0x36,0xf0,
+ 0x60,0x65,0xf0,0xc8,0xe7,0x7f,0xf6,0xdd,0x5b,0x46,0xec,0x97,0x7d,0x2e,0x37,0xda,
+ 0xf4,0x77,0x8b,0x27,0x58,0xb6,0xf5,0x19,0x63,0xcc,0x28,0x16,0xa,0x8f,0x85,0xe2,
+ 0xdf,0x2b,0x25,0xb6,0xf5,0xd6,0x47,0x76,0xeb,0x73,0x1f,0xf6,0xfb,0x57,0x63,0xca,
+ 0x25,0xeb,0xb6,0x6c,0x5f,0x4,0x5d,0xfd,0xdf,0x8a,0xd,0xcd,0xae,0x96,0x7b,0xb0,
+ 0x6d,0xfd,0xe3,0xb5,0x9b,0x5e,0xd9,0x76,0x11,0x80,0x3,0x23,0xf9,0x8f,0x11,0x1,
+ 0x78,0xf2,0x63,0x33,0xd0,0xd0,0x92,0xf9,0xb4,0x9b,0x70,0xff,0x89,0x3a,0x76,0x5c,
+ 0x9,0x9,0x47,0x1,0x46,0x99,0x7,0x32,0x39,0xbc,0xb1,0xfa,0xb3,0xf3,0x3e,0x79,
+ 0xd5,0x8f,0xb7,0xec,0x7c,0x5f,0xde,0x9c,0x83,0x36,0x7f,0xfd,0x32,0xe2,0x8e,0x9f,
+ 0xf7,0xdf,0xdc,0x5,0xf7,0x7e,0x2,0xba,0x3a,0x5b,0xf1,0xb2,0xe3,0x97,0x3a,0xb1,
+ 0x65,0xed,0x2f,0xb1,0x79,0xe3,0x8e,0x75,0x3e,0x93,0x5d,0x23,0xfd,0xaf,0x11,0x1,
+ 0xb0,0x6c,0x3c,0x60,0x3b,0xd6,0xbf,0x12,0x8b,0x10,0x2b,0x5b,0xb,0xdb,0x4d,0x1,
+ 0x27,0x8e,0x82,0x10,0x10,0x6a,0x91,0x8b,0x25,0x57,0x9b,0xd6,0x7c,0x6e,0xde,0xdf,
+ 0xb,0xa1,0xbf,0x7b,0xed,0x4f,0xb6,0xa9,0xf3,0xf6,0x6c,0x4,0xda,0xf5,0xfd,0x15,
+ 0x39,0x3a,0xf3,0xc3,0xff,0x6a,0x8d,0x59,0x70,0xf,0x20,0xa0,0x84,0x87,0x72,0xff,
+ 0x41,0x6c,0x5e,0xf7,0x2b,0xb3,0x69,0xfd,0xae,0xad,0x47,0x8f,0xb3,0xbb,0xd7,0x1d,
+ 0xf0,0x83,0x91,0xfe,0xdf,0xbb,0xe6,0xca,0xf6,0x2d,0xaf,0x5c,0xb4,0x77,0xef,0xde,
+ 0xdc,0xc4,0x9a,0xc4,0xd4,0x72,0x99,0x7f,0x3f,0xac,0x46,0x84,0x55,0x5,0x24,0xd7,
+ 0xd0,0x24,0xe,0xce,0xd,0x58,0xc0,0x21,0xb9,0x82,0x36,0x26,0x4e,0x8,0xf9,0x96,
+ 0xeb,0x5a,0x4f,0xb6,0x7f,0x61,0x7e,0xfa,0xc2,0xb8,0xfa,0x76,0xed,0xfb,0xc9,0xed,
+ 0xd8,0xfe,0xa3,0xbb,0xaf,0xb6,0x97,0xff,0xcd,0x6b,0x56,0xeb,0xc2,0x7b,0x8c,0x89,
+ 0xa0,0xb8,0x87,0xc1,0xee,0x6d,0xd8,0xf4,0xd2,0x23,0xd8,0xf8,0xec,0x1e,0xd2,0x73,
+ 0x48,0xce,0x2d,0xe,0x99,0xe3,0xa3,0x32,0xee,0xbd,0x23,0xfd,0x5f,0x72,0xa6,0x59,
+ 0xe0,0xc1,0x2f,0xdc,0x90,0xbf,0xf3,0xbe,0x2f,0x75,0x26,0xb3,0xad,0x8e,0x31,0xfa,
+ 0x44,0xe9,0xd8,0xfe,0x71,0x7d,0xeb,0x1f,0x83,0xbf,0xeb,0x75,0xc4,0x63,0x16,0x2c,
+ 0x8b,0x82,0xda,0x0,0x25,0x14,0x4,0x0,0xa1,0x4,0x94,0x0,0x96,0x4d,0xc,0xb5,
+ 0xad,0x9d,0xb6,0x45,0xfe,0x42,0x2b,0xb3,0xfa,0x8a,0x7f,0xde,0x7c,0x41,0x9c,0xdf,
+ 0xf1,0x9d,0xab,0xe3,0xf6,0x9c,0x8f,0x7c,0xc7,0x6a,0x5d,0xf4,0xe7,0x20,0x8a,0x6a,
+ 0xe9,0x43,0xf1,0xa,0x7a,0x8f,0xbe,0x81,0x6d,0xaf,0x3e,0x6d,0x36,0xae,0xed,0xd8,
+ 0x10,0xf4,0xeb,0x25,0x52,0x1b,0x9c,0xc,0x24,0xfa,0x42,0xbe,0xab,0xca,0xd5,0x4c,
+ 0x8f,0xbf,0x77,0x30,0x9e,0x31,0x5,0xe6,0xce,0x99,0xb2,0x34,0x96,0x88,0x67,0x0,
+ 0x3,0x42,0xe8,0xb8,0x9a,0xb6,0xa9,0xa8,0x69,0x7b,0x8,0xc6,0x68,0x4,0x83,0xbd,
+ 0xa6,0xf3,0xd5,0xe7,0xc9,0x9e,0xe7,0x1e,0x47,0x2,0x12,0xc9,0x98,0x8d,0x44,0x8c,
+ 0xc2,0x75,0x6d,0xb8,0xe,0x21,0x8e,0xa3,0x67,0xc6,0x92,0xf6,0xb,0x6e,0xc2,0xf9,
+ 0xd9,0xfa,0x2f,0x2f,0xfa,0x9b,0x25,0xdf,0x7b,0x6d,0xf0,0xfd,0x38,0xbf,0xfd,0x17,
+ 0x5f,0x1d,0xef,0xce,0xbc,0xe1,0x59,0x92,0x2c,0x4c,0x86,0x61,0x30,0x2a,0x82,0x8,
+ 0x8b,0x38,0xb6,0xbf,0x1d,0x3b,0x37,0xad,0xe1,0x1d,0xfb,0xbb,0xbf,0x72,0xe8,0x28,
+ 0x6b,0x68,0x48,0xd8,0x4b,0x8,0x21,0x0,0x1,0x8,0x21,0xad,0x94,0x12,0xa,0xe0,
+ 0x3d,0x8b,0xf3,0x19,0x1,0xc4,0x62,0x56,0x9b,0x91,0x21,0x94,0xee,0x81,0xd1,0x1a,
+ 0x30,0xa,0x6,0x0,0xa1,0xe,0x12,0xb9,0x24,0x99,0x72,0xe3,0x3d,0x98,0x72,0xe3,
+ 0xc7,0xe0,0xf,0x9c,0xc0,0xbe,0x17,0x1f,0xc3,0x81,0x17,0x9f,0x43,0x36,0x46,0x91,
+ 0x4d,0x38,0x48,0xa5,0x1c,0x92,0x10,0xda,0x4a,0xa,0xfd,0xa9,0x6c,0x43,0xcd,0x92,
+ 0xcd,0xdf,0xb9,0xe5,0x9e,0xcd,0xeb,0xf,0x6e,0xff,0xb3,0xa7,0xf6,0x9e,0x93,0xe3,
+ 0x9b,0xfe,0x6e,0x69,0x21,0x75,0xcd,0x7f,0xff,0x82,0xdd,0x3c,0xf5,0x33,0x80,0x6e,
+ 0x80,0xae,0x40,0xcb,0x10,0xd5,0xa1,0x4e,0x74,0xec,0x5e,0x83,0x1d,0xaf,0xad,0x57,
+ 0x7,0x3b,0xfa,0xfe,0xfc,0x99,0x8d,0xfe,0x4f,0x27,0xd7,0x26,0x36,0x10,0x42,0x40,
+ 0x1,0x10,0x0,0x6,0xc8,0xc0,0xa0,0x1,0x40,0xef,0x79,0x1,0x0,0x30,0x65,0xa0,
+ 0x6b,0x3b,0xa2,0xa0,0x8c,0xaa,0x37,0x80,0x28,0x28,0x43,0x88,0x8,0x30,0x1a,0x96,
+ 0x13,0x43,0x2c,0x9e,0x41,0x3a,0x57,0x40,0xae,0x6e,0x2c,0x66,0xdf,0x76,0x17,0x66,
+ 0xdf,0xfe,0x71,0x74,0xed,0xda,0x8c,0xb5,0x3f,0xfe,0x47,0xa4,0xca,0xc,0xf5,0xb9,
+ 0x38,0x6a,0x14,0x88,0x10,0xc5,0xa9,0x85,0x9,0xa9,0x4d,0x8b,0xae,0xbb,0xf8,0xdf,
+ 0x36,0x4e,0xaf,0xfb,0xeb,0x4b,0xfe,0xe7,0x2b,0xfe,0x7b,0xd,0xe8,0xd5,0xbf,0x5e,
+ 0x64,0x5b,0x63,0xe6,0x7d,0x28,0xb3,0xf4,0x63,0xdf,0xa5,0x89,0xfc,0x68,0x98,0x8,
+ 0x5a,0x6,0x50,0xbc,0x82,0xc1,0x9e,0xdd,0x38,0xb0,0x63,0xd,0x76,0x6d,0xd9,0x75,
+ 0xe2,0x78,0x4f,0xe9,0x9e,0x55,0x1b,0x2a,0xed,0xd3,0xb,0xa9,0x74,0x8c,0xd2,0x39,
+ 0x16,0x1,0x8c,0x81,0x31,0x0,0x81,0x1,0x1,0x90,0x1a,0x9,0xe8,0x33,0x2,0x18,
+ 0xea,0xef,0x6c,0x1d,0xe8,0x39,0x80,0xd2,0x60,0x1f,0x86,0x6,0x4a,0xa8,0x56,0x2,
+ 0x70,0x21,0x0,0x3,0x58,0x96,0x85,0x58,0xdc,0x41,0x32,0x93,0x40,0x3a,0x97,0x45,
+ 0xbe,0xa6,0x1e,0x75,0x4d,0xad,0x68,0x18,0x33,0xb,0xf7,0xfe,0xcb,0xcf,0xd1,0xb9,
+ 0x73,0xb,0x9e,0xfd,0xc7,0xef,0xa3,0xbe,0x1c,0xa1,0xad,0x29,0x47,0x64,0x47,0x8f,
+ 0x5b,0x5b,0xad,0x7e,0x36,0xdb,0x3c,0xe6,0xb2,0x2d,0xdf,0xba,0xf6,0xb6,0x79,0x7f,
+ 0xfb,0xc2,0xe1,0x33,0xdd,0xf3,0xe5,0xbf,0x58,0x48,0x18,0x53,0xd7,0x27,0xaf,0xfc,
+ 0xdc,0xf7,0xe2,0x63,0xe7,0x4e,0x5,0x14,0x8c,0x2c,0x43,0xc9,0x0,0x51,0xa5,0x17,
+ 0x5d,0x1d,0x1b,0xb1,0x6f,0xfb,0xab,0xe8,0xd8,0x77,0xfc,0xf9,0x81,0x52,0x78,0xff,
+ 0xaa,0xd,0x95,0x5e,0x0,0x88,0x59,0x64,0x71,0xd6,0xb5,0x12,0x19,0xc7,0x32,0x1e,
+ 0x57,0x30,0xc6,0x60,0xf8,0x87,0xc4,0x79,0x3,0xd8,0xb3,0x6d,0x73,0xb3,0x57,0xf4,
+ 0x51,0xd,0x18,0xa4,0xd2,0x30,0xc6,0x0,0x0,0x8,0x86,0x73,0x8c,0x52,0x2,0xa7,
+ 0xcf,0x42,0x3c,0x31,0x88,0x6c,0x4d,0x3f,0xfa,0x4f,0x76,0xa3,0xbf,0xa7,0x3,0x75,
+ 0xd,0x6d,0x68,0x6a,0x9b,0x83,0xcf,0xfc,0x74,0x25,0x36,0x3c,0xf1,0x2b,0xb4,0xaf,
+ 0x7a,0x1c,0x53,0x1b,0x33,0x68,0x13,0x20,0xfe,0xa0,0x37,0xa3,0x71,0x62,0xeb,0xab,
+ 0x7b,0x1f,0x7f,0xf0,0x2f,0xd5,0xf1,0x2d,0x2f,0x52,0xb,0x7d,0x5a,0xa8,0xbc,0xa8,
+ 0x86,0x93,0x2a,0xc5,0xe0,0x4a,0x6b,0xe2,0xa5,0xb7,0xb7,0x5c,0x76,0xf7,0xc5,0xd4,
+ 0x49,0x2,0x3a,0x84,0x12,0x3e,0x44,0x54,0xc6,0x50,0xef,0x3e,0x1c,0xda,0xf3,0x32,
+ 0xe,0xee,0xdc,0xab,0xd6,0x6d,0x2d,0x1e,0xad,0x69,0x5b,0xfc,0xa3,0x67,0x37,0x3c,
+ 0xf7,0x56,0x68,0xdb,0x84,0xdc,0x96,0x71,0x29,0x1c,0x8b,0x18,0x42,0x40,0x95,0x1,
+ 0x8c,0x1,0xc,0xcc,0x88,0xba,0xc1,0x33,0x47,0xc0,0x40,0xc5,0x96,0x42,0x81,0x50,
+ 0x2,0x23,0xd,0x8,0x21,0xa0,0xd4,0xc2,0x91,0x7e,0x8d,0xa1,0x4a,0x84,0x98,0x4d,
+ 0x90,0x49,0x50,0x34,0xe4,0x4,0x2a,0x7e,0x4,0xaf,0xe8,0x23,0xf0,0x7c,0x84,0x61,
+ 0x15,0x51,0xe0,0xa1,0xb6,0xe9,0x38,0x2e,0xbd,0xed,0x66,0xcc,0xbf,0xe1,0x76,0x3c,
+ 0xfe,0x83,0x6f,0xe3,0xc8,0x8e,0x3d,0x98,0xdb,0x56,0x47,0x94,0xee,0x6c,0x28,0xf8,
+ 0x95,0xff,0x74,0xc0,0xd,0x81,0xe1,0x82,0x2b,0x47,0xd7,0x8e,0xa3,0x75,0x77,0xdf,
+ 0x7,0x3b,0xd7,0x2,0x68,0x6,0xcd,0x4b,0x90,0xdc,0x83,0x5f,0xea,0x42,0xe7,0xc1,
+ 0x8d,0xe8,0xd8,0xb5,0x55,0xed,0xd9,0xdb,0xd3,0xdf,0xd5,0x1f,0x7c,0x71,0x4b,0x87,
+ 0x94,0xf3,0x72,0xa5,0xc5,0x0,0x9e,0x5,0x80,0xc9,0x75,0x49,0x37,0x66,0xd1,0xbb,
+ 0x1c,0x4a,0xa0,0xb4,0xa1,0x52,0x1b,0x48,0x6d,0xa0,0x87,0x73,0x61,0x44,0x3d,0xce,
+ 0x19,0x8d,0xd2,0x99,0x84,0x97,0xaf,0xcb,0xa2,0xf3,0xe8,0xe0,0x6e,0x21,0xaa,0xe3,
+ 0x62,0xae,0x95,0x54,0x4a,0xa3,0xaf,0x6c,0xb0,0xff,0x58,0xf4,0x96,0x1d,0xa5,0xd0,
+ 0x63,0x1a,0x52,0xfb,0xc6,0x37,0x19,0xa7,0xa1,0x14,0x4d,0x1c,0x55,0xf2,0xc1,0x27,
+ 0x30,0x68,0x23,0x61,0xb4,0x42,0xfd,0xe8,0x19,0xf8,0xc4,0x37,0x7f,0x0,0xc1,0x4,
+ 0x7a,0xf6,0xef,0x81,0x38,0x79,0x18,0x11,0x65,0x40,0x3a,0x4d,0x12,0xa3,0x27,0xc5,
+ 0x92,0x4d,0x13,0x40,0x9d,0x24,0x60,0x18,0x8c,0xf4,0x20,0x99,0x87,0xc8,0xef,0x43,
+ 0xcf,0xd1,0x2d,0x38,0xb8,0x73,0x23,0x8e,0x1d,0x3a,0xae,0x8a,0xa5,0xea,0xf,0xb7,
+ 0xf4,0xd6,0xe7,0xa6,0x4d,0xbf,0xfc,0x29,0xec,0xff,0xaf,0x4c,0xb9,0x5c,0xfe,0xc4,
+ 0x69,0x4f,0x7f,0x61,0xd2,0xa1,0x75,0xca,0x18,0x48,0x3,0x84,0x52,0x43,0x68,0x3,
+ 0x65,0xc,0xd4,0x70,0x1d,0x38,0x3f,0x0,0x17,0x4d,0x9f,0xf6,0x5f,0x25,0xdf,0x79,
+ 0xe2,0x64,0xb1,0xf3,0xdf,0xd3,0xae,0xee,0x51,0x8a,0x40,0x48,0x85,0xa3,0x3d,0x95,
+ 0xb7,0xd9,0x69,0x8d,0x1f,0x9d,0x2c,0xa9,0x4c,0xbf,0x67,0x7e,0x92,0x88,0x3b,0xf,
+ 0x35,0xe6,0xca,0x73,0x17,0x96,0x42,0x78,0x83,0xde,0xa8,0x89,0x33,0xc,0x8,0x28,
+ 0x24,0xb,0x90,0x29,0x4c,0x40,0xdb,0xec,0xb9,0x0,0x59,0x74,0xda,0xd5,0x6,0x80,
+ 0x2,0x74,0x15,0x92,0x97,0x4d,0xe4,0xf7,0x91,0xfe,0xae,0x9d,0xd8,0xbf,0xed,0x65,
+ 0x1c,0xed,0x38,0x86,0x9e,0xde,0x4a,0xdf,0x8e,0xe3,0x74,0xdf,0xd4,0xb9,0x57,0xfd,
+ 0x55,0xdf,0xce,0x75,0xf7,0x8c,0x8f,0xa2,0x4b,0x18,0x63,0xed,0x51,0x14,0x8d,0x5d,
+ 0xb8,0x70,0x21,0x36,0x6d,0xda,0x4,0x8b,0x60,0x19,0x25,0x0,0x93,0x6,0xc2,0x18,
+ 0x4,0xca,0x40,0x68,0xd,0xa5,0x1,0x6d,0x10,0x3b,0x6f,0x0,0xf,0x3c,0xf8,0xec,
+ 0xf7,0x0,0xe0,0x23,0xcb,0x72,0x1f,0x6,0x90,0x4e,0xa5,0x62,0x38,0x72,0xc2,0x7,
+ 0x13,0xc3,0xb5,0xc0,0x71,0x1c,0x8,0x21,0x90,0x4e,0xa7,0xf7,0xb,0x21,0xea,0xe2,
+ 0xf1,0xb8,0x1f,0x31,0x56,0x3c,0xd8,0xc5,0x7f,0x5a,0x66,0x29,0x2f,0xb1,0xf7,0xe8,
+ 0x55,0xd7,0xf5,0x97,0xf8,0xf8,0x29,0xc7,0x6e,0xbb,0x68,0xda,0x22,0x70,0x56,0x41,
+ 0x3a,0xd7,0x2,0x37,0x59,0xb,0x6a,0xc7,0x41,0x88,0x5,0x63,0x24,0x94,0xa8,0x82,
+ 0xf9,0x83,0x18,0xe8,0xd9,0x4b,0xf6,0xed,0x58,0x8b,0x8e,0xbd,0x87,0x31,0x58,0xc,
+ 0xd0,0x39,0x64,0xad,0xe9,0xe8,0xf6,0xef,0xad,0x8a,0xd4,0x6d,0x4d,0x43,0x43,0x4b,
+ 0xab,0xd5,0xea,0xc6,0xc1,0xc1,0xc1,0x3b,0x0,0xb4,0x47,0x51,0xe4,0x66,0x32,0x99,
+ 0x3a,0x0,0x83,0x0,0xe6,0x86,0x52,0x83,0x13,0x2,0xae,0xc,0x2,0xa1,0xc0,0xd4,
+ 0x70,0x1a,0x28,0x63,0xbc,0xf3,0x6,0xf0,0xa6,0x28,0xcc,0x54,0x0,0xb0,0x28,0xc5,
+ 0xc9,0xa1,0x3f,0x74,0x55,0x94,0x52,0xc4,0xe3,0xf1,0xee,0x6c,0x36,0x3b,0xdb,0xf3,
+ 0xbc,0xaf,0x65,0x32,0x99,0x2f,0x52,0x4a,0x5f,0x4d,0xa7,0xd3,0x1d,0x5c,0xe8,0xcb,
+ 0x8a,0x3e,0x6,0x36,0x1f,0xd1,0x9f,0x7f,0x69,0xc7,0xee,0x17,0x2f,0x9b,0x7e,0xe4,
+ 0x60,0x63,0x53,0xdd,0x3d,0xa3,0xc7,0xb7,0x91,0x42,0xe3,0x58,0xc4,0x53,0x79,0x10,
+ 0x42,0x10,0x55,0x3d,0xf4,0xf5,0x1e,0x42,0xd7,0xe1,0xa3,0xe8,0xed,0x29,0xa2,0xec,
+ 0x73,0x53,0x91,0xb1,0x57,0x76,0x75,0x4,0xff,0x90,0xaa,0x9d,0x70,0x6f,0xcf,0xc0,
+ 0x60,0x6f,0x2a,0x25,0x7f,0x55,0xad,0x56,0x1f,0x4,0xf0,0x95,0x6a,0xb5,0x3a,0x19,
+ 0x0,0x82,0x20,0x78,0x5d,0x29,0xb5,0x24,0xe1,0xda,0x4f,0xf9,0x52,0x4f,0x71,0xb8,
+ 0x86,0x45,0x0,0xa6,0xd,0x7c,0xa1,0xc0,0x87,0xd3,0x80,0x6b,0x6d,0x8e,0xbf,0x7f,
+ 0x0,0x14,0xa3,0x8,0x21,0x48,0x65,0x92,0xe8,0x1e,0xec,0x7b,0xb3,0xc9,0x80,0x94,
+ 0x12,0x73,0xe7,0xce,0xfe,0x69,0x14,0x71,0xb7,0xbe,0xbe,0x3e,0x25,0x84,0x28,0x4,
+ 0x41,0xf0,0xf3,0xe6,0xe6,0xe6,0x3b,0xc2,0x30,0xcc,0x5b,0x96,0xf5,0xa2,0xa7,0xea,
+ 0xe6,0x1c,0x1f,0xc,0x7f,0xfd,0xfb,0x7d,0xd9,0xf6,0x70,0xd3,0xd1,0xd7,0x66,0xb4,
+ 0x76,0x5f,0x51,0x48,0xaf,0x6f,0x2c,0xfa,0xe6,0x92,0xba,0xc,0x45,0x29,0x22,0xc8,
+ 0xc5,0xb4,0x37,0x10,0xba,0xa0,0x30,0xaf,0xf9,0x55,0x7c,0xa3,0xea,0x8e,0xfe,0x58,
+ 0xe7,0xc9,0xbe,0xdf,0xcd,0x1f,0x9d,0xbc,0xb1,0xa5,0xa5,0x25,0xd3,0xdd,0xdd,0x5d,
+ 0x62,0x8c,0x15,0xc2,0x30,0x34,0x4a,0xa9,0x60,0xfe,0xfc,0xf9,0xd6,0xae,0x5d,0xbb,
+ 0x76,0x96,0x4a,0xa5,0x4b,0xb4,0xc1,0x53,0x15,0x26,0x6b,0x28,0x0,0x42,0x8,0xb8,
+ 0xd2,0xf0,0xb9,0x42,0x24,0x35,0xa4,0x36,0x2f,0x68,0x63,0xca,0x23,0x1,0x70,0xd6,
+ 0xa9,0x42,0x3,0x73,0x73,0x99,0x4,0xa4,0x90,0x28,0x7a,0xa,0xf4,0x54,0xcf,0xef,
+ 0xda,0x28,0xe6,0x72,0xd9,0x16,0xdb,0xb6,0xff,0x4f,0x53,0x53,0xd3,0x4d,0x85,0x42,
+ 0x61,0x60,0xee,0xdc,0xb9,0xc5,0x74,0x3a,0x3d,0xa3,0xb1,0xb1,0xd1,0xab,0xad,0xad,
+ 0xdd,0x5d,0x57,0x57,0x77,0x43,0x73,0x73,0xf3,0x6f,0xea,0xeb,0xeb,0x6f,0x55,0x34,
+ 0xf7,0xdc,0x10,0x9d,0xb2,0xf3,0x50,0x31,0x71,0x45,0x67,0x30,0xfa,0xb1,0x48,0x22,
+ 0xd3,0xcb,0x5b,0x7f,0xb4,0xbb,0x34,0x7e,0xca,0xa0,0x6a,0xbb,0xe8,0x4,0x1b,0xb3,
+ 0xff,0xe5,0x5d,0xe5,0x57,0x29,0xa5,0x6e,0x7d,0x7d,0x3d,0x65,0x8c,0x6d,0x6c,0x6d,
+ 0x6d,0x9d,0x8f,0x61,0xe7,0x8e,0xb7,0xb5,0xb5,0x35,0x57,0xab,0xd5,0x7d,0xc9,0x64,
+ 0x72,0x16,0x80,0x75,0x9e,0xe7,0x4d,0xd3,0x20,0xf0,0x98,0x1a,0x1c,0x8a,0x24,0x86,
+ 0x22,0x81,0xa1,0x48,0xc0,0x17,0x1a,0x4c,0x69,0x68,0x63,0x1e,0x19,0x89,0xf3,0x67,
+ 0x5,0xb0,0x60,0x7a,0x63,0x8c,0x2,0x53,0x6b,0xea,0xb2,0x28,0x96,0x38,0xa4,0x2,
+ 0x8,0x1,0x28,0x21,0xc8,0xa5,0xdd,0x67,0x38,0x57,0x7e,0x3e,0x9f,0xef,0xa,0x82,
+ 0x60,0x76,0x7f,0x7f,0xff,0x6a,0x42,0xc8,0xf5,0x8e,0xe3,0xec,0x28,0x95,0x4a,0x3b,
+ 0xa,0x85,0xc2,0x52,0x29,0x65,0xc1,0x18,0xd3,0xad,0xb5,0x1e,0x93,0x48,0x24,0xe,
+ 0x1,0x18,0xd7,0x57,0x49,0x5a,0xd9,0x5c,0x7e,0xcf,0x9e,0xc1,0x96,0x56,0xaf,0x12,
+ 0xbd,0x50,0x53,0x53,0x73,0xf9,0x1b,0x6f,0xbc,0x51,0xd4,0x5a,0xa7,0x9b,0x9a,0x9a,
+ 0x6c,0x0,0x87,0x9b,0x9b,0x9b,0xc7,0xf4,0xf5,0xf5,0x1d,0x7,0xd0,0xc,0x0,0x8c,
+ 0xb1,0xb5,0xe9,0x74,0xfa,0xca,0xc1,0xc1,0xc1,0x8d,0x61,0x18,0x2e,0x2,0xb0,0x33,
+ 0x8a,0xa2,0xa9,0xf3,0x1a,0x52,0x56,0x2e,0x6e,0x59,0x25,0x26,0x51,0x8a,0x24,0x2a,
+ 0x5c,0x41,0x28,0xd,0x3,0x30,0x0,0xcf,0xbf,0x6f,0x0,0xad,0x35,0x2c,0xee,0xd8,
+ 0x56,0x32,0x99,0x49,0xa0,0xab,0x28,0x30,0xfc,0x9e,0x31,0xdc,0x8,0xcd,0x1a,0x97,
+ 0x59,0x3d,0x30,0x30,0xb0,0x3a,0x91,0x48,0x5c,0xa5,0x94,0xea,0x8b,0xc5,0x62,0x87,
+ 0x3c,0xcf,0x5b,0x32,0x34,0x34,0xb4,0x26,0x9b,0xcd,0xd6,0x32,0xc6,0x66,0x2a,0xa5,
+ 0xd6,0xd7,0xd5,0xd5,0x2d,0x32,0xc6,0x74,0x67,0xb3,0xd9,0x31,0x96,0x65,0x3d,0x9f,
+ 0xcd,0x66,0x2f,0xf7,0x3c,0xef,0xe9,0x7c,0x3e,0xbf,0x2c,0xc,0xc3,0xf5,0x9e,0xe7,
+ 0x5d,0x1,0x0,0x89,0x44,0x62,0x7,0xa5,0x74,0xf2,0xe0,0xe0,0xe0,0x96,0x5c,0x2e,
+ 0x37,0x47,0x29,0xb5,0xbd,0x58,0x2c,0x5e,0x2,0x0,0x3,0x3,0x3,0x5b,0x2d,0xcb,
+ 0x9a,0xa4,0x94,0xda,0xe6,0x79,0xde,0x5c,0xc6,0x58,0x20,0x84,0xa0,0xb5,0xb9,0xcc,
+ 0xe2,0x29,0xb5,0xc9,0xa9,0x75,0x9,0x1b,0x52,0xf,0xf7,0xc0,0xa7,0xf4,0x12,0x80,
+ 0x11,0x15,0xc0,0xb3,0x2,0x70,0xa8,0xa9,0x49,0xa5,0x62,0x16,0x34,0x30,0x54,0x51,
+ 0xa0,0x84,0x80,0x0,0xc8,0xa7,0x1c,0x5c,0x3c,0x23,0xb7,0x4d,0x29,0xf5,0xbb,0x62,
+ 0xb1,0xb8,0xa2,0x54,0x2a,0x3d,0x91,0xcd,0x66,0x6f,0xe2,0x9c,0xcb,0x44,0x22,0x71,
+ 0x84,0x73,0x3e,0x4f,0x29,0x55,0xf5,0x3c,0xef,0x15,0x0,0x57,0xf,0xd,0xd,0x3d,
+ 0x9d,0x4a,0xa5,0x6e,0xe9,0xed,0xed,0x5d,0x1b,0x8b,0xc5,0x96,0x54,0x2a,0x95,0x83,
+ 0x41,0x10,0x4c,0x39,0x7e,0xfc,0x78,0x45,0x4a,0xe9,0x4e,0x9a,0x34,0x89,0x5a,0x96,
+ 0xb5,0x36,0x97,0xcb,0x2d,0xab,0x56,0xab,0xbb,0x86,0x86,0x86,0x66,0xd,0xe,0xe,
+ 0x56,0x38,0xe7,0x16,0x0,0x8,0x21,0x4a,0x61,0x18,0x16,0x82,0x20,0x90,0xc6,0x18,
+ 0x3a,0x6a,0xd4,0x28,0xca,0x39,0xdf,0xa7,0x41,0x7e,0x99,0x88,0x39,0xb4,0x35,0x13,
+ 0x47,0xc2,0xb6,0x0,0xc,0xd7,0x2,0xcb,0xb2,0xfa,0x46,0xea,0xfc,0x59,0x1,0xd8,
+ 0xd4,0xd0,0x44,0x32,0x6,0x6d,0xc,0x2,0xe,0x64,0x5d,0xb,0x4,0x40,0x4b,0x5d,
+ 0x42,0x71,0x69,0x8e,0x1e,0x38,0x70,0x40,0x48,0x29,0x59,0x43,0x43,0xc3,0xce,0x20,
+ 0x8,0xe6,0x56,0x2a,0x95,0xdf,0x58,0x96,0x75,0x7,0x80,0x13,0x95,0x4a,0x65,0x6f,
+ 0x4d,0x4d,0xcd,0x12,0xc6,0xd8,0x18,0xa5,0xd4,0xa6,0x20,0x8,0x2e,0x3e,0x72,0xe4,
+ 0x48,0xf,0x63,0xac,0xd5,0xb6,0xed,0xa,0x63,0xac,0x66,0xe9,0xd2,0xa5,0x8,0xc3,
+ 0x70,0x7b,0xa1,0x50,0x98,0xd3,0xd5,0xd5,0x75,0xc0,0x71,0x9c,0x8b,0x8c,0x31,0x3d,
+ 0x51,0x14,0x8d,0x1,0x0,0xc6,0x98,0xb5,0x68,0xd1,0x22,0xbb,0x54,0x2a,0x29,0xad,
+ 0xb5,0xdb,0xd8,0xd8,0x48,0x94,0x52,0x1d,0xa9,0x54,0xea,0xa2,0x4,0x51,0x87,0xc7,
+ 0x4d,0x1b,0xdd,0xf4,0xc9,0x2f,0xdf,0x8c,0x8f,0x7f,0x72,0x31,0x3e,0x72,0xdd,0x54,
+ 0x34,0x16,0xb2,0xa0,0x94,0x0,0x40,0x64,0x59,0xd6,0x88,0xd7,0x3a,0xcf,0x66,0x48,
+ 0x62,0x31,0x17,0x46,0x6b,0xb8,0x16,0x85,0x4d,0x9,0x1c,0x8b,0xa0,0xbe,0xc6,0x2d,
+ 0x1e,0xea,0x1e,0xe,0xb1,0x72,0xb9,0xfc,0x72,0x26,0x93,0x59,0xa6,0xb5,0x1e,0x48,
+ 0x26,0x93,0xbb,0x82,0x20,0xb8,0x9f,0x10,0xf2,0xf,0xa9,0x54,0xea,0xae,0x20,0x8,
+ 0xc6,0x4a,0x29,0x77,0x14,0xa,0x85,0x8b,0xa3,0x28,0x1a,0x5a,0xb4,0x68,0x51,0xb6,
+ 0x52,0xa9,0x14,0x5b,0x5a,0x5a,0xb2,0x5d,0x5d,0x5d,0x47,0xb4,0xd6,0xd3,0x7d,0xdf,
+ 0x7f,0x2a,0x1e,0x8f,0x3f,0xd0,0xd9,0xd9,0xf9,0xb7,0xa9,0x54,0x2a,0xd6,0xdf,0xdf,
+ 0x6f,0xd2,0xe9,0xb4,0x5a,0xb0,0x60,0x41,0xe6,0xc8,0x91,0x23,0xbb,0x87,0x86,0x86,
+ 0x66,0x1,0xd8,0xa2,0x94,0x3a,0x98,0xcf,0xe7,0x27,0x96,0x4a,0xa5,0x35,0xf9,0x7c,
+ 0x7e,0xf9,0xa2,0x5a,0xb7,0x3a,0x6d,0x7a,0xbd,0x35,0x34,0xd0,0xd,0xce,0x4a,0x98,
+ 0xd4,0x66,0x61,0xc6,0xd4,0x29,0x10,0xd2,0x42,0x57,0x77,0xf9,0x53,0x65,0x9f,0x5f,
+ 0x3b,0x38,0xe8,0x6d,0xad,0x84,0x7a,0x5f,0x2c,0x91,0x59,0xb5,0xfa,0xb5,0x23,0xaf,
+ 0x9f,0x73,0x4,0xe4,0x73,0xc9,0xa2,0x65,0x11,0x6d,0x60,0x90,0x8a,0x5b,0x0,0x1,
+ 0x5c,0x8b,0xa0,0x36,0xed,0x94,0x9f,0x78,0xe9,0x90,0x1,0x0,0x4a,0xe9,0xef,0x8a,
+ 0xc5,0xe2,0xd,0x9e,0xe7,0xbd,0x74,0xaa,0x1e,0xf4,0x1b,0x63,0x8a,0x4a,0xa9,0xb1,
+ 0x5a,0x6b,0x9f,0x31,0xf6,0x2a,0xe7,0xfc,0x43,0x9e,0xe7,0xbd,0x6c,0x8c,0xb9,0xda,
+ 0xf7,0xfd,0x4d,0x9e,0xe7,0x5d,0xc2,0x39,0xff,0xb7,0x72,0xb9,0x7c,0x5f,0x4f,0x4f,
+ 0x4f,0xa7,0x10,0xa2,0xb9,0xa9,0xa9,0xc9,0x91,0x52,0x92,0x79,0xf3,0xe6,0x25,0xa2,
+ 0x28,0x7a,0x34,0x8a,0xa2,0xbb,0x8d,0x31,0x1b,0x2a,0x95,0xca,0x42,0x0,0xf0,0x7d,
+ 0xff,0xd,0xdb,0xb6,0xe7,0x7,0x41,0xb0,0x4d,0x73,0xb6,0x60,0xfc,0xe8,0xdc,0x6d,
+ 0x85,0xba,0x24,0xc2,0xaa,0xf,0xce,0x19,0x38,0x17,0x18,0x3c,0x59,0x44,0xef,0xb1,
+ 0x4e,0x54,0x8b,0x27,0x8,0x65,0x3,0xad,0x63,0xeb,0x71,0xeb,0x8c,0x56,0xfa,0xd5,
+ 0x89,0x8d,0xfc,0x9f,0xcf,0x16,0x1,0xef,0xa,0x20,0x99,0x8e,0xb,0xa5,0x8d,0xd1,
+ 0xca,0x20,0x93,0xb4,0x41,0x1,0x58,0x94,0x20,0x1e,0xb7,0xdf,0xea,0x87,0xf,0x1c,
+ 0x38,0xe0,0x49,0x29,0x53,0xc9,0x64,0xf2,0xb5,0x4a,0xa5,0xb2,0xcc,0xf3,0xbc,0x57,
+ 0x28,0xa5,0xd7,0x28,0xa5,0x64,0x18,0x86,0x2b,0x93,0xc9,0xe4,0xf5,0x42,0x88,0x2c,
+ 0x80,0xe7,0x7c,0xdf,0xbf,0x19,0xc0,0x4b,0x95,0x4a,0xe5,0x9a,0xee,0xee,0xee,0x13,
+ 0x52,0xca,0xc2,0xf8,0xf1,0xe3,0x9,0x21,0xe4,0xe5,0x4c,0x26,0x33,0xbf,0x5a,0xad,
+ 0xbe,0xa4,0x94,0xba,0x46,0x8,0xb1,0x96,0x31,0xb6,0x0,0xc0,0x76,0x0,0x4b,0x27,
+ 0x4e,0x9c,0x48,0x38,0xe7,0x9b,0x83,0x20,0x98,0x5f,0xa9,0x54,0x78,0xc6,0x36,0xd,
+ 0x63,0xe7,0x8c,0x99,0xea,0x95,0xfa,0x11,0x45,0x11,0x24,0x97,0x90,0x42,0x42,0x30,
+ 0x81,0x30,0xe2,0x10,0x52,0x11,0xa5,0x34,0xa9,0xf8,0x11,0xa9,0xf8,0x51,0xe7,0x89,
+ 0x93,0xde,0x47,0xcf,0xb,0x80,0x91,0x6,0x5a,0xd,0xbf,0x59,0xd7,0x64,0x1c,0x50,
+ 0x42,0x60,0x53,0x8a,0x42,0x7d,0xea,0xe4,0xe9,0x76,0xa5,0x52,0xe9,0x9,0xdb,0xb6,
+ 0xaf,0x63,0x8c,0xc5,0x9,0x21,0xed,0x95,0x4a,0xe5,0xfa,0x28,0x8a,0x56,0x25,0x12,
+ 0x89,0xa9,0x42,0x88,0xd1,0x9c,0xf3,0xcd,0xf9,0x7c,0x7e,0x8e,0x52,0x6a,0x20,0x9d,
+ 0x4e,0xc7,0xb4,0xd6,0x85,0x4b,0x2f,0xbd,0xd4,0x66,0x8c,0xed,0xcf,0xe7,0xf3,0x53,
+ 0x87,0x86,0x86,0x5e,0x77,0x5d,0xf7,0x62,0x29,0xe5,0x33,0xd5,0x6a,0xf5,0xc6,0x81,
+ 0x81,0x1,0xa3,0x94,0xe2,0x8e,0xe3,0x18,0x4a,0xe9,0xe,0xdb,0xb6,0x27,0x1,0x28,
+ 0x2b,0xa5,0x32,0x57,0x8c,0xc9,0xe5,0xa5,0x88,0x96,0xd6,0xb4,0x16,0x50,0xad,0x54,
+ 0x20,0x22,0x3e,0xec,0x3c,0x17,0x88,0x22,0x8e,0x28,0x14,0xa7,0xf,0x8d,0x3,0xb8,
+ 0xe6,0xc9,0xd7,0x2a,0x47,0xce,0xb,0x80,0x32,0x1a,0x5a,0x2b,0x18,0xa5,0x51,0x93,
+ 0x75,0x41,0x9,0x10,0xb3,0x29,0x2c,0xa2,0xbb,0x4f,0xb7,0x93,0x52,0xae,0xa9,0x54,
+ 0x2a,0x97,0x55,0xab,0xd5,0x5f,0xc7,0xe3,0xf1,0x8f,0x2,0x38,0x1e,0x86,0x61,0x57,
+ 0x18,0x86,0x97,0x3,0x38,0x2c,0x84,0xd8,0xc3,0x39,0xbf,0xd5,0xf7,0xfd,0x87,0x8d,
+ 0x31,0x9f,0x15,0x42,0x3c,0xeb,0x79,0xde,0x2d,0x8c,0xb1,0xa7,0x7c,0xdf,0xbf,0xcb,
+ 0x18,0xb3,0x3b,0xc,0xc3,0x79,0x7d,0x7d,0x7d,0xa1,0xd6,0x5a,0x35,0x34,0x34,0x64,
+ 0xa5,0x94,0x7d,0xb9,0x5c,0xae,0x10,0x86,0xe1,0x21,0xc6,0xd8,0xa8,0x72,0xb9,0xc,
+ 0x63,0xcc,0x40,0xcc,0xb6,0x1f,0x5a,0x36,0xa3,0x50,0x1b,0xf8,0x43,0x60,0x61,0x4,
+ 0x29,0x14,0x84,0x50,0xe0,0x4c,0x22,0xc,0x39,0x94,0x79,0xdb,0x12,0xe0,0xd7,0x57,
+ 0xb6,0x7b,0xef,0xb9,0x39,0xf2,0xee,0x0,0xa4,0xb2,0xb5,0x32,0x44,0x6b,0x83,0xda,
+ 0xbc,0xb,0x60,0xb8,0x8,0xc2,0xa8,0xa1,0xd3,0xed,0xfa,0xfa,0xfa,0x22,0xa5,0x94,
+ 0x95,0xc9,0x64,0x5e,0xe7,0x9c,0x2f,0xaa,0x54,0x2a,0x4f,0xa6,0xd3,0xe9,0x15,0xc6,
+ 0x18,0x16,0x4,0xc1,0x63,0xb6,0x6d,0xdf,0x2c,0xa5,0xac,0xb1,0x6d,0xfb,0xa4,0x94,
+ 0x72,0x14,0x80,0x67,0xc2,0x30,0xbc,0xe,0xc0,0x7e,0xad,0xf5,0x68,0x0,0x49,0x63,
+ 0xcc,0xc0,0xd8,0xb1,0x63,0xb,0x5a,0xeb,0x17,0x93,0xc9,0xe4,0xb2,0x20,0x8,0xe,
+ 0x6a,0xad,0xa7,0x6b,0xad,0xf,0xf8,0xbe,0x3f,0x1d,0x0,0x1c,0x2d,0xd7,0x55,0x41,
+ 0xbf,0x34,0x6b,0x61,0x2b,0x7c,0xaf,0x2,0xce,0x5,0xa4,0x94,0x10,0xe2,0xd4,0xd3,
+ 0xe7,0x6f,0x7b,0xfa,0x4f,0x3,0xf8,0xce,0x7b,0x39,0x7f,0x76,0x0,0x4a,0xd7,0x29,
+ 0xa5,0xa9,0x31,0x6,0x6e,0x8c,0x22,0x11,0xb3,0x40,0x29,0x45,0x36,0x9f,0xec,0x7e,
+ 0xa7,0x6d,0x10,0x4,0x8f,0x0,0xb8,0x8f,0x52,0xda,0x61,0x8c,0xa9,0xa,0x21,0xa6,
+ 0x73,0xce,0x5f,0x72,0x5d,0x77,0xaa,0xd6,0x3a,0x27,0xa5,0xfc,0xf,0xcb,0xb2,0xee,
+ 0x23,0x84,0xb4,0x3b,0x8e,0xb3,0x58,0x29,0xa5,0xeb,0xea,0xea,0x12,0x4a,0xa9,0xf6,
+ 0x44,0x22,0x31,0x3b,0x8a,0xa2,0x67,0x2d,0xcb,0xba,0xcd,0xf7,0xfd,0x75,0x0,0x96,
+ 0x6a,0xad,0x37,0x55,0xab,0xd5,0x4b,0x0,0xec,0x35,0xc6,0xcc,0x3,0x80,0x1a,0xe9,
+ 0x2f,0x6d,0x99,0xd0,0x48,0xb8,0xc,0x11,0x85,0x11,0xa4,0x18,0xce,0x7d,0x1e,0x9,
+ 0x84,0x21,0x3b,0x7d,0x38,0x3,0x0,0xee,0x5f,0xd9,0xee,0x99,0x77,0x8e,0xf3,0x9c,
+ 0x0,0x68,0x65,0xfa,0x94,0x56,0x4a,0x69,0x5,0x29,0x24,0xea,0x72,0xf1,0xe1,0x29,
+ 0xd1,0x75,0xe4,0x1f,0xc3,0x52,0xeb,0x39,0xe7,0xb,0x84,0x10,0x2b,0x63,0xb1,0xd8,
+ 0x9f,0x6a,0xad,0x23,0xc6,0xd8,0x1e,0x21,0xc4,0xa,0x0,0x1d,0x61,0x18,0x96,0xb5,
+ 0xd6,0xf3,0xca,0xe5,0xf2,0xf3,0xb6,0x6d,0x5f,0xce,0x18,0x5b,0x15,0x45,0xd1,0xbd,
+ 0xd5,0x6a,0x75,0xf,0x21,0x64,0x6,0xe7,0x7c,0x9d,0x94,0x72,0xb9,0x31,0x66,0x50,
+ 0x29,0x55,0x3,0xe0,0xb0,0x52,0x6a,0x5c,0xa9,0x54,0x52,0x0,0x6,0x16,0x8f,0x6f,
+ 0x5e,0x2c,0x8d,0x79,0x60,0xde,0x9c,0x2,0x2a,0xe5,0x12,0x4,0x17,0x90,0x4a,0x42,
+ 0x8,0x89,0x20,0xe2,0x10,0xea,0x6d,0xa1,0xff,0x95,0x95,0xed,0xde,0xc0,0x48,0x9c,
+ 0x3f,0x2b,0x0,0xa5,0x75,0x68,0x94,0x8e,0x8c,0x32,0xd0,0x4a,0xa1,0x3e,0x1f,0x83,
+ 0xd1,0x6,0xc5,0x41,0x7f,0xfc,0x3b,0x6d,0xfb,0xfb,0xfb,0x61,0x59,0xd6,0xeb,0x51,
+ 0x14,0xd5,0x1,0xc8,0x86,0x61,0xf8,0x48,0x2a,0x95,0xba,0x4e,0x6b,0xed,0x30,0xc6,
+ 0x1e,0x75,0x5d,0xf7,0x1e,0x42,0xc8,0x9,0xa5,0x94,0xe1,0x9c,0xb7,0x69,0xad,0x57,
+ 0x73,0xce,0x2f,0x23,0x84,0xec,0x10,0x42,0x2c,0xa7,0x94,0x1a,0x0,0x27,0x28,0xa5,
+ 0xb5,0x4a,0xa9,0x20,0x9d,0x4e,0x27,0x1,0xf4,0xb7,0xb6,0xb6,0x4e,0x95,0x42,0x3c,
+ 0x1f,0x49,0xf9,0xd4,0xbc,0x49,0xf5,0x85,0x78,0x4c,0x22,0xa,0x19,0x84,0x50,0x90,
+ 0x42,0x81,0x45,0x2,0x51,0xf4,0xb6,0xd0,0xff,0x2d,0x80,0xff,0x18,0xa9,0xf3,0x67,
+ 0x5,0xf0,0x93,0x67,0xfb,0xa5,0x52,0x86,0x2b,0xad,0xa1,0x94,0x46,0x5d,0x6d,0xc,
+ 0x0,0x41,0x77,0x4f,0x30,0xe1,0x4c,0xf6,0xbe,0xef,0x3f,0x1e,0x8b,0xc5,0xee,0x20,
+ 0x84,0x1c,0xd2,0x5a,0x73,0x29,0xe5,0x5c,0xce,0xf9,0x1a,0xd7,0x75,0xa7,0x19,0x63,
+ 0x1a,0x38,0xe7,0xcf,0xa4,0x52,0xa9,0x9b,0x8c,0x31,0x6f,0xd8,0xb6,0x3d,0xc7,0x18,
+ 0xd3,0x9f,0x4c,0x26,0x73,0x84,0x90,0x97,0x6c,0xdb,0x5e,0x2c,0xa5,0x5c,0xed,0xba,
+ 0xee,0xa,0xce,0xf9,0x5a,0x42,0xc8,0x35,0x52,0xca,0x7f,0x11,0x42,0xdc,0x3b,0x23,
+ 0x65,0x74,0x24,0x4d,0xdd,0xb4,0xf9,0x2d,0xa8,0x94,0x3c,0x48,0x2e,0xa1,0x95,0x82,
+ 0x60,0x12,0xd5,0x80,0xbd,0xb5,0x60,0xb,0xc0,0x7,0xf0,0xf9,0x91,0x86,0xfe,0x7b,
+ 0x2,0x0,0x0,0x25,0xf5,0xa0,0x52,0x1a,0x5a,0x1b,0x14,0xea,0x86,0x67,0x82,0x28,
+ 0x12,0xf1,0x33,0xd9,0xf6,0xf6,0xf6,0xf6,0x32,0xc6,0xc6,0x44,0x51,0xf4,0x74,0x32,
+ 0x99,0xbc,0xc6,0x18,0xd3,0x23,0x84,0xd8,0x2e,0xa5,0xbc,0x1a,0xc3,0x21,0x7d,0x52,
+ 0x4a,0x39,0xdf,0xf7,0xfd,0x27,0x8,0x21,0x77,0x57,0xab,0xd5,0x55,0x5a,0xeb,0x8f,
+ 0x86,0x61,0xf8,0x4,0xa5,0xf4,0xe6,0x28,0x8a,0x56,0x6b,0xad,0xaf,0x52,0x4a,0xbd,
+ 0xc0,0x18,0x5b,0xa1,0xb5,0xee,0x31,0x5a,0xb7,0x9c,0x8,0xf8,0xb7,0xc7,0x36,0xa7,
+ 0x60,0xc5,0x5,0xa2,0x20,0x3a,0x55,0xf8,0xd4,0x9b,0x73,0xfe,0x5b,0xf7,0x97,0xa,
+ 0x3f,0x5c,0xd9,0xee,0x8d,0x78,0x57,0x78,0x44,0x0,0xb4,0x31,0x5b,0xb5,0x54,0xd0,
+ 0x4a,0x21,0x9b,0x77,0x60,0x5b,0x14,0x3c,0x32,0xef,0xba,0xf9,0xe9,0xba,0xee,0xba,
+ 0x20,0x8,0x1a,0xa4,0x94,0x93,0xa3,0x28,0x7a,0x3e,0x99,0x4c,0x5e,0xa1,0x94,0x4a,
+ 0x55,0xab,0xd5,0x35,0xae,0xeb,0xde,0x4,0xa0,0x4a,0x29,0x15,0xc6,0x98,0x84,0x31,
+ 0xe6,0x30,0x63,0x6c,0x89,0x10,0xa2,0x5f,0x6b,0xdd,0x4c,0x8,0xa1,0xc6,0x18,0xd,
+ 0x40,0x1a,0x63,0x5c,0x4a,0xa9,0x15,0xa3,0x86,0xe5,0x62,0xf6,0xc2,0x45,0xb,0x1b,
+ 0xe1,0xd,0x55,0x20,0x85,0x84,0x12,0x1a,0x8c,0x71,0x4,0x21,0xff,0xc3,0x38,0x81,
+ 0x57,0x8f,0xf6,0xa9,0x6f,0x9d,0xab,0xf3,0xef,0xd,0x40,0x9b,0xb5,0x4a,0x69,0x28,
+ 0xad,0x21,0xb8,0x40,0x53,0x21,0x9,0xc6,0xcd,0xa8,0x2f,0xdf,0x3f,0xff,0x8c,0xf6,
+ 0x51,0x14,0xfd,0x36,0x1e,0x8f,0xdf,0xaa,0x94,0x8a,0x84,0x10,0x5b,0xa4,0x94,0xb,
+ 0x94,0x52,0x2f,0xc7,0xe3,0xf1,0xac,0x10,0x62,0xb6,0x94,0xf2,0xd1,0x58,0x2c,0x76,
+ 0x87,0xeb,0xba,0xbf,0xb0,0x2c,0xeb,0x4e,0x42,0xc8,0x76,0xdb,0xb6,0x27,0xd9,0xb6,
+ 0xfd,0x14,0x21,0xe4,0x2a,0x63,0xcc,0x36,0xc7,0x71,0x66,0x2a,0xa5,0xb6,0xb8,0xae,
+ 0x3b,0x3b,0xd,0x19,0xb4,0x8e,0x2b,0x90,0x44,0x5c,0x81,0x45,0x1c,0x4a,0xe9,0xe1,
+ 0xc2,0x17,0xf2,0xd3,0x43,0xff,0x8,0x5,0xee,0x78,0x6d,0x7f,0x75,0xc4,0x5b,0xe2,
+ 0x23,0x6,0x60,0x8c,0x69,0x57,0x4a,0x9f,0xba,0xb1,0x42,0x73,0x21,0x81,0x30,0xd4,
+ 0x63,0x4a,0x15,0x35,0xf1,0x4c,0xf6,0x27,0x4f,0x9e,0x2c,0x2,0xc8,0x32,0xc6,0x9e,
+ 0x8a,0xc7,0xe3,0x1f,0x1,0xd0,0xcd,0x18,0xdb,0xaa,0xb5,0xbe,0xc5,0x18,0x73,0x54,
+ 0x6b,0x3d,0xa0,0xb5,0x9e,0xc3,0x18,0x7b,0xdd,0xb2,0xac,0xf9,0x61,0x18,0xae,0x71,
+ 0x1c,0x67,0x5,0x63,0x6c,0x9d,0x65,0x59,0x8b,0x39,0xe7,0x6b,0x8,0x21,0x57,0xb,
+ 0x21,0xd6,0x10,0xc9,0xbf,0xc8,0x58,0xf4,0xc0,0xdc,0xf9,0xd,0xa8,0x94,0x2a,0x46,
+ 0xa,0x69,0xa4,0x1a,0x2e,0x7c,0x42,0xbc,0x15,0xfa,0x55,0x0,0x37,0xac,0x6c,0xf7,
+ 0xde,0x73,0xf,0xf0,0xbc,0x0,0x68,0x6d,0xf6,0x2b,0x65,0x7c,0x75,0x2a,0xd,0x1a,
+ 0x9a,0x63,0x28,0x95,0x23,0x2b,0x4e,0xcd,0xec,0x77,0xbb,0x86,0x10,0xb2,0x4f,0x6b,
+ 0x7d,0x5c,0x29,0x75,0x9,0xe7,0xfc,0xb7,0x8e,0xe3,0x2c,0xd7,0x5a,0xd3,0x28,0x8a,
+ 0x9e,0xb0,0x6d,0xfb,0x4e,0x63,0xcc,0x0,0x63,0xac,0x11,0xc0,0x90,0x31,0xe6,0xa8,
+ 0x94,0x72,0x61,0x18,0x86,0x7d,0x4a,0xa9,0x6,0x63,0xcc,0x1,0xad,0xf5,0x44,0x8b,
+ 0x60,0x7f,0xc6,0xc6,0xf5,0xf3,0xa6,0xd4,0x27,0xa8,0x9,0xc1,0x38,0x27,0x4a,0x6b,
+ 0x22,0x98,0x44,0xc4,0xc4,0xe9,0x4f,0xff,0x73,0x2b,0xdb,0xbd,0x7d,0xe7,0xeb,0xfc,
+ 0x7b,0x2,0xf8,0xf9,0xef,0x8b,0x52,0x69,0xbd,0x51,0x29,0xd,0x21,0x15,0xb2,0x39,
+ 0x1b,0x8e,0x4d,0xb1,0x7b,0x57,0xef,0xd4,0x77,0xbb,0xc6,0xf7,0xfd,0xb5,0xc9,0x64,
+ 0x72,0xb9,0x31,0x26,0x64,0x8c,0x1d,0x4,0x30,0x59,0x8,0xb1,0xcd,0x71,0x9c,0x9c,
+ 0x94,0x72,0x82,0x10,0xe2,0x51,0xc7,0x71,0xee,0x26,0x84,0xbc,0x68,0xdb,0xf6,0x72,
+ 0x0,0x7,0x6d,0xdb,0x9e,0xc,0x20,0x30,0xc6,0xd4,0x1a,0x63,0xd8,0xa8,0x98,0x59,
+ 0x4c,0x88,0x29,0xcc,0x5d,0x50,0xf,0xbf,0xec,0x43,0x49,0xd,0xf5,0x66,0xe1,0x53,
+ 0x6f,0x3d,0xfd,0xdf,0xe0,0x1c,0xa7,0xbc,0x73,0x6,0x0,0x0,0x5a,0x99,0xd5,0x4a,
+ 0x68,0x28,0x35,0x9c,0x87,0xa3,0x9b,0x53,0x38,0xd9,0x5f,0xbd,0x35,0x1e,0x8f,0x9f,
+ 0x71,0xe7,0x45,0x29,0xb5,0x95,0x73,0xbe,0x54,0x8,0xb1,0x3a,0x91,0x48,0xdc,0xa0,
+ 0xb5,0x76,0xa2,0x28,0x7a,0xde,0x18,0x73,0x93,0x52,0xaa,0xaa,0xb5,0xee,0x55,0x4a,
+ 0x4d,0xaf,0x56,0xab,0x6b,0x9,0x21,0x57,0x71,0xce,0x7f,0x69,0x59,0xd6,0xdd,0x52,
+ 0xca,0xa7,0x1c,0xc7,0xb9,0xc5,0x56,0x7c,0x75,0x45,0xe2,0x97,0x73,0xa6,0xd4,0x90,
+ 0x30,0xa8,0x40,0xa,0x5,0xa3,0xc,0x18,0x17,0x60,0xfc,0xad,0x1e,0x6c,0x10,0xc0,
+ 0x67,0x57,0xb6,0x8f,0x78,0xe5,0xeb,0xfc,0x1,0x18,0x63,0x7e,0x2f,0x95,0x86,0x12,
+ 0x1a,0x52,0x8,0x8c,0x6e,0x4e,0xc0,0x21,0x98,0x97,0x75,0xc8,0xc5,0x67,0xb2,0xf,
+ 0xc3,0x50,0x53,0x4a,0xb7,0x6b,0xad,0x8f,0x4b,0x29,0x6f,0x92,0x52,0x3e,0x99,0x4c,
+ 0x26,0x97,0x2a,0xa5,0x9a,0x19,0x63,0xbf,0x71,0x1c,0xe7,0x66,0x0,0x3b,0x95,0x52,
+ 0x53,0xb4,0xd6,0x3a,0x8a,0xa2,0x3e,0xad,0xf5,0x4,0xc6,0xd8,0x46,0xa,0xb3,0x3c,
+ 0xa6,0xf9,0x50,0x4d,0x2e,0x31,0x66,0xf6,0xcc,0x2c,0xc2,0x6a,0x74,0xaa,0xfe,0x8,
+ 0x44,0xe1,0xdb,0x42,0xff,0x6b,0x2b,0xdb,0xbd,0xf7,0x75,0xf0,0x62,0xc4,0x0,0xb4,
+ 0x36,0x3b,0x94,0xd1,0x27,0x94,0xd2,0x90,0x42,0xa3,0xa6,0x31,0x6,0xc7,0xa6,0xa4,
+ 0xc6,0xa5,0x5f,0x7e,0xb7,0x6b,0x82,0x20,0xf8,0xed,0xa9,0x69,0xef,0x4,0xe7,0x7c,
+ 0xab,0x52,0xea,0xa,0x0,0x2f,0xd9,0xb6,0x9d,0x93,0x52,0x2e,0x94,0x52,0x3e,0xe1,
+ 0xba,0xee,0xad,0x94,0xd2,0x55,0x8e,0xe3,0x7c,0x98,0x52,0xfa,0x3c,0x21,0xe4,0x32,
+ 0x87,0x92,0xae,0x48,0xe9,0x87,0xaf,0xb9,0xb4,0x1e,0x5e,0xc9,0x83,0x3c,0x15,0x79,
+ 0x61,0x24,0x4e,0xf,0xfd,0x97,0x1,0x3c,0x7c,0x21,0x9c,0x7,0x46,0x0,0xe0,0x17,
+ 0x2f,0x95,0xb8,0x51,0xe6,0x39,0xa5,0x14,0x84,0x92,0x10,0x51,0x84,0x96,0xa6,0x14,
+ 0x52,0x36,0xb9,0xa3,0x35,0x9f,0x1c,0x77,0xa6,0x6b,0x94,0x52,0x1d,0x5a,0xeb,0x36,
+ 0x29,0xe5,0x8b,0x89,0x44,0xe2,0x6a,0x42,0xc8,0xc9,0x30,0xc,0xb7,0x51,0x4a,0x57,
+ 0x18,0x63,0x7a,0x95,0x52,0xc6,0x18,0x33,0xda,0xf7,0xfd,0x75,0x94,0xd2,0x2b,0x95,
+ 0x52,0xcf,0xa7,0x13,0xb1,0x5b,0x35,0x8f,0xea,0xe6,0x4c,0x6e,0x9a,0x94,0xca,0x68,
+ 0xb0,0x48,0x40,0x6b,0xd,0xce,0xe4,0xe9,0xa1,0xaf,0xa4,0xc6,0x5f,0xae,0x6c,0xf7,
+ 0x2e,0xd8,0x49,0xb4,0x11,0xed,0xa1,0x6b,0x6d,0x1e,0x13,0xa7,0xd2,0x80,0x33,0x89,
+ 0x31,0xa3,0x13,0x20,0x84,0x58,0x85,0x98,0xf5,0x57,0x67,0xb2,0x8f,0xa2,0x8,0x84,
+ 0x90,0xdd,0x4a,0xa9,0xb2,0xd6,0x7a,0x9,0x80,0x47,0x63,0xb1,0xd8,0x32,0xad,0x75,
+ 0x8e,0x31,0xf6,0xac,0xeb,0xba,0x57,0xd8,0xb6,0xfd,0x2,0x80,0x2b,0x29,0xa5,0xaf,
+ 0x57,0xab,0xd5,0x89,0x29,0x8b,0x64,0xd3,0xe,0x3e,0x75,0xe9,0xc2,0x5a,0xf8,0x43,
+ 0x55,0x68,0xa9,0x21,0x95,0x7a,0x5b,0xd5,0x17,0xa,0xff,0xf4,0xdc,0x16,0xf6,0xae,
+ 0xeb,0x7b,0xe7,0xa3,0x11,0x1,0x50,0x46,0xaf,0x35,0x4a,0x57,0x85,0x52,0x10,0x42,
+ 0x22,0x93,0xb7,0x10,0x8b,0xd9,0x70,0x28,0xf9,0xf4,0xbc,0xc6,0xcc,0x19,0xbb,0xa2,
+ 0x28,0x8a,0x9e,0x74,0x5d,0x77,0x85,0x31,0xc6,0x4,0x41,0x70,0x4,0xc0,0x74,0x63,
+ 0xcc,0xe,0xdb,0xb6,0x5d,0x21,0xc4,0x52,0xad,0xf5,0xef,0x1c,0xc7,0xb9,0x26,0x95,
+ 0x4a,0x3d,0x56,0x93,0x8c,0xdd,0xcc,0xa4,0x9c,0xb9,0x7c,0x71,0xb,0x8d,0xaa,0x1e,
+ 0xb8,0x10,0x50,0x46,0x23,0x3a,0x2d,0xf4,0xb5,0xc6,0xb6,0xbe,0xb2,0x7e,0xd0,0xf3,
+ 0xd9,0x99,0x6e,0x77,0xde,0x1a,0x11,0x80,0x95,0xed,0x5e,0x20,0xb5,0x79,0x6e,0xb8,
+ 0x10,0x2a,0x44,0x41,0x84,0x71,0xad,0x69,0x28,0x63,0xac,0xb8,0x45,0xfe,0xc7,0xa5,
+ 0xa3,0xb2,0x7f,0x34,0x23,0x9c,0x4a,0x83,0x71,0x4a,0xa9,0xe7,0xe2,0xf1,0xf8,0x4d,
+ 0xc6,0x18,0xc1,0x18,0xfb,0x35,0x21,0xe4,0x66,0x0,0x83,0x42,0x88,0xb8,0x65,0x59,
+ 0xe9,0xfe,0xfe,0xfe,0x1e,0xd7,0x22,0x57,0x4e,0x1e,0x95,0x9c,0x39,0xaa,0xd1,0x42,
+ 0xe8,0x33,0xc0,0x0,0x92,0xa9,0xd3,0x43,0xdf,0xa7,0x14,0x37,0xb6,0xef,0x18,0xf9,
+ 0x1,0xc8,0x91,0x6a,0xc4,0x87,0x8a,0x8d,0x31,0x4f,0x29,0xa5,0x21,0x94,0xd2,0x9c,
+ 0xb,0x8c,0x6e,0x8d,0x1,0x94,0xc0,0x18,0x5c,0x6b,0x13,0x72,0xed,0x3b,0xed,0x19,
+ 0x63,0x30,0xc6,0x74,0x6a,0xad,0xf,0x28,0xa5,0x56,0x28,0xa5,0x36,0x27,0x12,0x89,
+ 0x49,0xc6,0x98,0x2c,0xe7,0xfc,0xf7,0x8e,0xe3,0x5c,0x6f,0xdb,0xf6,0x86,0xa6,0x94,
+ 0x7b,0x73,0x3c,0x66,0x8f,0x5f,0xb6,0xb4,0x1,0x5e,0xc9,0xc7,0x9b,0x9d,0x67,0xc0,
+ 0xde,0x6a,0x77,0x8d,0xd6,0xf8,0xd4,0xca,0x76,0xaf,0xe7,0x42,0x3a,0xfe,0xa6,0xce,
+ 0xe5,0xb4,0xf8,0x93,0xca,0xe8,0x48,0x49,0x4d,0x84,0x50,0x88,0xc2,0x10,0x13,0xc7,
+ 0xe7,0xc0,0x86,0xf7,0xe2,0x7f,0xb6,0x6c,0x4c,0xee,0x8f,0xda,0x63,0xce,0xf9,0xb3,
+ 0xae,0xeb,0x2e,0x27,0x84,0xf4,0xb,0x21,0x36,0x2a,0xa5,0x6e,0x23,0x84,0x6c,0xb0,
+ 0x2c,0x2b,0x32,0xc6,0x5c,0xa1,0x42,0x7f,0x3,0x37,0x78,0xe4,0xb6,0xe5,0xcd,0xd,
+ 0x51,0xa5,0x2,0xce,0x86,0xdf,0xed,0x83,0x53,0x7d,0x3f,0x0,0x48,0x8d,0x17,0x98,
+ 0x34,0x8f,0x5e,0x10,0x6f,0xcf,0xa0,0x11,0x3,0x58,0xd9,0xee,0x79,0x0,0x7e,0x2b,
+ 0xf5,0x30,0x0,0xc6,0x5,0x5a,0xdb,0x62,0x70,0x62,0x16,0xb8,0x36,0xcd,0x46,0x63,
+ 0xcd,0xa5,0xa3,0xb2,0x77,0x4f,0x6e,0x6b,0x78,0x6b,0xb3,0x45,0x6b,0xbd,0x53,0x29,
+ 0xb5,0x40,0x6b,0xfd,0x5c,0x32,0x99,0x5c,0x44,0x29,0xcd,0x29,0xa5,0xd6,0xc5,0xe3,
+ 0xf1,0xa5,0x16,0x41,0x6f,0xda,0x26,0xdf,0x58,0x36,0xbf,0x29,0x15,0x73,0x5,0xc2,
+ 0x53,0xef,0xf6,0x9c,0x4b,0xf0,0x3f,0x84,0xfe,0x1b,0x42,0xe2,0xfe,0x55,0x1b,0x2a,
+ 0x67,0x1c,0xd3,0x85,0x90,0x55,0x57,0x57,0x37,0x62,0xe3,0x59,0x6d,0xb1,0x23,0x0,
+ 0xfe,0xec,0xd4,0x39,0x3c,0x18,0xad,0xd1,0xd2,0x9c,0xc7,0x91,0xe3,0x3e,0x40,0x90,
+ 0x75,0x28,0xbd,0x73,0x42,0x73,0xe6,0xae,0x3f,0xb9,0xef,0xb2,0x52,0xc9,0xc7,0x9e,
+ 0xe3,0xdd,0x7d,0x72,0xc2,0x84,0x9,0xb,0x2c,0xcb,0x7a,0xad,0xa9,0xa9,0xe9,0xae,
+ 0x44,0x22,0xb1,0x7e,0xca,0x94,0x29,0xd4,0x75,0x9c,0x2b,0x93,0xd5,0xc1,0xd1,0x97,
+ 0x5d,0x3e,0xe7,0x43,0x97,0x5d,0xda,0x88,0xbe,0xee,0x93,0xe0,0x5c,0x42,0x6b,0x8d,
+ 0x30,0x14,0xc3,0x87,0xdc,0x86,0xd7,0xf6,0x3e,0xfa,0xeb,0x97,0xbd,0x83,0x1f,0x88,
+ 0xe7,0xa7,0x74,0x4e,0x0,0x2c,0xc7,0x39,0xd1,0x90,0x25,0x97,0x18,0x98,0x8b,0x8c,
+ 0x86,0x36,0x4,0xa4,0x50,0x9f,0x44,0x5b,0x63,0x3,0x12,0xa1,0x40,0x6b,0xda,0x46,
+ 0x4e,0xa9,0x2,0x91,0xf2,0x8e,0xfb,0x3f,0xf7,0xd1,0x7b,0x6e,0x5e,0x31,0xbf,0xf1,
+ 0x58,0x67,0xcf,0x86,0x42,0xe3,0xd8,0xeb,0x46,0x8d,0x1a,0x45,0x3b,0x3a,0x3a,0x1e,
+ 0x9d,0x3a,0x75,0xea,0x27,0x5b,0x33,0x76,0x62,0x56,0x93,0xfb,0x91,0xcf,0x3c,0xf4,
+ 0x10,0x5a,0xc6,0xcd,0xc2,0xc4,0xe9,0xb3,0x31,0xba,0x6d,0xc,0x38,0x2b,0xa2,0x5c,
+ 0xaa,0x40,0x4a,0x75,0x18,0xc0,0xd5,0x2b,0xdb,0xbd,0xf,0xfc,0x8,0xfe,0x39,0x1,
+ 0xe8,0x2d,0x72,0xcc,0x68,0x8d,0x6d,0xa7,0x94,0xdc,0x1f,0x8b,0x3b,0x6e,0x36,0x9b,
+ 0x44,0xbe,0x36,0x8b,0x59,0x8b,0x17,0x21,0xa5,0x15,0x8c,0x1f,0xc2,0xa5,0x6,0xbc,
+ 0x54,0xc5,0xc1,0x2d,0xbb,0x6a,0x47,0x4f,0x69,0x5e,0x36,0x67,0x46,0xfd,0x3d,0x93,
+ 0x26,0x4f,0x9f,0xd3,0x5c,0xab,0xc8,0xf8,0xf1,0x13,0xa6,0x95,0xfa,0x7,0x67,0xc5,
+ 0xfb,0xe,0xae,0xf8,0xf4,0xff,0xfa,0x9e,0x6d,0xd9,0x36,0x94,0x1c,0x9e,0xd6,0x8c,
+ 0x31,0xf0,0x87,0x4e,0x80,0x42,0x23,0xe6,0xd8,0x37,0x3e,0xfc,0x4c,0xdf,0xb6,0xf,
+ 0xca,0xe9,0xd3,0x75,0x4e,0x0,0x0,0x60,0xd7,0x31,0xd6,0x37,0xb3,0x2d,0x16,0xda,
+ 0x94,0x5e,0x4b,0x2d,0x2,0x8b,0x52,0x80,0x70,0x4c,0xbb,0xec,0x4a,0xa8,0x6a,0x19,
+ 0x26,0x60,0x88,0x11,0x3,0x8,0x81,0xce,0x2d,0x7,0x50,0x1c,0x18,0x24,0x8d,0x13,
+ 0x27,0x25,0xf2,0xa9,0xb0,0x2d,0x9f,0xa9,0x9f,0xdf,0xbb,0x63,0x6b,0xeb,0x3,0xdf,
+ 0x7c,0xc8,0x8e,0xa7,0x72,0x50,0x32,0x82,0xd6,0x2,0x4a,0x32,0x74,0x1f,0x7a,0x3,
+ 0x27,0x4f,0x1c,0x87,0x37,0x54,0xd9,0x5a,0xd,0xa2,0xaf,0xbd,0xb1,0xbf,0xfa,0x1,
+ 0xb9,0xfc,0x76,0x9d,0x33,0x0,0x0,0x98,0xd5,0x16,0x7b,0x4d,0x69,0x73,0x5,0x25,
+ 0xa4,0x8d,0x50,0x2,0x42,0xc,0x2c,0x4b,0x61,0xda,0xf2,0x5b,0x61,0x11,0x6,0x5d,
+ 0xf2,0x10,0xb7,0x0,0x9b,0x0,0xb4,0xc2,0xb1,0x66,0xdd,0x56,0x34,0x8c,0x1b,0x87,
+ 0xed,0xaf,0xef,0xc5,0x7d,0x9f,0xbd,0x1b,0xd9,0x86,0x36,0x68,0xc9,0x4f,0x1,0x50,
+ 0x18,0xe8,0xd9,0x87,0xce,0x8e,0x1d,0x18,0xea,0x2b,0xea,0x62,0xb1,0x72,0xf7,0xc3,
+ 0x4f,0xf7,0x1d,0xfb,0x0,0x7c,0x3d,0xa3,0xce,0xb,0xc0,0xce,0xa3,0xcc,0xcc,0x6c,
+ 0x8b,0xbd,0xa2,0xb5,0xb9,0xdf,0x22,0x24,0x46,0x60,0x60,0x20,0x60,0x59,0x6,0x13,
+ 0x97,0xdc,0x8a,0xda,0xb6,0x16,0x44,0xdd,0xc7,0x10,0xa7,0x80,0x31,0x1a,0x79,0xaa,
+ 0xf1,0x7a,0x67,0x84,0x8f,0xfd,0xc9,0xd,0x68,0x68,0x9b,0x1,0xad,0x4,0x94,0x8,
+ 0xa1,0xb5,0x42,0xb5,0xdc,0x83,0xc3,0xbb,0xd7,0x63,0xb0,0xaf,0xf,0xbd,0x3d,0x43,
+ 0x8f,0xf6,0xf,0x45,0x3f,0xd8,0xd7,0x75,0x61,0xbb,0xbd,0xb3,0xe9,0xbc,0x0,0x0,
+ 0xc0,0xce,0xa3,0xac,0x38,0x79,0xb4,0x3b,0x44,0x8c,0xb9,0x89,0x52,0xc0,0x40,0xc3,
+ 0xa8,0x8,0xd4,0x92,0x68,0x9a,0x74,0xa9,0x68,0x59,0x7c,0xbd,0x65,0x99,0x12,0xa8,
+ 0x5f,0x46,0xcc,0x6,0xae,0xfa,0xd3,0xbb,0xd0,0x3c,0x61,0xd6,0x70,0xc8,0x8b,0x10,
+ 0x5a,0x71,0xf0,0xd0,0x33,0x47,0xf7,0xbe,0x62,0x7a,0xbb,0x3b,0x49,0x57,0xe7,0x60,
+ 0xf9,0xc0,0x9,0x73,0xe7,0x73,0x9b,0x8a,0x23,0x3a,0xdd,0x75,0xa1,0x74,0xde,0x0,
+ 0x0,0x60,0x88,0x25,0x36,0x8f,0xaa,0xd1,0xcd,0x44,0x9b,0xf9,0x14,0x4,0x1a,0xa,
+ 0x5a,0x56,0x41,0x89,0xb4,0xd2,0x35,0x2d,0xa8,0x9d,0x71,0x2d,0xea,0xe7,0x2f,0x41,
+ 0xdd,0x8c,0x8b,0x90,0x69,0x1c,0x3,0xad,0x24,0x94,0x8c,0xa0,0x4,0x83,0x94,0x11,
+ 0x7a,0xe,0x6f,0x46,0xd7,0x91,0x7d,0xb4,0xf3,0x68,0x3f,0x76,0x1d,0x93,0x5f,0x5d,
+ 0xbb,0xf5,0xe4,0xef,0x2e,0xa0,0x6f,0x23,0xd2,0x39,0x7d,0x36,0xf7,0x4e,0xf5,0x9c,
+ 0x2c,0x99,0x81,0xb1,0x2d,0x9f,0x37,0xc6,0x1f,0xd,0x4,0x37,0x80,0xe,0x9f,0x22,
+ 0x23,0x64,0xb,0x0,0xa0,0xa9,0xed,0x62,0x24,0x72,0x13,0x91,0x4b,0x5f,0x9,0xad,
+ 0x42,0x94,0x7,0xe,0x61,0xe3,0xda,0x17,0x21,0x45,0x88,0xd0,0xf7,0xb0,0x7a,0xed,
+ 0xe,0xb2,0xef,0x68,0x11,0x51,0x55,0x20,0x61,0xd3,0x2f,0x8d,0xc9,0xc6,0x86,0xa4,
+ 0x31,0xff,0x79,0xa2,0xc2,0xcf,0x69,0x73,0xe3,0xfd,0xe8,0x7d,0x45,0x0,0x0,0x1c,
+ 0xe9,0xae,0xa8,0xda,0x7c,0x7c,0x55,0xcc,0x56,0x33,0x94,0x54,0x53,0xa0,0xc,0x94,
+ 0xe2,0xe0,0xdc,0x3,0xc,0x83,0xeb,0x50,0xb8,0xb1,0x14,0xa8,0x9d,0x41,0x22,0xdd,
+ 0x84,0xda,0x6c,0x23,0x7e,0xf5,0x9d,0x1f,0x62,0xdb,0x96,0x23,0x48,0x72,0x65,0xe6,
+ 0xd6,0xc4,0xc9,0x84,0x6c,0x1c,0x85,0x84,0x93,0x4f,0x38,0xd6,0xed,0x71,0x4a,0x6f,
+ 0x6f,0x4e,0xbb,0xde,0x98,0x6c,0xec,0x60,0xb7,0xcf,0xff,0x68,0x1f,0xf2,0x42,0xeb,
+ 0x7d,0x3,0x0,0x80,0xce,0x93,0x4c,0x36,0xd4,0xc4,0x57,0x59,0x44,0x4f,0xd3,0x42,
+ 0x4e,0x53,0x52,0x42,0x9,0x1,0x1e,0x95,0x21,0x79,0x5,0x8e,0x65,0xe0,0xba,0x16,
+ 0xa8,0x1d,0xc3,0xf1,0x9d,0x1b,0x31,0x86,0x9f,0xc0,0xcc,0xa6,0xc,0xda,0x52,0x36,
+ 0xa9,0x4f,0xbb,0x28,0x24,0x1c,0xd4,0x27,0x6c,0x34,0x25,0x6c,0x34,0x26,0xed,0xc6,
+ 0x9c,0x6b,0xdf,0xa9,0xc,0xe6,0x74,0x94,0xa2,0x5f,0x5e,0x0,0x1f,0xcf,0xaa,0xb,
+ 0x2,0x0,0x0,0x8e,0xf6,0x32,0x6d,0xbb,0xc9,0xc7,0x73,0x49,0x15,0x71,0x2e,0x96,
+ 0xb,0xce,0x89,0xe4,0x1c,0x9c,0x55,0x10,0x55,0x7,0xa0,0xa4,0x8f,0x62,0x5f,0x17,
+ 0xbe,0xfe,0xd5,0x6f,0xa3,0xcd,0x12,0xc8,0x27,0x6c,0xd4,0x34,0x64,0x60,0x59,0x4,
+ 0x5d,0x83,0x21,0xf6,0x16,0x43,0x6c,0x1b,0x8,0xb0,0x65,0x20,0xc0,0xf6,0x41,0x86,
+ 0xe3,0x9c,0xb6,0x33,0xc6,0x9e,0xbe,0x20,0x83,0x3b,0x8b,0xce,0xf8,0xd9,0xdc,0xfb,
+ 0x51,0x26,0x49,0xb1,0x78,0x6a,0xe2,0xe3,0xb9,0x24,0xfd,0x69,0x32,0x66,0xbb,0x35,
+ 0xf9,0x34,0x6a,0xa,0x59,0x1c,0xee,0x31,0xf8,0xd5,0xb,0x7,0x91,0x20,0x6,0xe3,
+ 0x72,0x71,0x8c,0x4e,0xb9,0x38,0xe4,0x31,0x74,0x7a,0x11,0x84,0x1,0x5c,0x37,0x86,
+ 0x78,0x22,0x89,0x5c,0x3e,0x6f,0x28,0xa5,0xcf,0x78,0x9e,0x77,0x5b,0x6f,0x6f,0xef,
+ 0x7,0xfa,0x11,0x26,0xf0,0x1,0x0,0x78,0x53,0xb3,0xc7,0xc7,0x17,0x12,0x8a,0x55,
+ 0x5e,0x60,0x5a,0xfa,0x4a,0xa,0x7e,0x30,0x9c,0xce,0x94,0x0,0x36,0xa5,0x90,0x5a,
+ 0xc3,0xb2,0x2c,0x95,0x4a,0x67,0xb6,0x3a,0x8e,0xb3,0xd3,0x71,0x9c,0xc3,0x0,0xf6,
+ 0xe4,0xf3,0xf9,0xed,0x84,0x90,0x8e,0xdd,0xbb,0x77,0x7f,0x20,0xe3,0x7a,0xa7,0x3e,
+ 0x30,0x0,0xa7,0x94,0x0,0xf0,0x63,0x0,0x37,0x60,0xf8,0x2b,0xae,0x5e,0x0,0x1b,
+ 0x1,0xbc,0x88,0xe1,0x19,0xe8,0x5,0x0,0x23,0x3a,0xd6,0xfe,0x41,0xe9,0xff,0x2,
+ 0xa2,0xed,0xf1,0x10,0xd3,0x8,0xc4,0x9a,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,
+ 0xae,0x42,0x60,0x82,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/punchin.xpm
+ 0x0,0x0,0x2,0x6a,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x70,0x75,0x6e,0x63,
+ 0x68,0x69,0x6e,0x5f,0x78,0x70,0x6d,0x5b,0x5d,0x20,0x3d,0x20,0x7b,0xa,0x2f,0x2a,
+ 0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x6e,0x75,
+ 0x6d,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x63,0x68,0x61,0x72,0x73,0x5f,0x70,
+ 0x65,0x72,0x5f,0x70,0x69,0x78,0x65,0x6c,0x20,0x2a,0x2f,0xa,0x22,0x20,0x20,0x20,
+ 0x20,0x32,0x32,0x20,0x20,0x20,0x20,0x31,0x36,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x22,0x2c,
+ 0xa,0x2f,0x2a,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x73,0x20,0x2a,0x2f,0xa,0x22,0x2e,
+ 0x20,0x63,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x2c,0xa,0x22,0x66,0x20,
+ 0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x22,0x68,0x20,0x63,0x20,0x23,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x2f,0x2a,0x20,0x70,0x69,0x78,0x65,0x6c,
+ 0x73,0x20,0x2a,0x2f,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x2e,0x2e,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,
+ 0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x2e,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x2e,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x2e,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x2e,0x2e,0x2e,
+ 0x2e,0x2e,0x2e,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x68,0x68,0x68,0x68,0x68,0x68,0x68,0x66,0x66,
+ 0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,
+ 0xa,0x22,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,
+ 0x66,0x66,0x22,0x2c,0xa,0x7d,0x3b,0xa,0xa,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/loop.xpm
+ 0x0,0x0,0x2,0x7c,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x6c,0x6f,0x6f,0x70,
+ 0x5f,0x78,0x70,0x6d,0x5b,0x5d,0x20,0x3d,0x20,0x7b,0xa,0x22,0x20,0x20,0x20,0x20,
+ 0x32,0x39,0x20,0x20,0x20,0x20,0x31,0x35,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x34,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x22,0x2c,
+ 0xa,0x22,0x2e,0x20,0x63,0x20,0x23,0x30,0x30,0x30,0x30,0x30,0x30,0x22,0x2c,0xa,
+ 0x22,0x23,0x20,0x63,0x20,0x23,0x37,0x66,0x37,0x66,0x37,0x66,0x22,0x2c,0xa,0x22,
+ 0x61,0x20,0x63,0x20,0x4e,0x6f,0x6e,0x65,0x22,0x2c,0xa,0x22,0x62,0x20,0x63,0x20,
+ 0x23,0x66,0x66,0x66,0x66,0x66,0x66,0x22,0x2c,0xa,0x22,0x61,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x22,0x2c,0xa,0x22,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x2e,0x2e,0x2e,0x23,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x22,0x2c,0xa,0x22,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x2e,0x2e,0x2e,0x2e,0x23,
+ 0x23,0x23,0x23,0x23,0x61,0x61,0x61,0x61,0x61,0x61,0x22,0x2c,0xa,0x22,0x61,0x61,
+ 0x61,0x61,0x61,0x23,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x2e,0x2e,0x2e,0x2e,0x2e,0x23,0x61,0x61,0x61,0x61,0x61,0x22,0x2c,0xa,0x22,0x61,
+ 0x61,0x61,0x61,0x23,0x2e,0x62,0x62,0x62,0x62,0x62,0x62,0x23,0x23,0x2e,0x2e,0x2e,
+ 0x2e,0x62,0x62,0x62,0x62,0x62,0x2e,0x23,0x61,0x61,0x61,0x61,0x22,0x2c,0xa,0x22,
+ 0x61,0x61,0x61,0x23,0x2e,0x62,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x2e,0x2e,0x2e,
+ 0x62,0x62,0x61,0x61,0x61,0x61,0x61,0x23,0x2e,0x62,0x61,0x61,0x61,0x22,0x2c,0xa,
+ 0x22,0x61,0x61,0x61,0x23,0x2e,0x62,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x62,0x62,
+ 0x62,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x23,0x2e,0x62,0x61,0x61,0x61,0x22,0x2c,
+ 0xa,0x22,0x61,0x61,0x61,0x23,0x2e,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x23,0x2e,0x62,0x61,0x61,0x61,0x22,
+ 0x2c,0xa,0x22,0x61,0x61,0x61,0x23,0x2e,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x23,0x2e,0x62,0x61,0x61,0x61,
+ 0x22,0x2c,0xa,0x22,0x61,0x61,0x61,0x61,0x2e,0x61,0x61,0x61,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x23,0x2e,0x62,0x61,0x61,
+ 0x61,0x22,0x2c,0xa,0x22,0x61,0x61,0x61,0x61,0x23,0x2e,0x23,0x23,0x23,0x23,0x23,
+ 0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x2e,0x62,0x61,0x61,
+ 0x61,0x61,0x22,0x2c,0xa,0x22,0x61,0x61,0x61,0x61,0x61,0x23,0x2e,0x2e,0x2e,0x2e,
+ 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x62,0x61,0x61,
+ 0x61,0x61,0x61,0x22,0x2c,0xa,0x22,0x61,0x61,0x61,0x61,0x61,0x61,0x62,0x62,0x62,
+ 0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x22,0x2c,0xa,0x22,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x22,0x2c,0xa,0x22,0x61,0x61,0x61,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,
+ 0x61,0x61,0x61,0x61,0x61,0x61,0x22,0xa,0x7d,0x3b,0xa,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/stop.xpm
+ 0x0,0x0,0x1,0x16,
+ 0x2f,
+ 0x2a,0x20,0x58,0x50,0x4d,0x20,0x2a,0x2f,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,
+ 0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x20,0x73,0x74,0x6f,
+ 0x70,0x5f,0x78,0x70,0x6d,0x5b,0x5d,0x20,0x3d,0x20,0x7b,0xa,0x22,0x31,0x32,0x20,
+ 0x31,0x32,0x20,0x32,0x20,0x31,0x22,0x2c,0xa,0x22,0x20,0x9,0x63,0x20,0x4e,0x6f,
+ 0x6e,0x65,0x22,0x2c,0xa,0x22,0x2e,0x9,0x63,0x20,0x23,0x30,0x30,0x30,0x30,0x30,
+ 0x30,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,
+ 0x20,0x22,0x2c,0xa,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x22,0x7d,0x3b,0xa,
+ // /home/ws/projects/muse/muse-cmake.bu/muse/xpm/filenew.png
+ 0x0,0x0,0x2,0x3f,
+ 0x89,
+ 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,
+ 0x0,0x0,0x16,0x0,0x0,0x0,0x16,0x8,0x6,0x0,0x0,0x0,0xc4,0xb4,0x6c,0x3b,
+ 0x0,0x0,0x0,0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,
+ 0xa7,0x93,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,
+ 0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,
+ 0xd6,0x2,0x2,0xd,0x1e,0x1c,0x10,0xe2,0x3e,0xba,0x0,0x0,0x1,0xcc,0x49,0x44,
+ 0x41,0x54,0x78,0xda,0xb5,0x95,0x3b,0x6e,0xdb,0x40,0x14,0x45,0xaf,0x4,0xd9,0x9,
+ 0x40,0x1b,0x8,0x40,0xe,0x52,0x24,0x9b,0x50,0xa3,0x25,0xa8,0x52,0xa7,0x5e,0xb5,
+ 0xf6,0x90,0x2a,0x4d,0x56,0xa0,0x62,0xd6,0xa0,0x9d,0xa8,0x88,0x81,0x74,0x69,0x22,
+ 0x83,0x45,0x2,0x24,0x24,0x64,0xc5,0x29,0x34,0xdf,0xf7,0x52,0xc,0x7f,0xb6,0x29,
+ 0x52,0xb2,0xe1,0x7,0x10,0x9c,0x1,0xc8,0x33,0x67,0x2e,0x1f,0x38,0xc0,0x2b,0xd5,
+ 0xa0,0x39,0x99,0xcf,0xe7,0x7c,0x38,0x1c,0xa0,0x94,0x82,0x52,0xa,0xc7,0xc6,0x4a,
+ 0xa9,0xd6,0xf7,0x9b,0x35,0x6a,0x4e,0xb4,0xd6,0x58,0xad,0x56,0xad,0xf,0x2a,0xa5,
+ 0xb0,0xdf,0xef,0xb1,0xdb,0xed,0x30,0x9b,0xcd,0x20,0xa5,0xc4,0x72,0xb9,0xe4,0x2e,
+ 0x78,0x55,0xd3,0xe9,0x94,0xb7,0xdb,0x2d,0x1f,0xab,0x3c,0xcf,0x39,0x4d,0x53,0x4e,
+ 0x92,0x84,0x37,0x9b,0xd,0x4b,0x29,0x19,0x0,0xb7,0xb1,0x86,0x8f,0x8d,0xbb,0x2a,
+ 0x8e,0x63,0x44,0x51,0x4,0x21,0x4,0x26,0x93,0x9,0xc6,0xe3,0x31,0xa4,0x94,0x68,
+ 0x83,0x3f,0x0,0x1b,0x63,0x7a,0x77,0x15,0xc7,0x31,0x84,0x10,0x48,0xd3,0xb4,0x13,
+ 0x3e,0x3a,0x17,0xc,0x0,0x42,0x8,0x2c,0x16,0xb,0x64,0x59,0x86,0x2c,0xcb,0x90,
+ 0xe7,0x79,0xff,0xc7,0x3b,0xa5,0xd6,0xeb,0x35,0xfe,0xfd,0xbd,0xc3,0xed,0x8f,0xef,
+ 0xf8,0xfd,0xeb,0x27,0xbe,0xde,0x7c,0xc3,0xa7,0xcf,0x5f,0xf0,0x62,0xe3,0x1,0x18,
+ 0xd7,0x57,0x11,0x84,0x78,0x8f,0x81,0xf7,0xf8,0xf0,0x71,0xf7,0x72,0x63,0x26,0x7,
+ 0xb2,0x6,0x6c,0x35,0xc4,0xbb,0x6b,0x5c,0x72,0x82,0xec,0x4f,0xd2,0xd,0xee,0x33,
+ 0x66,0xef,0x40,0xce,0x80,0x9c,0x6,0x3b,0xd,0x72,0x6,0xd1,0x9b,0x11,0xa2,0xcb,
+ 0xc1,0x33,0xc1,0xcc,0x20,0x72,0x20,0xab,0xc1,0xce,0x80,0xac,0x2e,0xe0,0x61,0x7c,
+ 0xf5,0xf6,0xe2,0xfc,0x28,0x98,0x19,0xec,0x1d,0xd8,0x69,0xb0,0xd,0x96,0x5c,0x18,
+ 0xb3,0x35,0x95,0xf9,0x59,0xc6,0x1,0x6a,0x83,0xa9,0x37,0x20,0xab,0x8a,0xbb,0x69,
+ 0x18,0x2b,0x70,0xb,0x78,0xf8,0x5a,0x7f,0xb7,0xa3,0xc6,0xcc,0x4,0x76,0xb6,0x36,
+ 0x73,0xba,0x61,0x1e,0x32,0x26,0x17,0xba,0x83,0xfb,0xa2,0x68,0x7e,0x2c,0x76,0xa6,
+ 0xba,0x6a,0x50,0x63,0x91,0x22,0x63,0xb2,0x27,0x64,0x3c,0x1c,0x86,0x64,0x4a,0xbb,
+ 0x90,0xa5,0x2a,0x60,0x75,0x9e,0x55,0x77,0x94,0xbb,0xe8,0x3,0x13,0x51,0xb8,0x5b,
+ 0xfd,0xa4,0xa5,0xc8,0x87,0x6d,0x93,0xaf,0x3b,0x21,0x40,0x4f,0x30,0xae,0x16,0xb0,
+ 0xea,0x61,0x9e,0xd6,0x80,0xfd,0xa3,0x85,0xca,0x8c,0xbd,0x3b,0x2d,0x63,0x73,0x9f,
+ 0xe3,0xf6,0x1e,0x75,0xbe,0xc5,0x55,0xb6,0x19,0x7b,0x13,0xb2,0x2d,0xe7,0xc5,0x73,
+ 0x9d,0x67,0xde,0xb1,0xd3,0xe0,0x39,0x67,0xe8,0x7f,0xe3,0xdc,0xfe,0x6c,0xd9,0x3e,
+ 0x3b,0xa2,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,
+
+};
+
+static const unsigned char qt_resource_name[] = {
+ // xpm
+ 0x0,0x3,
+ 0x0,0x0,0x7f,0x6d,
+ 0x0,0x78,
+ 0x0,0x70,0x0,0x6d,
+ // start.xpm
+ 0x0,0x9,
+ 0x8,0x97,0xaa,0x2d,
+ 0x0,0x73,
+ 0x0,0x74,0x0,0x61,0x0,0x72,0x0,0x74,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ // splash.png
+ 0x0,0xa,
+ 0x8,0x94,0x19,0x7,
+ 0x0,0x73,
+ 0x0,0x70,0x0,0x6c,0x0,0x61,0x0,0x73,0x0,0x68,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,
+ // filesave.png
+ 0x0,0xc,
+ 0x5,0x68,0xe,0x67,
+ 0x0,0x66,
+ 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x73,0x0,0x61,0x0,0x76,0x0,0x65,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,
+ // fforward.xpm
+ 0x0,0xc,
+ 0x5,0x1d,0x8c,0xcd,
+ 0x0,0x66,
+ 0x0,0x66,0x0,0x6f,0x0,0x72,0x0,0x77,0x0,0x61,0x0,0x72,0x0,0x64,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ // fileopen.png
+ 0x0,0xc,
+ 0xb,0x21,0xf,0x87,
+ 0x0,0x66,
+ 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x6f,0x0,0x70,0x0,0x65,0x0,0x6e,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,
+ // play.xpm
+ 0x0,0x8,
+ 0x2,0x8c,0x51,0x8d,
+ 0x0,0x70,
+ 0x0,0x6c,0x0,0x61,0x0,0x79,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ // punchout.xpm
+ 0x0,0xc,
+ 0x8,0x3f,0xcc,0x8d,
+ 0x0,0x70,
+ 0x0,0x75,0x0,0x6e,0x0,0x63,0x0,0x68,0x0,0x6f,0x0,0x75,0x0,0x74,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ // frewind.xpm
+ 0x0,0xb,
+ 0x0,0x9c,0x46,0xad,
+ 0x0,0x66,
+ 0x0,0x72,0x0,0x65,0x0,0x77,0x0,0x69,0x0,0x6e,0x0,0x64,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ // muse_icon_64x64.png
+ 0x0,0x13,
+ 0xc,0x71,0xd0,0x67,
+ 0x0,0x6d,
+ 0x0,0x75,0x0,0x73,0x0,0x65,0x0,0x5f,0x0,0x69,0x0,0x63,0x0,0x6f,0x0,0x6e,0x0,0x5f,0x0,0x36,0x0,0x34,0x0,0x78,0x0,0x36,0x0,0x34,0x0,0x2e,0x0,0x70,
+ 0x0,0x6e,0x0,0x67,
+ // punchin.xpm
+ 0x0,0xb,
+ 0xe,0x2e,0xd6,0x4d,
+ 0x0,0x70,
+ 0x0,0x75,0x0,0x6e,0x0,0x63,0x0,0x68,0x0,0x69,0x0,0x6e,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ // loop.xpm
+ 0x0,0x8,
+ 0x6,0x63,0x51,0xd,
+ 0x0,0x6c,
+ 0x0,0x6f,0x0,0x6f,0x0,0x70,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ // stop.xpm
+ 0x0,0x8,
+ 0xb,0x63,0x50,0x2d,
+ 0x0,0x73,
+ 0x0,0x74,0x0,0x6f,0x0,0x70,0x0,0x2e,0x0,0x78,0x0,0x70,0x0,0x6d,
+ // filenew.png
+ 0x0,0xb,
+ 0x4,0x14,0x52,0xc7,
+ 0x0,0x66,
+ 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x6e,0x0,0x65,0x0,0x77,0x0,0x2e,0x0,0x70,0x0,0x6e,0x0,0x67,
+
+};
+
+static const unsigned char qt_resource_struct[] = {
+ // :
+ 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,
+ // :/xpm
+ 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xd,0x0,0x0,0x0,0x2,
+ // :/xpm/frewind.xpm
+ 0x0,0x0,0x0,0xcc,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xbd,0x95,
+ // :/xpm/play.xpm
+ 0x0,0x0,0x0,0x98,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xba,0x6c,
+ // :/xpm/filenew.png
+ 0x0,0x0,0x1,0x5c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xe2,0x3f,
+ // :/xpm/fforward.xpm
+ 0x0,0x0,0x0,0x5c,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xb5,0x97,
+ // :/xpm/filesave.png
+ 0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xb2,0x99,
+ // :/xpm/loop.xpm
+ 0x0,0x0,0x1,0x30,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xde,0xa5,
+ // :/xpm/punchout.xpm
+ 0x0,0x0,0x0,0xae,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xbb,0x86,
+ // :/xpm/splash.png
+ 0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1,0x57,
+ // :/xpm/start.xpm
+ 0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,
+ // :/xpm/fileopen.png
+ 0x0,0x0,0x0,0x7a,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xb6,0xf1,
+ // :/xpm/stop.xpm
+ 0x0,0x0,0x1,0x46,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xe1,0x25,
+ // :/xpm/muse_icon_64x64.png
+ 0x0,0x0,0x0,0xe8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xbe,0xee,
+ // :/xpm/punchin.xpm
+ 0x0,0x0,0x1,0x14,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0xdc,0x37,
+
+};
+
+int qInitResources_muse()
+{
+ extern bool qRegisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *);
+ qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
+ return 1;
+}
+Q_CONSTRUCTOR_FUNCTION(qInitResources_muse)
+int qCleanupResources_muse()
+{
+ extern bool qUnregisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *);
+ qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
+ return 1;
+}
+Q_DESTRUCTOR_FUNCTION(qCleanupResources_muse)
diff --git a/muse/muse/route.cpp b/muse/muse/route.cpp
new file mode 100644
index 00000000..98966a44
--- /dev/null
+++ b/muse/muse/route.cpp
@@ -0,0 +1,504 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "route.h"
+#include "audio.h"
+#include "track.h"
+#include "synth.h"
+#include "driver/audiodev.h"
+#include "driver/alsamidi.h"
+#include "al/xml.h"
+
+//---------------------------------------------------------
+// name2route
+//---------------------------------------------------------
+
+static Route name2route(const QString& rn, Route::RouteType t)
+ {
+ int channel = -1;
+ QString s(rn);
+ if (rn[0].isNumber() && rn[1]==':') {
+ int c = rn[0].toLatin1();
+ channel = c - '1';
+ s = rn.mid(2);
+ }
+ else if (rn[0].isNumber() && rn[1].isNumber() && rn[2]==':') {
+ channel = (rn[0].toLatin1() - '0') * 10 + (rn[1].toLatin1() - '0') - 1;
+ s = rn.mid(3);
+ }
+ switch (t) {
+ case Route::TRACK:
+ {
+ TrackList* tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ Track* track = *i;
+ if (track->name() == s)
+ return Route(track, channel, Route::TRACK);
+ }
+ MidiChannelList* mc = song->midiChannel();
+ for (iMidiChannel i = mc->begin(); i != mc->end(); ++i) {
+ MidiChannel* t = *i;
+ if (t->name() == s)
+ return Route(t, channel, Route::TRACK);
+ }
+ }
+ break;
+ case Route::AUDIOPORT:
+ {
+ Port p = audioDriver->findPort(s);
+ if (p)
+ return Route(p, Route::AUDIOPORT);
+ }
+ break;
+ case Route::MIDIPORT:
+ {
+ Port p = midiDriver->findPort(s);
+ if (p)
+ return Route(p, Route::MIDIPORT);
+ }
+ break;
+ case Route::SYNTIPORT:
+ {
+ SynthIList* tl = song->syntis();
+ for (iSynthI i = tl->begin(); i != tl->end(); ++i) {
+ SynthI* track = *i;
+ if (track->name() == s)
+ return Route(track, channel, Route::SYNTIPORT);
+ }
+ }
+
+ }
+ static const char* names[] = {
+ "TRACK", "AUDIOPORT", "MIDIPORT", "SYNTIPORT"
+ };
+ printf("name2route: %s: <%s> not found\n", names[t], rn.toLatin1().data());
+ return Route((Track*) 0, channel, Route::TRACK);
+ }
+
+//---------------------------------------------------------
+// Route
+//---------------------------------------------------------
+
+Route::Route(Port p, RouteType t)
+ {
+ port = p;
+ channel = -1;
+ type = t;
+ }
+
+Route::Route(Track* tr, RouteType t)
+ {
+ track = tr;
+ channel = -1;
+ type = t;
+ }
+
+Route::Route(Track* tr, int ch, RouteType t)
+ {
+ track = tr;
+ channel = ch;
+ type = t;
+ }
+
+Route::Route(const QString& s, int ch, RouteType t)
+ {
+ Route node(name2route(s, t));
+ if (node.isValid()) {
+ channel = node.channel;
+ if (channel == -1)
+ channel = ch;
+ if (node.type == TRACK)
+ track = node.track;
+ else
+ port = node.port;
+ type = t;
+ }
+ }
+
+
+Route::Route()
+ {
+ track = 0;
+ channel = -1;
+ type = TRACK;
+ }
+
+//---------------------------------------------------------
+// addRoute
+// return false, if route invalid or cannot be found
+//---------------------------------------------------------
+
+bool addRoute(Route src, Route dst)
+ {
+ if (!src.isValid() || !dst.isValid())
+ return false;
+
+// printf("addRoute %s.%d:<%s> %s.%d:<%s>\n",
+// src.tname(), src.channel, src.name().toLatin1().data(),
+// dst.tname(), dst.channel, dst.name().toLatin1().data());
+
+ if (src.type == Route::AUDIOPORT || src.type == Route::MIDIPORT) {
+ if (dst.type != Route::TRACK) {
+ fprintf(stderr, "addRoute: bad route 1\n");
+ return false;
+ }
+ if (dst.track->type() != Track::AUDIO_INPUT && dst.track->type() != Track::MIDI_IN) {
+ fprintf(stderr, "addRoute: bad route 2\n");
+ return false;
+ }
+ src.channel = dst.channel;
+ RouteList* inRoutes = dst.track->inRoutes();
+ for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) {
+ if (*i == src) // route already there
+ return true;
+ }
+ inRoutes->push_back(src);
+ }
+ else if (dst.type == Route::AUDIOPORT || dst.type == Route::MIDIPORT) {
+// || dst.type == Route::SYNTIPORT) {
+ if (src.type != Route::TRACK) {
+ fprintf(stderr, "addRoute: bad route 3\n");
+ return false;
+ }
+ if (src.track->type() != Track::AUDIO_OUTPUT && src.track->type() != Track::MIDI_OUT) {
+ fprintf(stderr, "addRoute: bad route 4, tracktype %s\n", src.track->cname().toLatin1().data());
+ return false;
+ }
+ RouteList* outRoutes = src.track->outRoutes();
+ dst.channel = src.channel;
+
+ for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) {
+ if (*i == dst) // route already there
+ return true;
+ }
+ outRoutes->push_back(dst);
+ }
+ else {
+ RouteList* outRoutes = src.track->outRoutes();
+ for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) {
+ if (*i == dst) { // route already there
+ printf(" route already there\n");
+ return true;
+ }
+ }
+ outRoutes->push_back(dst);
+ RouteList* inRoutes = dst.track->inRoutes();
+ //
+ // make sure AUDIO_AUX is processed last
+ //
+ if (src.track->type() == Track::AUDIO_AUX)
+ inRoutes->push_back(src);
+ else
+ inRoutes->insert(inRoutes->begin(), src);
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// removeRoute
+//---------------------------------------------------------
+
+void removeRoute(Route src, Route dst)
+ {
+// printf("removeRoute %s.%d:<%s> %s.%d:<%s>\n",
+// src.tname(), src.channel, src.name().toLatin1().data(),
+// dst.tname(), dst.channel, dst.name().toLatin1().data());
+ if (src.type == Route::AUDIOPORT || src.type == Route::MIDIPORT) {
+ if (dst.type != Route::TRACK && dst.type != Route::SYNTIPORT) {
+ fprintf(stderr, "removeRoute: bad route 1\n");
+ goto error;
+ }
+ if (dst.track->type() != Track::AUDIO_INPUT
+ && dst.track->type() != Track::AUDIO_SOFTSYNTH
+ && dst.track->type() != Track::MIDI_IN) {
+ fprintf(stderr, "removeRoute: bad route 2\n");
+ goto error;
+ }
+ RouteList* inRoutes = dst.track->inRoutes();
+ iRoute i;
+ for (i = inRoutes->begin(); i != inRoutes->end(); ++i) {
+ if (*i == src) {
+ inRoutes->erase(i);
+ break;
+ }
+ }
+ }
+ else if (dst.type == Route::AUDIOPORT || dst.type == Route::MIDIPORT) {
+// | dst.type == Route::SYNTIPORT) {
+ if (src.type != Route::TRACK) {
+ fprintf(stderr, "removeRoute: bad route 3\n");
+ goto error;
+ }
+ if (src.track->type() != Track::AUDIO_OUTPUT && src.track->type() != Track::MIDI_OUT) {
+ fprintf(stderr, "removeRoute: bad route 4\n");
+ goto error;
+ }
+ RouteList* outRoutes = src.track->outRoutes();
+ iRoute i;
+ for (i = outRoutes->begin(); i != outRoutes->end(); ++i) {
+ if (*i == dst) {
+ outRoutes->erase(i);
+ break;
+ }
+ }
+ }
+ else {
+ RouteList* outRoutes = src.track->outRoutes();
+ for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) {
+ if (*i == dst) {
+ outRoutes->erase(i);
+ break;
+ }
+ }
+ RouteList* inRoutes = dst.track->inRoutes();
+ for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) {
+ if (*i == src) {
+ inRoutes->erase(i);
+ break;
+ }
+ }
+ }
+ return;
+error:
+ printf("removeRoute %s.%d:<%s> %s.%d:<%s>\n",
+ src.tname(), src.channel, src.name().toLatin1().data(),
+ dst.tname(), dst.channel, dst.name().toLatin1().data());
+ abort();
+ }
+
+//---------------------------------------------------------
+// track2name
+// create string name representation for audio node
+//---------------------------------------------------------
+
+static QString track2name(const Track* n)
+ {
+ if (n == 0)
+ return QWidget::tr("None");
+ return n->name();
+ }
+
+//---------------------------------------------------------
+// name
+// create string name representation for audio node
+//---------------------------------------------------------
+
+QString Route::name() const
+ {
+ QString s;
+ if (type == TRACK || type == SYNTIPORT) {
+ if (channel != -1) {
+ QString c;
+ c.setNum(channel+1);
+ s = c + ":";
+ }
+ return s + track2name(track);
+ }
+ if (type == AUDIOPORT) {
+ s = audioDriver->portName(port);
+ }
+ else if (type == MIDIPORT)
+ s = midiDriver->portName(port);
+ return s;
+ }
+
+//---------------------------------------------------------
+// checkRoute
+// return true if route is valid
+//---------------------------------------------------------
+
+bool checkRoute(const QString& /*s*/, const QString& /*d*/)
+ {
+#if 0 // TODO1
+ Route src(s, false, -1);
+ Route dst(d, true, -1);
+
+ if (!(src.isValid() && dst.isValid()) || (src == dst))
+ return false;
+ if (src.type == Route::AUDIOPORT || src.type == Route::MIDIPORT) {
+ if (dst.type != Route::TRACK) {
+ return false;
+ }
+ if (dst.track->type() != Track::AUDIO_INPUT) {
+ return false;
+ }
+ src.channel = dst.channel;
+ RouteList* inRoutes = dst.track->inRoutes();
+ for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) {
+ if (*i == src) { // route already there
+ return false;
+ }
+ }
+ }
+ else if (dst.type == Route::AUDIOPORT || dst.type == Route::MIDIPORT) {
+ if (src.type != Route::TRACK) {
+ return false;
+ }
+ if (src.track->type() != Track::AUDIO_OUTPUT
+ && src.track->type() != Track::MIDI_OUT
+ && src.track->type() != Track::MIDI_IN) {
+ return false;
+ }
+ RouteList* outRoutes = src.track->outRoutes();
+ dst.channel = src.channel;
+ for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) {
+ if (*i == dst) { // route already there
+ return false;
+ }
+ }
+ }
+ else {
+ RouteList* outRoutes = src.track->outRoutes();
+ for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) {
+ if (*i == dst) { // route already there
+ return false;
+ }
+ }
+ }
+#endif
+ return true;
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void Song::readRoute(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ node = node.firstChild();
+ QString src, dst, st, dt;
+
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.tagName() == "srcNode") {
+ st = e.attribute("type", "TRACK");
+ src = e.text();
+ }
+ else if (e.tagName() == "dstNode") {
+ dt = e.attribute("type", "TRACK");
+ dst = e.text();
+ }
+ else
+ printf("MusE:readRoute: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ Route::RouteType stype, dtype;
+ if (st == "TRACK")
+ stype = Route::TRACK;
+ else if (st == "AUDIOPORT")
+ stype = Route::AUDIOPORT;
+ else if (st == "MIDIPORT")
+ stype = Route::MIDIPORT;
+ else if (st == "SYNTIPORT")
+ stype = Route::SYNTIPORT;
+ else {
+ printf("Song::readRoute(): unknown type <%s>\n", dt.toLatin1().data());
+ dtype = Route::TRACK;
+ }
+
+ if (dt == "TRACK")
+ dtype = Route::TRACK;
+ else if (dt == "AUDIOPORT")
+ dtype = Route::AUDIOPORT;
+ else if (dt == "MIDIPORT")
+ dtype = Route::MIDIPORT;
+ else if (dt == "SYNTIPORT") {
+ dtype = Route::SYNTIPORT;
+ }
+ else {
+ printf("Song::readRoute(): unknown type <%s>\n", dt.toLatin1().data());
+ dtype = Route::TRACK;
+ }
+ Route s = name2route(src, stype);
+ Route d = name2route(dst, dtype);
+ addRoute(s, d);
+ }
+
+//---------------------------------------------------------
+// removeRoute
+//---------------------------------------------------------
+
+void RouteList::removeRoute(const Route& r)
+ {
+ for (iRoute i = begin(); i != end(); ++i) {
+ if (r == *i) {
+ erase(i);
+ return;
+ }
+ }
+ printf("RouteList::internal error: cannot remove Route\n ");
+ r.dump();
+ printf(" found:\n");
+ for (iRoute i = begin(); i != end(); ++i) {
+ printf(" ");
+ i->dump();
+ }
+ printf(" -----\n");
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void Route::dump() const
+ {
+ printf("Route %p dump: <%s> channel %d, type %s\n",
+ track, name().toLatin1().data(), channel, tname());
+ }
+
+//---------------------------------------------------------
+// operator==
+//---------------------------------------------------------
+
+bool Route::operator==(const Route& a) const
+ {
+ if (type == a.type) {
+ if (type == TRACK || type == SYNTIPORT) {
+ return channel == a.channel && track == a.track;
+ }
+ else if (type == MIDIPORT) {
+ return midiDriver->equal(port, a.port);
+ }
+ else if (type == AUDIOPORT) {
+ return channel == a.channel && audioDriver->equal(port, a.port);
+ }
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// tname
+//---------------------------------------------------------
+
+const char* Route::tname(RouteType t)
+ {
+ static const char* names[] = {
+ "TRACK", "AUDIOPORT", "MIDIPORT", "SYNTIPORT"
+ };
+ return names[t];
+ }
+
+const char* Route::tname() const
+ {
+ return tname(type);
+ }
+
diff --git a/muse/muse/route.h b/muse/muse/route.h
new file mode 100644
index 00000000..d5014f8d
--- /dev/null
+++ b/muse/muse/route.h
@@ -0,0 +1,77 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __ROUTE_H__
+#define __ROUTE_H__
+
+class Track;
+typedef void* Port;
+
+//---------------------------------------------------------
+// Route
+//---------------------------------------------------------
+
+struct Route {
+ enum RouteType { TRACK, AUDIOPORT, MIDIPORT, SYNTIPORT};
+
+ union {
+ Track* track;
+ Port port;
+ };
+ int channel;
+ RouteType type;
+
+ Route(const QString&, int ch, RouteType);
+ Route(Port, RouteType);
+ Route(Track*, RouteType);
+ Route(Track*, int, RouteType);
+ Route();
+ Route(const Route& r) {
+ track = r.track;
+ channel = r.channel;
+ type = r.type;
+ }
+ QString name() const;
+ bool operator==(const Route& a) const;
+ bool isValid() const { return track != 0; }
+ void dump() const;
+ const char* tname() const;
+ static const char* tname(RouteType);
+ };
+
+
+//---------------------------------------------------------
+// RouteList
+//---------------------------------------------------------
+
+class RouteList : public std::vector<Route> {
+ public:
+ void removeRoute(const Route& r);
+ };
+
+typedef RouteList::iterator iRoute;
+typedef RouteList::const_iterator ciRoute;
+
+extern bool addRoute(Route, Route);
+extern void removeRoute(Route, Route);
+extern bool checkRoute(const QString&, const QString&);
+
+#endif
+
diff --git a/muse/muse/runmuse b/muse/muse/runmuse
new file mode 100755
index 00000000..68b7ff30
--- /dev/null
+++ b/muse/muse/runmuse
@@ -0,0 +1,3 @@
+#!/bin/sh
+set_rtlimits -r=80 /home/ws/projects/muse/muse/muse/muse $*
+
diff --git a/muse/muse/seqmsg.cpp b/muse/muse/seqmsg.cpp
new file mode 100644
index 00000000..18dc7f5d
--- /dev/null
+++ b/muse/muse/seqmsg.cpp
@@ -0,0 +1,684 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "instruments/minstrument.h"
+#include "muse.h"
+#include "mixer/mixer.h"
+#include "al/tempo.h"
+#include "al/sig.h"
+#include "audio.h"
+#include "driver/audiodev.h"
+#include "driver/alsamidi.h"
+#include "audio.h"
+#include "arranger/arranger.h"
+#include "plugin.h"
+#include "midi.h"
+#include "midictrl.h"
+#include "midiplugin.h"
+#include "part.h"
+
+//---------------------------------------------------------
+// sendMsg
+//---------------------------------------------------------
+
+void Audio::sendMsg(AudioMsg* m)
+ {
+ static int sno = 0;
+
+ if (audioState == AUDIO_RUNNING) {
+ m->serialNo = sno++;
+ //DEBUG:
+ msg = m;
+ // wait for next audio "process" call to finish operation
+ int no = -1;
+ int rv = read(fromThreadFdr, &no, sizeof(int));
+ if (rv != sizeof(int))
+ perror("Audio: read pipe failed");
+ else if (no != (sno-1)) {
+ fprintf(stderr, "audio: bad serial number, read %d expected %d\n",
+ no, sno-1);
+ }
+ }
+ else {
+ // if audio is not running (during initialization)
+ // process commands immediatly
+ processMsg(m);
+ }
+ }
+
+//---------------------------------------------------------
+// sendMessage
+// send request from gui to sequencer
+// wait until request is processed
+//---------------------------------------------------------
+
+bool Audio::sendMessage(AudioMsg* m, bool doUndo)
+ {
+ if (doUndo)
+ song->startUndo();
+ sendMsg(m);
+ if (doUndo)
+ song->endUndo(0); // song->endMsgCmd();
+ return false;
+ }
+
+//---------------------------------------------------------
+// msgRemoveRoute
+//---------------------------------------------------------
+
+void Audio::msgRemoveRoute(Route src, Route dst)
+ {
+ if (src.type == Route::AUDIOPORT) {
+ AudioInput* ai = (AudioInput*)(dst.track);
+ audioDriver->disconnect(src.port, ai->jackPort(dst.channel));
+ }
+ else if (src.type == Route::MIDIPORT) {
+ midiDriver->disconnect(src.port, ((MidiInPort*)dst.track)->port());
+ }
+ else if (dst.type == Route::AUDIOPORT) {
+ AudioOutput* ai = (AudioOutput*)(src.track);
+ audioDriver->disconnect(ai->jackPort(src.channel), dst.port);
+ }
+ else if (dst.type == Route::MIDIPORT) {
+ midiDriver->disconnect(((MidiOutPort*)src.track)->port(), dst.port);
+ }
+ msgRemoveRoute1(src, dst);
+ }
+
+//---------------------------------------------------------
+// msgRemoveRoute1
+//---------------------------------------------------------
+
+void Audio::msgRemoveRoute1(Route src, Route dst)
+ {
+ AudioMsg msg;
+ msg.id = AUDIO_ROUTEREMOVE;
+ msg.sroute = src;
+ msg.droute = dst;
+ sendMsg(&msg);
+ }
+
+//---------------------------------------------------------
+// msgAddRoute
+//---------------------------------------------------------
+
+void Audio::msgAddRoute(Route src, Route dst)
+ {
+ msgAddRoute1(src, dst);
+ if (src.type == Route::AUDIOPORT) {
+ AudioInput* ai = (AudioInput*)dst.track;
+ audioDriver->connect(src.port, ai->jackPort(dst.channel));
+ }
+ if (src.type == Route::MIDIPORT) {
+ midiDriver->connect(src.port, ((MidiInPort*)dst.track)->port());
+ }
+ else if (dst.type == Route::AUDIOPORT) {
+ AudioOutput* ao = (AudioOutput*)src.track;
+ audioDriver->connect(ao->jackPort(src.channel), dst.port);
+ }
+ else if (dst.type == Route::MIDIPORT) {
+ midiDriver->connect(((MidiOutPort*)src.track)->port(), dst.port);
+ }
+ }
+
+//---------------------------------------------------------
+// msgAddRoute1
+//---------------------------------------------------------
+
+void Audio::msgAddRoute1(Route src, Route dst)
+ {
+ AudioMsg msg;
+ msg.id = AUDIO_ROUTEADD;
+ msg.sroute = src;
+ msg.droute = dst;
+ sendMsg(&msg);
+ }
+
+//---------------------------------------------------------
+// msgAddMidiPlugin
+//---------------------------------------------------------
+
+void Audio::msgAddMidiPlugin(MidiTrackBase* node, int idx, MidiPluginI* plugin)
+ {
+ AudioMsg msg;
+ msg.id = AUDIO_ADDMIDIPLUGIN;
+ msg.track = node;
+ msg.ival = idx;
+ msg.mplugin = plugin;
+ MidiPluginI* oldPlugin = node->plugin(idx);
+ sendMsg(&msg);
+ if (oldPlugin) {
+ delete oldPlugin;
+ }
+ }
+
+//---------------------------------------------------------
+// msgAddPlugin
+//---------------------------------------------------------
+
+void Audio::msgAddPlugin(AudioTrack* node, int idx, PluginI* plugin)
+ {
+ AudioMsg msg;
+ msg.id = AUDIO_ADDPLUGIN;
+ msg.track = node;
+ msg.ival = idx;
+ msg.plugin = plugin;
+ PluginI* oldPlugin = node->plugin(idx);
+ sendMsg(&msg);
+ if (oldPlugin) {
+ delete oldPlugin;
+ }
+ }
+
+//---------------------------------------------------------
+// msgSetPrefader
+//---------------------------------------------------------
+
+void Audio::msgSetPrefader(AudioTrack* node, int val)
+ {
+ AudioMsg msg;
+ msg.id = AUDIO_SET_PREFADER;
+ msg.track = node;
+ msg.ival = val;
+ sendMsg(&msg);
+ }
+
+//---------------------------------------------------------
+// msgSetChannels
+//---------------------------------------------------------
+
+void Audio::msgSetChannels(AudioTrack* node, int n)
+ {
+ if (n == node->channels())
+ return;
+ QString name = node->name();
+ int mc = std::max(n, node->channels());
+
+ if (!name.isEmpty()) {
+ if (node->type() == Track::AUDIO_INPUT) {
+ AudioInput* ai = (AudioInput*)node;
+ for (int i = 0; i < mc; ++i) {
+ if (i < n && ai->jackPort(i) == 0) {
+ char buffer[128];
+ snprintf(buffer, 128, "%s-%d", name.toLatin1().data(), i);
+ ai->setJackPort(i, audioDriver->registerInPort(QString(buffer)));
+ }
+ else if ((i >= n) && ai->jackPort(i)) {
+ RouteList* ir = node->inRoutes();
+ for (iRoute ii = ir->begin(); ii != ir->end(); ++ii) {
+ Route r = *ii;
+ if ((r.type == Route::AUDIOPORT) && (r.channel == i)) {
+ msgRemoveRoute(r, Route(node,i, Route::TRACK));
+ break;
+ }
+ }
+ audioDriver->unregisterPort(ai->jackPort(i));
+ ai->setJackPort(i, 0);
+ }
+ }
+ }
+ else if (node->type() == Track::AUDIO_OUTPUT) {
+ AudioOutput* ao = (AudioOutput*)node;
+ for (int i = 0; i < mc; ++i) {
+ void* jp = ao->jackPort(i);
+ if (i < n && jp == 0) {
+ char buffer[128];
+ snprintf(buffer, 128, "%s-%d", name.toLatin1().data(), i);
+ ao->setJackPort(i, audioDriver->registerOutPort(QString(buffer)));
+ }
+ else if (i >= n && jp) {
+ RouteList* ir = node->outRoutes();
+ for (iRoute ii = ir->begin(); ii != ir->end(); ++ii) {
+ Route r = *ii;
+ if ((r.type == Route::AUDIOPORT) && (r.channel == i)) {
+ msgRemoveRoute(Route(node,i,Route::TRACK), r);
+ break;
+ }
+ }
+ audioDriver->unregisterPort(jp);
+ ao->setJackPort(i, 0);
+ }
+ }
+ }
+ }
+ AudioMsg msg;
+ msg.id = AUDIO_SET_CHANNELS;
+ msg.track = node;
+ msg.ival = n;
+ sendMsg(&msg);
+ }
+
+//---------------------------------------------------------
+// msgSetSegSize
+//---------------------------------------------------------
+
+void Audio::msgSetSegSize(int bs, int sr)
+ {
+ AudioMsg msg;
+ msg.id = AUDIO_SET_SEG_SIZE;
+ msg.ival = bs;
+ msg.iival = sr;
+ sendMsg(&msg);
+ }
+
+//---------------------------------------------------------
+// msgSeek
+//---------------------------------------------------------
+
+void Audio::msgSeek(const Pos& pos)
+ {
+ audioDriver->seekTransport(pos.frame());
+ }
+
+//---------------------------------------------------------
+// msgUndo
+//---------------------------------------------------------
+
+void Audio::msgUndo()
+ {
+ AudioMsg msg;
+ msg.id = SEQM_UNDO;
+ sendMsg(&msg);
+ }
+
+//---------------------------------------------------------
+// msgRedo
+//---------------------------------------------------------
+
+void Audio::msgRedo()
+ {
+ AudioMsg msg;
+ msg.id = SEQM_REDO;
+ sendMsg(&msg);
+ }
+
+//---------------------------------------------------------
+// msgPlay
+//---------------------------------------------------------
+
+void Audio::msgPlay(bool val)
+ {
+ if (val) {
+ if (audioDriver)
+ audioDriver->startTransport();
+ }
+ else
+ if (audioDriver)
+ audioDriver->stopTransport();
+ }
+
+//---------------------------------------------------------
+// msgRemoveTrack
+//---------------------------------------------------------
+
+void Audio::msgRemoveTrack(Track* track)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_REMOVE_TRACK;
+ msg.track = track;
+ sendMessage(&msg, false);
+ }
+
+//---------------------------------------------------------
+// msgRemoveTracks
+// remove all selected tracks
+//---------------------------------------------------------
+
+void Audio::msgRemoveTracks()
+ {
+ TrackList tl;
+ TrackList* tl2 = song->tracks();
+ for (iTrack t = tl2->begin(); t != tl2->end(); ++t) {
+ if ((*t)->selected())
+ tl.push_back(*t);
+ }
+ for (iTrack t = tl.begin(); t != tl.end(); ++t) {
+ Track* track = *t;
+ int idx = song->tracks()->index(track);
+ song->undoOp(UndoOp::DeleteTrack, idx, track);
+ song->removeTrack1(track);
+ msgRemoveTrack(track);
+ song->removeTrack3(track);
+ }
+ }
+
+//---------------------------------------------------------
+// msgMoveTrack
+//---------------------------------------------------------
+
+void Audio::msgMoveTrack(Track* src, Track* dst)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_MOVE_TRACK;
+ msg.p1 = src;
+ msg.p2 = dst;
+ sendMessage(&msg, false);
+ }
+
+//---------------------------------------------------------
+// msgAddPart
+//---------------------------------------------------------
+
+void Audio::msgAddPart(Part* part, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_ADD_PART;
+ msg.p1 = part;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgRemovePart
+//---------------------------------------------------------
+
+void Audio::msgRemovePart(Part* part, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_REMOVE_PART;
+ msg.p1 = part;
+ sendMessage(&msg, doUndoFlag);
+ part->track()->partListChanged(); // emit signal
+ }
+
+//---------------------------------------------------------
+// msgRemoveParts
+// remove selected parts; return true if any part was
+// removed
+//---------------------------------------------------------
+
+bool Song::msgRemoveParts()
+ {
+ TrackList* tl = song->tracks();
+ PartList pl;
+
+ for (iTrack it = tl->begin(); it != tl->end(); ++it) {
+ PartList* pl2 = (*it)->parts();
+ for (iPart ip = pl2->begin(); ip != pl2->end(); ++ip) {
+ if (ip->second->selected())
+ pl.add(ip->second);
+ }
+ }
+ for (iPart ip = pl.begin(); ip != pl.end(); ++ip)
+ audio->msgRemovePart(ip->second, false);
+
+ return !pl.empty();
+ }
+
+//---------------------------------------------------------
+// msgChangePart
+//---------------------------------------------------------
+
+void Audio::msgChangePart(Part* oldPart, Part* newPart, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_CHANGE_PART;
+ msg.p1 = oldPart;
+ msg.p2 = newPart;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgAddEvent
+//---------------------------------------------------------
+
+void Audio::msgAddEvent(const Event& event, Part* part, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_ADD_EVENT;
+ msg.ev1 = event;
+ msg.p2 = part;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgDeleteEvent
+//---------------------------------------------------------
+
+void Audio::msgDeleteEvent(const Event& event, Part* part, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_REMOVE_EVENT;
+ msg.ev1 = event;
+ msg.p2 = part;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgChangeEvent
+//---------------------------------------------------------
+
+void Audio::msgChangeEvent(const Event& oe, const Event& ne, Part* part, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_CHANGE_EVENT;
+ msg.ev1 = oe;
+ msg.ev2 = ne;
+ msg.p3 = part;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgAddTempo
+//---------------------------------------------------------
+
+void Audio::msgAddTempo(int tick, int tempo, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_ADD_TEMPO;
+ msg.a = tick;
+ msg.b = tempo;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgSetTempo
+//---------------------------------------------------------
+
+void Audio::msgSetTempo(int tick, int tempo, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_SET_TEMPO;
+ msg.a = tick;
+ msg.b = tempo;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgSetGlobalTempo
+//---------------------------------------------------------
+
+void Audio::msgSetGlobalTempo(int val)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_SET_GLOBAL_TEMPO;
+ msg.a = val;
+ sendMessage(&msg, false);
+ }
+
+//---------------------------------------------------------
+// msgDeleteTempo
+//---------------------------------------------------------
+
+void Audio::msgDeleteTempo(int tick, int tempo, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_REMOVE_TEMPO;
+ msg.a = tick;
+ msg.b = tempo;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgAddSig
+//---------------------------------------------------------
+
+void Audio::msgAddSig(int tick, const AL::TimeSignature& sig, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_ADD_SIG;
+ msg.a = tick;
+ msg.b = sig.z;
+ msg.c = sig.n;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgRemoveSig
+//! sends remove tempo signature message
+//---------------------------------------------------------
+
+void Audio::msgRemoveSig(int tick, int z, int n, bool doUndoFlag)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_REMOVE_SIG;
+ msg.a = tick;
+ msg.b = z;
+ msg.c = n;
+ sendMessage(&msg, doUndoFlag);
+ }
+
+//---------------------------------------------------------
+// msgResetMidiDevices
+//---------------------------------------------------------
+
+void Audio::msgResetMidiDevices()
+ {
+ AudioMsg msg;
+ msg.id = SEQM_RESET_DEVICES;
+ sendMessage(&msg, false);
+ }
+
+//---------------------------------------------------------
+// msgInitMidiDevices
+//---------------------------------------------------------
+
+void Audio::msgInitMidiDevices()
+ {
+ AudioMsg msg;
+ msg.id = SEQM_INIT_DEVICES;
+ sendMessage(&msg, false);
+ }
+
+//---------------------------------------------------------
+// panic
+//---------------------------------------------------------
+
+void Audio::msgPanic()
+ {
+ MidiEvent ev1(0, 0, ME_CONTROLLER, CTRL_ALL_SOUNDS_OFF, 0);
+ MidiEvent ev2(0, 0, ME_CONTROLLER, CTRL_RESET_ALL_CTRL, 0);
+
+ MidiChannelList* cl = song->midiChannel();
+ for (iMidiChannel i = cl->begin(); i != cl->end(); ++i) {
+ (*i)->playMidiEvent(&ev1);
+ (*i)->playMidiEvent(&ev2);
+ }
+ }
+
+//---------------------------------------------------------
+// localOff
+//---------------------------------------------------------
+
+void Audio::msgLocalOff()
+ {
+#if 0 //TODO3
+ MidiEvent ev1(0, 0, 0, ME_CONTROLLER, CTRL_LOCAL_OFF, 0);
+ for (int i = 0; i < MIDI_PORTS; ++i) {
+ for (int chan = 0; chan < MIDI_CHANNELS; ++chan) {
+ ev1.setPort(i);
+ ev1.setChannel(chan);
+ msgPlayMidiEvent(&ev1);
+ }
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// msgBounce
+// start bounce operation
+//---------------------------------------------------------
+
+void Audio::msgBounce()
+ {
+ _bounce = true;
+ audioDriver->seekTransport(song->lPos().frame());
+ }
+
+//---------------------------------------------------------
+// msgIdle
+//---------------------------------------------------------
+
+void Audio::msgIdle(bool on)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_IDLE;
+ msg.a = on;
+ sendMessage(&msg, false);
+ }
+
+//---------------------------------------------------------
+// msgAddController
+// add controller value
+//---------------------------------------------------------
+
+void Audio::msgAddController(Track* track, int id, unsigned time, CVal val)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_ADD_CTRL;
+ msg.track = track;
+ msg.a = id;
+ msg.time = time;
+ msg.cval1 = val;
+ song->startUndo();
+ song->undoOp(UndoOp::AddCtrl, track, id, time, val, CVal());
+ sendMessage(&msg, false);
+ song->endUndo(0);
+ }
+
+//---------------------------------------------------------
+// msgRemoveController
+//---------------------------------------------------------
+
+void Audio::msgRemoveController(Track* track, int id, unsigned time)
+ {
+ AudioMsg msg;
+ msg.id = SEQM_REMOVE_CTRL;
+ msg.track = track;
+ msg.a = id;
+ msg.time = time;
+ song->startUndo();
+ CVal a, b;
+ song->undoOp(UndoOp::RemoveCtrl, track, id, time, a, b);
+ sendMessage(&msg, false);
+ song->endUndo(0);
+ }
+
+//---------------------------------------------------------
+// msgSetRtc
+//---------------------------------------------------------
+
+void Audio::msgSetRtc()
+ {
+ AudioMsg msg;
+ msg.id = MS_SET_RTC;
+ sendMsg(&msg);
+ }
+
diff --git a/muse/muse/shortcuts.cpp b/muse/muse/shortcuts.cpp
new file mode 100644
index 00000000..3cfc3b15
--- /dev/null
+++ b/muse/muse/shortcuts.cpp
@@ -0,0 +1,461 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Description:
+// Definition of shortcuts used in the application
+//
+// Copyright (C) 2003 Mathias Lundgren <lunar_shuttle@users.sourceforge.net>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "shortcuts.h"
+#include "widgets/shortcutconfig.h"
+#include "al/xml.h"
+
+// These need to be members of ShortcutConfig, otherwise tr() won't play:
+const shortcut_cg ShortcutConfig::shortcut_category[] = {
+ { GLOBAL_SHRT, QT_TR_NOOP("Global") },
+ { ARRANG_SHRT, QT_TR_NOOP("Arranger") },
+ { PROLL_SHRT, QT_TR_NOOP("Pianoroll") },
+ { DEDIT_SHRT, QT_TR_NOOP("Drumeditor") },
+ { LEDIT_SHRT, QT_TR_NOOP("List editor") },
+ { LMEDIT_SHRT, QT_TR_NOOP("List Mastertrack") },
+// { SCORE_SHRT, "Score editor" },
+// { WAVE_SHRT, "Wave editor" },
+ { ALL_SHRT , QT_TR_NOOP("All categories") }
+ };
+
+// These need to be members of ShortcutConfig, otherwise tr() won't play:
+const char* ShortcutConfig::ls[] = {
+ QT_TR_NOOP("Transport: Start playback from current location"), //0
+ QT_TR_NOOP("Transport: Toggle metronome"),
+ QT_TR_NOOP("Transport: Stop Playback"),
+ QT_TR_NOOP("Transport: Play, Stop, Rewind"),
+ QT_TR_NOOP("Transport: Goto left marker"),
+ QT_TR_NOOP("Transport: Goto right marker"),
+ QT_TR_NOOP("Transport: Toggle Loop section"),
+ QT_TR_NOOP("Transport: Toggle Record"),
+ QT_TR_NOOP("Edit: Copy"),
+ QT_TR_NOOP("Edit: Undo"),
+
+ QT_TR_NOOP("Edit: Redo"), //10
+ QT_TR_NOOP("Edit: Cut" ),
+ QT_TR_NOOP("Edit: Paste,"),
+ QT_TR_NOOP("Edit: Delete" ),
+ QT_TR_NOOP("File: New project"),
+ QT_TR_NOOP("File: Open from disk"),
+ QT_TR_NOOP("File: Save project"),
+ QT_TR_NOOP("File: Open recent file"),
+ QT_TR_NOOP("File: Save as"),
+ QT_TR_NOOP("File: Load template"),
+
+ QT_TR_NOOP("File: Import midi file"),//20
+ QT_TR_NOOP("File: Export midi file"),
+ QT_TR_NOOP("File: Import audio file"),
+ QT_TR_NOOP("File: Quit MusE"),
+ QT_TR_NOOP("Edit: Select parts on track"),
+ QT_TR_NOOP("Open pianoroll"),
+ QT_TR_NOOP("Open drumeditor"),
+ QT_TR_NOOP("Open listeditor"),
+ QT_TR_NOOP("Open graphical mastertrack editor"),
+ QT_TR_NOOP("Open list mastertrack editor"),
+
+
+ QT_TR_NOOP("Open midi transformer"),//30
+ QT_TR_NOOP("Add midi track"),
+ QT_TR_NOOP("Add drum track"),
+ QT_TR_NOOP("Add wave track"),
+ QT_TR_NOOP("Add audio output"),
+ QT_TR_NOOP("Add audio group"),
+ QT_TR_NOOP("Add audio input"),
+ QT_TR_NOOP("Add audio aux"),
+ QT_TR_NOOP("Structure: Global cut"),
+ QT_TR_NOOP("Structure: Global insert"),
+
+ QT_TR_NOOP("Structure: Global split"),//40
+ QT_TR_NOOP("Structure: Copy range"),
+ QT_TR_NOOP("Structure: Cut events"),
+ QT_TR_NOOP("View: Open mixer window"),
+ QT_TR_NOOP("View: Toggle transport window"),
+ QT_TR_NOOP("View: Toggle bigtime window"),
+ QT_TR_NOOP("View: Open marker window"),
+ QT_TR_NOOP("Settings: Follow song by page"),
+ QT_TR_NOOP("Settings: Follow song off"),
+ QT_TR_NOOP("Settings: Follow song continuous"),
+
+ QT_TR_NOOP("Settings: Global configuration"), //50
+ QT_TR_NOOP("Settings: Configure shortcuts"),
+ QT_TR_NOOP("Settings: Configure metronome"),
+ QT_TR_NOOP("Settings: Midi sync configuration"),
+ QT_TR_NOOP("Settings: Midi file export configuration"),
+ QT_TR_NOOP("Settings: Appearance settings"),
+ QT_TR_NOOP("Settings: Midi ports / Soft Synth"),
+ QT_TR_NOOP("Settings: Audio subsystem configuration"),
+ QT_TR_NOOP("Midi: Edit midi instruments"),
+ QT_TR_NOOP("Midi: Open midi input transform"),
+
+ QT_TR_NOOP("Midi: Open midi input filter"), //60
+ QT_TR_NOOP("Midi: Midi input transpose"),
+ QT_TR_NOOP("Midi: Midi remote control"),
+ QT_TR_NOOP("Midi: Random rhythm generator"),
+ QT_TR_NOOP("Midi: Reset midi"),
+ QT_TR_NOOP("Midi: Init midi"),
+ QT_TR_NOOP("Midi: Midi local off"),
+ QT_TR_NOOP("Audio: Bounce audio to track"),
+ QT_TR_NOOP("Audio: Bounce audio to file"),
+ QT_TR_NOOP("Audio: Restart audio"),
+
+ QT_TR_NOOP("Automation: Mixer automation"), //70
+ QT_TR_NOOP("Automation: Take mixer snapshot"),
+ QT_TR_NOOP("Automation: Clear mixer automation"),
+ QT_TR_NOOP("Help: Open Manual"),
+ QT_TR_NOOP("Help: Toggle whatsthis mode"),
+ QT_TR_NOOP("Edit: Edit selected part"),
+ QT_TR_NOOP("Edit: Select nearest part on track above"),
+ QT_TR_NOOP("Edit: Add nearest part on track above"),
+ QT_TR_NOOP("Edit: Select nearest part on track below"),
+ QT_TR_NOOP("Edit: Add nearest part on track below"),
+
+ QT_TR_NOOP("Midi: Transpose"), //80
+ QT_TR_NOOP("Edit: Select all"),
+ QT_TR_NOOP("Edit: Select none"),
+ QT_TR_NOOP("Edit: Invert selection"),
+ QT_TR_NOOP("Edit: Select events/parts inside locators"),
+ QT_TR_NOOP("Edit: Select events/parts outside locators"),
+ QT_TR_NOOP("Edit: Select nearest part/event to the left"),
+ QT_TR_NOOP("Edit: Add nearest part/event to the left to selection"),
+ QT_TR_NOOP("Edit: Select nearest part/event to the left"),
+ QT_TR_NOOP("Edit: Add nearest part/event to the right to selection"),
+
+ QT_TR_NOOP("Edit: Set locators to selection"), //90
+ QT_TR_NOOP("Edit: Increase pitch"),
+ QT_TR_NOOP("Edit: Decrease pitch"),
+ QT_TR_NOOP("Edit: Set fixed length on midi events"),
+ QT_TR_NOOP("Quantize: Over Quantize"),
+ QT_TR_NOOP("Quantize: Note On Quantize"),
+ QT_TR_NOOP("Quantize: Note On/Off Quantize"),
+ QT_TR_NOOP("Quantize: Iterative Quantize"),
+ QT_TR_NOOP("Quantize: Configure quant"),
+ QT_TR_NOOP("Quantize: Modify Gate Time"),
+
+ QT_TR_NOOP("Quantize: Modify Velocity"), //100
+ QT_TR_NOOP("Edit: Crescendo"),
+ QT_TR_NOOP("Edit: Thin Out"),
+ QT_TR_NOOP("Edit: Erase Event"),
+ QT_TR_NOOP("Edit: Note Shift"),
+ QT_TR_NOOP("Edit: Move Clock"),
+ QT_TR_NOOP("Edit: Copy Measure"),
+ QT_TR_NOOP("Edit: Erase Measure"),
+ QT_TR_NOOP("Edit: Delete Measure"),
+ QT_TR_NOOP("Edit: Create Measure"),
+
+ QT_TR_NOOP("Edit: Change event color"), //110
+ QT_TR_NOOP("Tool: Pointer"),
+ QT_TR_NOOP("Tool: Pencil"),
+ QT_TR_NOOP("Tool: Eraser"),
+ QT_TR_NOOP("Tool: Line Draw"),
+ QT_TR_NOOP("Tool: Scissor"),
+ QT_TR_NOOP("Tool: Glue"),
+ QT_TR_NOOP("Tool: Mute"),
+ QT_TR_NOOP("Transport: Increase current position"),
+ QT_TR_NOOP("Transport: Decrease current position"),
+
+ QT_TR_NOOP("Quantize: Set quantize to 1/1 note"), //120
+ QT_TR_NOOP("Quantize: Set quantize to 1/2 note"),
+ QT_TR_NOOP("Quantize: Set quantize to 1/4 note"),
+ QT_TR_NOOP("Quantize: Set quantize to 1/8 note"),
+ QT_TR_NOOP("Quantize: Set quantize to 1/16 note"),
+ QT_TR_NOOP("Quantize: Set quantize to 1/32 note"),
+ QT_TR_NOOP("Quantize: Set quantize to 1/64 note"),
+ QT_TR_NOOP("Quantize: Toggle triol quantization"),
+ QT_TR_NOOP("Quantize: Toggle punctuation quantization"),
+ QT_TR_NOOP("Quantize: Toggle punctuation quantization (2)"),
+
+ QT_TR_NOOP("Edit: Insert at location"), //130
+ QT_TR_NOOP("Insert Note"),
+ QT_TR_NOOP("Insert SysEx"),
+ QT_TR_NOOP("Insert Ctrl"),
+ QT_TR_NOOP("Insert Meta"),
+ QT_TR_NOOP("Insert Channel Aftertouch"),
+ QT_TR_NOOP("Insert Key Aftertouch"),
+ QT_TR_NOOP("Edit: Increase event position"),
+ QT_TR_NOOP("Edit: Decrease event position"),
+ QT_TR_NOOP("Insert Tempo"),
+
+ QT_TR_NOOP("Insert Signature"), //140
+ QT_TR_NOOP("Change Event Position"),
+ QT_TR_NOOP("Edit Event Value")
+ };
+
+
+shortcut shortcuts[SHRT_NUM_OF_ELEMENTS];
+KeyboardMovementIndicator shortcutsKbdMovement; //for keeping track of active part selected by kbd
+
+void defShrt(int shrt, int key, int locstr_id, int type, const char* xml)
+{
+ shortcuts[shrt].key = key;
+ QString test = ShortcutConfig::Translate(ShortcutConfig::ls[locstr_id]);
+ //printf("shrt=%d key=%d locstr_id=%d str=%s\n", shrt, key, locstr_id, test.toLatin1().data());
+ shortcuts[shrt].descr = ShortcutConfig::Translate(ShortcutConfig::ls[locstr_id]); //shortcutDescr(shrt); //(QT_TR_NOOP(descr);
+ shortcuts[shrt].type = type;
+ shortcuts[shrt].xml = xml;
+}
+
+void initShortCuts()
+ {
+ //Global:
+ defShrt(SHRT_PLAY_SONG, Qt::Key_Enter, 0, GLOBAL_SHRT, "play");
+ defShrt(SHRT_TOGGLE_METRO, Qt::Key_C, 1, GLOBAL_SHRT,"toggle_metro");
+ defShrt(SHRT_STOP, Qt::Key_Insert,2, GLOBAL_SHRT, "stop");
+ defShrt(SHRT_PLAY_TOGGLE, Qt::Key_Space, 3, GLOBAL_SHRT, "play_toggle");
+ defShrt(SHRT_GOTO_LEFT, Qt::Key_End, 4, GLOBAL_SHRT, "goto_left");
+ defShrt(SHRT_GOTO_RIGHT, Qt::Key_PageDown, 5, GLOBAL_SHRT, "goto_right");
+ defShrt(SHRT_TOGGLE_LOOP, Qt::Key_Slash, 6, GLOBAL_SHRT, "toggle_loop");
+ defShrt(SHRT_START_REC, Qt::Key_Asterisk, 7, GLOBAL_SHRT, "toggle_rec");
+ defShrt(SHRT_COPY, Qt::CTRL + Qt::Key_C, 8, INVIS_SHRT, "copy");
+ defShrt(SHRT_UNDO, Qt::CTRL + Qt::Key_Z, 9, INVIS_SHRT, "undo");
+
+ defShrt(SHRT_REDO, Qt::CTRL + Qt::Key_Y, 10, INVIS_SHRT, "redo");
+ defShrt(SHRT_CUT, Qt::CTRL + Qt::Key_X, 11, INVIS_SHRT, "cut");
+ defShrt(SHRT_PASTE, Qt::CTRL + Qt::Key_V, 12, INVIS_SHRT, "paste");
+ defShrt(SHRT_DELETE, Qt::Key_Delete, 13, INVIS_SHRT, "delete");
+
+ //-----------------------------------------------------------
+ // Arranger:
+ defShrt(SHRT_NEW, Qt::CTRL + Qt::Key_N, 14, ARRANG_SHRT + DEDIT_SHRT, "new_project");
+ defShrt(SHRT_OPEN, Qt::CTRL + Qt::Key_O, 15, ARRANG_SHRT + DEDIT_SHRT, "open_project");
+ defShrt(SHRT_SAVE, Qt::CTRL + Qt::Key_S, 16, ARRANG_SHRT + DEDIT_SHRT, "save_project");
+ //-----------------------------------------------------------
+
+ defShrt(SHRT_OPEN_RECENT, Qt::CTRL + Qt::Key_1, 17, ARRANG_SHRT, "open_recent");
+ defShrt(SHRT_SAVE_AS, 0 , 18, ARRANG_SHRT, "save_project_as");
+ defShrt(SHRT_LOAD_TEMPLATE, 0 , 19, ARRANG_SHRT, "load_template");
+// defShrt(SHRT_CONFIG_PRINTER, Qt::CTRL + Qt::Key_P, "Configure printer", ARRANG_SHRT, "config_printer");
+
+ defShrt(SHRT_IMPORT_MIDI, 0 , 20, ARRANG_SHRT, "import_midi");
+ defShrt(SHRT_EXPORT_MIDI, 0 , 21, ARRANG_SHRT, "export_midi");
+ defShrt(SHRT_IMPORT_AUDIO, 0 , 22, ARRANG_SHRT, "import_audio");
+ defShrt(SHRT_QUIT, Qt::CTRL + Qt::Key_Q, 23, ARRANG_SHRT, "quit");
+// defShrt(SHRT_DESEL_PARTS, Qt::CTRL + Qt::Key_B, "Deselect all parts", ARRANG_SHRT, "deselect_parts");
+ defShrt(SHRT_SELECT_PRTSTRACK, Qt::CTRL+ Qt::ALT + Qt::Key_P, 24, ARRANG_SHRT, "select_parts_on_track");
+ defShrt(SHRT_OPEN_PIANO, Qt::CTRL + Qt::Key_E, 25, ARRANG_SHRT, "open_pianoroll");
+ defShrt(SHRT_OPEN_DRUMS, Qt::CTRL + Qt::Key_D, 26, ARRANG_SHRT, "open_drumedit");
+ defShrt(SHRT_OPEN_LIST, Qt::CTRL + Qt::Key_L, 27, ARRANG_SHRT, "open_listedit");
+ defShrt(SHRT_OPEN_GRAPHIC_MASTER, Qt::CTRL + Qt::Key_M, 28, ARRANG_SHRT, "open_graph_master");
+ defShrt(SHRT_OPEN_LIST_MASTER, Qt::CTRL + Qt::SHIFT + Qt::Key_M, 29, ARRANG_SHRT, "open_list_master");
+
+ defShrt(SHRT_OPEN_MIDI_TRANSFORM, Qt::CTRL + Qt::Key_T, 30, ARRANG_SHRT, "open_midi_transform");
+ defShrt(SHRT_ADD_MIDI_TRACK, Qt::CTRL + Qt::Key_J, 31, ARRANG_SHRT, "add_midi_track");
+ defShrt(SHRT_ADD_DRUM_TRACK, 0, 32, ARRANG_SHRT, "add_drum_track");
+ defShrt(SHRT_ADD_WAVE_TRACK, 0, 33, ARRANG_SHRT, "add_wave_track");
+ defShrt(SHRT_ADD_AUDIO_OUTPUT, 0, 34, ARRANG_SHRT, "add_audio_output");
+ defShrt(SHRT_ADD_AUDIO_GROUP, 0, 35, ARRANG_SHRT, "add_audio_group");
+ defShrt(SHRT_ADD_AUDIO_INPUT, 0, 36, ARRANG_SHRT, "add_audio_input");
+ defShrt(SHRT_ADD_AUDIO_AUX , 0, 37, ARRANG_SHRT, "add_audio_aux");
+ defShrt(SHRT_GLOBAL_CUT, 0, 38, ARRANG_SHRT, "global_cut");
+ defShrt(SHRT_GLOBAL_INSERT, 0, 39, ARRANG_SHRT, "global_insert");
+
+ defShrt(SHRT_GLOBAL_SPLIT, 0, 40, ARRANG_SHRT, "global_split");
+ defShrt(SHRT_COPY_RANGE, 0, 41, ARRANG_SHRT, "copy_range");
+ defShrt(SHRT_CUT_EVENTS, 0, 42, ARRANG_SHRT, "cut_events");
+ defShrt(SHRT_OPEN_MIXER, Qt::Key_F10, 43, ARRANG_SHRT, "toggle_mixer");
+ defShrt(SHRT_OPEN_TRANSPORT, Qt::Key_F11, 44, ARRANG_SHRT, "toggle_transport");
+ defShrt(SHRT_OPEN_BIGTIME, Qt::Key_F12, 45, ARRANG_SHRT, "toggle_bigtime");
+ defShrt(SHRT_OPEN_MARKER, Qt::Key_F9, 46, ARRANG_SHRT, "marker_window");
+ defShrt(SHRT_FOLLOW_JUMP, 0, 47, ARRANG_SHRT, "follow_jump");
+ defShrt(SHRT_FOLLOW_NO, 0, 48, ARRANG_SHRT, "follow_no");
+ defShrt(SHRT_FOLLOW_CONTINUOUS, 0, 49, ARRANG_SHRT, "follow_continuous");
+
+ defShrt(SHRT_GLOBAL_CONFIG, 0, 50, ARRANG_SHRT, "configure_global");
+ defShrt(SHRT_CONFIG_SHORTCUTS, 0, 51, ARRANG_SHRT, "configure_shortcuts");
+ defShrt(SHRT_CONFIG_METRONOME, 0, 52, ARRANG_SHRT, "configure_metronome");
+ defShrt(SHRT_CONFIG_MIDISYNC, 0, 53, ARRANG_SHRT, "configure_midi_sync");
+ defShrt(SHRT_MIDI_FILE_CONFIG, 0, 54, ARRANG_SHRT, "configure_midi_file");
+ defShrt(SHRT_APPEARANCE_SETTINGS, 0, 55, ARRANG_SHRT, "configure_appearance_settings");
+ defShrt(SHRT_CONFIG_MIDI_PORTS, 0, 56, ARRANG_SHRT, "configure_midi_ports");
+ defShrt(SHRT_CONFIG_AUDIO_PORTS, 0, 57, ARRANG_SHRT, "configure_audio_ports");
+ defShrt(SHRT_MIDI_EDIT_INSTRUMENTS, 0, 58, ARRANG_SHRT, "midi_edit_instruments");
+ defShrt(SHRT_MIDI_INPUT_TRANSFORM, 0, 59, ARRANG_SHRT, "midi_open_input_transform");
+
+ defShrt(SHRT_MIDI_INPUT_FILTER, 0, 60, ARRANG_SHRT, "midi_open_input_filter");
+ defShrt(SHRT_MIDI_INPUT_TRANSPOSE, 0, 61, ARRANG_SHRT, "midi_open_input_transpose");
+ defShrt(SHRT_MIDI_REMOTE_CONTROL, 0, 62, ARRANG_SHRT, "midi_remote_control");
+ defShrt(SHRT_RANDOM_RHYTHM_GENERATOR,0,63, ARRANG_SHRT, "midi_random_rhythm_generator");
+ defShrt(SHRT_MIDI_RESET, 0, 64, ARRANG_SHRT, "midi_reset");
+ defShrt(SHRT_MIDI_INIT, 0, 65, ARRANG_SHRT, "midi_init");
+ defShrt(SHRT_MIDI_LOCAL_OFF, 0, 66, ARRANG_SHRT, "midi_local_off");
+ defShrt(SHRT_AUDIO_BOUNCE_TO_TRACK, 0, 67, ARRANG_SHRT, "audio_bounce_to_track");
+ defShrt(SHRT_AUDIO_BOUNCE_TO_FILE, 0, 68, ARRANG_SHRT, "audio_bounce_to_file");
+ defShrt(SHRT_AUDIO_RESTART, 0, 69, ARRANG_SHRT, "audio_restart");
+
+// defShrt(SHRT_MIXER_AUTOMATION, 0, "Automation: Mixer automation", ARRANG_SHRT, "mixer_automation");
+ defShrt(SHRT_MIXER_SNAPSHOT, 0, 71, ARRANG_SHRT, "mixer_snapshot");
+ defShrt(SHRT_MIXER_AUTOMATION_CLEAR,0, 72, ARRANG_SHRT, "mixer_automation_clear");
+
+// defShrt(SHRT_OPEN_CLIPS, 0, "View audio clips", ARRANG_SHRT, "view_audio_clips");
+ defShrt(SHRT_OPEN_HELP, Qt::Key_F1, 73, ARRANG_SHRT, "open_help");
+ defShrt(SHRT_START_WHATSTHIS, Qt::SHIFT + Qt::Key_F1, 74, ARRANG_SHRT, "toggle_whatsthis");
+
+ defShrt(SHRT_EDIT_PART, Qt::Key_Return, 75, ARRANG_SHRT, "edit_selected_part");
+ defShrt(SHRT_SEL_ABOVE, Qt::Key_Up, 76, ARRANG_SHRT, "sel_part_above");
+ defShrt(SHRT_SEL_ABOVE_ADD, Qt::SHIFT + Qt::Key_Up, 77, ARRANG_SHRT, "sel_part_above_add");
+ defShrt(SHRT_SEL_BELOW, Qt::Key_Down, 78, ARRANG_SHRT, "sel_part_below");
+ defShrt(SHRT_SEL_BELOW_ADD, Qt::SHIFT + Qt::Key_Down, 79, ARRANG_SHRT, "sel_part_below_add");
+
+ //-----------------------------------------------------------
+
+ defShrt(SHRT_TRANSPOSE, 0, 80, ARRANG_SHRT + PROLL_SHRT, "midi_transpose");
+
+ //-----------------------------------------------------------
+
+ defShrt(SHRT_SELECT_ALL, Qt::CTRL + Qt::Key_A, 81, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "sel_all");
+ defShrt(SHRT_SELECT_NONE, Qt::CTRL + Qt::SHIFT + Qt::Key_A, 82, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "sel_none");
+ defShrt(SHRT_SELECT_INVERT, Qt::CTRL + Qt::Key_I, 83, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "sel_inv");
+ defShrt(SHRT_SELECT_ILOOP, 0, 84, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "sel_ins_loc");
+ defShrt(SHRT_SELECT_OLOOP, 0, 85, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "sel_out_loc");
+ defShrt(SHRT_SEL_LEFT, Qt::Key_Left, 86, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "sel_left");
+ defShrt(SHRT_SEL_LEFT_ADD, Qt::Key_Left + Qt::SHIFT, 87, PROLL_SHRT + DEDIT_SHRT, "sel_left_add");
+ defShrt(SHRT_SEL_RIGHT, Qt::Key_Right, 88, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT,"sel_right");
+ defShrt(SHRT_SEL_RIGHT_ADD, Qt::Key_Right + Qt::SHIFT, 89, PROLL_SHRT + DEDIT_SHRT,"sel_right_add");
+
+ defShrt(SHRT_LOCATORS_TO_SELECTION, Qt::ALT + Qt::Key_P, 90, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "loc_to_sel");
+ defShrt(SHRT_INC_PITCH, Qt::CTRL + Qt::Key_Up, 91, PROLL_SHRT + DEDIT_SHRT, "sel_inc_pitch");
+ defShrt(SHRT_DEC_PITCH, Qt::CTRL + Qt::Key_Down, 92, PROLL_SHRT + DEDIT_SHRT, "sel_dec_pitch");
+
+ //-----------------------------------------------------------
+ //Drum:
+ //-----------------------------------------------------------
+
+ defShrt(SHRT_FIXED_LEN, Qt::ALT + Qt::Key_L, 93, DEDIT_SHRT, "midi_fixed_len");
+
+ //-----------------------------------------------------------
+ //Pianoroll:
+ //-----------------------------------------------------------
+
+ defShrt(SHRT_OVER_QUANTIZE, 0, 94, PROLL_SHRT, "midi_over_quant");
+ defShrt(SHRT_ON_QUANTIZE, 0, 95, PROLL_SHRT, "midi_quant_noteon");
+ defShrt(SHRT_ONOFF_QUANTIZE, 0, 96, PROLL_SHRT,"midi_quant_noteoff");
+ defShrt(SHRT_ITERATIVE_QUANTIZE,0,97, PROLL_SHRT,"midi_quant_iterative");
+ defShrt(SHRT_CONFIG_QUANT, Qt::CTRL + Qt::ALT + Qt::Key_Q, 98, PROLL_SHRT, "config_quant");
+ defShrt(SHRT_MODIFY_GATE_TIME, 0, 99, PROLL_SHRT, "midi_mod_gate_time");
+
+ defShrt(SHRT_MODIFY_VELOCITY, 0, 100, PROLL_SHRT, "midi_mod_velo");
+ defShrt(SHRT_CRESCENDO, 0, 101, PROLL_SHRT, "midi_crescendo");
+ defShrt(SHRT_THIN_OUT, 0, 102, PROLL_SHRT, "midi_thin_out");
+ defShrt(SHRT_ERASE_EVENT, 0, 103, PROLL_SHRT, "midi_erase_event");
+ defShrt(SHRT_NOTE_SHIFT, 0, 104, PROLL_SHRT, "midi_note_shift");
+ defShrt(SHRT_MOVE_CLOCK, 0, 105, PROLL_SHRT, "midi_move_clock");
+ defShrt(SHRT_COPY_MEASURE, 0, 106, PROLL_SHRT, "midi_copy_measure");
+ defShrt(SHRT_ERASE_MEASURE, 0, 107, PROLL_SHRT,"midi_erase_measure");
+ defShrt(SHRT_DELETE_MEASURE, 0, 108, PROLL_SHRT, "midi_delete_measure");
+ defShrt(SHRT_CREATE_MEASURE, 0, 109, PROLL_SHRT, "midi_create_measure");
+
+ defShrt(SHRT_EVENT_COLOR, Qt::Key_E, 110, PROLL_SHRT, "change_event_color");
+
+ // Shortcuts for tools
+ // global
+ defShrt(SHRT_TOOL_POINTER, Qt::Key_A, 111, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "pointer_tool");
+ defShrt(SHRT_TOOL_PENCIL, Qt::Key_D, 112, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "pencil_tool");
+ defShrt(SHRT_TOOL_RUBBER, Qt::Key_R, 113, ARRANG_SHRT + PROLL_SHRT + DEDIT_SHRT, "eraser_tool");
+ // piano roll & drum editor
+ defShrt(SHRT_TOOL_LINEDRAW, 0, 114, PROLL_SHRT + DEDIT_SHRT, "line_draw_tool");
+ // arranger
+ defShrt(SHRT_TOOL_SCISSORS, Qt::Key_S, 115, ARRANG_SHRT, "scissor_tool");
+ defShrt(SHRT_TOOL_GLUE, Qt::Key_G, 116, ARRANG_SHRT, "glue_tool");
+ defShrt(SHRT_TOOL_MUTE, 0, 117, ARRANG_SHRT, "mute_tool");
+
+ //Increase/decrease current position, is going to be in arranger & drumeditor as well
+ defShrt(SHRT_POS_INC, Qt::Key_Plus, 118, GLOBAL_SHRT, "curpos_increase");
+ defShrt(SHRT_POS_DEC, Qt::Key_Minus, 119, GLOBAL_SHRT, "curpos_decrease");
+
+ defShrt(SHRT_SET_QUANT_1, Qt::Key_1, 120, PROLL_SHRT, "midi_quant_1");
+ defShrt(SHRT_SET_QUANT_2, Qt::Key_2, 121, PROLL_SHRT, "midi_quant_2");
+ defShrt(SHRT_SET_QUANT_3, Qt::Key_3, 122, PROLL_SHRT, "midi_quant_3");
+ defShrt(SHRT_SET_QUANT_4, Qt::Key_4, 123, PROLL_SHRT, "midi_quant_4");
+ defShrt(SHRT_SET_QUANT_5, Qt::Key_5, 124, PROLL_SHRT, "midi_quant_5");
+ defShrt(SHRT_SET_QUANT_6, Qt::Key_6, 125, PROLL_SHRT, "midi_quant_6");
+ defShrt(SHRT_SET_QUANT_7, Qt::Key_7, 126, PROLL_SHRT, "midi_quant_7");
+
+ defShrt(SHRT_TOGGLE_TRIOL, Qt::Key_T, 127, PROLL_SHRT, "midi_quant_triol");
+ defShrt(SHRT_TOGGLE_PUNCT, Qt::Key_Period, 128, PROLL_SHRT, "midi_quant_punct");
+ defShrt(SHRT_TOGGLE_PUNCT2, Qt::Key_Comma, 129, PROLL_SHRT, "midi_quant_punct2");
+
+ defShrt(SHRT_INSERT_AT_LOCATION, Qt::SHIFT + Qt::Key_Right, 130, PROLL_SHRT, "midi_insert_at_loc");
+
+ //-----------------------------------------------------------
+ // List edit:
+ //-----------------------------------------------------------
+
+ defShrt(SHRT_LE_INS_NOTES, Qt::CTRL + Qt::Key_N, 131, LEDIT_SHRT, "le_ins_note");
+ defShrt(SHRT_LE_INS_SYSEX, Qt::CTRL + Qt::Key_S, 132, LEDIT_SHRT, "le_ins_sysex");
+ defShrt(SHRT_LE_INS_CTRL, Qt::CTRL + Qt::Key_T, 133, LEDIT_SHRT, "le_ins_ctrl");
+ defShrt(SHRT_LE_INS_META, 0, 134, LEDIT_SHRT, "le_ins_meta");
+ defShrt(SHRT_LE_INS_CHAN_AFTERTOUCH, Qt::CTRL + Qt::Key_A, 135, LEDIT_SHRT, "le_ins_afttouch");
+ defShrt(SHRT_LE_INS_POLY_AFTERTOUCH, Qt::CTRL + Qt::Key_P, 136, LEDIT_SHRT, "le_ins_poly");
+
+ defShrt(SHRT_INC_POS, Qt::CTRL + Qt::Key_Right, 137, PROLL_SHRT, "sel_inc_pos");
+ defShrt(SHRT_DEC_POS, Qt::CTRL + Qt::Key_Left, 138, PROLL_SHRT, "sel_dec_pos");
+
+ //-----------------------------------------------------------
+ // List masteredit:
+ //-----------------------------------------------------------
+ defShrt(SHRT_LM_INS_TEMPO, Qt::CTRL + Qt::Key_T, 139, LMEDIT_SHRT, "lm_ins_tempo");
+ defShrt(SHRT_LM_INS_SIG , Qt::CTRL + Qt::Key_R, 140, LMEDIT_SHRT, "lm_ins_sig");
+ defShrt(SHRT_LM_EDIT_BEAT, Qt::CTRL + Qt::SHIFT+ Qt::Key_E, 141, LMEDIT_SHRT, "lm_edit_beat");
+ defShrt(SHRT_LM_EDIT_VALUE, Qt::CTRL + Qt::Key_E, 142, LMEDIT_SHRT, "lm_edit_val");
+ }
+
+
+int getShrtByTag(const char* xml)
+ {
+ for (int i=0; i<SHRT_NUM_OF_ELEMENTS; i++) {
+ if (shortcuts[i].xml) {
+ if (strcmp(shortcuts[i].xml, xml) == 0)
+ return i;
+ }
+ }
+ return -1;
+ }
+
+void writeShortCuts(Xml& xml)
+ {
+ xml.tag("shortcuts");
+ for (int i=0; i < SHRT_NUM_OF_ELEMENTS; i++) {
+ if (shortcuts[i].xml != NULL && shortcuts[i].type != INVIS_SHRT) //Avoid nullptr & hardcoded shortcuts
+ xml.intTag(shortcuts[i].xml, shortcuts[i].key);
+ }
+ xml.etag("shortcuts");
+ }
+
+//---------------------------------------------------------
+// readShortCuts
+//---------------------------------------------------------
+
+void readShortCuts(QDomNode node)
+ {
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ int index = getShrtByTag(e.tagName().toLatin1().data());
+ if (index != -1) {
+ shortcuts[index].key = e.text().toInt();
+ //printf("shortcuts[%d].key = %d, %s\n",index, shortcuts[index].key, shortcuts[index].descr);
+ }
+ else
+ printf("MusE:readShortCuts: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+
diff --git a/muse/muse/shortcuts.h b/muse/muse/shortcuts.h
new file mode 100644
index 00000000..17c12a14
--- /dev/null
+++ b/muse/muse/shortcuts.h
@@ -0,0 +1,308 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2003 Mathias Lundgren <lunar_shuttle@users.sourceforge.net>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __SHORTCUTS_H__
+#define __SHORTCUTS_H__
+
+class Part;
+class Track;
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+//
+// Shortcut categories
+//
+#define PROLL_SHRT 1 // Pianoroll shortcut
+#define DEDIT_SHRT 2 // Drumedit shortcut
+#define LEDIT_SHRT 4 // Listedit shortcut
+#define SCORE_SHRT 8 // Score shortcut
+#define ARRANG_SHRT 16 // Arrenger shortcut
+#define TRANSP_SHRT 32 // Transport shortcut
+#define WAVE_SHRT 64 // Waveedit shortcut
+#define GLOBAL_SHRT 128 // Global shortcuts
+#define LMEDIT_SHRT 256 // List masteredit
+#define MEDIT_SHRT 512 // Master editor
+#define ALL_SHRT 1023 // All shortcuts
+#define INVIS_SHRT 1024 // Shortcuts not shown in the config-dialog. Hard-coded. To avoid conflicts
+
+#define SHRT_NUM_OF_CATEGORIES 7 //Number of shortcut categories
+
+//---------------------------------------------------------
+// shortcut
+//---------------------------------------------------------
+//! Holds the basic values for a configurable shortcut
+struct shortcut
+ {
+ int key; /*! Integer storing the keyboard shortcut. */
+ QString descr; /*! Description of the shortcut, shown in editor. Mapped against ls[] in shortcuts.cpp */
+ const char* xml; /*! xml tag name for configuration file*/
+ int type; /*! Bitmask category value mapped against PROLL_SHRT, DEDIT_SHRT etc. One shortcut can be a member of many categories */
+ };
+
+//! Describes a shortcut category
+struct shortcut_cg
+ {
+ int id_flag; /*! The category (one of PROLL_SHRT, DEDIT_SHRT etc) */
+ const char* name; /*! Name (shown in editor) */
+ };
+
+//------------------------------------------------------------------------------------------------
+// KeyboardMovementIndicator
+//! Used by Arranger to keep track of which Part is currently active when navigating with keys
+//------------------------------------------------------------------------------------------------
+class KeyboardMovementIndicator {
+ //! Left position of the active part, in ticks
+ unsigned lpos;
+ //! Right position of the active part, in ticks
+ unsigned rpos;
+ //! Last selected part (the active part)
+ Part* lastSelectedPart;
+ //! Track the last selected part belongs to
+ Track* lastSelectedTrack;
+
+ public:
+ KeyboardMovementIndicator()
+ { reset(); }
+
+ void setPos(int l, int r) { lpos = l; rpos = r; }
+ void setPart(Part* p) { lastSelectedPart = p; }
+ void setTrack(Track* t) { lastSelectedTrack = t; }
+ unsigned getLpos() { return lpos; }
+ unsigned getRpos() { return rpos; }
+ Part* part() { return lastSelectedPart; }
+ Track* track() { return lastSelectedTrack; }
+ //! Resets the values (equals to no active part)
+ void reset() { lpos = 0; rpos = 0; lastSelectedPart = 0; lastSelectedTrack = 0; }
+ //! Checks if there is any active part
+ bool isValid() { return (lastSelectedPart && lastSelectedTrack); }
+ };
+
+//! Enumeration of the configurable shortcuts
+enum {
+ //Transport/Positioning
+ SHRT_PLAY_SONG, // enter
+ SHRT_PLAY_TOGGLE, // space
+ SHRT_STOP, //Insert
+ SHRT_GOTO_LEFT, //End-keypad
+ SHRT_GOTO_RIGHT, //Cursordown-keypad
+ SHRT_POS_INC, // Plus
+ SHRT_POS_DEC, // Minus
+ SHRT_TOGGLE_LOOP, // Slash
+ SHRT_TOGGLE_METRO, // C
+ SHRT_START_REC, // *(keypad)
+
+ //Main + Drumeditor
+ SHRT_NEW, //Ctrl+N
+ SHRT_OPEN, //Ctrl+O
+ SHRT_SAVE, //Ctrl+S
+
+ //Used throughout the app:
+ SHRT_UNDO, //Ctrl+Z
+ SHRT_REDO, //Ctrl+Y
+ SHRT_COPY, //Ctrl+C
+ SHRT_CUT, //Ctrl+X
+ SHRT_PASTE, //Ctrl+V
+ SHRT_DELETE,//Delete
+
+
+ //Main:
+ SHRT_SAVE_AS, //Default: undefined
+ SHRT_OPEN_RECENT, //Ctrl+1
+ SHRT_LOAD_TEMPLATE, //Default: undefined
+ SHRT_CONFIG_PRINTER, //Ctrl+P
+ SHRT_IMPORT_MIDI, //Default: undefined
+ SHRT_EXPORT_MIDI, //Default: undefined
+ SHRT_IMPORT_AUDIO, //Default: undefined
+ SHRT_QUIT, //Default: Ctrl+Q
+
+ SHRT_DESEL_PARTS, //Ctrl+B
+ SHRT_SELECT_PRTSTRACK, //Default: undefined
+ SHRT_OPEN_PIANO, //Ctrl+E
+ SHRT_OPEN_SCORE, //Ctrl+R
+ SHRT_OPEN_DRUMS, //Ctrl+D
+ SHRT_OPEN_LIST, //Ctrl+L
+ SHRT_OPEN_GRAPHIC_MASTER, //Ctrl+M
+ SHRT_OPEN_LIST_MASTER, //Ctrl+Shift+M
+ SHRT_OPEN_MIDI_TRANSFORM, //Ctrl+T
+
+ SHRT_GLOBAL_CUT, //Default: undefined
+ SHRT_GLOBAL_INSERT, //Default: undefined
+ SHRT_GLOBAL_SPLIT, //Default: undefined
+ SHRT_COPY_RANGE, //Default: undefined
+ SHRT_CUT_EVENTS, //Default: undefined
+
+ SHRT_OPEN_TRANSPORT, //F11
+ SHRT_OPEN_BIGTIME, //F12
+ SHRT_OPEN_MIXER, //Ctrl+*
+ SHRT_OPEN_MARKER, // F9
+ SHRT_OPEN_CLIPS, //Default: undefined
+
+ SHRT_FOLLOW_JUMP, //Default: undefined
+ SHRT_FOLLOW_NO, //Default: undefined
+ SHRT_FOLLOW_CONTINUOUS, //Default: undefined
+
+ SHRT_GLOBAL_CONFIG, //Default: undefined
+ SHRT_CONFIG_SHORTCUTS, //Default: undefined
+ SHRT_CONFIG_METRONOME, //Default: undefined
+ SHRT_CONFIG_MIDISYNC, //Default: undefined
+ SHRT_MIDI_FILE_CONFIG, //Default: undefined
+ SHRT_APPEARANCE_SETTINGS, //Default: undefined
+ SHRT_CONFIG_MIDI_PORTS, //Default: undefined
+ SHRT_CONFIG_AUDIO_PORTS, //Default: undefined
+ //SHRT_SAVE_GLOBAL_CONFIG, //Default: undefined
+
+ SHRT_MIDI_EDIT_INSTRUMENTS, //Default: undefined
+ SHRT_MIDI_INPUT_TRANSFORM, //Default: undefined
+ SHRT_MIDI_INPUT_FILTER, //Default: undefined
+ SHRT_MIDI_INPUT_TRANSPOSE, //Default: undefined
+ SHRT_MIDI_REMOTE_CONTROL, //Default: undefined
+ SHRT_RANDOM_RHYTHM_GENERATOR, //Default: undefined
+ SHRT_MIDI_RESET, //Default: undefined
+ SHRT_MIDI_INIT, //Default: undefined
+ SHRT_MIDI_LOCAL_OFF, //Default: undefined
+
+ SHRT_AUDIO_BOUNCE_TO_TRACK, //Default: undefined
+ SHRT_AUDIO_BOUNCE_TO_FILE, //Default: undefined
+ SHRT_AUDIO_RESTART, //Default: undefined
+
+// SHRT_MIXER_AUTOMATION, //Default: undefined
+ SHRT_MIXER_SNAPSHOT, //Default: undefined
+ SHRT_MIXER_AUTOMATION_CLEAR, //Default: undefined
+
+ SHRT_ADD_MIDI_TRACK, //Default: Ctrl+J
+ SHRT_ADD_DRUM_TRACK, //Default: undefined
+ SHRT_ADD_WAVE_TRACK, //Default: undefined
+ SHRT_ADD_AUDIO_OUTPUT, //Default: undefined
+ SHRT_ADD_AUDIO_GROUP, //Default: undefined
+ SHRT_ADD_AUDIO_INPUT, //Default: undefined
+ SHRT_ADD_AUDIO_AUX, //Default: undefined
+ SHRT_RESET_MIDI, //Ctrl+Alt+Z
+
+ SHRT_OPEN_HELP, //F1
+ SHRT_START_WHATSTHIS, //Shift-F1
+
+ //Arranger, parts:
+ SHRT_EDIT_PART, //Enter
+ SHRT_SEL_ABOVE, //Up
+ SHRT_SEL_ABOVE_ADD, //move up and add to selection
+ SHRT_SEL_BELOW, //Down
+ SHRT_SEL_BELOW_ADD, //move down and add to selection
+
+ //To be in arranger, pianoroll & drumeditor
+ SHRT_SELECT_ALL, //Ctrl+A
+ SHRT_SELECT_NONE, //Ctrl+Shift+A
+ SHRT_SELECT_INVERT, //Ctrl+I
+ SHRT_SELECT_ILOOP, //Default: Undefined
+ SHRT_SELECT_OLOOP, //Default: Undefined
+ SHRT_SEL_LEFT, //left
+ SHRT_SEL_LEFT_ADD, //move left and add to selection
+ SHRT_SEL_RIGHT, //Right
+ SHRT_SEL_RIGHT_ADD, //move right and add to selection
+ SHRT_INC_PITCH,
+ SHRT_DEC_PITCH,
+ SHRT_INC_POS,
+ SHRT_DEC_POS,
+ SHRT_LOCATORS_TO_SELECTION, //Alt+P, currently in arranger & pianoroll
+ SHRT_ZOOM_IN, //H - pianoroll
+ SHRT_ZOOM_OUT, //G - pianoroll
+ SHRT_INSERT_AT_LOCATION, //Shift+CrsrRight
+
+ SHRT_TOOL_1,//Shift+1 Pointer
+ SHRT_TOOL_2,//Shift+2 Pen
+ SHRT_TOOL_3,//Shift+3 Rubber
+ SHRT_TOOL_4,//Shift+4
+ SHRT_TOOL_5,//Shift+5
+ SHRT_TOOL_6,//Shift+6
+ SHRT_TRANSPOSE, //Default: undefined
+
+ //Shortcuts to be in pianoroll & drumeditor
+ SHRT_FIXED_LEN, //Alt+L, currently only drumeditor
+ SHRT_QUANTIZE, //q
+ SHRT_OVER_QUANTIZE, //Default: undefined
+ SHRT_ON_QUANTIZE, //Default: undefined
+ SHRT_ONOFF_QUANTIZE, //Default: undefined
+ SHRT_ITERATIVE_QUANTIZE, //Default: undefined
+ SHRT_CONFIG_QUANT, //Default: Ctrl+Alt+Q
+ SHRT_MODIFY_GATE_TIME, //Default: undefined
+ SHRT_MODIFY_VELOCITY,
+ SHRT_CRESCENDO,
+
+ SHRT_THIN_OUT,
+ SHRT_ERASE_EVENT,
+ SHRT_NOTE_SHIFT,
+ SHRT_MOVE_CLOCK,
+ SHRT_COPY_MEASURE,
+ SHRT_ERASE_MEASURE,
+ SHRT_DELETE_MEASURE,
+ SHRT_CREATE_MEASURE,
+ SHRT_SET_QUANT_1, //1 - pianoroll
+ SHRT_SET_QUANT_2, //2 - pianoroll
+ SHRT_SET_QUANT_3, //3 - pianoroll
+ SHRT_SET_QUANT_4, //4 - pianoroll
+ SHRT_SET_QUANT_5, //5 - pianoroll
+ SHRT_SET_QUANT_6, //6 - pianoroll
+ SHRT_SET_QUANT_7, //7 - pianoroll
+ SHRT_TOGGLE_TRIOL, //t
+ SHRT_TOGGLE_PUNCT, //.-keypad
+ SHRT_TOGGLE_PUNCT2, // ,
+
+ SHRT_EVENT_COLOR, //e
+
+ // Shortcuts for tools
+ // global
+ SHRT_TOOL_POINTER, //
+ SHRT_TOOL_PENCIL,
+ SHRT_TOOL_RUBBER,
+
+ // pianoroll and drum editor
+ SHRT_TOOL_LINEDRAW,
+
+ // arranger
+ SHRT_TOOL_SCISSORS,
+ SHRT_TOOL_GLUE,
+ SHRT_TOOL_MUTE,
+
+
+ //Listeditor:
+ SHRT_LE_INS_NOTES, //Ctrl+N
+ SHRT_LE_INS_SYSEX, //Ctrl+S
+ SHRT_LE_INS_CTRL, //Ctrl+T
+ SHRT_LE_INS_META, //Default: undefined
+ SHRT_LE_INS_CHAN_AFTERTOUCH,//Ctrl+A
+ SHRT_LE_INS_POLY_AFTERTOUCH,//Ctrl+P
+
+ //List master editor:
+ SHRT_LM_INS_TEMPO, // Ctrl+T
+ SHRT_LM_INS_SIG, // Ctrl+R
+ SHRT_LM_EDIT_BEAT, // Ctrl+Shift+E
+ SHRT_LM_EDIT_VALUE,// Ctrl+E
+
+ SHRT_NUM_OF_ELEMENTS // must be last
+ };
+
+//#define SHRT_NUM_OF_ELEMENTS SHRT_LE_INS_POLY_AFTERTOUCH + 1
+extern shortcut shortcuts[SHRT_NUM_OF_ELEMENTS]; //size of last entry
+extern KeyboardMovementIndicator shortcutsKbdMovement;
+extern void initShortCuts();
+extern void writeShortCuts(Xml& xml);
+extern void readShortCuts(QDomNode);
+#endif
diff --git a/muse/muse/song.cpp b/muse/muse/song.cpp
new file mode 100644
index 00000000..287bf812
--- /dev/null
+++ b/muse/muse/song.cpp
@@ -0,0 +1,2355 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "muse.h"
+#include "song.h"
+#include "track.h"
+#include "undo.h"
+#include "globals.h"
+#include "event.h"
+#include "midiedit/drummap.h"
+#include "audio.h"
+#include "mixer/mixer.h"
+#include "midiseq.h"
+#include "driver/audiodev.h"
+#include "gconfig.h"
+#include "al/marker.h"
+#include "al/sig.h"
+#include "al/tempo.h"
+#include "midi.h"
+#include "plugin.h"
+#include "synth.h"
+#include "midiplugin.h"
+#include "midirc.h"
+#include "part.h"
+
+Song* song;
+
+//---------------------------------------------------------
+// Song
+//---------------------------------------------------------
+
+Song::Song()
+ :QObject(0)
+ {
+ undoList = new UndoList;
+ redoList = new UndoList;
+ _markerList = new AL::MarkerList;
+ _globalPitchShift = 0;
+ clear(false);
+ }
+
+//---------------------------------------------------------
+// Song
+//---------------------------------------------------------
+
+Song::~Song()
+ {
+ delete undoList;
+ delete redoList;
+ delete _markerList;
+// delete esettingsList;
+ }
+
+//---------------------------------------------------------
+// putEvent
+//---------------------------------------------------------
+
+void Song::putEvent(const MidiEvent& event)
+ {
+ eventFifo.put(event);
+ }
+
+//---------------------------------------------------------
+// setTempo
+// public slot
+//---------------------------------------------------------
+
+void Song::setTempo(int newTempo)
+ {
+ audio->msgSetTempo(pos[0].tick(), newTempo, true);
+ }
+
+//---------------------------------------------------------
+// setSig
+// called from transport window
+//---------------------------------------------------------
+
+void Song::setSig(const AL::TimeSignature& sig)
+ {
+ if (_masterFlag) {
+ audio->msgAddSig(pos[0].tick(), sig);
+ }
+ }
+
+//---------------------------------------------------------
+// removeMarkedTracks
+//---------------------------------------------------------
+
+void Song::removeMarkedTracks()
+ {
+ bool loop;
+ do {
+ loop = false;
+ for (iTrack t = _tracks.begin(); t != _tracks.end(); ++t) {
+ if ((*t)->selected()) {
+ removeTrack2(*t);
+ loop = true;
+ break;
+ }
+ }
+ } while (loop);
+ }
+
+//---------------------------------------------------------
+// deselectTracks
+//---------------------------------------------------------
+
+void Song::deselectTracks()
+ {
+ for (iTrack t = _tracks.begin(); t != _tracks.end(); ++t)
+ (*t)->setSelected(false);
+ }
+
+//---------------------------------------------------------
+// selectTrack
+//---------------------------------------------------------
+
+void Song::selectTrack(Track* track)
+ {
+ bool changed = false;
+ for (iTrack t = _tracks.begin(); t != _tracks.end(); ++t) {
+ bool select = *t == track;
+ if ((*t)->selected() != select) {
+ (*t)->setSelected(select);
+ changed = true;
+ }
+ }
+ if (changed) {
+ updateSelectedTrack();
+ trackSelectionChanged(_selectedTrack);
+ }
+ }
+
+//---------------------------------------------------------
+// updateSelectedTrack
+// set _selectedTrack to first selected track
+//---------------------------------------------------------
+
+void Song::updateSelectedTrack()
+ {
+ _selectedTrack = 0;
+ for (iTrack t = _tracks.begin(); t != _tracks.end(); ++t) {
+ bool select = (*t)->selected();
+ if (select) {
+ _selectedTrack = *t;
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// addEvent
+// return true if event was added
+//---------------------------------------------------------
+
+bool Song::addEvent(Event& event, Part* part)
+ {
+ if (event.type() == Controller) {
+ MidiTrack* track = (MidiTrack*)part->track();
+ int tick = event.tick();
+ int cntrl = event.dataA();
+ MidiChannel* mc = track->channel();
+ CVal val;
+ val.i = event.dataB();
+ if (mc && !mc->addControllerVal(cntrl, tick, val)) {
+ mc->addMidiController(mc->port()->instrument(), cntrl);
+ if (!mc->addControllerVal(cntrl, tick, val))
+ return false;
+ }
+ }
+ part->events()->add(event);
+ return true;
+ }
+
+//---------------------------------------------------------
+// changeEvent
+//---------------------------------------------------------
+
+void Song::changeEvent(Event& oldEvent, Event& newEvent, Part* part)
+ {
+ iEvent i = part->events()->find(oldEvent);
+ if (i == part->events()->end()) {
+ printf("Song::changeEvent(): EVENT not found !! %ld\n", long(part->events()->size()));
+ // abort();
+ return;
+ }
+ part->events()->erase(i);
+ part->events()->add(newEvent);
+
+ if (newEvent.type() == Controller) {
+ MidiTrack* track = (MidiTrack*)part->track();
+ MidiChannel* mc = track->channel();
+ if (mc) {
+ int tick = newEvent.tick();
+ int cntrl = newEvent.dataA();
+ CVal val;
+ val.i = newEvent.dataB();
+ mc->addControllerVal(cntrl, tick, val);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// deleteEvent
+//---------------------------------------------------------
+
+void Song::deleteEvent(Event& event, Part* part)
+ {
+#if 0 //TODO3
+ if (event.type() == Controller) {
+ MidiTrack* track = (MidiTrack*)part->track();
+ int ch = track->outChannel();
+ int tick = event.tick();
+ int cntrl = event.dataA();
+ midiPorts[track->outPort()].deleteController(ch, tick, cntrl);
+ }
+#endif
+ iEvent ev = part->events()->find(event);
+ if (ev == part->events()->end()) {
+ printf("event not found in part\n");
+ return;
+ }
+ part->events()->erase(ev);
+ }
+
+//---------------------------------------------------------
+// findTrack
+//---------------------------------------------------------
+
+MidiTrack* Song::findTrack(const Part* part) const
+ {
+ for (ciMidiTrack t = _midis.begin(); t != _midis.end(); ++t) {
+ MidiTrack* track = *t;
+ PartList* pl = track->parts();
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ if (part == p->second)
+ return track;
+ }
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// findTrack
+// find track by name
+//---------------------------------------------------------
+
+Track* Song::findTrack(const QString& name) const
+ {
+ for (ciTrack i = _tracks.begin(); i != _tracks.end(); ++i) {
+ if ((*i)->name() == name)
+ return *i;
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// setLoop
+// set transport loop flag
+//---------------------------------------------------------
+
+void Song::setLoop(bool f)
+ {
+ if (loopFlag != f) {
+ loopFlag = f;
+ loopAction->setChecked(loopFlag);
+ emit loopChanged(loopFlag);
+ }
+ }
+
+//---------------------------------------------------------
+// setRecord
+// set record flag
+//---------------------------------------------------------
+
+void Song::setRecord(bool f)
+ {
+ if (recordFlag == f)
+ return;
+ if (muse->playAction->isChecked()) {
+ //
+ // dont allow record state changes when rolling
+ //
+ recordAction->setChecked(!f);
+ return;
+ }
+
+ if (f) {
+ bool alreadyRecEnabled = false;
+ Track *selectedTrack = 0;
+
+ // loop through list and check if any track is rec enabled
+ // if not then rec enable the selected track
+
+ WaveTrackList* wtl = waves();
+ for (iWaveTrack i = wtl->begin(); i != wtl->end(); ++i) {
+ if ((*i)->recordFlag()) {
+ alreadyRecEnabled = true;
+ break;
+ }
+ if ((*i)->selected())
+ selectedTrack = (*i);
+ }
+ if (!alreadyRecEnabled) {
+ MidiTrackList* mtl = midis();
+ for (iMidiTrack it = mtl->begin(); it != mtl->end(); ++it) {
+ if ((*it)->recordFlag()) {
+ alreadyRecEnabled = true;
+ break;
+ }
+ if ((*it)->selected())
+ selectedTrack = (*it);
+ }
+ }
+ if (!alreadyRecEnabled && selectedTrack) {
+ // enable recording on selected track:
+ setRecordFlag(selectedTrack, true);
+ }
+ else {
+ if (!alreadyRecEnabled) {
+ // If there are no tracks, do not enable record.
+ // TODO: This forces the user to first enable record on a track
+ // which probably is a bad thing. Maybe we should warn
+ // only when the user actually starts recording by pressing
+ // play.
+
+ QMessageBox::critical(0, "MusE: Record",
+ "No track(s) enabled for recording");
+ f = false;
+ }
+ }
+ }
+ if (!f)
+ bounceTrack = 0;
+ recordAction->setChecked(f);
+ if (f != recordFlag) {
+ recordFlag = f;
+ emit recordChanged(recordFlag);
+ }
+ }
+
+//---------------------------------------------------------
+// setPunchin
+// set punchin flag
+//---------------------------------------------------------
+
+void Song::setPunchin(bool f)
+ {
+ if (punchinFlag != f) {
+ punchinFlag = f;
+ punchinAction->setChecked(punchinFlag);
+ emit punchinChanged(punchinFlag);
+ }
+ }
+
+//---------------------------------------------------------
+// setPunchout
+// set punchout flag
+//---------------------------------------------------------
+
+void Song::setPunchout(bool f)
+ {
+ if (punchoutFlag != f) {
+ punchoutFlag = f;
+ punchoutAction->setChecked(punchoutFlag);
+ emit punchoutChanged(punchoutFlag);
+ }
+ }
+
+//---------------------------------------------------------
+// setClick
+//---------------------------------------------------------
+
+void Song::setClick(bool val)
+ {
+ if (_click != val) {
+ _click = val;
+ emit clickChanged(_click);
+ }
+ }
+
+//---------------------------------------------------------
+// setQuantize
+//---------------------------------------------------------
+
+void Song::setQuantize(bool val)
+ {
+ if (_quantize != val) {
+ _quantize = val;
+ emit quantizeChanged(_quantize);
+ }
+ }
+
+//---------------------------------------------------------
+// setMasterFlag
+//---------------------------------------------------------
+
+void Song::setMasterFlag(bool val)
+ {
+ _masterFlag = val;
+ if (AL::tempomap.setMasterFlag(cpos(), val)) {
+ emit songChanged(SC_MASTER);
+ emit tempoChanged();
+ }
+ }
+
+//---------------------------------------------------------
+// setPlay
+// set transport play flag
+//---------------------------------------------------------
+
+void Song::setPlay(bool f)
+ {
+ // only allow the user to set the button "on"
+ if (!f)
+ muse->playAction->setChecked(true);
+ else {
+ if (recordAction->isChecked()) {
+ startUndo();
+ MidiTrackList* ml = midis();
+ for (iMidiTrack it = ml->begin(); it != ml->end(); ++it) {
+ if ((*it)->recordFlag())
+ (*it)->startRecording();
+ }
+ WaveTrackList* wl = waves();
+ for (iWaveTrack wt = wl->begin(); wt != wl->end(); ++wt) {
+ if ((*wt)->recordFlag())
+ (*wt)->startRecording();
+ }
+ OutputList* ol = outputs();
+ for (iAudioOutput o = ol->begin(); o != ol->end(); ++o) {
+ if ((*o)->recordFlag())
+ (*o)->startRecording();
+ }
+ }
+ audio->msgPlay(true);
+ }
+ }
+
+//---------------------------------------------------------
+// setStop
+//---------------------------------------------------------
+
+void Song::setStop(bool f)
+ {
+ // only allow the user to set the button "on"
+ if (!f)
+ muse->stopAction->setChecked(true);
+ else
+ audio->msgPlay(false);
+ }
+
+//---------------------------------------------------------
+// setStopPlay
+//---------------------------------------------------------
+
+void Song::setStopPlay(bool f)
+ {
+ emit playChanged(f); // signal transport window
+ muse->playAction->setChecked(f);
+ muse->stopAction->setChecked(!f);
+ }
+
+//---------------------------------------------------------
+// swapTracks
+//---------------------------------------------------------
+
+void Song::swapTracks(int i1, int i2)
+ {
+ undoOp(UndoOp::SwapTrack, i1, i2);
+ Track* track = _tracks[i1];
+ _tracks[i1] = _tracks[i2];
+ _tracks[i2] = track;
+ }
+
+//---------------------------------------------------------
+// setTickPos
+//---------------------------------------------------------
+
+void Song::setTickPos(int idx, unsigned int tick)
+ {
+ Pos pos(tick);
+ setPos(idx, pos);
+ }
+
+//---------------------------------------------------------
+// setPos
+// song->setPos(Song::CPOS, pos, true, true, true);
+//---------------------------------------------------------
+
+void Song::setPos(int idx, const AL::Pos& val)
+ {
+ setPos(idx, val, true, true, false);
+ }
+
+void Song::setPos(int idx, const Pos& val, bool sig, bool isSeek, bool follow)
+ {
+// printf("setPos %d sig=%d,seek=%d,scroll=%d\n",
+// idx, sig, isSeek, follow);
+// val.dump(0);
+// printf("\n");
+
+ if (pos[idx] == val)
+ return;
+ if (idx == CPOS) {
+ _vcpos = val;
+ if (isSeek) {
+ seekInProgress = true;
+ audio->msgSeek(val);
+ return;
+ }
+ }
+ pos[idx] = val;
+ bool swap = pos[LPOS] > pos[RPOS];
+ if (swap) { // swap lpos/rpos if lpos > rpos
+ Pos tmp = pos[LPOS];
+ pos[LPOS] = pos[RPOS];
+ pos[RPOS] = tmp;
+ }
+ if (sig) {
+ if (swap) {
+ emit posChanged(LPOS, pos[LPOS], follow);
+ emit posChanged(RPOS, pos[RPOS], follow);
+ if (idx != LPOS && idx != RPOS)
+ emit posChanged(idx, pos[idx], follow);
+ }
+ else
+ emit posChanged(idx, pos[idx], follow);
+ }
+
+ if (idx == CPOS) {
+ AL::iMarker i1 = _markerList->begin();
+ AL::iMarker i2 = i1;
+ bool currentChanged = false;
+ for (; i1 != _markerList->end(); ++i1) {
+ ++i2;
+ if (val.tick() >= i1->first && (i2==_markerList->end() || val.tick() < i2->first)) {
+ if (i1->second.current())
+ return;
+ i1->second.setCurrent(true);
+ if (currentChanged) {
+ emit markerChanged(MARKER_CUR);
+ return;
+ }
+ ++i1;
+ for (; i1 != _markerList->end(); ++i1) {
+ if (i1->second.current())
+ i1->second.setCurrent(false);
+ }
+ emit markerChanged(MARKER_CUR);
+ return;
+ }
+ else {
+ if (i1->second.current()) {
+ currentChanged = true;
+ i1->second.setCurrent(false);
+ }
+ }
+ }
+ if (currentChanged)
+ emit markerChanged(MARKER_CUR);
+ }
+ }
+
+//---------------------------------------------------------
+// forward
+// roll forward config.division ticks
+//---------------------------------------------------------
+
+void Song::forward()
+ {
+ unsigned newPos = pos[0].tick() + config.division;
+ audio->msgSeek(Pos(newPos, AL::TICKS));
+ }
+
+//---------------------------------------------------------
+// rewind
+// roll back config.division ticks
+//---------------------------------------------------------
+
+void Song::rewind()
+ {
+ unsigned newPos;
+ if (unsigned(config.division) > pos[0].tick())
+ newPos = 0;
+ else
+ newPos = pos[0].tick() - config.division;
+ audio->msgSeek(Pos(newPos, AL::TICKS));
+ }
+
+//---------------------------------------------------------
+// rewindStart
+//---------------------------------------------------------
+
+void Song::rewindStart()
+ {
+ audio->msgSeek(Pos(0, AL::TICKS));
+ }
+
+//---------------------------------------------------------
+// update
+//---------------------------------------------------------
+
+void Song::update(int flags)
+ {
+ if (flags == 0)
+ return;
+ if (flags & SC_ROUTE) {
+ //
+ // remove unconnected channels
+ //
+ bool again;
+ do {
+ again = false;
+ for (iTrack i = _tracks.begin(); i != _tracks.end(); ++i) {
+ if ((*i)->type() != Track::MIDI_CHANNEL)
+ continue;
+ MidiChannel* mc = (MidiChannel*)*i;
+ if (mc->noInRoute()) {
+ emit trackRemoved(mc);
+ _tracks.erase(i);
+ again = true;
+ break;
+ }
+ }
+ } while(again);
+ //
+ // add new connected channels
+ //
+ for (iMidiChannel i = _midiChannel.begin(); i != _midiChannel.end(); ++i) {
+ MidiChannel* mc = (MidiChannel*)*i;
+ if (mc->noInRoute() || trackExists(mc))
+ continue;
+ _tracks.push_back(mc);
+ emit trackAdded(mc, _tracks.size()-1);
+ }
+ }
+ emit songChanged(flags);
+ if (flags & SC_TEMPO)
+ emit tempoChanged();
+ }
+
+//---------------------------------------------------------
+// updatePos
+//---------------------------------------------------------
+
+void Song::updatePos()
+ {
+ emit posChanged(0, pos[0], false);
+ emit posChanged(1, pos[1], false);
+ emit posChanged(2, pos[2], false);
+ }
+
+//---------------------------------------------------------
+// roundUpBar
+//---------------------------------------------------------
+
+int Song::roundUpBar(int t) const
+ {
+ int bar, beat;
+ unsigned tick;
+ AL::sigmap.tickValues(t, &bar, &beat, &tick);
+ if (beat || tick)
+ return AL::sigmap.bar2tick(bar+1, 0, 0);
+ return t;
+ }
+
+//---------------------------------------------------------
+// roundUpBeat
+//---------------------------------------------------------
+
+int Song::roundUpBeat(int t) const
+ {
+ int bar, beat;
+ unsigned tick;
+ AL::sigmap.tickValues(t, &bar, &beat, &tick);
+ if (tick)
+ return AL::sigmap.bar2tick(bar, beat+1, 0);
+ return t;
+ }
+
+//---------------------------------------------------------
+// roundDownBar
+//---------------------------------------------------------
+
+int Song::roundDownBar(int t) const
+ {
+ int bar, beat;
+ unsigned tick;
+ AL::sigmap.tickValues(t, &bar, &beat, &tick);
+ return AL::sigmap.bar2tick(bar, 0, 0);
+ }
+
+//---------------------------------------------------------
+// dumpMaster
+//---------------------------------------------------------
+
+void Song::dumpMaster()
+ {
+ AL::tempomap.dump();
+ AL::sigmap.dump();
+ }
+
+//---------------------------------------------------------
+// getSelectedParts
+//---------------------------------------------------------
+
+PartList* Song::getSelectedMidiParts() const
+ {
+ PartList* parts = new PartList();
+
+ //------------------------------------------------------
+ // wenn ein Part selektiert ist, diesen editieren
+ // wenn ein Track selektiert ist, den Ersten
+ // Part des Tracks editieren, die restlichen sind
+ // 'ghostparts'
+ // wenn mehrere Parts selektiert sind, dann Ersten
+ // editieren, die restlichen sind 'ghostparts'
+ //
+
+ // collect marked parts
+ for (ciMidiTrack t = _midis.begin(); t != _midis.end(); ++t) {
+ MidiTrack* track = *t;
+ PartList* pl = track->parts();
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ if (p->second->selected()) {
+ parts->add(p->second);
+ }
+ }
+ }
+ // if no part is selected, then search for selected track
+ // and collect all parts of this track
+
+ if (parts->empty()) {
+ for (ciMidiTrack t = _midis.begin(); t != _midis.end(); ++t) {
+ if ((*t)->selected()) {
+ MidiTrack* track = *t;
+ PartList* pl = track->parts();
+ for (iPart p = pl->begin(); p != pl->end(); ++p)
+ parts->add(p->second);
+ break;
+ }
+ }
+ }
+ return parts;
+ }
+
+PartList* Song::getSelectedWaveParts() const
+ {
+ PartList* parts = new PartList();
+
+ //------------------------------------------------------
+ // wenn ein Part selektiert ist, diesen editieren
+ // wenn ein Track selektiert ist, den Ersten
+ // Part des Tracks editieren, die restlichen sind
+ // 'ghostparts'
+ // wenn mehrere Parts selektiert sind, dann Ersten
+ // editieren, die restlichen sind 'ghostparts'
+ //
+
+ // markierte Parts sammeln
+ for (ciWaveTrack t = _waves.begin(); t != _waves.end(); ++t) {
+ WaveTrack* track = *t;
+ PartList* pl = track->parts();
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ if (p->second->selected()) {
+ parts->add(p->second);
+ }
+ }
+ }
+ // wenn keine Parts selektiert, dann markierten Track suchen
+ // und alle Parts dieses Tracks zusammensuchen
+
+ if (parts->empty()) {
+ for (ciWaveTrack t = _waves.begin(); t != _waves.end(); ++t) {
+ if ((*t)->selected()) {
+ WaveTrack* track = *t;
+ PartList* pl = track->parts();
+ for (iPart p = pl->begin(); p != pl->end(); ++p)
+ parts->add(p->second);
+ break;
+ }
+ }
+ }
+ return parts;
+ }
+
+//---------------------------------------------------------
+// beat
+// update gui
+//---------------------------------------------------------
+
+void Song::beat()
+ {
+ updateFlags = 0;
+ if (audio->isPlaying()) {
+ int tick = audio->tickPos();
+ setPos(0, tick, true, false, true);
+ }
+ if (audio->isRecording()) {
+ MidiTrackList* ml = midis();
+ for (iMidiTrack it = ml->begin(); it != ml->end(); ++it) {
+ MidiTrack* mt = *it;
+ if (mt->recordFlag())
+ mt->recordBeat();
+ }
+ WaveTrackList* wl = waves();
+ for (iWaveTrack wt = wl->begin(); wt != wl->end(); ++wt) {
+ WaveTrack* mt = *wt;
+ if (mt->recordFlag())
+ mt->recordBeat();
+ }
+ }
+ while (!eventFifo.isEmpty()) {
+ MidiEvent event(eventFifo.get());
+ if (rcEnable)
+ midiRCList.doAction(event);
+ emit midiEvent(event);
+ }
+ //
+ // update controller guis
+ //
+ TrackList* tl = tracks();
+ for (iTrack it = tl->begin(); it != tl->end(); ++it) {
+ Track* track = *it;
+ if (!track->autoRead())
+ continue;
+ track->updateController();
+ }
+ update(updateFlags);
+ }
+
+//---------------------------------------------------------
+// setLen
+//---------------------------------------------------------
+
+void Song::setLen(int l)
+ {
+ _len = roundUpBar(l);
+ AL::Pos pos(_len);
+ int bar, beat;
+ unsigned tick;
+ AL::sigmap.tickValues(_len, &bar, &beat, &tick);
+ emit measureLenChanged(bar);
+ emit lenChanged(pos);
+ }
+
+//---------------------------------------------------------
+// setMeasureLen
+//---------------------------------------------------------
+
+void Song::setMeasureLen(int b)
+ {
+ setLen(AL::sigmap.bar2tick(b, 0, 0));
+ }
+
+//---------------------------------------------------------
+// addMarker
+//---------------------------------------------------------
+
+AL::Marker* Song::addMarker(const QString& s, const AL::Pos& pos)
+ {
+ AL::Marker* marker = _markerList->add(s, pos);
+ emit markerChanged(MARKER_ADD);
+ return marker;
+ }
+
+//---------------------------------------------------------
+// removeMarker
+//---------------------------------------------------------
+
+void Song::removeMarker(AL::Marker* marker)
+ {
+ _markerList->remove(marker);
+ emit markerChanged(MARKER_REMOVE);
+ }
+
+AL::Marker* Song::setMarkerName(AL::Marker* m, const QString& s)
+ {
+ m->setName(s);
+ emit markerChanged(MARKER_NAME);
+ return m;
+ }
+
+AL::Marker* Song::setMarkerTick(AL::Marker* m, int t)
+ {
+ AL::Marker mm(*m);
+ _markerList->remove(m);
+ mm.setTick(t);
+ m = _markerList->add(mm);
+ emit markerChanged(MARKER_TICK);
+ return m;
+ }
+
+AL::Marker* Song::setMarkerLock(AL::Marker* m, bool f)
+ {
+ m->setType(f ? AL::FRAMES : AL::TICKS);
+ emit markerChanged(MARKER_LOCK);
+ return m;
+ }
+
+//---------------------------------------------------------
+// endMsgCmd
+//---------------------------------------------------------
+
+void Song::endMsgCmd()
+ {
+ redoList->clear(); // TODO: delete elements in list
+ undoAction->setEnabled(true);
+ redoAction->setEnabled(false);
+ update(updateFlags);
+ }
+
+//---------------------------------------------------------
+// undo
+//---------------------------------------------------------
+
+void Song::undo()
+ {
+ updateFlags = 0;
+ if (doUndo1())
+ return;
+ audio->msgUndo();
+ doUndo3();
+ redoAction->setEnabled(true);
+ undoAction->setEnabled(!undoList->empty());
+ if (updateFlags) {
+ emit songChanged(updateFlags);
+ if (updateFlags & SC_TEMPO)
+ emit tempoChanged();
+ }
+ }
+
+//---------------------------------------------------------
+// redo
+//---------------------------------------------------------
+
+void Song::redo()
+ {
+ updateFlags = 0;
+ if (doRedo1())
+ return;
+ audio->msgRedo();
+ doRedo3();
+ undoAction->setEnabled(true);
+ redoAction->setEnabled(!redoList->empty());
+ if (updateFlags) {
+ emit songChanged(updateFlags);
+ if (updateFlags & SC_TEMPO)
+ emit tempoChanged();
+ }
+ }
+
+//---------------------------------------------------------
+// processMsg
+// executed in realtime thread context
+//---------------------------------------------------------
+
+void Song::processMsg(AudioMsg* msg)
+ {
+ switch(msg->id) {
+ case SEQM_UNDO:
+ doUndo2();
+ break;
+ case SEQM_REDO:
+ doRedo2();
+ break;
+ case SEQM_MOVE_TRACK:
+ if (msg->a > msg->b) {
+ for (int i = msg->a; i > msg->b; --i) {
+ swapTracks(i, i-1);
+ }
+ }
+ else {
+ for (int i = msg->a; i < msg->b; ++i) {
+ swapTracks(i, i+1);
+ }
+ }
+ updateFlags = SC_TRACK_MODIFIED;
+ break;
+ case SEQM_ADD_EVENT:
+ updateFlags = SC_EVENT_INSERTED;
+ if (addEvent(msg->ev1, (Part*)(msg->p2))) {
+ Event ev;
+ undoOp(UndoOp::AddEvent, ev, msg->ev1, (Part*)msg->p2);
+ }
+ else
+ updateFlags = 0;
+ break;
+ case SEQM_REMOVE_EVENT:
+ {
+ Event event = msg->ev1;
+ Part* part = (Part*)(msg->p2);
+ Event e;
+ undoOp(UndoOp::DeleteEvent, e, event, part);
+ deleteEvent(event, part);
+ updateFlags = SC_EVENT_REMOVED;
+ }
+ break;
+ case SEQM_CHANGE_EVENT:
+ changeEvent(msg->ev1, msg->ev2, (Part*)(msg->p3));
+ undoOp(UndoOp::ModifyEvent, msg->ev2, msg->ev1, (Part*)msg->p3);
+ updateFlags = SC_EVENT_MODIFIED;
+ break;
+
+ case SEQM_ADD_TEMPO:
+ undoOp(UndoOp::AddTempo, msg->a, msg->b);
+ AL::tempomap.addTempo(msg->a, msg->b);
+ updateFlags = SC_TEMPO;
+ break;
+
+ case SEQM_SET_TEMPO:
+ undoOp(UndoOp::AddTempo, msg->a, msg->b);
+ AL::tempomap.setTempo(msg->a, msg->b);
+ updateFlags = SC_TEMPO;
+ break;
+
+ case SEQM_SET_GLOBAL_TEMPO:
+ AL::tempomap.setGlobalTempo(msg->a);
+ break;
+
+ case SEQM_REMOVE_TEMPO:
+ undoOp(UndoOp::DeleteTempo, msg->a, msg->b);
+ AL::tempomap.delTempo(msg->a);
+ updateFlags = SC_TEMPO;
+ break;
+
+ case SEQM_ADD_SIG:
+ undoOp(UndoOp::AddSig, msg->a, msg->b, msg->c);
+ AL::sigmap.add(msg->a, AL::TimeSignature(msg->b, msg->c));
+ updateFlags = SC_SIG;
+ break;
+
+ case SEQM_REMOVE_SIG:
+ //printf("processMsg (SEQM_REMOVE_SIG) UndoOp::DeleteSig. Deleting AL::sigmap at: %d with z=%d n=%d\n", msg->a, msg->b, msg->c);
+ undoOp(UndoOp::DeleteSig, msg->a, msg->b, msg->c);
+ AL::sigmap.del(msg->a);
+ updateFlags = SC_SIG;
+ break;
+
+ case SEQM_ADD_CTRL:
+ msg->track->addControllerVal(msg->a, msg->time, msg->cval1);
+ break;
+
+ case SEQM_REMOVE_CTRL:
+ msg->track->removeControllerVal(msg->a, msg->time);
+ break;
+
+ default:
+ printf("unknown seq message %d\n", msg->id);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// cmdAddPart
+// realtime context
+//---------------------------------------------------------
+
+void Song::cmdAddPart(Part* part)
+ {
+ part->track()->addPart(part);
+ undoOp(UndoOp::AddPart, part);
+ updateFlags = SC_PART_INSERTED;
+ if (len() < part->endTick())
+ setLen(part->endTick());
+ }
+
+//---------------------------------------------------------
+// cmdRemovePart
+//---------------------------------------------------------
+
+void Song::cmdRemovePart(Part* part)
+ {
+ Track* track = part->track();
+ track->parts()->remove(part);
+
+//TD esettingsList->removeSettings(part->sn());
+ undoOp(UndoOp::DeletePart, part);
+ part->events()->incARef(-1);
+ updateFlags = SC_PART_MODIFIED;
+ }
+
+//---------------------------------------------------------
+// changePart
+//---------------------------------------------------------
+
+void Song::changePart(Part* oldPart, Part* newPart)
+ {
+ Part part = *newPart;
+ *newPart = *oldPart;
+ *oldPart = part;
+ }
+
+//---------------------------------------------------------
+// cmdChangePart
+// realtime context
+//---------------------------------------------------------
+
+void Song::cmdChangePart(Part* oldPart, Part* newPart)
+ {
+ changePart(oldPart, newPart);
+ undoOp(UndoOp::ModifyPart, oldPart, newPart);
+ oldPart->events()->incARef(-1);
+ updateFlags = SC_PART_MODIFIED;
+ }
+
+//---------------------------------------------------------
+// panic
+//---------------------------------------------------------
+
+void Song::panic()
+ {
+ audio->msgPanic();
+ }
+
+//---------------------------------------------------------
+// clear
+// signal - emit signals for changes if true
+// called from constructor as clear(false) and
+// from MusE::clearSong() as clear(false)
+//---------------------------------------------------------
+
+void Song::clear(bool signal)
+ {
+ seekInProgress = false;
+ bounceTrack = 0;
+
+// for (iTrack i = _tracks.begin(); i != _tracks.end(); ++i)
+// (*i)->deactivate();
+ _selectedTrack = 0;
+ _tracks.clear();
+ _midis.clearDelete();
+ _waves.clearDelete();
+ _inputs.clearDelete(); // audio input ports
+ _outputs.clearDelete(); // audio output ports
+ _groups.clearDelete(); // mixer groups
+ _auxs.clearDelete(); // aux sends
+ _synthIs.clearDelete();
+
+ AL::tempomap.clear();
+ AL::sigmap.clear();
+ undoList->clear();
+ redoList->clear();
+ _markerList->clear();
+ pos[0].setTick(0);
+ pos[1].setTick(0);
+ pos[2].setTick(0);
+ _vcpos.setTick(0);
+
+ _masterFlag = true;
+ loopFlag = false;
+ loopFlag = false;
+ punchinFlag = false;
+ punchoutFlag = false;
+ recordFlag = false;
+ soloFlag = false;
+ // seq
+ _recMode = REC_OVERDUP;
+ _cycleMode = CYCLE_NORMAL;
+ _click = false;
+ _quantize = false;
+ _len = 1; // song len in ticks
+ // _tempo = 500000; // default tempo 120
+ dirty = false;
+ _backupWritten = false;
+ if (signal) {
+ emit loopChanged(false);
+ recordChanged(false);
+ }
+ }
+
+//---------------------------------------------------------
+// seqSignal
+// sequencer message to GUI
+// execution environment: gui thread
+//---------------------------------------------------------
+
+void Song::seqSignal(int fd)
+ {
+ char buffer[16];
+
+ int n = ::read(fd, buffer, 16);
+ if (n < 0) {
+ printf("Song: seqSignal(): READ PIPE failed: %s\n",
+ strerror(errno));
+ return;
+ }
+ for (int i = 0; i < n; ++i) {
+// printf("seqSignal to gui:<%c>\n", buffer[i]);
+ switch(buffer[i]) {
+ case MSG_STOP:
+ stopRolling();
+ break;
+ case MSG_PLAY:
+ setStopPlay(true);
+ break;
+ case MSG_RECORD:
+ setRecord(true);
+ break;
+ case MSG_SEEK:
+ setPos(0, audio->tickPos(), true, false, !seekInProgress);
+ seekInProgress = false;
+ beat(); // update controller guis
+ break;
+ case MSG_JACK_SHUTDOWN:
+ {
+ muse->seqStop();
+ // give the user a sensible explanation
+ int btn = QMessageBox::critical( muse, tr("Jack shutdown!"),
+ tr("Jack has detected a performance problem which has lead to\n"
+ "MusE being disconnected.\n"
+ "This could happen due to a number of reasons:\n"
+ "- a performance issue with your particular setup.\n"
+ "- a bug in MusE (or possibly in another connected software).\n"
+ "- a random hiccup which might never occur again.\n"
+ "- jack was voluntary stopped by you or someone else\n"
+ "- jack crashed\n"
+ "If there is a persisting problem you are much welcome to discuss it\n"
+ "on the MusE mailinglist.\n"
+ "(there is information about joining the mailinglist on the MusE\n"
+ " homepage which is available through the help menu)\n"
+ "\n"
+ "To proceed check the status of Jack and try to restart it and then .\n"
+ "click on the Restart button."), "restart", "cancel");
+ if (btn == 0) {
+ printf("restarting!\n");
+ muse->seqRestart();
+ }
+ }
+ break;
+ case MSG_START_BOUNCE:
+ {
+ bool useFreewheel = config.useJackFreewheelMode;
+ if (useFreewheel) {
+ // check:
+ // we cannot use freewheel, if there are active audio input
+ // strips
+
+ for (iAudioInput ii = _inputs.begin(); ii != _inputs.end(); ++i) {
+ AudioInput* ai = *ii;
+ if (!(ai->mute() || ai->off())) {
+ useFreewheel = false;
+ break;
+ }
+ }
+ if (useFreewheel)
+ audioDriver->setFreewheel(true);
+ }
+ }
+ break;
+
+ case MSG_STOP_BOUNCE:
+ if (audio->freewheel())
+ audioDriver->setFreewheel(false);
+ audio->msgPlay(false);
+ break;
+
+ case MSG_GRAPH_CHANGED:
+ audioDriver->graphChanged();
+ break;
+
+ default:
+ printf("unknown Seq Signal <%c>\n", buffer[i]);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// recordEvent
+//---------------------------------------------------------
+
+void Song::recordEvent(MidiTrack* mt, Event& event)
+ {
+ //---------------------------------------------------
+ // if tick points into a part,
+ // record to that part
+ // else
+ // create new part
+ //---------------------------------------------------
+
+ unsigned tick = event.tick();
+ PartList* pl = mt->parts();
+ Part* part = 0;
+ iPart ip;
+ for (ip = pl->begin(); ip != pl->end(); ++ip) {
+ part = ip->second;
+ unsigned partStart = part->tick();
+ unsigned partEnd = partStart + part->lenTick();
+ if (tick >= partStart && tick < partEnd)
+ break;
+ }
+ updateFlags |= SC_EVENT_INSERTED;
+ if (ip == pl->end()) {
+ // create new part
+ part = new Part(mt);
+ int startTick = roundDownBar(tick);
+ int endTick = roundUpBar(tick);
+ part->setTick(startTick);
+ part->setLenTick(endTick - startTick);
+ part->setName(mt->name());
+ event.move(-startTick);
+ part->events()->add(event);
+ audio->msgAddPart(part);
+ return;
+ }
+ part = ip->second;
+ tick -= part->tick();
+ event.setTick(tick);
+ audio->msgAddEvent(event, part);
+ }
+
+//---------------------------------------------------------
+// stopRolling
+//---------------------------------------------------------
+
+void Song::stopRolling()
+ {
+ setStopPlay(false);
+ if (record()) {
+ audio->msgIdle(true); // gain access to all data structures
+
+ WaveTrackList* wl = waves();
+ for (iWaveTrack it = wl->begin(); it != wl->end(); ++it) {
+ WaveTrack* track = *it;
+ if (track->recordFlag() || bounceTrack == track) {
+ track->stopRecording(audio->startRecordPos, audio->endRecordPos);
+ }
+ }
+ MidiTrackList* ml = midis();
+ for (iMidiTrack it = ml->begin(); it != ml->end(); ++it) {
+ if ((*it)->recordFlag())
+ (*it)->stopRecording();
+ }
+ OutputList* ol = outputs();
+ for (iAudioOutput io = ol->begin(); io != ol->end(); ++io) {
+ AudioOutput* ao = *io;
+ if (ao->recordFlag())
+ ao->stopRecording(audio->startRecordPos, audio->endRecordPos);
+ }
+ audio->msgIdle(false);
+ updateFlags |= SC_PART_MODIFIED;
+ endUndo(updateFlags);
+ setRecord(false);
+ }
+ //
+ // process recorded automation events
+ //
+ for (iTrack it = tracks()->begin(); it != tracks()->end(); ++it) {
+ Track* track = *it;
+ if (!track->autoWrite())
+ continue;
+ CtrlRecList* crl = track->recEvents();
+ CtrlList* cl = track->controller();
+ for (iCtrl icl = cl->begin(); icl != cl->end(); ++icl) {
+ Ctrl* cl = icl->second;
+ int id = cl->id();
+ //
+ // remove old events from record region
+ //
+ bool hasEvents = false;
+// int start = audio->getStartRecordPos().frame();
+// int end = audio->getEndRecordPos().frame();
+// iCtrlVal s = cl->lower_bound(start);
+// iCtrlVal e = cl->lower_bound(end);
+// cl->erase(s, e);
+// }
+
+ for (iCtrlRec icr = crl->begin(); icr != crl->end(); ++icr) {
+ if (icr->id == id && icr->type == 1) {
+ int start = icr->time;
+ ++icr;
+ for (; icr != crl->end(); ++icr) {
+ if (icr->id == id && icr->type == 2) {
+ int end = icr->time;
+ if (track->timeType() == AL::TICKS) {
+ start = AL::tempomap.frame2tick(start);
+ end = AL::tempomap.frame2tick(end);
+ }
+ iCtrlVal s = cl->lower_bound(start);
+ iCtrlVal e = cl->lower_bound(end);
+ cl->erase(s, e);
+ hasEvents = true;
+ break;
+ }
+ }
+ if (icr == crl->end())
+ break;
+ }
+ }
+ //
+ // extract all recorded events for controller "id"
+ // from CtrlRecList and put into cl
+ //
+ for (iCtrlRec icr = crl->begin(); icr != crl->end(); ++icr) {
+ if (icr->id == id && icr->type == 0)
+ cl->add(icr->time, icr->val);
+ }
+ track->emitControllerChanged(id);
+ }
+ crl->clear();
+ track->setAutoWrite(false);
+ }
+ }
+
+//---------------------------------------------------------
+// addTrack
+// called from GUI context
+//---------------------------------------------------------
+
+Track* Song::addTrack(QAction* action)
+ {
+ int t = action->data().toInt();
+
+ deselectTracks();
+ Track* track = 0;
+
+ Track::TrackType type = (Track::TrackType) t;
+ if (t >= 5000) {
+ int idx = t - 5000;
+ type = Track::MIDI_SYNTI;
+ int k = 0;
+ iMidiPlugin i;
+ for (i = midiPlugins.begin(); i != midiPlugins.end(); ++i) {
+ if ((*i)->type() != MEMPI_GENERATOR)
+ continue;
+ if (k == idx)
+ break;
+ ++k;
+ }
+ if (i == midiPlugins.end()) {
+ fprintf(stderr, "Song::addTrack: midi synti not found\n");
+ return 0;
+ }
+ MidiPlugin* s = *i;
+ MidiSynti* si = new MidiSynti();
+ QString sName(s->name());
+ for (k = s->instances(); k < 1000; ++k) {
+ QString instanceName = ("%1-%2");
+ instanceName = instanceName.arg(sName).arg(k);
+
+ MidiSyntiList* sl = midiSyntis();
+ iMidiSynti sii;
+ for (sii = sl->begin(); sii != sl->end(); ++sii) {
+ if ((*sii)->name() == instanceName)
+ break;
+ }
+ if (sii == sl->end()) {
+ si->setName(instanceName);
+ break;
+ }
+ }
+ if (si->initInstance(s)) {
+ delete si;
+ return 0;
+ }
+ track = si;
+ }
+ else if (t >= 1000) {
+ type = Track::AUDIO_SOFTSYNTH;
+ QString sclass = synthis[t-1000]->name();
+
+ Synth* s = findSynth(sclass);
+ if (s == 0) {
+ fprintf(stderr, "synthi class <%s> not found\n", sclass.toLatin1().data());
+ return 0;
+ }
+
+ SynthI* si = new SynthI();
+ int i;
+ for (i = s->instances(); i < 1000; ++i) {
+ QString instanceName = ("%1-%2");
+ instanceName = instanceName.arg(s->name()).arg(i);
+
+ SynthIList* sl = syntis();
+ iSynthI sii;
+ for (sii = sl->begin(); sii != sl->end(); ++sii) {
+ if ((*sii)->name() == instanceName)
+ break;
+ }
+ if (sii == sl->end()) {
+ si->setName(instanceName);
+printf("set instance name <%s>\n", instanceName.toLatin1().data());
+ break;
+ }
+ }
+ if (si->initInstance(s)) {
+ delete si;
+ return 0;
+ }
+ track = si;
+ }
+ else {
+ int lastAuxIdx = _auxs.size();
+ switch (type) {
+ case Track::MIDI:
+ track = new MidiTrack();
+ track->setType(Track::MIDI);
+ break;
+ case Track::MIDI_OUT:
+ track = new MidiOutPort();
+ break;
+ case Track::MIDI_IN:
+ track = new MidiInPort();
+ break;
+ case Track::WAVE:
+ track = new WaveTrack();
+ ((AudioTrack*)track)->addAuxSend(lastAuxIdx);
+ break;
+ case Track::AUDIO_OUTPUT:
+ track = new AudioOutput();
+ break;
+ case Track::AUDIO_GROUP:
+ track = new AudioGroup();
+ ((AudioTrack*)track)->addAuxSend(lastAuxIdx);
+ break;
+ case Track::AUDIO_AUX:
+ track = new AudioAux();
+ break;
+ case Track::AUDIO_INPUT:
+ track = new AudioInput();
+ ((AudioTrack*)track)->addAuxSend(lastAuxIdx);
+ break;
+ case Track::AUDIO_SOFTSYNTH:
+ case Track::TRACK_TYPES:
+ default:
+ printf("Song::addTrack() illegal type %d\n", type);
+ abort();
+ }
+ if (track == 0)
+ return 0;
+ }
+ track->setDefaultName();
+ insertTrack(track, -1);
+ return track;
+ }
+
+//---------------------------------------------------------
+// insertTrack
+//---------------------------------------------------------
+
+void Song::insertTrack(Track* track, int idx)
+ {
+ //
+ // add default routes
+ //
+ OutputList* ol = outputs();
+ AudioOutput* ao = 0;
+ if (!ol->empty())
+ ao = ol->front();
+ MidiOutPortList* mol = midiOutPorts();
+ MidiOutPort* mo = 0;
+ if (!mol->empty())
+ mo = mol->front();
+
+ switch (track->type()) {
+ case Track::TRACK_TYPES:
+ case Track::MIDI_OUT:
+ case Track::MIDI_IN:
+ case Track::MIDI_CHANNEL:
+ case Track::MIDI_SYNTI:
+ break;
+ case Track::MIDI:
+ //
+ // connect output to first non used midi channel
+ // if there is already a route, do not add another
+ // default routing
+ //
+ if (track->noOutRoute()) {
+ for (iMidiChannel i = _midiChannel.begin(); i != _midiChannel.end(); ++i) {
+ if ((*i)->noInRoute()) {
+ track->outRoutes()->push_back(Route(*i, -1, Route::TRACK));
+ break;
+ }
+ }
+ }
+ //
+ // connect to all midi inputs, if there is not already
+ // a route
+ //
+ if (!track->noInRoute()) {
+ MidiInPortList* mi = midiInPorts();
+ for (iMidiInPort i = mi->begin(); i != mi->end(); ++i) {
+ for (int ch = 0; ch < MIDI_CHANNELS; ++ch)
+ track->inRoutes()->push_back(Route(*i, ch, Route::TRACK));
+ }
+ }
+ break;
+ case Track::AUDIO_SOFTSYNTH:
+ if (mo)
+ track->inRoutes()->push_back(Route(mo, -1, Route::TRACK));
+ // fall through
+
+ case Track::WAVE:
+ case Track::AUDIO_GROUP:
+ case Track::AUDIO_AUX:
+ if (ao)
+ track->outRoutes()->push_back(Route(ao, -1, Route::TRACK));
+ break;
+ case Track::AUDIO_INPUT:
+ {
+ // connect first input channel to first available jack output
+ // etc.
+ std::list<PortName>* op = audioDriver->outputPorts();
+ std::list<PortName>::iterator is = op->begin();
+ for (int ch = 0; ch < track->channels(); ++ch) {
+ if (is != op->end()) {
+ track->inRoutes()->push_back(Route(is->name, ch, Route::AUDIOPORT));
+ ++is;
+ }
+ }
+ delete op;
+ if (ao)
+ track->outRoutes()->push_back(Route(ao, -1, Route::TRACK));
+ }
+ break;
+ case Track::AUDIO_OUTPUT:
+ {
+ std::list<PortName>* op = audioDriver->inputPorts();
+ std::list<PortName>::iterator is = op->begin();
+ for (int ch = 0; ch < track->channels(); ++ch) {
+ if (is != op->end()) {
+ track->outRoutes()->push_back(Route(is->name, ch, Route::AUDIOPORT));
+ ++is;
+ }
+ }
+ }
+ break;
+ }
+ insertTrack1(track, idx);
+
+ startUndo();
+ undoOp(UndoOp::AddTrack, idx, track);
+ AudioMsg msg;
+ msg.id = SEQM_ADD_TRACK;
+ msg.track = track;
+ msg.ival = idx;
+ audio->sendMsg(&msg);
+ endUndo(SC_TRACK_INSERTED | SC_ROUTE);
+
+ emit trackAdded(track, idx);
+ selectTrack(track);
+ }
+
+//---------------------------------------------------------
+// insertTrack0
+// can only be called if sequencer is idle
+// (during song load)
+//---------------------------------------------------------
+
+void Song::insertTrack0(Track* track, int idx)
+ {
+ insertTrack1(track, idx);
+ insertTrack2(track);
+ }
+
+//---------------------------------------------------------
+// insertTrack1
+// non realtime part of insertTrack
+//---------------------------------------------------------
+
+void Song::insertTrack1(Track* track, int idx)
+ {
+ iTrack i = _tracks.index2iterator(idx);
+ _tracks.insert(i, track);
+ switch(track->type()) {
+ case Track::AUDIO_SOFTSYNTH:
+ {
+ SynthI* s = (SynthI*)track;
+ Synth* sy = s->synth();
+ if (!s->isActivated()) {
+ s->initInstance(sy);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ if (audioState == AUDIO_RUNNING) {
+ track->activate1();
+ track->activate2();
+ }
+ }
+
+//---------------------------------------------------------
+// insertTrack2
+// realtime part
+//---------------------------------------------------------
+
+void Song::insertTrack2(Track* track)
+ {
+ switch(track->type()) {
+ case Track::MIDI_SYNTI:
+ _midiSyntis.push_back((MidiSynti*)track);
+ break;
+ case Track::MIDI:
+ _midis.push_back((MidiTrack*)track);
+ break;
+ case Track::MIDI_OUT:
+ _midiOutPorts.push_back((MidiOutPort*)track);
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ MidiChannel* mc = ((MidiOutPort*)track)->channel(i);
+ _midiChannel.push_back(mc);
+ }
+ break;
+ case Track::MIDI_IN:
+ _midiInPorts.push_back((MidiInPort*)track);
+ break;
+ case Track::WAVE:
+ _waves.push_back((WaveTrack*)track);
+ break;
+ case Track::AUDIO_OUTPUT:
+ _outputs.push_back((AudioOutput*)track);
+ break;
+ case Track::AUDIO_GROUP:
+ _groups.push_back((AudioGroup*)track);
+ break;
+ case Track::AUDIO_AUX:
+ _auxs.push_back((AudioAux*)track);
+ break;
+ case Track::AUDIO_INPUT:
+ _inputs.push_back((AudioInput*)track);
+ break;
+ case Track::AUDIO_SOFTSYNTH:
+ {
+ SynthI* s = (SynthI*)track;
+ midiInstruments.push_back(s);
+ _synthIs.push_back(s);
+ }
+ break;
+ default:
+ fprintf(stderr, "insertTrack2: unknown track type %d\n", track->type());
+ // abort();
+ return;
+ }
+
+ //
+ // initialize missing aux send
+ //
+
+ int n = _auxs.size();
+ if (n) {
+ for (iTrack i = _tracks.begin(); i != _tracks.end(); ++i) {
+ if ((*i)->isMidiTrack())
+ continue;
+ WaveTrack* wt = (WaveTrack*)*i;
+ if (wt->hasAuxSend()) {
+ wt->addAuxSend(n);
+ }
+ }
+ }
+
+ //
+ // connect routes
+ //
+
+ Route src(track, -1, Route::TRACK);
+ if (track->type() == Track::AUDIO_SOFTSYNTH)
+ src.type = Route::SYNTIPORT;
+ if (track->type() == Track::AUDIO_OUTPUT || track->type() == Track::MIDI_OUT) {
+ const RouteList* rl = track->inRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ src.channel = r->channel;
+ r->track->outRoutes()->push_back(src);
+ }
+ }
+ else if (track->type() == Track::AUDIO_INPUT || track->type() == Track::MIDI_IN) {
+ const RouteList* rl = track->outRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ src.channel = r->channel;
+ r->track->inRoutes()->push_back(src);
+ }
+ }
+ else {
+ const RouteList* rl = track->inRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ src.channel = r->channel;
+ r->track->outRoutes()->push_back(src);
+ }
+ rl = track->outRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ src.channel = r->channel;
+ r->track->inRoutes()->push_back(src);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// removeTrack
+// called from gui context
+//---------------------------------------------------------
+
+void Song::removeTrack(Track* track)
+ {
+ startUndo();
+ int idx = _tracks.index(track);
+ undoOp(UndoOp::DeleteTrack, idx, track);
+ removeTrack1(track);
+ audio->msgRemoveTrack(track);
+ removeTrack3(track);
+ endUndo(SC_TRACK_REMOVED | SC_ROUTE);
+ }
+
+//---------------------------------------------------------
+// removeTrack1
+// non realtime part of removeTrack
+//---------------------------------------------------------
+
+void Song::removeTrack1(Track* track)
+ {
+ if (track->type() != Track::MIDI_OUT && track->type() != Track::MIDI_IN)
+ track->deactivate();
+ _tracks.erase(track);
+ }
+
+//---------------------------------------------------------
+// removeTrack2
+// called from RT context
+//---------------------------------------------------------
+
+void Song::removeTrack2(Track* track)
+ {
+ switch (track->type()) {
+ case Track::MIDI_SYNTI:
+ _midiSyntis.erase(track);
+ break;
+ case Track::MIDI:
+ _midis.erase(track);
+ break;
+ case Track::MIDI_OUT:
+ track->deactivate();
+ _midiOutPorts.erase(track);
+ break;
+ case Track::MIDI_IN:
+ track->deactivate();
+ _midiInPorts.erase(track);
+ break;
+ case Track::MIDI_CHANNEL:
+ _midiChannel.erase(track);
+ break;
+ case Track::WAVE:
+ _waves.erase(track);
+ break;
+ case Track::AUDIO_OUTPUT:
+ _outputs.erase(track);
+ break;
+ case Track::AUDIO_INPUT:
+ _inputs.erase(track);
+ break;
+ case Track::AUDIO_GROUP:
+ _groups.erase(track);
+ break;
+ case Track::AUDIO_AUX:
+ _auxs.erase(track);
+ break;
+ case Track::AUDIO_SOFTSYNTH:
+ {
+ SynthI* s = (SynthI*) track;
+ s->deactivate2();
+ _synthIs.erase(track);
+ }
+ break;
+ case Track::TRACK_TYPES:
+ return;
+ }
+ //
+ // remove routes
+ //
+ Route src(track, -1, Route::TRACK);
+ if (track->type() == Track::AUDIO_SOFTSYNTH)
+ src.type = Route::SYNTIPORT;
+ if (track->type() == Track::AUDIO_OUTPUT || track->type() == Track::MIDI_OUT) {
+ const RouteList* rl = track->inRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ src.channel = r->channel;
+ r->track->outRoutes()->removeRoute(src);
+ }
+ }
+ else if (track->type() == Track::AUDIO_INPUT || track->type() == Track::MIDI_IN) {
+ const RouteList* rl = track->outRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ src.channel = r->channel;
+ r->track->inRoutes()->removeRoute(src);
+ }
+ }
+ else {
+ const RouteList* rl = track->inRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ src.channel = r->channel;
+ r->track->outRoutes()->removeRoute(src);
+ }
+ rl = track->outRoutes();
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ src.channel = r->channel;
+ r->track->inRoutes()->removeRoute(src);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// removeTrack3
+// non realtime part of removeTrack
+//---------------------------------------------------------
+
+void Song::removeTrack3(Track* track)
+ {
+ if (track->type() == Track::AUDIO_SOFTSYNTH) {
+ SynthI* s = (SynthI*) track;
+ s->deactivate3();
+ }
+ emit trackRemoved(track);
+ }
+
+//---------------------------------------------------------
+// synthesizer
+//---------------------------------------------------------
+
+std::vector<QString>* Song::synthesizer() const
+ {
+ std::vector<QString>* l = new std::vector<QString>;
+
+ for (std::vector<Synth*>::const_iterator i = synthis.begin();
+ i != synthis.end(); ++i) {
+ l->push_back((*i)->name());
+ }
+ return l;
+ }
+
+//---------------------------------------------------------
+// changePart
+// extend/shrink part in front or at end
+//---------------------------------------------------------
+
+void Song::changePart(Part* oPart, unsigned pos, unsigned len)
+ {
+ startUndo();
+ //
+ // move events so they stay at same position in song
+ //
+ int delta = oPart->tick() - pos;
+ EventList* d = new EventList();
+ EventList* s = oPart->events();
+ for (iEvent ie = s->begin(); ie != s->end(); ++ie) {
+ int tick = ie->first + delta;
+ if (tick >= 0 && tick < int(len)) {
+ Event ev = ie->second.clone();
+ ev.move(delta);
+ d->add(ev, unsigned(tick));
+ }
+ }
+ if (oPart->fillLen() > 0 && len < (unsigned)oPart->fillLen())
+ oPart->setFillLen(len);
+ if (oPart->lenTick() < len && oPart->fillLen() > 0) {
+ unsigned loop = oPart->fillLen();
+ unsigned fillLen = len - oPart->lenTick();
+ for (unsigned i = 0; i < fillLen / loop; ++i) {
+ int start = oPart->lenTick() + loop * i;
+ for (iEvent ie = s->begin(); ie != s->end(); ++ie) {
+ if (ie->first >= loop)
+ break;
+ Event ev = ie->second.clone();
+ ev.move(start);
+ d->add(ev, ie->first + start);
+ }
+ }
+ }
+ Part* nPart = new Part(*oPart, d);
+ nPart->setLenTick(len);
+ nPart->setTick(pos);
+ audio->msgChangePart(oPart, nPart, false);
+ endUndo(SC_PART_MODIFIED);
+ oPart->track()->partListChanged();
+ if (unsigned(_len) < oPart->endTick()) // update song len
+ setLen(oPart->endTick());
+ }
+
+//---------------------------------------------------------
+// movePart
+//---------------------------------------------------------
+
+void Song::movePart(Part* oPart, unsigned pos, Track* track)
+ {
+ Track* oTrack = oPart->track();
+ Part* nPart = new Part(*oPart);
+ nPart->setTrack(track);
+ nPart->setTick(pos);
+ startUndo();
+ if (oPart->track() != track) {
+ audio->msgRemovePart(oPart, false);
+ audio->msgAddPart(nPart, false);
+ }
+ else {
+ audio->msgChangePart(oPart, nPart, false);
+ }
+ endUndo(0);
+ oTrack->partListChanged();
+ if (len() < nPart->endTick())
+ setLen(nPart->endTick());
+ }
+
+//---------------------------------------------------------
+// linkPart
+//---------------------------------------------------------
+
+void Song::linkPart(Part* sPart, unsigned pos, Track* track)
+ {
+ Part* dPart = track->newPart(sPart, true);
+ dPart->setTick(pos);
+ audio->msgAddPart(dPart);
+ sPart->track()->partListChanged();
+ dPart->track()->partListChanged();
+ }
+
+//---------------------------------------------------------
+// copyPart
+//---------------------------------------------------------
+
+void Song::copyPart(Part* sPart, unsigned pos, Track* track)
+ {
+ bool clone = sPart->events()->arefCount() > 1;
+ Part* dPart = track->newPart(sPart, clone);
+ dPart->setTick(pos);
+ if (!clone) {
+ //
+ // Copy Events
+ //
+ EventList* se = sPart->events();
+ EventList* de = dPart->events();
+ for (iEvent i = se->begin(); i != se->end(); ++i) {
+ Event oldEvent = i->second;
+ Event ev = oldEvent.clone();
+ de->add(ev);
+ }
+ }
+ audio->msgAddPart(dPart);
+ sPart->track()->partListChanged();
+ dPart->track()->partListChanged();
+ }
+
+//---------------------------------------------------------
+// createLRPart
+//---------------------------------------------------------
+
+void Song::createLRPart(Track* track)
+ {
+ Part* part = track->newPart();
+ if (part) {
+ part->setTick(pos[1].tick());
+ part->setLenTick(pos[2].tick()-pos[1].tick());
+ part->setSelected(true);
+ addPart(part);
+ }
+ }
+
+//---------------------------------------------------------
+// addPart
+//---------------------------------------------------------
+
+void Song::addPart(Part* part)
+ {
+ audio->msgAddPart(part);
+ // adjust song len:
+ unsigned epos = part->tick() + part->lenTick();
+
+ if (epos > len())
+ setLen(epos);
+ part->track()->partListChanged();
+ }
+
+//---------------------------------------------------------
+// selectPart
+//---------------------------------------------------------
+
+void Song::selectPart(Part* part, bool add)
+ {
+ if (add) {
+ part->setSelected(!part->selected());
+ part->track()->partListChanged();
+ return;
+ }
+ for (iTrack it = _tracks.begin(); it != _tracks.end(); ++it) {
+ PartList* pl = (*it)->parts();
+ bool changed = false;
+ for (iPart ip = pl->begin(); ip != pl->end(); ++ip) {
+ bool f = part == ip->second;
+ if (ip->second->selected() != f) {
+ ip->second->setSelected(f);
+ changed = true;
+ }
+ }
+ if (changed)
+ (*it)->partListChanged();
+ }
+ }
+
+
+//---------------------------------------------------------
+// setRecordFlag
+//---------------------------------------------------------
+
+void Song::setRecordFlag(Track* track, bool val)
+ {
+ if (track->type() == Track::AUDIO_OUTPUT) {
+ if (!val && track->recordFlag() == false) {
+ muse->bounceToFile();
+ }
+ }
+ track->setRecordFlag(val);
+ }
+
+//---------------------------------------------------------
+// setMute
+//---------------------------------------------------------
+
+void Song::setMute(Track* track, bool val)
+ {
+ track->setMute(val);
+ emit muteChanged(track, track->mute());
+ }
+
+//---------------------------------------------------------
+// setOff
+//---------------------------------------------------------
+
+void Song::setOff(Track* track, bool val)
+ {
+ track->setOff(val);
+ emit offChanged(track, track->off());
+ }
+
+//---------------------------------------------------------
+// setAutoRead
+//---------------------------------------------------------
+
+void Song::setAutoRead(Track* track, bool val)
+ {
+ track->setAutoRead(val);
+ emit autoReadChanged(track, track->autoRead());
+ }
+
+//---------------------------------------------------------
+// setAutoWrite
+//---------------------------------------------------------
+
+void Song::setAutoWrite(Track* track, bool val)
+ {
+ track->setAutoWrite(val);
+ emit autoWriteChanged(track, track->autoRead());
+ }
+
+//---------------------------------------------------------
+// setSolo
+//---------------------------------------------------------
+
+void Song::setSolo(Track* track, bool val)
+ {
+ if (!track->setSolo(val))
+ return;
+ emit soloChanged(track, track->solo());
+ soloFlag = false;
+ for (iTrack i = _tracks.begin(); i != _tracks.end(); ++i) {
+ if ((*i)->solo()) {
+ soloFlag = true;
+ break;
+ }
+ }
+ for (iTrack i = _tracks.begin(); i != _tracks.end(); ++i) {
+ (*i)->updateMute();
+ }
+ }
+
+//---------------------------------------------------------
+// addControllerVal
+// GUI context
+//---------------------------------------------------------
+
+void Song::addControllerVal(Track* t, int id, const Pos& pos, CVal val)
+ {
+ Ctrl* c = t->getController(id);
+ if (c == 0) {
+ printf("Song::addControllerVal:: no controller %d found\n", id);
+ return;
+ }
+ addControllerVal(t, c, pos, val);
+ }
+
+void Song::addControllerVal(Track* t, Ctrl* c, const Pos& p, CVal val)
+ {
+ unsigned time = t->timeType() == AL::FRAMES ? p.frame() : p.tick();
+ iCtrlVal e = c->find(time);
+ if (e == c->end()) {
+ // schedule new controller event
+ audio->msgAddController(t, c->id(), time, val);
+ }
+ else {
+ CVal oval = c->value(time);
+ startUndo();
+ undoOp(UndoOp::ModifyCtrl, t, c->id(), time, val, oval);
+ c->add(time, val);
+ endUndo(0);
+ }
+ if (!audio->isPlaying() && t->autoRead()) {
+ // current value may have changed
+ unsigned ctime = t->timeType() == AL::FRAMES ? pos[0].frame() : pos[0].tick();
+ CVal cval = c->value(ctime);
+ if (c->schedVal().i != cval.i) {
+ if (t->isMidiTrack()) {
+ if (t->type() == Track::MIDI_CHANNEL) {
+ MidiChannel* mc = (MidiChannel*)t;
+ MidiEvent ev(0, 0, ME_CONTROLLER, c->id(), cval.i);
+ mc->playMidiEvent(&ev);
+ }
+ }
+ else {
+ // non midi controller are current once set
+ c->setCurVal(cval);
+ }
+ c->setSchedVal(cval);
+ // t->emitControllerChanged(c->id());
+ }
+ }
+ t->emitControllerChanged(c->id()); //moved this out here, otherwise canvas is not updated
+ }
+
+//---------------------------------------------------------
+// setControllerVal
+// GUI context
+//---------------------------------------------------------
+
+void Song::setControllerVal(Track* t, int id, CVal val)
+ {
+ Ctrl* c = t->getController(id);
+ if (c == 0) {
+ printf("Song::addControllerVal:: no controller %d found\n", id);
+ return;
+ }
+ setControllerVal(t, c, val);
+ }
+
+void Song::setControllerVal(Track* t, Ctrl* c, CVal val)
+ {
+ if (t->isMidiTrack()) {
+ if (t->type() == Track::MIDI_CHANNEL) {
+ MidiChannel* mc = (MidiChannel*)t;
+ MidiEvent ev(0, 0, ME_CONTROLLER, c->id(), val.i);
+ mc->playMidiEvent(&ev);
+ }
+ else if (t->type() == Track::MIDI_OUT) {
+ MidiOutPort* mp = (MidiOutPort*)t;
+ MidiEvent ev(0, 0, ME_CONTROLLER, c->id(), val.i);
+ mp->playMidiEvent(&ev);
+ }
+ }
+ else {
+ c->setCurVal(val);
+ if (c->id() & 0xf000) {
+ // plugin controller
+ Pipeline* pipe = ((AudioTrack*)t)->efxPipe();
+ int pluginIndex = (c->id() & 0xf000) / 0x1000 - 1;
+ int ctrlIndex = c->id() & 0xfff;
+ pipe->plugin(pluginIndex)->setParam(ctrlIndex, val.f);
+ }
+ }
+ c->setSchedVal(val);
+
+ if (t->autoWrite()) {
+ unsigned time = t->timeType() == AL::FRAMES ? pos[0].frame() : pos[0].tick();
+ if (audio->isPlaying())
+ t->recEvents()->push_back(CtrlRecVal(time, c->id(), val));
+ else {
+ iCtrlVal e = c->find(time);
+ if (e == c->end()) {
+ // schedule new controller event
+ audio->msgAddController(t, c->id(), time, val);
+ }
+ else {
+ CVal oval = c->value(time);
+ startUndo();
+ undoOp(UndoOp::ModifyCtrl, t, c->id(), time, val, oval);
+ c->add(time, val);
+ endUndo(0);
+ }
+ }
+ }
+ t->emitControllerChanged(c->id());
+ }
+
+//---------------------------------------------------------
+// removeControllerVal
+//---------------------------------------------------------
+
+void Song::removeControllerVal(Track* t, int id, unsigned time)
+ {
+ audio->msgRemoveController(t, id, time);
+ t->emitControllerChanged(id);
+ }
+
+//---------------------------------------------------------
+// moveTrack
+//---------------------------------------------------------
+
+void Song::moveTrack(Track* src, Track* dst)
+ {
+ iTrack si = _tracks.find(src);
+ iTrack di = _tracks.find(dst);
+ if (si == _tracks.end() || di == _tracks.end()) {
+ printf("Song::moveTrack() track not found\n");
+ return;
+ }
+ _tracks.erase(si);
+ _tracks.insert(di, src);
+ }
+
+//---------------------------------------------------------
+// changeTrackName
+//---------------------------------------------------------
+
+void Song::changeTrackName(Track* t, const QString& s)
+ {
+ startUndo();
+ undoOp(UndoOp::RenameTrack, t, t->name(), s);
+ t->setName(s);
+ endUndo(SC_TRACK_MODIFIED);
+ }
+
+//---------------------------------------------------------
+// trackExists
+//---------------------------------------------------------
+
+bool Song::trackExists(Track* t) const
+ {
+ for (ciTrack it = _tracks.begin(); it != _tracks.end(); ++it) {
+ if (*it == t)
+ return true;
+ }
+ return false;
+ }
diff --git a/muse/muse/song.h b/muse/muse/song.h
new file mode 100644
index 00000000..0ff78413
--- /dev/null
+++ b/muse/muse/song.h
@@ -0,0 +1,399 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __SONG_H__
+#define __SONG_H__
+
+#include "undo.h"
+#include "miditrack.h"
+#include "wavetrack.h"
+#include "audioinput.h"
+#include "audiooutput.h"
+#include "audioaux.h"
+#include "audiogroup.h"
+#include "midisynti.h"
+#include "synth.h"
+#include "ctrl.h"
+#include "midififo.h"
+
+namespace AL {
+ class Xml;
+ class Marker;
+ class MarkerList;
+ class Pos;
+ };
+
+struct AudioMsg;
+class Event;
+class Track;
+class Part;
+class PartList;
+class Marker;
+class SettingsList;
+
+#define SC_TRACK_INSERTED 1
+#define SC_TRACK_REMOVED 2
+#define SC_TRACK_MODIFIED 4
+#define SC_PART_INSERTED 8
+#define SC_PART_REMOVED 0x10
+#define SC_PART_MODIFIED 0x20
+#define SC_EVENT_INSERTED 0x40
+#define SC_EVENT_REMOVED 0x80
+#define SC_EVENT_MODIFIED 0x100
+#define SC_SIG 0x200 // timing signature
+#define SC_TEMPO 0x400 // tempo map changed
+#define SC_MASTER 0x800 // master flag changed
+#define SC_SELECTION 0x1000
+#define SC_RECFLAG 0x10000
+#define SC_ROUTE 0x20000
+#define SC_CHANNELS 0x40000
+#define SC_CONFIG 0x80000 // midiPort-midiDevice
+#define SC_DRUMMAP 0x100000 // must update drumeditor
+#define SC_AUTOMATION 0x800000
+#define SC_RACK 0x1000000 // mixer rack changed
+#define SC_CLIP_MODIFIED 0x2000000
+
+//---------------------------------------------------------
+// Song
+//---------------------------------------------------------
+
+class Song : public QObject {
+ Q_OBJECT
+
+ public:
+ enum POS { CPOS = 0, LPOS, RPOS };
+ enum FollowMode { NO, JUMP, CONTINUOUS };
+ enum { REC_OVERDUP, REC_REPLACE };
+ enum { CYCLE_NORMAL, CYCLE_MIX, CYCLE_REPLACE };
+ enum { MARKER_CUR, MARKER_ADD, MARKER_REMOVE, MARKER_NAME,
+ MARKER_TICK, MARKER_LOCK };
+
+ private:
+ MidiFifo eventFifo;
+
+ int updateFlags;
+ bool _backupWritten;
+
+ TrackList _tracks; // tracklist as seen by arranger
+ MidiTrackList _midis;
+ WaveTrackList _waves;
+ InputList _inputs; // audio input ports
+ OutputList _outputs; // audio output ports
+ GroupList _groups; // mixer groups
+ AuxList _auxs; // aux sends
+ SynthIList _synthIs;
+ MidiSyntiList _midiSyntis;
+ MidiOutPortList _midiOutPorts;
+ MidiInPortList _midiInPorts;
+ MidiChannelList _midiChannel;
+ Track* _selectedTrack;
+
+ UndoList* undoList;
+ UndoList* redoList;
+ Pos pos[3];
+ Pos _vcpos; // virtual CPOS (locate in progress)
+ AL::MarkerList* _markerList;
+ bool seekInProgress; // user initiated a seek
+
+ bool _masterFlag;
+ bool loopFlag;
+ bool punchinFlag;
+ bool punchoutFlag;
+ bool recordFlag;
+ bool soloFlag;
+ int _recMode;
+ int _cycleMode;
+ bool _click;
+ bool _quantize;
+ unsigned _len; // song len in ticks
+ int _globalPitchShift;
+ void readMarker(QDomNode);
+
+ public:
+ Song();
+ ~Song();
+
+ void putEvent(const MidiEvent&);
+ void endMsgCmd();
+ void processMsg(AudioMsg* msg);
+
+ bool dirty;
+ bool backupWritten() const { return _backupWritten; }
+ void setBackupWritten(bool val) { _backupWritten = val; }
+ WaveTrack* bounceTrack;
+
+ void updatePos();
+
+ void read(QDomNode);
+ void write(Xml&) const;
+
+ void clear(bool signal);
+ void update(int flags = -1);
+
+ int globalPitchShift() const { return _globalPitchShift; }
+ void setGlobalPitchShift(int val) { _globalPitchShift = val; }
+
+ //-----------------------------------------
+ // Marker
+ //-----------------------------------------
+
+ AL::MarkerList* marker() const { return _markerList; }
+ AL::Marker* addMarker(const QString& s, const AL::Pos&);
+ void removeMarker(AL::Marker*);
+ AL::Marker* setMarkerName(AL::Marker*, const QString&);
+ AL::Marker* setMarkerTick(AL::Marker*, int);
+ AL::Marker* setMarkerLock(AL::Marker*, bool);
+ void setMarkerCurrent(AL::Marker* m, bool f);
+
+ //-----------------------------------------
+ // transport
+ //-----------------------------------------
+
+ const Pos& cPos() const { return pos[0]; }
+ const Pos& lPos() const { return pos[1]; }
+ const Pos& rPos() const { return pos[2]; }
+ unsigned cpos() const { return pos[0].tick(); }
+ unsigned vcpos() const { return _vcpos.tick(); }
+ const Pos& vcPos() const { return _vcpos; }
+ unsigned lpos() const { return pos[1].tick(); }
+ unsigned rpos() const { return pos[2].tick(); }
+
+ bool loop() const { return loopFlag; }
+ bool record() const { return recordFlag; }
+ bool punchin() const { return punchinFlag; }
+ bool punchout() const { return punchoutFlag; }
+ bool masterFlag() const { return _masterFlag; }
+ void setRecMode(int val) { _recMode = val; }
+ int recMode() const { return _recMode; }
+ void setCycleMode(int val) { _cycleMode = val; }
+ int cycleMode() const { return _cycleMode; }
+ bool click() const { return _click; }
+ bool quantize() const { return _quantize; }
+ void setStopPlay(bool);
+ void stopRolling();
+
+ //-----------------------------------------
+ // access tempomap/sigmap (Mastertrack)
+ //-----------------------------------------
+
+ unsigned len() const { return _len; }
+ int roundUpBar(int tick) const;
+ int roundUpBeat(int tick) const;
+ int roundDownBar(int tick) const;
+
+ //-----------------------------------------
+ // event manipulations
+ //-----------------------------------------
+
+ bool addEvent(Event&, Part*);
+ void changeEvent(Event&, Event&, Part*);
+ void deleteEvent(Event&, Part*);
+ void cmdChangeWave(QString original, QString tmpfile, unsigned sx, unsigned ex);
+
+ //-----------------------------------------
+ // part manipulations
+ //-----------------------------------------
+
+ void cmdSplitPart(Part* p, const Pos&);
+ void cmdGluePart(Part* p);
+
+ void changePart(Part*, Part*);
+ void addPart(Part* part);
+ PartList* getSelectedMidiParts() const;
+ PartList* getSelectedWaveParts() const;
+ bool msgRemoveParts();
+
+ void cmdChangePart(Part* oldPart, Part* newPart);
+ void cmdRemovePart(Part* part);
+ void cmdAddPart(Part* part);
+ void movePart(Part*, unsigned, Track*);
+ void linkPart(Part*, unsigned, Track*);
+ void copyPart(Part*, unsigned, Track*);
+ void selectPart(Part*, bool add=false);
+
+// SettingsList* settingsList() { return esettingsList; }
+
+ //-----------------------------------------
+ // track manipulations
+ //-----------------------------------------
+
+ TrackList* tracks() { return &_tracks; }
+ MidiTrackList* midis() { return &_midis; }
+ WaveTrackList* waves() { return &_waves; }
+ InputList* inputs() { return &_inputs; }
+ OutputList* outputs() { return &_outputs; }
+ GroupList* groups() { return &_groups; }
+ AuxList* auxs() { return &_auxs; }
+ SynthIList* syntis() { return &_synthIs; }
+ MidiOutPortList* midiOutPorts() { return &_midiOutPorts; }
+ MidiOutPort* midiOutPort(int idx) { return _midiOutPorts.index(idx); }
+ MidiSyntiList* midiSyntis() { return &_midiSyntis; }
+ MidiInPortList* midiInPorts() { return &_midiInPorts; }
+ MidiChannelList* midiChannel() { return &_midiChannel; }
+
+ bool trackExists(Track*) const;
+
+ void removeTrack(Track* track);
+ void removeTrack1(Track* track);
+ void removeTrack2(Track* track);
+ void removeTrack3(Track* track);
+ void removeMarkedTracks();
+ void changeTrackName(Track* track, const QString&);
+
+ MidiTrack* findTrack(const Part* part) const;
+ Track* findTrack(const QString& name) const;
+ void swapTracks(int i1, int i2);
+ void moveTrack(Track*, Track*);
+ void insertTrack(Track*, int idx);
+ void insertTrack0(Track*, int idx);
+ void insertTrack1(Track*, int idx);
+ void insertTrack2(Track*);
+ void readRoute(QDomNode);
+ void recordEvent(MidiTrack*, Event&);
+ std::vector<QString>* synthesizer() const;
+
+ void deselectTracks();
+ void selectTrack(Track*);
+
+ Track* selectedTrack() const { return _selectedTrack; }
+ void updateSelectedTrack();
+
+ //-----------------------------------------
+ // undo, redo
+ //-----------------------------------------
+
+ void startUndo();
+ void endUndo(int);
+ void undoOp(UndoOp::UndoType, int, Track*);
+ void undoOp(UndoOp::UndoType, int, int, int = 0);
+ void undoOp(UndoOp::UndoType, Part*);
+ void undoOp(UndoOp::UndoType, Event& oevent, Event& nevent, Part*);
+ void undoOp(UndoOp::UndoType, SigEvent* oevent, SigEvent* nevent);
+ void undoOp(UndoOp::UndoType, int channel, int ctrl, int oval, int nval);
+ void undoOp(UndoOp::UndoType, Part* oPart, Part* nPart);
+ void undoOp(UndoOp::UndoType, Track*, int, unsigned, CVal, CVal);
+ void undoOp(UndoOp::UndoType, Track*, const QString&, const QString&);
+ void undoOp(UndoOp::UndoType type, const char* changedFile, const char* changeData, int startframe, int endframe);
+ bool doUndo1();
+ void doUndo2();
+ void doUndo3();
+ bool doRedo1();
+ void doRedo2();
+ void doRedo3();
+
+ void addUndo(UndoOp& i);
+
+ //-----------------------------------------
+ // Configuration
+ //-----------------------------------------
+
+// void rescanAlsaPorts();
+
+ //-----------------------------------------
+ // Controller
+ //-----------------------------------------
+
+ void addControllerVal(Track*, Ctrl*, const Pos&, CVal);
+ void addControllerVal(Track*, int, const Pos&, CVal);
+ void setControllerVal(Track*, Ctrl*, CVal);
+ void setControllerVal(Track*, int, CVal);
+
+ void removeControllerVal(Track*,int,unsigned);
+ void setAutoRead(Track*,bool);
+ void setAutoWrite(Track*,bool);
+
+ //-----------------------------------------
+ // Misc/Debug
+ //-----------------------------------------
+
+ void setLen(int);
+ void dumpMaster();
+ void addUpdateFlags(int f) { updateFlags |= f; }
+ bool solo() const { return soloFlag; }
+ void setRecordFlag(Track*, bool);
+ void setMute(Track*,bool);
+ void setSolo(Track*,bool);
+ void setOff(Track*,bool);
+
+ public slots:
+ void beat();
+
+ void undo();
+ void redo();
+
+ void setTempo(int t);
+ void setSig(const AL::TimeSignature&);
+
+ void setMasterFlag(bool flag);
+ void setLoop(bool f);
+ void setRecord(bool f);
+ void setPlay(bool f);
+ void setStop(bool);
+ void forward();
+ void rewindStart();
+ void rewind();
+ void setPunchin(bool f);
+ void setPunchout(bool f);
+ void setClick(bool val);
+ void setQuantize(bool val);
+ void panic();
+ void seqSignal(int fd);
+ Track* addTrack(QAction*);
+ void setMeasureLen(int l);
+ void changePart(Part*, unsigned, unsigned);
+ void createLRPart(Track* track);
+ void setTickPos(int, unsigned);
+
+ void setPos(int, const AL::Pos&);
+ void setPos(int, const AL::Pos&, bool sig, bool isSeek = true,
+ bool adjustScrollbar = false);
+
+ signals:
+ void songChanged(int);
+ void posChanged(int, const AL::Pos&, bool);
+ void loopChanged(bool);
+ void recordChanged(bool);
+ void playChanged(bool);
+ void punchinChanged(bool);
+ void punchoutChanged(bool);
+ void clickChanged(bool);
+ void quantizeChanged(bool);
+ void markerChanged(int);
+ void midiPortsChanged();
+ void midiEvent(const MidiEvent&);
+ void trackAdded(Track*, int idx);
+ void trackRemoved(Track*);
+ void lenChanged(const AL::Pos&);
+ void measureLenChanged(int);
+
+ void recordChanged(Track*,bool);
+ void muteChanged(Track*,bool);
+ void soloChanged(Track*,bool);
+ void offChanged(Track*,bool);
+ void autoReadChanged(Track*,bool);
+ void autoWriteChanged(Track*,bool);
+ void trackSelectionChanged(Track*);
+ void tempoChanged();
+ };
+
+extern Song* song;
+
+#endif
+
diff --git a/muse/muse/songfile.cpp b/muse/muse/songfile.cpp
new file mode 100644
index 00000000..ba6409d1
--- /dev/null
+++ b/muse/muse/songfile.cpp
@@ -0,0 +1,427 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "muse.h"
+#include "song.h"
+#include "arranger/arranger.h"
+#include "al/xml.h"
+#include "midiedit/drummap.h"
+#include "al/marker.h"
+#include "midictrl.h"
+#include "mixer/mixer.h"
+#include "conf.h"
+#include "midiseq.h"
+#include "al/tempo.h"
+#include "al/sig.h"
+#include "synth.h"
+#include "waveedit/waveedit.h"
+#include "master/masteredit.h"
+#include "midiedit/drumedit.h"
+#include "midiedit/pianoroll.h"
+#include "part.h"
+#include "marker/markerview.h"
+
+//---------------------------------------------------------
+// readPart
+//---------------------------------------------------------
+
+Part* MusE::readPart(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ Part* part = 0;
+ QString s = e.text();
+ unsigned trackIdx;
+ int partIdx;
+ sscanf(s.toLatin1().data(), "%d:%d", &trackIdx, &partIdx);
+ TrackList* tl = song->tracks();
+ Track* track = 0;
+ if (trackIdx < tl->size()) {
+ track = tl->index(trackIdx);
+ part = track->parts()->find(partIdx);
+ }
+ return part;
+ }
+
+//---------------------------------------------------------
+// readToplevels
+//---------------------------------------------------------
+
+void MusE::readToplevels(QDomNode node)
+ {
+ PartList* pl = new PartList;
+
+ for (;!node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ if (tag == "part") {
+ Part* part = readPart(node);
+ if (part)
+ pl->add(part);
+ }
+ else if (tag == "PianoRoll") {
+ PianoRoll* pianoroll = new PianoRoll(pl, true);
+ connect(muse, SIGNAL(configChanged()), pianoroll, SLOT(configChanged()));
+ pianoroll->read(node);
+ pianoroll->show();
+ pl = new PartList;
+ }
+ else if (tag == "DrumEdit") {
+ DrumEdit* drumEditor = new DrumEdit(pl, true);
+ connect(muse, SIGNAL(configChanged()), drumEditor, SLOT(configChanged()));
+ drumEditor->read(node);
+ drumEditor->show();
+ pl = new PartList;
+ }
+ else if (tag == "ListEditor") {
+// ListEdit* listEditor = new ListEdit(0, pl);
+// listEditor->show();
+// listEditor->readStatus(node.firstChild());
+ pl = new PartList;
+ }
+ else if (tag == "MasterEdit") {
+ MasterEdit* masterEditor = new MasterEdit();
+ masterEditor->show();
+ masterEditor->read(node);
+ }
+ else if (tag == "MarkerView") {
+ showMarker(true);
+ markerView->read(node);
+ }
+ else if (tag == "WaveEdit") {
+ WaveEdit* waveEditor = new WaveEdit(pl);
+ waveEditor->show();
+ connect(muse, SIGNAL(configChanged()), waveEditor, SLOT(configChanged()));
+ waveEditor->read(node);
+ pl = new PartList;
+ }
+ else
+ printf("MusE:readToplevels: unknown tag <%s>\n", e.tagName().toLatin1().data());
+ }
+ delete pl;
+ }
+
+//---------------------------------------------------------
+// readMarker
+//---------------------------------------------------------
+
+void Song::readMarker(QDomNode node)
+ {
+ AL::Marker m;
+ m.read(node);
+ _markerList->add(m);
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void Song::read(QDomNode node)
+ {
+ cloneList.clear();
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ int i = e.text().toInt();
+ if (tag == "configuration")
+ readConfiguration(node.firstChild());
+ else if (tag == "master")
+ setMasterFlag(i);
+ else if (tag == "loop")
+ setLoop(i);
+ else if (tag == "punchin")
+ setPunchin(i);
+ else if (tag == "punchout")
+ setPunchout(i);
+ else if (tag == "record")
+ ; // setRecord(i);
+ else if (tag == "solo")
+ soloFlag = i;
+ else if (tag == "recmode")
+ _recMode = i;
+ else if (tag == "cycle")
+ _cycleMode = i;
+ else if (tag == "click")
+ setClick(i);
+ else if (tag == "quantize")
+ _quantize = i;
+ else if (tag == "len")
+ _len = i;
+ else if (tag == "tempolist")
+ AL::tempomap.read(node);
+ else if (tag == "siglist")
+ AL::sigmap.read(node.firstChild());
+ else if (tag == "miditrack") {
+ MidiTrack* track = new MidiTrack();
+ track->read(node.firstChild());
+ insertTrack0(track, -1);
+ }
+ else if (tag == "drumtrack") {
+ MidiTrack* track = new MidiTrack();
+ //TODO track->setUseDrumMap(true);
+ track->read(node.firstChild());
+ insertTrack0(track, -1);
+ }
+ else if (tag == "wavetrack") {
+ WaveTrack* track = new WaveTrack();
+ track->read(node.firstChild());
+ insertTrack0(track, -1);
+ }
+ else if (tag == "AudioInput") {
+ AudioInput* track = new AudioInput();
+ track->read(node.firstChild());
+ insertTrack0(track,-1);
+ }
+ else if (tag == "AudioOutput") {
+ AudioOutput* track = new AudioOutput();
+ track->read(node.firstChild());
+ insertTrack0(track,-1);
+ }
+ else if (tag == "AudioGroup") {
+ AudioGroup* track = new AudioGroup();
+ track->read(node.firstChild());
+ insertTrack0(track,-1);
+ }
+ else if (tag == "AudioAux") {
+ AudioAux* track = new AudioAux();
+ track->read(node.firstChild());
+ insertTrack0(track, -1);
+ }
+ else if (tag == "SynthI") {
+ SynthI* track = new SynthI();
+ track->read(node.firstChild());
+ // insertTrack(track, -1);
+ }
+ else if (tag == "MidiOutPort") {
+ MidiOutPort* track = new MidiOutPort();
+ track->read(node.firstChild());
+ insertTrack0(track, -1);
+ }
+ else if (tag == "MidiInPort") {
+ MidiInPort* track = new MidiInPort();
+ track->read(node.firstChild());
+ insertTrack0(track, -1);
+ }
+ else if (tag == "MidiSynti") {
+ MidiSynti* track = new MidiSynti();
+ track->read(node.firstChild());
+ // insertTrack0(track, -1);
+ }
+ else if (tag == "arranger")
+ muse->arranger->readStatus(node.firstChild());
+ else if (tag == "Route")
+ readRoute(node);
+ else if (tag == "marker")
+ readMarker(node);
+ else if (tag == "globalPitchShift")
+ _globalPitchShift = i;
+ else if (tag == "cpos") {
+ int pos = i;
+ Pos p(pos, AL::TICKS);
+ setPos(Song::CPOS, p, false, false, false);
+ }
+ else if (tag == "lpos") {
+ int pos = i;
+ Pos p(pos, AL::TICKS);
+ setPos(Song::LPOS, p, false, false, false);
+ }
+ else if (tag == "rpos") {
+ int pos = i;
+ Pos p(pos, AL::TICKS);
+ setPos(Song::RPOS, p, false, false, false);
+ }
+ else if (tag == "Pianoroll")
+ PianoRoll::readConfiguration(node);
+ else if (tag == "DrumEdit")
+ DrumEdit::readConfiguration(node);
+ else
+ printf("MusE:Song: unknown tag %s\n", tag.toLatin1().data());
+ }
+ dirty = false;
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void Song::write(Xml& xml) const
+ {
+ xml.tag("song");
+ xml.intTag("cpos", song->cpos());
+ xml.intTag("rpos", song->rpos());
+ xml.intTag("lpos", song->lpos());
+ xml.intTag("master", _masterFlag);
+ if (loopFlag)
+ xml.intTag("loop", loopFlag);
+ if (punchinFlag)
+ xml.intTag("punchin", punchinFlag);
+ if (punchoutFlag)
+ xml.intTag("punchout", punchoutFlag);
+ if (soloFlag)
+ xml.intTag("solo", soloFlag);
+ if (_recMode != REC_OVERDUP)
+ xml.intTag("recmode", _recMode);
+ if (_cycleMode != CYCLE_NORMAL)
+ xml.intTag("cycle", _cycleMode);
+ if (_click)
+ xml.intTag("click", _click);
+ if (_quantize)
+ xml.intTag("quantize", _quantize);
+ xml.intTag("len", _len);
+
+ if (_globalPitchShift)
+ xml.intTag("globalPitchShift", _globalPitchShift);
+
+ cloneList.clear();
+
+ // write tracks
+ for (ciTrack i = _tracks.begin(); i != _tracks.end(); ++i) {
+ // midi channels are saved as part of midi out ports
+ if ((*i)->type() != Track::MIDI_CHANNEL)
+ (*i)->write(xml);
+ }
+
+ // write routing
+ for (ciTrack i = _tracks.begin(); i != _tracks.end(); ++i)
+ (*i)->writeRouting(xml);
+ muse->arranger->writeStatus(xml);
+
+ AL::tempomap.write(xml);
+ AL::sigmap.write(xml);
+ _markerList->write(xml);
+
+ xml.etag("song");
+ }
+
+//---------------------------------------------------------
+// write
+// write song
+//---------------------------------------------------------
+
+void MusE::write(Xml& xml) const
+ {
+ xml.header();
+
+ xml.tag("muse version=\"2.1\"");
+ writeConfiguration(xml);
+
+ song->write(xml);
+
+ xml.tag("toplevels");
+ foreach(QWidget* w, QApplication::topLevelWidgets()) {
+ if (!w->isVisible())
+ continue;
+ if (strcmp("DrumEdit", w->metaObject()->className()) == 0)
+ ((TopWin*)w)->write(xml);
+ else if (strcmp("PianoRoll", w->metaObject()->className()) == 0)
+ ((TopWin*)w)->write(xml);
+ else if (strcmp("MasterEdit", w->metaObject()->className()) == 0)
+ ((TopWin*)w)->write(xml);
+ else if (strcmp("WaveEdit", w->metaObject()->className()) == 0)
+ ((TopWin*)w)->write(xml);
+ else if (strcmp("ListEdit", w->metaObject()->className()) == 0)
+ ((TopWin*)w)->write(xml);
+ else if (strcmp("MarkerView", w->metaObject()->className()) == 0)
+ ((TopWin*)w)->write(xml);
+ else if (strcmp("Mixer", w->metaObject()->className()) == 0)
+ ;
+ else if (strcmp("Transport", w->metaObject()->className()) == 0)
+ ;
+ else if (strcmp("MusE", w->metaObject()->className()) == 0)
+ ;
+ else if (strcmp("QDesktopWidget", w->metaObject()->className()) == 0)
+ ;
+ else
+ printf("TopLevel <%s>\n", w->metaObject()->className());
+ }
+ xml.etag("toplevels");
+ xml.etag("muse");
+ }
+
+//---------------------------------------------------------
+// read
+// read song
+//---------------------------------------------------------
+
+bool MusE::read(QFile* qf, bool /*skipConfig*/)
+ {
+ QDomDocument doc;
+
+ int line, column;
+ QString err;
+ if (!doc.setContent(qf, false, &err, &line, &column)) {
+ QString col, ln, error;
+ col.setNum(column);
+ ln.setNum(line);
+ error = err + "\n at line: " + ln + " col: " + col;
+ printf("error reading med file: %s\n", error.toLatin1().data());
+ return true;
+ }
+ for (QDomNode node = doc.documentElement(); !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "muse") {
+ QString sversion = e.attribute("version", "1.0");
+ int major=0, minor=0;
+ sscanf(sversion.toLatin1().data(), "%d.%d", &major, &minor);
+ version = major << 8 + minor;
+ if (version >= 0x200)
+ read20(node.firstChild());
+ else if (version == 0x100)
+ read10(node.firstChild());
+ else
+ printf("unsupported *.med file version %s\n", sversion.toLatin1().data());
+ }
+ else
+ printf("MusE: %s not supported\n", e.tagName().toLatin1().data());
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// read10
+//---------------------------------------------------------
+
+void MusE::read10(QDomNode)
+ {
+ printf("reading type 1.0 *.med files not implemented\n");
+ }
+
+//---------------------------------------------------------
+// read20
+//---------------------------------------------------------
+
+void MusE::read20(QDomNode node)
+ {
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "configuration")
+ readConfiguration(node.firstChild());
+ else if (e.tagName() == "song")
+ song->read(node.firstChild());
+ else if (e.tagName() == "toplevels")
+ readToplevels(node.firstChild());
+ else
+ printf("MusE:read20(): unknown tag %s\n", e.tagName().toLatin1().data());
+ }
+ }
+
diff --git a/muse/muse/sync.cpp b/muse/muse/sync.cpp
new file mode 100644
index 00000000..5a4478bb
--- /dev/null
+++ b/muse/muse/sync.cpp
@@ -0,0 +1,488 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "sync.h"
+#include "song.h"
+#include "widgets/utils.h"
+#include "globals.h"
+#include "midiseq.h"
+#include "audio.h"
+#include "driver/audiodev.h"
+#include "gconfig.h"
+#include "al/tempo.h"
+#include "al/al.h"
+
+int rxSyncPort = -1; // receive from all ports
+int txSyncPort = 1;
+
+int rxDeviceId = 0x7f; // ´any´ device
+int txDeviceId = 0x7f; // ´any´ device
+
+bool debugSync = false;
+MTC mtcOffset;
+bool extSyncFlag = false;
+bool genMTCSync = false; // output MTC Sync
+bool genMCSync = false; // output MidiClock Sync
+bool genMMC = false; // output Midi Machine Control
+bool acceptMTC = false;
+bool acceptMC = true;
+bool acceptMMC = true;
+
+static MTC mtcCurTime;
+static int mtcState; // 0-7 next expected quarter message
+static bool mtcValid;
+static int mtcLost;
+static bool mtcSync; // receive complete mtc frame?
+
+static bool mcStart = false;
+static int mcStartTick;
+
+enum {
+ MMC_STOP = 1,
+ MMC_PLAY = 2,
+ MMC_DEFERRED_PLAY = 3,
+ MMC_FAST_FORWARD = 4,
+ MMC_REWIND = 5,
+ MMC_RECORD_STROBE = 6, // Punch In
+ MMC_RECORD_EXIT = 7, // Punch Out
+ MMC_PAUSE = 9,
+ MMC_RESET = 13,
+ MMC_GOTO = 0x44
+ };
+
+//---------------------------------------------------------
+// mmcInput
+// Midi Machine Control Input received
+//---------------------------------------------------------
+
+void MidiSeq::mmcInput(int id, int cmd, const Pos& pos)
+ {
+ if (!extSyncFlag || !acceptMMC || (id != 127 && id != rxDeviceId))
+ return;
+
+ if (debugMsg)
+ printf("mmcInput: id %d cmd %02x %02x\n", id, cmd, cmd);
+
+ switch (cmd) {
+ case MMC_STOP:
+ if (debugSync)
+ printf(" MMC: STOP\n");
+ if (audio->isPlaying())
+ audioDriver->stopTransport();
+ else
+ // reset REC
+ audio->sendMsgToGui(MSG_STOP);
+ break;
+ case MMC_PLAY:
+ case MMC_DEFERRED_PLAY:
+ audioDriver->startTransport();
+ break;
+ case MMC_FAST_FORWARD:
+ printf("MMC: FF not implemented\n");
+ break;
+ case MMC_REWIND:
+ printf("MMC: REWIND not implemented\n");
+ break;
+ case MMC_RECORD_STROBE:
+ printf("MMC: REC STROBE not implemented\n");
+ break;
+ case MMC_RECORD_EXIT:
+ printf("MMC: REC EXIT not implemented\n");
+ break;
+ case MMC_PAUSE:
+ audio->sendMsgToGui(MSG_RECORD);
+ break;
+ case MMC_RESET:
+ printf("MMC: RESET not implemented\n");
+ break;
+
+ case MMC_GOTO:
+ audioDriver->seekTransport(pos.frame());
+ break;
+
+ default:
+ printf("MMC id %x cmd %x, unknown\n", id, cmd);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// mtcInputQuarter
+// process Quarter Frame Message
+//---------------------------------------------------------
+
+void MidiSeq::mtcInputQuarter(int, unsigned char c)
+ {
+ static int hour, min, sec, frame;
+
+ if (!extSyncFlag)
+ return;
+
+ int valL = c & 0xf;
+ int valH = valL << 4;
+
+ int _state = (c & 0x70) >> 4;
+ if (mtcState != _state)
+ mtcLost += _state - mtcState;
+ mtcState = _state + 1;
+
+ switch(_state) {
+ case 7:
+ hour = (hour & 0x0f) | valH;
+ break;
+ case 6:
+ hour = (hour & 0xf0) | valL;
+ break;
+ case 5:
+ min = (min & 0x0f) | valH;
+ break;
+ case 4:
+ min = (min & 0xf0) | valL;
+ break;
+ case 3:
+ sec = (sec & 0x0f) | valH;
+ break;
+ case 2:
+ sec = (sec & 0xf0) | valL;
+ break;
+ case 1:
+ frame = (frame & 0x0f) | valH;
+ break;
+ case 0: frame = (frame & 0xf0) | valL;
+ break;
+ }
+ frame &= 0x1f; // 0-29
+ sec &= 0x3f; // 0-59
+ min &= 0x3f; // 0-59
+ hour &= 0x1f;
+
+ if (mtcState == 8) {
+ mtcValid = (mtcLost == 0);
+ mtcState = 0;
+ mtcLost = 0;
+ if (mtcValid) {
+ mtcCurTime.set(hour, min, sec, frame);
+ mtcSyncMsg(mtcCurTime, !mtcSync);
+ mtcSync = true;
+ }
+ }
+ else if (mtcValid && (mtcLost == 0)) {
+ mtcCurTime.incQuarter();
+ mtcSyncMsg(mtcCurTime, false);
+ }
+ }
+
+//---------------------------------------------------------
+// mtcInputFull
+// process Frame Message
+//---------------------------------------------------------
+
+void MidiSeq::mtcInputFull(const unsigned char* p, int n)
+ {
+ if (debugSync)
+ printf("mtcInputFull\n");
+ if (!extSyncFlag)
+ return;
+
+ if (p[3] != 1) {
+ if (p[3] != 2) { // silently ignore user bits
+ printf("unknown mtc msg subtype 0x%02x\n", p[3]);
+ dump(p, n);
+ }
+ return;
+ }
+ int hour = p[4];
+ int min = p[5];
+ int sec = p[6];
+ int frame = p[7];
+
+ frame &= 0x1f; // 0-29
+ sec &= 0x3f; // 0-59
+ min &= 0x3f; // 0-59
+// int type = (hour >> 5) & 3;
+ hour &= 0x1f;
+
+ mtcCurTime.set(hour, min, sec, frame);
+ mtcState = 0;
+ mtcValid = true;
+ mtcLost = 0;
+ }
+
+//---------------------------------------------------------
+// nonRealtimeSystemSysex
+//---------------------------------------------------------
+
+void MidiSeq::nonRealtimeSystemSysex(const unsigned char* p, int n)
+ {
+// int chan = p[2];
+ switch(p[3]) {
+ case 4:
+ printf("NRT Setup\n");
+ break;
+ default:
+ printf("unknown NRT Msg 0x%02x\n", p[3]);
+ dump(p, n);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// setSongPosition
+// MidiBeat is a 14 Bit value. Each MidiBeat spans
+// 6 MIDI Clocks. Inother words, each MIDI Beat is a
+// 16th note (since there are 24 MIDI Clocks in a
+// quarter note).
+//---------------------------------------------------------
+
+void MidiSeq::setSongPosition(int port, int midiBeat)
+ {
+ if (midiInputTrace)
+ printf("set song position port:%d %d\n", port, midiBeat);
+ if (!extSyncFlag)
+ return;
+ Pos pos((config.division * midiBeat) / 4, AL::TICKS);
+ audioDriver->seekTransport(pos.frame());
+ if (debugSync)
+ printf("setSongPosition %d\n", pos.tick());
+ }
+
+//---------------------------------------------------------
+// realtimeSystemInput
+// real time message received
+//---------------------------------------------------------
+
+void MidiSeq::realtimeSystemInput(int port, int c)
+ {
+ if (midiInputTrace)
+ printf("realtimeSystemInput port:%d 0x%x\n", port+1, c);
+
+ if (midiInputTrace && (rxSyncPort != port) && rxSyncPort != -1) {
+ if (debugSync)
+ printf("rxSyncPort configured as %d; received sync from port %d\n",
+ rxSyncPort, port);
+ return;
+ }
+ if (!extSyncFlag)
+ return;
+ switch(c) {
+ case 0xf8: // midi clock (24 ticks / quarter note)
+ {
+ double mclock0 = curTime();
+ // Difference in time last 2 rounds:
+ double tdiff0 = mclock0 - mclock1;
+ double tdiff1 = mclock1 - mclock2;
+ double averagetimediff = 0.0;
+
+ if (mclock1 != 0.0) {
+ if (storedtimediffs < 24)
+ {
+ timediff[storedtimediffs] = mclock0 - mclock1;
+ storedtimediffs++;
+ }
+ else {
+ for (int i=0; i<23; i++) {
+ timediff[i] = timediff[i+1];
+ }
+ timediff[23] = mclock0 - mclock1;
+ }
+ // Calculate average timediff:
+ for (int i=0; i < storedtimediffs; i++) {
+ averagetimediff += timediff[i]/storedtimediffs;
+ }
+ }
+ processMidiClock();
+
+ // Compare w audio if playing:
+ if (audio->isPlaying() /*state == PLAY*/) {
+ //BEGIN standard setup:
+ recTick += config.division / 24; // The one we're syncing to
+ int tempo = AL::tempomap.tempo(0);
+ unsigned curFrame = audio->pos().frame();
+ double songtick = (double(curFrame)/double(AL::sampleRate)) * config.division * 1000000.0 / double(tempo);
+ double scale = tdiff0/averagetimediff;
+ double tickdiff = songtick - ((double) recTick - 24 + scale*24.0);
+
+ //END standard setup
+ if (debugSync) {
+ //
+ // Create debug values for printing out which beat we're at, etc etc... yaddayadda...
+ //
+ int m, b, t;
+ audio->pos().mbt(&m, &b, &t);
+
+ int song_beat = b + m*4; // if the time-signature is different than 4/4, this will be wrong.
+ int sync_beat = recTick/config.division;
+ printf("pT=%.3f rT=%d diff=%.3f songB=%d syncB=%d scale=%.3f", songtick, recTick, tickdiff, song_beat, sync_beat, scale);
+ }
+ //if ((mclock2 !=0.0) && (tdiff1 > 0.0) && tickdiff != 0.0 && lastTempo != 0) {
+ if ((mclock2 !=0.0) && (tdiff1 > 0.0) && fabs(tickdiff) > 2.0 && lastTempo != 0) {
+ // Interpolate:
+ double tickdiff1 = songtick1 - recTick1;
+ double tickdiff2 = songtick2 - recTick2;
+ //double newtickdiff = tickdiff/3.0 + tickdiff1/5.0 + tickdiff2/7.0; //2 min 15 sec, 120BPM, -p 512 jackd
+ //double newtickdiff = tickdiff/4.0 + tickdiff1/4.0 + tickdiff2/4.0; // Not long... :-P
+ //double newtickdiff = tickdiff/5.0 + tickdiff1/8.0 + tickdiff2/12.0; //3,5 mins on 120BPM, -p 512 jackd
+ //double newtickdiff = tickdiff/7.0 + tickdiff1/8.0 + tickdiff2/9.0; //2 min 15 sec, 120BPM, -p 512 jackd
+ //double newtickdiff = tickdiff/5.0 + tickdiff1/8.0 + tickdiff2/16.0; //3,5 mins on 120BPM, -p 512 jackd
+ double newtickdiff = tickdiff/5.0 + tickdiff1/16.0 + tickdiff2/24.0; //5 mins 30 secs on 116BPM, -p 512 jackd
+ //double newtickdiff = tickdiff/5.0 + tickdiff1/23.0 + tickdiff2/31.0; //5 mins on 116BPM, -p 512 jackd
+ //double newtickdiff = tickdiff + tickdiff1/8.0 + tickdiff2/16.0; // Not long...
+
+ if (newtickdiff != 0.0) {
+ int newTempo = AL::tempomap.tempo(0);
+ //newTempo += int(24.0 * newtickdiff * scale);
+ newTempo += int(24.0 * newtickdiff);
+ if (debugSync)
+ printf(" tdiff=%f ntd=%f lt=%d tmpo=%.3f", tdiff0, newtickdiff, lastTempo, (float)((1000000.0 * 60.0)/newTempo));
+ AL::tempomap.setTempo(0,newTempo);
+ }
+ if (debugSync)
+ printf("\n");
+ }
+ else if (debugSync)
+ printf("\n");
+
+ //BEGIN post calc
+ lastTempo = tempo;
+ recTick2 = recTick1;
+ recTick1 = recTick;
+ mclock2 = mclock1;
+ mclock1 = mclock0;
+ songtick2 = songtick1;
+ songtick1 = songtick;
+ //END post calc
+ break;
+ } // END state play
+ //
+ // Pre-sync (when audio is not running)
+ // Calculate tempo depending on time per pulse
+ //
+ if (mclock1 == 0.0) {
+//TODO3 midiPorts[port].device()->discardInput();
+ if (debugSync)
+ printf("Discarding input from port %d\n", port);
+ }
+ if ((mclock2 != 0.0) && (tdiff0 > 0.0)) {
+ int tempo0 = int(24000000.0 * tdiff0 + .5);
+ int tempo1 = int(24000000.0 * tdiff1 + .5);
+ int tempo = AL::tempomap.tempo(0);
+
+ int diff0 = tempo0 - tempo;
+ int diff1 = tempo1 - tempo0;
+ if (diff0) {
+ int newTempo = tempo + diff0/8 + diff1/16;
+ if (debugSync)
+ printf("setting new tempo %d = %f\n", newTempo, (float)((1000000.0 * 60.0)/newTempo));
+ AL::tempomap.setTempo(0, newTempo);
+ }
+ }
+ mclock2 = mclock1;
+ mclock1 = mclock0;
+ }
+ break;
+ case 0xf9: // midi tick (every 10 msec)
+ if (mcStart) {
+ song->setPos(0, mcStartTick);
+ mcStart = false;
+ return;
+ }
+ break;
+ case 0xfa: // start
+ if (debugSync)
+ printf(" start\n");
+ if (!audio->isPlaying() /*state == IDLE*/) {
+ //seek(0);
+ audioDriver->seekTransport(0);
+ unsigned curFrame = audio->curFrame();
+ recTick = recTick1 = recTick2 = 0;
+ mclock1 = 0.0; mclock2 = 0.0;
+ songtick1 = songtick2 = 0;
+ if (debugSync)
+ printf(" curFrame: %d curTick: %d tempo: %d\n", curFrame, recTick, AL::tempomap.tempo(0));
+
+ //startPlay();
+ storedtimediffs = 0;
+ for (int i=0; i<24; i++)
+ timediff[i] = 0.0;
+ audio->msgPlay(true);
+ }
+ break;
+ case 0xfb: // continue
+ if (debugSync)
+ printf(" continue\n");
+ if (!audio->isPlaying() /*state == IDLE */) {
+ unsigned curFrame = audio->curFrame();
+ recTick = AL::tempomap.frame2tick(curFrame); // don't think this will work... (ml)
+ audio->msgPlay(true);
+ }
+ break;
+ case 0xfc: // stop
+ if (debugSync)
+ printf(" stop\n");
+ if (audio->isPlaying() /*state == PLAY*/)
+ audio->msgPlay(false);
+ break;
+ case 0xfd: // unknown
+ case 0xfe: // active sensing
+ case 0xff: // system reset
+ break;
+ }
+
+ }
+
+//---------------------------------------------------------
+// mtcSyncMsg
+// process received mtc Sync
+// seekFlag - first complete mtc frame received after
+// start
+//---------------------------------------------------------
+
+void MidiSeq::mtcSyncMsg(const MTC& /*mtc*/, bool /*seekFlag*/)
+ {
+#if 0
+ double time = mtc.time();
+ if (debugSync)
+ printf("mtcSyncMsg: time %f\n", time);
+
+ if (seekFlag && state == START_PLAY) {
+// int tick = tempomap.time2tick(time);
+ state = PLAY;
+ sendMsgToGui(MSG_PLAY);
+ return;
+ }
+ // double curT = curTime();
+
+ if (tempoSN != tempomap.tempoSN()) {
+ double cpos = tempomap.tick2time(_midiTick, 0);
+ samplePosStart = samplePos - lrint(cpos * sampleRate);
+ rtcTickStart = rtcTick - lrint(cpos * realRtcTicks);
+ tempoSN = tempomap.tempoSN();
+ }
+
+ //
+ // diff is the time in sec MusE is out of sync
+ //
+ double diff = time - (double(samplePosStart)/double(sampleRate));
+ if (debugSync)
+ printf(" state %d diff %f\n", mtcState, diff);
+#endif
+ }
+
+
diff --git a/muse/muse/sync.h b/muse/muse/sync.h
new file mode 100644
index 00000000..ed8c6b33
--- /dev/null
+++ b/muse/muse/sync.h
@@ -0,0 +1,41 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __SYNC_H__
+#define __SYNC_H__
+
+#include "mtc.h"
+
+extern bool debugSync;
+
+extern int rxDeviceId;
+extern int txDeviceId;
+
+extern MTC mtcOffset;
+extern bool extSyncFlag;
+extern bool genMTCSync; // output MTC Sync
+extern bool genMCSync; // output MidiClock Sync
+extern bool genMMC; // output Midi Machine Control
+extern bool acceptMTC;
+extern bool acceptMC;
+extern bool acceptMMC;
+
+#endif
+
diff --git a/muse/muse/synth.cpp b/muse/muse/synth.cpp
new file mode 100644
index 00000000..fecd5084
--- /dev/null
+++ b/muse/muse/synth.cpp
@@ -0,0 +1,548 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include <dlfcn.h>
+
+#include "al/al.h"
+#include "muse.h"
+#include "synth.h"
+#include "al/xml.h"
+#include "midi.h"
+#include "synti/libsynti/mess.h"
+#include "song.h"
+#include "audio.h"
+#include "event.h"
+#include "mpevent.h"
+#include "audio.h"
+#include "midiseq.h"
+#include "midictrl.h"
+
+std::vector<Synth*> synthis; // array of available synthis
+
+extern void connectNodes(AudioTrack*, AudioTrack*);
+
+//---------------------------------------------------------
+// description
+//---------------------------------------------------------
+
+const char* MessSynth::description() const
+ {
+ return descr ? descr->description : "";
+ }
+
+//---------------------------------------------------------
+// version
+//---------------------------------------------------------
+
+const char* MessSynth::version() const
+ {
+ return descr ? descr->version : "";
+ }
+
+bool MessSynthIF::guiVisible() const
+ {
+ return _mess ? _mess->guiVisible() : false;
+ }
+
+void MessSynthIF::showGui(bool v)
+ {
+ if (v == guiVisible())
+ return;
+ if (_mess)
+ _mess->showGui(v);
+ }
+
+bool MessSynthIF::hasGui() const
+ {
+ if (_mess)
+ return _mess->hasGui();
+ return false;
+ }
+
+MidiEvent MessSynthIF::receiveEvent()
+ {
+ if (_mess)
+ return _mess->receiveEvent();
+ return MidiEvent();
+ }
+
+int MessSynthIF::eventsPending() const
+ {
+ if (_mess)
+ return _mess->eventsPending();
+ return 0;
+ }
+
+void MessSynthIF::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ if (_mess)
+ _mess->getGeometry(x, y, w, h);
+ }
+
+void MessSynthIF::setGeometry(int x, int y, int w, int h)
+ {
+ if (_mess)
+ _mess->setGeometry(x, y, w, h);
+ }
+
+//---------------------------------------------------------
+// findSynth
+// search for synthesizer base class
+//---------------------------------------------------------
+
+Synth* findSynth(const QString& sclass)
+ {
+ for (std::vector<Synth*>::iterator i = synthis.begin();
+ i != synthis.end(); ++i) {
+ if ((*i)->name() == sclass)
+ return *i;
+ }
+ printf("synthi class <%s> not found\n", sclass.toLatin1().data());
+ return 0;
+ }
+
+//---------------------------------------------------------
+// Synth
+//---------------------------------------------------------
+
+Synth::Synth(const QFileInfo* fi, QString s)
+ : info(*fi), _name(s)
+ {
+ _instances = 0;
+ }
+
+//---------------------------------------------------------
+// instantiate
+//---------------------------------------------------------
+
+void* MessSynth::instantiate(const QString& instanceName)
+ {
+ ++_instances;
+ const char* path = strdup(info.filePath().toLatin1().data());
+
+ // load Synti dll
+ // void* handle = dlopen(path, RTLD_NOW);
+ void* handle = dlopen(path, RTLD_LAZY);
+ if (handle == 0) {
+ fprintf(stderr, "Synth::instantiate: dlopen(%s) failed: %s\n",
+ path, dlerror());
+ delete path;
+ return 0;
+ }
+ typedef const MESS* (*MESS_Function)();
+ MESS_Function msynth = (MESS_Function)dlsym(handle, "mess_descriptor");
+
+ if (!msynth) {
+ const char *txt = dlerror();
+ if (txt) {
+ fprintf(stderr,
+ "Unable to find msynth_descriptor() function in plugin "
+ "library file \"%s\": %s.\n"
+ "Are you sure this is a MESS plugin file?\n",
+ path, txt);
+ delete path;
+ return 0;
+ }
+ }
+ delete path;
+ descr = msynth();
+ if (descr == 0) {
+ fprintf(stderr, "Synth::instantiate: no MESS descr found\n");
+ return 0;
+ }
+ Mess* mess = descr->instantiate(AL::sampleRate, muse, instanceName.toLatin1().data());
+ return mess;
+ }
+
+//---------------------------------------------------------
+// SynthI
+//---------------------------------------------------------
+
+SynthI::SynthI()
+ : AudioTrack(AUDIO_SOFTSYNTH)
+ {
+ synthesizer = 0;
+ _sif = 0;
+ // setVolume(1.0);
+ // setPan(0.0);
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool MessSynthIF::init(Synth* s, SynthI* si)
+ {
+ _mess = (Mess*)((MessSynth*)s)->instantiate(si->name());
+ return (_mess == 0);
+ }
+
+//---------------------------------------------------------
+// channels
+//---------------------------------------------------------
+
+int MessSynthIF::channels() const
+ {
+ return _mess->channels();
+ }
+
+//---------------------------------------------------------
+// createSIF
+//---------------------------------------------------------
+
+SynthIF* MessSynth::createSIF(SynthI* si)
+ {
+ MessSynthIF* sif = new MessSynthIF(si);
+ sif->init(this, si);
+ return sif;
+ }
+
+//---------------------------------------------------------
+// initInstance
+// returns false on success
+//---------------------------------------------------------
+
+bool SynthI::initInstance(Synth* s)
+ {
+ synthesizer = s;
+ _sif = s->createSIF(this);
+
+ setIName(name()); // set instrument name
+ AudioTrack::setChannels(_sif->channels());
+
+ //---------------------------------------------------
+ // read available controller from synti
+ //---------------------------------------------------
+
+ int id = 0;
+ MidiControllerList* cl = MidiInstrument::controller();
+ for (;;) {
+ const char* name;
+ int ctrl;
+ int min;
+ int max;
+ id = _sif->getControllerInfo(id, &name, &ctrl, &min, &max);
+ if (id == 0)
+ break;
+ MidiController* c = new MidiController(QString(name), ctrl, min, max, 0);
+ cl->push_back(c);
+ }
+
+ EventList* iel = midiState();
+ if (!iel->empty()) {
+ for (iEvent i = iel->begin(); i != iel->end(); ++i) {
+ Event ev = i->second;
+ MidiEvent pev(0, 0, ev);
+ static const int TIMEOUT = 1;
+ //
+ // retry until timeout
+ int to;
+ for (to = 0; to < TIMEOUT; ++to) {
+ if (!_sif->putEvent(pev))
+ break;
+ sleep(1);
+ }
+ if (to == TIMEOUT) {
+ printf("cannot initialize software synthesizer <%s>: busy\n",
+ name().toLatin1().data());
+ break;
+ }
+ }
+ iel->clear();
+ }
+
+ int idx = 0;
+ for (std::vector<float>::iterator i = initParams.begin(); i != initParams.end(); ++i, ++idx)
+ _sif->setParameter(idx, *i);
+ return false;
+ }
+
+//---------------------------------------------------------
+// getControllerInfo
+//---------------------------------------------------------
+
+int MessSynthIF::getControllerInfo(int id, const char** name, int* ctrl, int* min, int* max)
+ {
+ return _mess->getControllerInfo(id, name, ctrl, min, max);
+ }
+
+//---------------------------------------------------------
+// SynthI::deactivate
+//---------------------------------------------------------
+
+void SynthI::deactivate2()
+ {
+ removeMidiInstrument(this);
+ }
+
+//---------------------------------------------------------
+// deactivate3
+//---------------------------------------------------------
+
+void SynthI::deactivate3()
+ {
+ delete _sif;
+ _sif = 0;
+ synthesizer->incInstances(-1);
+ }
+
+void MessSynthIF::deactivate3()
+ {
+ if (_mess) {
+ delete _mess;
+ _mess = 0;
+ }
+ }
+
+MessSynthIF::~MessSynthIF()
+ {
+ deactivate3();
+ }
+
+//---------------------------------------------------------
+// ~SynthI
+//---------------------------------------------------------
+
+SynthI::~SynthI()
+ {
+ deactivate2();
+ deactivate3();
+ }
+
+//---------------------------------------------------------
+// initMidiSynth
+// search for software synthis and advertise
+//---------------------------------------------------------
+
+void initMidiSynth()
+ {
+ QString s = museGlobalLib + "/synthi";
+
+ QDir pluginDir(s, QString("*.so"), 0, QDir::Files);
+ if (debugMsg)
+ printf("searching for software synthesizer in <%s>\n", s.toLatin1().data());
+ if (pluginDir.exists()) {
+ QFileInfoList list = pluginDir.entryInfoList();
+ for (int i = 0; i < list.size(); ++i) {
+ QFileInfo fi = list.at(i);
+ synthis.push_back(new MessSynth(&fi));
+ }
+ if (debugMsg)
+ printf("%ld soft synth found\n", synthis.size());
+ }
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void SynthI::write(Xml& xml) const
+ {
+ xml.tag("SynthI");
+ AudioTrack::writeProperties(xml);
+ xml.strTag("class", synth()->name());
+
+ //---------------------------------------------
+ // if soft synth is attached to a midi port,
+ // write out port number
+ //---------------------------------------------
+
+ if (hasGui()) {
+ xml.intTag("guiVisible", guiVisible());
+ int x, y, w, h;
+ w = 0;
+ h = 0;
+ getGeometry(&x, &y, &w, &h);
+ if (h || w)
+ xml.qrectTag("geometry", QRect(x, y, w, h));
+ }
+
+ _sif->write(xml);
+ xml.etag("SynthI");
+ }
+
+void MessSynthIF::write(Xml& xml) const
+ {
+ //---------------------------------------------
+ // dump current state of synth
+ //---------------------------------------------
+
+ int len = 0;
+ const unsigned char* p;
+ _mess->getInitData(&len, &p);
+ if (len) {
+ xml.tag("midistate");
+ xml.tag("event type=\"%d\" datalen=\"%d\"", Sysex, len);
+ int col = 0;
+ xml.putLevel();
+ for (int i = 0; i < len; ++i, ++col) {
+ if (col >= 16) {
+ xml.put("");
+ col = 0;
+ xml.putLevel();
+ }
+ xml.nput("%02x ", p[i] & 0xff);
+ }
+ if (col)
+ xml.put("");
+ xml.etag("event");
+ xml.etag("midistate");
+ }
+ }
+
+//---------------------------------------------------------
+// SynthI::read
+//---------------------------------------------------------
+
+void SynthI::read(QDomNode node)
+ {
+ QString sclass;
+ int port = -1;
+ bool startGui = false;
+ QRect r;
+
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.tagName() == "class")
+ sclass = e.text();
+ else if (e.tagName() == "port")
+ port = e.text().toInt();
+ else if (e.tagName() == "guiVisible")
+ startGui = e.text().toInt();
+ else if (e.tagName() == "midistate")
+ readMidiState(node.firstChild());
+ else if (e.tagName() == "param") {
+ float val = e.text().toFloat();
+ initParams.push_back(val);
+ }
+ else if (e.tagName() == "geometry")
+ r = AL::readGeometry(node);
+ else if (AudioTrack::readProperties(node))
+ printf("MusE:SynthI: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ Synth* s = findSynth(sclass);
+ if (s == 0)
+ return;
+ if (initInstance(s))
+ return;
+ song->insertTrack0(this, -1);
+ showGui(startGui);
+ setGeometry(r.x(), r.y(), r.width(), r.height());
+ }
+
+//---------------------------------------------------------
+// getPatchName
+//---------------------------------------------------------
+
+QString MessSynthIF::getPatchName(int channel, int prog)
+ {
+ if (_mess)
+ return _mess->getPatchName(channel, prog, 0);
+ return "";
+ }
+
+//---------------------------------------------------------
+// populatePatchPopup
+//---------------------------------------------------------
+
+void MessSynthIF::populatePatchPopup(QMenu* menu, int ch)
+ {
+ menu->clear();
+ const MidiPatch* mp = _mess->getPatchInfo(ch, 0);
+ while (mp) {
+ int id = ((mp->hbank & 0xff) << 16)
+ + ((mp->lbank & 0xff) << 8) + mp->prog;
+ QAction* a = menu->addAction(QString(mp->name));
+ a->setData(id);
+ mp = _mess->getPatchInfo(ch, mp);
+ }
+ }
+
+//---------------------------------------------------------
+// getData
+//---------------------------------------------------------
+
+iMPEvent MessSynthIF::getData(MPEventList* el, iMPEvent i, unsigned pos, int ports, unsigned n, float** buffer)
+ {
+ // Reset buffers first
+ for (int port = 0; port < ports; ++port)
+ memset(buffer[port], 0, n * sizeof(float));
+
+ // seems to be negative when sequencer not running, still
+ // working when entering notes from editor though. weird :-) (ml)
+
+ int frameOffset = audio->getFrameOffset();
+ int curPos = pos;
+ int endPos = pos + n;
+
+ if (ports >= channels()) {
+ for (; i != el->end(); ++i) {
+ int frame = i->time() - frameOffset;
+ // printf("\t510: frame=%d endPos=%d curPos=%d pos=%d\n", frame, endPos, curPos, pos);
+ if (frame >= endPos)
+ break;
+ if (frame > curPos) { // Several following notes during same segmentsize?
+ _mess->process(buffer, curPos-pos, frame - curPos);
+ curPos = frame; // don't process this piece again
+ }
+ putEvent(*i);
+ }
+ if (endPos - curPos > 0) {
+ _mess->process(buffer, curPos-pos, endPos - curPos);
+ }
+ }
+ else {
+ printf("MessSynthIF::getData - ports < channels: TBW!"
+ "(when does this occur? does it ever occur? mono/stereo?)");
+ }
+ return i;
+ }
+
+//---------------------------------------------------------
+// putEvent
+// return true on error (busy)
+//---------------------------------------------------------
+
+bool MessSynthIF::putEvent(const MidiEvent& ev)
+ {
+ if (midiOutputTrace)
+ ev.dump();
+ if (_mess)
+ return _mess->processEvent(ev);
+ return true;
+ }
+
+//---------------------------------------------------------
+// collectInputData
+//---------------------------------------------------------
+
+void SynthI::collectInputData()
+ {
+ bufferEmpty = false;
+ while (!_eventFifo.isEmpty())
+ _playEvents.add(_eventFifo.get());
+ iMPEvent ie = _playEvents.begin();
+ unsigned pos = 0;
+ _sif->getData(&_playEvents, ie, pos, channels(), segmentSize, buffer);
+ _playEvents.clear();
+ }
+
+
diff --git a/muse/muse/synth.h b/muse/muse/synth.h
new file mode 100644
index 00000000..6ce90f95
--- /dev/null
+++ b/muse/muse/synth.h
@@ -0,0 +1,217 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __SYNTH_H__
+#define __SYNTH_H__
+
+#include "globals.h"
+#include "instruments/minstrument.h"
+#include "audiotrack.h"
+
+class Mess;
+struct MESS;
+
+class SynthI;
+class SynthIF;
+
+//---------------------------------------------------------
+// Synth
+// software synthesizer
+//---------------------------------------------------------
+
+class Synth {
+ protected:
+ QFileInfo info;
+ QString _name;
+ int _instances;
+
+ public:
+ Synth(const QFileInfo* fi, QString label);
+ virtual ~Synth() {}
+ virtual const char* description() const { return ""; }
+ virtual const char* version() const { return ""; }
+
+ int instances() const { return _instances; }
+ virtual void incInstances(int val) { _instances += val; }
+
+ QString name() const { return _name; }
+ QString path() const { return info.absolutePath(); }
+ virtual SynthIF* createSIF(SynthI*) = 0;
+ };
+
+//---------------------------------------------------------
+// MessSynth
+//---------------------------------------------------------
+
+class MessSynth : public Synth {
+ const MESS* descr;
+
+ public:
+ MessSynth(const QFileInfo* fi) : Synth(fi, fi->baseName()) { descr = 0; }
+ virtual ~MessSynth() {}
+ virtual const char* description() const;
+ virtual const char* version() const;
+ virtual void* instantiate(const QString&);
+ virtual SynthIF* createSIF(SynthI*);
+ };
+
+class Mess;
+
+//---------------------------------------------------------
+// SynthIF
+// synth instance interface
+//---------------------------------------------------------
+
+class SynthIF {
+
+ protected:
+ SynthI* synti;
+
+ public:
+ SynthIF(SynthI* s) { synti = s; }
+ virtual ~SynthIF() {}
+
+ virtual bool guiVisible() const = 0;
+ virtual void showGui(bool v) = 0;
+ virtual bool hasGui() const = 0;
+ virtual void getGeometry(int*, int*, int*, int*) const = 0;
+ virtual void setGeometry(int, int, int, int) = 0;
+ virtual iMPEvent getData(MPEventList*, iMPEvent, unsigned pos, int ports, unsigned n, float** buffer) = 0;
+ virtual bool putEvent(const MidiEvent& ev) = 0;
+ virtual MidiEvent receiveEvent() = 0;
+ virtual int eventsPending() const = 0;
+ virtual int channels() const = 0;
+ virtual void deactivate3() = 0;
+ virtual QString getPatchName(int, int) = 0;
+ virtual void populatePatchPopup(QMenu*, int) = 0;
+ virtual void write(Xml& xml) const = 0;
+ virtual void setParameter(int idx, float value) = 0;
+ virtual int getControllerInfo(int id, const char** name, int* ctrl, int* min, int* max) = 0;
+ virtual bool hasAuxSend() const { return true; }
+ };
+
+//---------------------------------------------------------
+// SynthI
+// software synthesizer instance
+// Track
+// MidiInstrument
+//---------------------------------------------------------
+
+class SynthI : public AudioTrack, public MidiInstrument
+ {
+ SynthIF* _sif;
+ MPEventList _playEvents;
+ MidiFifo _eventFifo;
+
+ protected:
+ Synth* synthesizer;
+ std::vector<float> initParams;
+
+ bool putMidiEvent(const MidiEvent& ev) {
+ return _sif->putEvent(ev);
+ }
+
+ virtual QString open() { return QString("OK");}
+ virtual void close() {}
+ virtual Track* newTrack() const { return 0; }
+ virtual void collectInputData();
+
+ public:
+ SynthI();
+ virtual ~SynthI();
+ SynthI* clone() const { return 0; }
+
+ SynthIF* sif() const { return _sif; }
+ bool initInstance(Synth* s);
+
+ void read(QDomNode);
+ virtual void write(Xml&) const;
+
+ Synth* synth() const { return synthesizer; }
+ virtual bool isSynti() const { return true; }
+
+ virtual QString getPatchName(int ch, int prog) {
+ return _sif->getPatchName(ch, prog);
+ }
+ virtual void populatePatchPopup(QMenu* m, int i) {
+ _sif->populatePatchPopup(m, i);
+ }
+
+ void setParameter(const char* name, const char* value) const;
+
+ bool guiVisible() const { return _sif->guiVisible(); }
+ void showGui(bool v) { _sif->showGui(v); }
+ bool hasGui() const { return _sif->hasGui(); }
+ void getGeometry(int* x, int* y, int* w, int* h) const {
+ _sif->getGeometry(x, y, w, h);
+ }
+ void setGeometry(int x, int y, int w, int h) {
+ _sif->setGeometry(x, y, w, h);
+ }
+ MidiEvent receiveEvent() { return _sif->receiveEvent(); }
+ int eventsPending() const { return _sif->eventsPending(); }
+ void deactivate2();
+ void deactivate3();
+ bool isActivated() const { return synthesizer && _sif; }
+ virtual bool hasAuxSend() const { return _sif->hasAuxSend(); }
+ MPEventList* playEvents() { return &_playEvents; }
+ MidiFifo* eventFifo() { return &_eventFifo; }
+ };
+
+//---------------------------------------------------------
+// MessSynthIF
+// mess synthesizer instance
+//---------------------------------------------------------
+
+class MessSynthIF : public SynthIF {
+ Mess* _mess;
+
+ public:
+ MessSynthIF(SynthI* s) : SynthIF(s) { _mess = 0; }
+ virtual ~MessSynthIF();
+
+ virtual bool guiVisible() const;
+ virtual void showGui(bool v);
+ virtual bool hasGui() const;
+ virtual void getGeometry(int*, int*, int*, int*) const;
+ virtual void setGeometry(int, int, int, int);
+ virtual iMPEvent getData(MPEventList*, iMPEvent, unsigned pos, int ports, unsigned n, float** buffer);
+ virtual bool putEvent(const MidiEvent& ev);
+ virtual MidiEvent receiveEvent();
+ virtual int eventsPending() const;
+ virtual int channels() const;
+ virtual void deactivate3();
+ virtual QString getPatchName(int, int);
+ virtual void populatePatchPopup(QMenu*, int);
+ virtual void write(Xml& xml) const;
+ virtual void setParameter(int, float) {}
+ virtual int getControllerInfo(int id, const char** name, int* ctrl, int* min, int* max);
+ bool init(Synth* s, SynthI* si);
+ };
+
+typedef tracklist<SynthI*>::iterator iSynthI;
+typedef tracklist<SynthI*>::const_iterator ciSynthI;
+typedef tracklist<SynthI*> SynthIList;
+
+extern std::vector<Synth*> synthis; // array of available synthis
+extern Synth* findSynth(const QString& sclass);
+
+#endif
+
diff --git a/muse/muse/thread.cpp b/muse/muse/thread.cpp
new file mode 100644
index 00000000..1acf2808
--- /dev/null
+++ b/muse/muse/thread.cpp
@@ -0,0 +1,349 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include <poll.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+
+#include "thread.h"
+#include "globals.h"
+#include "errno.h"
+
+//---------------------------------------------------------
+// Thread
+//---------------------------------------------------------
+
+Thread::~Thread()
+ {
+ }
+
+//---------------------------------------------------------
+// serverloop
+//---------------------------------------------------------
+
+static void* loop(void* mops)
+ {
+ Thread* t = (Thread*) mops;
+ t->loop();
+ return 0;
+ }
+
+//---------------------------------------------------------
+// start
+//---------------------------------------------------------
+
+void Thread::start(int prio, void* ptr)
+ {
+ userPtr = ptr;
+ pthread_attr_t* attributes = 0;
+
+ realTimePriority = prio;
+ if (realTimePriority) {
+ attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t));
+ pthread_attr_init(attributes);
+
+ if (pthread_attr_setschedpolicy(attributes, SCHED_FIFO)) {
+ printf("cannot set FIFO scheduling class for RT thread\n");
+ }
+ if (pthread_attr_setscope (attributes, PTHREAD_SCOPE_SYSTEM)) {
+ printf("Cannot set scheduling scope for RT thread\n");
+ }
+ if (pthread_attr_setinheritsched(attributes, PTHREAD_EXPLICIT_SCHED)) {
+ printf("Cannot set setinheritsched for RT thread\n");
+ }
+
+ struct sched_param rt_param;
+ memset(&rt_param, 0, sizeof(rt_param));
+ rt_param.sched_priority = realTimePriority;
+ if (pthread_attr_setschedparam (attributes, &rt_param)) {
+ printf("Cannot set scheduling priority %d for RT thread (%s)\n",
+ realTimePriority, strerror(errno));
+ }
+ }
+
+ int rv;
+ if (rv = pthread_create(&thread, attributes, ::loop, this)) {
+ fprintf(stderr, "creating thread <%s> failed: %s\n",
+ _name, strerror(rv));
+ thread = 0;
+ }
+ }
+
+//---------------------------------------------------------
+// stop
+//---------------------------------------------------------
+
+void Thread::stop(bool force)
+ {
+ if (thread == 0)
+ return;
+ if (force) {
+ pthread_cancel(thread);
+ threadStop();
+ }
+ _running = false;
+ if (pthread_join(thread, 0)) {
+ // perror("Failed to join sequencer thread");
+ }
+ }
+
+//---------------------------------------------------------
+// Thread
+// prio = 0 no realtime scheduling
+//---------------------------------------------------------
+
+Thread::Thread(const char* s)
+ {
+ userPtr = 0;
+ _name = s;
+ realTimePriority = 0;
+ pfd = 0;
+ npfd = 0;
+ maxpfd = 0;
+ _running = false;
+ _pollWait = -1;
+ thread = 0;
+ sendSerialNo = 0x00a5a500;
+
+ // create message channels
+ int filedes[2]; // 0 - reading 1 - writing
+ if (pipe(filedes) == -1) {
+ perror("thread:creating pipe4");
+ exit(-1);
+ }
+ toThreadFdr = filedes[0];
+ toThreadFdw = filedes[1];
+ if (fcntl(toThreadFdw, F_SETFL, O_NONBLOCK) == -1)
+ perror("set pipe nonblocking\n");
+
+ if (pipe(filedes) == -1) {
+ perror("thread: creating pipe5");
+ exit(-1);
+ }
+ fromThreadFdr = filedes[0];
+ fromThreadFdw = filedes[1];
+ if (fcntl(fromThreadFdw, F_SETFL, O_NONBLOCK) == -1)
+ perror("set pipe nonblocking\n");
+ }
+
+//---------------------------------------------------------
+// addPollFd
+//---------------------------------------------------------
+
+void Thread::addPollFd(int fd, int action, void (*handler)(void*,void*), void* p, void* q)
+ {
+ if (fd == -1)
+ return;
+ for (iPoll i = plist.begin(); i != plist.end(); ++i) {
+ if ((i->fd == fd) && (i->action == action))
+ return;
+ }
+
+ plist.push_back(Poll(fd, action, handler, p, q));
+
+ if (npfd == maxpfd) {
+ int n = (maxpfd == 0) ? 4 : maxpfd * 2;
+ //TODO: delete old pfd
+ pfd = new struct pollfd[n];
+ maxpfd = n;
+ }
+ ++npfd;
+ int idx = 0;
+ for (iPoll i = plist.begin(); i != plist.end(); ++i, ++idx) {
+ pfd[idx].fd = i->fd;
+ pfd[idx].events = i->action;
+ }
+ }
+
+//---------------------------------------------------------
+// removePollFd
+//---------------------------------------------------------
+
+void Thread::removePollFd(int fd, int action)
+ {
+ for (iPoll i = plist.begin(); i != plist.end(); ++i) {
+ if (i->fd == fd && i->action == action) {
+ plist.erase(i);
+ --npfd;
+ break;
+ }
+ }
+ int idx = 0;
+ for (iPoll i = plist.begin(); i != plist.end(); ++i, ++idx) {
+ pfd[idx].fd = i->fd;
+ pfd[idx].events = i->action;
+ }
+ }
+
+//---------------------------------------------------------
+// loop
+//---------------------------------------------------------
+
+void Thread::loop()
+ {
+ if (!debugMode) {
+ if (mlockall(MCL_CURRENT | MCL_FUTURE))
+ perror("WARNING: Cannot lock memory:");
+ }
+
+#define BIG_ENOUGH_STACK (1024*1024*1)
+ char buf[BIG_ENOUGH_STACK];
+ for (int i = 0; i < BIG_ENOUGH_STACK; i++)
+ buf[i] = i;
+#undef BIG_ENOUGH_STACK
+
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0);
+ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
+
+ int policy;
+ if ((policy = sched_getscheduler (0)) < 0) {
+ printf("Thread: Cannot get current client scheduler: %s\n", strerror(errno));
+ }
+
+ if (debugMsg)
+ printf("Thread <%s, id %p> has %s priority %d\n",
+ _name, pthread_self(), policy == SCHED_FIFO ? "SCHED_FIFO" : "SCHED_OTHER",
+ realTimePriority);
+
+ _running = true;
+
+ threadStart(userPtr);
+ while (_running) {
+ if (debugMode) // DEBUG
+ _pollWait = 10; // ms
+
+ int n = poll(pfd, npfd, _pollWait);
+ if (n < 0) {
+ if (errno == EINTR)
+ continue;
+ fprintf(stderr, "poll failed: %s\n", strerror(errno));
+ exit(-1);
+ }
+ if (n == 0) { // timeout
+ defaultTick();
+ continue;
+ }
+ struct pollfd* p = &pfd[0];
+ int i = 0;
+ for (iPoll ip = plist.begin(); ip != plist.end(); ++ip, ++p, ++i) {
+ if (ip->action & p->revents) {
+ (ip->handler)(ip->param1, ip->param2);
+ break;
+ }
+ }
+ }
+ threadStop();
+ }
+
+//---------------------------------------------------------
+// send
+// send request from gui to thread
+// wait until request is processed
+//---------------------------------------------------------
+
+extern const char* seqMsgList[];
+
+bool Thread::sendMsg(const ThreadMsg* m)
+ {
+// fprintf(stderr, "<%s> self: %p sendMsg %d id %s running %d\n",
+// _name,
+// pthread_self(), sendSerialNo, seqMsgList[m->id], _running);
+
+ m->serialNo = sendSerialNo;
+ if (_running) {
+ int rv = write(toThreadFdw, &m, sizeof(ThreadMsg*));
+ if (rv != sizeof(ThreadMsg*)) {
+ perror("Thread::sendMessage(): write pipe failed");
+ return true;
+ }
+
+ // wait for thread to finish operation
+ int c;
+ rv = read(fromThreadFdr, &c, sizeof(c));
+ if (rv != sizeof(c)) {
+ perror("Thread::sendMessage(): read pipe failed");
+ return true;
+ }
+ if (c != sendSerialNo)
+ fprintf(stderr, "%p Thread:sendMsg() serial No mismatch %d - %d\n",
+ this, c, sendSerialNo);
+ }
+ else {
+ // if thread is not running (during initialization)
+ // process commands directly:
+ processMsg(m);
+ }
+ ++sendSerialNo;
+ return false;
+ }
+
+//---------------------------------------------------------
+// send
+// send request from gui to thread
+// do __not__ wait until request is processed
+//---------------------------------------------------------
+
+bool Thread::sendMsg1(const void* m, int n)
+ {
+ int rv = write(toThreadFdw, m, n);
+ if (rv != n) {
+ perror("Thread::sendMessage1(): write pipe failed");
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// readMsg
+//---------------------------------------------------------
+
+void Thread::readMsg()
+ {
+ ThreadMsg* p;
+ if (read(toThreadFdr, &p, sizeof(p)) != sizeof(p)) {
+ perror("Thread::readMsg(): read pipe failed");
+ exit(-1);
+ }
+// fprintf(stderr, "%p read msg %d %s\n", this, p->serialNo, seqMsgList[p->id]);
+
+ processMsg(p);
+ int c = p->serialNo;
+ int rv = write(fromThreadFdw, &c, sizeof(c));
+ if (rv != sizeof(c))
+ perror("Thread::readMsg(): write pipe failed");
+ }
+
+//---------------------------------------------------------
+// readMsg
+// sequencer reads one gui message
+//---------------------------------------------------------
+
+void Thread::readMsg1(int size)
+ {
+ char buffer[size];
+ int n = read(toThreadFdr, buffer, size);
+ if (n != size) {
+ fprintf(stderr, "Thread::readMessage1(): read pipe failed, get %d, expected %d: %s\n",
+ n, size, strerror(errno));
+ exit(-1);
+ }
+ processMsg1(buffer);
+ }
+
diff --git a/muse/muse/thread.h b/muse/muse/thread.h
new file mode 100644
index 00000000..cf7fc40b
--- /dev/null
+++ b/muse/muse/thread.h
@@ -0,0 +1,109 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __THREAD_H__
+#define __THREAD_H__
+
+#include <pthread.h>
+
+//---------------------------------------------------------
+// Poll
+//---------------------------------------------------------
+
+struct Poll {
+ int fd;
+ int action;
+ void (*handler)(void*,void*);
+ void* param1;
+ void* param2;
+
+ Poll(int _fd, int _action, void(*_handler)(void*,void*), void* p, void* q) {
+ fd = _fd;
+ action = _action;
+ handler = _handler;
+ param1 = p;
+ param2 = q;
+ }
+ };
+
+typedef std::list<Poll> PollList;
+typedef std::list<Poll>::iterator iPoll;
+
+
+//---------------------------------------------------------
+// ThreadMsg
+//---------------------------------------------------------
+
+struct ThreadMsg {
+ int id;
+ mutable int serialNo; // debug
+ };
+
+//---------------------------------------------------------
+// Thread
+//---------------------------------------------------------
+
+class Thread {
+ const char* _name;
+ volatile bool _running;
+ int _pollWait; // poll timeout in msec (-1 = infinite)
+ int sendSerialNo; // debug
+
+ pthread_t thread;
+
+ int toThreadFdw; // message to thread (app write)
+
+ PollList plist;
+ void* userPtr;
+
+ protected:
+ int realTimePriority;
+ int fromThreadFdr; // message from thread (seq read)
+ int fromThreadFdw; // message from thread (app write)
+ int toThreadFdr; // message to thread (seq read)
+ struct pollfd* pfd; // poll file descriptors
+ int npfd;
+ int maxpfd;
+ virtual void processMsg(const ThreadMsg*) {}
+ virtual void processMsg1(const void *) {}
+ virtual void defaultTick() {}
+
+ public:
+ Thread(const char* name);
+ virtual ~Thread();
+ const char* name() const { return _name; }
+ virtual void start(int priority, void* ptr=0);
+ void stop(bool);
+ void clearPollFd() { plist.clear(); npfd = 0; }
+ void addPollFd(int fd, int action, void (*handler)(void*,void*), void*, void*);
+ void removePollFd(int fd, int action);
+ void loop();
+ void readMsg();
+ void readMsg1(int size);
+ bool sendMsg1(const void* m, int n);
+ bool sendMsg(const ThreadMsg* m);
+ bool isRunning() const { return _running; }
+ void setPollWait(int val) { _pollWait = val; }
+ virtual void threadStart(void*){ } // called from loop
+ virtual void threadStop() { } // called from loop before leaving
+ };
+
+#endif
+
diff --git a/muse/muse/ticksynth.cpp b/muse/muse/ticksynth.cpp
new file mode 100644
index 00000000..4c8d037f
--- /dev/null
+++ b/muse/muse/ticksynth.cpp
@@ -0,0 +1,181 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "audio.h"
+#include "ticksynth.h"
+#include "default_click.h"
+
+SynthI* metronome = 0;
+
+class MetronomeSynth;
+static MetronomeSynth* metronomeSynth;
+
+//---------------------------------------------------------
+// MetronomeSynth
+//---------------------------------------------------------
+
+class MetronomeSynth : public Synth {
+ public:
+ MetronomeSynth(const QFileInfo* fi) : Synth(fi, QString("Metronome")) {}
+ virtual ~MetronomeSynth() {}
+ virtual void incInstances(int) {}
+ virtual void* instantiate();
+ virtual SynthIF* createSIF(SynthI*);
+ };
+
+//---------------------------------------------------------
+// instantiate
+//---------------------------------------------------------
+
+void* MetronomeSynth::instantiate()
+ {
+ return 0;
+ }
+
+//---------------------------------------------------------
+// MetronomeSynthIF
+//---------------------------------------------------------
+
+class MetronomeSynthIF : public SynthIF
+ {
+ const float* data;
+ int pos;
+ int len;
+ void process(float** buffer, int offset, int n);
+
+ public:
+ MetronomeSynthIF(SynthI* s) : SynthIF(s) {
+ data = 0;
+ }
+ virtual bool guiVisible() const { return false; }
+ virtual void showGui(bool) {}
+ virtual bool hasGui() const { return false; }
+ virtual void getGeometry(int*, int*, int*, int*) const {}
+ virtual void setGeometry(int, int, int, int) {}
+ virtual iMPEvent getData(MPEventList*, iMPEvent, unsigned pos, int ports, unsigned n, float** buffer);
+ virtual bool putEvent(const MidiEvent& ev);
+ virtual MidiEvent receiveEvent() { return MidiEvent(); }
+ virtual int eventsPending() const { return 0; }
+ virtual int channels() const { return 1; }
+ virtual void deactivate2() {}
+ virtual void deactivate3() {}
+ virtual QString getPatchName(int, int, int) const { return ""; }
+ virtual QString getPatchName(int, int) { return ""; }
+ virtual void populatePatchPopup(QMenu*, int) {};
+ virtual void write(Xml&) const {}
+ virtual void setParameter(int, float) {}
+ virtual int getControllerInfo(int, const char**, int*, int*, int*) { return 0; }
+ virtual bool hasAuxSend() const { return false; }
+ };
+
+//---------------------------------------------------------
+// getData
+//---------------------------------------------------------
+
+iMPEvent MetronomeSynthIF::getData(MPEventList* el, iMPEvent i, unsigned pos, int/*ports*/, unsigned n, float** buffer)
+ {
+ int curPos = pos;
+ int endPos = pos + n;
+ int off = pos;
+ int frameOffset = audio->getFrameOffset();
+
+ for (; i != el->end(); ++i) {
+ unsigned frame = i->time() - frameOffset;
+ if (frame >= endPos)
+ break;
+ if (frame > curPos) {
+ if (frame < pos)
+ printf("should not happen: missed event %d\n", pos -frame);
+ else
+ process(buffer, curPos-pos, frame - curPos);
+ curPos = frame;
+ }
+ putEvent(*i);
+ }
+ if (endPos - curPos)
+ process(buffer, curPos - off, endPos - curPos);
+ return el->end();
+ }
+
+//---------------------------------------------------------
+// putEvent
+//---------------------------------------------------------
+
+bool MetronomeSynthIF::putEvent(const MidiEvent& ev)
+ {
+ if (ev.dataA() == 0) {
+ data = defaultClickEmphasis;
+ len = defaultClickEmphasisLength;
+ }
+ else {
+ data = defaultClick;
+ len = defaultClickLength;
+ }
+ pos = 0;
+ return false;
+ }
+
+//---------------------------------------------------------
+// createSIF
+//---------------------------------------------------------
+
+SynthIF* MetronomeSynth::createSIF(SynthI* s)
+ {
+ return new MetronomeSynthIF(s);
+ }
+
+//---------------------------------------------------------
+// process
+// synthesize n samples into buffer+offset
+//---------------------------------------------------------
+
+void MetronomeSynthIF::process(float** buffer, int offset, int n)
+ {
+ if (data == 0) {
+ memset(buffer[0], 0, n * sizeof(float));
+ return;
+ }
+ const float* s = data + pos;
+ float* d = *buffer + offset;
+ int l = std::min(n, len);
+ int i;
+ for (i = 0; i < l; ++i)
+ *d++ = *s++;
+ for (; i < n; ++i)
+ *d++ = 0.0f;
+ pos += l;
+ len -= l;
+ if (len <= 0)
+ data = 0;
+ }
+
+//---------------------------------------------------------
+// initMetronome
+//---------------------------------------------------------
+
+void initMetronome()
+ {
+ QFileInfo fi; // dummy
+ metronomeSynth = new MetronomeSynth(&fi);
+ metronome = new SynthI();
+ metronome->setName("metronome");
+ metronome->initInstance(metronomeSynth);
+ }
+
diff --git a/muse/muse/ticksynth.h b/muse/muse/ticksynth.h
new file mode 100644
index 00000000..d18a483d
--- /dev/null
+++ b/muse/muse/ticksynth.h
@@ -0,0 +1,29 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __TICKSYNTH_H__
+#define __TICKSYNTH_H__
+
+#include "synth.h"
+extern void initMetronome();
+extern SynthI* metronome;
+
+#endif
+
diff --git a/muse/muse/track.cpp b/muse/muse/track.cpp
new file mode 100644
index 00000000..0df6ef1b
--- /dev/null
+++ b/muse/muse/track.cpp
@@ -0,0 +1,971 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "track.h"
+#include "midiplugin.h"
+#include "song.h"
+#include "al/xml.h"
+#include "icons.h"
+#include "muse.h"
+#include "audio.h"
+#include "midi.h"
+#include "gconfig.h"
+#include "midictrl.h"
+#include "instruments/minstrument.h"
+#include "part.h"
+#include "gui.h"
+
+const char* Track::_cname[] = {
+ "Output", "Group", "Aux", "Wave", "Input",
+ "Synti", "Midi", "M-Out", "M-In", "M-Ch", "M-Synt"
+ };
+
+const char* Track::_clname[] = {
+ "Audio Output", "Audio Group", "Audio Aux", "Wave Track", "Audio Input",
+ "Synti", "Midi Track", "Midi Outport", "Midi Inport", "Midi Channel",
+ "Midi Synti"
+ };
+
+//---------------------------------------------------------
+// ArrangerTrack
+//---------------------------------------------------------
+
+ArrangerTrack::ArrangerTrack()
+ {
+ tw = 0;
+ ctrl = -1; // first ctrl in list
+ controller = 0;
+ h = defaultTrackHeight;
+ }
+
+//---------------------------------------------------------
+// ccolor
+// return track specific track background color
+//---------------------------------------------------------
+
+QColor Track::ccolor() const
+ {
+ return config.trackBg[_type];
+ }
+
+//---------------------------------------------------------
+// pixmap
+//---------------------------------------------------------
+
+QPixmap* Track::pixmap(TrackType t)
+ {
+ switch(t) {
+ case AUDIO_OUTPUT: return addtrack_audiooutputIcon;
+ case AUDIO_GROUP: return addtrack_audiogroupIcon;
+ case AUDIO_AUX: return addtrack_auxsendIcon;
+ case WAVE: return addtrack_wavetrackIcon;
+ case AUDIO_INPUT: return addtrack_audioinputIcon;
+ case AUDIO_SOFTSYNTH: return addtrack_audioinputIcon; // DEBUG
+ default:
+ case MIDI: return addtrack_addmiditrackIcon;
+ case MIDI_OUT: return addtrack_addmiditrackIcon;
+ case MIDI_IN: return addtrack_addmiditrackIcon;
+ case MIDI_CHANNEL: return addtrack_addmiditrackIcon;
+ }
+ }
+
+//---------------------------------------------------------
+// Track::init
+//---------------------------------------------------------
+
+void Track::init()
+ {
+ _tt = AL::TICKS;
+ _recordFlag = false;
+ _monitor = false;
+ _mute = false;
+ _solo = false;
+ _off = false;
+ _channels = 0; // 1 - mono, 2 - stereo
+ _selected = false;
+ _locked = false;
+ _autoRead = true;
+ _autoWrite = false;
+
+ for (int i = 0; i < MAX_CHANNELS; ++i) {
+ _meter[i] = 0.0f;
+ _peak[i] = 0.0f;
+ _peakTimer[i] = 0;
+ }
+ }
+
+//---------------------------------------------------------
+// Track
+//---------------------------------------------------------
+
+Track::Track(Track::TrackType t)
+ {
+ init();
+ _type = t;
+ _parts = new PartList;
+ }
+
+//---------------------------------------------------------
+// ~Track
+//---------------------------------------------------------
+
+Track::~Track()
+ {
+ delete _parts;
+ }
+
+//---------------------------------------------------------
+// setDefaultName
+// generate unique name for track
+//---------------------------------------------------------
+
+void Track::setDefaultName()
+ {
+ QString base;
+ switch(_type) {
+ case MIDI:
+ case WAVE:
+ base = QString("Track");
+ break;
+ case MIDI_OUT:
+ base = QString("MP");
+ break;
+ case MIDI_IN:
+ base = QString("M-In");
+ break;
+ case MIDI_SYNTI:
+ base = QString("M-Synth");
+ break;
+ case MIDI_CHANNEL:
+ {
+ MidiOutPort* mop = ((MidiChannel*)this)->port();
+ int no = ((MidiChannel*)this)->channelNo();
+ base.sprintf("%s:%d", mop->name().toLatin1().data(), no + 1);
+ setName(base);
+ return;
+ }
+ break;
+ case AUDIO_OUTPUT:
+ base = QString("AudioOut");
+ break;
+ case AUDIO_GROUP:
+ base = QString("Group");
+ break;
+ case AUDIO_AUX:
+ base = QString("Aux");
+ break;
+ case AUDIO_INPUT:
+ base = QString("AudioIn");
+ break;
+ case AUDIO_SOFTSYNTH:
+ // base = QString("Synth");
+ return;
+ break;
+ case TRACK_TYPES:
+ break;
+ };
+ base += " ";
+ for (int i = 1; true; ++i) {
+ QString n;
+ n.setNum(i);
+ QString s = base + n;
+ Track* track = song->findTrack(s);
+ if (track == 0) {
+ setName(s);
+ break;
+ }
+ }
+ if (_type == MIDI_OUT) {
+ MidiOutPort* mop = (MidiOutPort*) this;
+ for (int i = 0; i < MIDI_CHANNELS; ++i)
+ mop->channel(i)->setDefaultName();
+ }
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void Track::dump() const
+ {
+ printf("Track <%s>: typ %d, parts %ld sel %d\n",
+ _name.toLatin1().data(), _type, _parts->size(), _selected);
+ }
+
+//---------------------------------------------------------
+// addPart
+//---------------------------------------------------------
+
+void Track::addPart(Part* p)
+ {
+ p->setTrack(this);
+ _parts->add(p);
+ }
+
+//---------------------------------------------------------
+// findPart
+//---------------------------------------------------------
+
+Part* Track::findPart(unsigned tick)
+ {
+ for (iPart i = _parts->begin(); i != _parts->end(); ++i) {
+ Part* part = i->second;
+ if (tick >= part->tick() && tick < (part->tick()+part->lenTick()))
+ return part;
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// Track::writeProperties
+//---------------------------------------------------------
+
+void Track::writeProperties(Xml& xml) const
+ {
+ xml.strTag("name", _name);
+ if (!_comment.isEmpty())
+ xml.strTag("comment", _comment);
+ if (_recordFlag)
+ xml.intTag("record", _recordFlag);
+ xml.intTag("mute", mute());
+ if (solo())
+ xml.intTag("solo", solo());
+ if (off())
+ xml.intTag("off", off());
+ if (_channels)
+ xml.intTag("channels", _channels);
+ if (_locked)
+ xml.intTag("locked", _locked);
+ if (_monitor)
+ xml.intTag("monitor", _monitor);
+ if (!_autoRead)
+ xml.intTag("autoRead", _autoRead);
+ if (_autoWrite)
+ xml.intTag("autoWrite", _autoWrite);
+ if (_selected)
+ xml.intTag("selected", _selected);
+ for (ciCtrl icl = controller()->begin(); icl != controller()->end(); ++icl)
+ icl->second->write(xml);
+ if (arrangerTrack.tw)
+ xml.intTag("height", arrangerTrack.tw->height());
+ for (ciArrangerTrack i = subtracks.begin(); i != subtracks.end(); ++i) {
+ xml.tag("subtrack");
+ xml.intTag("height", (*i)->tw->height());
+ xml.intTag("ctrl", (*i)->ctrl);
+ xml.etag("subtrack");
+ }
+ }
+
+//---------------------------------------------------------
+// Track::readProperties
+//---------------------------------------------------------
+
+bool Track::readProperties(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ QString s(e.text());
+ int i = s.toInt();
+
+ if (tag == "name")
+ setName(s);
+ else if (tag == "comment")
+ _comment = s;
+ else if (tag == "record") {
+ bool recordFlag = i;
+ setRecordFlag(recordFlag);
+ }
+ else if (tag == "mute")
+ _mute = i;
+ else if (tag == "solo")
+ _solo = i;
+ else if (tag == "off")
+ _off = i;
+ else if (tag == "channels")
+ _channels = i;
+ else if (tag == "locked")
+ _locked = i;
+ else if (tag == "monitor")
+ _monitor = i;
+ else if (tag == "selected")
+ _selected = i;
+ else if (tag == "autoRead")
+ _autoRead = i;
+ else if (tag == "autoWrite")
+ _autoWrite = i;
+ else if (tag == "controller") {
+ Ctrl* l = new Ctrl();
+ l->read(node, false);
+
+ iCtrl icl = controller()->find(l->id());
+ if (icl == controller()->end())
+ controller()->add(l);
+ else { //???
+ Ctrl* d = icl->second;
+ for (iCtrlVal i = l->begin(); i != l->end(); ++i)
+ d->insert(std::pair<const unsigned, CVal> (i->first, i->second));
+ d->setCurVal(l->curVal());
+ d->setDefault(l->getDefault());
+ delete l;
+ }
+ }
+ else if (tag == "height")
+ arrangerTrack.h = i;
+ else if (tag == "subtrack") {
+ ArrangerTrack* st = new ArrangerTrack;
+ for (QDomNode n = node.firstChild(); !n.isNull(); n = n.nextSibling()) {
+ QDomElement e = n.toElement();
+ QString tag = e.tagName();
+ QString s = e.text();
+ int i = s.toInt();
+ if (tag == "height")
+ st->h = i;
+ else if (tag == "ctrl") {
+ st->ctrl = i;
+ }
+ else
+ printf("Track::subtrack: unknown tag <%s>\n", tag.toLatin1().data());
+ }
+ subtracks.push_back(st);
+ }
+ else
+ return true;
+ return false;
+ }
+
+//---------------------------------------------------------
+// addController
+//---------------------------------------------------------
+
+void Track::addController(Ctrl* list)
+ {
+ iCtrl i = controller()->find(list->id());
+ if (i != controller()->end()) {
+ // printf("%s(%s)::addController(%s): already there 0x%x\n",
+ // cname().toLatin1().data(), name().toLatin1().data(), list->name().toLatin1().data(), list->id());
+ // abort();
+ return;
+ }
+ controller()->add(list);
+ emit clChanged();
+ }
+
+//---------------------------------------------------------
+// addMidiController
+//---------------------------------------------------------
+
+void Track::addMidiController(MidiInstrument* mi, int ctrl)
+ {
+ iCtrl cl = _controller.find(ctrl);
+ if (cl != _controller.end())
+ return;
+
+ MidiController* mc = mi->midiController(ctrl);
+ Ctrl* pvl;
+ if (mc) {
+ pvl = new Ctrl(mc);
+ }
+ else {
+ printf("unknown midi controller %x\n", ctrl);
+ pvl = new Ctrl(ctrl, QString("unknown"));
+ pvl->setCurVal(CTRL_VAL_UNKNOWN);
+ pvl->setType(Ctrl::DISCRETE | Ctrl::INT);
+ }
+ addController(pvl);
+ }
+
+//---------------------------------------------------------
+// removeController
+//---------------------------------------------------------
+
+void Track::removeController(int id)
+ {
+ iCtrl i = controller()->find(id);
+ if (i == controller()->end()) {
+ printf("Track::removeController id 0x%x not found, listsize %zd\n",
+ id, controller()->size());
+ return;
+ }
+ controller()->erase(i);
+ emit clChanged();
+ }
+
+//---------------------------------------------------------
+// addControllerVal
+// return true if new controller value added
+//---------------------------------------------------------
+
+bool Track::addControllerVal(int id, unsigned time, CVal val)
+ {
+ iCtrl i = controller()->find(id);
+ if (i == controller()->end()) {
+ if ((id & 0xf0000) == CTRL_NRPN_OFFSET) {
+ int msb = id & 0xff00;
+ // int lsb = id & 0xff;
+ int nid = CTRL_NRPN_OFFSET + msb + 0xff;
+ i = controller()->find(nid);
+ if (i != controller()->end()) {
+ Ctrl* c = new Ctrl(*(i->second));
+ c->setId(id);
+ addController(c);
+// printf("add pitch ctrl %x\n", id);
+ return c->add(time, val);
+ }
+ }
+ printf("Track::addControllerVal(): id 0x%x not found, listsize %ld\n",
+ id, controller()->size());
+ return false;
+ }
+ return i->second->add(time, val);
+ }
+
+//---------------------------------------------------------
+// removeControllerVal
+//---------------------------------------------------------
+
+void Track::removeControllerVal(int id, unsigned time)
+ {
+ iCtrl i = controller()->find(id);
+ if (i == controller()->end()) {
+ printf("Track::removeControllerVal(): id 0x%x not found, listsize %ld\n",
+ id, controller()->size());
+ return;
+ }
+ i->second->del(time);
+ }
+
+//---------------------------------------------------------
+// getController
+//---------------------------------------------------------
+
+Ctrl* Track::getController(int id) const
+ {
+ ciCtrl i = controller()->find(id);
+ if (i == controller()->end()) {
+// printf("%s(%s)::getController(%d) size %d: not found\n",
+// cname().toLatin1().data(), name().toLatin1().data(), id, controller()->size());
+// const CtrlList* cl = controller();
+// for (ciCtrl i = cl->begin(); i != cl->end(); ++i)
+// printf(" Ctrl %d\n", i->first);
+ return 0;
+ }
+ return i->second;
+ }
+
+//---------------------------------------------------------
+// controllerNames
+//---------------------------------------------------------
+
+ControllerNameList* Track::controllerNames() const
+ {
+ ControllerNameList* l = new ControllerNameList;
+ for (ciCtrl i = controller()->begin(); i != controller()->end(); ++i)
+ l->push_back(ControllerName(i->second->name(), i->second->id()));
+ return l;
+ }
+
+//---------------------------------------------------------
+// setRecordFlag
+//---------------------------------------------------------
+
+void Track::setRecordFlag(bool f)
+ {
+ if (_recordFlag != f) {
+ _recordFlag = f;
+ emit recordChanged(_recordFlag);
+ }
+ }
+
+//---------------------------------------------------------
+// setMonitor
+//---------------------------------------------------------
+
+void Track::setMonitor(bool f)
+ {
+ if (_monitor != f) {
+ _monitor = f;
+ emit monitorChanged(_monitor);
+ }
+ }
+
+//---------------------------------------------------------
+// setSelected
+//---------------------------------------------------------
+
+void Track::setSelected(bool f)
+ {
+ if (f != _selected) {
+ _selected = f;
+ emit selectionChanged(_selected);
+ muse->selectionChanged();
+ }
+ }
+
+//---------------------------------------------------------
+// setController
+// called from GUI
+//---------------------------------------------------------
+
+#if 0
+void Track::setController(Pos pos, int id, int v)
+ {
+ CVal val;
+ val.i = v;
+ setController(pos, id, val);
+ }
+
+void Track::setController(Pos pos, int id, float v)
+ {
+ CVal val;
+ val.f = v;
+ setController(pos, id, val);
+ }
+
+void Track::setController(Pos pos, int id, CVal val)
+ {
+ Ctrl* c = getController(id);
+ if (c == 0) {
+ printf("no controller 0x%x %s\n", id, name().toLatin1().data());
+ return;
+ }
+ if (isMidiTrack()) {
+ int port = ((MidiTrack*)this)->outPort();
+ int channel = ((MidiTrack*)this)->outChannel();
+ MidiEvent ev(0, port, channel, ME_CONTROLLER, id, val.i);
+ audio->msgPlayMidiEvent(&ev);
+ }
+ else {
+ // non midi controller are current once set
+ c->setCurVal(val);
+ }
+ c->setSchedVal(val);
+ if (autoWrite()) {
+ unsigned time = _tt == AL::FRAMES ? pos.frame() : pos.tick();
+ if (audio->isPlaying())
+ _recEvents.push_back(CtrlRecVal(time, id, val));
+ else
+ song->addControllerVal(this, c, id, time, val);
+ }
+ emit controllerChanged(id);
+ }
+#endif
+
+//---------------------------------------------------------
+// startAutoRecord
+// slider/knob touched
+//---------------------------------------------------------
+
+void Track::startAutoRecord(int n)
+ {
+ Ctrl* ctrl = getController(n);
+ if (ctrl) {
+ ctrl->setTouched(true);
+ if (audio->isPlaying() && autoWrite())
+ _recEvents.push_back(CtrlRecVal(song->cPos().frame(), n, 1));
+ }
+ else
+ printf("no ctrl 0x%x\n", n);
+ }
+
+//---------------------------------------------------------
+// stopAutoRecord
+// slider/knob released
+//---------------------------------------------------------
+
+void Track::stopAutoRecord(int n)
+ {
+ Ctrl* ctrl = getController(n);
+ if (ctrl) {
+ ctrl->setTouched(false);
+ if (audio->isPlaying() && autoWrite())
+ _recEvents.push_back(CtrlRecVal(song->cPos().frame(), n, 2));
+ }
+ else
+ printf("no ctrl 0x%x\n", n);
+ }
+
+//---------------------------------------------------------
+// setName
+//---------------------------------------------------------
+
+void Track::setName(const QString& s)
+ {
+ _name = s;
+ emit nameChanged(_name);
+ }
+
+//---------------------------------------------------------
+// setAutoRead
+//---------------------------------------------------------
+
+void Track::setAutoRead(bool val)
+ {
+ if (_autoRead != val) {
+ _autoRead = val;
+ emit autoReadChanged(_autoRead);
+ }
+ }
+
+//---------------------------------------------------------
+// setAutoWrite
+//---------------------------------------------------------
+
+void Track::setAutoWrite(bool val)
+ {
+ if (_autoWrite != val) {
+ _autoWrite = val;
+ emit autoWriteChanged(_autoWrite);
+ }
+ }
+
+//---------------------------------------------------------
+// cpos
+//---------------------------------------------------------
+
+unsigned Track::cpos() const
+ {
+ return timeType() == AL::TICKS ? song->cPos().tick() : song->cPos().frame();
+ }
+
+//---------------------------------------------------------
+// updateController
+//---------------------------------------------------------
+
+void Track::updateController()
+ {
+ CtrlList* cl = controller();
+ for (iCtrl i = cl->begin(); i != cl->end(); ++i) {
+ Ctrl* c = i->second;
+ if (c->changed()) {
+ c->setChanged(false);
+ emit controllerChanged(c->id());
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// writeRouting
+//---------------------------------------------------------
+
+void Track::writeRouting(Xml& xml) const
+ {
+ if (type() == AUDIO_INPUT || type() == MIDI_IN) {
+ const RouteList* rl = &_inRoutes;
+ Route::RouteType rt = type() == AUDIO_INPUT ? Route::AUDIOPORT : Route::MIDIPORT;
+ for (ciRoute r = rl->begin(); r != rl->end(); ++r) {
+ Route dst(name(), r->channel, Route::TRACK);
+ xml.tag("Route");
+ xml.put("<srcNode type=\"%s\">%s</srcNode>",
+ Route::tname(rt), r->name().toLatin1().data());
+ xml.put("<dstNode type=\"TRACK\">%s</dstNode>", dst.name().toLatin1().data());
+ xml.etag("Route");
+ }
+ }
+ for (ciRoute r = _outRoutes.begin(); r != _outRoutes.end(); ++r) {
+ xml.tag("Route");
+ const char* tname = type() == AUDIO_SOFTSYNTH ? "SYNTIPORT" : "TRACK";
+ if (r->channel != -1)
+ xml.put("<srcNode type=\"%s\">%d:%s</srcNode>", tname, r->channel + 1, name().toLatin1().data());
+ else
+ xml.put("<srcNode type=\"%s\">%s</srcNode>", tname, name().toLatin1().data());
+
+ switch(r->type) {
+ case Route::AUDIOPORT:
+ xml.put("<dstNode type=\"AUDIOPORT\">%s</dstNode>", r->name().toLatin1().data());
+ break;
+ case Route::MIDIPORT:
+ xml.put("<dstNode type=\"MIDIPORT\">%s</dstNode>", r->name().toLatin1().data());
+ break;
+ case Route::SYNTIPORT:
+ xml.put("<dstNode type=\"SYNTIPORT\">%s</dstNode>", r->name().toLatin1().data());
+ break;
+ case Route::TRACK:
+ xml.put("<dstNode type=\"TRACK\">%s</dstNode>", r->name().toLatin1().data());
+ break;
+ }
+ xml.etag("Route");
+ }
+ }
+
+//---------------------------------------------------------
+// MidiTrackBase
+//---------------------------------------------------------
+
+MidiTrackBase::MidiTrackBase(TrackType t)
+ : Track(t)
+ {
+ _pipeline = new MidiPipeline();
+ }
+
+//---------------------------------------------------------
+// MidiTrackBase
+//---------------------------------------------------------
+
+MidiTrackBase::~MidiTrackBase()
+ {
+ delete _pipeline;
+ }
+
+//---------------------------------------------------------
+// MidiTrackBase::writeProperties
+//---------------------------------------------------------
+
+void MidiTrackBase::writeProperties(Xml& xml) const
+ {
+ Track::writeProperties(xml);
+ for (ciMidiPluginI ip = _pipeline->begin(); ip != _pipeline->end(); ++ip) {
+ if (*ip)
+ (*ip)->writeConfiguration(xml);
+ }
+ }
+
+//---------------------------------------------------------
+// MidiTrackBase::readProperties
+//---------------------------------------------------------
+
+bool MidiTrackBase::readProperties(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ QString tag(e.tagName());
+ if (tag == "midiPlugin") {
+ MidiPluginI* pi = new MidiPluginI(this);
+ if (pi->readConfiguration(node)) {
+ delete pi;
+ }
+ else {
+ // insert plugin into first free slot
+ // of plugin rack
+ addPlugin(pi, -1);
+ }
+ }
+ else {
+ bool rv = Track::readProperties(node);
+ return rv;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// plugin
+//---------------------------------------------------------
+
+MidiPluginI* MidiTrackBase::plugin(int idx) const
+ {
+ return (*_pipeline)[idx];
+ }
+
+
+//---------------------------------------------------------
+// addPlugin
+// idx = -1 insert into first free slot
+//---------------------------------------------------------
+
+void MidiTrackBase::addPlugin(MidiPluginI* plugin, int idx)
+ {
+ if (plugin == 0) {
+#if 0
+ MidiPluginI* oldPlugin = (*_pipeline)[idx];
+ if (oldPlugin) {
+ int controller = oldPlugin->plugin()->parameter();
+ for (int i = 0; i < controller; ++i) {
+ int id = (idx + 1) * 0x1000 + i;
+ removeController(id);
+ }
+ }
+#endif
+ }
+ if (idx == -1) {
+ idx = 0;
+ for (; idx < 4; ++idx) {
+ if ((*_pipeline)[idx] == 0)
+ break;
+ }
+ if (idx == 4) {
+ printf("internal error: too many plugins\n");
+ return;
+ }
+ }
+
+ _pipeline->insert(plugin, idx);
+ if (plugin) {
+#if 0
+ int ncontroller = plugin->plugin()->parameter();
+ for (int i = 0; i < ncontroller; ++i) {
+ int id = (idx + 1) * 0x1000 + i;
+ QString name(plugin->getParameterName(i));
+ float min, max;
+ plugin->range(i, &min, &max);
+ Ctrl* cl = getController(id);
+ if (cl == 0) {
+ cl = new Ctrl(id, name);
+ cl->setRange(min, max);
+ float defaultValue = plugin->defaultValue(i);
+ cl->setDefault(defaultValue);
+ cl->setCurVal(defaultValue);
+ addController(cl);
+ }
+ plugin->setParam(i, cl->schedVal().f);
+ plugin->setControllerList(cl);
+ }
+#endif
+ }
+ }
+
+
+//---------------------------------------------------------
+// hwCtrlState
+//---------------------------------------------------------
+
+int Track::hwCtrlState(int ctrl) const
+ {
+ ciCtrl cl = _controller.find(ctrl);
+ if (cl == _controller.end()) {
+ if (debugMsg)
+ printf("hwCtrlState: ctrl 0x%x not found\n", ctrl);
+ return CTRL_VAL_UNKNOWN;
+ }
+ Ctrl* vl = cl->second;
+ return vl->curVal().i;
+ }
+
+//---------------------------------------------------------
+// setHwCtrlState
+//---------------------------------------------------------
+
+void Track::setHwCtrlState(int ctrl, int val)
+ {
+ iCtrl cl = _controller.find(ctrl);
+ if (cl == _controller.end()) {
+ // try to add new controller
+ if (debugMsg)
+ printf("setHwCtrlState(0x%x,0x%x): not found\n", ctrl, val);
+ return;
+ }
+ Ctrl* vl = cl->second;
+// printf("setHwCtrlState ctrl %x val %x\n", ctrl, val);
+ vl->setChanged(true);
+ return vl->setCurVal(val);
+ }
+
+//---------------------------------------------------------
+// getCtrl
+//---------------------------------------------------------
+
+int Track::getCtrl(int tick, int ctrl) const
+ {
+ ciCtrl cl = _controller.find(ctrl);
+ if (cl == _controller.end()) {
+ if (debugMsg)
+ printf("getCtrl: controller %d(0x%x) not found %ld\n",
+ ctrl, ctrl, _controller.size());
+ return CTRL_VAL_UNKNOWN;
+ }
+ return cl->second->value(tick).i;
+ }
+
+//---------------------------------------------------------
+// setSolo
+//---------------------------------------------------------
+
+bool Track::setSolo(bool val)
+ {
+ if (_solo != val) {
+ _solo = val;
+ emit soloChanged(_solo);
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// setMute
+// return true if mute changed
+//---------------------------------------------------------
+
+bool Track::setMute(bool val)
+ {
+ if (_mute != val) {
+ _mute = val;
+ emit muteChanged(_mute);
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// setOff
+// return true if state changed
+//---------------------------------------------------------
+
+bool Track::setOff(bool val)
+ {
+ if (_off != val) {
+ _off = val;
+ emit offChanged(_off);
+ return true;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// setChannels
+//---------------------------------------------------------
+
+void Track::setChannels(int n)
+ {
+ _channels = n;
+ for (int i = 0; i < _channels; ++i) {
+ _meter[i] = 0.0f;
+ _peak[i] = 0.0f;
+ }
+ }
+
+//---------------------------------------------------------
+// resetMeter
+//---------------------------------------------------------
+
+void Track::resetMeter()
+ {
+ for (int i = 0; i < _channels; ++i)
+ _meter[i] = 0.0f;
+ }
+
+//---------------------------------------------------------
+// resetPeaks
+//---------------------------------------------------------
+
+void Track::resetPeaks()
+ {
+ for (int i = 0; i < _channels; ++i)
+ _peak[i] = 0;
+ }
+
+//---------------------------------------------------------
+// resetAllMeter
+//---------------------------------------------------------
+
+void Track::resetAllMeter()
+ {
+ TrackList* tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i)
+ (*i)->resetMeter();
+ }
+
+
diff --git a/muse/muse/track.h b/muse/muse/track.h
new file mode 100644
index 00000000..2bfef484
--- /dev/null
+++ b/muse/muse/track.h
@@ -0,0 +1,604 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __TRACK_H__
+#define __TRACK_H__
+
+#include "al/pos.h"
+#include "route.h"
+#include "ctrl.h"
+#include "globaldefs.h"
+#include "mpevent.h"
+#include "midififo.h"
+
+namespace AL {
+ class Xml;
+ enum TType;
+ };
+using AL::Xml;
+using AL::TType;
+
+typedef void* Port;
+
+class DrumMap;
+class MidiPipeline;
+class MidiEvent;
+class MPEventList;
+class SynthI;
+class MidiPlugin;
+class MidiPluginI;
+class MidiInstrument;
+class MidiChannel;
+class PartList;
+class Part;
+
+typedef struct snd_seq_event snd_seq_event_t;
+
+static const int EVENT_FIFO_SIZE = 128;
+
+//---------------------------------------------------------
+// ArrangerTrack
+//---------------------------------------------------------
+
+struct ArrangerTrack {
+ QWidget* tw; // tracklist widget
+ int ctrl;
+ int h; // tmp val used by readProperties()
+ Ctrl* controller;
+
+ ArrangerTrack();
+ };
+
+typedef std::list<ArrangerTrack*> ArrangerTrackList;
+typedef ArrangerTrackList::iterator iArrangerTrack;
+typedef ArrangerTrackList::const_iterator ciArrangerTrack;
+
+//---------------------------------------------------------
+// Track
+//---------------------------------------------------------
+
+class Track : public QObject {
+ Q_OBJECT
+
+ public:
+ enum TrackType {
+ AUDIO_OUTPUT,
+ AUDIO_GROUP,
+ AUDIO_AUX,
+ WAVE,
+ AUDIO_INPUT,
+ AUDIO_SOFTSYNTH,
+ MIDI,
+ MIDI_OUT,
+ MIDI_IN,
+ MIDI_CHANNEL,
+ MIDI_SYNTI,
+ TRACK_TYPES
+ };
+ enum {
+ M_AUDIO_OUTPUT = 1 << AUDIO_OUTPUT,
+ M_AUDIO_GROUP = 1 << AUDIO_GROUP,
+ M_AUDIO_AUX = 1 << AUDIO_AUX,
+ M_WAVE = 1 << WAVE,
+ M_AUDIO_INPUT = 1 << AUDIO_INPUT,
+ M_AUDIO_SOFTSYNTH = 1 << AUDIO_SOFTSYNTH,
+ M_MIDI = 1 << MIDI,
+ M_MIDI_OUT = 1 << MIDI_OUT,
+ M_MIDI_IN = 1 << MIDI_IN,
+ M_MIDI_CHANNEL = 1 << MIDI_CHANNEL,
+ M_MIDI_SYNTI = 1 << MIDI_SYNTI
+ };
+
+ private:
+ TrackType _type;
+ QString _comment;
+ PartList* _parts;
+
+ void init();
+
+ protected:
+ TType _tt; // time type
+ QString _name;
+ bool _recordFlag;
+ bool _mute;
+ bool _solo;
+ bool _off;
+ bool _monitor;
+ int _channels; // 1 - mono, 2 - stereo
+ CtrlRecList _recEvents; // recorded automation events
+ float _meter[MAX_CHANNELS];
+ float _peak[MAX_CHANNELS];
+ int _peakTimer[MAX_CHANNELS];
+ bool _locked; // true if parts are locked to frames
+ bool _selected;
+
+ RouteList _inRoutes, _outRoutes;
+ CtrlList _controller;
+
+ bool _autoRead, _autoWrite;
+
+ bool readProperties(QDomNode);
+ void writeProperties(Xml& xml) const;
+
+ virtual bool setMute(bool val);
+ virtual bool setOff(bool val);
+ virtual bool setSolo(bool val);
+
+ signals:
+ void recordChanged(bool);
+ void autoReadChanged(bool);
+ void autoWriteChanged(bool);
+ void clChanged();
+ void controllerChanged(int id);
+ void selectionChanged(bool);
+ void muteChanged(bool);
+ void soloChanged(bool);
+ void monitorChanged(bool);
+ void offChanged(bool);
+ void partsChanged();
+ void nameChanged(const QString&);
+ void routeChanged();
+
+ private slots:
+ void setAutoRead(bool);
+ void setAutoWrite(bool);
+
+ public:
+ Track(TrackType);
+ virtual ~Track();
+
+ static const char* _cname[];
+ static const char* _clname[];
+
+ QString comment() const { return _comment; }
+ void setComment(const QString& s) { _comment = s; }
+ TType timeType() const { return _tt; }
+ void setTimeType(TType t) { _tt = t; }
+
+ QString cname() const { return QString(_cname[_type]); }
+ QString clname() const { return QString(_clname[_type]); }
+
+ //
+ // called before and after use
+ // (undo/redo)
+ // connects/reconnects to the outside world
+ //
+ virtual void activate1() {}
+ virtual void activate2() {}
+ virtual void deactivate() {}
+
+ //----------------------------------------------------------
+ // controller handling
+ //----------------------------------------------------------
+
+ CtrlList* controller() { return &_controller; }
+ const CtrlList* controller() const { return &_controller; }
+
+ ControllerNameList* controllerNames() const;
+ void addController(Ctrl*);
+ void addMidiController(MidiInstrument*, int ctrl);
+ void removeController(int id);
+ Ctrl* getController(int id) const;
+
+ int hwCtrlState(int ctrl) const;
+ void setHwCtrlState(int ctrl, int val);
+
+ // current value:
+ CVal ctrlVal(int id) { return getController(id)->schedVal(); }
+
+ // editor interface:
+ bool addControllerVal(int id, unsigned pos, CVal);
+ void removeControllerVal(int id, unsigned pos);
+ int getCtrl(int tick, int ctrl) const;
+
+ // signal interface:
+ virtual void emitControllerChanged(int id) { emit controllerChanged(id); }
+ void updateController();
+
+ // automation
+ void startAutoRecord(int);
+ void stopAutoRecord(int);
+ CtrlRecList* recEvents() { return &_recEvents; }
+ //----------------------------------------------------------
+
+ QColor ccolor() const;
+ QPixmap* pixmap() const { return pixmap(_type); }
+ static QPixmap* pixmap(TrackType);
+
+ bool selected() const { return _selected; }
+ void setSelected(bool f);
+
+ bool locked() const { return _locked; }
+ void setLocked(bool b) { _locked = b; }
+
+ const QString name() const { return _name; }
+ virtual void setName(const QString& s);
+
+ TrackType type() const { return _type; }
+ void setType(TrackType t) { _type = t; }
+
+ PartList* parts() { return _parts; }
+ const PartList* cparts() const { return _parts; }
+ Part* findPart(unsigned tick);
+ void addPart(Part* p);
+
+ virtual void write(Xml&) const = 0;
+ virtual Track* newTrack() const = 0;
+
+ void setRecordFlag(bool);
+ virtual Part* newPart(Part*p=0, bool clone = false) = 0;
+ void dump() const;
+ virtual void splitPart(Part*, int, Part*&, Part*&);
+
+ void setMonitor(bool val);
+ virtual bool isMute() const = 0;
+
+ bool monitor() const { return _monitor; }
+ bool solo() const { return _solo; }
+ bool mute() const { return _mute; }
+ bool off() const { return _off; }
+ bool recordFlag() const { return _recordFlag; }
+
+ void resetMeter();
+ void resetPeaks();
+ static void resetAllMeter();
+ float meter(int ch) const { return _meter[ch]; }
+ void addMidiMeter(int velo) {
+ _meter[0] += velo/5;
+ if (_meter[0] > 127.0f)
+ _meter[0] = 127.0f;
+ }
+ float peak(int ch) const { return _peak[ch]; }
+ void setPeak(int ch, float v) { _peak[ch] = v; }
+ void resetPeak(int ch) {
+ _peak[ch] = 0;
+ _peakTimer[ch] = 0;
+ }
+ int peakTimer(int ch) const { return _peakTimer[ch]; }
+ void setPeakTimer(int ch, int v) { _peakTimer[ch] = v; }
+ void setMeter(int ch, float v) {
+ _meter[ch] = v;
+ if (v > _peak[ch]) {
+ _peak[ch] = v;
+ _peakTimer[ch] = 0;
+ }
+ }
+
+ void setDefaultName();
+ int channels() const { return _channels; }
+ virtual void setChannels(int n);
+ bool isMidiTrack() const {
+ return type() == MIDI
+ || type() == MIDI_IN
+ || type() == MIDI_OUT
+ || type() == MIDI_CHANNEL
+ || type() == MIDI_SYNTI;
+ }
+ virtual bool canRecord() const { return false; }
+
+ bool autoRead() const { return _autoRead; }
+ bool autoWrite() const { return _autoWrite; }
+
+ void partListChanged() { emit partsChanged(); }
+ void updateMute() { emit muteChanged(isMute()); }
+ unsigned cpos() const;
+
+ // routing
+ RouteList* inRoutes() { return &_inRoutes; }
+ RouteList* outRoutes() { return &_outRoutes; }
+ bool noInRoute() const { return _inRoutes.empty(); }
+ bool noOutRoute() const { return _outRoutes.empty(); }
+ void writeRouting(Xml&) const;
+
+ struct ArrangerTrack arrangerTrack;
+ ArrangerTrackList subtracks;
+
+ friend class Song;
+ };
+
+//---------------------------------------------------------
+// MidiTrackBase
+//---------------------------------------------------------
+
+class MidiTrackBase : public Track {
+ Q_OBJECT
+
+ MidiPipeline* _pipeline;
+
+ public:
+ MidiTrackBase(TrackType t);
+ virtual ~MidiTrackBase();
+
+ bool readProperties(QDomNode);
+ void writeProperties(Xml&) const;
+
+ MidiPipeline* pipeline() { return _pipeline; }
+ void addPlugin(MidiPluginI* plugin, int idx);
+ MidiPluginI* plugin(int idx) const;
+
+ virtual void getEvents(unsigned /*from*/, unsigned /*to*/, int /*channel*/, MPEventList* /*dst*/) {}
+ };
+
+//---------------------------------------------------------
+// MidiInPort
+//---------------------------------------------------------
+
+class MidiInPort : public MidiTrackBase {
+ Q_OBJECT
+
+ Port alsaPort;
+ MPEventList _recordEvents;
+
+ public:
+ MidiInPort();
+ ~MidiInPort();
+
+ virtual void activate1();
+ virtual void deactivate();
+ virtual void setName(const QString& s);
+ virtual void write(Xml&) const;
+ virtual void read(QDomNode);
+ virtual Track* newTrack() const { return new MidiInPort(); }
+ virtual bool isMute() const { return _mute; }
+ virtual Part* newPart(Part*, bool) { return 0; }
+ Port port() const { return alsaPort; }
+
+ void eventReceived(snd_seq_event_t*);
+ virtual void getEvents(unsigned from, unsigned to, int channel, MPEventList* dst);
+ void afterProcess();
+ };
+
+//---------------------------------------------------------
+// MidiChannel
+//---------------------------------------------------------
+
+class MidiOutPort;
+
+class MidiChannel : public MidiTrackBase {
+ Q_OBJECT
+
+ DrumMap* _drumMap;
+ bool _useDrumMap;
+ MidiOutPort* _port;
+ int _channelNo;
+
+ void clearDevice();
+
+ signals:
+ void useDrumMapChanged(bool);
+
+ public:
+ MidiChannel(MidiOutPort*, int);
+ ~MidiChannel();
+
+ MidiOutPort* port() const { return _port; }
+ int channelNo() const { return _channelNo; }
+
+ virtual void write(Xml&) const;
+ virtual void read(QDomNode);
+ virtual Track* newTrack() const { return 0; }
+ virtual bool isMute() const;
+ virtual Part* newPart(Part*, bool) { return 0; }
+
+ bool guiVisible() const;
+ bool hasGui() const;
+
+ // void putEvent(const MidiEvent&);
+ void playMidiEvent(MidiEvent* ev);
+
+ bool useDrumMap() const { return _useDrumMap; }
+ void setUseDrumMap(bool val);
+ DrumMap* drumMap() const { return _drumMap; }
+
+ virtual void emitControllerChanged(int id);
+ };
+
+//---------------------------------------------------------
+// MidiOutPort
+//---------------------------------------------------------
+
+class MidiOutPort : public MidiTrackBase {
+ Q_OBJECT
+
+ MidiInstrument* _instrument;
+ MidiChannel* _channel[MIDI_CHANNELS];
+ Port alsaPort;
+
+ bool _sendSync; // this port sends mtc mmc events
+
+ MPEventList _playEvents; // scheduled events to play
+ iMPEvent _nextPlayEvent;
+
+ // fifo for midi events send from gui
+ // direct to midi port:
+
+ MidiFifo eventFifo;
+
+ signals:
+ void instrumentChanged();
+ void sendSyncChanged(bool);
+
+ public:
+ MidiOutPort();
+ ~MidiOutPort();
+
+ virtual void activate1();
+ virtual void deactivate();
+
+ MidiChannel* channel(int n) { return _channel[n]; }
+
+ virtual void setName(const QString& s);
+ virtual void write(Xml&) const;
+ virtual void read(QDomNode);
+ virtual Track* newTrack() const { return new MidiOutPort(); }
+ virtual bool isMute() const { return _mute; }
+ virtual Part* newPart(Part*, bool) { return 0; }
+
+ MidiInstrument* instrument() const { return _instrument; }
+ void setInstrument(MidiInstrument* i);
+
+ bool guiVisible() const;
+ bool hasGui() const;
+
+ Port port() const { return alsaPort; }
+ void putEvent(const MidiEvent&);
+
+ MPEventList* playEvents() { return &_playEvents; }
+ iMPEvent nextPlayEvent() { return _nextPlayEvent; }
+
+ void process(unsigned from, unsigned to, const AL::Pos&, unsigned frames);
+
+ void setNextPlayEvent(iMPEvent i) { _nextPlayEvent = i; }
+ void playFifo();
+ void playMidiEvent(MidiEvent*);
+
+ void sendSysex(const unsigned char*, int);
+ void sendSongpos(int);
+ void sendGmOn();
+ void sendGsOn();
+ void sendXgOn();
+ void sendStart();
+ void sendStop();
+ void sendContinue();
+ void sendClock();
+
+ void playEventList();
+
+ bool sendSync() const { return _sendSync; }
+ void setSendSync(bool val);
+ };
+
+//---------------------------------------------------------
+// TrackList
+//---------------------------------------------------------
+
+template<class T> class tracklist : public std::vector<Track*> {
+ typedef std::vector<Track*> vlist;
+
+ public:
+ class iterator : public vlist::iterator {
+ public:
+ iterator() : vlist::iterator() {}
+ iterator(vlist::iterator i) : vlist::iterator(i) {}
+
+ T operator*() {
+ return (T)(**((vlist::iterator*)this));
+ }
+ iterator operator++(int) {
+ return iterator ((*(vlist::iterator*)this).operator++(0));
+ }
+ iterator& operator++() {
+ return (iterator&) ((*(vlist::iterator*)this).operator++());
+ }
+ };
+
+ class const_iterator : public vlist::const_iterator {
+ public:
+ const_iterator() : vlist::const_iterator() {}
+ const_iterator(vlist::const_iterator i) : vlist::const_iterator(i) {}
+ const_iterator(vlist::iterator i) : vlist::const_iterator(i) {}
+
+ const T operator*() const {
+ return (T)(**((vlist::const_iterator*)this));
+ }
+ };
+
+ class reverse_iterator : public vlist::reverse_iterator {
+ public:
+ reverse_iterator() : vlist::reverse_iterator() {}
+ reverse_iterator(vlist::reverse_iterator i) : vlist::reverse_iterator(i) {}
+
+ T operator*() {
+ return (T)(**((vlist::reverse_iterator*)this));
+ }
+ };
+
+ tracklist() : vlist() {}
+ virtual ~tracklist() {}
+
+ void push_back(T v) { vlist::push_back(v); }
+ iterator begin() { return vlist::begin(); }
+ iterator end() { return vlist::end(); }
+ const_iterator begin() const { return vlist::begin(); }
+ const_iterator end() const { return vlist::end(); }
+ reverse_iterator rbegin() { return vlist::rbegin(); }
+ reverse_iterator rend() { return vlist::rend(); }
+ T& back() const { return (T&)(vlist::back()); }
+ T& front() const { return (T&)(vlist::front()); }
+ iterator find(const Track* t) {
+ return std::find(begin(), end(), t);
+ }
+ const_iterator find(const Track* t) const {
+ return std::find(begin(), end(), t);
+ }
+ unsigned index(const Track* t) const {
+ unsigned n = 0;
+ for (vlist::const_iterator i = begin(); i != end(); ++i, ++n) {
+ if (*i == t)
+ return n;
+ }
+ return -1;
+ }
+ T index(int k) const { return (T)((*this)[k]); }
+
+ iterator index2iterator(int k) {
+ if ((unsigned)k >= size())
+ return end();
+ return begin() + k;
+ }
+ void erase(Track* t) { vlist::erase(find(t)); }
+
+ void clearDelete() {
+ for (vlist::iterator i = begin(); i != end(); ++i)
+ delete *i;
+ vlist::clear();
+ }
+ void erase(vlist::iterator i) { vlist::erase(i); }
+ void replace(Track* ot, Track* nt) {
+ for (vlist::iterator i = begin(); i != end(); ++i) {
+ if (*i == ot) {
+ *i = nt;
+ return;
+ }
+ }
+ }
+ };
+
+typedef tracklist<Track*> TrackList;
+typedef TrackList::iterator iTrack;
+typedef TrackList::reverse_iterator irTrack;
+typedef TrackList::const_iterator ciTrack;
+
+typedef tracklist<MidiInPort*>::iterator iMidiInPort;
+typedef tracklist<MidiInPort*>::const_iterator ciMidiInPort;
+typedef tracklist<MidiInPort*> MidiInPortList;
+
+typedef tracklist<MidiOutPort*>::iterator iMidiOutPort;
+typedef tracklist<MidiOutPort*>::const_iterator ciMidiOutPort;
+typedef tracklist<MidiOutPort*> MidiOutPortList;
+
+typedef tracklist<MidiChannel*>::iterator iMidiChannel;
+typedef tracklist<MidiChannel*>::const_iterator ciMidiChannel;
+typedef tracklist<MidiChannel*> MidiChannelList;
+
+extern QMenu* midiPortsPopup(QWidget*);
+
+#endif
+
diff --git a/muse/muse/transport.cpp b/muse/muse/transport.cpp
new file mode 100644
index 00000000..c2c421f9
--- /dev/null
+++ b/muse/muse/transport.cpp
@@ -0,0 +1,411 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "transport.h"
+#include "widgets/doublelabel.h"
+#include "widgets/siglabel.h"
+#include "globals.h"
+#include "icons.h"
+#include "awl/posedit.h"
+#include "sync.h"
+#include "shortcuts.h"
+#include "gconfig.h"
+#include "muse.h"
+#include "al/sig.h"
+#include "al/tempo.h"
+
+static const char* recordTransportText = QT_TR_NOOP("Click this button to enable recording");
+static const char* stopTransportText = QT_TR_NOOP("Click this button to stop playback");
+static const char* playTransportText = QT_TR_NOOP("Click this button to start playback");
+static const char* startTransportText = QT_TR_NOOP("Click this button to rewind to start position");
+static const char* frewindTransportText = QT_TR_NOOP("Click this button to rewind");
+static const char* fforwardTransportText = QT_TR_NOOP("Click this button to forward current play position");
+
+//---------------------------------------------------------
+// Transport
+//---------------------------------------------------------
+
+Transport::Transport()
+ {
+ setupUi(this);
+
+ connect(recMode, SIGNAL(activated(int)), SLOT(setRecMode(int)));
+ connect(cycleMode, SIGNAL(activated(int)), SLOT(setCycleMode(int)));
+
+ //-----------------------------------------------------
+ // loop flags
+ //-----------------------------------------------------
+
+ connect(punchinButton, SIGNAL(toggled(bool)), song, SLOT(setPunchin(bool)));
+ connect(punchoutButton, SIGNAL(toggled(bool)), song, SLOT(setPunchout(bool)));
+ connect(loopButton, SIGNAL(toggled(bool)), song, SLOT(setLoop(bool)));
+
+ connect(song, SIGNAL(punchinChanged(bool)), punchinButton, SLOT(setChecked(bool)));
+ connect(song, SIGNAL(punchoutChanged(bool)), punchoutButton, SLOT(setChecked(bool)));
+ connect(song, SIGNAL(loopChanged(bool)), loopButton, SLOT(setChecked(bool)));
+
+ //-----------------------------------------------------
+ // Transport Buttons
+ //-----------------------------------------------------
+
+ time2->setSmpte(true);
+
+ buttons[0] = tb1;
+ tb1->setWhatsThis(tr(startTransportText));
+
+ buttons[1] = tb2;
+ tb2->setAutoRepeat(true);
+ tb2->setWhatsThis(tr(frewindTransportText));
+
+ buttons[2] = tb3;
+ tb3->setAutoRepeat(true);
+ tb3->setWhatsThis(tr(fforwardTransportText));
+
+ buttons[3] = tb4;
+ tb4->setChecked(true); // set STOP
+ tb4->setWhatsThis(tr(stopTransportText));
+
+ buttons[4] = tb5;
+ tb5->setWhatsThis(tr(playTransportText));
+
+ buttons[5] = tb6;
+ tb6->setIcon(QIcon(*record_on_Icon));
+ tb6->setWhatsThis(tr(recordTransportText));
+
+ connect(buttons[0], SIGNAL(clicked()), song, SLOT(rewindStart()));
+ connect(buttons[1], SIGNAL(clicked()), song, SLOT(rewind()));
+ connect(buttons[2], SIGNAL(clicked()), song, SLOT(forward()));
+ connect(buttons[3], SIGNAL(clicked(bool)), SLOT(stopToggled(bool)));
+ connect(buttons[4], SIGNAL(clicked(bool)), SLOT(playToggled(bool)));
+ connect(buttons[5], SIGNAL(clicked(bool)), song, SLOT(setRecord(bool)));
+
+ connect(song, SIGNAL(recordChanged(bool)), SLOT(setRecord(bool)));
+
+ //-----------------------------------------------------
+ // AQ - Click - Sync
+ //-----------------------------------------------------
+
+ clickButton->setShortcut(shortcuts[SHRT_TOGGLE_METRO].key);
+
+ connect(quantizeButton, SIGNAL(clicked(bool)), song, SLOT(setQuantize(bool)));
+ connect(clickButton, SIGNAL(clicked(bool)), song, SLOT(setClick(bool)));
+ connect(syncButton, SIGNAL(clicked(bool)), SLOT(syncButtonClicked(bool)));
+//TD connect(&extSyncFlag, SIGNAL(valueChanged(bool)), SLOT(syncChanged(bool)));
+
+ connect(song, SIGNAL(quantizeChanged(bool)), this, SLOT(setQuantizeFlag(bool)));
+ connect(song, SIGNAL(clickChanged(bool)), clickButton, SLOT(setChecked(bool)));
+
+ //-----------------------------------------------------
+ // Tempo/Sig
+ //-----------------------------------------------------
+
+ connect(masterButton, SIGNAL(clicked(bool)), song, SLOT(setMasterFlag(bool)));
+
+ //-----------------------------------------------------
+
+ connect(tl1, SIGNAL(valueChanged(const Pos&)), SLOT(lposChanged(const Pos&)));
+ connect(tl2, SIGNAL(valueChanged(const Pos&)), SLOT(rposChanged(const Pos&)));
+ connect(time1, SIGNAL(valueChanged(const Pos&)), SLOT(cposChanged(const Pos&)));
+ connect(time2, SIGNAL(valueChanged(const Pos&)), SLOT(cposChanged(const Pos&)));
+
+ slider->setRange(0, song->len());
+ connect(song, SIGNAL(lenChanged(const AL::Pos&)), SLOT(setLen(const AL::Pos&)));
+ connect(slider,SIGNAL(sliderMoved(int)), SLOT(cposChanged(int)));
+ connect(song, SIGNAL(posChanged(int,const AL::Pos&, bool)), SLOT(setPos(int,const AL::Pos&)));
+ connect(tempo, SIGNAL(tempoChanged(int)), song, SLOT(setTempo(int)));
+ connect(song, SIGNAL(playChanged(bool)), SLOT(setPlay(bool)));
+ connect(song, SIGNAL(songChanged(int)), this, SLOT(songChanged(int)));
+ setValues();
+ }
+
+//---------------------------------------------------------
+// setValues
+//---------------------------------------------------------
+
+void Transport::setValues()
+ {
+ punchinButton->setChecked(song->punchin());
+ loopButton->setChecked(song->loop());
+ punchoutButton->setChecked(song->punchout());
+ quantizeButton->setChecked(song->quantize());
+ clickButton->setChecked(song->click());
+ syncButton->setChecked(extSyncFlag);
+ setPos(0, song->cpos());
+ setPos(1, song->lpos());
+ setPos(2, song->rpos());
+ }
+
+//---------------------------------------------------------
+// setLen
+// song len changed
+//---------------------------------------------------------
+
+void Transport::setLen(const AL::Pos& len)
+ {
+ slider->setRange(0, len.tick());
+ }
+
+//---------------------------------------------------------
+// setTimesig
+//---------------------------------------------------------
+
+void Transport::setTimesig(int z, int n)
+ {
+//TD tempo->setTimesig(z, n);
+ }
+
+//---------------------------------------------------------
+// setPos
+//---------------------------------------------------------
+
+void Transport::setPos(int idx, const AL::Pos& pos)
+ {
+ switch (idx) {
+ case 0:
+ time1->setValue(pos);
+ time2->setValue(pos);
+ slider->setValue(pos.tick());
+ {
+ int tp = AL::tempomap.tempo(pos.tick());
+ AL::TimeSignature sig = AL::sigmap.timesig(pos.tick());
+ int z = sig.z;
+ int n = sig.n;
+ setTimesig(z, n);
+ tempo->setTempo(tp);
+ }
+ break;
+ case 1:
+ tl1->setValue(pos);
+ break;
+ case 2:
+ tl2->setValue(pos);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// cposChanged
+//---------------------------------------------------------
+
+void Transport::cposChanged(int tick)
+ {
+ song->setPos(0, tick);
+ }
+
+//---------------------------------------------------------
+// cposChanged
+//---------------------------------------------------------
+
+void Transport::cposChanged(const Pos& pos)
+ {
+ song->setPos(0, pos.tick());
+ }
+
+//---------------------------------------------------------
+// lposChanged
+//---------------------------------------------------------
+
+void Transport::lposChanged(const Pos& pos)
+ {
+ song->setPos(1, pos.tick());
+ }
+
+//---------------------------------------------------------
+// rposChanged
+//---------------------------------------------------------
+
+void Transport::rposChanged(const Pos& pos)
+ {
+ song->setPos(2, pos.tick());
+ }
+
+//---------------------------------------------------------
+// setPlay
+//---------------------------------------------------------
+
+void Transport::setPlay(bool f)
+ {
+ buttons[3]->setChecked(!f);
+ buttons[4]->setChecked(f);
+ }
+
+//---------------------------------------------------------
+// setMasterFlag
+//---------------------------------------------------------
+
+void Transport::setMasterFlag(bool f)
+ {
+ masterButton->setChecked(f);
+ }
+
+//---------------------------------------------------------
+// setQuantizeFlag
+//---------------------------------------------------------
+
+void Transport::setQuantizeFlag(bool f)
+ {
+ quantizeButton->setChecked(f);
+ }
+
+//---------------------------------------------------------
+// setSyncFlag
+//---------------------------------------------------------
+
+void Transport::setSyncFlag(bool f)
+ {
+ syncButton->setChecked(f);
+ }
+
+//---------------------------------------------------------
+// toggleRecMode
+//---------------------------------------------------------
+
+void Transport::setRecMode(int id)
+ {
+ song->setRecMode(id);
+ }
+
+//---------------------------------------------------------
+// toggleCycleMode
+//---------------------------------------------------------
+
+void Transport::setCycleMode(int id)
+ {
+ song->setCycleMode(id);
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void Transport::songChanged(int flags)
+ {
+ int cpos = song->cpos();
+ if (flags & (SC_MASTER | SC_TEMPO)) {
+ if (extSyncFlag) {
+ tempo->setTempo(0);
+ }
+ else {
+ int t = AL::tempomap.tempo(cpos);
+ tempo->setTempo(t);
+ }
+ }
+ if (flags & SC_SIG) {
+ AL::TimeSignature sig = AL::sigmap.timesig(cpos);
+ int z = sig.z;
+ int n = sig.n;
+ setTimesig(z, n);
+ }
+ if (flags & SC_MASTER)
+ masterButton->setChecked(song->masterFlag());
+ }
+
+//---------------------------------------------------------
+// syncChanged
+//---------------------------------------------------------
+
+void Transport::syncChanged(bool flag)
+ {
+ syncButton->setChecked(flag);
+ buttons[0]->setEnabled(!flag); // goto start
+ buttons[1]->setEnabled(!flag); // rewind
+ buttons[2]->setEnabled(!flag); // forward
+ buttons[3]->setEnabled(!flag); // stop
+ buttons[4]->setEnabled(!flag); // play
+ slider->setEnabled(!flag);
+ masterButton->setEnabled(!flag);
+ if (flag) {
+ masterButton->setChecked(false);
+ song->setMasterFlag(false);
+ tempo->setValue(0); // slave mode: show "extern"
+ }
+ else
+ tempo->setValue(AL::tempomap.tempo(song->cpos()));
+ muse->playAction->setEnabled(!flag);
+ muse->startAction->setEnabled(!flag);
+ muse->stopAction->setEnabled(!flag);
+ muse->rewindAction->setEnabled(!flag);
+ muse->forwardAction->setEnabled(!flag);
+ }
+
+//---------------------------------------------------------
+// stopToggled
+//---------------------------------------------------------
+
+void Transport::stopToggled(bool val)
+ {
+ if (val)
+ song->setStop(true);
+ else {
+ buttons[3]->setChecked(true);
+ }
+ }
+
+//---------------------------------------------------------
+// playToggled
+//---------------------------------------------------------
+
+void Transport::playToggled(bool val)
+ {
+ if (val)
+ song->setPlay(true);
+ else {
+ buttons[4]->setChecked(true);
+ }
+ }
+
+//---------------------------------------------------------
+// setRecord
+//---------------------------------------------------------
+
+void Transport::setRecord(bool flag)
+ {
+ buttons[5]->setChecked(flag);
+ }
+
+//---------------------------------------------------------
+// syncButtonClicked
+//---------------------------------------------------------
+
+void Transport::syncButtonClicked(bool flag)
+ {
+ extSyncFlag = flag;
+ }
+
+//---------------------------------------------------------
+// syncChanged
+//---------------------------------------------------------
+
+void Transport::syncChanged()
+ {
+ syncButton->setChecked(extSyncFlag);
+ }
+
+//---------------------------------------------------------
+// closeEvent
+//---------------------------------------------------------
+
+void Transport::closeEvent(QCloseEvent *ev)
+ {
+ emit closed();
+ QWidget::closeEvent(ev);
+ }
+
diff --git a/muse/muse/transport.h b/muse/muse/transport.h
new file mode 100644
index 00000000..43acef24
--- /dev/null
+++ b/muse/muse/transport.h
@@ -0,0 +1,74 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __TRANSPORT_H__
+#define __TRANSPORT_H__
+
+#include "ui_transport.h"
+
+namespace AL {
+ class Pos;
+ };
+using AL::Pos;
+
+//---------------------------------------------------------
+// Transport
+//---------------------------------------------------------
+
+class Transport : public QWidget, public Ui::TransportBase
+ {
+ QToolButton* buttons[6]; // transport buttons
+ Q_OBJECT
+
+ virtual void closeEvent(QCloseEvent*);
+
+ private slots:
+ void cposChanged(const Pos&);
+ void cposChanged(int);
+ void lposChanged(const Pos&);
+ void rposChanged(const Pos&);
+ void setRecMode(int);
+ void setCycleMode(int);
+ void songChanged(int);
+ void syncChanged(bool);
+ void setRecord(bool flag);
+ void stopToggled(bool);
+ void playToggled(bool);
+ void setLen(const AL::Pos& len);
+
+ public slots:
+ void setTimesig(int a, int b);
+ void setPos(int idx, const AL::Pos& pos);
+ void setMasterFlag(bool);
+ void setQuantizeFlag(bool);
+ void setSyncFlag(bool);
+ void setPlay(bool f);
+ void syncButtonClicked(bool);
+ void syncChanged();
+
+ signals:
+ void closed();
+
+ public:
+ Transport();
+ void setValues();
+ };
+#endif
+
diff --git a/muse/muse/transport.ui b/muse/muse/transport.ui
new file mode 100644
index 00000000..d6aecaa0
--- /dev/null
+++ b/muse/muse/transport.ui
@@ -0,0 +1,856 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>TransportBase</class>
+ <widget class="QWidget" name="TransportBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>763</width>
+ <height>108</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Transport Panel</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>1</number>
+ </property>
+ <property name="spacing" >
+ <number>1</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>3</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="recMode" >
+ <item>
+ <property name="text" >
+ <string>Overdub</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Replace</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>6</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Rec Mode</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="cycleMode" >
+ <item>
+ <property name="text" >
+ <string>Normal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Mix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Replace</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2" >
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>6</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Cycle Rec</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>2</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="punchinButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/punchin.xpm</iconset>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="loopButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/loop.xpm</iconset>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="punchoutButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/punchout.xpm</iconset>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="toolButtonStyle" >
+ <enum>Qt::ToolButtonTextOnly</enum>
+ </property>
+ <property name="arrowType" >
+ <enum>Qt::NoArrow</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>2</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="Awl::PosEdit" name="tl1" />
+ </item>
+ <item>
+ <widget class="QLabel" name="label_3" >
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>6</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Left Loc</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::PosEdit" name="tl2" />
+ </item>
+ <item>
+ <widget class="QLabel" name="label_4" >
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>6</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Right Loc</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>3</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="Awl::PosEdit" name="time1" />
+ </item>
+ <item>
+ <widget class="Awl::PosEdit" name="time2" />
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QSlider" name="slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>3</number>
+ </property>
+ <property name="spacing" >
+ <number>1</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="tb1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>rewind to start</string>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/start.xpm</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tb2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>rewind</string>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/frewind.xpm</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tb3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>forward</string>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/fforward.xpm</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tb4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>stop</string>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/stop.xpm</iconset>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tb5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>play</string>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../muse.qrc" >:/xpm/play.xpm</iconset>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tb6" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>record</string>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>2</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="quantizeButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>AC</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="clickButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Click</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="syncButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Sync</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>5</number>
+ </property>
+ <property name="spacing" >
+ <number>1</number>
+ </property>
+ <item>
+ <widget class="QFrame" name="frame" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>1</number>
+ </property>
+ <property name="spacing" >
+ <number>1</number>
+ </property>
+ <item>
+ <widget class="Awl::TempoEdit" name="tempo" />
+ </item>
+ <item>
+ <widget class="SigLabel" name="sig" >
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="text" >
+ <string>4/4</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="masterButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>use tempo map</string>
+ </property>
+ <property name="text" >
+ <string>Tempomap</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>SigLabel</class>
+ <extends>QLabel</extends>
+ <header>widgets/siglabel.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Awl::TempoEdit</class>
+ <extends></extends>
+ <header>awl/tempoedit.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Awl::PosEdit</class>
+ <extends></extends>
+ <header>awl/posedit.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <resources>
+ <include location="../muse.qrc" />
+ </resources>
+ <connections/>
+</ui>
diff --git a/muse/muse/transpose.cpp b/muse/muse/transpose.cpp
new file mode 100644
index 00000000..73edb05a
--- /dev/null
+++ b/muse/muse/transpose.cpp
@@ -0,0 +1,92 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "transpose.h"
+#include "track.h"
+#include "song.h"
+#include "event.h"
+#include "audio.h"
+#include "part.h"
+
+//---------------------------------------------------------
+// Transpose
+//---------------------------------------------------------
+
+Transpose::Transpose(QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ if (song->lpos() != song->rpos()) {
+ time_selected->setChecked(true);
+ }
+ else {
+// time_all->setChecked(true);
+ ButtonGroup1->setEnabled(false);
+ }
+// parts_all->setSelected(true);
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void Transpose::accept()
+ {
+ int left = 0, right = 0;
+ int dv = delta->value();
+
+ TrackList *tracks = song->tracks();
+
+ if (time_selected->isChecked()) {
+ left = song->lpos();
+ right = song->rpos();
+ }
+ else {
+ left = 0;
+ right = song->len();
+ }
+
+ song->startUndo();
+ for (iTrack t = tracks->begin(); t != tracks->end(); ++t) {
+ if (((*t)->type() != Track::MIDI)
+ || !(parts_all->isChecked() || (*t)->selected()))
+ continue;
+
+ PartList *pl = (*t)->parts();
+ for (iPart p = pl->begin(); p != pl->end(); ++p) {
+ Part *mp = p->second;
+ EventList* el = mp->events();
+ for (iEvent i = el->begin(); i != el->end(); ++i) {
+ Event oe = i->second;
+ int tick = oe.tick();
+ if (tick > right)
+ break;
+ if (tick < left)
+ continue;
+ Event ne = oe.clone();
+ ne.setA(oe.dataA() + dv );
+ audio->msgChangeEvent(oe, ne, mp, false);
+ }
+ }
+ }
+ song->endUndo(SC_EVENT_MODIFIED);
+ close();
+ }
+
diff --git a/muse/muse/transpose.h b/muse/muse/transpose.h
new file mode 100644
index 00000000..31b73865
--- /dev/null
+++ b/muse/muse/transpose.h
@@ -0,0 +1,40 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __TRANSPOSE_H__
+#define __TRANSPOSE_H__
+
+#include "ui_transpose.h"
+
+//---------------------------------------------------------
+// transpose widget
+//---------------------------------------------------------
+
+class Transpose : public QDialog, public Ui::TransposeDialogBase {
+ Q_OBJECT
+
+ private slots:
+ virtual void accept();
+
+ public:
+ Transpose(QWidget* parent=0);
+ };
+
+#endif
diff --git a/muse/muse/transpose.ui b/muse/muse/transpose.ui
new file mode 100644
index 00000000..de0bfe2e
--- /dev/null
+++ b/muse/muse/transpose.ui
@@ -0,0 +1,193 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>TransposeDialogBase</class>
+ <widget class="QDialog" name="TransposeDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>289</width>
+ <height>317</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Transpose</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="GroupBox1" >
+ <property name="title" >
+ <string>Value</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSpinBox" name="delta" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimum" >
+ <number>-99</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>halftones</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="ButtonGroup1" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="time_all" >
+ <property name="text" >
+ <string>all</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="time_selected" >
+ <property name="text" >
+ <string>between markers</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="ButtonGroup2" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="parts_all" >
+ <property name="text" >
+ <string>all</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="parts_selected" >
+ <property name="windowTitle" >
+ <string/>
+ </property>
+ <property name="text" >
+ <string>all in selected tracks</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>false</bool>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/undo.cpp b/muse/muse/undo.cpp
new file mode 100644
index 00000000..ef402492
--- /dev/null
+++ b/muse/muse/undo.cpp
@@ -0,0 +1,550 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "undo.h"
+#include "song.h"
+#include "globals.h"
+#include "al/tempo.h"
+#include "al/sig.h"
+#include "al/sig.h"
+#include "part.h"
+
+// iundo points to last Undo() in Undo-list
+
+static bool undoMode = false; // for debugging
+
+std::list<QString> temporaryWavFiles;
+//---------------------------------------------------------
+// typeName
+//---------------------------------------------------------
+
+const char* UndoOp::typeName()
+ {
+ static const char* name[] = {
+ "AddTrack", "DeleteTrack",
+ "AddPart", "DeletePart", "ModifyPart",
+ "AddEvent", "DeleteEvent", "ModifyEvent",
+ "AddTempo", "DeleteTempo",
+ "AddSig", "DeleteSig",
+ "SwapTrack",
+ "AddCtrl", "RemoveCtrl", "ModifyCtrl"
+ };
+ return name[type];
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void UndoOp::dump()
+ {
+ printf("UndoOp: %s\n ", typeName());
+ switch(type) {
+ case AddTrack:
+ case DeleteTrack:
+ printf("%d %s\n", id, track->name().toLatin1().data());
+ break;
+ case AddPart:
+ case DeletePart:
+ case ModifyPart:
+ break;
+ case AddEvent:
+ case DeleteEvent:
+ printf("old event:\n");
+ oEvent.dump(5);
+ printf(" new event:\n");
+ nEvent.dump(5);
+ printf(" Part:\n");
+ if (part)
+ part->dump(5);
+ break;
+ case ModifyEvent:
+ case AddTempo:
+ case DeleteTempo:
+ case AddSig:
+ case DeleteSig:
+ case SwapTrack:
+ case AddCtrl:
+ case RemoveCtrl:
+ case ModifyCtrl:
+ case RenameTrack:
+ case ModifyClip:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// startUndo
+//---------------------------------------------------------
+
+void Song::startUndo()
+ {
+ undoList->push_back(Undo());
+ updateFlags = 0;
+ undoMode = true;
+ }
+
+//---------------------------------------------------------
+// endUndo
+//---------------------------------------------------------
+
+void Song::endUndo(int flags)
+ {
+ updateFlags |= flags;
+ endMsgCmd();
+ undoMode = false;
+ }
+
+//---------------------------------------------------------
+// doUndo2
+// real time part
+//---------------------------------------------------------
+
+void Song::doUndo2()
+ {
+ Undo& u = undoList->back();
+
+//printf("doUndo2\n");
+ for (riUndoOp i = u.rbegin(); i != u.rend(); ++i) {
+//printf(" doUndo2 %s\n", i->typeName());
+ switch(i->type) {
+ case UndoOp::AddTrack:
+ removeTrack2(i->track);
+ updateFlags |= SC_TRACK_REMOVED;
+ break;
+ case UndoOp::DeleteTrack:
+ insertTrack2(i->track);
+ updateFlags |= SC_TRACK_INSERTED;
+ break;
+ case UndoOp::SwapTrack:
+ {
+ updateFlags |= SC_TRACK_MODIFIED;
+ Track* track = _tracks[i->a];
+ _tracks[i->a] = _tracks[i->b];
+ _tracks[i->b] = track;
+ updateFlags |= SC_TRACK_MODIFIED;
+ }
+ break;
+ case UndoOp::RenameTrack:
+ i->track->setName(*(i->os));
+ break;
+ case UndoOp::AddPart:
+ {
+ Part* part = i->oPart;
+ part->track()->parts()->remove(part);
+ updateFlags |= SC_PART_REMOVED;
+ i->oPart->events()->incARef(-1);
+ }
+ break;
+ case UndoOp::DeletePart:
+ i->oPart->track()->addPart(i->oPart);
+ updateFlags |= SC_PART_INSERTED;
+ i->oPart->events()->incARef(1);
+ break;
+ case UndoOp::ModifyPart:
+ changePart(i->oPart, i->nPart);
+ i->oPart->events()->incARef(-1);
+ i->nPart->events()->incARef(1);
+ updateFlags |= SC_PART_MODIFIED;
+ break;
+ case UndoOp::AddEvent:
+ deleteEvent(i->nEvent, i->part);
+ updateFlags |= SC_EVENT_REMOVED;
+ break;
+ case UndoOp::DeleteEvent:
+ addEvent(i->nEvent, i->part);
+ updateFlags |= SC_EVENT_INSERTED;
+ break;
+ case UndoOp::ModifyEvent:
+ updateFlags |= SC_EVENT_MODIFIED;
+ changeEvent(i->oEvent, i->nEvent, i->part);
+ break;
+ case UndoOp::AddTempo:
+ AL::tempomap.delTempo(i->a);
+ updateFlags |= SC_TEMPO;
+ break;
+ case UndoOp::DeleteTempo:
+ AL::tempomap.addTempo(i->a, i->b);
+ updateFlags |= SC_TEMPO;
+ break;
+ case UndoOp::AddSig:
+ AL::sigmap.del(i->a);
+ updateFlags |= SC_SIG;
+ break;
+ case UndoOp::DeleteSig:
+ AL::sigmap.add(i->a, AL::TimeSignature(i->b, i->c));
+ updateFlags |= SC_SIG;
+ break;
+ case UndoOp::AddCtrl:
+ i->track->removeControllerVal(i->id, i->time);
+ break;
+ case UndoOp::RemoveCtrl:
+ i->track->addControllerVal(i->id, i->time, i->cval1);
+ break;
+ case UndoOp::ModifyCtrl:
+ i->track->addControllerVal(i->id, i->time, i->cval2);
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// Song::doRedo2
+//---------------------------------------------------------
+
+void Song::doRedo2()
+ {
+ Undo& u = redoList->back();
+//printf("doRedo2\n");
+ for (iUndoOp i = u.begin(); i != u.end(); ++i) {
+//printf(" doUndo2 %s\n", i->typeName());
+ switch(i->type) {
+ case UndoOp::AddTrack:
+ insertTrack2(i->track);
+ updateFlags |= SC_TRACK_INSERTED;
+ break;
+ case UndoOp::DeleteTrack:
+ removeTrack2(i->track);
+ updateFlags |= SC_TRACK_REMOVED;
+ break;
+ case UndoOp::SwapTrack:
+ {
+ Track* track = _tracks[i->a];
+ _tracks[i->a] = _tracks[i->b];
+ _tracks[i->b] = track;
+ updateFlags |= SC_TRACK_MODIFIED;
+ }
+ break;
+ case UndoOp::RenameTrack:
+ i->track->setName(*(i->ns));
+ break;
+ case UndoOp::AddPart:
+ i->oPart->track()->addPart(i->oPart);
+ updateFlags |= SC_PART_INSERTED;
+ i->oPart->events()->incARef(1);
+ break;
+ case UndoOp::DeletePart:
+ {
+ Part* part = i->oPart;
+ part->track()->parts()->remove(part);
+ updateFlags |= SC_PART_REMOVED;
+ i->oPart->events()->incARef(-1);
+ }
+ break;
+ case UndoOp::ModifyPart:
+ changePart(i->nPart, i->oPart);
+ updateFlags |= SC_PART_MODIFIED;
+ i->oPart->events()->incARef(1);
+ i->nPart->events()->incARef(-1);
+ break;
+ case UndoOp::AddEvent:
+ addEvent(i->nEvent, i->part);
+ updateFlags |= SC_EVENT_INSERTED;
+ break;
+ case UndoOp::DeleteEvent:
+ deleteEvent(i->nEvent, i->part);
+ updateFlags |= SC_EVENT_REMOVED;
+ break;
+ case UndoOp::ModifyEvent:
+ changeEvent(i->nEvent, i->oEvent, i->part);
+ updateFlags |= SC_EVENT_MODIFIED;
+ break;
+ case UndoOp::AddTempo:
+ AL::tempomap.addTempo(i->a, i->b);
+ updateFlags |= SC_TEMPO;
+ break;
+ case UndoOp::DeleteTempo:
+ AL::tempomap.delTempo(i->a);
+ updateFlags |= SC_TEMPO;
+ break;
+ case UndoOp::AddSig:
+ AL::sigmap.add(i->a, AL::TimeSignature(i->b, i->c));
+ updateFlags |= SC_SIG;
+ break;
+ case UndoOp::DeleteSig:
+ //printf("doRedo: UndoOp::DeleteSig. Deleting sigmap at: %d, z=%d n=%d\n", i->a, i->b, i->c);
+ AL::sigmap.del(i->a);
+ updateFlags |= SC_SIG;
+ break;
+ case UndoOp::AddCtrl:
+ i->track->addControllerVal(i->id, i->time, i->cval1);
+ break;
+ case UndoOp::RemoveCtrl:
+ i->track->removeControllerVal(i->id, i->time);
+ break;
+ case UndoOp::ModifyCtrl:
+ i->track->addControllerVal(i->id, i->time, i->cval1);
+ break;
+ }
+ }
+ }
+
+void Song::undoOp(UndoOp::UndoType type, int a, int b, int c)
+ {
+ UndoOp i;
+ i.type = type;
+ i.a = a;
+ i.b = b;
+ i.c = c;
+ addUndo(i);
+ }
+
+void Song::undoOp(UndoOp::UndoType type, int n, Track* track)
+ {
+ UndoOp i;
+ i.type = type;
+ i.id = n;
+ i.track = track;
+ if (type == UndoOp::AddTrack)
+ updateFlags |= SC_TRACK_INSERTED;
+ addUndo(i);
+ }
+
+void Song::undoOp(UndoOp::UndoType type, Part* part)
+ {
+ UndoOp i;
+ i.type = type;
+ i.oPart = part;
+ addUndo(i);
+ }
+
+void Song::undoOp(UndoOp::UndoType type, Event& oev, Event& nev, Part* part)
+ {
+ UndoOp i;
+ i.type = type;
+ i.nEvent = nev;
+ i.oEvent = oev;
+ i.part = part;
+ addUndo(i);
+ }
+
+void Song::undoOp(UndoOp::UndoType type, Part* oPart, Part* nPart)
+ {
+ UndoOp i;
+ i.type = type;
+ i.oPart = nPart;
+ i.nPart = oPart;
+ addUndo(i);
+ }
+
+void Song::undoOp(UndoOp::UndoType type, int c, int ctrl, int ov, int nv)
+ {
+ UndoOp i;
+ i.type = type;
+ i.channel = c;
+ i.ctrl = ctrl;
+ i.oVal = ov;
+ i.nVal = nv;
+ addUndo(i);
+ }
+
+void Song::undoOp(UndoOp::UndoType type, SigEvent* oevent, SigEvent* nevent)
+ {
+ UndoOp i;
+ i.type = type;
+ i.oSignature = oevent;
+ i.nSignature = nevent;
+ addUndo(i);
+ }
+
+void Song::undoOp(UndoOp::UndoType type, Track* t, int id, unsigned time, CVal nval, CVal oval)
+ {
+ UndoOp i;
+ i.type = type;
+ i.track = t;
+ i.id = id;
+ i.time = time;
+ i.cval1 = nval;
+ i.cval2 = oval;
+ addUndo(i);
+ }
+
+void Song::undoOp(UndoOp::UndoType type, Track* t, const QString& s1, const QString& s2)
+ {
+ UndoOp i;
+ i.type = type;
+ i.track = t;
+ i.os = new QString(s1);
+ i.ns = new QString(s2);
+ addUndo(i);
+ }
+
+void Song::undoOp(UndoOp::UndoType type, const char* changedFile, const char* changeData, int startframe, int endframe)
+ {
+ UndoOp i;
+ i.type = type;
+ i.filename = changedFile;
+ i.tmpwavfile = changeData;
+ i.startframe = startframe;
+ i.endframe = endframe;
+ addUndo(i);
+ temporaryWavFiles.push_back(QString(changeData));
+
+ printf("Adding ModifyClip undo-operation: origfile=%s tmpfile=%s sf=%d ef=%d\n", changedFile, changeData, startframe, endframe);
+ }
+
+//---------------------------------------------------------
+// addUndo
+//---------------------------------------------------------
+
+void Song::addUndo(UndoOp& i)
+ {
+ if (!undoMode) {
+ printf("internal error: undoOp without startUndo()\n");
+ return;
+ }
+ undoList->back().push_back(i);
+ dirty = true;
+ }
+
+//---------------------------------------------------------
+// doUndo1
+// non realtime context
+// return true if nothing to do
+//---------------------------------------------------------
+
+bool Song::doUndo1()
+ {
+ if (undoList->empty())
+ return true;
+ Undo& u = undoList->back();
+ for (riUndoOp i = u.rbegin(); i != u.rend(); ++i) {
+ switch(i->type) {
+ case UndoOp::AddTrack:
+ removeTrack1(i->track);
+ break;
+ case UndoOp::DeleteTrack:
+ insertTrack1(i->track, i->id);
+ break;
+ case UndoOp::ModifyClip:
+ SndFile::applyUndoFile(i->filename, i->tmpwavfile, i->startframe, i->endframe);
+ break;
+ default:
+ break;
+ }
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// doUndo3
+// non realtime context after realtime operation
+//---------------------------------------------------------
+
+void Song::doUndo3()
+ {
+ Undo& u = undoList->back();
+ for (riUndoOp i = u.rbegin(); i != u.rend(); ++i) {
+ switch(i->type) {
+ case UndoOp::AddTrack:
+ removeTrack3(i->track);
+ break;
+ case UndoOp::DeleteTrack:
+ emit trackAdded(i->track, i->id);
+ break;
+ case UndoOp::ModifyPart:
+ if (i->oPart->track() != i->nPart->track())
+ i->nPart->track()->partListChanged();
+ case UndoOp::AddPart:
+ case UndoOp::DeletePart:
+ i->oPart->track()->partListChanged();
+ break;
+ case UndoOp::AddCtrl:
+ case UndoOp::RemoveCtrl:
+ case UndoOp::ModifyCtrl:
+ i->track->emitControllerChanged(i->id);
+ break;
+ default:
+ break;
+ }
+ }
+ redoList->push_back(u); // put item on redo list
+ undoList->pop_back();
+ dirty = true;
+ }
+
+//---------------------------------------------------------
+// doRedo1
+// non realtime context
+// return true if nothing to do
+//---------------------------------------------------------
+
+bool Song::doRedo1()
+ {
+ if (redoList->empty())
+ return true;
+ Undo& u = redoList->back();
+ for (iUndoOp i = u.begin(); i != u.end(); ++i) {
+ switch(i->type) {
+ case UndoOp::AddTrack:
+ insertTrack1(i->track, i->id);
+ break;
+ case UndoOp::DeleteTrack:
+ removeTrack1(i->track);
+ break;
+ case UndoOp::ModifyClip:
+ SndFile::applyUndoFile(i->filename, i->tmpwavfile, i->startframe, i->endframe);
+ break;
+ case UndoOp::AddCtrl:
+ case UndoOp::RemoveCtrl:
+ default:
+ break;
+ }
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// doRedo3
+// non realtime context
+//---------------------------------------------------------
+
+void Song::doRedo3()
+ {
+ Undo& u = redoList->back();
+ for (iUndoOp i = u.begin(); i != u.end(); ++i) {
+ switch(i->type) {
+ case UndoOp::AddTrack:
+ emit trackAdded(i->track, i->id);
+ break;
+ case UndoOp::DeleteTrack:
+ removeTrack3(i->track);
+ break;
+ case UndoOp::ModifyPart:
+ if (i->oPart->track() != i->nPart->track())
+ i->nPart->track()->partListChanged();
+ case UndoOp::AddPart:
+ case UndoOp::DeletePart:
+ i->oPart->track()->partListChanged();
+ break;
+ case UndoOp::AddCtrl:
+ case UndoOp::RemoveCtrl:
+ case UndoOp::ModifyCtrl:
+ i->track->emitControllerChanged(i->id);
+ break;
+ default:
+ break;
+ }
+ }
+ undoList->push_back(u); // put item on undo list
+ redoList->pop_back();
+ dirty = true;
+ }
+
diff --git a/muse/muse/undo.h b/muse/muse/undo.h
new file mode 100644
index 00000000..5e9976c8
--- /dev/null
+++ b/muse/muse/undo.h
@@ -0,0 +1,108 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __UNDO_H__
+#define __UNDO_H__
+
+#include "event.h"
+#include "ctrl.h"
+
+class Track;
+class TEvent;
+class SigEvent;
+class Part;
+
+extern std::list<QString> temporaryWavFiles; //!< Used for storing all tmp-files, for cleanup on shutdown
+//---------------------------------------------------------
+// UndoOp
+//---------------------------------------------------------
+
+struct UndoOp {
+ enum UndoType {
+ AddTrack, DeleteTrack, RenameTrack,
+ AddPart, DeletePart, ModifyPart,
+ AddEvent, DeleteEvent, ModifyEvent,
+ AddTempo, DeleteTempo,
+ AddSig, DeleteSig,
+ SwapTrack,
+ ModifyClip,
+ AddCtrl, RemoveCtrl, ModifyCtrl
+ };
+ UndoType type;
+
+ union {
+ struct {
+ int a;
+ int b;
+ int c;
+ };
+ struct {
+ Part* oPart;
+ Part* nPart;
+ };
+ struct {
+ Part* part;
+ };
+ struct {
+ SigEvent* nSignature;
+ SigEvent* oSignature;
+ };
+ struct {
+ int channel;
+ int ctrl;
+ int oVal;
+ int nVal;
+ };
+ struct {
+ int startframe; //!< Start frame of changed data
+ int endframe; //!< End frame of changed data
+ const char* filename; //!< The file that is changed
+ const char* tmpwavfile; //!< The file with the changed data
+ };
+ struct {
+ Track* track;
+ int id;
+ unsigned time;
+ CVal cval1, cval2;
+ QString* os;
+ QString* ns;
+ };
+ };
+ Event oEvent;
+ Event nEvent;
+ const char* typeName();
+ void dump();
+ };
+
+class Undo : public std::list<UndoOp> {
+ void undoOp(UndoOp::UndoType, int data);
+ };
+
+typedef Undo::iterator iUndoOp;
+typedef Undo::reverse_iterator riUndoOp;
+
+class UndoList : public std::list<Undo> {
+ public:
+ };
+
+typedef UndoList::iterator iUndo;
+
+
+#endif // __UNDO_H__
diff --git a/muse/muse/value.cpp b/muse/muse/value.cpp
new file mode 100644
index 00000000..9434d192
--- /dev/null
+++ b/muse/muse/value.cpp
@@ -0,0 +1,73 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "value.h"
+#include "al/xml.h"
+
+IValue::IValue(QObject* parent, const char* name)
+ : QObject(parent)
+ {
+ setObjectName(name);
+ }
+BValue::BValue(QObject* parent, const char* name)
+ : QObject(parent)
+ {
+ setObjectName(name);
+ }
+
+//---------------------------------------------------------
+// save
+//---------------------------------------------------------
+
+void BValue::save(Xml& xml)
+ {
+ xml.intTag(objectName().toLatin1().data(), val);
+ }
+
+//---------------------------------------------------------
+// save
+//---------------------------------------------------------
+
+void IValue::save(Xml& xml)
+ {
+ xml.intTag(objectName().toLatin1().data(), val);
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void BValue::setValue(bool v)
+ {
+ if (val != v) {
+ val = v;
+ emit valueChanged(val);
+ emit valueChanged(int(val));
+ }
+ }
+
+void IValue::setValue(int v)
+ {
+ if (val != v) {
+ val = v;
+ emit valueChanged(val);
+ }
+ }
+
diff --git a/muse/muse/vg b/muse/muse/vg
new file mode 100755
index 00000000..398f0fde
--- /dev/null
+++ b/muse/muse/vg
@@ -0,0 +1,4 @@
+#!/bin/sh
+valgrind --error-limit=no --tool=memcheck muse -d midi
+#callgrind -v --error-limit=no muse $*
+
diff --git a/muse/muse/vst.cpp b/muse/muse/vst.cpp
new file mode 100644
index 00000000..b38fa569
--- /dev/null
+++ b/muse/muse/vst.cpp
@@ -0,0 +1,1057 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+// This code is based on jack_fst:
+// Copyright (C) 2004 Paul Davis <paul@linuxaudiosystems.com>
+// Torben Hohn <torbenh@informatik.uni-bremen.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "config.h"
+
+#ifdef VST_SUPPORT
+
+#include "al/al.h"
+#include <fst.h>
+#include <vst/aeffectx.h>
+#include <jack/jack.h>
+
+#include "vst.h"
+#include "globals.h"
+#include "synth.h"
+#include "driver/jackaudio.h"
+#include "midi.h"
+#include "al/xml.h"
+#include "song.h"
+#include "audio.h"
+#include "widgets/utils.h"
+
+extern "C" void fst_error(const char *fmt, ...);
+extern JackAudio* jackAudio;
+
+//---------------------------------------------------------
+// jfstReserveMem
+//---------------------------------------------------------
+
+static void jfstReserveMem(int size)
+ {
+ char buf[size];
+
+ for (int i = 0; i < size; ++i)
+ buf[i] = (char)(i % 256);
+ }
+
+//---------------------------------------------------------
+// vstHostCallback
+//---------------------------------------------------------
+
+static long vstHostCallback(AEffect* effect,
+ long opcode, long index, long value, void* ptr, float opt)
+ {
+ static VstTimeInfo _timeInfo;
+
+ VstPluginIF* pluginIF = effect ? (VstPluginIF*) effect->user : 0;
+
+ jack_position_t jack_pos;
+ jack_transport_state_t tstate;
+
+ switch (opcode) {
+ case audioMasterAutomate:
+ // index, value, returns 0
+ if (pluginIF) {
+ PluginI* pi = pluginIF->pluginInstance();
+ // pi->setParam(index, opt);
+ CVal cval;
+ cval.f = opt;
+ song->setControllerVal(pi->track(), pi->controller(index), cval);
+ }
+ return 0;
+
+ case audioMasterVersion:
+ // vst version, currently 2 (0 for older)
+ return 2200;
+
+ case audioMasterCurrentId:
+ // returns the unique id of a plug that's currently
+ // loading
+ return 0;
+
+ case audioMasterIdle:
+ // call application idle routine (this will
+ // call effEditIdle for all open editors too)
+ effect->dispatcher(effect, effEditIdle, 0, 0, NULL, 0.0f);
+ return 0;
+
+ case audioMasterPinConnected:
+ // inquire if an input or output is beeing connected;
+ // index enumerates input or output counting from zero:
+ // value is 0 for input and != 0 otherwise. note: the
+ // return value is 0 for <true> such that older versions
+ // will always return true.
+ return 1;
+
+ case audioMasterWantMidi:
+ // <value> is a filter which is currently ignored
+ return 0;
+
+ case audioMasterGetTime:
+ // returns const VstTimeInfo* (or 0 if not supported)
+ // <value> should contain a mask indicating which fields are required
+ // (see valid masks above), as some items may require extensive
+ // conversions
+
+ memset(&_timeInfo, 0, sizeof(_timeInfo));
+
+ if (effect) {
+ tstate = jackAudio->transportQuery(&jack_pos);
+
+ _timeInfo.samplePos = jack_pos.frame;
+ _timeInfo.sampleRate = jack_pos.frame_rate;
+ _timeInfo.flags = 0;
+
+ if ((value & (kVstBarsValid|kVstTempoValid)) && (jack_pos.valid & JackPositionBBT)) {
+ _timeInfo.tempo = jack_pos.beats_per_minute;
+ _timeInfo.timeSigNumerator = (long) floor (jack_pos.beats_per_bar);
+ _timeInfo.timeSigDenominator = (long) floor (jack_pos.beat_type);
+ _timeInfo.flags |= (kVstBarsValid|kVstTempoValid);
+ }
+ if (tstate == JackTransportRolling) {
+ _timeInfo.flags |= kVstTransportPlaying;
+ }
+ }
+ else {
+ _timeInfo.samplePos = 0;
+ _timeInfo.sampleRate = AL::sampleRate;
+ }
+ return (long)&_timeInfo;
+
+ case audioMasterProcessEvents:
+ // VstEvents* in <ptr>
+ return 0;
+
+ case audioMasterSetTime:
+ // VstTimenfo* in <ptr>, filter in <value>, not supported
+
+ case audioMasterTempoAt:
+ // returns tempo (in bpm * 10000) at sample frame location passed in <value>
+ return 0;
+
+ case audioMasterGetNumAutomatableParameters:
+ return 0;
+
+ case audioMasterGetParameterQuantization:
+ // returns the integer value for +1.0 representation,
+ // or 1 if full single float precision is maintained
+ // in automation. parameter index in <value> (-1: all, any)
+ return 0;
+
+ case audioMasterIOChanged:
+ // numInputs and/or numOutputs has changed
+ return 0;
+
+ case audioMasterNeedIdle:
+ // plug needs idle calls (outside its editor window)
+ return 0;
+
+ case audioMasterSizeWindow:
+ // index: width, value: height
+ return 0;
+
+ case audioMasterGetSampleRate:
+ return 0;
+
+ case audioMasterGetBlockSize:
+ return 0;
+
+ case audioMasterGetInputLatency:
+ return 0;
+
+ case audioMasterGetOutputLatency:
+ return 0;
+
+ case audioMasterGetPreviousPlug:
+ // input pin in <value> (-1: first to come), returns cEffect*
+ return 0;
+
+ case audioMasterGetNextPlug:
+ // output pin in <value> (-1: first to come), returns cEffect*
+
+ case audioMasterWillReplaceOrAccumulate:
+ // returns: 0: not supported, 1: replace, 2: accumulate
+ return 0;
+
+ case audioMasterGetCurrentProcessLevel:
+ // returns: 0: not supported,
+ // 1: currently in user thread (gui)
+ // 2: currently in audio thread (where process is called)
+ // 3: currently in 'sequencer' thread (midi, timer etc)
+ // 4: currently offline processing and thus in user thread
+ // other: not defined, but probably pre-empting user thread.
+ return 0;
+
+ case audioMasterGetAutomationState:
+ // returns 0: not supported, 1: off, 2:read, 3:write, 4:read/write
+ // offline
+ return 0;
+
+ case audioMasterOfflineStart:
+ case audioMasterOfflineRead:
+ // ptr points to offline structure, see below. return 0: error, 1 ok
+ return 0;
+
+ case audioMasterOfflineWrite:
+ // same as read
+ return 0;
+
+ case audioMasterOfflineGetCurrentPass:
+ case audioMasterOfflineGetCurrentMetaPass:
+ return 0;
+
+ case audioMasterSetOutputSampleRate:
+ // for variable i/o, sample rate in <opt>
+ return 0;
+
+ case audioMasterGetSpeakerArrangement:
+ // (long)input in <value>, output in <ptr>
+ return 0;
+
+ case audioMasterGetVendorString:
+ // fills <ptr> with a string identifying the vendor (max 64 char)
+ strcpy ((char*) ptr, "LAD");
+ return 0;
+
+ case audioMasterGetProductString:
+ // fills <ptr> with a string with product name (max 64 char)
+ strcpy ((char*) ptr, "FreeST");
+
+ case audioMasterGetVendorVersion:
+ // returns vendor-specific version
+ return 1000;
+
+ case audioMasterVendorSpecific:
+ // no definition, vendor specific handling
+ return 0;
+
+ case audioMasterSetIcon:
+ // void* in <ptr>, format not defined yet
+ return 0;
+
+ case audioMasterCanDo:
+ // string in ptr, see below
+ return 0;
+
+ case audioMasterGetLanguage:
+ // see enum
+ return 0;
+
+ case audioMasterOpenWindow:
+ // returns platform specific ptr
+ return 0;
+
+ case audioMasterCloseWindow:
+ // close window, platform specific handle in <ptr>
+ return 0;
+
+ case audioMasterGetDirectory:
+ // get plug directory, FSSpec on MAC, else char*
+ return 0;
+
+ case audioMasterUpdateDisplay:
+ // something has changed, update 'multi-fx' display
+ effect->dispatcher(effect, effEditIdle, 0, 0, NULL, 0.0f);
+ return 0;
+
+ case audioMasterBeginEdit:
+ // begin of automation session (when mouse down), parameter index in <index>
+ return 0;
+
+ case audioMasterEndEdit:
+ // end of automation session (when mouse up), parameter index in <index>
+ return 0;
+
+ case audioMasterOpenFileSelector:
+ // open a fileselector window with VstFileSelect* in <ptr>
+ return 0;
+
+ default:
+ break;
+ }
+ return 0;
+ }
+
+
+//---------------------------------------------------------
+// FstPlugin
+//---------------------------------------------------------
+
+FstPlugin::FstPlugin()
+ {
+ _fst = 0;
+ }
+
+//---------------------------------------------------------
+// ~FstPlugin
+//---------------------------------------------------------
+
+FstPlugin::~FstPlugin()
+ {
+ if (_fst) {
+ destroyEditor();
+ fst_close(_fst);
+ _fst = 0;
+ }
+ }
+
+//---------------------------------------------------------
+// instantiate
+//---------------------------------------------------------
+
+void FstPlugin::instantiate(FSTHandle* fstHandle, void* p)
+ {
+ _fst = fst_instantiate(fstHandle, vstHostCallback, p);
+ if (_fst == 0) {
+ printf("FstPlugin::instantiate:: cannot instantiate plugin\n");
+ return;
+ }
+ AEffect* plugin = _fst->plugin;
+ version = plugin->dispatcher (plugin, effGetVstVersion, 0, 0, 0, 0.0f);
+ }
+
+//---------------------------------------------------------
+// numInputs
+//---------------------------------------------------------
+
+int FstPlugin::numInputs() const
+ {
+ return _fst->plugin->numInputs;
+ }
+
+//---------------------------------------------------------
+// numOutputs
+//---------------------------------------------------------
+
+int FstPlugin::numOutputs() const
+ {
+ return _fst->plugin->numOutputs;
+ }
+
+//---------------------------------------------------------
+// numParameter
+//---------------------------------------------------------
+
+int FstPlugin::numParameter() const
+ {
+ return _fst->plugin->numParams;
+ }
+
+//---------------------------------------------------------
+// setSampleRate
+//---------------------------------------------------------
+
+void FstPlugin::setSampleRate(float sr)
+ {
+ AEffect* plugin = _fst->plugin;
+ plugin->dispatcher(plugin, effSetSampleRate, 0, 0, 0, sr);
+ }
+
+//---------------------------------------------------------
+// setBlockSize
+//---------------------------------------------------------
+
+void FstPlugin::setBlockSize(int bs)
+ {
+ AEffect* plugin = _fst->plugin;
+ plugin->dispatcher(plugin, effSetBlockSize, 0, bs, 0, 0.0f);
+ }
+
+//---------------------------------------------------------
+// mainsChanged
+//---------------------------------------------------------
+
+void FstPlugin::mainsChanged(bool on)
+ {
+ AEffect* plugin = _fst->plugin;
+ plugin->dispatcher(plugin, effMainsChanged, 0, on, 0, 0.0f);
+ }
+
+//---------------------------------------------------------
+// setProgram
+//---------------------------------------------------------
+
+void FstPlugin::setProgram(int p)
+ {
+ AEffect* plugin = _fst->plugin;
+ plugin->dispatcher(plugin, effSetProgram, 0, p, 0, 0.0f);
+ }
+
+//---------------------------------------------------------
+// hasGui
+//---------------------------------------------------------
+
+bool FstPlugin::hasGui() const
+ {
+ return _fst->plugin->flags & effFlagsHasEditor;
+ }
+
+//---------------------------------------------------------
+// canReplacing
+//---------------------------------------------------------
+
+bool FstPlugin::canReplacing()
+ {
+ return _fst->plugin->flags & effFlagsCanReplacing;
+ }
+
+//---------------------------------------------------------
+// runEditor
+//---------------------------------------------------------
+
+bool FstPlugin::runEditor()
+ {
+ return fst_run_editor(_fst);
+ }
+
+//---------------------------------------------------------
+// destroyEditor
+//---------------------------------------------------------
+
+void FstPlugin::destroyEditor()
+ {
+ fst_destroy_editor(_fst);
+ }
+
+//---------------------------------------------------------
+// getVstVersion
+//---------------------------------------------------------
+
+int FstPlugin::getVstVersion()
+ {
+ return version;
+ }
+
+//---------------------------------------------------------
+// setParameter
+//---------------------------------------------------------
+
+void FstPlugin::setParameter(int idx, float value)
+ {
+ AEffect* plugin = _fst->plugin;
+ plugin->setParameter(plugin, idx, value);
+ }
+
+//---------------------------------------------------------
+// getParameter
+//---------------------------------------------------------
+
+float FstPlugin::getParameter(int idx)
+ {
+ AEffect* plugin = _fst->plugin;
+ return plugin->getParameter(plugin, idx);
+ }
+
+//---------------------------------------------------------
+// processReplacing
+//---------------------------------------------------------
+
+void FstPlugin::processReplacing(float** ins, float** outs, int n)
+ {
+ AEffect* plugin = _fst->plugin;
+ plugin->processReplacing(plugin, ins, outs, n);
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void FstPlugin::process(float** ins, float** outs, int n)
+ {
+ AEffect* plugin = _fst->plugin;
+ plugin->process(plugin, ins, outs, n);
+ }
+
+//---------------------------------------------------------
+// putEvent
+//---------------------------------------------------------
+
+void FstPlugin::putEvent(const MidiEvent& ev)
+ {
+ AEffect* plugin = _fst->plugin;
+ static struct VstEvents events;
+ static struct VstMidiEvent event;
+ events.numEvents = 1;
+ events.reserved = 0;
+ events.events[0] = (VstEvent*)(&event);
+
+ event.type = kVstMidiType;
+ event.byteSize = 24;
+ event.deltaFrames = 0;
+ event.flags = 0;
+ event.detune = 0;
+ event.noteLength = 0;
+ event.noteOffset = 0;
+ event.reserved1 = 0;
+ event.reserved2 = 0;
+ event.noteOffVelocity = 0;
+ switch (ev.type()) {
+ case ME_PITCHBEND:
+ {
+ int a = ev.dataA() + 8192;
+ int b = a >> 7;
+ event.midiData[0] = (ev.type() | ev.channel()) & 0xff;
+ event.midiData[1] = a & 0x7f;
+ event.midiData[2] = b & 0x7f;
+ event.midiData[3] = 0;
+ }
+ break;
+
+ case ME_CONTROLLER:
+ case ME_NOTEON:
+ default:
+ event.midiData[0] = (ev.type() | ev.channel()) & 0xff;
+ event.midiData[1] = ev.dataA() & 0xff;
+ event.midiData[2] = ev.dataB() & 0xff;
+ event.midiData[3] = 0;
+ break;
+ }
+ plugin->dispatcher(plugin, effProcessEvents, 0, 0, &events, 0.0f);
+ }
+
+//---------------------------------------------------------
+// getParameterName
+//---------------------------------------------------------
+
+const char* FstPlugin::getParameterName(int idx) const
+ {
+ static char dsp[8];
+ dsp[0] = 0;
+ AEffect* effect = _fst->plugin;
+ effect->dispatcher(effect, effGetParamName, idx, 0, &dsp, 0.0f);
+ return dsp;
+ }
+
+//---------------------------------------------------------
+// getParameterLabel
+//---------------------------------------------------------
+
+const char* FstPlugin::getParameterLabel(int idx) const
+ {
+ static char dsp[8];
+ dsp[0] = 0;
+ AEffect* effect = _fst->plugin;
+ effect->dispatcher(effect, effGetParamLabel, idx, 0, &dsp, 0.0f);
+ return dsp;
+ }
+
+//---------------------------------------------------------
+// getParameterDisplay
+//---------------------------------------------------------
+
+const char* FstPlugin::getParameterDisplay(int idx, float val) const
+ {
+ static char dsp[8];
+ dsp[0] = 0;
+ AEffect* effect = _fst->plugin;
+ effect->dispatcher(effect, effGetParamDisplay, idx, 0, &dsp, val);
+ return dsp;
+ }
+
+//---------------------------------------------------------
+// scanVstDir
+//---------------------------------------------------------
+
+static void scanVstDir(const QString& s)
+ {
+ if (debugMsg)
+ printf("scan vst plugin dir <%s>\n", s.toLatin1().data());
+ QDir pluginDir(s, QString("*.dll"), QDir::Unsorted, QDir::Files);
+ if (pluginDir.exists()) {
+ const QFileInfoList list = pluginDir.entryInfoList();
+ for (int i = 0; i < list.size(); ++i) {
+ QFileInfo fi = list.at(i);
+ char* path = strdup(fi.filePath().toLatin1().data());
+ FSTInfo* info = fst_get_info(path);
+ if (info) {
+ //
+ // simple hack:
+ // plugins with no inputs are treated
+ // as software synthesizer
+ //
+ // if (info->wantEvents && info->numOutputs) {
+ if (info->numInputs == 0 && info->numOutputs) {
+ if (debugMsg)
+ printf(" add vsti synti <%s>\n", fi.fileName().toLatin1().data());
+ synthis.push_back(new VstSynth(&fi));
+ fst_free_info(info);
+ }
+ else if (info->numInputs && info->numOutputs) {
+ if (debugMsg)
+ printf(" add vst plugin <%s>\n", fi.fileName().toLatin1().data());
+ plugins.push_back(new VstPlugin(&fi, info));
+ }
+ }
+ free(path);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// fstSignalHandler
+//---------------------------------------------------------
+
+static void fstSignalHandler(int sig, siginfo_t* /*info*/, void* /*context*/)
+ {
+ fst_error("fst signal handler %d, thread = 0x%x", sig, pthread_self ());
+ //if (sig == SIGSEGV || sig == SIGABRT) {
+ char*p = 0;
+ *p = 0;
+// }
+ fatalError("fst signal");
+ }
+
+//---------------------------------------------------------
+// initVST
+//---------------------------------------------------------
+
+void initVST()
+ {
+ jfstReserveMem(1000000);
+
+ if (fst_init(fstSignalHandler)) {
+ printf("initVST failed\n");
+ return;
+ }
+ char* vstPath = getenv("VST_PATH");
+ if (vstPath == 0)
+ vstPath = "/usr/lib/vst:/usr/local/lib/vst";
+
+ char* p = vstPath;
+ while (*p != '\0') {
+ char* pe = p;
+ while (*pe != ':' && *pe != '\0')
+ pe++;
+
+ int n = pe - p;
+ if (n) {
+ char* buffer = new char[n + 1];
+ strncpy(buffer, p, n);
+ buffer[n] = '\0';
+ scanVstDir(QString(buffer));
+ delete[] buffer;
+ }
+ p = pe;
+ if (*p == ':')
+ p++;
+ }
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool VstSynthIF::guiVisible() const
+ {
+ return _guiVisible;
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void VstSynthIF::showGui(bool v)
+ {
+ if (v == guiVisible())
+ return;
+ if (v)
+ _fst->runEditor();
+ else
+ _fst->destroyEditor();
+ _guiVisible = v;
+ }
+
+//---------------------------------------------------------
+// receiveEvent
+//---------------------------------------------------------
+
+MidiEvent VstSynthIF::receiveEvent()
+ {
+ return MidiEvent();
+ }
+
+//---------------------------------------------------------
+// hasGui
+//---------------------------------------------------------
+
+bool VstSynthIF::hasGui() const
+ {
+ return _fst->hasGui();
+ }
+
+//---------------------------------------------------------
+// incInstances
+//---------------------------------------------------------
+
+void VstSynth::incInstances(int val)
+ {
+ _instances += val;
+ if (_instances == 0 && fstHandle) {
+ fst_unload(fstHandle);
+ fstHandle = 0;
+ }
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool VstSynthIF::init(FSTHandle* h)
+ {
+ _fst = new FstPlugin();
+ _fst->instantiate(h, 0);
+ _fst->setSampleRate(AL::sampleRate);
+ _fst->setBlockSize(segmentSize);
+ _fst->mainsChanged(true);
+ _fst->setProgram(0);
+ return true;
+ }
+
+//---------------------------------------------------------
+// channels
+//---------------------------------------------------------
+
+int VstSynthIF::channels() const
+ {
+ return _fst->numOutputs();
+ }
+
+//---------------------------------------------------------
+// createSIF
+//---------------------------------------------------------
+
+SynthIF* VstSynth::createSIF(SynthI* s)
+ {
+ VstSynthIF* sif = new VstSynthIF(s);
+ ++_instances;
+ const char* path = info.filePath().toLatin1().data();
+
+ if (fstHandle == 0) {
+ fstHandle = fst_load(path);
+ if (fstHandle == 0) {
+ printf("SynthIF:: cannot load vst plugin %s\n", path);
+ return 0;
+ }
+ }
+ sif->init(fstHandle);
+ return sif;
+ }
+
+//---------------------------------------------------------
+// deactivate3
+//---------------------------------------------------------
+
+void VstSynthIF::deactivate3()
+ {
+ if (_fst) {
+ delete _fst;
+ _fst = 0;
+ }
+ }
+
+//---------------------------------------------------------
+// ~VstSynthIF
+//---------------------------------------------------------
+
+VstSynthIF::~VstSynthIF()
+ {
+ deactivate3();
+ }
+
+//---------------------------------------------------------
+// setParameter
+//---------------------------------------------------------
+
+void VstSynthIF::setParameter(int idx, float value)
+ {
+ _fst->setParameter(idx, value);
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void VstSynthIF::write(Xml& xml) const
+ {
+ //---------------------------------------------
+ // dump current state of synth
+ //---------------------------------------------
+
+ int params = _fst->numParameter();
+ for (int i = 0; i < params; ++i) {
+ float f = _fst->getParameter(i);
+ xml.floatTag("param", f);
+ }
+ }
+
+//---------------------------------------------------------
+// getData
+//---------------------------------------------------------
+
+iMPEvent VstSynthIF::getData(MPEventList* el, iMPEvent i, unsigned /*pos*/, int ports, unsigned n, float** buffer)
+ {
+ for (; i != el->end(); ++i)
+ putEvent(*i);
+ int outputs = _fst->numOutputs();
+ if (ports < outputs) {
+ float* ob[outputs];
+ float fp[n * (outputs-ports)]; // dummy output buffer
+ for (int i = 0; i < outputs; ++i) {
+ if (i < ports)
+ ob[i] = buffer[i];
+ else
+ ob[i] = fp + n * (i-ports);
+ }
+ if (_fst->canReplacing())
+ _fst->processReplacing(0, ob, n);
+ else {
+ for (int i = 0; i < outputs; ++i)
+ memset(ob[i], 0, n * sizeof(float));
+ _fst->process(0, ob, n);
+ }
+ }
+ else {
+ if (_fst->canReplacing())
+ _fst->processReplacing(0, buffer, n);
+ else {
+ for (int i = 0; i < outputs; ++i)
+ memset(buffer[i], 0, n * sizeof(float));
+ _fst->process(0, buffer, n);
+ }
+ }
+ return el->end();
+ }
+
+//---------------------------------------------------------
+// putEvent
+//---------------------------------------------------------
+
+bool VstSynthIF::putEvent(const MidiEvent& ev)
+ {
+ if (midiOutputTrace)
+ ev.dump();
+ _fst->putEvent(ev);
+ return false;
+ }
+
+//---------------------------------------------------------
+// VstPlugin
+//---------------------------------------------------------
+
+VstPlugin::VstPlugin(const QFileInfo* fi, FSTInfo* i)
+ : Plugin(fi)
+ {
+ info = i;
+ fstHandle = 0;
+ }
+
+//---------------------------------------------------------
+// VstPlugin
+//---------------------------------------------------------
+
+VstPlugin::~VstPlugin()
+ {
+ fst_free_info(info);
+ }
+
+//---------------------------------------------------------
+// createPIF
+//---------------------------------------------------------
+
+PluginIF* VstPlugin::createPIF(PluginI* pi)
+ {
+ VstPluginIF* pif = new VstPluginIF(pi);
+ ++_instances;
+ const char* path = fi.filePath().toLatin1().data();
+
+ if (fstHandle == 0) {
+ fstHandle = fst_load(path);
+ if (fstHandle == 0) {
+ printf("SynthIF:: cannot load vst plugin %s\n", path);
+ return 0;
+ }
+ }
+ pif->init(fstHandle);
+ return pif;
+ }
+
+//---------------------------------------------------------
+// parameter
+//---------------------------------------------------------
+
+int VstPlugin::parameter() const
+ {
+ return info->numParams;
+ }
+
+//---------------------------------------------------------
+// inports
+//---------------------------------------------------------
+
+int VstPlugin::inports() const
+ {
+ return info->numInputs;
+ }
+
+//---------------------------------------------------------
+// outports
+//---------------------------------------------------------
+
+int VstPlugin::outports() const
+ {
+ return info->numOutputs;
+ }
+
+//---------------------------------------------------------
+// id
+//---------------------------------------------------------
+
+unsigned long VstPlugin::id() const
+ {
+ return info->UniqueID;
+ }
+
+//---------------------------------------------------------
+// VstPluginIF
+//---------------------------------------------------------
+
+VstPluginIF::VstPluginIF(PluginI* pi)
+ : PluginIF(pi)
+ {
+ _fst = 0;
+ _guiVisible = false;
+ }
+
+VstPluginIF::~VstPluginIF()
+ {
+ if (_fst == 0)
+ return;
+ delete _fst;
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool VstPluginIF::init(FSTHandle* h)
+ {
+ _fst = new FstPlugin();
+ _fst->instantiate(h, this);
+ _fst->setSampleRate(AL::sampleRate);
+ _fst->setBlockSize(segmentSize);
+ _fst->mainsChanged(true);
+ _fst->setProgram(0);
+ return true;
+ }
+
+//---------------------------------------------------------
+// hasGui
+//---------------------------------------------------------
+
+bool VstPluginIF::hasGui() const
+ {
+ return _fst->hasGui();
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void VstPluginIF::showGui(bool v)
+ {
+ if (v == guiVisible())
+ return;
+ if (v)
+ _fst->runEditor();
+ else
+ _fst->destroyEditor();
+ _guiVisible = v;
+ }
+
+//---------------------------------------------------------
+// getParameterName
+//---------------------------------------------------------
+
+const char* VstPluginIF::getParameterName(int idx) const
+ {
+ return _fst->getParameterName(idx);
+ }
+
+//---------------------------------------------------------
+// getParameterLabel
+//---------------------------------------------------------
+
+const char* VstPluginIF::getParameterLabel(int idx) const
+ {
+ return _fst->getParameterLabel(idx);
+ }
+
+//---------------------------------------------------------
+// getParameterDisplay
+//---------------------------------------------------------
+
+const char* VstPluginIF::getParameterDisplay(int idx, float val) const
+ {
+ return _fst->getParameterDisplay(idx, val);
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void VstPluginIF::apply(unsigned nframes, float** src, float** dst)
+ {
+ if (_fst->canReplacing())
+ _fst->processReplacing(src, dst, nframes);
+ else {
+ int n = _fst->numOutputs();
+
+ for (int i = 0; i < n; ++i)
+ memset(dst[i], 0, sizeof(float) * nframes);
+ _fst->process(src, dst, nframes);
+ }
+ }
+
+//---------------------------------------------------------
+// setParam
+//---------------------------------------------------------
+
+void VstPluginIF::setParam(int i, float val)
+ {
+ _fst->setParameter(i, val);
+ }
+
+//---------------------------------------------------------
+// param
+//---------------------------------------------------------
+
+float VstPluginIF::param(int i) const
+ {
+ return _fst->getParameter(i);
+ }
+
+#else
+void initVST() {}
+#endif
+
diff --git a/muse/muse/vst.h b/muse/muse/vst.h
new file mode 100644
index 00000000..714dff15
--- /dev/null
+++ b/muse/muse/vst.h
@@ -0,0 +1,172 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __VST_H__
+#define __VST_H__
+
+#include "synth.h"
+#include "plugin.h"
+
+struct _FSTHandle;
+struct _FST;
+class VstPluginIF;
+
+//---------------------------------------------------------
+// FstPlugin
+//---------------------------------------------------------
+
+class FstPlugin {
+ _FST* _fst;
+ int version;
+
+ public:
+ FstPlugin();
+ ~FstPlugin();
+ void instantiate(FSTHandle* s, void*);
+ int numInputs() const;
+ int numOutputs() const;
+ int numParameter() const;
+ void setProgram(int p);
+ void mainsChanged(bool on);
+ void setBlockSize(int bs);
+ void setSampleRate(float sr);
+ bool runEditor();
+ void destroyEditor();
+ int getVstVersion();
+ bool hasGui() const;
+ bool canReplacing();
+ void setParameter(int idx, float value);
+ float getParameter(int idx);
+ void processReplacing(float**, float**, int);
+ void process(float**, float**, int);
+ void putEvent(const MidiEvent& ev);
+ const char* getParameterName(int idx) const;
+ const char* getParameterLabel(int idx) const;
+ const char* getParameterDisplay(int idx, float val) const;
+ };
+
+//---------------------------------------------------------
+// VstSynth
+//---------------------------------------------------------
+
+class VstSynth : public Synth {
+ _FSTHandle* fstHandle;
+ int vstVersion;
+
+ public:
+ VstSynth(const QFileInfo* fi) : Synth(fi, fi->baseName()) {
+ fstHandle = 0;
+ }
+ virtual ~VstSynth() {}
+ virtual void incInstances(int val);
+ virtual SynthIF* createSIF(SynthI*);
+ };
+
+//---------------------------------------------------------
+// VstSynthIF
+// VSTi synthesizer instance
+//---------------------------------------------------------
+
+class VstSynthIF : public SynthIF
+ {
+ FstPlugin* _fst;
+ bool _guiVisible;
+
+ public:
+ VstSynthIF(SynthI* s) : SynthIF(s) {
+ _fst = 0;
+ _guiVisible = false;
+ }
+ virtual ~VstSynthIF();
+
+ virtual bool guiVisible() const;
+ virtual void showGui(bool v);
+ virtual bool hasGui() const;
+ virtual void getGeometry(int*, int*, int*, int*) const {}
+ virtual void setGeometry(int, int, int, int) {}
+ virtual iMPEvent getData(MPEventList*, iMPEvent, unsigned pos, int ports, unsigned n, float** buffer) ;
+ virtual bool putEvent(const MidiEvent& ev);
+ virtual MidiEvent receiveEvent();
+ virtual int eventsPending() const { return 0; }
+ virtual int channels() const;
+ virtual void deactivate3();
+ virtual QString getPatchName(int, int) { return QString(""); }
+ virtual void populatePatchPopup(QMenu*, int) {};
+ virtual void write(Xml& xml) const;
+ virtual void setParameter(int idx, float value);
+ virtual int getControllerInfo(int, const char**, int*, int*, int*) { return 0; }
+ bool init(FSTHandle*);
+ };
+
+//---------------------------------------------------------
+// VstPlugin
+//---------------------------------------------------------
+
+class VstPlugin : public Plugin {
+ _FSTHandle* fstHandle;
+ FSTInfo* info;
+
+ protected:
+ int vstVersion;
+ friend class VstPluginIF;
+
+ public:
+ VstPlugin(const QFileInfo* fi, FSTInfo* i);
+ virtual ~VstPlugin();
+ virtual PluginIF* createPIF(PluginI*);
+ virtual QString name() const { return QString(info->name); }
+ virtual QString label() const { return QString(info->name); }
+
+ virtual int parameter() const;
+ virtual int inports() const;
+ virtual int outports() const;
+ virtual unsigned long id() const;
+ };
+
+//---------------------------------------------------------
+// VstPluginIF
+// Vst plugin instance interface
+//---------------------------------------------------------
+
+class VstPluginIF : public PluginIF {
+ FstPlugin* _fst;
+ bool _guiVisible;
+
+ public:
+ VstPluginIF(PluginI*);
+ virtual ~VstPluginIF();
+
+ virtual void apply(unsigned nframes, float** src, float** dst);
+ virtual void activate() {}
+ virtual void deactivate() {}
+ virtual void cleanup() {}
+ virtual void setParam(int i, float val);
+ virtual float param(int i) const;
+ virtual const char* getParameterName(int k) const;
+ virtual const char* getParameterLabel(int) const;
+ virtual const char* getParameterDisplay(int, float) const;
+ virtual bool hasGui() const;
+ virtual bool guiVisible() const { return _guiVisible; }
+ virtual void showGui(bool f);
+ bool init(FSTHandle*);
+ };
+
+#endif
+
diff --git a/muse/muse/wave.cpp b/muse/muse/wave.cpp
new file mode 100644
index 00000000..cb0d7d49
--- /dev/null
+++ b/muse/muse/wave.cpp
@@ -0,0 +1,869 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "al/xml.h"
+#include "al/al.h"
+#include "song.h"
+#include "wave.h"
+#include "muse.h"
+#include "widgets/filedialog.h"
+#include "arranger/arranger.h"
+#include "globals.h"
+#include "event.h"
+#include "audio.h"
+#include "part.h"
+
+const char* audioFilePattern[] = {
+ "Wave/Binary (*.wav *.bin)",
+ "Wave (*.wav)",
+ "Binary (*.bin)",
+ "All Files (*)",
+ 0
+ };
+const int cacheMag = 128;
+
+QHash<QString, SndFile*> SndFile::sndFiles;
+QList<SndFile*> SndFile::createdFiles;
+int SndFile::recFileNumber;
+
+//---------------------------------------------------------
+// SndFile
+//---------------------------------------------------------
+
+SndFile::SndFile(const QString& name)
+ {
+ refCount = 0;
+ _finfo.setFile(name);
+ sf = 0;
+ csize = 0;
+ cache = 0;
+ openFlag = false;
+ sndFiles[_finfo.absoluteFilePath()] = this;
+ }
+
+SndFile::~SndFile()
+ {
+ if (openFlag)
+ close();
+ sndFiles.remove(_finfo.absoluteFilePath());
+ if (cache) {
+ for (unsigned i = 0; i < channels(); ++i)
+ delete cache[i];
+ delete[] cache;
+ cache = 0;
+ }
+ }
+
+//---------------------------------------------------------
+// openRead
+//---------------------------------------------------------
+
+bool SndFile::openRead()
+ {
+ if (openFlag) {
+ printf("SndFile:: alread open\n");
+ return false;
+ }
+ QString p = _finfo.absoluteFilePath();
+ sf = sf_open(p.toLatin1().data(), SFM_READ, &sfinfo);
+ if (sf == 0)
+ return true;
+ writeFlag = false;
+ openFlag = true;
+ QString cacheName = _finfo.absolutePath() + QString("/") + _finfo.baseName() + QString(".wca");
+ readCache(cacheName, true);
+ return false;
+ }
+
+//---------------------------------------------------------
+// update
+// called after recording to file
+//---------------------------------------------------------
+
+void SndFile::update()
+ {
+ close();
+
+ // force recreation of wca data
+ QString cacheName = _finfo.absolutePath() +
+ QString("/") + _finfo.baseName() + QString(".wca");
+ ::remove(cacheName.toLatin1().data());
+ if (openRead()) {
+ printf("SndFile::openRead(%s) failed: %s\n", _finfo.filePath().toLatin1().data(), strerror().toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// readCache
+//---------------------------------------------------------
+
+void SndFile::readCache(const QString& path, bool showProgress)
+ {
+// printf("readCache %s for %d samples channel %d\n",
+// path.toLatin1().data(), samples(), channels());
+
+ if (cache) {
+ for (unsigned i = 0; i < channels(); ++i)
+ delete cache[i];
+ delete[] cache;
+ }
+ if (samples() == 0) {
+// printf("SndFile::readCache: file empty\n");
+ return;
+ }
+ csize = (samples() + cacheMag - 1)/cacheMag;
+ cache = new SampleV*[channels()];
+ for (unsigned ch = 0; ch < channels(); ++ch)
+ cache[ch] = new SampleV[csize];
+
+ FILE* cfile = fopen(path.toLatin1().data(), "r");
+ if (cfile) {
+ for (unsigned ch = 0; ch < channels(); ++ch)
+ fread(cache[ch], csize * sizeof(SampleV), 1, cfile);
+ fclose(cfile);
+ return;
+ }
+
+ //---------------------------------------------------
+ // create cache
+ //---------------------------------------------------
+
+ QProgressDialog* progress = 0;
+ if (showProgress) {
+ QString label(QWidget::tr("create peakfile for "));
+ label += _finfo.baseName();
+ progress = new QProgressDialog(label, "Abort", 0, csize, 0);
+ qApp->processEvents();
+ }
+ float data[channels()][cacheMag];
+ float* fp[channels()];
+ for (unsigned k = 0; k < channels(); ++k)
+ fp[k] = &data[k][0];
+ int interval = csize / 10;
+ for (int i = 0; i < csize; i++) {
+ if (showProgress && ((i % interval) == 0)) {
+ progress->setValue(i);
+ progress->raise();
+ qApp->processEvents();
+ if (progress->wasCanceled()) {
+ // TODO
+ }
+ }
+ seek(i * cacheMag, 0);
+ read(channels(), fp, cacheMag);
+ for (unsigned ch = 0; ch < channels(); ++ch) {
+ float rms = 0.0;
+ cache[ch][i].peak = 0;
+ for (int n = 0; n < cacheMag; n++) {
+ float fd = data[ch][n];
+ rms += fd * fd;
+ int idata = lrint(fd * 255.0);
+ if (idata < 0)
+ idata = -idata;
+ if (idata > 255)
+ idata = 255;
+ if (cache[ch][i].peak < idata)
+ cache[ch][i].peak = idata;
+ }
+ // amplify rms value +12dB
+ int rmsValue = lrint((sqrt(rms/cacheMag) * 255.0));
+ if (rmsValue > 255)
+ rmsValue = 255;
+ cache[ch][i].rms = rmsValue;
+ }
+ }
+ if (showProgress) {
+ progress->setValue(csize);
+ qApp->processEvents();
+ }
+ writeCache(path);
+ if (showProgress)
+ delete progress;
+ }
+
+//---------------------------------------------------------
+// writeCache
+//---------------------------------------------------------
+
+void SndFile::writeCache(const QString& path)
+ {
+ FILE* cfile = fopen(path.toLatin1().data(), "w");
+ if (cfile == 0)
+ return;
+ for (unsigned ch = 0; ch < channels(); ++ch)
+ fwrite(cache[ch], csize * sizeof(SampleV), 1, cfile);
+ fclose(cfile);
+ }
+
+//---------------------------------------------------------
+// read
+// integrate "mag" samples, starting at position "pos"
+// into "s"
+//---------------------------------------------------------
+
+void SndFile::read(SampleV* s, int mag, unsigned pos)
+ {
+ for (unsigned ch = 0; ch < channels(); ++ch) {
+ s[ch].peak = 0;
+ s[ch].rms = 0;
+ }
+ if (pos > samples()) {
+// printf("%p pos %d > samples %d\n", this, pos, samples());
+ return;
+ }
+
+ if (mag < cacheMag) {
+ float data[channels()][mag];
+ float* fp[channels()];
+ for (unsigned i = 0; i < channels(); ++i)
+ fp[i] = &data[i][0];
+ seek(pos, 0);
+ read(channels(), fp, mag);
+
+ for (unsigned ch = 0; ch < channels(); ++ch) {
+ s[ch].peak = 0;
+ float rms = 0.0;
+ for (int i = 0; i < mag; i++) {
+ float fd = data[ch][i];
+ rms += fd;
+ int idata = int(fd * 255.0);
+ if (idata < 0)
+ idata = -idata;
+ if (s[ch].peak < idata)
+ s[ch].peak = idata;
+ }
+ s[ch].rms = 0; // TODO rms / mag;
+ }
+ }
+ else {
+ mag /= cacheMag;
+ int rest = csize - (pos/cacheMag);
+ int end = mag;
+ if (rest < mag)
+ end = rest;
+
+ for (unsigned ch = 0; ch < channels(); ++ch) {
+ int rms = 0;
+ int off = pos/cacheMag;
+ for (int offset = off; offset < off+end; offset++) {
+ rms += cache[ch][offset].rms;
+ if (s[ch].peak < cache[ch][offset].peak)
+ s[ch].peak = cache[ch][offset].peak;
+ }
+ s[ch].rms = rms / mag;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// openWrite
+//---------------------------------------------------------
+
+bool SndFile::openWrite()
+ {
+ if (openFlag) {
+ printf("SndFile:: alread open\n");
+ return false;
+ }
+ QString p = _finfo.filePath();
+ sf = sf_open(p.toLatin1().data(), SFM_RDWR, &sfinfo);
+ if (sf) {
+ openFlag = true;
+ writeFlag = true;
+ QString cacheName = _finfo.absolutePath() +
+ QString("/") + _finfo.baseName() + QString(".wca");
+ readCache(cacheName, true);
+ }
+ return sf == 0;
+ }
+
+//---------------------------------------------------------
+// close
+//---------------------------------------------------------
+
+void SndFile::close()
+ {
+ if (!openFlag) {
+ printf("SndFile:: alread closed\n");
+ return;
+ }
+ sf_close(sf);
+ openFlag = false;
+ }
+
+//---------------------------------------------------------
+// remove
+//---------------------------------------------------------
+
+void SndFile::remove()
+ {
+ if (openFlag)
+ close();
+ QString cacheName = _finfo.absolutePath() + QString("/") + _finfo.baseName() + QString(".wca");
+ // QFile::remove(_finfo.filePath());
+ // QFile::remove(cacheName);
+ QFile::rename(_finfo.filePath(), _finfo.filePath() + ".del");
+ QFile::rename(cacheName, cacheName + ".del");
+
+ }
+
+//---------------------------------------------------------
+// samples
+//---------------------------------------------------------
+
+unsigned SndFile::samples() const
+ {
+ sf_count_t curPos = sf_seek(sf, 0, SEEK_CUR);
+ int frames = sf_seek(sf, 0, SEEK_END);
+ sf_seek(sf, curPos, SEEK_SET);
+ return frames;
+ }
+
+//---------------------------------------------------------
+// channels
+//---------------------------------------------------------
+
+unsigned SndFile::channels() const
+ {
+ return sfinfo.channels;
+ }
+
+unsigned SndFile::samplerate() const
+ {
+ return sfinfo.samplerate;
+ }
+
+unsigned SndFile::format() const
+ {
+ return sfinfo.format;
+ }
+
+void SndFile::setFormat(int fmt, int ch, int rate)
+ {
+ sfinfo.samplerate = rate;
+ sfinfo.channels = ch;
+ sfinfo.format = fmt;
+ sfinfo.seekable = true;
+ sfinfo.frames = 0;
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+size_t SndFile::read(int srcChannels, float** dst, size_t n)
+ {
+ float buffer[n * sfinfo.channels];
+ size_t rn = sf_readf_float(sf, buffer, n);
+ float* src = buffer;
+ int dstChannels = sfinfo.channels;
+
+ if (srcChannels == dstChannels) {
+ for (size_t i = 0; i < rn; ++i) {
+ for (int ch = 0; ch < srcChannels; ++ch)
+ *(dst[ch]+i) = *src++;
+ }
+ }
+ else if ((srcChannels == 1) && (dstChannels == 2)) {
+ // stereo to mono
+ for (size_t i = 0; i < rn; ++i)
+ *(dst[0] + i) = src[i + i] + src[i + i + 1];
+ }
+ else if ((srcChannels == 2) && (dstChannels == 1)) {
+ // mono to stereo
+ for (size_t i = 0; i < rn; ++i) {
+ float data = *src++;
+ *(dst[0]+i) = data;
+ *(dst[1]+i) = data;
+ }
+ }
+ else {
+ printf("SndFile:read channel mismatch %d -> %d\n",
+ srcChannels, dstChannels);
+ }
+ return rn;
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+size_t SndFile::write(int srcChannels, float** src, size_t n)
+ {
+ int dstChannels = sfinfo.channels;
+ float buffer[n * dstChannels];
+ float* dst = buffer;
+
+ if (srcChannels == dstChannels) {
+ for (size_t i = 0; i < n; ++i) {
+ for (int ch = 0; ch < dstChannels; ++ch)
+ *dst++ = *(src[ch]+i);
+ }
+ }
+ else if ((srcChannels == 1) && (dstChannels == 2)) {
+ // mono to stereo
+ for (size_t i = 0; i < n; ++i) {
+ float data = *(src[0]+i);
+ *dst++ = data;
+ *dst++ = data;
+ }
+ }
+ else if ((srcChannels == 2) && (dstChannels == 1)) {
+ // stereo to mono
+ for (size_t i = 0; i < n; ++i)
+ *dst++ = *(src[0]+i) + *(src[1]+i);
+ }
+ else {
+ printf("SndFile:write channel mismatch %d -> %d\n",
+ srcChannels, dstChannels);
+ return 0;
+ }
+ return sf_writef_float(sf, buffer, n) ;
+ }
+
+//---------------------------------------------------------
+// seek
+//---------------------------------------------------------
+
+off_t SndFile::seek(off_t frames, int whence)
+ {
+ return sf_seek(sf, frames, whence);
+ }
+
+//---------------------------------------------------------
+// strerror
+//---------------------------------------------------------
+
+QString SndFile::strerror() const
+ {
+ char buffer[128];
+ buffer[0] = 0;
+ sf_error_str(sf, buffer, 128);
+ return QString(buffer);
+ }
+
+//---------------------------------------------------------
+// getSnd
+//---------------------------------------------------------
+
+SndFile* SndFile::getWave(const QString& inName, bool writeFlag)
+ {
+ QString name = inName;
+
+ if (QFileInfo(name).isRelative()) {
+ name = museProject + QString("/") + name;
+ }
+ else {
+ if (!QFile::exists(name)) {
+ if (QFile::exists(museProject + QString("/") + name)) {
+ name = museProject + QString("/") + name;
+ }
+ }
+ }
+// printf("=====%s %s\n", inName.toLatin1().data(), name.toLatin1().data());
+ SndFile* f = sndFiles.value(name);
+ if (f == 0) {
+ if (!QFile::exists(name)) {
+ fprintf(stderr, "wave file <%s> not found\n",
+ name.toLatin1().data());
+ return 0;
+ }
+ f = new SndFile(name);
+ bool error;
+ if (writeFlag)
+ error = f->openRead();
+ else
+ error = f->openWrite();
+ if (error) {
+ fprintf(stderr, "open wave file(%s) for %s failed: %s\n",
+ name.toLatin1().data(),
+ writeFlag ? "writing" : "reading",
+ f->strerror().toLatin1().data());
+ delete f;
+ f = 0;
+ }
+ }
+ else {
+ if (writeFlag && ! f->isWritable()) {
+ if (f->isOpen())
+ f->close();
+ f->openWrite();
+ }
+ }
+ return f;
+ }
+
+//---------------------------------------------------------
+// applyUndoFile
+//---------------------------------------------------------
+void SndFile::applyUndoFile(const QString& original, const QString& tmpfile, unsigned startframe, unsigned endframe)
+ {
+ // This one is called on both undo and redo of a wavfile
+ // For redo to be called, undo must have been called first, and we don't store both the original data and the modified data in separate
+ // files. Thus, each time this function is called the data in the "original"-file will be written to the tmpfile, after the data
+ // from the tmpfile has been applied.
+ //
+ // F.ex. if mute has been made on part of a wavfile, the unmuted data is stored in the tmpfile when
+ // the undo operation occurs. The unmuted data is then written back to the original file, and the mute data will be
+ // put in the tmpfile, and when redo is eventually called the data is switched again (causing the muted data to be written to the "original"
+ // file. The data is merely switched.
+
+ //printf("Applying undofile: orig=%s tmpfile=%s startframe=%d endframe=%d\n", original.toLatin1().data(), tmpfile.toLatin1().data(), startframe, endframe);
+ SndFile* orig = sndFiles.value(original);
+ SndFile tmp = SndFile(tmpfile);
+ if (!orig) {
+ printf("Internal error: could not find original file: %s in filelist - Aborting\n", original.toLatin1().data());
+ return;
+ }
+
+ if (!orig->isOpen()) {
+ if (orig->openRead()) {
+ printf("Cannot open original file %s for reading - cannot undo! Aborting\n", original.toLatin1().data());
+ return;
+ }
+ }
+
+ if (!tmp.isOpen()) {
+ if (tmp.openRead()) {
+ printf("Could not open temporary file %s for writing - cannot undo! Aborting\n", tmpfile.toLatin1().data());
+ return;
+ }
+ }
+
+ audio->msgIdle(true);
+ tmp.setFormat(orig->format(), orig->channels(), orig->samplerate());
+
+ // Read data in original file to memory before applying tmpfile to original
+ unsigned file_channels = orig->channels();
+ unsigned tmpdatalen = endframe - startframe;
+ float* data2beoverwritten[file_channels];
+
+ for (unsigned i=0; i<file_channels; i++) {
+ data2beoverwritten[i] = new float[tmpdatalen];
+ }
+ orig->seek(startframe, 0);
+ orig->read(file_channels, data2beoverwritten, tmpdatalen);
+
+ orig->close();
+
+ // Read data from temporary file to memory
+ float* tmpfiledata[file_channels];
+ for (unsigned i=0; i<file_channels; i++) {
+ tmpfiledata[i] = new float[tmpdatalen];
+ }
+ tmp.seek(0, 0);
+ tmp.read(file_channels, tmpfiledata, tmpdatalen);
+ tmp.close();
+
+ // Write temporary data to original file:
+ if (orig->openWrite()) {
+ printf("Cannot open orig for write - aborting.\n");
+ return;
+ }
+
+ orig->seek(startframe, 0);
+ orig->write(file_channels, tmpfiledata, tmpdatalen);
+
+ // Delete dataholder for temporary file
+ for (unsigned i=0; i<file_channels; i++) {
+ delete[] tmpfiledata[i];
+ }
+
+ // Write the overwritten data to the tmpfile
+ if (tmp.openWrite()) {
+ printf("Cannot open tmpfile for writing - redo operation of this file won't be possible. Aborting.\n");
+ audio->msgIdle(false);
+ return;
+ }
+ tmp.seek(0, 0);
+ tmp.write(file_channels, data2beoverwritten, tmpdatalen);
+ tmp.close();
+
+ // Delete dataholder for replaced original file
+ for (unsigned i=0; i<file_channels; i++) {
+ delete[] data2beoverwritten[i];
+ }
+
+ orig->close();
+ orig->openRead();
+ orig->update();
+ audio->msgIdle(false);
+ }
+
+//---------------------------------------------------------
+// importAudio
+//---------------------------------------------------------
+
+void MusE::importWave()
+ {
+ Track* track = arranger->curTrack();
+ if (track == 0 || track->type() != Track::WAVE) {
+ QMessageBox::critical(this, QString("MusE"),
+ tr("to import a audio file you have first to select"
+ "a wave track"));
+ return;
+ }
+ QStringList pattern;
+ const char** p = audioFilePattern;
+ while (*p)
+ pattern << *p++;
+ QString fn = getOpenFileName(lastWavePath, pattern, this,
+ tr("Import Wave File"));
+ if (!fn.isEmpty()) {
+ QFileInfo qf(fn);
+ lastWavePath = qf.path();
+ importWave(fn);
+ }
+ }
+
+//---------------------------------------------------------
+// importWave
+//---------------------------------------------------------
+
+bool MusE::importWave(const QString& name)
+ {
+ WaveTrack* track = (WaveTrack*)(arranger->curTrack());
+ SndFile* f = SndFile::getWave(name, false);
+
+ if (f == 0) {
+ printf("import audio file failed\n");
+ return true;
+ }
+ int samples = f->samples();
+ track->setChannels(f->channels());
+
+ Part* part = new Part(track);
+ part->setType(AL::FRAMES);
+ part->setTick(song->cpos());
+ part->setLenFrame(samples);
+
+ Event event(Wave);
+ SndFileR sf(f);
+ event.setSndFile(sf);
+ event.setSpos(0);
+ event.setLenFrame(samples);
+ part->addEvent(event);
+
+ part->setName(QFileInfo(name).baseName());
+ audio->msgAddPart(part);
+ track->partListChanged(); // Updates the gui
+
+ unsigned endTick = part->tick() + part->lenTick();
+ if (song->len() < endTick)
+ song->setLen(endTick);
+ return false;
+ }
+
+bool MusE::importWaveToTrack(QString& name, Track* track)
+ {
+ SndFile* f = SndFile::getWave(name, false);
+
+ if (f == 0) {
+ printf("import audio file failed\n");
+ return true;
+ }
+ int samples = f->samples();
+ track->setChannels(f->channels());
+
+ Part* part = new Part((WaveTrack *)track);
+ part->setType(AL::FRAMES);
+ part->setTick(song->cpos());
+ part->setLenFrame(samples);
+
+ Event event(Wave);
+ SndFileR sf(f);
+ event.setSndFile(sf);
+ event.setSpos(0);
+ event.setLenFrame(samples);
+ part->addEvent(event);
+
+ part->setName(QFileInfo(name).baseName());
+ audio->msgAddPart(part);
+ unsigned endTick = part->tick() + part->lenTick();
+ if (song->len() < endTick)
+ song->setLen(endTick);
+ return false;
+ }
+
+//---------------------------------------------------------
+// cmdChangeWave
+// called from GUI context
+//---------------------------------------------------------
+void Song::cmdChangeWave(QString original, QString tmpfile, unsigned sx, unsigned ex)
+ {
+ char* original_charstr = new char[original.length() + 1];
+ char* tmpfile_charstr = new char[tmpfile.length() + 1];
+ strcpy(original_charstr, original.toLatin1().data());
+ strcpy(tmpfile_charstr, tmpfile.toLatin1().data());
+ song->undoOp(UndoOp::ModifyClip, original_charstr, tmpfile_charstr, sx, ex);
+ }
+
+//---------------------------------------------------------
+// SndFileR
+//---------------------------------------------------------
+
+SndFileR::SndFileR(SndFile* _sf)
+ {
+ sf = _sf;
+ if (sf)
+ (sf->refCount)++;
+ }
+
+SndFileR::SndFileR(const SndFileR& ed)
+ {
+ sf = ed.sf;
+ if (sf)
+ (sf->refCount)++;
+ }
+
+//---------------------------------------------------------
+// operator=
+//---------------------------------------------------------
+
+SndFileR& SndFileR::operator=(const SndFileR& ed)
+ {
+ if (sf == ed.sf)
+ return *this;
+ if (sf && --(sf->refCount) == 0)
+ delete sf;
+ sf = ed.sf;
+ if (sf)
+ (sf->refCount)++;
+ return *this;
+ }
+
+//---------------------------------------------------------
+// ~SndFileR
+//---------------------------------------------------------
+
+SndFileR::~SndFileR()
+ {
+ if (sf && --(sf->refCount) <= 0)
+ delete sf;
+ }
+
+//---------------------------------------------------------
+// createRecFile
+// create soundfile for recording
+//---------------------------------------------------------
+
+SndFile* SndFile::createRecFile(int channels)
+ {
+ QString fileName("%1/rec%2.wav");
+ QFileInfo fi;
+ do {
+ fi.setFile(fileName.arg(museProject).arg(recFileNumber));
+ ++recFileNumber;
+ } while (fi.exists());
+ SndFile* recFile = new SndFile(fi.absoluteFilePath());
+ recFile->setFormat(SF_FORMAT_WAV | SF_FORMAT_FLOAT, channels,
+ AL::sampleRate);
+ createdFiles.append(recFile);
+ return recFile;
+ }
+
+//---------------------------------------------------------
+// cleanupRecFiles
+// remove all record files which are not referenced
+// any more
+// this is called on exit
+//---------------------------------------------------------
+
+void SndFile::cleanupRecFiles(bool removeAll)
+ {
+ QList<SndFile*>* fl;
+ QList<SndFile*> removeFiles;
+
+ if (removeAll)
+ fl = &createdFiles;
+ else {
+ foreach (SndFile* s, createdFiles) {
+ bool remove = true;
+ WaveTrackList* wt = song->waves();
+ for (iWaveTrack iwt = wt->begin(); iwt != wt->end(); ++iwt) {
+ WaveTrack* t = *iwt;
+ PartList* parts = t->parts();
+ for (iPart ip = parts->begin(); ip != parts->end(); ++ip) {
+ Part* part = ip->second;
+ EventList* events = part->events();
+ for (iEvent ie = events->begin(); ie != events->end(); ++ie) {
+ if (ie->second.sndFile() == s) {
+ remove = false;
+ break;
+ }
+ }
+ }
+ if (t->recFile() && t->recFile()->samples() == 0) {
+ t->recFile()->remove();
+ }
+ }
+ if (remove)
+ removeFiles.append(s);
+ }
+ fl = &removeFiles;
+ }
+ foreach (SndFile* sf, *fl) {
+ printf("cleanup rec file <%s>\n", sf->finfo()->absoluteFilePath().toLatin1().data());
+ sf->remove();
+ }
+ createdFiles.clear();
+ }
+
+//---------------------------------------------------------
+// updateRecFiles
+// this is called on "save"
+// remove all saved wave files from list of potentially
+// to delete files
+//---------------------------------------------------------
+
+void SndFile::updateRecFiles()
+ {
+ QList<SndFile*> removeFiles;
+
+ foreach (SndFile* s, createdFiles) {
+ bool remove = true;
+ WaveTrackList* wt = song->waves();
+ for (iWaveTrack iwt = wt->begin(); iwt != wt->end(); ++iwt) {
+ WaveTrack* t = *iwt;
+ PartList* parts = t->parts();
+ for (iPart ip = parts->begin(); ip != parts->end(); ++ip) {
+ Part* part = ip->second;
+ EventList* events = part->events();
+ for (iEvent ie = events->begin(); ie != events->end(); ++ie) {
+ if (ie->second.sndFile() == s) {
+ remove = false;
+ break;
+ }
+ }
+ if (!remove)
+ break;
+ }
+ if (t->recFile() && t->recFile()->samples() == 0) {
+ t->recFile()->remove();
+ }
+ if (!remove)
+ break;
+ }
+ if (remove)
+ removeFiles.append(s);
+ }
+ createdFiles = removeFiles;
+ }
+
diff --git a/muse/muse/wave.h b/muse/muse/wave.h
new file mode 100644
index 00000000..0db8c27c
--- /dev/null
+++ b/muse/muse/wave.h
@@ -0,0 +1,160 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __WAVE_H__
+#define __WAVE_H__
+
+#include <sndfile.h>
+
+//---------------------------------------------------------
+// SampleV
+// peak file value
+//---------------------------------------------------------
+
+struct SampleV {
+ unsigned char peak;
+ unsigned char rms;
+ };
+
+class SndFile;
+
+class SndFileList : public QHash<QString, SndFile*> {
+ public:
+ SndFile* search(const QString& name) { return (*this)[name]; }
+ };
+
+//---------------------------------------------------------
+// SndFile
+//---------------------------------------------------------
+
+class SndFile {
+ static QHash<QString, SndFile*> sndFiles;
+ static QList<SndFile*> createdFiles;
+ static int recFileNumber;
+ QFileInfo _finfo;
+ SNDFILE* sf;
+ SF_INFO sfinfo;
+ SampleV** cache;
+ int csize; // frames in cache
+
+ void readCache(const QString& path, bool progress);
+ void writeCache(const QString& path);
+
+ bool openFlag;
+ bool writeFlag;
+
+ protected:
+ int refCount;
+
+ public:
+ SndFile(const QString& name);
+ ~SndFile();
+
+ static void applyUndoFile(const QString& original, const QString& tmpfile, unsigned sx, unsigned ex);
+
+ bool openRead(); // return true on error
+ bool openWrite(); // return true on error
+ void close();
+ void remove();
+
+ bool isOpen() const { return openFlag; }
+ bool isWritable() const { return writeFlag; }
+ void update();
+
+ QFileInfo* finfo() { return &_finfo; }
+
+ unsigned samples() const;
+ unsigned channels() const;
+ unsigned samplerate() const;
+ unsigned format() const;
+ int sampleBits() const;
+ void setFormat(int fmt, int ch, int rate);
+
+ size_t read(int channel, float**, size_t);
+ size_t write(int channel, float**, size_t);
+
+ off_t seek(off_t frames, int whence);
+ void read(SampleV* s, int mag, unsigned pos);
+ QString strerror() const;
+
+ static SndFile* createRecFile(int);
+ static void cleanupRecFiles(bool);
+ static void updateRecFiles();
+ static SndFile* search(const QString& name);
+ static SndFile* getWave(const QString& inName, bool writeFlag);
+
+ friend class SndFileR;
+ };
+
+//---------------------------------------------------------
+// SndFileR
+// SndFile with reference count
+//---------------------------------------------------------
+
+class SndFileR {
+ SndFile* sf;
+
+ public:
+ SndFileR() { sf = 0; }
+ SndFileR(SndFile* _sf);
+ SndFileR(const SndFileR& ed);
+ SndFileR& operator=(const SndFileR& ed);
+ bool operator==(const SndFileR& c) const { return sf == c.sf; }
+ bool operator==(SndFile* c) const { return sf == c; }
+ ~SndFileR();
+ int getRefCount() const { return sf->refCount; }
+ bool isNull() const { return sf == 0; }
+
+ bool openRead() { return sf->openRead(); }
+ bool openWrite() { return sf->openWrite(); }
+ void close() { sf->close(); }
+ void remove() { sf->remove(); }
+
+ bool isOpen() const { return sf->isOpen(); }
+ bool isWritable() const { return sf->isWritable(); }
+ void update() { sf->update(); }
+ QFileInfo* finfo() { return sf->finfo(); }
+ const QFileInfo* finfo() const { return sf->finfo(); }
+
+ unsigned samples() const { return sf->samples(); }
+ unsigned channels() const { return sf->channels(); }
+ unsigned samplerate() const { return sf->samplerate(); }
+ unsigned format() const { return sf->format(); }
+ int sampleBits() const { return sf->sampleBits(); }
+ void setFormat(int fmt, int ch, int rate) {
+ sf->setFormat(fmt, ch, rate);
+ }
+ size_t read(int channel, float** f, size_t n) {
+ return sf->read(channel, f, n);
+ }
+ size_t write(int channel, float** f, size_t n) {
+ return sf->write(channel, f, n);
+ }
+ off_t seek(off_t frames, int whence) {
+ return sf->seek(frames, whence);
+ }
+ void read(SampleV* s, int mag, unsigned pos) {
+ sf->read(s, mag, pos);
+ }
+ QString strerror() const { return sf->strerror(); }
+ };
+
+#endif
+
diff --git a/muse/muse/waveedit/waveedit.cpp b/muse/muse/waveedit/waveedit.cpp
new file mode 100644
index 00000000..8e94a134
--- /dev/null
+++ b/muse/muse/waveedit/waveedit.cpp
@@ -0,0 +1,213 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: waveedit.cpp,v 1.33 2006/02/10 16:40:59 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "waveedit.h"
+#include "waveview.h"
+#include "song.h"
+#include "awl/poslabel.h"
+#include "esettings.h"
+#include "al/tempo.h"
+#include "icons.h"
+#include "shortcuts.h"
+#include "wave.h"
+#include "part.h"
+#include "muse.h"
+
+int WaveEdit::_widthInit = 600;
+int WaveEdit::_heightInit = 400;
+
+//---------------------------------------------------------
+// WaveEdit
+//---------------------------------------------------------
+
+WaveEdit::WaveEdit(PartList* pl)
+ : Editor()
+ {
+ _parts = pl;
+ //---------Pulldown Menu----------------------------
+ QMenuBar* mb = menuBar();
+ QAction* a;
+
+ QMenu* menuFile = mb->addMenu(tr("&File"));
+ QMenu* menuEdit = mb->addMenu(tr("&Edit"));
+ menuFunctions = mb->addMenu(tr("Func&tions"));
+
+ menuGain = menuFunctions->addMenu(tr("&Gain"));
+ a = menuGain->addAction(tr("200%"));
+ a->setData(CMD_GAIN_200);
+ a = menuGain->addAction(tr("150%"));
+ a->setData(CMD_GAIN_150);
+ a = menuGain->addAction(tr("75%"));
+ a->setData(CMD_GAIN_75);
+ a = menuGain->addAction(tr("50%"));
+ a->setData(CMD_GAIN_50);
+ a = menuGain->addAction(tr("25%"));
+ a->setData(CMD_GAIN_25);
+ a = menuGain->addAction(tr("Other"));
+ a->setData(CMD_GAIN_FREE);
+ a = menuFunctions->addSeparator();
+
+ a = menuEdit->addAction(tr("Edit in E&xternal Editor"));
+ a->setData(CMD_EDIT_EXTERNAL);
+ a = menuFunctions->addAction(tr("Mute Selection"));
+ a->setData(CMD_MUTE);
+ a = menuFunctions->addAction(tr("Normalize Selection"));
+ a->setData(CMD_NORMALIZE);
+ a = menuFunctions->addAction(tr("Fade In Selection"));
+ a->setData(CMD_FADE_IN);
+ a = menuFunctions->addAction(tr("Fade Out Selection"));
+ a->setData(CMD_FADE_OUT);
+ a = menuFunctions->addAction(tr("Reverse Selection"));
+ a->setData(CMD_REVERSE);
+
+ select = menuEdit->addMenu(QIcon(*selectIcon), tr("Select"));
+ a = select->addAction(QIcon(*select_allIcon), tr("Select &All"));
+ a->setData(CMD_SELECT_ALL);
+ a = select->addAction(QIcon(*select_deselect_allIcon), tr("&Deselect All"));
+ a->setData(CMD_SELECT_NONE);
+
+
+ connect(menuFunctions, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+ connect(menuFile, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+ connect(select, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+ connect(menuGain, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+ connect(menuEdit, SIGNAL(triggered(QAction*)), SLOT(cmd(QAction*)));
+
+ //---------ToolBar----------------------------------
+ tools = addToolBar(tr("waveedit-tools"));
+ tools->addAction(undoAction);
+ tools->addAction(redoAction);
+
+ connect(muse, SIGNAL(configChanged()), SLOT(configChanged()));
+
+ //--------------------------------------------------
+ // Transport Bar
+ QToolBar* transport = addToolBar(tr("Transport"));
+ muse->setupTransportToolbar(transport);
+
+ //--------------------------------------------------
+ // ToolBar: Solo Cursor1 Cursor2
+
+ addToolBarBreak();
+ tb1 = addToolBar(tr("pianoroll-tools"));
+ solo = tb1->addAction(tr("Solo"));
+ solo->setCheckable(true);
+ connect(solo, SIGNAL(toggled(bool)), SLOT(soloChanged(bool)));
+
+ tb1->addWidget(new QLabel(tr("Cursor")));
+ pos1 = new PosLabel;
+ pos2 = new PosLabel;
+ pos2->setSmpte(true);
+ tb1->addWidget(pos1);
+ tb1->addWidget(pos2);
+
+ //---------------------------------------------------
+ // Rest
+ //---------------------------------------------------
+
+ if (!parts()->empty()) { // Roughly match total size of part
+ Part* firstPart = parts()->begin()->second;
+// xscale = 0 - firstPart->lenFrame()/_widthInit;
+ }
+
+ view = new WaveView(this);
+ view->setRaster(0);
+ connect(song, SIGNAL(posChanged(int,const AL::Pos&,bool)), view, SLOT(setLocatorPos(int,const AL::Pos&,bool)));
+ view->setLocatorPos(0, song->cpos(), true);
+ view->setLocatorPos(1, song->lpos(), false);
+ view->setLocatorPos(2, song->rpos(), false);
+// connect(view, SIGNAL(cursorPos(unsigned)), SIGNAL(setTime(unsigned)));
+ connect(view, SIGNAL(posChanged(int,const AL::Pos&)), song, SLOT(setPos(int,const AL::Pos&)));
+
+ setCentralWidget(view);
+ setWindowTitle(view->getCaption());
+
+ configChanged();
+// initSettings();
+ }
+
+//---------------------------------------------------------
+// configChanged
+//---------------------------------------------------------
+
+void WaveEdit::configChanged()
+ {
+// view->setBg(config.waveEditBackgroundColor);
+//TD select->setShortcut(shortcuts[SHRT_SELECT_ALL].key, CMD_SELECT_ALL);
+// select->setShortcut(shortcuts[SHRT_SELECT_NONE].key, CMD_SELECT_NONE);
+ }
+
+//---------------------------------------------------------
+// setTime
+//---------------------------------------------------------
+
+void WaveEdit::setTime(unsigned samplepos)
+ {
+// printf("setTime %d %x\n", samplepos, samplepos);
+ unsigned tick = AL::tempomap.frame2tick(samplepos);
+ pos1->setValue(tick, true);
+ pos2->setValue(tick, true);
+// time->setPos(3, tick, false);
+ }
+
+//---------------------------------------------------------
+// ~WaveEdit
+//---------------------------------------------------------
+
+WaveEdit::~WaveEdit()
+ {
+// undoRedo->removeFrom(tools);
+ }
+
+//---------------------------------------------------------
+// cmd
+//---------------------------------------------------------
+
+void WaveEdit::cmd(QAction* a)
+ {
+ view->cmd(a->data().toInt());
+ }
+
+//---------------------------------------------------------
+// soloChanged
+// signal from "song"
+//---------------------------------------------------------
+
+void WaveEdit::soloChanged(SNode*/* s*/)
+ {
+ Part* part = parts()->begin()->second;
+ solo->setChecked(part->track()->solo());
+ }
+
+//---------------------------------------------------------
+// soloChanged
+// signal from solo button
+//---------------------------------------------------------
+
+void WaveEdit::soloChanged(bool flag)
+ {
+ Part* part = parts()->begin()->second;
+ song->setSolo(part->track(), flag);
+ }
+
+//---------------------------------------------------------
+// viewKeyPressEvent
+//---------------------------------------------------------
+
+void WaveEdit::keyPressEvent(QKeyEvent* event)
+ {
+ int key = event->key();
+ if (key == Qt::Key_Escape) {
+ close();
+ return;
+ }
+ else {
+ event->ignore();
+ }
+ }
+
+
diff --git a/muse/muse/waveedit/waveedit.h b/muse/muse/waveedit/waveedit.h
new file mode 100644
index 00000000..010bc95a
--- /dev/null
+++ b/muse/muse/waveedit/waveedit.h
@@ -0,0 +1,65 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: waveedit.h,v 1.19 2006/02/01 22:44:40 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __WAVE_EDIT_H__
+#define __WAVE_EDIT_H__
+
+#include "midiedit/midieditor.h"
+
+class PartList;
+class WaveView;
+class ScrollScale;
+class SNode;
+
+namespace Awl {
+ class PosLabel;
+ };
+using Awl::PosLabel;
+
+//---------------------------------------------------------
+// WaveEdit
+//---------------------------------------------------------
+
+class WaveEdit : public Editor {
+ Q_OBJECT
+
+ PartList* _parts;
+ WaveView* view;
+ QToolBar* tools;
+ QToolBar* tb1;
+ QAction* solo;
+ PosLabel* pos1;
+ PosLabel* pos2;
+
+ static int _widthInit, _heightInit;
+
+ virtual void keyPressEvent(QKeyEvent*);
+
+ QMenu* menuFunctions, *select, *menuGain;
+
+ private slots:
+ void cmd(QAction*);
+ void setTime(unsigned t);
+ void soloChanged(SNode* s);
+ void soloChanged(bool flag);
+
+ public slots:
+ void configChanged();
+
+ public:
+ WaveEdit(PartList*);
+ ~WaveEdit();
+ PartList* parts() const { return _parts; }
+
+ enum { CMD_MUTE=0, CMD_NORMALIZE, CMD_FADE_IN, CMD_FADE_OUT, CMD_REVERSE,
+ CMD_GAIN_FREE, CMD_GAIN_200, CMD_GAIN_150, CMD_GAIN_75, CMD_GAIN_50, CMD_GAIN_25,
+ CMD_EDIT_EXTERNAL,
+ CMD_SELECT_ALL, CMD_SELECT_NONE };
+ };
+
+#endif
+
diff --git a/muse/muse/waveedit/waveview.cpp b/muse/muse/waveedit/waveview.cpp
new file mode 100644
index 00000000..84a187ad
--- /dev/null
+++ b/muse/muse/waveedit/waveview.cpp
@@ -0,0 +1,799 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: waveview.cpp,v 1.25 2006/02/01 22:44:40 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include <sys/wait.h>
+
+#include "waveview.h"
+#include "song.h"
+#include "midiedit/midieditor.h"
+#include "al/tempo.h"
+#include "event.h"
+#include "globals.h"
+#include "waveedit.h"
+#include "audio.h"
+#include "gconfig.h"
+#include "part.h"
+
+//---------------------------------------------------------
+// WaveView
+//---------------------------------------------------------
+
+WaveView::WaveView(WaveEdit* pr)
+ : TimeCanvas(TIME_CANVAS)
+ {
+ curPart = 0;
+ selectionStart = 0;
+ selectionStop = 0;
+ lastGainvalue = 100;
+ editor = pr;
+
+ if (editor->parts()->empty()) {
+ curPart = 0;
+ curPartId = -1;
+ }
+ else {
+ curPart = editor->parts()->begin()->second;
+ }
+
+ int start = curPart->frame();
+ int end = start + curPart->lenFrame();
+ setTimeRange(start, end);
+ }
+
+//---------------------------------------------------------
+// paint
+//---------------------------------------------------------
+
+void WaveView::paint(QPainter&, QRect)
+ {
+ printf("paint\n");
+ }
+
+//---------------------------------------------------------
+// draw
+//---------------------------------------------------------
+
+#if 0
+void WaveView::pdraw(QPainter& p, const QRect& rr)
+ {
+ int x1 = rr.x();
+ int x2 = rr.right() + 1;
+ if (x1 < 0)
+ x1 = 0;
+ if (x2 > width())
+ x2 = width();
+ int hh = height();
+ int h = hh/2;
+ int y = rr.y() + h;
+
+ for (iPart ip = editor->parts()->begin(); ip != editor->parts()->end(); ++ip) {
+ Part* wp = ip->second;
+ int channels = wp->track()->channels();
+ int px = wp->frame();
+
+ EventList* el = wp->events();
+ for (iEvent e = el->begin(); e != el->end(); ++e) {
+ Event event = e->second;
+ if (event.empty())
+ continue;
+ SndFileR f = event.sndFile();
+ if (f.isNull())
+ continue;
+ int xScale = xmag;
+ if (xScale < 0)
+ xScale = -xScale;
+
+ int sx, ex;
+ sx = event.frame() + px + xScale/2 - startSample;
+ ex = sx + px + event.lenFrame();
+ sx = sx / xScale - xpos;
+ ex = ex / xScale - xpos;
+
+ if (sx < x1)
+ sx = x1;
+ if (ex > x2)
+ ex = x2;
+
+ int pos = (xpos + sx) * xScale + event.spos() - event.frame() - px;
+ //printf("pos=%d xpos=%d sx=%d ex=%d xScale=%d event.spos=%d event.frame=%d px=%d\n",
+ // pos, xpos, sx, ex, xScale, event.spos(), event.frame(), px);
+ h = hh / (channels * 2);
+ int cc = hh % (channels * 2) ? 0 : 1;
+
+ for (int i = sx; i < ex; i++) {
+ y = rr.y() + h;
+ SampleV sa[f.channels()];
+ f.read(sa, xScale, pos);
+ pos += xScale;
+ if (pos < event.spos())
+ continue;
+
+ unsigned peoffset = px + event.frame() - event.spos();
+ int selectionStartPos = selectionStart - peoffset; // Offset transformed to event coords
+ int selectionStopPos = selectionStop - peoffset;
+
+
+
+ for (int k = 0; k < channels; ++k) {
+ int kk = k % f.channels();
+ int peak = (sa[kk].peak * (h - 1)) / yScale;
+ int rms = (sa[kk].rms * (h - 1)) / yScale;
+ if (peak > h)
+ peak = h;
+ if (rms > h)
+ rms = h;
+ QColor peak_color = QColor(Qt::darkGray);
+ QColor rms_color = QColor(Qt::black);
+ if (pos > selectionStartPos && pos < selectionStopPos) {
+ peak_color = QColor(Qt::lightGray);
+ rms_color = QColor(Qt::white);
+ // Draw inverted
+ p.setPen(QColor(Qt::black));
+ p.drawLine(i, y - h + cc, i, y + h - cc );
+ }
+ p.setPen(peak_color);
+ p.drawLine(i, y - peak - cc, i, y + peak);
+ p.setPen(rms_color);
+ p.drawLine(i, y - rms - cc, i, y + rms);
+ y += 2 * h;
+ }
+ }
+ }
+ }
+ View::pdraw(p, rr);
+ }
+#endif
+
+//---------------------------------------------------------
+// draw
+//---------------------------------------------------------
+
+#if 0
+void WaveView::draw(QPainter& p, const QRect& r)
+ {
+ unsigned x = r.x() < 0 ? 0 : r.x();
+ unsigned y = r.y() < 0 ? 0 : r.y();
+ int w = r.width();
+ int h = r.height();
+
+ unsigned x2 = x + w;
+ unsigned y2 = y + h;
+
+ //
+ // draw marker & centerline
+ //
+ p.setPen(Qt::red);
+ if (pos[0] >= x && pos[0] < x2) {
+ p.drawLine(pos[0], y, pos[0], y2);
+ }
+ p.setPen(Qt::blue);
+ if (pos[1] >= x && pos[1] < x2) {
+ p.drawLine(pos[1], y, pos[1], y2);
+ }
+ if (pos[2] >= x && pos[2] < x2)
+ p.drawLine(pos[2], y, pos[2], y2);
+
+ int n = curPart->track()->channels();
+ int hn = h / n;
+ int hh = hn / 2;
+ for (int i = 0; i < n; ++i) {
+ int h2 = hn * i;
+ int center = hh + h2;
+ p.setPen(QColor(i & i ? Qt::red : Qt::blue));
+ p.drawLine(x, center, x2, center);
+ p.setPen(QColor(Qt::black));
+ p.drawLine(x, h2, x2, h2);
+ }
+ }
+#endif
+
+//---------------------------------------------------------
+// getCaption
+//---------------------------------------------------------
+
+QString WaveView::getCaption() const
+ {
+ QString caption("MusE: WaveEditor");
+ if (curPart)
+ return caption + QString(": ") + curPart->name();
+ return caption;
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void WaveView::songChanged(int flags)
+ {
+#if 0
+ if (flags & SC_SELECTION) {
+ startSample = MAXINT;
+ endSample = 0;
+ curPart = 0;
+ for (iPart p = editor->parts()->begin(); p != editor->parts()->end(); ++p) {
+ Part* part = p->second;
+ if (part->sn() == curPartId)
+ curPart = part;
+ int ssample = part->frame();
+ int esample = ssample + part->lenFrame();
+ if (ssample < startSample) {
+ startSample = ssample;
+ //printf("startSample = %d\n", startSample);
+ }
+ if (esample > endSample) {
+ endSample = esample;
+ //printf("endSample = %d\n", endSample);
+ }
+ }
+ }
+ if (flags & SC_CLIP_MODIFIED) {
+ update(); // Boring, but the only thing possible to do
+ }
+ if (flags & SC_TEMPO) {
+ setPos(0, song->cpos(), false);
+ setPos(1, song->lpos(), false);
+ setPos(2, song->rpos(), false);
+ }
+ update();
+#endif
+ }
+
+//---------------------------------------------------------
+// viewMousePressEvent
+//---------------------------------------------------------
+
+void WaveView::viewMousePressEvent(QMouseEvent* event)
+ {
+#if 0
+ button = event->button();
+ unsigned x = event->x();
+
+ switch (button) {
+ case Qt::LeftButton:
+ if (mode == NORMAL) {
+ // redraw and reset:
+ if (selectionStart != selectionStop) {
+ selectionStart = selectionStop = 0;
+ update();
+ }
+ mode = DRAG;
+ dragstartx = x;
+ selectionStart = selectionStop = x;
+ }
+ break;
+
+ case Qt::MidButton:
+ case Qt::RightButton:
+ default:
+ break;
+ }
+ viewMouseMoveEvent(event);
+#endif
+ }
+
+//---------------------------------------------------------
+// viewMouseReleaseEvent
+//---------------------------------------------------------
+
+void WaveView::viewMouseReleaseEvent(QMouseEvent*)
+ {
+#if 0
+ button = Qt::NoButton;
+
+ if (mode == DRAG) {
+ mode = NORMAL;
+ //printf("selectionStart=%d selectionStop=%d\n", selectionStart, selectionStop);
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// viewMouseMoveEvent
+//---------------------------------------------------------
+
+void WaveView::viewMouseMoveEvent(QMouseEvent* event)
+ {
+#if 0
+ unsigned x = event->x();
+ emit timeChanged(x);
+
+ int i;
+ switch (button) {
+ case Qt::LeftButton:
+ i = 0;
+ if (mode == DRAG) {
+ if (x < dragstartx) {
+ selectionStart = x;
+ selectionStop = dragstartx;
+ }
+ else {
+ selectionStart = dragstartx;
+ selectionStop = x;
+ }
+ }
+ break;
+ case Qt::MidButton:
+ i = 1;
+ break;
+ case Qt::RightButton:
+ i = 2;
+ break;
+ default:
+ return;
+ }
+ Pos p(AL::tempomap.frame2tick(x), true);
+ song->setPos(i, p);
+#endif
+ }
+
+//---------------------------------------------------------
+// cmd
+//---------------------------------------------------------
+
+void WaveView::cmd(int n)
+ {
+#if 0
+ int modifyoperation = -1;
+ double paramA = 0.0;
+
+ switch(n) {
+ case WaveEdit::CMD_SELECT_ALL:
+ if (!editor->parts()->empty()) {
+ iPart iBeg = editor->parts()->begin();
+ iPart iEnd = editor->parts()->end();
+ iEnd--;
+ Part* beg = iBeg->second;
+ Part* end = iEnd->second;
+ selectionStart = beg->frame();
+ selectionStop = end->frame() + end->lenFrame();
+ update();
+ }
+ break;
+
+ case WaveEdit::CMD_EDIT_EXTERNAL:
+ modifyoperation = EDIT_EXTERNAL;
+ break;
+
+ case WaveEdit::CMD_SELECT_NONE:
+ selectionStart = selectionStop = 0;
+ update();
+ break;
+
+ case WaveEdit::CMD_MUTE:
+ modifyoperation = MUTE;
+ break;
+
+ case WaveEdit::CMD_NORMALIZE:
+ modifyoperation = NORMALIZE;
+ break;
+
+ case WaveEdit::CMD_FADE_IN:
+ modifyoperation = FADE_IN;
+ break;
+
+ case WaveEdit::CMD_FADE_OUT:
+ modifyoperation = FADE_OUT;
+ break;
+
+ case WaveEdit::CMD_REVERSE:
+ modifyoperation = REVERSE;
+ break;
+
+ case WaveEdit::CMD_GAIN_FREE: {
+ /*
+ EditGain* editGain = new EditGain(this, lastGainvalue);
+ if (editGain->exec() == QDialog::Accepted) {
+ lastGainvalue = editGain->getGain();
+ modifyoperation = GAIN;
+ paramA = (double)lastGainvalue / 100.0;
+ }
+ delete editGain;
+ */
+ printf("Free gain - todo!\n");
+ }
+ break;
+
+ case WaveEdit::CMD_GAIN_200:
+ modifyoperation = GAIN;
+ paramA = 2.0;
+ break;
+
+ case WaveEdit::CMD_GAIN_150:
+ modifyoperation = GAIN;
+ paramA = 1.5;
+ break;
+
+ case WaveEdit::CMD_GAIN_75:
+ modifyoperation = GAIN;
+ paramA = 0.75;
+ break;
+
+ case WaveEdit::CMD_GAIN_50:
+ modifyoperation = GAIN;
+ paramA = 0.5;
+ break;
+
+ case WaveEdit::CMD_GAIN_25:
+ modifyoperation = GAIN;
+ paramA = 0.25;
+ break;
+
+ default:
+ break;
+ }
+
+ if (modifyoperation != -1) {
+ if (selectionStart == selectionStop) {
+ printf("No selection. Ignoring\n"); //@!TODO: Disable menu options when no selection
+ return;
+ }
+ modifySelection(modifyoperation, selectionStart, selectionStop, paramA);
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// getSelection
+//---------------------------------------------------------
+
+WaveSelectionList WaveView::getSelection(unsigned startpos, unsigned stoppos)
+ {
+ WaveSelectionList selection;
+#if 0
+ for (iPart ip = editor->parts()->begin(); ip != editor->parts()->end(); ++ip) {
+ Part* wp = ip->second;
+ unsigned part_offset = wp->frame();
+ EventList* el = wp->events();
+
+ for (iEvent e = el->begin(); e != el->end(); ++e) {
+ Event event = e->second;
+ if (event.empty())
+ continue;
+ SndFileR file = event.sndFile();
+ if (file.isNull())
+ continue;
+
+ unsigned event_offset = event.frame() + part_offset;
+ unsigned event_startpos = event.spos();
+ unsigned event_length = event.lenFrame() + event.spos();
+ unsigned event_end = event_offset + event_length;
+ //printf("startpos=%d stoppos=%d part_offset=%d event_offset=%d event_startpos=%d event_length=%d event_end=%d\n", startpos, stoppos, part_offset, event_offset, event_startpos, event_length, event_end);
+
+ if (!(event_end <= startpos || event_offset >= stoppos)) {
+ int tmp_sx = startpos - event_offset + event_startpos;
+ int tmp_ex = stoppos - event_offset + event_startpos;
+ unsigned sx;
+ unsigned ex;
+
+ tmp_sx < (int)event_startpos ? sx = event_startpos : sx = tmp_sx;
+ tmp_ex > (int)event_length ? ex = event_length : ex = tmp_ex;
+
+ //printf("Event data affected: %d->%d filename:%s\n", sx, ex, file.name().toLatin1().data());
+ WaveEventSelection s;
+ s.file = file;
+ s.startframe = sx;
+ s.endframe = ex;
+ selection.push_back(s);
+ }
+ }
+ }
+#endif
+ return selection;
+ }
+
+//---------------------------------------------------------
+// modifySelection
+//---------------------------------------------------------
+
+void WaveView::modifySelection(int operation, unsigned startpos, unsigned stoppos, double paramA)
+ {
+#if 0
+ song->startUndo();
+
+ WaveSelectionList selection = getSelection(startpos, stoppos);
+ for (iWaveSelection i = selection.begin(); i != selection.end(); i++) {
+ WaveEventSelection w = *i;
+ SndFileR& file = w.file;
+ unsigned sx = w.startframe;
+ unsigned ex = w.endframe;
+ unsigned file_channels = file.channels();
+
+ QString tmpWavFile = QString::null;
+ if (!getUniqueTmpfileName(tmpWavFile)) {
+ break;
+ }
+
+ audio->msgIdle(true); // Not good with playback during operations
+ SndFile tmpFile(tmpWavFile);
+ tmpFile.setFormat(file.format(), file_channels, file.samplerate());
+ if (tmpFile.openWrite()) {
+ audio->msgIdle(false);
+ printf("Could not open temporary file...\n");
+ break;
+ }
+
+ //
+ // Write out data that will be changed to temp file
+ //
+ unsigned tmpdatalen = ex - sx;
+ off_t tmpdataoffset = sx;
+ float* tmpdata[file_channels];
+
+ for (unsigned i=0; i<file_channels; i++) {
+ tmpdata[i] = new float[tmpdatalen];
+ }
+
+ file.seek(tmpdataoffset, 0);
+ file.read(file_channels, tmpdata, tmpdatalen);
+ file.close();
+ tmpFile.write(file_channels, tmpdata, tmpdatalen);
+ tmpFile.close();
+
+ switch(operation)
+ {
+ case MUTE:
+ muteSelection(file_channels, tmpdata, tmpdatalen);
+ break;
+
+ case NORMALIZE:
+ normalizeSelection(file_channels, tmpdata, tmpdatalen);
+ break;
+
+ case FADE_IN:
+ fadeInSelection(file_channels, tmpdata, tmpdatalen);
+ break;
+
+ case FADE_OUT:
+ fadeOutSelection(file_channels, tmpdata, tmpdatalen);
+ break;
+
+ case REVERSE:
+ reverseSelection(file_channels, tmpdata, tmpdatalen);
+ break;
+
+ case GAIN:
+ applyGain(file_channels, tmpdata, tmpdatalen, paramA);
+ break;
+
+ case EDIT_EXTERNAL:
+ editExternal(file.format(), file.samplerate(), file_channels, tmpdata, tmpdatalen);
+ break;
+
+ default:
+ printf("Error: Default state reached in modifySelection\n");
+ break;
+
+ }
+
+ file.openWrite();
+ file.seek(tmpdataoffset, 0);
+ file.write(file_channels, tmpdata, tmpdatalen);
+ file.update();
+ file.close();
+ file.openRead();
+
+ for (unsigned i=0; i<file_channels; i++) {
+ delete[] tmpdata[i];
+ }
+
+ // Undo handling
+ song->cmdChangeWave(file.dirPath() + "/" + file.name(), tmpWavFile, sx, ex);
+ audio->msgIdle(false); // Not good with playback during operations
+ }
+ song->endUndo(SC_CLIP_MODIFIED);
+ update();
+#endif
+ }
+
+//---------------------------------------------------------
+// muteSelection
+//---------------------------------------------------------
+
+void WaveView::muteSelection(unsigned channels, float** data, unsigned length)
+ {
+#if 0
+ // Set everything to 0!
+ for (unsigned i=0; i<channels; i++) {
+ for (unsigned j=0; j<length; j++) {
+ data[i][j] = 0;
+ }
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// normalizeSelection
+//---------------------------------------------------------
+
+void WaveView::normalizeSelection(unsigned channels, float** data, unsigned length)
+ {
+#if 0
+ float loudest = 0.0;
+
+ for (unsigned i=0; i<channels; i++) {
+ for (unsigned j=0; j<length; j++) {
+ if (data[i][j] > loudest)
+ loudest = data[i][j];
+ }
+ }
+
+ double scale = 0.99 / (double)loudest;
+
+ for (unsigned i=0; i<channels; i++) {
+ for (unsigned j=0; j<length; j++) {
+ data[i][j] = (float) ((double)data[i][j] * scale);
+ }
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// fadeInSelection
+//---------------------------------------------------------
+
+void WaveView::fadeInSelection(unsigned channels, float** data, unsigned length)
+ {
+#if 0
+ for (unsigned i=0; i<channels; i++) {
+ for (unsigned j=0; j<length; j++) {
+ double scale = (double) j / (double)length ;
+ data[i][j] = (float) ((double)data[i][j] * scale);
+ }
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// fadeOutSelection
+//---------------------------------------------------------
+
+void WaveView::fadeOutSelection(unsigned channels, float** data, unsigned length)
+ {
+#if 0
+ for (unsigned i=0; i<channels; i++) {
+ for (unsigned j=0; j<length; j++) {
+ double scale = (double) (length - j) / (double)length ;
+ data[i][j] = (float) ((double)data[i][j] * scale);
+ }
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// reverseSelection
+//---------------------------------------------------------
+
+void WaveView::reverseSelection(unsigned channels, float** data, unsigned length)
+ {
+ for (unsigned i=0; i<channels; i++) {
+ for (unsigned j=0; j<length/2; j++) {
+ float tmpl = data[i][j];
+ float tmpr = data[i][length - j];
+ data[i][j] = tmpr;
+ data[i][length - j] = tmpl;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// applyGain
+//---------------------------------------------------------
+
+void WaveView::applyGain(unsigned channels, float** data, unsigned length, double gain)
+ {
+ for (unsigned i=0; i<channels; i++) {
+ for (unsigned j=0; j<length; j++) {
+ data[i][j] = (float) ((double)data[i][j] * gain);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// editExternal
+//---------------------------------------------------------
+
+void WaveView::editExternal(unsigned file_format, unsigned file_samplerate, unsigned file_channels, float** tmpdata, unsigned tmpdatalen)
+ {
+ // Create yet another tmp-file
+ QString exttmpFileName;
+ if (!getUniqueTmpfileName(exttmpFileName)) {
+ printf("Could not create temp file - aborting...\n");
+ return;
+ }
+
+ SndFile exttmpFile(exttmpFileName);
+ exttmpFile.setFormat(file_format, file_channels, file_samplerate);
+ if (exttmpFile.openWrite()) {
+ printf("Could not open temporary file...\n");
+ return;
+ }
+ // Write out change-data to this file:
+ exttmpFile.write(file_channels, tmpdata, tmpdatalen);
+ exttmpFile.close();
+
+ // Forkaborkabork
+ int pid = vfork();
+ if (pid == 0) {
+ if (execlp(config.externalWavEditor.toLatin1().data(), "", exttmpFileName.toLatin1().data(), NULL) == -1) {
+ perror("Failed to launch external editor");
+ // Get out of here
+ exit(-1);
+ }
+ //@!TODO: Handle unsuccessful attempts
+ }
+ else if (pid == -1) {
+ perror("fork failed");
+ }
+ else {
+ waitpid(pid, 0, 0);
+ if (exttmpFile.openRead()) {
+ printf("Could not reopen temporary file again!\n");
+ }
+ else {
+ // Re-read file again
+ exttmpFile.seek(0, 0);
+ size_t sz = exttmpFile.read(file_channels, tmpdata, tmpdatalen);
+ if (sz != tmpdatalen) {
+ // File must have been shrunken - not good. Alert user.
+ QMessageBox::critical(this, tr("MusE - file size changed"),
+ tr("When editing in external editor - you should not change the filesize\nsince it must fit the selected region.\n\nMissing data is muted"));
+ for (unsigned i=0; i<file_channels; i++) {
+ for (unsigned j=sz; j<tmpdatalen; j++) {
+ tmpdata[i][j] = 0;
+ }
+ }
+ }
+ }
+ QDir dir = exttmpFile.finfo()->absolutePath();
+ dir.remove(exttmpFileName);
+ dir.remove(exttmpFile.finfo()->baseName() + ".wca");
+ }
+ }
+
+//---------------------------------------------------------
+// getUniqueTmpfileName
+//---------------------------------------------------------
+
+bool WaveView::getUniqueTmpfileName(QString& newFilename)
+ {
+ // Check if tmp-directory exists under project path
+ QString tmpWavDir = museProject + "/tmp_musewav"; //!@TODO: Don't hardcode like this
+ QFileInfo tmpdirfi(tmpWavDir);
+ if (!tmpdirfi.isDir()) {
+ // Try to create a tmpdir
+ QDir projdir(museProject);
+ if (!projdir.mkdir("tmp_musewav")) {
+ printf("Could not create undo dir!\n");
+ return false;
+ }
+ }
+
+
+ tmpdirfi.setFile(tmpWavDir);
+
+ if (!tmpdirfi.isWritable()) {
+ printf("Temp directory is not writable - aborting\n");
+ return false;
+ }
+
+ QDir tmpdir = tmpdirfi.dir();
+
+ // Find a new filename
+ for (int i=0; i<10000; i++) {
+ QString filename = "muse_tmp";
+ filename.append(QString::number(i));
+ filename.append(".wav");
+
+ if (!tmpdir.exists(tmpWavDir +"/" + filename)) {
+ newFilename = tmpWavDir + "/" + filename;
+ return true;
+ }
+ }
+
+ printf("Could not find a suitable tmpfilename (more than 10000 tmpfiles in tmpdir - clean up!\n");
+ return false;
+ }
diff --git a/muse/muse/waveedit/waveview.h b/muse/muse/waveedit/waveview.h
new file mode 100644
index 00000000..dc3e5016
--- /dev/null
+++ b/muse/muse/waveedit/waveview.h
@@ -0,0 +1,89 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: waveview.h,v 1.11 2006/02/01 22:44:40 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef WAVE_VIEW_H
+#define WAVE_VIEW_H
+
+#include "wave.h"
+#include "awl/tcanvas.h"
+
+class PartList;
+class QPainter;
+class QRect;
+class Part;
+class WaveEdit;
+class GraphMidiEditor;
+
+//---------------------------------------------------------
+// WaveEventSelection
+//---------------------------------------------------------
+
+struct WaveEventSelection {
+ SndFileR file;
+ unsigned startframe;
+ unsigned endframe;
+ };
+
+typedef std::list<WaveEventSelection> WaveSelectionList;
+typedef std::list<WaveEventSelection>::iterator iWaveSelection;
+
+//---------------------------------------------------------
+// WaveView
+//---------------------------------------------------------
+
+class WaveView : public TimeCanvas {
+ WaveEdit* editor;
+
+ int startSample;
+ int endSample;
+
+ Part* curPart;
+ int curPartId;
+
+ enum { NORMAL, DRAG } mode;
+ enum { MUTE = 0, NORMALIZE, FADE_IN, FADE_OUT, REVERSE, GAIN, EDIT_EXTERNAL }; //!< Modify operations
+
+ unsigned selectionStart, selectionStop, dragstartx;
+
+ Q_OBJECT
+ virtual void paint(QPainter&, QRect);
+
+// virtual void pdraw(QPainter&, const QRect&);
+// virtual void draw(QPainter&, const QRect&);
+
+ virtual void viewMousePressEvent(QMouseEvent*);
+ virtual void viewMouseMoveEvent(QMouseEvent*);
+ virtual void viewMouseReleaseEvent(QMouseEvent*);
+
+ bool getUniqueTmpfileName(QString& newFilename); //!< Generates unique filename for temporary SndFile
+ WaveSelectionList getSelection(unsigned startpos, unsigned stoppos);
+
+ int lastGainvalue; //!< Stores the last used gainvalue when specifiying gain value in the editgain dialog
+ void modifySelection(int operation, unsigned startpos, unsigned stoppos, double paramA); //!< Modifies selection
+
+ void muteSelection(unsigned channels, float** data, unsigned length); //!< Mutes selection
+ void normalizeSelection(unsigned channels, float** data, unsigned length); //!< Normalizes selection
+ void fadeInSelection(unsigned channels, float** data, unsigned length); //!< Linear fade in of selection
+ void fadeOutSelection(unsigned channels, float** data, unsigned length); //!< Linear fade out of selection
+ void reverseSelection(unsigned channels, float** data, unsigned length); //!< Reverse selection
+ void applyGain(unsigned channels, float** data, unsigned length, double gain); //!< Apply gain to selection
+
+ void editExternal(unsigned file_format, unsigned file_samplerate, unsigned channels, float** data, unsigned length);
+
+ //void applyLadspa(unsigned channels, float** data, unsigned length); //!< Apply LADSPA plugin on selection
+
+ public slots:
+ void songChanged(int type);
+
+ public:
+ WaveView(WaveEdit*);
+ QString getCaption() const;
+ void cmd(int n);
+ };
+
+#endif
+
diff --git a/muse/muse/waveevent.cpp b/muse/muse/waveevent.cpp
new file mode 100644
index 00000000..eee863c2
--- /dev/null
+++ b/muse/muse/waveevent.cpp
@@ -0,0 +1,133 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "globals.h"
+#include "event.h"
+#include "waveevent.h"
+#include "al/xml.h"
+#include "wave.h"
+
+//---------------------------------------------------------
+// WaveEvent
+//---------------------------------------------------------
+
+WaveEventBase::WaveEventBase(EventType t)
+ : EventBase(t)
+ {
+ ipos = -1;
+ deleted = false;
+ }
+
+//---------------------------------------------------------
+// WaveEvent::mid
+//---------------------------------------------------------
+
+EventBase* WaveEventBase::mid(unsigned b, unsigned e)
+ {
+ WaveEventBase* ev = new WaveEventBase(*this);
+
+ int offset = b - frame();
+ unsigned end = endFrame();
+ if (e < end)
+ end = e;
+
+ int len = end - b;
+ ev->setFrame(b);
+ ev->setLenFrame(len);
+ ev->setSpos(spos() + offset);
+ return ev;
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void WaveEventBase::dump(int n) const
+ {
+ EventBase::dump(n);
+ }
+
+//---------------------------------------------------------
+// WaveEventBase::read
+//---------------------------------------------------------
+
+void WaveEventBase::read(QDomNode node)
+ {
+ node = node.firstChild();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.tagName() == "poslen")
+ PosLen::read(node);
+ else if (e.tagName() == "frame")
+ _spos = e.text().toInt();
+ else if (e.tagName() == "file") {
+ SndFile* wf = SndFile::getWave(e.text(), false);
+ if (wf)
+ f = SndFileR(wf);
+ }
+ else
+ printf("MusE:WaveEventBase: unknown tag %s\n", e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ Pos::setType(AL::FRAMES);
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void WaveEventBase::write(Xml& xml, const Pos& offset) const
+ {
+ if (f.isNull())
+ return;
+ xml.tag("event");
+ PosLen wpos(*this);
+ wpos += offset;
+// if (offset)
+// wpos.setTick(wpos.tick() + offset);
+ wpos.write(xml, "poslen");
+ xml.intTag("frame", _spos); // offset in wave file
+
+ //
+ // waves in the project dirctory are stored
+ // with relative path name, others with absolute path
+ //
+ QString path = f.finfo()->absolutePath();
+ if (path == museProject)
+ xml.strTag("file", f.finfo()->fileName());
+ else
+ xml.strTag("file", f.finfo()->filePath());
+ xml.etag("event");
+ }
+
+void WaveEventBase::read(unsigned offset, float** buffer, int channel, int n)
+ {
+ if (f.isNull())
+ return;
+/* if (ipos != -1 && ipos != (offset + _spos))
+ printf("Wave seek %d-%d = %d\n",
+ offset + _spos, ipos, offset + _spos - ipos);
+ */
+ f.seek(offset + _spos, 0);
+ f.read(channel, buffer, n);
+
+// ipos = offset + _spos + n;
+ }
+
diff --git a/muse/muse/waveevent.h b/muse/muse/waveevent.h
new file mode 100644
index 00000000..161effd0
--- /dev/null
+++ b/muse/muse/waveevent.h
@@ -0,0 +1,59 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __WAVE_EVENT_H__
+#define __WAVE_EVENT_H__
+
+#include "eventbase.h"
+
+//---------------------------------------------------------
+// WaveEvent
+//---------------------------------------------------------
+
+class WaveEventBase : public EventBase {
+ QString _name;
+ SndFileR f;
+ int _spos; // start sample position in WaveFile
+ int ipos;
+ bool deleted;
+
+ virtual EventBase* clone() { return new WaveEventBase(*this); }
+
+ public:
+ WaveEventBase(EventType t);
+ virtual ~WaveEventBase() {}
+
+ virtual void read(QDomNode);
+ virtual void write(Xml&, const Pos& offset) const;
+ virtual EventBase* mid(unsigned, unsigned);
+ virtual void dump(int n = 0) const;
+
+
+ virtual const QString name() const { return _name; }
+ virtual void setName(const QString& s) { _name = s; }
+ virtual int spos() const { return _spos; }
+ virtual void setSpos(int s) { _spos = s; }
+ virtual SndFileR sndFile() const { return f; }
+ virtual void setSndFile(SndFileR& sf) { f = sf; }
+ virtual void read(unsigned offset, float** bpp, int channels, int nn);
+ };
+
+#endif
+
diff --git a/muse/muse/wavetrack.cpp b/muse/muse/wavetrack.cpp
new file mode 100644
index 00000000..80e2ae84
--- /dev/null
+++ b/muse/muse/wavetrack.cpp
@@ -0,0 +1,414 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "wavetrack.h"
+#include "event.h"
+#include "audio.h"
+#include "wave.h"
+#include "al/xml.h"
+#include "song.h"
+#include "globals.h"
+#include "part.h"
+#include "audiowriteback.h"
+#include "muse.h"
+#include "audioprefetch.h"
+
+bool WaveTrack::firstWaveTrack = true;
+
+//---------------------------------------------------------
+// WaveTrack
+//---------------------------------------------------------
+
+WaveTrack::WaveTrack()
+ : AudioTrack(Track::WAVE)
+ {
+ //
+ // allocate prefetch buffer
+ //
+ float* p = new float[FIFO_BUFFER * segmentSize * MAX_CHANNELS];
+ float** pp = new float*[FIFO_BUFFER * MAX_CHANNELS];
+
+ for (int i = 0; i < FIFO_BUFFER; ++i) {
+ readBuffer[i] = pp;
+ for (int k = 0; k < MAX_CHANNELS; ++k) {
+ *pp = p;
+ p += segmentSize;
+ ++pp;
+ }
+ }
+
+ recordPart = 0; // part we are recording into
+ }
+
+//---------------------------------------------------------
+// WaveTrack
+//---------------------------------------------------------
+
+WaveTrack::~WaveTrack()
+ {
+ delete[] *readBuffer[0];
+ delete[] readBuffer[0];
+ }
+
+//---------------------------------------------------------
+// fetchData
+// called from prefetch thread
+//---------------------------------------------------------
+
+void WaveTrack::fetchData(unsigned pos, unsigned samples, float** bp)
+ {
+ for (int i = 0; i < channels(); ++i)
+ memset(bp[i], 0, samples * sizeof(float));
+ PartList* pl = parts();
+
+ for (iPart ip = pl->begin(); ip != pl->end(); ++ip) {
+ Part* part = ip->second;
+ if (part->mute())
+ continue;
+ unsigned p_spos = part->frame();
+ if (pos + samples < p_spos)
+ break;
+ unsigned p_epos = p_spos + part->lenFrame();
+ if (pos >= p_epos)
+ continue;
+
+ EventList* events = part->events();
+ for (iEvent ie = events->begin(); ie != events->end(); ++ie) {
+ Event& event = ie->second;
+
+ unsigned e_spos = event.frame() + p_spos;
+ if (pos + samples < e_spos)
+ break;
+ unsigned nn = event.lenFrame();
+ unsigned e_epos = e_spos + nn;
+ if (pos >= e_epos)
+ continue;
+
+ int offset = e_spos - pos;
+
+ unsigned srcOffset, dstOffset;
+ if (offset > 0) {
+ nn = samples - offset;
+ srcOffset = 0;
+ dstOffset = offset;
+ }
+ else {
+ srcOffset = -offset;
+ dstOffset = 0;
+ nn -= offset;
+ if (nn > samples)
+ nn = samples;
+ }
+ float* bpp[channels()];
+ for (int i = 0; i < channels(); ++i)
+ bpp[i] = bp[i] + dstOffset;
+
+ event.read(srcOffset, bpp, channels(), nn);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void WaveTrack::write(Xml& xml) const
+ {
+ xml.tag("wavetrack");
+ AudioTrack::writeProperties(xml);
+ const PartList* pl = cparts();
+ for (ciPart p = pl->begin(); p != pl->end(); ++p)
+ p->second->write(xml);
+ xml.etag("wavetrack");
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void WaveTrack::read(QDomNode node)
+ {
+ for (; !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ if (e.tagName() == "part") {
+ Part* p = newPart();
+ p->read(node.firstChild());
+ parts()->add(p);
+ }
+ else if (AudioTrack::readProperties(node))
+ printf("MusE:WaveTrack: unknown tag %s\n", e.tagName().toLatin1().data());
+ }
+ }
+
+//---------------------------------------------------------
+// newPart
+//---------------------------------------------------------
+
+Part* WaveTrack::newPart(Part*p, bool clone)
+ {
+ Part* part = clone ? new Part(this, p->events()) : new Part(this);
+ if (p) {
+ part->setName(p->name());
+ part->setColorIndex(p->colorIndex());
+
+ *(AL::PosLen*)part = *(AL::PosLen*)p;
+ part->setMute(p->mute());
+ }
+ return part;
+ }
+
+//---------------------------------------------------------
+// setChannels
+//---------------------------------------------------------
+
+void WaveTrack::setChannels(int n)
+ {
+ AudioTrack::setChannels(n);
+ SndFile* sf = recFile();
+ if (sf) {
+ if (sf->samples() == 0) {
+ sf->remove();
+ sf->setFormat(sf->format(), _channels,
+ sf->samplerate());
+ sf->openWrite();
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// startRecording
+// gui context
+//---------------------------------------------------------
+
+void WaveTrack::startRecording()
+ {
+ AudioTrack::startRecording(); // create file
+ partCreated = false;
+ AL::Pos start = song->punchin() ? song->lPos() : song->cPos();
+
+ // search for recordPart
+ recordPart = 0;
+ for (iPart ip = parts()->begin(); ip != parts()->end(); ++ip) {
+ Part* part = ip->second;
+ unsigned partStart = part->tick();
+ unsigned partEnd = partStart + part->lenTick();
+ if (start.tick() >= partStart && start.tick() < partEnd) {
+ recordPart = part;
+ break;
+ }
+ }
+ if (recordPart == 0) {
+ //
+ // create new part for recording
+ //
+ recordPart = new Part(this);
+ recordPart->setType(AL::FRAMES);
+ Pos spos(start.downSnaped(muse->raster()));
+ Pos epos(start.upSnaped(muse->raster()));
+ recordPart->setPos(spos);
+ recordPart->setLenTick(epos.tick() - spos.tick());
+ recordPart->setName(name());
+ audio->msgAddPart(recordPart, false);
+ partCreated = true;
+ emit partsChanged();
+ }
+ }
+
+//---------------------------------------------------------
+// recordBeat
+// gui context
+// update current recording
+//---------------------------------------------------------
+
+void WaveTrack::recordBeat()
+ {
+ if (partCreated) {
+ int cpos = song->cpos();
+ int ptick = recordPart->tick();
+ recordPart->setLenTick(cpos - ptick);
+ song->addUpdateFlags(SC_PART_MODIFIED);
+ }
+ }
+
+//---------------------------------------------------------
+// stopRecording
+// gui context
+//---------------------------------------------------------
+
+void WaveTrack::stopRecording(const Pos& s, const Pos& e)
+ {
+ int updateFlags = 0;
+
+ while(audioWriteback->active())
+ sleep(1);
+ _recFile->update();
+
+ // create Event
+ Event event(Wave);
+ SndFileR sf(_recFile);
+ event.setSndFile(sf);
+ event.setPos(s - *recordPart);
+ event.setSpos(0);
+ event.setLenFrame(e.frame() - s.frame());
+ // recordPart->addEvent(event);
+ audio->msgAddEvent(event, recordPart, false);
+
+ _recFile = 0;
+
+ //
+ // adjust part len && song len
+ //
+ unsigned etick = e.upSnaped(muse->raster()).tick();
+ unsigned len = etick - recordPart->tick();
+
+ if (recordPart->lenTick() < len) {
+ recordPart->setLenTick(len);
+ updateFlags |= SC_PART_MODIFIED;
+ }
+
+ if (song->len() < etick)
+ song->setLen(etick);
+ song->update(updateFlags);
+ }
+
+//---------------------------------------------------------
+// canEnableRecord
+//---------------------------------------------------------
+
+bool WaveTrack::canEnableRecord() const
+ {
+ return (!noInRoute() || (this == song->bounceTrack));
+ }
+
+//---------------------------------------------------------
+// collectInputData
+//---------------------------------------------------------
+
+void WaveTrack::collectInputData()
+ {
+ bufferEmpty = false;
+ if (recordFlag() && (audio->isRecording() || !audio->isPlaying())) {
+ if (song->bounceTrack == this && audio->isPlaying()) {
+ OutputList* ol = song->outputs();
+ if (!ol->empty())
+ ol->front()->multiplyCopy(channels(), buffer);
+ }
+ else
+ AudioTrack::collectInputData();
+ return;
+ }
+ if (!audio->isPlaying()) {
+ for (int i = 0; i < channels(); ++i)
+ memset(buffer[i], 0, sizeof(float) * segmentSize);
+ return;
+ }
+
+ unsigned framePos = audio->pos().frame();
+ if (audio->freewheel()) {
+ // when freewheeling, read data direct from file:
+ fetchData(framePos, segmentSize, buffer);
+ }
+ else {
+ int idx = audio->curReadIndex();
+ if (idx == -1) {
+ for (int i = 0; i < channels(); ++i)
+ memset(buffer[i], 0, sizeof(float) * segmentSize);
+ }
+ else {
+ float** bpp = readBuffer[idx];
+ for (int i = 0; i < channels(); ++i)
+ memcpy(buffer[i], bpp[i], sizeof(float) * segmentSize);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void WaveTrack::process()
+ {
+ AudioTrack::process();
+
+ //
+ // record collected data for track
+ //
+ if (recordFlag() && audio->isRecording() && recFile()) {
+ unsigned framePos = audio->pos().frame();
+ if (audio->freewheel()) {
+ // write data directly to file
+ _recFile->write(channels(), buffer, framePos);
+ }
+ else {
+ if (fifo.put(channels(), segmentSize, buffer, framePos)) {
+ printf("WaveTrack(%s)::getData: fifo overrun\n",
+ name().toLatin1().data());
+ }
+ }
+ if (!_monitor) {
+ //
+ // end data processing here if monitor is not on
+ //
+ bufferEmpty = true;
+ }
+ return;
+ }
+ if (!audio->isPlaying() && !_monitor)
+ bufferEmpty = true;
+ }
+
+//---------------------------------------------------------
+// clone
+//---------------------------------------------------------
+
+void WaveTrack::clone(WaveTrack* t)
+ {
+ QString name;
+ for (int i = 1; ; ++i) {
+ name.sprintf("%s-%d", t->name().toLatin1().data(), i);
+ TrackList* tl = song->tracks();
+ bool found = false;
+ for (iTrack it = tl->begin(); it != tl->end(); ++it) {
+ if ((*it)->name() == name) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ break;
+ }
+ setName(name);
+
+ _recordFlag = t->_recordFlag;
+ _mute = t->_mute;
+ _solo = t->_solo;
+ _off = t->_off;
+ _monitor = t->_monitor;
+ _channels = t->_channels;
+ _locked = t->_locked;
+ _inRoutes = t->_inRoutes;
+ _outRoutes = t->_outRoutes;
+ _controller = t->_controller;
+ _autoRead = t->_autoRead;
+ _autoWrite = t->_autoWrite;
+ setPrefader(t->prefader());
+ }
+
+
diff --git a/muse/muse/wavetrack.h b/muse/muse/wavetrack.h
new file mode 100644
index 00000000..3b5c36ec
--- /dev/null
+++ b/muse/muse/wavetrack.h
@@ -0,0 +1,84 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// 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, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#ifndef __WAVETRACK_H__
+#define __WAVETRACK_H__
+
+#include "audiotrack.h"
+
+namespace AL {
+ class Pos;
+ };
+
+class Part;
+
+//---------------------------------------------------------
+// WaveTrack
+//---------------------------------------------------------
+
+class WaveTrack : public AudioTrack {
+ Q_OBJECT
+
+ float** readBuffer[FIFO_BUFFER];
+
+ Part* recordPart; // part we are recording into
+ bool partCreated;
+
+ void getDummyInput(int, unsigned);
+
+ protected:
+ virtual void collectInputData();
+
+ public:
+ static bool firstWaveTrack;
+
+ WaveTrack();
+ ~WaveTrack();
+ void clone(WaveTrack*);
+
+ virtual WaveTrack* newTrack() const { return new WaveTrack(); }
+ virtual Part* newPart(Part*p=0, bool clone=false);
+
+ virtual void read(QDomNode);
+ virtual void write(Xml&) const;
+
+ virtual void fetchData(unsigned pos, unsigned frames, float** bp);
+
+ virtual void setChannels(int n);
+ virtual bool hasAuxSend() const { return true; }
+ bool canEnableRecord() const;
+ virtual bool canRecord() const { return true; }
+
+ virtual void startRecording();
+ void recordBeat();
+ virtual void stopRecording(const AL::Pos&, const AL::Pos&);
+ virtual void process();
+ float** prefetchBuffer(int idx) { return readBuffer[idx]; }
+ };
+
+
+typedef tracklist<WaveTrack*>::iterator iWaveTrack;
+typedef tracklist<WaveTrack*>::const_iterator ciWaveTrack;
+typedef tracklist<WaveTrack*> WaveTrackList;
+
+#endif
+
+
+
diff --git a/muse/muse/widgets/.Ped-tk b/muse/muse/widgets/.Ped-tk
new file mode 100644
index 00000000..efb63043
--- /dev/null
+++ b/muse/muse/widgets/.Ped-tk
Binary files differ
diff --git a/muse/muse/widgets/CMakeLists.txt b/muse/muse/widgets/CMakeLists.txt
new file mode 100644
index 00000000..268fe74b
--- /dev/null
+++ b/muse/muse/widgets/CMakeLists.txt
@@ -0,0 +1,85 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+QT4_WRAP_CPP (widget_mocs
+ doublelabel.h
+ noteinfo.h
+ dentry.h
+ siglabel.h
+ simplebutton.h
+ tb1.h
+ tools.h
+ fontsel.h
+ ctrlcombo.h
+ filedialog.h
+ outportcombo.h splitter.h
+ quantcombo.h rastercombo.h
+ comboQuant.h bigtime.h
+ midisync.h
+ mixdowndialog.h
+ comment.h gatetime.h
+ velocity.h
+ shortcutconfig.h
+ shortcutcapturedialog.h
+ greendotbutton.h recordbutton.h
+ )
+
+QT4_WRAP_UI (widget_ui_headers
+ comment.ui
+ midisync.ui
+ mixdowndialog.ui
+ shortcutcapturedialog.ui
+ shortcutconfig.ui
+ gatetime.ui
+ velocity.ui
+ )
+
+add_library ( widgets STATIC
+ utils.cpp
+ shortcutconfig.cpp
+ shortcutcapturedialog.cpp
+ midisync.cpp
+ comment.cpp
+ mixdowndialog.cpp
+ velocity.cpp
+ gatetime.cpp
+ tools.cpp
+
+ doublelabel.cpp
+ noteinfo.cpp
+ dentry.cpp
+ siglabel.cpp
+ simplebutton.cpp
+ tb1.cpp
+ fontsel.cpp
+ ctrlcombo.cpp
+ filedialog.cpp
+ outportcombo.cpp splitter.cpp
+ quantcombo.cpp rastercombo.cpp
+ comboQuant.cpp bigtime.cpp
+
+ ${widget_mocs}
+ ${widget_ui_headers}
+ )
+
+set_target_properties( widgets
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all.h"
+ )
+
diff --git a/muse/muse/widgets/action.h b/muse/muse/widgets/action.h
new file mode 100644
index 00000000..e573850c
--- /dev/null
+++ b/muse/muse/widgets/action.h
@@ -0,0 +1,29 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: action.h,v 1.2 2004/09/14 18:17:46 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __ACTION_H__
+#define __ACTION_H__
+
+//---------------------------------------------------------
+// Action
+//---------------------------------------------------------
+
+class Action : public QAction {
+ int _id;
+
+ public:
+ Action(QObject* parent, int i, const char* name = 0, bool toggle = false)
+ : QAction(parent, name, toggle) {
+ _id = i;
+ }
+ void setId(int i) { _id = i; }
+ int id() const { return _id; }
+ };
+
+
+#endif
+
diff --git a/muse/muse/widgets/bigtime.cpp b/muse/muse/widgets/bigtime.cpp
new file mode 100644
index 00000000..3db4b7b8
--- /dev/null
+++ b/muse/muse/widgets/bigtime.cpp
@@ -0,0 +1,247 @@
+#include "al/al.h"
+#include "globals.h"
+#include "bigtime.h"
+#include "song.h"
+// #include "app.h"
+#include "gconfig.h"
+#include "al/sig.h"
+#include "al/tempo.h"
+
+//
+// the bigtime widget
+// display is split into several parts to avoid flickering.
+//
+
+//---------------------------------------------------------
+// BigTime
+//---------------------------------------------------------
+
+BigTime::BigTime(QWidget* parent)
+ : QWidget(parent)
+ {
+ setWindowFlags(Qt::WindowStaysOnTopHint);
+
+ barLabel = new QLabel(this);
+ beatLabel = new QLabel(this);
+ tickLabel = new QLabel(this);
+ hourLabel = new QLabel(this);
+ minLabel = new QLabel(this);
+ secLabel = new QLabel(this);
+ frameLabel = new QLabel(this);
+ sep1 = new QLabel(QString("."), this);
+ sep2 = new QLabel(QString("."), this);
+ sep3 = new QLabel(QString(":"), this);
+ sep4 = new QLabel(QString(":"), this);
+ sep5 = new QLabel(QString(":"), this);
+
+ oldbar = oldbeat = oldtick = oldhour = oldmin = oldsec = oldframe = -1;
+
+ setString(song->cPos());
+
+ configChanged();
+
+ QFont f(QString("Courier"));
+ f.setPixelSize(10);
+ setFont(f);
+ setWindowTitle(tr("MusE: Bigtime"));
+ }
+
+//---------------------------------------------------------
+// configChanged
+//---------------------------------------------------------
+
+void BigTime::configChanged()
+ {
+ setBgColor(config.bigTimeBackgroundColor);
+ setFgColor(config.bigTimeForegroundColor);
+ }
+
+//---------------------------------------------------------
+// closeEvent
+//---------------------------------------------------------
+
+void BigTime::closeEvent(QCloseEvent *ev)
+ {
+ emit closed();
+ QWidget::closeEvent(ev);
+ }
+
+//---------------------------------------------------------
+// setString
+//---------------------------------------------------------
+
+bool BigTime::setString(AL::Pos pos)
+ {
+ int bar, beat, tick;
+ pos.mbt(&bar, &beat, &tick);
+ int min, sec, hour, frame, subframe;
+ pos.msf(&min, &sec, &frame, &subframe);
+
+ hour = min / 60;
+ min %= 60;
+
+ QString s;
+
+ if(oldbar != bar) {
+ s.sprintf("%04d", bar+1);
+ barLabel->setText(s);
+ oldbar = bar;
+ }
+
+ if(oldbeat != beat) {
+ s.sprintf("%02d", beat+1);
+ beatLabel->setText(s);
+ oldbeat = beat;
+ }
+
+ if(oldtick != tick) {
+ s.sprintf("%03d", tick);
+ tickLabel->setText(s);
+ oldtick = tick;
+ }
+
+ if(oldhour != hour) {
+ s.sprintf("%02d", hour);
+ hourLabel->setText(s);
+ oldhour = hour;
+ }
+
+ if(oldmin != min) {
+ s.sprintf("%02d", min);
+ minLabel->setText(s);
+ oldmin = min;
+ }
+
+ if(oldsec != sec) {
+ s.sprintf("%02d", sec);
+ secLabel->setText(s);
+ oldsec = sec;
+ }
+
+ if(oldframe != frame) {
+ s.sprintf("%02d", frame);
+ frameLabel->setText(s);
+ oldframe = frame;
+ }
+
+ return false;
+ }
+
+//---------------------------------------------------------
+// setPos
+//---------------------------------------------------------
+
+void BigTime::setPos(int idx, AL::Pos pos, bool)
+ {
+ if (idx == 0)
+ setString(pos);
+ }
+
+//---------------------------------------------------------
+// resizeEvent
+//---------------------------------------------------------
+
+void BigTime::resizeEvent(QResizeEvent *ev)
+ {
+ QFont f = font();
+ QFontMetrics fm(f);
+ int fs = f.pixelSize();
+ int hspace = 20;
+ int tw = fm.width(QString("00:00:00:00"));
+ fs = ((ev->size().width() - hspace*2)*fs) / tw;
+
+// printf("resize BigTime %d -> %d, w %d\n", fs, nfs, ev->size().width());
+
+ // set min/max
+ if (fs < 10)
+ fs = 10;
+ else if (fs > 256)
+ fs = 256;
+ f.setPixelSize(fs);
+ setFont(f);
+
+ int digitWidth = fontMetrics().width(QString("0"));
+
+ int vspace = (ev->size().height() - (fs*2)) / 3;
+ int tickY = vspace;
+ int timeY = vspace*2 + fs;
+
+ barLabel->resize(digitWidth*4, fs);
+ beatLabel->resize(digitWidth*2, fs);
+ tickLabel->resize(digitWidth*3, fs);
+ hourLabel->resize(digitWidth*2, fs);
+ minLabel->resize(digitWidth*2, fs);
+ secLabel->resize(digitWidth*2, fs);
+ frameLabel->resize(digitWidth*2, fs);
+
+ sep1->resize(digitWidth, fs);
+ sep2->resize(digitWidth, fs);
+ sep3->resize(digitWidth, fs);
+ sep4->resize(digitWidth, fs);
+ sep5->resize(digitWidth, fs);
+
+ barLabel->move( hspace + (digitWidth*0), tickY);
+ sep1->move( hspace + (digitWidth*4), tickY);
+ beatLabel->move( hspace + (digitWidth*5), tickY);
+ sep2->move( hspace + (digitWidth*7), tickY);
+ tickLabel->move( hspace + (digitWidth*8), tickY);
+
+ hourLabel->move( hspace + (digitWidth*0), timeY);
+ sep3->move( hspace + (digitWidth*2), timeY);
+ minLabel->move( hspace + (digitWidth*3), timeY);
+ sep4->move( hspace + (digitWidth*5), timeY);
+ secLabel->move( hspace + (digitWidth*6), timeY);
+ sep5->move( hspace + (digitWidth*8), timeY);
+ frameLabel->move( hspace + (digitWidth*9), timeY);
+ }
+
+//---------------------------------------------------------
+// setForegroundColor
+//---------------------------------------------------------
+
+void BigTime::setFgColor(QColor c)
+ {
+ QPalette cg = palette();
+ cg.setColor(QPalette::Foreground, c);
+ setPalette(cg);
+
+ barLabel->setPalette(cg);
+ beatLabel->setPalette(cg);
+ tickLabel->setPalette(cg);
+ hourLabel->setPalette(cg);
+ minLabel->setPalette(cg);
+ secLabel->setPalette(cg);
+ frameLabel->setPalette(cg);
+
+ sep1->setPalette(cg);
+ sep2->setPalette(cg);
+ sep3->setPalette(cg);
+ sep4->setPalette(cg);
+ sep5->setPalette(cg);
+ }
+
+//---------------------------------------------------------
+// setBackgroundColor
+//---------------------------------------------------------
+
+void BigTime::setBgColor(QColor c)
+ {
+ QPalette cg = palette();
+ cg.setColor(QPalette::Background, c);
+ setPalette(cg);
+
+ barLabel->setPalette(cg);
+ beatLabel->setPalette(cg);
+ tickLabel->setPalette(cg);
+ hourLabel->setPalette(cg);
+ minLabel->setPalette(cg);
+ secLabel->setPalette(cg);
+ frameLabel->setPalette(cg);
+
+ sep1->setPalette(cg);
+ sep2->setPalette(cg);
+ sep3->setPalette(cg);
+ sep4->setPalette(cg);
+ sep5->setPalette(cg);
+ }
+
diff --git a/muse/muse/widgets/bigtime.h b/muse/muse/widgets/bigtime.h
new file mode 100644
index 00000000..6e5651b6
--- /dev/null
+++ b/muse/muse/widgets/bigtime.h
@@ -0,0 +1,44 @@
+#ifndef __BIGTIME_H__
+#define __BIGTIME_H__
+
+#include "al/pos.h"
+
+class MusE;
+class AL::Pos;
+
+//---------------------------------------------------------
+// BigTime
+//---------------------------------------------------------
+
+class BigTime : public QWidget {
+ bool tickmode;
+ MusE* seq;
+ Q_OBJECT
+
+ bool setString(AL::Pos);
+
+ QLabel *barLabel, *beatLabel, *tickLabel,
+ *hourLabel, *minLabel, *secLabel, *frameLabel,
+ *sep1, *sep2, *sep3, *sep4, *sep5;
+ int oldbar, oldbeat, oldhour, oldmin, oldsec, oldframe;
+ int oldtick;
+
+ void setFgColor(QColor c);
+ void setBgColor(QColor c);
+
+ protected:
+ virtual void resizeEvent(QResizeEvent*);
+ virtual void closeEvent(QCloseEvent*);
+
+ public slots:
+ void setPos(int, AL::Pos, bool);
+ void configChanged();
+
+ signals:
+ void closed();
+
+ public:
+ BigTime(QWidget* parent);
+ };
+
+#endif
diff --git a/muse/muse/widgets/cliplisteditorbase.h b/muse/muse/widgets/cliplisteditorbase.h
new file mode 100644
index 00000000..789edac6
--- /dev/null
+++ b/muse/muse/widgets/cliplisteditorbase.h
@@ -0,0 +1,138 @@
+#ifndef CLIPLISTEDITORBASE_H
+#define CLIPLISTEDITORBASE_H
+
+#include <qvariant.h>
+
+
+#include <Qt3Support/Q3GroupBox>
+#include <Qt3Support/Q3Header>
+#include <Qt3Support/Q3ListView>
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QLabel>
+#include <QtGui/QSpacerItem>
+#include <QtGui/QVBoxLayout>
+#include <QtGui/QWidget>
+#include "awl/posedit.h"
+#include <awl::posedit.h>
+#include <Qt3Support/Q3MimeSourceFactory>
+
+class Ui_ClipListEditorBase
+{
+public:
+ QVBoxLayout *vboxLayout;
+ Q3ListView *view;
+ Q3GroupBox *GroupBox1;
+ QHBoxLayout *hboxLayout;
+ QLabel *TextLabel1;
+ Awl::PosEdit *start;
+ QLabel *TextLabel2;
+ Awl::PosEdit *len;
+ QSpacerItem *spacerItem;
+
+ void setupUi(QWidget *ClipListEditorBase)
+ {
+ ClipListEditorBase->setObjectName(QString::fromUtf8("ClipListEditorBase"));
+ ClipListEditorBase->resize(QSize(600, 480).expandedTo(ClipListEditorBase->minimumSizeHint()));
+ vboxLayout = new QVBoxLayout(ClipListEditorBase);
+ vboxLayout->setSpacing(6);
+ vboxLayout->setMargin(11);
+ vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ view = new Q3ListView(ClipListEditorBase);
+ view->addColumn(QApplication::translate("ClipListEditorBase", "Name", 0, QApplication::UnicodeUTF8));
+ view->header()->setClickEnabled(true, view->header()->count() - 1);
+ view->addColumn(QApplication::translate("ClipListEditorBase", "Refs", 0, QApplication::UnicodeUTF8));
+ view->header()->setClickEnabled(true, view->header()->count() - 1);
+ view->addColumn(QApplication::translate("ClipListEditorBase", "Start", 0, QApplication::UnicodeUTF8));
+ view->header()->setClickEnabled(true, view->header()->count() - 1);
+ view->addColumn(QApplication::translate("ClipListEditorBase", "Len", 0, QApplication::UnicodeUTF8));
+ view->header()->setClickEnabled(true, view->header()->count() - 1);
+ view->addColumn(QApplication::translate("ClipListEditorBase", "Data", 0, QApplication::UnicodeUTF8));
+ view->header()->setClickEnabled(true, view->header()->count() - 1);
+ view->setObjectName(QString::fromUtf8("view"));
+ view->setAllColumnsShowFocus(true);
+ view->setRootIsDecorated(true);
+
+ vboxLayout->addWidget(view);
+
+ GroupBox1 = new Q3GroupBox(ClipListEditorBase);
+ GroupBox1->setObjectName(QString::fromUtf8("GroupBox1"));
+ GroupBox1->setColumnLayout(0, Qt::Vertical);
+ GroupBox1->layout()->setSpacing(6);
+ GroupBox1->layout()->setMargin(11);
+ hboxLayout = new QHBoxLayout(GroupBox1->layout());
+ hboxLayout->setAlignment(Qt::AlignTop);
+ hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ hboxLayout->setMargin(11);
+ hboxLayout->setSpacing(6);
+ TextLabel1 = new QLabel(GroupBox1);
+ TextLabel1->setObjectName(QString::fromUtf8("TextLabel1"));
+
+ hboxLayout->addWidget(TextLabel1);
+
+ start = new Awl::PosEdit(GroupBox1);
+ start->setObjectName(QString::fromUtf8("start"));
+ start->setSmpte(true);
+
+ hboxLayout->addWidget(start);
+
+ TextLabel2 = new QLabel(GroupBox1);
+ TextLabel2->setObjectName(QString::fromUtf8("TextLabel2"));
+
+ hboxLayout->addWidget(TextLabel2);
+
+ len = new Awl::PosEdit(GroupBox1);
+ len->setObjectName(QString::fromUtf8("len"));
+ len->setSmpte(true);
+
+ hboxLayout->addWidget(len);
+
+ spacerItem = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
+
+ hboxLayout->addItem(spacerItem);
+
+
+ vboxLayout->addWidget(GroupBox1);
+
+ retranslateUi(ClipListEditorBase);
+
+ QMetaObject::connectSlotsByName(ClipListEditorBase);
+ } // setupUi
+
+ void retranslateUi(QWidget *ClipListEditorBase)
+ {
+ ClipListEditorBase->setWindowTitle(QApplication::translate("ClipListEditorBase", "MusE: ClipList", 0, QApplication::UnicodeUTF8));
+ view->header()->setLabel(0, QApplication::translate("ClipListEditorBase", "Name", 0, QApplication::UnicodeUTF8));
+ view->header()->setLabel(1, QApplication::translate("ClipListEditorBase", "Refs", 0, QApplication::UnicodeUTF8));
+ view->header()->setLabel(2, QApplication::translate("ClipListEditorBase", "Start", 0, QApplication::UnicodeUTF8));
+ view->header()->setLabel(3, QApplication::translate("ClipListEditorBase", "Len", 0, QApplication::UnicodeUTF8));
+ view->header()->setLabel(4, QApplication::translate("ClipListEditorBase", "Data", 0, QApplication::UnicodeUTF8));
+ GroupBox1->setTitle(QApplication::translate("ClipListEditorBase", "Clip Properties", 0, QApplication::UnicodeUTF8));
+ TextLabel1->setText(QApplication::translate("ClipListEditorBase", "Pos:", 0, QApplication::UnicodeUTF8));
+ TextLabel2->setText(QApplication::translate("ClipListEditorBase", "Len:", 0, QApplication::UnicodeUTF8));
+ Q_UNUSED(ClipListEditorBase);
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class ClipListEditorBase: public Ui_ClipListEditorBase {};
+} // namespace Ui
+
+class ClipListEditorBase : public QWidget, public Ui::ClipListEditorBase
+{
+ Q_OBJECT
+
+public:
+ ClipListEditorBase(QWidget* parent = 0, const char* name = 0, Qt::WFlags fl = 0);
+ ~ClipListEditorBase();
+
+protected slots:
+ virtual void languageChange();
+
+};
+
+#endif // CLIPLISTEDITORBASE_H
diff --git a/muse/muse/widgets/cliplisteditorbase.ui b/muse/muse/widgets/cliplisteditorbase.ui
new file mode 100644
index 00000000..0dab43be
--- /dev/null
+++ b/muse/muse/widgets/cliplisteditorbase.ui
@@ -0,0 +1,146 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>ClipListEditorBase</class>
+ <widget class="QWidget" name="ClipListEditorBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: ClipList</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="Q3ListView" name="view" >
+ <property name="allColumnsShowFocus" >
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated" >
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>Name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Refs</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Start</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Len</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Data</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item>
+ <widget class="Q3GroupBox" name="GroupBox1" >
+ <property name="title" >
+ <string>Clip Properties</string>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>Pos:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::PosEdit" name="start" />
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>Len:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::PosEdit" name="len" />
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>Q3ListView</class>
+ <extends></extends>
+ <header>q3listview.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Q3GroupBox</class>
+ <extends></extends>
+ <header>Qt3Support/Q3GroupBox</header>
+ <container>1</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Awl::PosEdit</class>
+ <extends>QWidget</extends>
+ <header>awl::posedit.h</header>
+ <container>1</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <includes>
+ <include location="local" >awl/posedit.h</include>
+ </includes>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/widgets/comboQuant.cpp b/muse/muse/widgets/comboQuant.cpp
new file mode 100644
index 00000000..795d08b9
--- /dev/null
+++ b/muse/muse/widgets/comboQuant.cpp
@@ -0,0 +1,56 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: comboQuant.cpp,v 1.5 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "comboQuant.h"
+
+static int quantTable[] = {
+ 1, 16, 32, 64, 128, 256, 512, 1024,
+ 1, 24, 48, 96, 192, 384, 768, 1536,
+ 1, 36, 72, 144, 288, 576, 1152, 2304
+ };
+
+static const char* quantStrings[] = {
+ QT_TR_NOOP("Off"), "64T", "32T", "16T", "8T", "4T", "2T", "1T",
+ QT_TR_NOOP("Off"), "64", "32", "16", "8", "4", "2", "1",
+ QT_TR_NOOP("Off"), "64.", "32.", "16.", "8.", "4.", "2.", "1."
+ };
+
+//---------------------------------------------------------
+// ComboQuant
+//---------------------------------------------------------
+
+ComboQuant::ComboQuant(QWidget* parent)
+ : QComboBox(parent)
+ {
+ for (int i = 0; i < 24; i++)
+ addItem(tr(quantStrings[i]), i);
+ connect(this, SIGNAL(activated(int)), SLOT(activated(int)));
+ }
+
+//---------------------------------------------------------
+// activated
+//---------------------------------------------------------
+
+void ComboQuant::activated(int index)
+ {
+ emit valueChanged(quantTable[index]);
+ }
+
+//---------------------------------------------------------
+// setQuant
+//---------------------------------------------------------
+
+void ComboQuant::setValue(int val)
+ {
+ for (int i = 0; i < 24; i++) {
+ if (val == quantTable[i]) {
+ setCurrentIndex(i);
+ return;
+ }
+ }
+ }
+
diff --git a/muse/muse/widgets/comboQuant.h b/muse/muse/widgets/comboQuant.h
new file mode 100644
index 00000000..276446d2
--- /dev/null
+++ b/muse/muse/widgets/comboQuant.h
@@ -0,0 +1,30 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: comboQuant.h,v 1.3 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __COMBOQUANT_H__
+#define __COMBOQUANT_H__
+
+//---------------------------------------------------------
+// ComboQuant
+//---------------------------------------------------------
+
+class ComboQuant : public QComboBox {
+ Q_OBJECT
+
+ private slots:
+ void activated(int);
+
+ signals:
+ void valueChanged(int);
+
+ public:
+ ComboQuant(QWidget* parent = 0);
+ void setValue(int val);
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/combobox.cpp b/muse/muse/widgets/combobox.cpp
new file mode 100644
index 00000000..55236e88
--- /dev/null
+++ b/muse/muse/widgets/combobox.cpp
@@ -0,0 +1,68 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: combobox.cpp,v 1.7 2005/10/05 18:15:27 wschweer Exp $
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "combobox.h"
+
+//---------------------------------------------------------
+// ComboBox
+//---------------------------------------------------------
+
+ComboBox::ComboBox(QWidget* parent, const char* name)
+ : QLabel(parent, name)
+ {
+ _currentItem = 0;
+ _id = -1;
+ list = new Q3PopupMenu(0, "comboPopup");
+ connect(list, SIGNAL(activated(int)), SLOT(activatedIntern(int)));
+ setFrameStyle(Q3Frame::Panel | Q3Frame::Raised);
+ setLineWidth(2);
+ }
+
+ComboBox::~ComboBox()
+ {
+ delete list;
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void ComboBox::mousePressEvent(QMouseEvent*)
+ {
+ list->exec(QCursor::pos());
+ }
+
+//---------------------------------------------------------
+// activated
+//---------------------------------------------------------
+
+void ComboBox::activatedIntern(int n)
+ {
+ _currentItem = n;
+ emit activated(n, _id);
+ setText(list->text(_currentItem));
+ }
+
+//---------------------------------------------------------
+// setCurrentItem
+//---------------------------------------------------------
+
+void ComboBox::setCurrentItem(int i)
+ {
+ _currentItem = i;
+ setText(list->text(list->idAt(_currentItem)));
+ }
+
+//---------------------------------------------------------
+// insertItem
+//---------------------------------------------------------
+
+void ComboBox::insertItem(const QString& s, int id, int idx)
+ {
+ list->insertItem(s, id, idx);
+ }
+
diff --git a/muse/muse/widgets/combobox.h b/muse/muse/widgets/combobox.h
new file mode 100644
index 00000000..42efc381
--- /dev/null
+++ b/muse/muse/widgets/combobox.h
@@ -0,0 +1,44 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: combobox.h,v 1.7 2005/10/05 18:15:27 wschweer Exp $
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __COMBOBOX_H__
+#define __COMBOBOX_H__
+
+class Q3PopupMenu;
+
+//---------------------------------------------------------
+// ComboBox
+//---------------------------------------------------------
+
+class ComboBox : public QLabel {
+ Q_OBJECT
+ Q_PROPERTY(int id READ id WRITE setId)
+
+ int _id;
+ int _currentItem;
+ Q3PopupMenu* list;
+ virtual void mousePressEvent(QMouseEvent*);
+
+ private slots:
+ void activatedIntern(int);
+
+ signals:
+ void activated(int val, int id);
+
+ public:
+ ComboBox(QWidget* parent, const char* name = 0);
+ ~ComboBox();
+ void setCurrentItem(int);
+ void insertItem(const QString& s, int id = -1, int idx=-1);
+ int id() const { return _id; }
+ void setId(int i) { _id = i; }
+ };
+
+#endif
+
+
+
diff --git a/muse/muse/widgets/comment.cpp b/muse/muse/widgets/comment.cpp
new file mode 100644
index 00000000..5f5776d6
--- /dev/null
+++ b/muse/muse/widgets/comment.cpp
@@ -0,0 +1,78 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: comment.cpp,v 1.5 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "comment.h"
+#include "song.h"
+#include "track.h"
+
+//---------------------------------------------------------
+// Comment
+//---------------------------------------------------------
+
+Comment::Comment(QWidget* parent)
+ : QWidget(parent)
+ {
+ setupUi(this);
+ }
+
+//---------------------------------------------------------
+// textChanged
+//---------------------------------------------------------
+
+void Comment::textChanged()
+ {
+ setText(textentry->document()->toPlainText());
+ }
+
+//---------------------------------------------------------
+// TrackComment
+//---------------------------------------------------------
+
+TrackComment::TrackComment(Track* t, QWidget* parent)
+ : Comment(parent)
+ {
+ setWindowTitle(tr("MusE: Track Comment"));
+ track = t;
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ textentry->setPlainText(track->comment());
+ connect(textentry, SIGNAL(textChanged()), SLOT(textChanged()));
+ label1->setText(tr("Track Comment:"));
+ label2->setText(track->name());
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void TrackComment::songChanged(int flags)
+ {
+ if ((flags & (SC_TRACK_INSERTED|SC_TRACK_REMOVED|SC_TRACK_MODIFIED)) == 0)
+ return;
+ if (!song->trackExists(track)) {
+ close();
+ return;
+ }
+ label2->setText(track->name());
+ QString txt(textentry->document()->toPlainText());
+ if (track->comment() != txt) {
+ disconnect(textentry, SIGNAL(textChanged()), this, SLOT(textChanged()));
+ textentry->setPlainText(track->comment());
+// textentry->setCursorPosition(1000, 1000);
+ connect(textentry, SIGNAL(textChanged()), this, SLOT(textChanged()));
+ }
+ }
+
+//---------------------------------------------------------
+// setText
+//---------------------------------------------------------
+
+void TrackComment::setText(const QString& s)
+ {
+ track->setComment(s);
+ song->update(SC_TRACK_MODIFIED);
+ }
+
diff --git a/muse/muse/widgets/comment.h b/muse/muse/widgets/comment.h
new file mode 100644
index 00000000..103f8dcc
--- /dev/null
+++ b/muse/muse/widgets/comment.h
@@ -0,0 +1,56 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: comment.h,v 1.5 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __COMMENT_H__
+#define __COMMENT_H__
+
+#include "ui_comment.h"
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+class Track;
+
+//---------------------------------------------------------
+// Comment
+//---------------------------------------------------------
+
+class Comment : public QWidget, public Ui::CommentBase {
+ Q_OBJECT
+
+ private:
+ virtual void setText(const QString& s) = 0;
+
+ private slots:
+ void textChanged();
+
+ public:
+ Comment(QWidget* parent);
+ };
+
+//---------------------------------------------------------
+// TrackComment
+//---------------------------------------------------------
+
+class TrackComment : public Comment {
+ Track* track;
+ Q_OBJECT
+
+ private:
+ virtual void setText(const QString& s);
+
+ private slots:
+ void songChanged(int);
+
+ public:
+ TrackComment(Track*, QWidget*);
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/comment.ui b/muse/muse/widgets/comment.ui
new file mode 100644
index 00000000..fc1b8d64
--- /dev/null
+++ b/muse/muse/widgets/comment.ui
@@ -0,0 +1,97 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>CommentBase</class>
+ <widget class="QWidget" name="CommentBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>387</width>
+ <height>205</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Form1</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Track Comment</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label2" >
+ <property name="font" >
+ <font>
+ <family>Arial</family>
+ <pointsize>12</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ <property name="text" >
+ <string>Track 1</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTextEdit" name="textentry" >
+ <property name="font" >
+ <font>
+ <family>Arial</family>
+ <pointsize>12</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/widgets/ctrlcombo.cpp b/muse/muse/widgets/ctrlcombo.cpp
new file mode 100644
index 00000000..5d73d003
--- /dev/null
+++ b/muse/muse/widgets/ctrlcombo.cpp
@@ -0,0 +1,56 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrlcombo.cpp,v 1.2 2005/11/04 12:03:48 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "ctrlcombo.h"
+
+//---------------------------------------------------------
+// CtrlComboBox
+//---------------------------------------------------------
+
+CtrlComboBox::CtrlComboBox(QWidget* parent)
+ : QComboBox(parent)
+ {
+ const char* ctxt[] = {
+ "No Ctrl", "BankSelMSB", "Modulation", "BreathCtrl",
+ "Control 3", "Foot Ctrl", "Porta Time", "DataEntMSB",
+ "MainVolume", "Balance", "Control 9", "Pan",
+ "Expression", "Control 12", "Control 13", "Control 14",
+ "Control 15", "Gen.Purp.1", "Gen.Purp.2", "Gen.Purp.3",
+ "Gen.Purp.4", "Control 20", "Control 21", "Control 22",
+ "Control 23", "Control 24", "Control 25", "Control 26",
+ "Control 27", "Control 28", "Control 29", "Control 30",
+ "Control 31", "BankSelLSB", "Modul. LSB", "BrthCt.LSB",
+ "Control 35", "FootCt.LSB", "Port.T LSB", "DataEntLSB",
+ "MainVolLSB", "BalanceLSB", "Control 41", "Pan LSB",
+ "Expr. LSB", "Control 44", "Control 45", "Control 46",
+ "Control 47", "Gen.P.1LSB", "Gen.P.2LSB", "Gen.P.3LSB",
+ "Gen.P.4LSB", "Control 52", "Control 53", "Control 54",
+ "Control 55", "Control 56", "Control 57", "Control 58",
+ "Control 59", "Control 60", "Control 61", "Control 62",
+ "Control 63", "Sustain", "Porta Ped", "Sostenuto",
+ "Soft Pedal", "Control 68", "Hold 2", "Control 70",
+ "HarmonicCo", "ReleaseTime", "Attack Time", "Brightness",
+ "Control 75", "Control 76", "Control 77", "Control 78",
+ "Control 79", "Gen.Purp.5", "Gen.Purp.6", "Gen.Purp.7",
+ "Gen.Purp.8", "Porta Ctrl", "Control 85", "Control 86",
+ "Control 87", "Control 88", "Control 89", "Control 90",
+ "Effect1Dep", "Effect2Dep", "Effect3Dep", "Effect4Dep",
+ "Phaser Dep", "Data Incr", "Data Decr", "NRPN LSB",
+ "NRPN MSB", "RPN LSB", "RPN MSB", "Control102",
+ "Control103", "Control104", "Control105", "Control106",
+ "Control107", "Control108", "Control109", "Control110",
+ "Control111", "Control112", "Control113", "Control114",
+ "Control115", "Control116", "Control117", "Control118",
+ "Control119", "AllSndOff", "Reset Ctrl", "Local Ctrl",
+ "AllNoteOff", "OmniModOff", "OmniModeOn", "MonoModeOn",
+ "PolyModeOn"
+ };
+ for (unsigned int i = 0; i < sizeof(ctxt)/sizeof(*ctxt); ++i)
+ addItem(QString(ctxt[i]));
+ }
+
diff --git a/muse/muse/widgets/ctrlcombo.h b/muse/muse/widgets/ctrlcombo.h
new file mode 100644
index 00000000..eedbf804
--- /dev/null
+++ b/muse/muse/widgets/ctrlcombo.h
@@ -0,0 +1,20 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrlcombo.h,v 1.3 2005/11/04 12:03:48 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CTRLGRP_H__
+#define __CTRLGRP_H__
+
+class CtrlComboBox : public QComboBox {
+ Q_OBJECT
+ public:
+ CtrlComboBox(QWidget* parent);
+ };
+
+
+#endif
+
diff --git a/muse/muse/widgets/dentry.cpp b/muse/muse/widgets/dentry.cpp
new file mode 100644
index 00000000..9ba6172d
--- /dev/null
+++ b/muse/muse/widgets/dentry.cpp
@@ -0,0 +1,195 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: dentry.cpp,v 1.5 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "dentry.h"
+#include "globals.h"
+
+#define TIMER1 400
+#define TIMER2 200
+#define TIMEC 7
+#define TIMER3 100
+#define TIMEC2 20
+#define TIMER4 50
+
+//---------------------------------------------------------
+// Dentry
+// lineedit double values
+//---------------------------------------------------------
+
+Dentry::Dentry(QWidget* parent)
+ : QLineEdit(parent)
+ {
+ _id = -1;
+ drawFrame = false;
+ QLineEdit::setFrame(drawFrame);
+ timer = new QTimer(this);
+ connect(timer, SIGNAL(timeout()), SLOT(repeat()));
+ val = 0.01;
+ connect(this, SIGNAL(returnPressed()), SLOT(endEdit()));
+ setCursor(QCursor(Qt::ArrowCursor));
+ evx = 1.0;
+ }
+
+//---------------------------------------------------------
+// setFrame
+//---------------------------------------------------------
+
+void Dentry::setFrame(bool flag)
+ {
+ drawFrame = flag;
+ QLineEdit::setFrame(drawFrame);
+ update();
+ }
+
+//---------------------------------------------------------
+// endEdit
+//---------------------------------------------------------
+
+void Dentry::endEdit()
+ {
+ if (isModified()) {
+ if (setSValue(text())) {
+ setString(val);
+ return;
+ }
+ }
+ setString(val);
+ clearFocus();
+ if (!drawFrame)
+ QLineEdit::setFrame(false);
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void Dentry::mousePressEvent(QMouseEvent* event)
+ {
+ button = event->button();
+ starty = event->y();
+ evx = double(event->x());
+ timecount = 0;
+ repeat();
+ timer->start(TIMER1);
+ }
+
+//---------------------------------------------------------
+// wheelEvent
+//---------------------------------------------------------
+
+void Dentry::wheelEvent(QWheelEvent* event)
+ {
+ int delta = event->delta();
+
+ if (delta < 0)
+ decValue(-1.0);
+ else if (delta > 0)
+ incValue(1.0);
+ }
+
+//---------------------------------------------------------
+// repeat
+//---------------------------------------------------------
+
+void Dentry::repeat()
+ {
+ if (timecount == 1) {
+ ++timecount;
+ timer->stop();
+ timer->start(TIMER2);
+ return;
+ }
+ ++timecount;
+ if (timecount == TIMEC) {
+ timer->stop();
+ timer->start(TIMER3);
+ }
+ if (timecount == TIMEC2) {
+ timer->stop();
+ timer->start(TIMER4);
+ }
+
+ switch (button) {
+ case Qt::LeftButton:
+ return;
+ case Qt::MidButton:
+ decValue(evx);
+ break;
+ case Qt::RightButton:
+ incValue(evx);
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// mouseReleaseEvent
+//---------------------------------------------------------
+
+void Dentry::mouseReleaseEvent(QMouseEvent*)
+ {
+ button = Qt::NoButton;
+ timer->stop();
+ }
+
+//---------------------------------------------------------
+// mouseMoveEvent
+//---------------------------------------------------------
+
+void Dentry::mouseMoveEvent(QMouseEvent*)
+ {
+ switch (button) {
+ case Qt::LeftButton:
+ break;
+ case Qt::MidButton:
+ break;
+ case Qt::RightButton:
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// mouseDoubleClickEvent
+//---------------------------------------------------------
+
+void Dentry::mouseDoubleClickEvent(QMouseEvent* event)
+ {
+ if (event->button() != Qt::LeftButton) {
+ mousePressEvent(event);
+ return;
+ }
+ setFocus();
+ QLineEdit::setFrame(true);
+ update();
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void Dentry::setValue(double v)
+ {
+ if (v == val)
+ return;
+ setString(v);
+#if 0
+ if (setString(v)) {
+ clearFocus();
+ if (!drawFrame)
+ QLineEdit::setFrame(false);
+ setEnabled(false);
+ }
+ else {
+ setEnabled(true);
+ }
+#endif
+ val = v;
+ }
+
diff --git a/muse/muse/widgets/dentry.h b/muse/muse/widgets/dentry.h
new file mode 100644
index 00000000..766f4022
--- /dev/null
+++ b/muse/muse/widgets/dentry.h
@@ -0,0 +1,66 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: dentry.h,v 1.5 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __DENTRY_H__
+#define __DENTRY_H__
+
+class QTimer;
+
+//---------------------------------------------------------
+// Dentry
+//---------------------------------------------------------
+
+class Dentry : public QLineEdit {
+ Q_OBJECT
+
+ Q_PROPERTY( int id READ id WRITE setId )
+ Q_PROPERTY( double value READ value WRITE setValue )
+ Q_PROPERTY( bool frame READ frame WRITE setFrame )
+
+ int button;
+ int starty;
+ bool drawFrame;
+ QTimer* timer;
+ double evx;
+ int timecount;
+
+ virtual void wheelEvent(QWheelEvent*);
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void mouseMoveEvent(QMouseEvent*);
+ virtual void mouseDoubleClickEvent(QMouseEvent*);
+ virtual void mouseReleaseEvent(QMouseEvent*);
+
+ protected:
+ int _id;
+ double val;
+
+ virtual void incValue(double x) = 0;
+ virtual void decValue(double x) = 0;
+ virtual bool setString(double) = 0;
+ virtual bool setSValue(const QString&) = 0;
+
+ private slots:
+ void repeat();
+
+ protected slots:
+ void endEdit();
+
+ signals:
+ void valueChanged(double, int);
+
+ public slots:
+ virtual void setValue(double);
+
+ public:
+ Dentry(QWidget* parent = 0);
+ double value() const { return val; }
+ bool frame() const { return drawFrame; }
+ void setFrame(bool);
+ int id() const { return _id; }
+ void setId(int i) { _id = i; }
+ };
+#endif
diff --git a/muse/muse/widgets/doublelabel.cpp b/muse/muse/widgets/doublelabel.cpp
new file mode 100644
index 00000000..fbb77b9b
--- /dev/null
+++ b/muse/muse/widgets/doublelabel.cpp
@@ -0,0 +1,131 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: doublelabel.cpp,v 1.3 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "doublelabel.h"
+#include "utils.h"
+
+//---------------------------------------------------------
+// DoubleLabel
+//---------------------------------------------------------
+
+DoubleLabel::DoubleLabel(QWidget* parent)
+ : Dentry(parent), _specialText("---")
+ {
+ min = 0.0;
+ max = 1.0;
+ _precision = 3;
+ setValue(0.0);
+ }
+
+DoubleLabel::DoubleLabel(double _val, double m, double mx, QWidget* parent)
+ : Dentry(parent), _specialText("---")
+ {
+ min = m;
+ max = mx;
+ _precision = 3;
+ setValue(_val);
+ }
+
+//---------------------------------------------------------
+// setString
+//---------------------------------------------------------
+
+bool DoubleLabel::setString(double v)
+ {
+ QString s;
+ if (v < min || v > max) {
+ setText(_specialText);
+ return true;
+ }
+ s.setNum(v, 'f', _precision);
+ if (!_suffix.isEmpty()) {
+ s += " ";
+ s += _suffix;
+ }
+
+ setText(s);
+ return false;
+ }
+
+//---------------------------------------------------------
+// setSValue
+//---------------------------------------------------------
+
+bool DoubleLabel::setSValue(const QString& s)
+ {
+ bool ok;
+ double v = s.toDouble(&ok);
+ if (ok && (v != val)) {
+ if (v < min)
+ v = min;
+ if (v > max)
+ v = max;
+ setValue(v);
+ emit valueChanged(val, _id);
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// incValue
+//---------------------------------------------------------
+
+void DoubleLabel::incValue(double)
+ {
+ if (val + 1.0 < max) {
+ setValue(val + 1.0);
+ emit valueChanged(val, _id);
+ }
+ }
+
+//---------------------------------------------------------
+// decValue
+//---------------------------------------------------------
+
+void DoubleLabel::decValue(double)
+ {
+ if (val - 1.0 > min) {
+ setValue(val - 1.0);
+ emit valueChanged(val, _id);
+ }
+ }
+
+//---------------------------------------------------------
+// setPrecision
+//---------------------------------------------------------
+
+void DoubleLabel::setPrecision(int v)
+ {
+ _precision = v;
+ setString(val);
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize DoubleLabel::sizeHint() const
+ {
+ QFontMetrics fm = fontMetrics();
+ int h = fm.height() + 4;
+ int n = _precision + 3;
+#if 0
+ double aval = fabs(val);
+ if (aval >= 10.0)
+ ++n;
+ if (aval >= 100.0)
+ ++n;
+ if (aval >= 1000.0)
+ ++n;
+ if (aval >= 10000.0)
+ ++n;
+ if (aval >= 100000.0)
+ ++n;
+#endif
+ int w = fm.width(QString("-0.")) + fm.width('0') * n + 6;
+ return QSize(w, h);
+ }
diff --git a/muse/muse/widgets/doublelabel.h b/muse/muse/widgets/doublelabel.h
new file mode 100644
index 00000000..bf64d736
--- /dev/null
+++ b/muse/muse/widgets/doublelabel.h
@@ -0,0 +1,55 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: doublelabel.h,v 1.3 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __DOUBLELABEL_H__
+#define __DOUBLELABEL_H__
+
+#include "dentry.h"
+
+//---------------------------------------------------------
+// DoubleLabel
+//---------------------------------------------------------
+
+class DoubleLabel : public Dentry {
+ Q_PROPERTY( double minValue READ minValue WRITE setMinValue )
+ Q_PROPERTY( double maxValue READ maxValue WRITE setMaxValue )
+ Q_PROPERTY( QString specialText READ specialText WRITE setSpecialText )
+ Q_PROPERTY( QString suffix READ suffix WRITE setSuffix )
+ Q_PROPERTY( int precision READ precision WRITE setPrecision )
+
+ double min, max;
+ QString _specialText; // text to show if value outside min,max
+ QString _suffix;
+ int _precision;
+ Q_OBJECT
+
+ virtual bool setSValue(const QString&);
+ virtual bool setString(double val);
+ virtual void incValue(double);
+ virtual void decValue(double);
+
+ public:
+ DoubleLabel(QWidget* parent = 0);
+ DoubleLabel(double val, double min, double max, QWidget*);
+ virtual QSize sizeHint() const;
+ double minValue() const { return min; }
+ double maxValue() const { return max; }
+ void setMinValue(double v) { min = v; }
+ void setMaxValue(double v) { max = v; }
+ void setRange(double a, double b) { min = a; max = b; }
+ int precision() const { return _precision; }
+ void setPrecision(int val);
+ QString specialText() const { return _specialText; }
+ void setSpecialText(const QString& s) {
+ _specialText = s;
+ update();
+ }
+ QString suffix() const { return _suffix; }
+ void setSuffix(const QString& s) { _suffix = s; }
+ };
+
+#endif
diff --git a/muse/muse/widgets/editmetadialogbase.cpp b/muse/muse/widgets/editmetadialogbase.cpp
new file mode 100644
index 00000000..0bbe8dd1
--- /dev/null
+++ b/muse/muse/widgets/editmetadialogbase.cpp
@@ -0,0 +1,110 @@
+#include "editmetadialogbase.h"
+
+#include <qvariant.h>
+#include <awl/posedit.h>
+/*
+ * Constructs a EditMetaDialogBase as a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'.
+ *
+ * The dialog will by default be modeless, unless you set 'modal' to
+ * true to construct a modal dialog.
+ */
+EditMetaDialogBase::EditMetaDialogBase(QWidget* parent, const char* name, bool modal, Qt::WFlags fl)
+ : QDialog(parent, name, modal, fl)
+{
+ setupUi(this);
+
+
+ // signals and slots connections
+ connect(buttonOk, SIGNAL(clicked()), this, SLOT(accept()));
+ connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+EditMetaDialogBase::~EditMetaDialogBase()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+/*
+ * Sets the strings of the subwidgets using the current
+ * language.
+ */
+void EditMetaDialogBase::languageChange()
+{
+ retranslateUi(this);
+}
+
+/****************************************************************************
+** Meta object code from reading C++ file 'editmetadialogbase.h'
+**
+** Created: Fri Sep 23 12:43:18 2005
+** by: The Qt Meta Object Compiler version 58 (Qt 4.0.1)
+**
+** WARNING! All changes made in this file will be lost!
+*****************************************************************************/
+
+#include "editmetadialogbase.h"
+#if !defined(Q_MOC_OUTPUT_REVISION)
+#error "The header file 'editmetadialogbase.h' doesn't include <QObject>."
+#elif Q_MOC_OUTPUT_REVISION != 58
+#error "This file was generated using the moc from 4.0.1. It"
+#error "cannot be used with the include files from this version of Qt."
+#error "(The moc has changed too much.)"
+#endif
+
+static const uint qt_meta_data_EditMetaDialogBase[] = {
+
+ // content:
+ 1, // revision
+ 0, // classname
+ 0, 0, // classinfo
+ 1, 10, // methods
+ 0, 0, // properties
+ 0, 0, // enums/sets
+
+ // slots: signature, parameters, type, tag, flags
+ 20, 19, 19, 19, 0x09,
+
+ 0 // eod
+};
+
+static const char qt_meta_stringdata_EditMetaDialogBase[] = {
+ "EditMetaDialogBase\0\0languageChange()\0"
+};
+
+const QMetaObject EditMetaDialogBase::staticMetaObject = {
+ { &QDialog::staticMetaObject, qt_meta_stringdata_EditMetaDialogBase,
+ qt_meta_data_EditMetaDialogBase, 0 }
+};
+
+const QMetaObject *EditMetaDialogBase::metaObject() const
+{
+ return &staticMetaObject;
+}
+
+void *EditMetaDialogBase::qt_metacast(const char *_clname)
+{
+ if (!_clname) return 0;
+ if (!strcmp(_clname, qt_meta_stringdata_EditMetaDialogBase))
+ return static_cast<void*>(const_cast<EditMetaDialogBase*>(this));
+ if (!strcmp(_clname, "Ui::EditMetaDialogBase"))
+ return static_cast<Ui::EditMetaDialogBase*>(const_cast<EditMetaDialogBase*>(this));
+ return QDialog::qt_metacast(_clname);
+}
+
+int EditMetaDialogBase::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
+{
+ _id = QDialog::qt_metacall(_c, _id, _a);
+ if (_id < 0)
+ return _id;
+ if (_c == QMetaObject::InvokeMetaMethod) {
+ switch (_id) {
+ case 0: languageChange(); break;
+ }
+ _id -= 1;
+ }
+ return _id;
+}
diff --git a/muse/muse/widgets/editmetadialogbase.ui b/muse/muse/widgets/editmetadialogbase.ui
new file mode 100644
index 00000000..3f5730de
--- /dev/null
+++ b/muse/muse/widgets/editmetadialogbase.ui
@@ -0,0 +1,137 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>EditMetaDialogBase</class>
+ <widget class="QDialog" name="EditMetaDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Dialog</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="3" column="0" colspan="3" >
+ <widget class="QTextEdit" name="textEdit" />
+ </item>
+ <item row="4" column="0" colspan="3" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>131</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="spinBox" />
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="spinBox_2" />
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QCheckBox" name="checkBox" >
+ <property name="text" >
+ <string>Enter Hex</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Meta Type:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Time Position:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>EditMetaDialogBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>278</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>96</x>
+ <y>254</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>EditMetaDialogBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>369</x>
+ <y>253</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>179</x>
+ <y>282</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/widgets/editsysexdialogbase.h b/muse/muse/widgets/editsysexdialogbase.h
new file mode 100644
index 00000000..b00b09b6
--- /dev/null
+++ b/muse/muse/widgets/editsysexdialogbase.h
@@ -0,0 +1,203 @@
+#ifndef EDITSYSEXDIALOGBASE_H
+#define EDITSYSEXDIALOGBASE_H
+
+#include <qvariant.h>
+
+
+#include <Qt3Support/Q3ListBox>
+#include <Qt3Support/Q3TextEdit>
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QDialog>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QLabel>
+#include <QtGui/QPushButton>
+#include <QtGui/QSpacerItem>
+#include <QtGui/QVBoxLayout>
+#include "awl/posedit.h"
+#include <awl::posedit.h>
+#include <Qt3Support/Q3MimeSourceFactory>
+
+class Ui_EditSysexDialogBase
+{
+public:
+ QVBoxLayout *vboxLayout;
+ QHBoxLayout *hboxLayout;
+ QVBoxLayout *vboxLayout1;
+ QLabel *textLabel1;
+ Q3ListBox *sysexList;
+ QVBoxLayout *vboxLayout2;
+ QHBoxLayout *hboxLayout1;
+ QLabel *TextLabel1;
+ Awl::PosEdit *pos;
+ QSpacerItem *spacerItem;
+ Q3TextEdit *edit;
+ QLabel *TextLabel2;
+ Q3TextEdit *comment;
+ QHBoxLayout *hboxLayout2;
+ QPushButton *buttonAdd;
+ QSpacerItem *spacerItem1;
+ QPushButton *buttonOk;
+ QPushButton *buttonCancel;
+
+ void setupUi(QDialog *EditSysexDialogBase)
+ {
+ EditSysexDialogBase->setObjectName(QString::fromUtf8("EditSysexDialogBase"));
+ EditSysexDialogBase->resize(QSize(667, 556).expandedTo(EditSysexDialogBase->minimumSizeHint()));
+ EditSysexDialogBase->setSizeGripEnabled(true);
+ vboxLayout = new QVBoxLayout(EditSysexDialogBase);
+ vboxLayout->setSpacing(6);
+ vboxLayout->setMargin(11);
+ vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
+ hboxLayout = new QHBoxLayout();
+ hboxLayout->setSpacing(6);
+ hboxLayout->setMargin(0);
+ hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ vboxLayout1 = new QVBoxLayout();
+ vboxLayout1->setSpacing(6);
+ vboxLayout1->setMargin(0);
+ vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
+ textLabel1 = new QLabel(EditSysexDialogBase);
+ textLabel1->setObjectName(QString::fromUtf8("textLabel1"));
+ QSizePolicy sizePolicy((QSizePolicy::Policy)4, (QSizePolicy::Policy)5);
+ sizePolicy.setHorizontalStretch(0);
+ sizePolicy.setVerticalStretch(0);
+ sizePolicy.setHeightForWidth(textLabel1->sizePolicy().hasHeightForWidth());
+ textLabel1->setSizePolicy(sizePolicy);
+
+ vboxLayout1->addWidget(textLabel1);
+
+ sysexList = new Q3ListBox(EditSysexDialogBase);
+ sysexList->setObjectName(QString::fromUtf8("sysexList"));
+ QSizePolicy sizePolicy1((QSizePolicy::Policy)4, (QSizePolicy::Policy)7);
+ sizePolicy1.setHorizontalStretch(0);
+ sizePolicy1.setVerticalStretch(0);
+ sizePolicy1.setHeightForWidth(sysexList->sizePolicy().hasHeightForWidth());
+ sysexList->setSizePolicy(sizePolicy1);
+
+ vboxLayout1->addWidget(sysexList);
+
+
+ hboxLayout->addLayout(vboxLayout1);
+
+ vboxLayout2 = new QVBoxLayout();
+ vboxLayout2->setSpacing(6);
+ vboxLayout2->setMargin(0);
+ vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
+ hboxLayout1 = new QHBoxLayout();
+ hboxLayout1->setSpacing(6);
+ hboxLayout1->setMargin(0);
+ hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
+ TextLabel1 = new QLabel(EditSysexDialogBase);
+ TextLabel1->setObjectName(QString::fromUtf8("TextLabel1"));
+
+ hboxLayout1->addWidget(TextLabel1);
+
+ pos = new Awl::PosEdit(EditSysexDialogBase);
+ pos->setObjectName(QString::fromUtf8("pos"));
+
+ hboxLayout1->addWidget(pos);
+
+ spacerItem = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
+
+ hboxLayout1->addItem(spacerItem);
+
+
+ vboxLayout2->addLayout(hboxLayout1);
+
+ edit = new Q3TextEdit(EditSysexDialogBase);
+ edit->setObjectName(QString::fromUtf8("edit"));
+
+ vboxLayout2->addWidget(edit);
+
+ TextLabel2 = new QLabel(EditSysexDialogBase);
+ TextLabel2->setObjectName(QString::fromUtf8("TextLabel2"));
+
+ vboxLayout2->addWidget(TextLabel2);
+
+ comment = new Q3TextEdit(EditSysexDialogBase);
+ comment->setObjectName(QString::fromUtf8("comment"));
+
+ vboxLayout2->addWidget(comment);
+
+
+ hboxLayout->addLayout(vboxLayout2);
+
+
+ vboxLayout->addLayout(hboxLayout);
+
+ hboxLayout2 = new QHBoxLayout();
+ hboxLayout2->setSpacing(6);
+ hboxLayout2->setMargin(0);
+ hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2"));
+ buttonAdd = new QPushButton(EditSysexDialogBase);
+ buttonAdd->setObjectName(QString::fromUtf8("buttonAdd"));
+ QSizePolicy sizePolicy2((QSizePolicy::Policy)1, (QSizePolicy::Policy)0);
+ sizePolicy2.setHorizontalStretch(0);
+ sizePolicy2.setVerticalStretch(0);
+ sizePolicy2.setHeightForWidth(buttonAdd->sizePolicy().hasHeightForWidth());
+ buttonAdd->setSizePolicy(sizePolicy2);
+
+ hboxLayout2->addWidget(buttonAdd);
+
+ spacerItem1 = new QSpacerItem(350, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
+
+ hboxLayout2->addItem(spacerItem1);
+
+ buttonOk = new QPushButton(EditSysexDialogBase);
+ buttonOk->setObjectName(QString::fromUtf8("buttonOk"));
+ buttonOk->setAutoDefault(true);
+ buttonOk->setDefault(true);
+
+ hboxLayout2->addWidget(buttonOk);
+
+ buttonCancel = new QPushButton(EditSysexDialogBase);
+ buttonCancel->setObjectName(QString::fromUtf8("buttonCancel"));
+ buttonCancel->setAutoDefault(true);
+
+ hboxLayout2->addWidget(buttonCancel);
+
+
+ vboxLayout->addLayout(hboxLayout2);
+
+ retranslateUi(EditSysexDialogBase);
+
+ QMetaObject::connectSlotsByName(EditSysexDialogBase);
+ } // setupUi
+
+ void retranslateUi(QDialog *EditSysexDialogBase)
+ {
+ EditSysexDialogBase->setWindowTitle(QApplication::translate("EditSysexDialogBase", "MusE: Enter SysEx", 0, QApplication::UnicodeUTF8));
+ textLabel1->setText(QApplication::translate("EditSysexDialogBase", "Known SysEx:", 0, QApplication::UnicodeUTF8));
+ TextLabel1->setText(QApplication::translate("EditSysexDialogBase", "TimePosition:", 0, QApplication::UnicodeUTF8));
+ TextLabel2->setText(QApplication::translate("EditSysexDialogBase", "Comment:", 0, QApplication::UnicodeUTF8));
+ buttonAdd->setText(QApplication::translate("EditSysexDialogBase", "Add", 0, QApplication::UnicodeUTF8));
+ buttonOk->setText(QApplication::translate("EditSysexDialogBase", "OK", 0, QApplication::UnicodeUTF8));
+ buttonOk->setShortcut(QApplication::translate("EditSysexDialogBase", "", 0, QApplication::UnicodeUTF8));
+ buttonCancel->setText(QApplication::translate("EditSysexDialogBase", "Cancel", 0, QApplication::UnicodeUTF8));
+ buttonCancel->setShortcut(QApplication::translate("EditSysexDialogBase", "", 0, QApplication::UnicodeUTF8));
+ Q_UNUSED(EditSysexDialogBase);
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class EditSysexDialogBase: public Ui_EditSysexDialogBase {};
+} // namespace Ui
+
+class EditSysexDialogBase : public QDialog, public Ui::EditSysexDialogBase
+{
+ Q_OBJECT
+
+public:
+ EditSysexDialogBase(QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WFlags fl = 0);
+ ~EditSysexDialogBase();
+
+protected slots:
+ virtual void languageChange();
+
+};
+
+#endif // EDITSYSEXDIALOGBASE_H
diff --git a/muse/muse/widgets/editsysexdialogbase.ui b/muse/muse/widgets/editsysexdialogbase.ui
new file mode 100644
index 00000000..227d2b16
--- /dev/null
+++ b/muse/muse/widgets/editsysexdialogbase.ui
@@ -0,0 +1,236 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>EditSysexDialogBase</class>
+ <widget class="QDialog" name="EditSysexDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>667</width>
+ <height>556</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Enter SysEx</string>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Known SysEx:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Q3ListBox" name="sysexList" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>TimePosition:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::PosEdit" name="pos" />
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="Q3TextEdit" name="edit" />
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>Comment:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Q3TextEdit" name="comment" />
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="buttonAdd" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Add</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>350</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonOk" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonCancel" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>Awl::PosEdit</class>
+ <extends>QWidget</extends>
+ <header>awl::posedit.h</header>
+ <container>1</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Q3TextEdit</class>
+ <extends></extends>
+ <header>q3textedit.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Q3ListBox</class>
+ <extends></extends>
+ <header>q3listbox.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <includes>
+ <include location="local" >awl/posedit.h</include>
+ </includes>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/widgets/fdialogbuttons.ui b/muse/muse/widgets/fdialogbuttons.ui
new file mode 100644
index 00000000..9d46cb59
--- /dev/null
+++ b/muse/muse/widgets/fdialogbuttons.ui
@@ -0,0 +1,167 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>FileDialogButtons</class>
+ <widget class="QWidget" name="FileDialogButtons" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>175</width>
+ <height>438</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>Form1</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="Q3ButtonGroup" name="pathGroup" >
+ <property name="title" >
+ <string/>
+ </property>
+ <property name="flat" >
+ <bool>true</bool>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="exclusive" >
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="globalButton" >
+ <property name="text" >
+ <string>Global</string>
+ </property>
+ <property name="icon" >
+ <iconset>image0</iconset>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="userButton" >
+ <property name="text" >
+ <string>User</string>
+ </property>
+ <property name="icon" >
+ <iconset>image1</iconset>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="projectButton" >
+ <property name="text" >
+ <string>Project</string>
+ </property>
+ <property name="icon" >
+ <iconset>image2</iconset>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="Q3ButtonGroup" name="loadAllGroup" >
+ <property name="title" >
+ <string>Load:</string>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="exclusive" >
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="loadAllButton" >
+ <property name="text" >
+ <string>Songdata +
+Cofiguration</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="loadSongButton" >
+ <property name="text" >
+ <string>only
+Songdata</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>Q3ButtonGroup</class>
+ <extends></extends>
+ <header>Qt3Support/Q3ButtonGroup</header>
+ <container>1</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/widgets/fdialogbuttons1.h b/muse/muse/widgets/fdialogbuttons1.h
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/muse/muse/widgets/fdialogbuttons1.h
diff --git a/muse/muse/widgets/filedialog.cpp b/muse/muse/widgets/filedialog.cpp
new file mode 100644
index 00000000..0fd902ea
--- /dev/null
+++ b/muse/muse/widgets/filedialog.cpp
@@ -0,0 +1,180 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filedialog.cpp,v 1.14 2006/01/25 16:24:33 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "filedialog.h"
+#include "../globals.h"
+
+//---------------------------------------------------------
+// MFileDialog
+//---------------------------------------------------------
+
+MFileDialog::MFileDialog(const QString& dir,
+ const QString& filter, QWidget* parent, bool /*writeFlag*/)
+ : QFileDialog(parent, QString(), dir, filter)
+ {
+ }
+
+//---------------------------------------------------------
+// getOpenFileName
+//---------------------------------------------------------
+
+QString getOpenFileName(const QString &startWith,
+ const QStringList& filters, QWidget* parent, const QString& name)
+ {
+ MFileDialog *dlg = new MFileDialog(startWith, QString::null, parent);
+ dlg->setFilters(filters);
+ dlg->setWindowTitle(name);
+ dlg->setFileMode(QFileDialog::ExistingFile);
+ QString result;
+ if (dlg->exec() == QDialog::Accepted) {
+ QStringList sl = dlg->selectedFiles();
+ result = sl.at(0);
+ }
+ delete dlg;
+ return result;
+ }
+
+//---------------------------------------------------------
+// getSaveFileName
+//---------------------------------------------------------
+
+QString getSaveFileName(const QString &startWith,
+ const QStringList& filters, QWidget* parent, const QString& name)
+ {
+ MFileDialog *dlg = new MFileDialog(startWith, QString::null, parent, true);
+ dlg->setFilters(filters);
+ dlg->setWindowTitle(name);
+ dlg->setFileMode(QFileDialog::AnyFile);
+ QString result;
+ if (dlg->exec() == QDialog::Accepted) {
+ QStringList sl = dlg->selectedFiles();
+ result = sl.at(0);
+ }
+ delete dlg;
+ return result;
+ }
+
+//---------------------------------------------------------
+// getImageFileName
+//---------------------------------------------------------
+
+QString getImageFileName(const QString& startWith,
+ const QStringList& filters, QWidget* parent, const QString& name)
+ {
+ QString initialSelection;
+ QString* workingDirectory = new QString(QDir::current().absolutePath());
+ if (!startWith.isEmpty() ) {
+ QFileInfo fi(startWith);
+ if (fi.exists() && fi.isDir()) {
+ *workingDirectory = startWith;
+ }
+ else if (fi.exists() && fi.isFile()) {
+ *workingDirectory = fi.absolutePath();
+ initialSelection = fi.absolutePath();
+ }
+ }
+ MFileDialog *dlg = new MFileDialog(*workingDirectory, QString::null,
+ parent);
+
+//TD dlg->setContentsPreviewEnabled(true);
+// ContentsPreview* preview = new ContentsPreview(dlg);
+// dlg->setContentsPreview(preview, preview);
+// dlg->setPreviewMode(QFileDialog::Contents);
+
+ dlg->setWindowTitle(name);
+ dlg->setFilters(filters);
+ dlg->setFileMode(QFileDialog::ExistingFile);
+ QString result;
+ if (!initialSelection.isEmpty())
+ dlg->selectFile(initialSelection);
+ if (dlg->exec() == QDialog::Accepted) {
+ QStringList sl = dlg->selectedFiles();
+ result = sl.at(0);
+ }
+ delete dlg;
+ return result;
+ }
+
+//---------------------------------------------------------
+// fileOpen
+// opens file "name" with extension "ext" in mode "mode"
+//
+// mode = "r" or "w"
+// noError show no error if file was not found in "r"
+// mode. Has no effect in "w" mode
+// overwriteWarning
+// warn in "w" mode, if file exists
+//---------------------------------------------------------
+
+QFile* fileOpen(QWidget* parent, QString name, const QString& ext,
+ QIODevice::OpenMode mode, bool overwriteWarning)
+ {
+ QFileInfo info(name);
+
+ if (info.completeSuffix() == "") {
+ name += ext;
+ info.setFile(name);
+ }
+ if (mode == QIODevice::WriteOnly && overwriteWarning && info.exists()) {
+ QString s(QWidget::tr("File\n") + name + QWidget::tr("\nexists"));
+ int rv = QMessageBox::warning(parent,
+ QWidget::tr("MusE: write"),
+ s,
+ QWidget::tr("Overwrite"),
+ QWidget::tr("Quit"), QString::null, 0, 1);
+ switch(rv) {
+ case 0: // overwrite
+ break;
+ case 1: // quit
+ return 0;
+ }
+ }
+ QFile* file = new QFile(name);
+ if (!file->open(mode)) {
+ QString s(QWidget::tr("Open File\n") + name + QWidget::tr("\nfailed: ")
+ + QString(strerror(errno)));
+ QMessageBox::critical(parent, QWidget::tr("MusE: Open File"), s);
+ }
+ return file;
+ }
+
+//---------------------------------------------------------
+// MFile
+//---------------------------------------------------------
+
+MFile::MFile(const QString& _path, const QString& _ext)
+ : path(_path), ext(_ext)
+ {
+ f = 0;
+ }
+
+MFile::~MFile()
+ {
+ if (f) {
+ f->close();
+ delete f;
+ }
+ }
+
+//---------------------------------------------------------
+// open
+//---------------------------------------------------------
+
+QFile* MFile::open(QIODevice::OpenMode mode, const QStringList& pattern,
+ QWidget* parent, bool warnIfOverwrite, const QString& caption)
+ {
+ QString name;
+ if (mode == QIODevice::ReadOnly)
+ name = getOpenFileName(path, pattern, parent, caption);
+ else
+ name = getSaveFileName(path, pattern, parent, caption);
+ if (name.isEmpty())
+ return 0;
+ f = fileOpen(parent, name, ext, mode, warnIfOverwrite);
+ return f;
+ }
+
diff --git a/muse/muse/widgets/filedialog.h b/muse/muse/widgets/filedialog.h
new file mode 100644
index 00000000..572ce051
--- /dev/null
+++ b/muse/muse/widgets/filedialog.h
@@ -0,0 +1,52 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filedialog.h,v 1.8 2006/01/25 16:24:33 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+class FileDialogButtons;
+
+//---------------------------------------------------------
+// MFileDialog
+//---------------------------------------------------------
+
+class MFileDialog : public QFileDialog {
+ bool showButtons;
+ QString baseDir;
+ Q_OBJECT
+
+ public:
+ MFileDialog(const QString& dir, const QString& filter = QString::null,
+ QWidget* parent = 0, bool writeFlag = false);
+ };
+
+QString getSaveFileName(const QString& startWidth, const QStringList& filter,
+ QWidget* parent, const QString& name);
+QString getOpenFileName(const QString& startWidth, const QStringList& filter,
+ QWidget* parent, const QString& name);
+QString getImageFileName(const QString& startWith, const QStringList& filter,
+ QWidget* parent, const QString& name);
+
+QFile* fileOpen(QWidget*, QString, const QString&,
+ QIODevice::OpenMode, bool = false);
+
+
+//---------------------------------------------------------
+// MFile
+// "Muse" File
+//---------------------------------------------------------
+
+class MFile {
+ QFile* f;
+ QString path;
+ QString ext;
+
+ public:
+ MFile(const QString& path, const QString& ext);
+ ~MFile();
+ QFile* open(QIODevice::OpenMode, const QStringList& pattern,
+ QWidget* parent,
+ bool warnIfOverwrite, const QString& caption);
+ };
+
diff --git a/muse/muse/widgets/floatlabel.cpp b/muse/muse/widgets/floatlabel.cpp
new file mode 100644
index 00000000..4c5aa701
--- /dev/null
+++ b/muse/muse/widgets/floatlabel.cpp
@@ -0,0 +1,131 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: floatlabel.cpp,v 1.1 2004/09/14 18:17:47 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "doublelabel.h"
+#include "utils.h"
+
+//---------------------------------------------------------
+// DoubleLabel
+//---------------------------------------------------------
+
+DoubleLabel::DoubleLabel(QWidget* parent, const char* name)
+ : Dentry(parent, name), _specialText("---")
+ {
+ min = 0.0;
+ max = 1.0;
+ _precision = 3;
+ setValue(0.0);
+ }
+
+DoubleLabel::DoubleLabel(double _val, double m, double mx, QWidget* parent)
+ : Dentry(parent), _specialText("---")
+ {
+ min = m;
+ max = mx;
+ _precision = 3;
+ setValue(_val);
+ }
+
+//---------------------------------------------------------
+// setString
+//---------------------------------------------------------
+
+bool DoubleLabel::setString(double v)
+ {
+ QString s;
+ if (v < min || v > max) {
+ setText(_specialText);
+ return true;
+ }
+ s.setNum(v, 'f', _precision);
+ if (!_suffix.isEmpty()) {
+ s += " ";
+ s += _suffix;
+ }
+
+ setText(s);
+ return false;
+ }
+
+//---------------------------------------------------------
+// setSValue
+//---------------------------------------------------------
+
+bool DoubleLabel::setSValue(const QString& s)
+ {
+ bool ok;
+ double v = s.toDouble(&ok);
+ if (ok && (v != val)) {
+ if (v < min)
+ v = min;
+ if (v > max)
+ v = max;
+ setValue(v);
+ emit valueChanged(val, _id);
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// incValue
+//---------------------------------------------------------
+
+void DoubleLabel::incValue(double)
+ {
+ if (val + 1.0 < max) {
+ setValue(val + 1.0);
+ emit valueChanged(val, _id);
+ }
+ }
+
+//---------------------------------------------------------
+// decValue
+//---------------------------------------------------------
+
+void DoubleLabel::decValue(double)
+ {
+ if (val - 1.0 > min) {
+ setValue(val - 1.0);
+ emit valueChanged(val, _id);
+ }
+ }
+
+//---------------------------------------------------------
+// setPrecision
+//---------------------------------------------------------
+
+void DoubleLabel::setPrecision(int v)
+ {
+ _precision = v;
+ setString(val);
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize DoubleLabel::sizeHint() const
+ {
+ QFontMetrics fm = fontMetrics();
+ int h = fm.height() + 4;
+ int n = _precision + 3;
+#if 0
+ double aval = fabs(val);
+ if (aval >= 10.0)
+ ++n;
+ if (aval >= 100.0)
+ ++n;
+ if (aval >= 1000.0)
+ ++n;
+ if (aval >= 10000.0)
+ ++n;
+ if (aval >= 100000.0)
+ ++n;
+#endif
+ int w = fm.width(QString("-0.")) + fm.width('0') * n + 6;
+ return QSize(w, h);
+ }
diff --git a/muse/muse/widgets/floatlabel.h b/muse/muse/widgets/floatlabel.h
new file mode 100644
index 00000000..0ff8273a
--- /dev/null
+++ b/muse/muse/widgets/floatlabel.h
@@ -0,0 +1,55 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: floatlabel.h,v 1.1 2004/09/14 18:17:47 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __FLOATLABEL_H__
+#define __FLOATLABEL_H__
+
+#include "dentry.h"
+
+//---------------------------------------------------------
+// FloatLabel
+//---------------------------------------------------------
+
+class FloatLabel : public Dentry {
+ Q_PROPERTY(float minValue READ minValue WRITE setMinValue )
+ Q_PROPERTY(float maxValue READ maxValue WRITE setMaxValue )
+ Q_PROPERTY(QString specialText READ specialText WRITE setSpecialText )
+ Q_PROPERTY(QString suffix READ suffix WRITE setSuffix )
+ Q_PROPERTY(int precision READ precision WRITE setPrecision )
+
+ float min, max;
+ QString _specialText; // text to show if value outside min,max
+ QString _suffix;
+ int _precision;
+ Q_OBJECT
+
+ virtual bool setSValue(const QString&);
+ virtual bool setString(double val);
+ virtual void incValue(double);
+ virtual void decValue(double);
+
+ public:
+ DoubleLabel(QWidget*, const char* name = 0);
+ DoubleLabel(double val, double min, double max, QWidget*);
+ virtual QSize sizeHint() const;
+ double minValue() const { return min; }
+ double maxValue() const { return max; }
+ void setMinValue(double v) { min = v; }
+ void setMaxValue(double v) { max = v; }
+ void setRange(double a, double b) { min = a; max = b; }
+ int precision() const { return _precision; }
+ void setPrecision(int val);
+ QString specialText() const { return _specialText; }
+ void setSpecialText(const QString& s) {
+ _specialText = s;
+ update();
+ }
+ QString suffix() const { return _suffix; }
+ void setSuffix(const QString& s) { _suffix = s; }
+ };
+
+#endif
diff --git a/muse/muse/widgets/fontsel.cpp b/muse/muse/widgets/fontsel.cpp
new file mode 100644
index 00000000..a412bcdb
--- /dev/null
+++ b/muse/muse/widgets/fontsel.cpp
@@ -0,0 +1,125 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: fontsel.cpp,v 1.5 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "icons.h"
+#include "fontsel.h"
+
+//---------------------------------------------------------
+// FontSel
+//---------------------------------------------------------
+
+FontSel::FontSel(QWidget* parent, const QFont& f, const QString& name)
+ : QWidget(parent)
+ {
+ _font = f;
+ QHBoxLayout* box = new QHBoxLayout(this);
+
+ cb = new QComboBox(this);
+ cb->setFixedWidth(80);
+ cb->addItem(QString("arial"));
+ cb->addItem(QString("avantgarde"));
+ cb->addItem(QString("charter"));
+ cb->addItem(QString("garamond"));
+ cb->addItem(QString("gillsans"));
+ cb->addItem(QString("helvetica"));
+ cb->addItem(QString("times"));
+ cb->addItem(QString("terminal"));
+ cb->addItem(QString("utopia"));
+ cb->addItem(QString("new century schoolbook"));
+
+ QLabel* l1 = new QLabel(tr("Size:"), this);
+ s1 = new QSpinBox(this);
+ s1->setRange(8, 48);
+
+ fcb1 = new QToolButton(this);
+ fcb1->setCheckable(true);
+ fcb1->setIcon(*boldIcon);
+
+ fcb2 = new QToolButton(this);
+ fcb2->setCheckable(true);
+ fcb2->setIcon(*italicIcon);
+
+ fcb3 = new QToolButton(this);
+ fcb3->setCheckable(true);
+ fcb3->setIcon(*underlinedIcon);
+
+ QToolButton* pb = new QToolButton(this);
+ connect(pb, SIGNAL(pressed()), SLOT(fontSelect()));
+ pb->setText(QString("??"));
+
+ QLabel* l2 = new QLabel(name, this);
+
+ box->addWidget(cb);
+ box->addSpacing(8);
+ box->addWidget(l1);
+ box->addSpacing(5);
+ box->addWidget(s1);
+ box->addSpacing(5);
+ box->addWidget(fcb1);
+ box->addWidget(fcb2);
+ box->addWidget(fcb3);
+ box->addSpacing(2);
+ box->addWidget(pb);
+ box->addSpacing(5);
+ box->addWidget(l2);
+ box->addStretch(100);
+ setFixedHeight(18);
+ setFont();
+ }
+
+//---------------------------------------------------------
+// fontSelect
+//---------------------------------------------------------
+
+void FontSel::fontSelect()
+ {
+ bool ok;
+ QFont f = QFontDialog::getFont(&ok, _font, this);
+ if (ok) {
+ _font = f;
+ setFont();
+ }
+ }
+
+//---------------------------------------------------------
+// setFont
+//---------------------------------------------------------
+
+void FontSel::setFont()
+ {
+ s1->setValue(_font.pointSize());
+ fcb1->setChecked(_font.weight() == QFont::Bold);
+ fcb2->setChecked(_font.italic());
+ fcb3->setChecked(_font.underline());
+ int i;
+ for (i = 0; i < cb->count(); ++i) {
+ QString s = cb->itemText(i);
+ if (s == _font.family()) {
+ cb->setCurrentIndex(i);
+ break;
+ }
+ }
+ if (i == cb->count()) {
+ cb->addItem(_font.family());
+ cb->setCurrentIndex(i);
+ }
+ }
+
+//---------------------------------------------------------
+// font
+//---------------------------------------------------------
+
+const QFont& FontSel::font()
+ {
+ _font.setPointSize(s1->value());
+ _font.setWeight(fcb1->isChecked() ? QFont::Bold : QFont::Normal);
+ _font.setItalic(fcb2->isChecked());
+ _font.setUnderline(fcb3->isChecked());
+ _font.setFamily(cb->currentText());
+ return _font;
+ }
+
diff --git a/muse/muse/widgets/fontsel.h b/muse/muse/widgets/fontsel.h
new file mode 100644
index 00000000..20e6298e
--- /dev/null
+++ b/muse/muse/widgets/fontsel.h
@@ -0,0 +1,44 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: fontsel.h,v 1.2 2004/09/14 18:17:47 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __FONTSEL_H__
+#define __FONTSEL_H__
+
+#include "song.h"
+
+class QFont;
+class QSpinBox;
+class QToolButton;
+class QComboBox;
+
+//---------------------------------------------------------
+// FontSel
+//---------------------------------------------------------
+
+class FontSel : public QWidget {
+ QFont _font;
+ QSpinBox* s1;
+ QToolButton* fcb1;
+ QToolButton* fcb2;
+ QToolButton* fcb3;
+ QComboBox* cb;
+
+ Q_OBJECT
+
+ void setFont();
+
+ private slots:
+ void fontSelect();
+
+ public:
+ FontSel(QWidget* parent, const QFont&, const QString&);
+ const QFont& font();
+ };
+
+
+#endif
+
diff --git a/muse/muse/widgets/gatetime.cpp b/muse/muse/widgets/gatetime.cpp
new file mode 100644
index 00000000..dc0bf02c
--- /dev/null
+++ b/muse/muse/widgets/gatetime.cpp
@@ -0,0 +1,52 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: gatetime.cpp,v 1.5 2006/01/25 16:24:33 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "gatetime.h"
+#include "song.h"
+#include "tb1.h"
+
+//---------------------------------------------------------
+// GateTime
+//---------------------------------------------------------
+
+GateTime::GateTime(QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ rangeGroup = new QButtonGroup(this);
+ rangeGroup->setExclusive(true);
+ rangeGroup->addButton(allEventsButton, RANGE_ALL);
+ rangeGroup->addButton(selectedEventsButton, RANGE_SELECTED);
+ rangeGroup->addButton(loopedEventsButton, RANGE_LOOPED);
+ rangeGroup->addButton(selectedLoopedButton, RANGE_SELECTED | RANGE_LOOPED);
+ allEventsButton->setChecked(true);
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void GateTime::accept()
+ {
+ _range = rangeGroup->checkedId();
+ _rateVal = rate->value();
+ _offsetVal = offset->value();
+ QDialog::accept();
+ }
+
+//---------------------------------------------------------
+// setRange
+//---------------------------------------------------------
+
+void GateTime::setRange(int id)
+ {
+ if (rangeGroup->button(id))
+ rangeGroup->button(id)->setChecked(true);
+ else
+ printf("setRange: not button %d!\n", id);
+ }
+
diff --git a/muse/muse/widgets/gatetime.h b/muse/muse/widgets/gatetime.h
new file mode 100644
index 00000000..c5e0dfdb
--- /dev/null
+++ b/muse/muse/widgets/gatetime.h
@@ -0,0 +1,37 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: gatetime.h,v 1.3 2006/01/25 16:24:33 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __GATETIME_H__
+#define __GATETIME_H__
+
+#include "ui_gatetime.h"
+
+//---------------------------------------------------------
+// GateTime
+//---------------------------------------------------------
+
+class GateTime : public QDialog, public Ui::GateTimeBase {
+ Q_OBJECT
+
+ QButtonGroup* rangeGroup;
+ int _range;
+ int _rateVal;
+ int _offsetVal;
+
+ protected slots:
+ void accept();
+
+ public:
+ GateTime(QWidget* parent = 0);
+ void setRange(int id);
+ int range() const { return _range; }
+ int rateVal() const { return _rateVal; }
+ int offsetVal() const { return _offsetVal; }
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/gatetime.ui b/muse/muse/widgets/gatetime.ui
new file mode 100644
index 00000000..76d45ddc
--- /dev/null
+++ b/muse/muse/widgets/gatetime.ui
@@ -0,0 +1,210 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>GateTimeBase</class>
+ <widget class="QDialog" name="GateTimeBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>387</width>
+ <height>392</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Modify Gate Time</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="rangeGroup" >
+ <property name="title" >
+ <string>Apply To</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>3</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="allEventsButton" >
+ <property name="text" >
+ <string>All Events</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="selectedEventsButton" >
+ <property name="text" >
+ <string>Selected Events</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="loopedEventsButton" >
+ <property name="text" >
+ <string>Looped Events</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="selectedLoopedButton" >
+ <property name="text" >
+ <string>Selected AND Looped</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="GroupBox3" >
+ <property name="title" >
+ <string>Values</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>3</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>Rate:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel4" >
+ <property name="text" >
+ <string>Offset:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="rate" >
+ <property name="suffix" >
+ <string>%</string>
+ </property>
+ <property name="maximum" >
+ <number>200</number>
+ </property>
+ <property name="value" >
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="offset" >
+ <property name="maximum" >
+ <number>999</number>
+ </property>
+ <property name="minimum" >
+ <number>-999</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>false</bool>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GateTimeBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>211</x>
+ <y>360</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>36</x>
+ <y>356</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GateTimeBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>316</x>
+ <y>372</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>124</x>
+ <y>378</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/widgets/greendotbutton.h b/muse/muse/widgets/greendotbutton.h
new file mode 100644
index 00000000..8e100fb5
--- /dev/null
+++ b/muse/muse/widgets/greendotbutton.h
@@ -0,0 +1,25 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: greendotbutton.h,v 1.2 2005/11/05 11:05:25 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __GREENDOTBUTTON_H__
+#define __GREENDOTBUTTON_H__
+
+#include "simplebutton.h"
+
+//---------------------------------------------------------
+// GreendotButton
+//---------------------------------------------------------
+
+class GreendotButton : public SimpleButton {
+ Q_OBJECT
+
+ public:
+ GreendotButton(QWidget* parent = 0);
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/intlabel.h b/muse/muse/widgets/intlabel.h
new file mode 100644
index 00000000..6c77fa13
--- /dev/null
+++ b/muse/muse/widgets/intlabel.h
@@ -0,0 +1,43 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: intlabel.h,v 1.2 2004/09/14 18:17:47 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __INTLABEL_H__
+#define __INTLABEL_H__
+
+#include "nentry.h"
+
+class QString;
+
+//---------------------------------------------------------
+// IntLabel
+//---------------------------------------------------------
+
+class IntLabel : public Nentry {
+ int min, max, off;
+ QString suffix;
+ QString specialValue;
+ Q_OBJECT
+
+ void init();
+
+ virtual bool setSValue(const QString&);
+ virtual bool setString(int val, bool editable = false);
+ virtual void incValue(int);
+ virtual void decValue(int);
+
+ signals:
+ void valueChanged(int);
+
+ public:
+ IntLabel(int, int, int, QWidget*, int _off = MAXINT,
+ const QString& = QString(""), int lpos = 0);
+ void setOff(int v);
+ void setSuffix(const QString& s) { suffix = s; }
+ void setSpecialValueText(const QString& s);
+ };
+
+#endif
diff --git a/muse/muse/widgets/menutitle.cpp b/muse/muse/widgets/menutitle.cpp
new file mode 100644
index 00000000..2e153b74
--- /dev/null
+++ b/muse/muse/widgets/menutitle.cpp
@@ -0,0 +1,38 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: menutitle.cpp,v 1.1 2005/05/06 15:02:11 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "menutitle.h"
+
+//---------------------------------------------------------
+// MenuTitleItem
+//---------------------------------------------------------
+
+MenuTitleItem::MenuTitleItem(QString ss)
+ : s(ss)
+ {
+ }
+
+//---------------------------------------------------------
+// sizeHint
+//---------------------------------------------------------
+
+QSize MenuTitleItem::sizeHint()
+ {
+ return QSize(60, 20);
+ }
+
+//---------------------------------------------------------
+// drawItem
+//---------------------------------------------------------
+
+void MenuTitleItem::paint(QPainter* p, const QColorGroup&, bool,
+ bool, int x, int y, int w, int h)
+ {
+ p->fillRect(x, y, w, h, QBrush(lightGray));
+ p->drawText(x, y, w, h, AlignCenter, s);
+ }
diff --git a/muse/muse/widgets/menutitle.h b/muse/muse/widgets/menutitle.h
new file mode 100644
index 00000000..a35a9df6
--- /dev/null
+++ b/muse/muse/widgets/menutitle.h
@@ -0,0 +1,29 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: menutitle.h,v 1.1 2005/05/06 15:02:11 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MENUTITLE_H__
+#define __MENUTITLE_H__
+
+//---------------------------------------------------------
+// MenuTitleItem
+//---------------------------------------------------------
+
+class MenuTitleItem : public QCustomMenuItem {
+ QString s;
+ virtual bool fullSpan() const { return true; }
+ virtual bool isSeparator() const { return true; }
+ virtual void paint(QPainter* p, const QColorGroup& cg, bool act,
+ bool, int, int, int, int);
+ virtual QSize sizeHint();
+
+ public:
+ MenuTitleItem(QString s);
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/midisync.cpp b/muse/muse/widgets/midisync.cpp
new file mode 100644
index 00000000..cb38a62e
--- /dev/null
+++ b/muse/muse/widgets/midisync.cpp
@@ -0,0 +1,116 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: midisyncimpl.cpp,v 1.9 2005/12/07 19:23:29 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "al/al.h"
+#include "midisync.h"
+#include "sync.h"
+
+//---------------------------------------------------------
+// MidiSyncConfig
+// Midi Sync Config
+//---------------------------------------------------------
+
+MidiSyncConfig::MidiSyncConfig(QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ connect(okButton, SIGNAL(clicked()), SLOT(ok()));
+ connect(applyButton, SIGNAL(clicked()), SLOT(apply()));
+ connect(cancelButton, SIGNAL(clicked()), SLOT(cancel()));
+
+ connect(syncMaster, SIGNAL(toggled(bool)), SLOT(syncMasterChanged(bool)));
+ connect(syncSlave, SIGNAL(toggled(bool)), SLOT(syncSlaveChanged(bool)));
+
+ dstDevId->setValue(txDeviceId);
+ srcDevId->setValue(rxDeviceId);
+
+ mtcSync->setChecked(genMTCSync);
+ mcSync->setChecked(genMCSync);
+ midiMachineControl->setChecked(genMMC);
+
+ acceptMTCCheckbox->setChecked(acceptMTC);
+ acceptMCCheckbox->setChecked(acceptMC);
+ acceptMMCCheckbox->setChecked(acceptMMC);
+
+ mtcSyncType->setCurrentIndex(AL::mtcType);
+
+ mtcOffH->setValue(mtcOffset.h());
+ mtcOffM->setValue(mtcOffset.m());
+ mtcOffS->setValue(mtcOffset.s());
+ mtcOffF->setValue(mtcOffset.f());
+ mtcOffSf->setValue(mtcOffset.sf());
+
+ syncSlaveChanged(extSyncFlag);
+ }
+
+//---------------------------------------------------------
+// ok Pressed
+//---------------------------------------------------------
+
+void MidiSyncConfig::ok()
+ {
+ apply();
+ cancel();
+ }
+
+//---------------------------------------------------------
+// cancel Pressed
+//---------------------------------------------------------
+
+void MidiSyncConfig::cancel()
+ {
+ close();
+ }
+
+//---------------------------------------------------------
+// apply Pressed
+//---------------------------------------------------------
+
+void MidiSyncConfig::apply()
+ {
+ txDeviceId = dstDevId->value();
+ rxDeviceId = srcDevId->value();
+
+ genMTCSync = mtcSync->isChecked();
+ genMCSync = mcSync->isChecked();
+ genMMC = midiMachineControl->isChecked();
+
+ AL::mtcType = mtcSyncType->currentIndex();
+ extSyncFlag = syncSlave->isChecked();
+
+ mtcOffset.setH(mtcOffH->value());
+ mtcOffset.setM(mtcOffM->value());
+ mtcOffset.setS(mtcOffS->value());
+ mtcOffset.setF(mtcOffF->value());
+ mtcOffset.setSf(mtcOffSf->value());
+
+ acceptMC = acceptMCCheckbox->isChecked();
+ acceptMMC = acceptMMCCheckbox->isChecked();
+ acceptMTC = acceptMTCCheckbox->isChecked();
+ emit syncChanged();
+ }
+
+//---------------------------------------------------------
+// syncMasterChanged
+//---------------------------------------------------------
+
+void MidiSyncConfig::syncMasterChanged(bool val)
+ {
+ syncSlave->setChecked(!val);
+ }
+
+//---------------------------------------------------------
+// syncSlaveChanged
+//---------------------------------------------------------
+
+void MidiSyncConfig::syncSlaveChanged(bool val)
+ {
+ syncMaster->setChecked(!val);
+ }
+
+
diff --git a/muse/muse/widgets/midisync.h b/muse/muse/widgets/midisync.h
new file mode 100644
index 00000000..4466c0ed
--- /dev/null
+++ b/muse/muse/widgets/midisync.h
@@ -0,0 +1,37 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: midisyncimpl.h,v 1.3 2005/12/05 20:40:39 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MIDISYNC_H__
+#define __MIDISYNC_H__
+
+#include "ui_midisync.h"
+
+//---------------------------------------------------------
+// MidiSyncConfig
+//---------------------------------------------------------
+
+class MidiSyncConfig : public QDialog, private Ui::MidiSyncConfigBase {
+ Q_OBJECT
+
+ private slots:
+ void syncMasterChanged(bool);
+ void syncSlaveChanged(bool);
+ void ok();
+ void cancel();
+ void apply();
+
+ signals:
+ void syncChanged();
+
+ public:
+ MidiSyncConfig(QWidget* parent=0);
+ MidiSyncConfig();
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/midisync.ui b/muse/muse/widgets/midisync.ui
new file mode 100644
index 00000000..6ea9ef1a
--- /dev/null
+++ b/muse/muse/widgets/midisync.ui
@@ -0,0 +1,711 @@
+<ui version="4.0" >
+ <author>werner schweer</author>
+ <comment>midi sync
+configuration dialog</comment>
+ <exportmacro></exportmacro>
+ <class>MidiSyncConfigBase</class>
+ <widget class="QDialog" name="MidiSyncConfigBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>530</width>
+ <height>359</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Sync</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="syncMaster" >
+ <property name="title" >
+ <string>Master</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="mtcSync" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Midi Time Code (MTC)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="mcSync" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Midi Clock</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="midiMachineControl" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Midi Machine Control (MMC)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel7" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Id:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="dstDevId" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>device id</string>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="value" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QGroupBox" name="syncSlave" >
+ <property name="title" >
+ <string>Slave</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="checked" >
+ <bool>false</bool>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="acceptMTCCheckbox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>accept MTC</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="acceptMCCheckbox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>accept Midi Clock</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="acceptMMCCheckbox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>accept MMC</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel7_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Id:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="srcDevId" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>device id</string>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="value" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="applyButton" >
+ <property name="text" >
+ <string>Apply</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>Ok</string>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QGroupBox" name="GroupBox13" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>MTC</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Type:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="mtcSyncType" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <item>
+ <property name="text" >
+ <string>24</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>25</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>30D</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>30N</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>407</width>
+ <height>69</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1" >
+ <property name="text" >
+ <string>Offset:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="mtcOffH" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>hour</string>
+ </property>
+ <property name="maximum" >
+ <number>23</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>h</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="mtcOffM" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>minute</string>
+ </property>
+ <property name="maximum" >
+ <number>59</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>m</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="mtcOffS" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>second</string>
+ </property>
+ <property name="maximum" >
+ <number>59</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel4" >
+ <property name="text" >
+ <string>s</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="mtcOffF" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>frame</string>
+ </property>
+ <property name="maximum" >
+ <number>30</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel5" >
+ <property name="text" >
+ <string>f</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="mtcOffSf" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>subframe</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <tabstops>
+ <tabstop>acceptMTCCheckbox</tabstop>
+ <tabstop>acceptMCCheckbox</tabstop>
+ <tabstop>mtcSync</tabstop>
+ <tabstop>mcSync</tabstop>
+ <tabstop>midiMachineControl</tabstop>
+ <tabstop>dstDevId</tabstop>
+ <tabstop>mtcOffH</tabstop>
+ <tabstop>mtcOffM</tabstop>
+ <tabstop>mtcOffS</tabstop>
+ <tabstop>mtcOffF</tabstop>
+ <tabstop>mtcOffSf</tabstop>
+ <tabstop>applyButton</tabstop>
+ <tabstop>okButton</tabstop>
+ <tabstop>cancelButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>syncSlave</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>acceptMTCCheckbox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>377</x>
+ <y>79</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>341</x>
+ <y>67</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>syncSlave</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>acceptMCCheckbox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>365</x>
+ <y>102</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>361</x>
+ <y>94</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>syncSlave</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>acceptMMCCheckbox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>392</x>
+ <y>132</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>328</x>
+ <y>121</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>syncSlave</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>srcDevId</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>366</x>
+ <y>103</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>375</x>
+ <y>147</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>mcSync</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>mcSync</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>255</x>
+ <y>94</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>255</x>
+ <y>94</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>mtcSync</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>mtcSync</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>255</x>
+ <y>67</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>255</x>
+ <y>67</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>syncMaster</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>midiMachineControl</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>268</x>
+ <y>131</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>255</x>
+ <y>121</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>syncMaster</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>dstDevId</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>268</x>
+ <y>129</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>175</x>
+ <y>147</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>syncMaster</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>mtcSync</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>268</x>
+ <y>40</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>255</x>
+ <y>67</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>syncMaster</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>GroupBox13</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>53</x>
+ <y>17</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>41</x>
+ <y>256</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/widgets/mittransposebase.h b/muse/muse/widgets/mittransposebase.h
new file mode 100644
index 00000000..531cb200
--- /dev/null
+++ b/muse/muse/widgets/mittransposebase.h
@@ -0,0 +1,111 @@
+#ifndef MITTRANSPOSEBASE_H
+#define MITTRANSPOSEBASE_H
+
+#include <qvariant.h>
+
+
+#include <QtCore/QVariant>
+#include <QtGui/QAction>
+#include <QtGui/QApplication>
+#include <QtGui/QButtonGroup>
+#include <QtGui/QCheckBox>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QLabel>
+#include <QtGui/QWidget>
+#include "awl/pitchedit.h"
+#include <awl::pitchedit.h>
+#include <Qt3Support/Q3MimeSourceFactory>
+
+class Ui_MITTransposeBase
+{
+public:
+ QHBoxLayout *hboxLayout;
+ QCheckBox *onCheckBox;
+ QLabel *TextLabel1;
+ Awl::PitchEdit *triggerKeySpinBox;
+ QLabel *TextLabel2;
+ QLabel *transposeLabel;
+
+ void setupUi(QWidget *MITTransposeBase)
+ {
+ MITTransposeBase->setObjectName(QString::fromUtf8("MITTransposeBase"));
+ MITTransposeBase->resize(QSize(423, 50).expandedTo(MITTransposeBase->minimumSizeHint()));
+ hboxLayout = new QHBoxLayout(MITTransposeBase);
+ hboxLayout->setSpacing(6);
+ hboxLayout->setMargin(11);
+ hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
+ onCheckBox = new QCheckBox(MITTransposeBase);
+ onCheckBox->setObjectName(QString::fromUtf8("onCheckBox"));
+
+ hboxLayout->addWidget(onCheckBox);
+
+ TextLabel1 = new QLabel(MITTransposeBase);
+ TextLabel1->setObjectName(QString::fromUtf8("TextLabel1"));
+ TextLabel1->setAlignment(Qt::AlignVCenter|Qt::AlignRight);
+ TextLabel1->setIndent(5);
+
+ hboxLayout->addWidget(TextLabel1);
+
+ triggerKeySpinBox = new Awl::PitchEdit(MITTransposeBase);
+ triggerKeySpinBox->setObjectName(QString::fromUtf8("triggerKeySpinBox"));
+
+ hboxLayout->addWidget(triggerKeySpinBox);
+
+ TextLabel2 = new QLabel(MITTransposeBase);
+ TextLabel2->setObjectName(QString::fromUtf8("TextLabel2"));
+ TextLabel2->setAlignment(Qt::AlignVCenter|Qt::AlignRight);
+ TextLabel2->setIndent(5);
+
+ hboxLayout->addWidget(TextLabel2);
+
+ transposeLabel = new QLabel(MITTransposeBase);
+ transposeLabel->setObjectName(QString::fromUtf8("transposeLabel"));
+ QSizePolicy sizePolicy((QSizePolicy::Policy)5, (QSizePolicy::Policy)0);
+ sizePolicy.setHorizontalStretch(0);
+ sizePolicy.setVerticalStretch(0);
+ sizePolicy.setHeightForWidth(transposeLabel->sizePolicy().hasHeightForWidth());
+ transposeLabel->setSizePolicy(sizePolicy);
+ transposeLabel->setFrameShape(QFrame::Panel);
+ transposeLabel->setLineWidth(2);
+ transposeLabel->setMargin(2);
+ transposeLabel->setMidLineWidth(2);
+ transposeLabel->setAlignment(Qt::AlignVCenter|Qt::AlignRight);
+ transposeLabel->setIndent(5);
+
+ hboxLayout->addWidget(transposeLabel);
+
+ retranslateUi(MITTransposeBase);
+
+ QMetaObject::connectSlotsByName(MITTransposeBase);
+ } // setupUi
+
+ void retranslateUi(QWidget *MITTransposeBase)
+ {
+ MITTransposeBase->setWindowTitle(QApplication::translate("MITTransposeBase", "MusE: Midi Input Plugin: Transpose", 0, QApplication::UnicodeUTF8));
+ onCheckBox->setText(QApplication::translate("MITTransposeBase", "On", 0, QApplication::UnicodeUTF8));
+ TextLabel1->setText(QApplication::translate("MITTransposeBase", "TriggerKey", 0, QApplication::UnicodeUTF8));
+ TextLabel2->setText(QApplication::translate("MITTransposeBase", "Transpose:", 0, QApplication::UnicodeUTF8));
+ transposeLabel->setText(QApplication::translate("MITTransposeBase", "+0", 0, QApplication::UnicodeUTF8));
+ Q_UNUSED(MITTransposeBase);
+ } // retranslateUi
+
+};
+
+namespace Ui {
+ class MITTransposeBase: public Ui_MITTransposeBase {};
+} // namespace Ui
+
+class MITTransposeBase : public QWidget, public Ui::MITTransposeBase
+{
+ Q_OBJECT
+
+public:
+ MITTransposeBase(QWidget* parent = 0, const char* name = 0, Qt::WFlags fl = 0);
+ ~MITTransposeBase();
+
+protected slots:
+ virtual void languageChange();
+
+};
+
+#endif // MITTRANSPOSEBASE_H
diff --git a/muse/muse/widgets/mittransposebase.ui b/muse/muse/widgets/mittransposebase.ui
new file mode 100644
index 00000000..c1aad75a
--- /dev/null
+++ b/muse/muse/widgets/mittransposebase.ui
@@ -0,0 +1,112 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MITTransposeBase</class>
+ <widget class="QWidget" name="MITTransposeBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>423</width>
+ <height>50</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Input Plugin: Transpose</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="onCheckBox" >
+ <property name="text" >
+ <string>On</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>TriggerKey</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="indent" >
+ <number>5</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::PitchEdit" name="triggerKeySpinBox" />
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>Transpose:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="indent" >
+ <number>5</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="transposeLabel" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ <property name="text" >
+ <string>+0</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="margin" >
+ <number>2</number>
+ </property>
+ <property name="indent" >
+ <number>5</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>Awl::PitchEdit</class>
+ <extends>QWidget</extends>
+ <header>awl::pitchedit.h</header>
+ <container>1</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <includes>
+ <include location="local" >awl/pitchedit.h</include>
+ </includes>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/widgets/mixdowndialog.cpp b/muse/muse/widgets/mixdowndialog.cpp
new file mode 100644
index 00000000..39a6df9b
--- /dev/null
+++ b/muse/muse/widgets/mixdowndialog.cpp
@@ -0,0 +1,107 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mixdowndialog.cpp,v 1.8 2006/01/21 13:42:05 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "al/al.h"
+#include "mixdowndialog.h"
+#include "globals.h"
+#include "wave.h"
+
+//---------------------------------------------------------
+// sndFileOpen
+// sf - old soundfile, used to preset file parameters
+//---------------------------------------------------------
+
+SndFile* getSndFile(SndFile* sf, QWidget* parent)
+ {
+ MixdownFileDialog* dialog = new MixdownFileDialog(sf, parent);
+ dialog->exec();
+ SndFile* sndFile = dialog->sndFile();
+ delete dialog;
+ return sndFile;
+ }
+
+//---------------------------------------------------------
+// MixdownFileDialog
+//---------------------------------------------------------
+
+MixdownFileDialog::MixdownFileDialog(SndFile* _sf, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ sf = 0;
+ connect(buttonPath, SIGNAL(clicked()), SLOT(fdialog()));
+ if (_sf) {
+ int channels = _sf->channels();
+ int format = _sf->format();
+ switch(channels) {
+ case 1: channels = 1; break;
+ case 2: channels = 0; break;
+ case 6: channels = 2; break;
+ }
+ editPath->setText(_sf->finfo()->filePath());
+ comboChannel->setCurrentIndex(channels);
+ comboFormat->setCurrentIndex(format);
+ }
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void MixdownFileDialog::accept()
+ {
+ QString oldpath;
+ unsigned channel = comboChannel->currentIndex();
+ unsigned format = comboFormat->currentIndex();
+ switch (channel) {
+ case 0: channel = 2; break;
+ case 1: channel = 1; break;
+ case 2: channel = 6; break; // not implemented!
+ }
+ switch (format) {
+ case 0: // 16 bit wave
+ format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
+ break;
+ case 1: // 24 bit wave
+ format = SF_FORMAT_WAV | SF_FORMAT_PCM_24;
+ break;
+ case 2: // 32 bit float wave
+ format = SF_FORMAT_WAV | SF_FORMAT_FLOAT;
+ break;
+ }
+ QString path = editPath->text();
+ if (path.isEmpty()) {
+ sf = 0;
+ reject();
+ return;
+ }
+ if (path.right(4) != ".wav")
+ path += ".wav";
+ sf = new SndFile(path);
+ sf->setFormat(format, channel, AL::sampleRate);
+ done(1);
+ }
+
+//---------------------------------------------------------
+// fdialog
+//---------------------------------------------------------
+
+void MixdownFileDialog::fdialog()
+ {
+ QString oldpath;
+ if (sf)
+ oldpath = sf->finfo()->filePath();
+ QString path = QFileDialog::getSaveFileName(
+ this,
+ tr("MusE: set mixdown file name"),
+ oldpath,
+ tr("Wave Files (*.wav);;All Files (*)")
+ );
+ if (!path.isEmpty())
+ editPath->setText(path);
+ }
+
diff --git a/muse/muse/widgets/mixdowndialog.h b/muse/muse/widgets/mixdowndialog.h
new file mode 100644
index 00000000..85427076
--- /dev/null
+++ b/muse/muse/widgets/mixdowndialog.h
@@ -0,0 +1,35 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mixdowndialog.h,v 1.4 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MIXDOWNDIALOG_H__
+#define __MIXDOWNDIALOG_H__
+
+#include "ui_mixdowndialog.h"
+
+class SndFile;
+
+extern SndFile* getSndFile(SndFile* sf, QWidget* parent);
+
+//---------------------------------------------------------
+// MixdownFileDialog
+//---------------------------------------------------------
+
+class MixdownFileDialog : public QDialog, private Ui::MixdownFileDialogBase {
+ Q_OBJECT
+ SndFile* sf;
+
+ private slots:
+ void fdialog();
+ virtual void accept();
+
+ public:
+ MixdownFileDialog(SndFile* f, QWidget* parent = 0);
+ SndFile* sndFile() { return sf; }
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/mixdowndialog.ui b/muse/muse/widgets/mixdowndialog.ui
new file mode 100644
index 00000000..1789935d
--- /dev/null
+++ b/muse/muse/widgets/mixdowndialog.ui
@@ -0,0 +1,214 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MixdownFileDialogBase</class>
+ <widget class="QDialog" name="MixdownFileDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>381</width>
+ <height>116</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Set Mixdown Wavefile</string>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="0" colspan="5" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonOk" >
+ <property name="text" >
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonCancel" >
+ <property name="text" >
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>File Path</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>Channel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="4" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLineEdit" name="editPath" />
+ </item>
+ <item>
+ <widget class="QToolButton" name="buttonPath" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="comboChannel" >
+ <item>
+ <property name="text" >
+ <string>Stereo</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Mono</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>5.1</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QComboBox" name="comboFormat" >
+ <item>
+ <property name="text" >
+ <string>wav,16 Bit</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>wav, 24 Bit</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>wav, 32 Bit (float)</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>Format</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>MixdownFileDialogBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>248</x>
+ <y>93</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>99</x>
+ <y>89</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>MixdownFileDialogBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>318</x>
+ <y>94</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>170</x>
+ <y>105</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/widgets/mtrackinfobase.ui b/muse/muse/widgets/mtrackinfobase.ui
new file mode 100644
index 00000000..fc2eba53
--- /dev/null
+++ b/muse/muse/widgets/mtrackinfobase.ui
@@ -0,0 +1,661 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MidiTrackInfoBase</class>
+ <widget class="QWidget" name="MidiTrackInfoBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>155</width>
+ <height>550</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>2</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: TrackInfo</string>
+ </property>
+ <property name="toolTip" >
+ <string/>
+ </property>
+ <property name="whatsThis" >
+ <string/>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>0</number>
+ </property>
+ <item row="3" column="0" >
+ <widget class="QSpinBox" name="iOutputChannel" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Output Channel</string>
+ </property>
+ <property name="whatsThis" >
+ <string>all midi events are send to this output channel</string>
+ </property>
+ <property name="maximum" >
+ <number>16</number>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>1</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>0</number>
+ </property>
+ <property name="text" >
+ <string>Track Info</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0" >
+ <widget class="QSpinBox" name="iLen" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Modify Note Length</string>
+ </property>
+ <property name="suffix" >
+ <string>%</string>
+ </property>
+ <property name="maximum" >
+ <number>200</number>
+ </property>
+ <property name="minimum" >
+ <number>25</number>
+ </property>
+ <property name="value" >
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QLineEdit" name="iName" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Track Name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="OutportCombo" name="iOutput" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Output Port</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>OCh.</string>
+ </property>
+ <property name="margin" >
+ <number>2</number>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0" >
+ <widget class="QSpinBox" name="iVerz" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Track Delay (ticks)</string>
+ </property>
+ <property name="specialValueText" >
+ <string>off</string>
+ </property>
+ <property name="maximum" >
+ <number>1000</number>
+ </property>
+ <property name="minimum" >
+ <number>-1000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="0" >
+ <widget class="QSpinBox" name="iAnschl" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>-127</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="0" >
+ <widget class="QSpinBox" name="iKompr" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Compress Note Velocity</string>
+ </property>
+ <property name="suffix" >
+ <string>%</string>
+ </property>
+ <property name="prefix" >
+ <string/>
+ </property>
+ <property name="maximum" >
+ <number>200</number>
+ </property>
+ <property name="minimum" >
+ <number>25</number>
+ </property>
+ <property name="value" >
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0" >
+ <widget class="QSpinBox" name="iTransp" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Transpose</string>
+ </property>
+ <property name="specialValueText" >
+ <string>off</string>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>-127</number>
+ </property>
+ <property name="value" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1" >
+ <widget class="QLabel" name="TextLabel9" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Transp.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1" >
+ <widget class="QLabel" name="TextLabel10" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Delay</string>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="1" >
+ <widget class="QLabel" name="TextLabel13" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Compr.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="1" >
+ <widget class="QLabel" name="TextLabel12" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Modify Note Velocity</string>
+ </property>
+ <property name="text" >
+ <string>Velocity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="1" >
+ <widget class="QLabel" name="TextLabel11" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Length</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="2" >
+ <widget class="QLineEdit" name="iInput" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Input Ports</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>IChan.</string>
+ </property>
+ <property name="margin" >
+ <number>2</number>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLineEdit" name="iInputChannel" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Input Channels</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Events from all configured channels are
+recorded to this track.
+You can specify more than one channel for
+recording:
+ 1 2 3 record from channel 1 2 and 3
+ 1-3 same
+ 1-3 5 record from channel 1 2 3 and 5</string>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="0" colspan="2" >
+ <widget class="QLabel" name="TextLabel1_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>1</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ <property name="text" >
+ <string>Channel Info</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="13" column="0" colspan="2" >
+ <widget class="QPushButton" name="iPatch" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Select Instrument Patch</string>
+ </property>
+ <property name="text" >
+ <string>???</string>
+ </property>
+ </widget>
+ </item>
+ <item row="14" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ </layout>
+ </item>
+ <item row="17" column="0" >
+ <widget class="QSpinBox" name="iProgram" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="specialValueText" >
+ <string>off</string>
+ </property>
+ <property name="maximum" >
+ <number>128</number>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="16" column="0" >
+ <widget class="QSpinBox" name="iLBank" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Bank Select LSB</string>
+ </property>
+ <property name="specialValueText" >
+ <string>off</string>
+ </property>
+ <property name="maximum" >
+ <number>128</number>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="15" column="0" >
+ <widget class="QSpinBox" name="iHBank" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Bank Select MSB</string>
+ </property>
+ <property name="specialValueText" >
+ <string>off</string>
+ </property>
+ <property name="maximum" >
+ <number>128</number>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="15" column="1" >
+ <widget class="QLabel" name="TextLabel4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Instrument High Bank</string>
+ </property>
+ <property name="text" >
+ <string>H-Bank</string>
+ </property>
+ </widget>
+ </item>
+ <item row="16" column="1" >
+ <widget class="QLabel" name="TextLabel5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Instrument Low Bank</string>
+ </property>
+ <property name="lineWidth" >
+ <number>0</number>
+ </property>
+ <property name="text" >
+ <string>L-Bank</string>
+ </property>
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="indent" >
+ <number>2</number>
+ </property>
+ </widget>
+ </item>
+ <item row="17" column="1" >
+ <widget class="QLabel" name="TextLabel6" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Instrument/Program/Patch</string>
+ </property>
+ <property name="text" >
+ <string>Progr.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="20" column="0" colspan="2" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>OutportCombo</class>
+ <extends></extends>
+ <header>outportcombo.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>iName</tabstop>
+ <tabstop>iOutput</tabstop>
+ <tabstop>iOutputChannel</tabstop>
+ <tabstop>iInput</tabstop>
+ <tabstop>iInputChannel</tabstop>
+ <tabstop>iTransp</tabstop>
+ <tabstop>iVerz</tabstop>
+ <tabstop>iLen</tabstop>
+ <tabstop>iAnschl</tabstop>
+ <tabstop>iKompr</tabstop>
+ <tabstop>iPatch</tabstop>
+ <tabstop>iProgram</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/widgets/noteinfo.cpp b/muse/muse/widgets/noteinfo.cpp
new file mode 100644
index 00000000..b7bf38ed
--- /dev/null
+++ b/muse/muse/widgets/noteinfo.cpp
@@ -0,0 +1,194 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: noteinfo.cpp,v 1.14 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "noteinfo.h"
+#include "song.h"
+#include "globals.h"
+#include "awl/posedit.h"
+#include "awl/pitchedit.h"
+
+//---------------------------------------------------
+// NoteInfo
+// ToolBar
+// Start, Länge, Note, Velo an, Velo aus, Kanal
+//---------------------------------------------------
+
+NoteInfo::NoteInfo(QMainWindow* parent)
+ : QToolBar(tr("Note Info"), parent)
+ {
+ deltaMode = false;
+
+ QLabel* label = new QLabel(tr("Start"));
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ label->setIndent(3);
+ addWidget(label);
+
+ selTime = new Awl::PosEdit;
+ selTime->setFixedHeight(24);
+ addWidget(selTime);
+
+ label = new QLabel(tr("Len"), this);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ label->setIndent(3);
+ addWidget(label);
+
+ selLen = new QSpinBox(this);
+ selLen->setRange(0, 100000);
+ selLen->setFixedHeight(24);
+ addWidget(selLen);
+
+ label = new QLabel(tr("Pitch"), this);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ label->setIndent(3);
+ addWidget(label);
+ selPitch = new Awl::PitchEdit(this);
+ selPitch->setFixedHeight(24);
+ addWidget(selPitch);
+
+ label = new QLabel(tr("Velo On"), this);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ label->setIndent(3);
+ addWidget(label);
+ selVelOn = new QSpinBox(this);
+ selVelOn->setRange(0, 127);
+ selVelOn->setFixedHeight(24);
+ addWidget(selVelOn);
+
+ label = new QLabel(tr("Velo Off"), this);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ label->setIndent(3);
+ addWidget(label);
+ selVelOff = new QSpinBox(this);
+ selVelOff->setRange(0, 127);
+ selVelOff->setFixedHeight(24);
+ addWidget(selVelOff);
+
+ connect(selLen, SIGNAL(valueChanged(int)), SLOT(lenChanged(int)));
+ connect(selPitch, SIGNAL(valueChanged(int)), SLOT(pitchChanged(int)));
+ connect(selVelOn, SIGNAL(valueChanged(int)), SLOT(velOnChanged(int)));
+ connect(selVelOff, SIGNAL(valueChanged(int)), SLOT(velOffChanged(int)));
+ connect(selTime, SIGNAL(valueChanged(const Pos&)), SLOT(timeChanged(const Pos&)));
+ }
+
+//---------------------------------------------------------
+// setDeltaMode
+//---------------------------------------------------------
+
+void NoteInfo::setDeltaMode(bool val)
+ {
+ deltaMode = val;
+ selPitch->setDeltaMode(val);
+ if (val) {
+ selLen->setRange(-100000, 100000);
+ selVelOn->setRange(-127, 127);
+ selVelOff->setRange(-127, 127);
+ }
+ else {
+ selLen->setRange(0, 100000);
+ selVelOn->setRange(0, 127);
+ selVelOff->setRange(0, 127);
+ }
+ }
+
+//---------------------------------------------------------
+// lenChanged
+//---------------------------------------------------------
+
+void NoteInfo::lenChanged(int val)
+ {
+ if (!signalsBlocked())
+ emit valueChanged(VAL_LEN, val);
+ }
+
+//---------------------------------------------------------
+// velOnChanged
+//---------------------------------------------------------
+
+void NoteInfo::velOnChanged(int val)
+ {
+ if (!signalsBlocked())
+ emit valueChanged(VAL_VELON, val);
+ }
+
+//---------------------------------------------------------
+// velOffChanged
+//---------------------------------------------------------
+
+void NoteInfo::velOffChanged(int val)
+ {
+ if (!signalsBlocked())
+ emit valueChanged(VAL_VELOFF, val);
+ }
+
+//---------------------------------------------------------
+// pitchChanged
+//---------------------------------------------------------
+
+void NoteInfo::pitchChanged(int val)
+ {
+ if (!signalsBlocked())
+ emit valueChanged(VAL_PITCH, val);
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void NoteInfo::setValue(ValType type, int val)
+ {
+ blockSignals(true);
+ switch(type) {
+ case VAL_TIME:
+ selTime->setValue(val);
+ break;
+ case VAL_LEN:
+ selLen->setValue(val);
+ break;
+ case VAL_VELON:
+ selVelOn->setValue(val);
+ break;
+ case VAL_VELOFF:
+ selVelOff->setValue(val);
+ break;
+ case VAL_PITCH:
+ selPitch->setValue(val);
+ break;
+ }
+ blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void NoteInfo::setValues(unsigned tick, int val2, int val3, int val4,
+ int val5)
+ {
+ blockSignals(true);
+ if (selTime->pos().tick() != tick)
+ selTime->setValue(tick);
+ if (selLen->value() != val2)
+ selLen->setValue(val2);
+ if (selPitch->value() != val3)
+ selPitch->setValue(val3);
+ if (selVelOn->value() != val4)
+ selVelOn->setValue(val4);
+ if (selVelOff->value() != val5)
+ selVelOff->setValue(val5);
+ blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// timeChanged
+//---------------------------------------------------------
+
+void NoteInfo::timeChanged(const Pos& pos)
+ {
+ if (!signalsBlocked())
+ emit valueChanged(VAL_TIME, pos.tick());
+ }
+
diff --git a/muse/muse/widgets/noteinfo.h b/muse/muse/widgets/noteinfo.h
new file mode 100644
index 00000000..45a090d9
--- /dev/null
+++ b/muse/muse/widgets/noteinfo.h
@@ -0,0 +1,55 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: noteinfo.h,v 1.9 2005/10/05 18:15:27 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __NOTE_INFO_H__
+#define __NOTE_INFO_H__
+
+namespace Awl {
+ class PosEdit;
+ class PitchEdit;
+ };
+namespace AL {
+ class Pos;
+ }
+
+using AL::Pos;
+
+//---------------------------------------------------------
+// NoteInfo
+//---------------------------------------------------------
+
+class NoteInfo : public QToolBar {
+ Awl::PosEdit* selTime;
+ QSpinBox* selLen;
+ Awl::PitchEdit* selPitch;
+ QSpinBox* selVelOn;
+ QSpinBox* selVelOff;
+ bool deltaMode;
+
+ Q_OBJECT
+
+ public:
+ enum ValType {VAL_TIME, VAL_LEN, VAL_VELON, VAL_VELOFF, VAL_PITCH };
+ NoteInfo(QMainWindow* parent);
+ void setValues(unsigned, int, int, int, int);
+ void setDeltaMode(bool);
+
+ private slots:
+ void lenChanged(int);
+ void velOnChanged(int);
+ void velOffChanged(int);
+ void pitchChanged(int);
+ void timeChanged(const Pos&);
+
+ public slots:
+ void setValue(ValType, int);
+
+ signals:
+ void valueChanged(NoteInfo::ValType, int);
+ };
+#endif
+
diff --git a/muse/muse/widgets/outportcombo.cpp b/muse/muse/widgets/outportcombo.cpp
new file mode 100644
index 00000000..1bbf30a9
--- /dev/null
+++ b/muse/muse/widgets/outportcombo.cpp
@@ -0,0 +1,39 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: outportcombo.cpp,v 1.3 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer
+//=========================================================
+
+#include "outportcombo.h"
+#include "midiport.h"
+#include "song.h"
+
+//---------------------------------------------------------
+// OutportCombo
+//---------------------------------------------------------
+
+OutportCombo::OutportCombo(QWidget* parent)
+ : QComboBox(parent)
+ {
+ setToolTip(tr("Midi Output Port"));
+ populate();
+ // midiPort names may change, when inserting/deleting syntis
+ connect(song, SIGNAL(trackAdded(Track*,int)), SLOT(populate()));
+ connect(song, SIGNAL(trackRemoved(Track*)), SLOT(populate()));
+ }
+
+//---------------------------------------------------------
+// populate
+//---------------------------------------------------------
+
+void OutportCombo::populate()
+ {
+ int cur = currentIndex();
+ clear();
+ MidiOutPortList* mpl = song->midiOutPorts();
+ for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i)
+ addItem((*i)->name());
+ setCurrentIndex(cur);
+ }
+
diff --git a/muse/muse/widgets/outportcombo.h b/muse/muse/widgets/outportcombo.h
new file mode 100644
index 00000000..1c44bd30
--- /dev/null
+++ b/muse/muse/widgets/outportcombo.h
@@ -0,0 +1,26 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: outportcombo.h,v 1.2 2005/11/04 12:03:48 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer
+//=========================================================
+
+#ifndef __OUTPORTCOMBO_H__
+#define __OUTPORTCOMBO_H__
+
+//---------------------------------------------------------
+// OutportCombo
+//---------------------------------------------------------
+
+class OutportCombo : public QComboBox {
+ Q_OBJECT
+
+ private slots:
+ void populate();
+
+ public:
+ OutportCombo(QWidget* parent = 0);
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/quantcombo.cpp b/muse/muse/widgets/quantcombo.cpp
new file mode 100644
index 00000000..74df5403
--- /dev/null
+++ b/muse/muse/widgets/quantcombo.cpp
@@ -0,0 +1,67 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: quantcombo.cpp,v 1.2 2006/01/25 16:24:33 wschweer Exp $
+// (C) Copyright 2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "quantcombo.h"
+
+static int quantTable[] = {
+ 1, 24, 48, 96, 192, 384, 768, 1536,
+ 16, 32, 64, 128, 256, 512, 1024,
+ 36, 72, 144, 288, 576, 1152, 2304
+ };
+
+static const char* quantStrings[] = {
+ QT_TR_NOOP("Off"), "64", "32", "16", "8", "4", "2", "1",
+ "64T", "32T", "16T", "8T", "4T", "2T", "1T",
+ "64.", "32.", "16.", "8.", "4.", "2.", "1."
+ };
+
+//---------------------------------------------------------
+// QuantCombo
+//---------------------------------------------------------
+
+QuantCombo::QuantCombo(QWidget* parent)
+ : QComboBox(parent)
+ {
+ for (unsigned i = 0; i < sizeof(quantStrings)/sizeof(*quantStrings); i++)
+ addItem(tr(quantStrings[i]), i);
+ connect(this, SIGNAL(activated(int)), SLOT(_quantChanged(int)));
+ }
+
+//---------------------------------------------------------
+// _quantChanged
+//---------------------------------------------------------
+
+void QuantCombo::_quantChanged(int idx)
+ {
+ emit quantChanged(quantTable[idx]);
+ }
+
+//---------------------------------------------------------
+// quant
+//---------------------------------------------------------
+
+int QuantCombo::quant() const
+ {
+ return quantTable[currentIndex()];
+ }
+
+//---------------------------------------------------------
+// setQuant
+//---------------------------------------------------------
+
+void QuantCombo::setQuant(int val)
+ {
+ for (unsigned i = 0; i < sizeof(quantTable)/sizeof(*quantTable); i++) {
+ if (val == quantTable[i]) {
+ setCurrentIndex(i);
+ return;
+ }
+ }
+ printf("setQuant(%d) not defined\n", val);
+abort();
+ setCurrentIndex(0);
+ }
diff --git a/muse/muse/widgets/quantcombo.h b/muse/muse/widgets/quantcombo.h
new file mode 100644
index 00000000..6bffe613
--- /dev/null
+++ b/muse/muse/widgets/quantcombo.h
@@ -0,0 +1,33 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: quantcombo.h,v 1.1 2006/01/24 21:19:28 wschweer Exp $
+// (C) Copyright 2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __QUANTCOMBO_H__
+#define __QUANTCOMBO_H__
+
+//---------------------------------------------------------
+// QuantCombo
+//---------------------------------------------------------
+
+class QuantCombo : public QComboBox {
+ Q_OBJECT
+
+ private slots:
+ void _quantChanged(int);
+
+ public slots:
+ void setQuant(int);
+
+ signals:
+ void quantChanged(int);
+
+ public:
+ QuantCombo(QWidget* parent = 0);
+ int quant() const;
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/rastercombo.cpp b/muse/muse/widgets/rastercombo.cpp
new file mode 100644
index 00000000..8cb4ba8f
--- /dev/null
+++ b/muse/muse/widgets/rastercombo.cpp
@@ -0,0 +1,69 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: rastercombo.cpp,v 1.1 2006/01/24 21:19:28 wschweer Exp $
+// (C) Copyright 2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "rastercombo.h"
+
+static int rasterTable[] = {
+ //------ 8 4 2
+ 1, 6, 12, 24, 48, 96, 192, 384, 768, 1536,
+ 4, 8, 16, 32, 64, 128, 256, 512, 1024,
+ 9, 18, 36, 72, 144, 288, 576, 1152, 2304
+ };
+
+static const char* rasterStrings[] = {
+ QT_TR_NOOP("Off"), "3pp", "6pp", "64", "32", "16", "8", "4", "2", "1",
+ "2pp", "5pp", "64T", "32T", "16T", "8T", "4T", "2T", "1T",
+ "4pp", "7pp", "64.", "32.", "16.", "8.", "4.", "2.", "1."
+ };
+
+//---------------------------------------------------------
+// RasterCombo
+//---------------------------------------------------------
+
+RasterCombo::RasterCombo(QWidget* parent)
+ : QComboBox(parent)
+ {
+ for (unsigned i = 0; i < sizeof(rasterStrings)/sizeof(*rasterStrings); i++)
+ addItem(tr(rasterStrings[i]), i);
+ connect(this, SIGNAL(activated(int)), SLOT(_rasterChanged(int)));
+ }
+
+//---------------------------------------------------------
+// _rasterChanged
+//---------------------------------------------------------
+
+void RasterCombo::_rasterChanged(int idx)
+ {
+ emit rasterChanged(rasterTable[idx]);
+ }
+
+//---------------------------------------------------------
+// raster
+//---------------------------------------------------------
+
+int RasterCombo::raster() const
+ {
+ return rasterTable[currentIndex()];
+ }
+
+//---------------------------------------------------------
+// setRaster
+//---------------------------------------------------------
+
+void RasterCombo::setRaster(int val)
+ {
+ for (unsigned i = 0; i < sizeof(rasterTable)/sizeof(*rasterTable); i++) {
+ if (val == rasterTable[i]) {
+ setCurrentIndex(i);
+ return;
+ }
+ }
+ printf("setRaster(%d) not defined\n", val);
+ setCurrentIndex(0);
+ }
+
+
diff --git a/muse/muse/widgets/rastercombo.h b/muse/muse/widgets/rastercombo.h
new file mode 100644
index 00000000..8e98fc28
--- /dev/null
+++ b/muse/muse/widgets/rastercombo.h
@@ -0,0 +1,33 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: rastercombo.h,v 1.1 2006/01/24 21:19:28 wschweer Exp $
+// (C) Copyright 2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __RASTERCOMBO_H__
+#define __RASTERCOMBO_H__
+
+//---------------------------------------------------------
+// RasterCombo
+//---------------------------------------------------------
+
+class RasterCombo : public QComboBox {
+ Q_OBJECT
+
+ private slots:
+ void _rasterChanged(int);
+
+ public slots:
+ void setRaster(int);
+
+ signals:
+ void rasterChanged(int);
+
+ public:
+ RasterCombo(QWidget* parent = 0);
+ int raster() const;
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/recordbutton.h b/muse/muse/widgets/recordbutton.h
new file mode 100644
index 00000000..1af255dc
--- /dev/null
+++ b/muse/muse/widgets/recordbutton.h
@@ -0,0 +1,25 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: recordbutton.h,v 1.2 2005/11/05 11:05:25 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __RECORDBUTTON_H__
+#define __RCORDBUTTON_H__
+
+#include "simplebutton.h"
+
+//---------------------------------------------------------
+// RecordButton
+//---------------------------------------------------------
+
+class RecordButton : public SimpleButton {
+ Q_OBJECT
+
+ public:
+ RecordButton(QWidget* parent = 0);
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/shortcutcapturedialog.cpp b/muse/muse/widgets/shortcutcapturedialog.cpp
new file mode 100644
index 00000000..c204d8e6
--- /dev/null
+++ b/muse/muse/widgets/shortcutcapturedialog.cpp
@@ -0,0 +1,88 @@
+//
+// C++ Implementation: shortcutcapturedialog
+//
+// Description:
+// Dialog window for capturing keyboard shortcuts
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sourceforge.net>, (C) 2003
+//
+// Copyright: Mathias Lundgren (lunar_shuttle@users.sourceforge.net) (C) 2003
+//
+//
+#include "shortcutcapturedialog.h"
+#include "shortcuts.h"
+
+ShortcutCaptureDialog::ShortcutCaptureDialog(QWidget* parent, int index)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ QKeySequence q = QKeySequence(shortcuts[index].key);
+ oshrtLabel->setText(q);
+ connect(okButton, SIGNAL( clicked() ), this, SLOT( apply() ) );
+ connect(cancelButton, SIGNAL(pressed()), this, SLOT(cancel()));
+ shortcutindex = index;
+ grabKeyboard();
+ okButton->setText(tr("Ok"));
+ cancelButton->setText(tr("Cancel"));
+ }
+
+ShortcutCaptureDialog::~ShortcutCaptureDialog()
+ {
+ releaseKeyboard();
+ }
+
+void ShortcutCaptureDialog::keyPressEvent(QKeyEvent* e)
+ {
+ bool shift, alt, ctrl, conflict = false, realkey = false;
+ QString msgString = "";
+ int temp_key;
+ shift = e->modifiers() & Qt::ShiftModifier;
+ ctrl = e->modifiers() & Qt::ControlModifier;
+ alt = e->modifiers() & Qt::AltModifier;
+
+ //printf("Key total: %d, alt: %d, ctrl: %d shift: %d\n",e->key(), alt, ctrl, shift);
+ temp_key = e->key();
+ if (shift)
+ temp_key += Qt::SHIFT;
+ if (ctrl)
+ temp_key += Qt::CTRL;
+ if (alt)
+ temp_key += Qt::ALT;
+ //printf("Final key assembled: %d\n",temp_key);
+
+ // Check if this is a "real" key that completes a valid shortcut:
+ int k = e->key();
+ if (k < 256 || k == Qt::Key_Enter || k == Qt::Key_Return || k >= Qt::Key_F1 && k <= Qt::Key_F12 || k == Qt::Key_Home || k == Qt::Key_PageUp
+ || k == Qt::Key_PageDown || k == Qt::Key_End || k == Qt::Key_Insert || k == Qt::Key_Delete) {
+ key = temp_key;
+ realkey = true;
+ QKeySequence q = QKeySequence(key);
+ QString keyString = q;
+ if (keyString != QString::null)
+ nshrtLabel->setText(q);
+
+ // Check against conflicting shortcuts
+ for (int i=0; i < SHRT_NUM_OF_ELEMENTS; i++) {
+ if (i != shortcutindex) { //check all other than current shortcut
+ if (shortcuts[i].key == key && (shortcuts[i].type & (shortcuts[shortcutindex].type | GLOBAL_SHRT | INVIS_SHRT))) {
+ msgString = tr("Shortcut conflicts with ") + QString(shortcuts[i].descr);
+ conflict = true;
+ break;
+ }
+ }
+ }
+ }
+ messageLabel->setText(msgString);
+ okButton->setEnabled(conflict == false && realkey);
+ if (!realkey)
+ nshrtLabel->setText(tr("Undefined"));
+
+
+ }
+
+void ShortcutCaptureDialog::apply()
+ {
+ //return the shortcut to configurator widget:
+ done(key);
+ }
+
diff --git a/muse/muse/widgets/shortcutcapturedialog.h b/muse/muse/widgets/shortcutcapturedialog.h
new file mode 100644
index 00000000..dffc5f42
--- /dev/null
+++ b/muse/muse/widgets/shortcutcapturedialog.h
@@ -0,0 +1,33 @@
+//
+// C++ Interface: shortcutcapturedialog
+//
+// Description:
+// Dialog window for capturing keyboard shortcuts
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sourceforge.net>, (C) 2003
+//
+// Copyright: Mathias Lundgren (lunar_shuttle@users.sourceforge.net) (C) 2003
+//
+//
+
+#include "shortcuts.h"
+#include "filedialog.h"
+#include "ui_shortcutcapturedialog.h"
+
+class ShortcutCaptureDialog : public QDialog, public Ui::ShortcutCaptureDialogBase
+ {
+ Q_OBJECT
+ private:
+ int shortcutindex;
+ void keyPressEvent(QKeyEvent* e);
+ int key;
+
+ private slots:
+ void apply();
+ void cancel() { reject(); };
+
+ public:
+ ShortcutCaptureDialog(QWidget* parent = 0, int index = 0);
+ ~ShortcutCaptureDialog();
+ };
+
diff --git a/muse/muse/widgets/shortcutcapturedialog.ui b/muse/muse/widgets/shortcutcapturedialog.ui
new file mode 100644
index 00000000..8b7c4b97
--- /dev/null
+++ b/muse/muse/widgets/shortcutcapturedialog.ui
@@ -0,0 +1,125 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>ShortcutCaptureDialogBase</class>
+ <widget class="QDialog" name="ShortcutCaptureDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>461</width>
+ <height>214</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Enter shortcut sequence</string>
+ </property>
+ <property name="modal" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="4" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ <property name="shortcut" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="nshrtTextLabel" >
+ <property name="text" >
+ <string>New shortcut:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLineEdit" name="oshrtLabel" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="descrLabel" >
+ <property name="text" >
+ <string>Press keys to enter shortcut sequence!</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="oshrtTextLabel" >
+ <property name="text" >
+ <string>Old shortcut:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QLineEdit" name="nshrtLabel" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QLabel" name="messageLabel" >
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/widgets/shortcutconfig.cpp b/muse/muse/widgets/shortcutconfig.cpp
new file mode 100644
index 00000000..d2d54355
--- /dev/null
+++ b/muse/muse/widgets/shortcutconfig.cpp
@@ -0,0 +1,118 @@
+//
+// C++ Implementation: shortcutconfig
+//
+// Description:
+// Dialog for configuring keyboard shortcuts
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sourceforge.net>, (C) 2003
+//
+// Copyright: Mathias Lundgren (lunar_shuttle@users.sourceforge.net) (C) 2003
+//
+//
+#include "shortcutconfig.h"
+#include "shortcutcapturedialog.h"
+#include "shortcuts.h"
+
+ShortcutConfig::ShortcutConfig(QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ connect(cgListView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
+ this, SLOT(categorySelChanged(QTreeWidgetItem*)));
+ connect(scListView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
+ this, SLOT(shortcutSelChanged(QTreeWidgetItem*)));
+ connect(defineButton, SIGNAL(pressed()), this, SLOT(assignShortcut()));
+ connect(clearButton, SIGNAL(pressed()), this, SLOT(clearShortcut()));
+ connect(applyButton, SIGNAL(pressed()), this, SLOT(assignAll()));
+
+ current_category = ALL_SHRT;
+//TD cgListView->setSorting(SHRT_CATEGORY_COL, -1);
+ _config_changed = false;
+
+ //Fill up category listview:
+ for (int i=0; i < SHRT_NUM_OF_CATEGORIES; i++) {
+ QTreeWidgetItem* newItem = new QTreeWidgetItem;
+ newItem->setText(SHRT_CATEGORY_COL, tr(shortcut_category[i].name));
+ newItem->setData(0, 1, i);
+ cgListView->addTopLevelItem(newItem);
+ }
+ updateSCListView();
+ }
+
+void ShortcutConfig::updateSCListView(int category)
+ {
+ scListView->clear();
+ for (int i=0; i < SHRT_NUM_OF_ELEMENTS; i++) {
+ if (shortcuts[i].type & category) {
+ QTreeWidgetItem* newItem;
+ newItem = new QTreeWidgetItem;
+ newItem->setText(SHRT_DESCR_COL, shortcuts[i].descr);
+ QKeySequence key = QKeySequence(shortcuts[i].key);
+ newItem->setText(SHRT_SHRTCUT_COL, key);
+ newItem->setData(0, 1, i);
+ scListView->addTopLevelItem(newItem);
+ }
+ }
+ }
+
+void ShortcutConfig::assignShortcut()
+ {
+ QTreeWidgetItem* active = scListView->currentItem();
+ int shortcutindex = active->data(0, 1).toInt();
+ ShortcutCaptureDialog* sc = new ShortcutCaptureDialog(this, shortcutindex);
+ int key = sc->exec();
+ delete(sc);
+ if (key != Rejected) {
+ shortcuts[shortcutindex].key = key;
+ QKeySequence keySequence = QKeySequence(key);
+ active->setText(SHRT_SHRTCUT_COL, keySequence);
+ _config_changed = true;
+ }
+ clearButton->setEnabled(true);
+ defineButton->setDown(false);
+ }
+
+void ShortcutConfig::clearShortcut()
+ {
+ QTreeWidgetItem* active = scListView->currentItem();
+ int shortcutindex = active->data(0, 1).toInt();
+ shortcuts[shortcutindex].key = 0; //Cleared
+ active->setText(SHRT_SHRTCUT_COL, "");
+ clearButton->setDown(false);
+ clearButton->setEnabled(false);
+ _config_changed = true;
+ }
+
+void ShortcutConfig::categorySelChanged(QTreeWidgetItem* i)
+ {
+ int idx = i->data(0, 1).toInt();
+ current_category = shortcut_category[idx].id_flag;
+ updateSCListView(current_category);
+ }
+
+void ShortcutConfig::shortcutSelChanged(QTreeWidgetItem* active)
+ {
+ defineButton->setEnabled(true);
+ int index = active->data(0, 1).toInt();
+ if (shortcuts[index].key != 0)
+ clearButton->setEnabled(true);
+ else
+ clearButton->setEnabled(false);
+ }
+
+void ShortcutConfig::closeEvent(QCloseEvent*)
+ {
+ done(_config_changed);
+ }
+
+void ShortcutConfig::assignAll()
+ {
+ applyButton->setDown(false);
+ done(_config_changed);
+ }
+
+QString ShortcutConfig::Translate(const char* locstr)
+ {
+ //printf("In: %s - Trans1: %s\n", locstr, tr(locstr).toLatin1().data());
+ return tr(locstr);
+ }
diff --git a/muse/muse/widgets/shortcutconfig.h b/muse/muse/widgets/shortcutconfig.h
new file mode 100644
index 00000000..c3b14381
--- /dev/null
+++ b/muse/muse/widgets/shortcutconfig.h
@@ -0,0 +1,49 @@
+//
+// C++ Interface: shortcutconfig
+//
+// Description:
+// Dialog for configuring keyboard shortcuts
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sourceforge.net>, (C) 2003
+//
+// Copyright: Mathias Lundgren (lunar_shuttle@users.sourceforge.net) (C) 2003
+//
+//
+#ifndef __SHORTCUTCONFIG_H
+#define __SHORTCUTCONFIG_H
+
+#include "ui_shortcutconfig.h"
+#include "shortcuts.h"
+
+#define SHRT_CATEGORY_COL 0
+enum
+ {
+ SHRT_DESCR_COL = 0,
+ SHRT_SHRTCUT_COL
+ };
+
+class ShortcutConfig : public QDialog, public Ui::ShortcutConfigBase {
+ Q_OBJECT
+ private:
+ int current_category;
+ void updateSCListView(int category);
+ void updateSCListView() { updateSCListView(current_category); }
+ void closeEvent(QCloseEvent *e);
+
+ private slots:
+ void categorySelChanged(QTreeWidgetItem*);
+ void shortcutSelChanged(QTreeWidgetItem*);
+ void assignShortcut();
+ void clearShortcut();
+ void assignAll();
+
+
+ public:
+ ShortcutConfig(QWidget* parent = 0);
+ static QString Translate(const char*);
+ bool _config_changed;
+ static const char* ls[];
+ static const shortcut_cg shortcut_category[];
+};
+
+#endif
diff --git a/muse/muse/widgets/shortcutconfig.ui b/muse/muse/widgets/shortcutconfig.ui
new file mode 100644
index 00000000..26dfbd41
--- /dev/null
+++ b/muse/muse/widgets/shortcutconfig.ui
@@ -0,0 +1,202 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>ShortcutConfigBase</class>
+ <widget class="QDialog" name="ShortcutConfigBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>466</width>
+ <height>403</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Configure Keyboard Shortcuts</string>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="groupBox3" >
+ <property name="title" >
+ <string/>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>3</number>
+ </property>
+ <item>
+ <widget class="QTreeWidget" name="cgListView" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>105</width>
+ <height>200</height>
+ </size>
+ </property>
+ <property name="indentation" >
+ <number>0</number>
+ </property>
+ <property name="rootIsDecorated" >
+ <bool>false</bool>
+ </property>
+ <property name="columnCount" >
+ <number>1</number>
+ </property>
+ <property name="sortingEnabled" >
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>Category</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTreeWidget" name="scListView" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>2</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>170</width>
+ <height>230</height>
+ </size>
+ </property>
+ <property name="indentation" >
+ <number>0</number>
+ </property>
+ <property name="rootIsDecorated" >
+ <bool>false</bool>
+ </property>
+ <property name="columnCount" >
+ <number>2</number>
+ </property>
+ <property name="sortingEnabled" >
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>Description</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Shortcut</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>150</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="clearButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>&amp;Clear</string>
+ </property>
+ <property name="shortcut" >
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="defineButton" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>&amp;Define</string>
+ </property>
+ <property name="shortcut" >
+ <string>Alt+D</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>30</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="applyButton" >
+ <property name="text" >
+ <string>&amp;Apply</string>
+ </property>
+ <property name="shortcut" >
+ <string>Alt+A</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/widgets/siglabel.cpp b/muse/muse/widgets/siglabel.cpp
new file mode 100644
index 00000000..ad6e5898
--- /dev/null
+++ b/muse/muse/widgets/siglabel.cpp
@@ -0,0 +1,152 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: siglabel.cpp,v 1.5 2005/10/10 19:34:09 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "siglabel.h"
+
+#define TIMER1 400
+#define TIMER2 200
+#define TIMEC 7
+#define TIMER3 100
+#define TIMEC2 20
+#define TIMER4 50
+
+#include "globals.h"
+
+//---------------------------------------------------------
+// SigLabel
+// edit Signature Values (4/4)
+//---------------------------------------------------------
+
+SigLabel::SigLabel(QWidget* parent)
+ : QLabel(parent)
+ {
+ z = n = 0;
+ setFocusPolicy(Qt::NoFocus);
+ setAlignment(Qt::AlignCenter);
+ }
+
+//---------------------------------------------------------
+// mousePressEvent
+//---------------------------------------------------------
+
+void SigLabel::mousePressEvent(QMouseEvent* event)
+ {
+ int button = event->button();
+ bool zaehler = event->x() < width() /2;
+
+ int zz = z, nn = n;
+ switch (button) {
+ case Qt::LeftButton:
+ return;
+ case Qt::MidButton:
+ incValue(zaehler, false, zz, nn);
+ break;
+ case Qt::RightButton:
+ incValue(zaehler, true, zz, nn);
+ break;
+ default:
+ break;
+ }
+ if ((zz != z) || (nn != n)) {
+ setValue(zz, nn);
+ emit valueChanged(zz, nn);
+ }
+ }
+
+//---------------------------------------------------------
+// incValue
+//---------------------------------------------------------
+
+void SigLabel::incValue(bool zaehler, bool up, int& zz, int& nn)
+ {
+ if (!up) {
+ if (zaehler) {
+ --zz;
+ if (zz < 1)
+ zz = 1;
+ }
+ else {
+ switch (nn) {
+ case 1: break;
+ case 2: nn = 1; break;
+ case 4: nn = 2; break;
+ case 8: nn = 4; break;
+ case 16: nn = 8; break;
+ case 32: nn = 16; break;
+ case 64: nn = 32; break;
+ case 128: nn = 64; break;
+ }
+ }
+ }
+ else {
+ if (zaehler) {
+ ++zz;
+ if (zz > 16)
+ zz = 16;
+ }
+ else {
+ switch (nn) {
+ case 1: nn = 2; break;
+ case 2: nn = 4; break;
+ case 4: nn = 8; break;
+ case 8: nn = 16; break;
+ case 16: nn = 32; break;
+ case 32: nn = 64; break;
+ case 64: nn = 128; break;
+ case 128: break;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// wheelEvent
+//---------------------------------------------------------
+
+void SigLabel::wheelEvent(QWheelEvent* event)
+ {
+ bool zaehler = event->x() < width() /2;
+ int delta = event->delta();
+ int zz = z, nn = n;
+
+ bool inc = delta >= 0;
+ incValue(zaehler, inc, zz, nn);
+ if ((zz != z) || (nn != n)) {
+ setValue(zz, nn);
+ emit valueChanged(zz, nn);
+ }
+ }
+
+//---------------------------------------------------------
+// setValue
+//---------------------------------------------------------
+
+void SigLabel::setValue(int a, int b)
+ {
+ if (a == z && b == n)
+ return;
+ z = a;
+ n = b;
+ QString sa;
+ sa.setNum(a);
+
+ QString sb;
+ sb.setNum(b);
+
+ QString s = sa + QString("/") + sb;
+ setText(s);
+ }
+
+//---------------------------------------------------------
+// setFrame
+//---------------------------------------------------------
+
+void SigLabel::setFrame(bool flag)
+ {
+ setFrameStyle(flag ? Panel | Sunken : NoFrame);
+ setLineWidth(2);
+ }
diff --git a/muse/muse/widgets/siglabel.h b/muse/muse/widgets/siglabel.h
new file mode 100644
index 00000000..2b202757
--- /dev/null
+++ b/muse/muse/widgets/siglabel.h
@@ -0,0 +1,37 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: siglabel.h,v 1.5 2005/10/10 19:34:09 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __SIGLABEL_H__
+#define __SIGLABEL_H__
+
+//---------------------------------------------------------
+// SigLabel
+// show/edit time signature
+//---------------------------------------------------------
+
+class SigLabel : public QLabel {
+ Q_OBJECT
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void wheelEvent(QWheelEvent*);
+ void incValue(bool zaehler, bool inc, int&, int&);
+
+ protected:
+ int z, n;
+
+ signals:
+ void valueChanged(int, int);
+
+ public slots:
+ virtual void setValue(int, int);
+
+ public:
+ SigLabel(QWidget* parent = 0);
+ void value(int& a, int& b) const { a = z; b = n; }
+ void setFrame(bool);
+ };
+#endif
+
diff --git a/muse/muse/widgets/simplebutton.cpp b/muse/muse/widgets/simplebutton.cpp
new file mode 100644
index 00000000..14e453c4
--- /dev/null
+++ b/muse/muse/widgets/simplebutton.cpp
@@ -0,0 +1,37 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: simplebutton.cpp,v 1.12 2006/01/31 20:33:22 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "simplebutton.h"
+
+//---------------------------------------------------------
+// SimpleButton
+//---------------------------------------------------------
+
+SimpleButton::SimpleButton(QPixmap* on, QPixmap* off, QWidget* parent)
+ : QToolButton(parent)
+ {
+// setStyle(new QWindowsStyle());
+ setAutoRaise(true);
+ QIcon icon(*off);
+ icon.addPixmap(*on, QIcon::Normal, QIcon::On);
+ QAction* a = new QAction(this);
+ a->setIcon(icon);
+ setDefaultAction(a);
+ }
+
+//---------------------------------------------------------
+// SimpleButton
+//---------------------------------------------------------
+
+SimpleButton::SimpleButton(const QString& s, QWidget* parent)
+ : QToolButton(parent)
+ {
+ setAutoRaise(false);
+ setText(s);
+ }
+
diff --git a/muse/muse/widgets/simplebutton.h b/muse/muse/widgets/simplebutton.h
new file mode 100644
index 00000000..db42de01
--- /dev/null
+++ b/muse/muse/widgets/simplebutton.h
@@ -0,0 +1,28 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: simplebutton.h,v 1.7 2005/11/05 11:05:25 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __SIMPLE_BUTTON_H__
+#define __SIMPLE_BUTTON_H__
+
+//---------------------------------------------------------
+// SimpleButton
+//---------------------------------------------------------
+
+class SimpleButton : public QToolButton {
+ Q_OBJECT
+
+ int _id;
+ virtual QSize minimumSizeHint() const { return QSize(0, 0); }
+
+ public:
+ SimpleButton(QPixmap* on, QPixmap* off, QWidget* parent = 0);
+ SimpleButton(const QString& s, QWidget* parent = 0);
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/splitter.cpp b/muse/muse/widgets/splitter.cpp
new file mode 100644
index 00000000..8862010a
--- /dev/null
+++ b/muse/muse/widgets/splitter.cpp
@@ -0,0 +1,94 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: splitter.cpp,v 1.9 2005/11/23 13:55:32 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "splitter.h"
+#include "utils.h"
+#include "al/xml.h"
+
+//---------------------------------------------------------
+// SplitterHandle
+//---------------------------------------------------------
+
+void SplitterHandle::paintEvent(QPaintEvent* ev)
+ {
+ QPainter p(this);
+ QRect r(ev->rect());
+ if (orientation() == Qt::Horizontal) {
+ int x = 0;
+ int y1 = r.y();
+ int y2 = y1 + r.height();
+ if (y1 == 0)
+ y1 = 1;
+ if (y2 == height())
+ y2 = height() - 2;
+ for (int i = 0; i < splitWidth; ++i) {
+ p.setPen(lineColor[i]);
+ p.drawLine(x, y1, x, y2);
+ ++x;
+ }
+ p.setPen(lineColor[0]);
+ p.drawLine(1, 0, splitWidth - 2, 0);
+ p.drawLine(1, height()-1, splitWidth - 2, height()-1);
+ }
+ else {
+ int y = 0;
+ int x1 = r.x();
+ int x2 = x1 + r.width();
+ for (int i = 0; i < splitWidth; ++i) {
+ p.setPen(lineColor[i]);
+ p.drawLine(x1, y, x2, y);
+ ++y;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// Splitter
+//---------------------------------------------------------
+
+Splitter::Splitter(Qt::Orientation o)
+ : QSplitter(o)
+ {
+ setHandleWidth(splitWidth);
+ }
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void Splitter::writeStatus(const char* name, Xml& xml)
+ {
+ QList<int> sl = sizes();
+ xml.tag(name);
+ int n = sl.size();
+ for (int i = 0; i < n; ++i) {
+ int n = sl.at(i);
+ xml.intTag("size", n);
+ }
+ xml.etag(name);
+ }
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void Splitter::readStatus(QDomNode node)
+ {
+ QList<int> sl;
+ for (QDomNode n = node.firstChild(); !n.isNull(); n = n.nextSibling()) {
+ QDomElement e = n.toElement();
+ QString tag(e.tagName());
+ int i = e.text().toInt();
+ if (tag == "size") {
+ sl.push_back(i);
+ }
+ else
+ printf("Splitter::unknown tag <%s>\n", tag.toLatin1().data());
+ }
+ setSizes(sl);
+ }
+
diff --git a/muse/muse/widgets/splitter.h b/muse/muse/widgets/splitter.h
new file mode 100644
index 00000000..3b974b58
--- /dev/null
+++ b/muse/muse/widgets/splitter.h
@@ -0,0 +1,49 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: splitter.h,v 1.8 2005/11/23 13:55:32 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __SPLITTER_H__
+#define __SPLITTER_H__
+
+namespace AL {
+ class Xml;
+ };
+
+using AL::Xml;
+
+//---------------------------------------------------------
+// SplitterHandle
+//---------------------------------------------------------
+
+class SplitterHandle : public QSplitterHandle {
+ Q_OBJECT
+ virtual void paintEvent(QPaintEvent*);
+
+ public:
+ SplitterHandle(Qt::Orientation o, QSplitter* parent)
+ : QSplitterHandle(o, parent) {
+ }
+ };
+
+//---------------------------------------------------------
+// Splitter
+//---------------------------------------------------------
+
+class Splitter : public QSplitter {
+ Q_OBJECT
+
+ protected:
+ virtual QSplitterHandle* createHandle() {
+ return new SplitterHandle(orientation(), this);
+ }
+ public:
+ Splitter(Qt::Orientation);
+ void writeStatus(const char* name, Xml&);
+ void readStatus(QDomNode node);
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/stutk9Nz b/muse/muse/widgets/stutk9Nz
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/muse/muse/widgets/stutk9Nz
diff --git a/muse/muse/widgets/synthwizardbase.h b/muse/muse/widgets/synthwizardbase.h
new file mode 100644
index 00000000..590ff789
--- /dev/null
+++ b/muse/muse/widgets/synthwizardbase.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+** Form interface generated from reading ui file 'synthwizardbase.ui'
+**
+** Created: Wed Nov 12 10:38:24 2003
+** by: The User Interface Compiler ($Id: synthwizardbase.h,v 1.6 2005/09/22 20:13:39 wschweer Exp $)
+**
+** WARNING! All changes made in this file will be lost!
+****************************************************************************/
+
+#ifndef SYNTHCONFIGBASE_H
+#define SYNTHCONFIGBASE_H
+
+#include <qvariant.h>
+#include <q3wizard.h>
+//Added by qt3to4:
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QGridLayout>
+
+class QVBoxLayout;
+class QHBoxLayout;
+class QGridLayout;
+class QWidget;
+class Q3GroupBox;
+class Q3ListView;
+class Q3ListViewItem;
+class QPushButton;
+
+class SynthConfigBase : public Q3Wizard
+{
+ Q_OBJECT
+
+public:
+ SynthConfigBase( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, Qt::WFlags fl = 0 );
+ ~SynthConfigBase();
+
+ QWidget* WizardPage;
+ Q3GroupBox* GroupBox2;
+ Q3ListView* synthList;
+ QPushButton* addInstance;
+ Q3GroupBox* GroupBox3;
+ Q3ListView* instanceList;
+ QPushButton* removeInstance;
+ QWidget* WizardPage_2;
+
+protected:
+ QVBoxLayout* WizardPageLayout;
+ QVBoxLayout* GroupBox2Layout;
+ QHBoxLayout* Layout1;
+ QVBoxLayout* GroupBox3Layout;
+ QHBoxLayout* Layout3;
+
+protected slots:
+ virtual void languageChange();
+
+};
+
+#endif // SYNTHCONFIGBASE_H
diff --git a/muse/muse/widgets/tb1.cpp b/muse/muse/widgets/tb1.cpp
new file mode 100644
index 00000000..1d0fc7dc
--- /dev/null
+++ b/muse/muse/widgets/tb1.cpp
@@ -0,0 +1,167 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tb1.cpp,v 1.20 2006/02/07 16:59:35 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "tb1.h"
+#include "globals.h"
+#include "awl/poslabel.h"
+#include "awl/pitchlabel.h"
+#include "rastercombo.h"
+#include "quantcombo.h"
+
+//---------------------------------------------------------
+// genToolbar
+// solo time pitch raster quant
+//---------------------------------------------------------
+
+Toolbar1::Toolbar1(int r, int q, bool showPitch)
+ {
+ solo = new QToolButton;
+ solo->setText(tr("Solo"));
+ solo->setCheckable(true);
+ addWidget(solo);
+
+ //---------------------------------------------------
+ // Cursor Position
+ //---------------------------------------------------
+
+ QLabel* label = new QLabel;
+ label->setText(tr("Cursor"));
+ label->setIndent(3);
+ addWidget(label);
+ pos = new Awl::PosLabel;
+ pos->setFixedHeight(24);
+ addWidget(pos);
+ if (showPitch) {
+ pitch = new Awl::PitchLabel;
+ pitch->setEnabled(false);
+ pitch->setFixedHeight(24);
+ addWidget(pitch);
+ }
+ else
+ pitch = 0;
+
+ //---------------------------------------------------
+ // Raster, Quant.
+ //---------------------------------------------------
+
+ QLabel* l = new QLabel(tr("Snap"));
+ l->setIndent(5);
+ addWidget(l);
+ raster = new RasterCombo;
+ addWidget(raster);
+
+ l = new QLabel(tr("Quantize"));
+ l->setIndent(5);
+ addWidget(l);
+ quant = new QuantCombo;
+ addWidget(quant);
+
+ raster->setFixedHeight(24);
+ quant->setFixedHeight(24);
+
+ setRaster(r);
+ setQuant(q);
+
+ //---------------------------------------------------
+ // To Menu
+ //---------------------------------------------------
+
+ addWidget(new QLabel(tr("To")));
+ toList = new QComboBox;
+ toList->setFixedHeight(24);
+ addWidget(toList);
+ toList->addItem(tr("All Events"), RANGE_ALL);
+ toList->addItem(tr("Looped Ev."), RANGE_LOOPED);
+ toList->addItem(tr("Selected Ev."), RANGE_SELECTED);
+ toList->addItem(tr("Looped+Sel."), RANGE_LOOPED | RANGE_SELECTED);
+
+ connect(raster, SIGNAL(rasterChanged(int)), SIGNAL(rasterChanged(int)));
+ connect(quant, SIGNAL(quantChanged(int)), SIGNAL(quantChanged(int)));
+ connect(toList, SIGNAL(activated(int)), SIGNAL(toChanged(int)));
+ connect(solo, SIGNAL(toggled(bool)), SIGNAL(soloChanged(bool)));
+ pos->setEnabled(false);
+ }
+
+//---------------------------------------------------------
+// setApplyTo
+//---------------------------------------------------------
+
+void Toolbar1::setApplyTo(int val)
+ {
+ toList->setCurrentIndex(toList->findData(val));
+ }
+
+//---------------------------------------------------------
+// setPitch
+//---------------------------------------------------------
+
+void Toolbar1::setPitch(int val)
+ {
+ if (pitch) {
+ pitch->setEnabled(val != -1);
+ pitch->setPitch(val);
+ }
+ }
+
+//---------------------------------------------------------
+// setInt
+//---------------------------------------------------------
+
+void Toolbar1::setInt(int val)
+ {
+ if (pitch) {
+ pitch->setEnabled(val != -1);
+ pitch->setInt(val);
+ }
+ }
+
+//---------------------------------------------------------
+// setTime
+//---------------------------------------------------------
+
+void Toolbar1::setTime(const AL::Pos& val, bool enable)
+ {
+ pos->setValue(val, enable);
+ }
+
+//---------------------------------------------------------
+// setRaster
+//---------------------------------------------------------
+
+void Toolbar1::setRaster(int val)
+ {
+ raster->setRaster(val);
+ }
+
+//---------------------------------------------------------
+// setQuant
+//---------------------------------------------------------
+
+void Toolbar1::setQuant(int val)
+ {
+ quant->setQuant(val);
+ }
+
+//---------------------------------------------------------
+// setSolo
+//---------------------------------------------------------
+
+void Toolbar1::setSolo(bool flag)
+ {
+ solo->setChecked(flag);
+ }
+
+//---------------------------------------------------------
+// setPitchMode
+//---------------------------------------------------------
+
+void Toolbar1::setPitchMode(bool flag)
+ {
+ if (pitch)
+ pitch->setPitchMode(flag);
+ }
+
diff --git a/muse/muse/widgets/tb1.h b/muse/muse/widgets/tb1.h
new file mode 100644
index 00000000..37f891aa
--- /dev/null
+++ b/muse/muse/widgets/tb1.h
@@ -0,0 +1,58 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tb1.h,v 1.12 2006/01/25 16:24:33 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TB1_H__
+#define __TB1_H__
+
+namespace Awl {
+ class PosLabel;
+ class PitchLabel;
+ };
+namespace AL {
+ class Pos;
+ };
+
+class RasterCombo;
+class QuantCombo;
+
+enum { RANGE_ALL, RANGE_SELECTED, RANGE_LOOPED };
+
+//---------------------------------------------------------
+// Toolbar1
+//---------------------------------------------------------
+
+class Toolbar1 : public QToolBar {
+ QToolButton* solo;
+ Awl::PosLabel* pos;
+ Awl::PitchLabel* pitch;
+ QuantCombo* quant;
+ QComboBox* toList;
+ RasterCombo* raster;
+ Q_OBJECT
+
+ public slots:
+ void setTime(const AL::Pos&, bool);
+ void setPitch(int);
+ void setInt(int);
+ void setRaster(int);
+ void setQuant(int);
+
+ signals:
+ void rasterChanged(int);
+ void quantChanged(int);
+ void soloChanged(bool);
+ void toChanged(int);
+
+ public:
+ Toolbar1(int r=96, int q=96, bool showPitch=true);
+ void setSolo(bool val);
+ void setPitchMode(bool flag);
+ void setApplyTo(int);
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/tools.cpp b/muse/muse/widgets/tools.cpp
new file mode 100644
index 00000000..e4e294f6
--- /dev/null
+++ b/muse/muse/widgets/tools.cpp
@@ -0,0 +1,119 @@
+ //=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tools.cpp,v 1.8 2005/12/21 17:03:08 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "tools.h"
+#include "icons.h"
+
+const char* infoPointer = QT_TR_NOOP("select Pointer Tool:\n"
+ "with the pointer tool you can:\n"
+ " select parts\n"
+ " move parts\n"
+ " copy parts");
+const char* infoPencil = QT_TR_NOOP("select Pencil Tool:\n"
+ "with the pencil tool you can:\n"
+ " create new parts\n"
+ " modify length of parts");
+const char* infoDel = QT_TR_NOOP("select Delete Tool:\n"
+ "with the delete tool you can delete parts");
+const char* infoCut = QT_TR_NOOP("select Cut Tool:\n"
+ "with the cut tool you can split a part");
+const char* infoGlue = QT_TR_NOOP("select Glue Tool:\n"
+ "with the glue tool you can glue two parts");
+const char* infoScore = QT_TR_NOOP("select Score Tool:\n");
+const char* infoQuant = QT_TR_NOOP("select Quantize Tool:\n"
+ "insert display quantize event");
+const char* infoDraw = QT_TR_NOOP("select Drawing Tool");
+const char* infoMute = QT_TR_NOOP("select Muting Tool:\n"
+ "click on part to mute/unmute");
+
+ToolB toolList[TOOLS] = {
+ {&pointerIcon, QT_TR_NOOP("pointer"), infoPointer },
+ {&pencilIcon, QT_TR_NOOP("pencil"), infoPencil },
+ {&deleteIcon, QT_TR_NOOP("eraser"), infoDel },
+ {&cutIcon, QT_TR_NOOP("cutter"), infoCut },
+ {&note1Icon, QT_TR_NOOP("score"), infoScore },
+ {&glueIcon, QT_TR_NOOP("glue"), infoGlue },
+ {&quantIcon, QT_TR_NOOP("quantize"), infoQuant },
+ {&drawIcon, QT_TR_NOOP("draw"), infoDraw },
+ {&editmuteIcon, QT_TR_NOOP("mute parts"), infoMute },
+ };
+
+//---------------------------------------------------------
+// EditToolBar
+//---------------------------------------------------------
+
+EditToolBar::EditToolBar(QMainWindow* parent, int tools)
+ : QToolBar(tr("Edit Tools"))
+ {
+ actionGroup = new QActionGroup(parent);
+ actionGroup->setExclusive(true);
+
+ bool first = true;
+ for (unsigned i = 0; i < sizeof(toolList)/sizeof(*toolList); ++i) {
+ if ((tools & (1 << i))==0)
+ continue;
+ ToolB* t = &toolList[i];
+
+ QAction* a = new QAction(QIcon(**(t->icon)), "tool", this);
+ a->setData(1 << i);
+ a->setCheckable(true);
+ actionGroup->addAction(a);
+ addAction(a);
+ a->setToolTip(tr(t->tip));
+ a->setWhatsThis(tr(t->ltip));
+ if (first) {
+ a->setChecked(true);
+ first = false;
+ }
+ }
+ connect(actionGroup, SIGNAL(triggered(QAction*)), SLOT(toolChanged(QAction*)));
+ }
+
+//---------------------------------------------------------
+// toolChanged
+//---------------------------------------------------------
+
+void EditToolBar::toolChanged(QAction* action)
+ {
+ emit toolChanged(action->data().toInt());
+ }
+
+//---------------------------------------------------------
+// set
+//---------------------------------------------------------
+
+void EditToolBar::set(int id)
+ {
+ QList<QAction*> actions = actionGroup->actions();
+ int n = actions.size();
+
+ for (int i = 0; i < n; ++i) {
+ QAction* action = actions.at(i);
+ if (action->data().toInt() == id) {
+ action->setChecked(true);
+ return;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// curTool
+//---------------------------------------------------------
+
+int EditToolBar::curTool()
+ {
+ QList<QAction*> actions = actionGroup->actions();
+ int n = actions.size();
+
+ for (int i = 0; i < n; ++i) {
+ QAction* a = actions.at(i);
+ if (a->isChecked())
+ return a->data().toInt();
+ }
+ return -1;
+ }
+
diff --git a/muse/muse/widgets/tools.h b/muse/muse/widgets/tools.h
new file mode 100644
index 00000000..25c8db13
--- /dev/null
+++ b/muse/muse/widgets/tools.h
@@ -0,0 +1,49 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: tools.h,v 1.7 2006/01/28 19:11:20 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TOOLS_H__
+#define __TOOLS_H__
+
+class Action;
+
+#include "awl/tcanvas.h"
+
+const int arrangerTools = PointerTool | PencilTool | RubberTool | DrawTool
+ | CutTool | GlueTool | MuteTool;
+
+struct ToolB {
+ QPixmap** icon;
+ const char* tip;
+ const char* ltip;
+ };
+const int TOOLS = 9;
+extern ToolB toolList[TOOLS];
+
+//---------------------------------------------------------
+// EditToolBar
+//---------------------------------------------------------
+
+class EditToolBar : public QToolBar {
+ Q_OBJECT
+ QActionGroup* actionGroup;
+
+ private slots:
+ void toolChanged(QAction* action);
+
+ signals:
+ void toolChanged(int);
+
+ public slots:
+ void set(int id);
+
+ public:
+ EditToolBar(QMainWindow*, int);
+ int curTool();
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/transformbase.ui b/muse/muse/widgets/transformbase.ui
new file mode 100644
index 00000000..1365a0c9
--- /dev/null
+++ b/muse/muse/widgets/transformbase.ui
@@ -0,0 +1,993 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MidiTransformDialogBase</class>
+ <widget class="QDialog" name="MidiTransformDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>843</width>
+ <height>659</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Transformator</string>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="3" column="0" colspan="2" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="buttonNew" >
+ <property name="text" >
+ <string>&amp;New</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonDelete" >
+ <property name="text" >
+ <string>&amp;Delete</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonApply" >
+ <property name="text" >
+ <string>&amp;Apply</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonOk" >
+ <property name="text" >
+ <string>&amp;OK</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonCancel" >
+ <property name="text" >
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item rowspan="3" row="0" column="0" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel1_2" >
+ <property name="text" >
+ <string>PresetList</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Q3ListBox" name="presetList" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <widget class="Q3GroupBox" name="GroupBox5" >
+ <property name="title" >
+ <string>Processing</string>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel5" >
+ <property name="text" >
+ <string>Event Type</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QComboBox" name="procEventOp" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QComboBox" name="procType" >
+ <item>
+ <property name="text" >
+ <string>Note</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Poly Pressure</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Control Change</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Aftertouch</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pitch Bend</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>NRPN</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>RPN</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="procVal1Op" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Value 2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Invert</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>ScaleMap</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Flip</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Dyn</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Random</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="TextLabel6" >
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="TextLabel7" >
+ <property name="text" >
+ <string>Value 2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="TextLabel10_2" >
+ <property name="text" >
+ <string>Length</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QLabel" name="TextLabel12" >
+ <property name="text" >
+ <string>Position</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QComboBox" name="procVal2Op" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Invert</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Dyn</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Random</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QComboBox" name="procLenOp" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="procVal1b" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="procVal2b" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QDoubleSpinBox" name="procVal1a" />
+ </item>
+ <item row="1" column="4" >
+ <widget class="QComboBox" name="procPosOp" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QDoubleSpinBox" name="procVal2a" />
+ </item>
+ <item row="2" column="3" >
+ <widget class="QDoubleSpinBox" name="procLenA" />
+ </item>
+ <item row="2" column="4" >
+ <widget class="QDoubleSpinBox" name="procPosA" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="Q3GroupBox" name="GroupBox3" >
+ <property name="title" >
+ <string>Filter</string>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <widget class="QComboBox" name="selEventOp" >
+ <item>
+ <property name="text" >
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QComboBox" name="selType" >
+ <item>
+ <property name="text" >
+ <string>Note</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Control Change</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Sysex</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Poly Pressure</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Aftertouch</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Meta</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>Value 2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>Event Type</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="selVal1Op" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="TextLabel10" >
+ <property name="text" >
+ <string>Length</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QLabel" name="TextLabel11" >
+ <property name="text" >
+ <string>Bar Range</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QComboBox" name="selVal2Op" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QComboBox" name="selLenOp" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QComboBox" name="selRangeOp" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="selVal1b" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QSpinBox" name="selLenA" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" >
+ <widget class="QSpinBox" name="selLenB" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="selVal2a" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="selVal2b" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="selVal1a" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4" >
+ <widget class="QDoubleSpinBox" name="selBarB" />
+ </item>
+ <item row="2" column="4" >
+ <widget class="QDoubleSpinBox" name="selBarA" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="Q3GroupBox" name="GroupBox6_2" >
+ <property name="title" >
+ <string>Preset</string>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel13_2" >
+ <property name="text" >
+ <string>Name:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="nameEntry" />
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel14_2" >
+ <property name="text" >
+ <string>Comment:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Q3MultiLineEdit" name="commentEntry" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="Q3GroupBox" name="GroupBox5_2" >
+ <property name="title" >
+ <string>Range</string>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="processAll" >
+ <property name="text" >
+ <string>process all events</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="selectedTracks" >
+ <property name="text" >
+ <string>selected tracks</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="insideLoop" >
+ <property name="text" >
+ <string>inside loop</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="Q3GroupBox" name="GroupBox7_2" >
+ <property name="title" >
+ <string>Function</string>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="funcOp" >
+ <item>
+ <property name="text" >
+ <string>Select</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Quantize</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Delete</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Transform</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Insert</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Copy</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Extract</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel9_2" >
+ <property name="text" >
+ <string>Quantize Value</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="ComboQuant" name="funcQuantVal" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>Q3GroupBox</class>
+ <extends></extends>
+ <header>Qt3Support/Q3GroupBox</header>
+ <container>1</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Q3MultiLineEdit</class>
+ <extends>QWidget</extends>
+ <header>q3multilineedit.h</header>
+ <container>1</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>ComboQuant</class>
+ <extends></extends>
+ <header>comboQuant.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Q3ListBox</class>
+ <extends></extends>
+ <header>q3listbox.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>selEventOp</tabstop>
+ <tabstop>selType</tabstop>
+ <tabstop>selVal1Op</tabstop>
+ <tabstop>selVal1a</tabstop>
+ <tabstop>selVal1b</tabstop>
+ <tabstop>selVal2Op</tabstop>
+ <tabstop>selVal2a</tabstop>
+ <tabstop>selVal2b</tabstop>
+ <tabstop>selLenOp</tabstop>
+ <tabstop>selLenA</tabstop>
+ <tabstop>selLenB</tabstop>
+ <tabstop>selRangeOp</tabstop>
+ <tabstop>procEventOp</tabstop>
+ <tabstop>procType</tabstop>
+ <tabstop>procVal1Op</tabstop>
+ <tabstop>procVal1b</tabstop>
+ <tabstop>procVal2Op</tabstop>
+ <tabstop>procVal2b</tabstop>
+ <tabstop>procLenOp</tabstop>
+ <tabstop>procPosOp</tabstop>
+ <tabstop>nameEntry</tabstop>
+ <tabstop>commentEntry</tabstop>
+ <tabstop>processAll</tabstop>
+ <tabstop>selectedTracks</tabstop>
+ <tabstop>insideLoop</tabstop>
+ <tabstop>funcOp</tabstop>
+ <tabstop>presetList</tabstop>
+ <tabstop>buttonNew</tabstop>
+ <tabstop>buttonDelete</tabstop>
+ <tabstop>buttonApply</tabstop>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/widgets/utils.cpp b/muse/muse/widgets/utils.cpp
new file mode 100644
index 00000000..a1fb20ec
--- /dev/null
+++ b/muse/muse/widgets/utils.cpp
@@ -0,0 +1,384 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: utils.cpp,v 1.20 2005/11/23 13:55:32 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include <sys/time.h>
+#include "utils.h"
+#include "icons.h"
+#include "gconfig.h"
+#include "greendotbutton.h"
+#include "recordbutton.h"
+
+static const int BFONT = 4; // simple button font
+
+//---------------------------------------------------------
+// RecordButton
+//---------------------------------------------------------
+
+RecordButton::RecordButton(QWidget* parent)
+ : SimpleButton(record_on_Icon, record_off_Icon, parent)
+ {
+ setCheckable(true);
+ setToolTip(tr("record"));
+ }
+
+//---------------------------------------------------------
+// GreendotButton
+//---------------------------------------------------------
+
+GreendotButton::GreendotButton(QWidget* parent)
+ : SimpleButton(greendotIcon, darkgreendotIcon, parent)
+ {
+ setCheckable(true);
+ setToolTip(tr("record"));
+ }
+
+//---------------------------------------------------------
+// curTime
+//---------------------------------------------------------
+
+double curTime()
+ {
+ struct timeval t;
+ gettimeofday(&t, 0);
+ return (double)((double)t.tv_sec + (t.tv_usec / 1000000.0));
+ }
+
+//---------------------------------------------------------
+// dump
+// simple debug output
+//---------------------------------------------------------
+
+void dump(const unsigned char* p, int n)
+ {
+ printf("dump %d\n", n);
+ for (int i = 0; i < n; ++i) {
+ printf("%02x ", *p++);
+ if ((i > 0) && (i % 16 == 0) && (i+1 < n))
+ printf("\n");
+ }
+ printf("\n");
+ }
+
+//---------------------------------------------------------
+// num2cols
+//---------------------------------------------------------
+
+int num2cols(int min, int max)
+ {
+ int amin = abs(min);
+ int amax = abs(max);
+ int l = amin > amax ? amin : amax;
+ return int(log10(l)) + 1;
+ }
+
+//---------------------------------------------------------
+// hLine
+//---------------------------------------------------------
+
+QFrame* hLine(QWidget* w)
+ {
+ QFrame* delim = new QFrame(w);
+ delim->setFrameStyle(QFrame::HLine | QFrame::Sunken);
+ return delim;
+ }
+
+//---------------------------------------------------------
+// vLine
+//---------------------------------------------------------
+
+QFrame* vLine(QWidget* w)
+ {
+ QFrame* delim = new QFrame(w);
+ delim->setFrameStyle(QFrame::VLine | QFrame::Sunken);
+ return delim;
+ }
+
+//---------------------------------------------------------
+// bitmap2String
+// 5c -> 1-4 1-6
+//
+// 01011100
+//
+//---------------------------------------------------------
+
+QString bitmap2String(int bm)
+ {
+ QString s;
+//printf("bitmap2string: bm %04x", bm);
+ if (bm == 0xffff)
+ s = "all";
+ else if (bm == 0)
+ s = "none";
+ else {
+ bool range = false;
+ int first = 0;
+ bool needSpace = false;
+ bm &= 0xffff;
+ for (int i = 0; i < 17; ++i) {
+ if ((1 << i) & bm) {
+ if (!range) {
+ range = true;
+ first = i;
+ }
+ }
+ else {
+ if (range) {
+ if (needSpace)
+ s += " ";
+ QString ns;
+ if (first == i-1)
+ ns.sprintf("%d", first+1);
+ else
+ ns.sprintf("%d-%d", first+1, i);
+ s += ns;
+ needSpace = true;
+ }
+ range = false;
+ }
+ }
+ }
+//printf(" -> <%s>\n", s.toLatin1().data());
+ return s;
+ }
+
+//---------------------------------------------------------
+// string2bitmap
+//---------------------------------------------------------
+
+int string2bitmap(const QString& str)
+ {
+ int val = 0;
+ QString ss(str.simplified());
+ const char* s = ss.toLatin1().data();
+//printf("string2bitmap <%s>\n", s);
+
+ if (s == 0)
+ return 0;
+ if (strcmp(s, "all") == 0)
+ return 0xffff;
+ if (strcmp(s, "none") == 0)
+ return 0;
+// printf("str2bitmap: <%s> ", str.toLatin1().data());
+ int tval = 0;
+ bool range = false;
+ int sval = 0;
+ while (*s == ' ')
+ ++s;
+ while (*s) {
+ if (*s >= '0' && *s <= '9') {
+ tval *= 10;
+ tval += *s - '0';
+ }
+ else if (*s == ' ' || *s == ',') {
+ if (range) {
+ for (int i = sval-1; i < tval; ++i)
+ val |= (1 << i);
+ range = false;
+ }
+ else {
+ val |= (1 << (tval-1));
+ }
+ tval = 0;
+ }
+ else if (*s == '-') {
+ range = true;
+ sval = tval;
+ tval = 0;
+ }
+ ++s;
+ }
+ if (range && tval) {
+ for (int i = sval-1; i < tval; ++i)
+ val |= (1 << i);
+ }
+ else if (tval) {
+ val |= (1 << (tval-1));
+ }
+ return val & 0xffff;
+ }
+
+//---------------------------------------------------------
+// muteButton
+//---------------------------------------------------------
+
+SimpleButton* newMuteButton(QWidget* parent)
+ {
+ // SimpleButton* mute = new SimpleButton(parent, muteIconOff, muteIconOn);
+ SimpleButton* mute = new SimpleButton(QT_TR_NOOP("m"), parent);
+ mute->setFont(*config.fonts[BFONT]);
+ mute->setCheckable(true);
+ mute->setToolTip(QT_TR_NOOP("mute"));
+ return mute;
+ }
+
+//---------------------------------------------------------
+// soloButton
+//---------------------------------------------------------
+
+SimpleButton* newSoloButton(QWidget* parent)
+ {
+// SimpleButton* solo = new SimpleButton(parent, soloIconOn, soloIconOff);
+ SimpleButton* solo = new SimpleButton(QT_TR_NOOP("s"), parent);
+ solo->setFont(*config.fonts[BFONT]);
+ solo->setCheckable(true);
+ solo->setToolTip(QT_TR_NOOP("solo"));
+ return solo;
+ }
+
+//---------------------------------------------------------
+// monitorButton
+//---------------------------------------------------------
+
+SimpleButton* newMonitorButton(QWidget* parent)
+ {
+ SimpleButton* monitor = new SimpleButton(QT_TR_NOOP("Mo"), parent);
+ monitor->setFont(*config.fonts[BFONT]);
+ monitor->setCheckable(true);
+ monitor->setToolTip(QT_TR_NOOP("monitor"));
+ return monitor;
+ }
+
+//---------------------------------------------------------
+// drumMapButton
+//---------------------------------------------------------
+
+SimpleButton* newDrumMapButton(QWidget* parent)
+ {
+ SimpleButton* dm = new SimpleButton(QT_TR_NOOP("Dr"), parent);
+ dm->setFont(*config.fonts[BFONT]);
+ dm->setCheckable(true);
+ dm->setToolTip(QT_TR_NOOP("use drum map"));
+ return dm;
+ }
+
+//---------------------------------------------------------
+// newOffButton
+//---------------------------------------------------------
+
+SimpleButton* newOffButton(QWidget* parent)
+ {
+ SimpleButton* off = new SimpleButton(exit1Icon, exitIcon, parent);
+ off->setCheckable(true);
+ off->setToolTip(QT_TR_NOOP("off"));
+ return off;
+ }
+
+//---------------------------------------------------------
+// newRecordButton
+//---------------------------------------------------------
+
+SimpleButton* newRecordButton(QWidget* parent)
+ {
+ return new RecordButton(parent);
+ }
+
+//---------------------------------------------------------
+// newAutoReadButton
+//---------------------------------------------------------
+
+SimpleButton* newAutoReadButton(QWidget* parent)
+ {
+ SimpleButton* ar = new SimpleButton(QT_TR_NOOP("aR"), parent);
+ ar->setFont(*config.fonts[BFONT]);
+ ar->setCheckable(true);
+ ar->setToolTip(QT_TR_NOOP("automation read"));
+ return ar;
+ }
+
+//---------------------------------------------------------
+// newAutoWriteButton
+//---------------------------------------------------------
+
+SimpleButton* newAutoWriteButton(QWidget* parent)
+ {
+ SimpleButton* aw = new SimpleButton(QT_TR_NOOP("aW"), parent);
+ aw->setFont(*config.fonts[BFONT]);
+ aw->setCheckable(true);
+ aw->setToolTip(QT_TR_NOOP("automation write"));
+ return aw;
+ }
+
+//---------------------------------------------------------
+// syncButton
+//---------------------------------------------------------
+
+SimpleButton* newSyncButton(QWidget* parent)
+ {
+ SimpleButton* sync = new SimpleButton(QT_TR_NOOP("sync"), parent);
+ sync->setFont(*config.fonts[BFONT]);
+ sync->setCheckable(true);
+ sync->setToolTip(QT_TR_NOOP("send sync events"));
+ return sync;
+ }
+
+//---------------------------------------------------------
+// newMinusButton
+//---------------------------------------------------------
+
+SimpleButton* newMinusButton(QWidget* parent)
+ {
+ return new SimpleButton(minusIcon, minusIcon, parent);
+ }
+
+//---------------------------------------------------------
+// newPlusButton
+//---------------------------------------------------------
+
+SimpleButton* newPlusButton(QWidget* parent)
+ {
+ SimpleButton* sync = new SimpleButton(plusIcon, plusIcon, parent);
+ return sync;
+ }
+
+//---------------------------------------------------------
+// newStereoButton
+//---------------------------------------------------------
+
+SimpleButton* newStereoButton(QWidget* parent)
+ {
+ SimpleButton* stereo = new SimpleButton(stereoIcon, monoIcon, parent);
+ stereo->setCheckable(true);
+ stereo->setToolTip(QT_TR_NOOP("1/2 channel"));
+ return stereo;
+ }
+
+//---------------------------------------------------------
+// fatalError
+//---------------------------------------------------------
+
+void fatalError(const char* s)
+ {
+ fprintf(stderr, "%s\n", s);
+ exit(-1);
+ }
+
+//---------------------------------------------------------
+// lineColor
+//---------------------------------------------------------
+
+QColor lineColor[splitWidth] = {
+ QColor(0x55, 0x55, 0x52),
+ QColor(0xc6, 0xc6, 0xbf),
+ QColor(0xee, 0xee, 0xe6),
+ QColor(0xff, 0xff, 0xfc),
+ QColor(0xff, 0xff, 0xff),
+ QColor(0x55, 0x55, 0x52),
+ };
+
+//---------------------------------------------------------
+// paintHLine
+//---------------------------------------------------------
+
+void paintHLine(QPainter& p, int x1, int x2, int y)
+ {
+ for (int i = 0; i < splitWidth; ++i) {
+ p.setPen(lineColor[i]);
+ p.drawLine(x1, y, x2, y);
+ ++y;
+ }
+ }
+
diff --git a/muse/muse/widgets/utils.h b/muse/muse/widgets/utils.h
new file mode 100644
index 00000000..64f3aac9
--- /dev/null
+++ b/muse/muse/widgets/utils.h
@@ -0,0 +1,42 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: utils.h,v 1.12 2006/01/12 14:49:13 wschweer Exp $
+// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __UTILS_H__
+#define __UTILS_H__
+
+#include "gui.h"
+
+class SimpleButton;
+
+extern QString bitmap2String(int bm);
+extern int string2bitmap(const QString& str);
+
+extern int num2cols(int min, int max);
+extern QFrame* hLine(QWidget* parent);
+extern QFrame* vLine(QWidget* parent);
+extern void dump(const unsigned char* p, int n);
+extern double curTime();
+extern SimpleButton* newMuteButton(QWidget* parent);
+extern SimpleButton* newSoloButton(QWidget* parent);
+extern SimpleButton* newMonitorButton(QWidget* parent);
+extern SimpleButton* newDrumMapButton(QWidget* parent);
+extern SimpleButton* newOffButton(QWidget* parent);
+extern SimpleButton* newRecordButton(QWidget* parent);
+extern SimpleButton* newAutoWriteButton(QWidget* parent);
+extern SimpleButton* newAutoReadButton(QWidget* parent);
+extern SimpleButton* newSyncButton(QWidget* parent);
+extern SimpleButton* newPlusButton(QWidget* parent);
+extern SimpleButton* newMinusButton(QWidget* parent);
+extern SimpleButton* newStereoButton(QWidget* parent);
+
+extern void fatalError(const char*);
+
+extern QColor lineColor[splitWidth];
+extern void paintHLine(QPainter& p, int x1, int x2, int y);
+
+#endif
+
diff --git a/muse/muse/widgets/velocity.cpp b/muse/muse/widgets/velocity.cpp
new file mode 100644
index 00000000..b5e5b025
--- /dev/null
+++ b/muse/muse/widgets/velocity.cpp
@@ -0,0 +1,52 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: velocity.cpp,v 1.5 2006/01/25 16:24:33 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "velocity.h"
+#include "song.h"
+#include "tb1.h"
+
+//---------------------------------------------------------
+// Velocity
+//---------------------------------------------------------
+
+Velocity::Velocity(QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ rangeGroup = new QButtonGroup(this);
+ rangeGroup->setExclusive(true);
+ rangeGroup->addButton(allEventsButton, RANGE_ALL);
+ rangeGroup->addButton(selectedEventsButton, RANGE_SELECTED);
+ rangeGroup->addButton(loopedEventsButton, RANGE_LOOPED);
+ rangeGroup->addButton(selectedLoopedButton, RANGE_SELECTED | RANGE_LOOPED);
+ allEventsButton->setChecked(true);
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void Velocity::accept()
+ {
+ _range = rangeGroup->checkedId();
+ _rateVal = rate->value();
+ _offsetVal = offset->value();
+ QDialog::accept();
+ }
+
+//---------------------------------------------------------
+// setRange
+//---------------------------------------------------------
+
+void Velocity::setRange(int id)
+ {
+ if (rangeGroup->button(id))
+ rangeGroup->button(id)->setChecked(true);
+ else
+ printf("setRange: not button %d!\n", id);
+ }
+
diff --git a/muse/muse/widgets/velocity.h b/muse/muse/widgets/velocity.h
new file mode 100644
index 00000000..bbe89cc7
--- /dev/null
+++ b/muse/muse/widgets/velocity.h
@@ -0,0 +1,37 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: velocity.h,v 1.3 2006/01/25 16:24:33 wschweer Exp $
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __VELOCITY_H__
+#define __VELOCITY_H__
+
+#include "ui_velocity.h"
+
+//---------------------------------------------------------
+// Velocity
+//---------------------------------------------------------
+
+class Velocity : public QDialog, public Ui::VelocityBase {
+ Q_OBJECT
+
+ QButtonGroup* rangeGroup;
+ int _range;
+ int _rateVal;
+ int _offsetVal;
+
+ protected slots:
+ void accept();
+
+ public:
+ Velocity(QWidget* parent = 0);
+ void setRange(int id);
+ int range() const { return _range; }
+ int rateVal() const { return _rateVal; }
+ int offsetVal() const { return _offsetVal; }
+ };
+
+#endif
+
diff --git a/muse/muse/widgets/velocity.ui b/muse/muse/widgets/velocity.ui
new file mode 100644
index 00000000..e0122520
--- /dev/null
+++ b/muse/muse/widgets/velocity.ui
@@ -0,0 +1,211 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>VelocityBase</class>
+ <widget class="QDialog" name="VelocityBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>275</width>
+ <height>335</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Modify Velocity</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="rangeGroup" >
+ <property name="title" >
+ <string>Apply To</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>3</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="allEventsButton" >
+ <property name="text" >
+ <string>All Events</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="selectedEventsButton" >
+ <property name="text" >
+ <string>Selected Events</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="loopedEventsButton" >
+ <property name="text" >
+ <string>Looped Events</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="selectedLoopedButton" >
+ <property name="text" >
+ <string>Selected AND Looped</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="GroupBox3" >
+ <property name="title" >
+ <string>Values</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>3</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>Rate:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel4" >
+ <property name="text" >
+ <string>Offset:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="rate" >
+ <property name="suffix" >
+ <string>%</string>
+ </property>
+ <property name="maximum" >
+ <number>200</number>
+ </property>
+ <property name="value" >
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="offset" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>OK</string>
+ </property>
+ <property name="autoDefault" >
+ <bool>false</bool>
+ </property>
+ <property name="default" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>VelocityBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>204</x>
+ <y>362</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>59</x>
+ <y>357</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>VelocityBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>322</x>
+ <y>377</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>127</x>
+ <y>377</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/muse/widgets/wtrackinfobase.ui b/muse/muse/widgets/wtrackinfobase.ui
new file mode 100644
index 00000000..da341c74
--- /dev/null
+++ b/muse/muse/widgets/wtrackinfobase.ui
@@ -0,0 +1,166 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>WaveTrackInfoBase</class>
+ <widget class="QWidget" name="WaveTrackInfoBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>129</width>
+ <height>548</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: TrackInfo</string>
+ </property>
+ <property name="toolTip" >
+ <string/>
+ </property>
+ <property name="whatsThis" >
+ <string/>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>1</number>
+ </property>
+ <property name="spacing" >
+ <number>1</number>
+ </property>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>1</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>0</number>
+ </property>
+ <property name="text" >
+ <string>Track Info</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QLineEdit" name="iName" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Track Name</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Track Name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QSpinBox" name="delay" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Track Delay (ticks)</string>
+ </property>
+ <property name="specialValueText" >
+ <string>off</string>
+ </property>
+ <property name="maximum" >
+ <number>1000</number>
+ </property>
+ <property name="minimum" >
+ <number>-1000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="TextLabel10" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>Delay (Frames)</string>
+ </property>
+ <property name="text" >
+ <string>Delay</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <tabstops>
+ <tabstop>iName</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/muse/xpm/addtrack_addmiditrack.xpm b/muse/muse/xpm/addtrack_addmiditrack.xpm
new file mode 100644
index 00000000..cfeb255b
--- /dev/null
+++ b/muse/muse/xpm/addtrack_addmiditrack.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static const char *addtrack_addmiditrack_xpm[]={
+"16 16 7 1",
+"a c #000000",
+"e c #404000",
+". c #800000",
+"c c #808080",
+"b c #c00000",
+"d c #dcdcdc",
+"# c #ffffff",
+".......##aa###..",
+".bbbbb###aaa#bb.",
+".b#######aaaa#b.",
+".b#######a#aa#b.",
+".bc#c#c#dad#a#b.",
+".eeeeeeedadeeee.",
+".bc#c#c#dad#c#b.",
+".bc#c#c#dad#c#b.",
+".bc#c#d#dad#c#b.",
+".bc#c#aaaad#c#b.",
+".eeedaaaaadeeee.",
+".bc#caaaaa##c#b.",
+".b####aaa#####b.",
+".b############b.",
+".bbbbbbbbbbbbbb.",
+"................"};
diff --git a/muse/muse/xpm/addtrack_audiogroup.xpm b/muse/muse/xpm/addtrack_audiogroup.xpm
new file mode 100644
index 00000000..52a0b082
--- /dev/null
+++ b/muse/muse/xpm/addtrack_audiogroup.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static const char * addtrack_audiogroup_xpm[] = {
+"16 16 16 1",
+" c None",
+". c #800000",
+"+ c #C20000",
+"@ c #FFFFFF",
+"# c #363736",
+"$ c #000100",
+"% c #616161",
+"& c #DBDDDA",
+"* c #828282",
+"= c #313231",
+"- c #222322",
+"; c #545454",
+"> c #4E4F4E",
+", c #323332",
+"' c #454645",
+") c #2E2F2E",
+"................",
+".++@@##$$$#@@++.",
+".+@@#%@@@@#$&@+.",
+".@@##@@@@@@##@@.",
+"&&@$@@&@&@@@$@&&",
+"@@***@@&@&@***@@",
+"@*%$%@&&&@@%$$*@",
+"*=-$*@@&&@@;$$$%",
+">$#$#@&@&@@,$#$#",
+"'$#$#@@&@@@#$#$#",
+"*)$$%@@@&@@%$$$*",
+"@*%$%@&&&@@*$$*@",
+".@***@&&@&@***@.",
+".+@@@@@@&&@@@@+.",
+".++++++++++++++.",
+"................"};
diff --git a/muse/muse/xpm/addtrack_audioinput.xpm b/muse/muse/xpm/addtrack_audioinput.xpm
new file mode 100644
index 00000000..1f5cfd9a
--- /dev/null
+++ b/muse/muse/xpm/addtrack_audioinput.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static const char * addtrack_audioinput_xpm[] = {
+"16 16 14 1",
+" c None",
+". c #800000",
+"+ c #DBDDDA",
+"@ c #555652",
+"# c #FEFFFC",
+"$ c #8D8E88",
+"% c #9FA19E",
+"& c #FCFCF5",
+"* c #C2C4C0",
+"= c #C20000",
+"- c #313230",
+"; c #BEBFBA",
+"> c #000100",
+", c #565856",
+".+@##....###@+#.",
+".#$%+#####+%$##.",
+".+#@%@&##*%@+#=.",
+".####++##+####=.",
+".######-######=.",
+"###+$$+-#+$%+##.",
+"#+#$;##-##%$%##.",
+"##$;+##-###+$%#.",
+".#@###>>>######.",
+".#####>>>#+####.",
+".=####>>>##+##+#",
+".=##+#>>>#######",
+".=#+###,###+#,,,",
+".=###+#,####,,##",
+".==####,,##,,#=.",
+"......##,,,,#..."};
diff --git a/muse/muse/xpm/addtrack_audiooutput.xpm b/muse/muse/xpm/addtrack_audiooutput.xpm
new file mode 100644
index 00000000..9b3780c6
--- /dev/null
+++ b/muse/muse/xpm/addtrack_audiooutput.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static const char * addtrack_audiooutput_xpm[] = {
+"16 16 25 1",
+" c None",
+". c #800000",
+"+ c #FEFFFC",
+"@ c #C20000",
+"# c #DBDDDA",
+"$ c #656664",
+"% c #FDF7F6",
+"& c #545654",
+"* c #626361",
+"= c #767775",
+"- c #000100",
+"; c #7B7C7A",
+"> c #7C7D7A",
+", c #838481",
+"' c #D8D9D7",
+") c #CFD0CE",
+"! c #D6D8D5",
+"~ c #FBFCF9",
+"{ c #C0C1BE",
+"] c #E7E8E5",
+"^ c #F3F4F1",
+"/ c #B7B8B6",
+"( c #F8FEFF",
+"_ c #B4B5B3",
+": c #B3B0AF",
+"................",
+".+@@@@@@@@@@@@@.",
+"##+$$$$$$$$$$#@.",
+"$$$$++#++++#$$+.",
+"$++++++++++%#$#.",
+"++++++&*&++%=$+.",
+"##+&*&---;>,=++.",
+".++'''---)!=~+#.",
+".@++##{{'##=#++.",
+".@#+%+#+]-;=+++.",
+".@++++%^---+++@.",
+".@++++^---/++(@.",
+".@++++*--_%++%@.",
+".@+++&-:_++++(@.",
+".@@@#-#%++@@@@@.",
+"....+#+........."};
diff --git a/muse/muse/xpm/addtrack_auxsend.xpm b/muse/muse/xpm/addtrack_auxsend.xpm
new file mode 100644
index 00000000..d3528418
--- /dev/null
+++ b/muse/muse/xpm/addtrack_auxsend.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char * addtrack_auxsend_xpm[] = {
+"16 16 9 1",
+" c None",
+". c #FFFFFF",
+"+ c #F4F4F4",
+"@ c #9FA19E",
+"# c #797D7C",
+"$ c #DEDFDE",
+"% c #000000",
+"& c #C9CAC8",
+"* c #F1F1F1",
+".+@..........@+.",
+"+#$.+@....@..$#+",
+"#%$+#$....$#.$%#",
+"%&.#%$....$%#.&%",
+"%$+%........%.$%",
+"%$#%.$@..@$.%#$%",
+"%$%$.#$..$#.$%$%",
+"%$%$.#.%%.#.$%$%",
+"%$%$.#$%%$#.$%$%",
+"%$%$.#$.%$#.$%$%",
+"%$#%.$@.%@$.%#$%",
+"%$+%....%...%.$%",
+"%&.#%$..%.$%#.&%",
+"#%$+#$..%.$#.$##",
+"+#$.*@..%.@..$%+",
+"..@.....%....@+."};
diff --git a/muse/muse/xpm/addtrack_drumtrack.xpm b/muse/muse/xpm/addtrack_drumtrack.xpm
new file mode 100644
index 00000000..a2841740
--- /dev/null
+++ b/muse/muse/xpm/addtrack_drumtrack.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static const char * addtrack_drumtrack_xpm[] = {
+"16 16 22 1",
+" c None",
+". c #800000",
+"+ c #000100",
+"@ c #C20000",
+"# c #9FA19E",
+"$ c #F8FEFF",
+"% c #A29FA3",
+"& c #FDF7F6",
+"* c #FEFFFC",
+"= c #2F312E",
+"- c #797D7C",
+"; c #FBF5F4",
+"> c #C2C4C0",
+", c #DBDDDA",
+"' c #ACA5B1",
+") c #DDE2E5",
+"! c #D3D8DA",
+"~ c #7F817E",
+"{ c #E0CEC3",
+"] c #F0F5F8",
+"^ c #DEE0DD",
+"/ c #CED7DF",
+"...........+....",
+".@@@@@@@@@++#@@.",
+".@$$$$$$$++%%$+.",
+".@&&&&&&++##*++.",
+".@*****++%%$++#.",
+".$*==+++==*++#%.",
+"&*+-&++;;+++%#@.",
+"*=>&,*--+++##$@.",
+"&==->>>-++=%&$@.",
+"&='=====++=%**$*",
+"&=%))&)),%+++++*",
+".=%-;);!%++>#>~+",
+".&=){]^,~=+->>++",
+".@/======%++++++",
+".@@&'%%%%%+%~~+*",
+"........**&+++**"};
diff --git a/muse/muse/xpm/addtrack_wavetrack.xpm b/muse/muse/xpm/addtrack_wavetrack.xpm
new file mode 100644
index 00000000..c67befb9
--- /dev/null
+++ b/muse/muse/xpm/addtrack_wavetrack.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static const char * addtrack_wavetrack_xpm[] = {
+"16 16 17 1",
+" c None",
+". c #800000",
+"+ c #FEFFFC",
+"@ c #FDF7F6",
+"# c #A29FA3",
+"$ c #9FA19E",
+"% c #C20000",
+"& c #F9FBF8",
+"* c #C2C4C0",
+"= c #BAC5C6",
+"- c #7F817E",
+"; c #FFFFFF",
+"> c #F8FEFF",
+", c #000100",
+"' c #797D7C",
+") c #DBDDDA",
+"! c #DDE2E5",
+".........+++@#$#",
+".%%%%%%%+++@+++#",
+".%++&&&&++*=#-++",
+".;>>>++,>@@@@$@+",
+">>+@@+,,+=**@$++",
+"+,,+,,,,++@#@-@+",
+"+,,+,,+,**+#+'-@",
+"+,,+,++,+#@-+@'@",
+"+,,+,++,+$+'@+'@",
+"+,,+,,+,**@$@--@",
+"+,,+,,,,@@+#+#@+",
+"++++)),,+***+*++",
+".+)+@!),+@@@+*@+",
+".%+@+@)!;+**#'@$",
+".%%%%%%%;+@@+@+#",
+".........@@+++$$"};
diff --git a/muse/muse/xpm/audio_bounce_to_file.xpm b/muse/muse/xpm/audio_bounce_to_file.xpm
new file mode 100644
index 00000000..ee645fdc
--- /dev/null
+++ b/muse/muse/xpm/audio_bounce_to_file.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char * audio_bounce_to_file_xpm[] = {
+"16 16 5 1",
+" c None",
+". c #000000",
+"+ c #C3C3C3",
+"@ c #DCDCDC",
+"# c #A0A0A0",
+" ... ",
+" ..+.. ",
+" ..+@@.. ",
+" ..+@#@@.. ",
+" ..+@###@@.. ",
+" ..+@####+@+.. ",
+"..@@###+@+@.... ",
+".+@###+@++.##...",
+"..+##@@++.####..",
+" ..++@++.###### ",
+" ..+++..##### ",
+" ..+.##.### ",
+" ....##.# ",
+" ....## ",
+" ... ",
+" . "};
diff --git a/muse/muse/xpm/audio_bounce_to_track.xpm b/muse/muse/xpm/audio_bounce_to_track.xpm
new file mode 100644
index 00000000..3708b6bf
--- /dev/null
+++ b/muse/muse/xpm/audio_bounce_to_track.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char * audio_bounce_to_track_xpm[] = {
+"16 16 8 1",
+" c None",
+". c #CECECE",
+"+ c #FB0000",
+"@ c #8A5C04",
+"# c #9E772E",
+"$ c #000000",
+"% c #AE8E51",
+"& c #2B2B2B",
+" .++ ",
+" .++ ",
+" ...++ ",
+" .++++++ ",
+" ..++++ . ",
+" ..++ . ",
+" .... ",
+" ",
+" ",
+" @# @# @# @# ",
+"$$$$$$$$$$$$$$$$",
+"@#. @%..@#..@#. ",
+"#. @%..@#..@#. @",
+". ##. @#. @#. @#",
+"$$$$$$$&$$$$$$$$",
+" @#. @#. @#. @# "};
diff --git a/muse/muse/xpm/audio_restartaudio.xpm b/muse/muse/xpm/audio_restartaudio.xpm
new file mode 100644
index 00000000..f74a3050
--- /dev/null
+++ b/muse/muse/xpm/audio_restartaudio.xpm
@@ -0,0 +1,69 @@
+/* XPM */
+static const char * audio_restartaudio_xpm[] = {
+"16 16 50 1",
+" c None",
+". c #F5A630",
+"+ c #F8B657",
+"@ c #A98F5C",
+"# c #F2B64F",
+"$ c #BBBBBB",
+"% c #323232",
+"& c #0A0A0A",
+"* c #D2D2D2",
+"= c #292929",
+"- c #101010",
+"; c #191916",
+"> c #B6B1AF",
+", c #5C5C5C",
+"' c #1C1C1D",
+") c #C4C4C5",
+"! c #B0B0B0",
+"~ c #DADADA",
+"{ c #C9C9C9",
+"] c #808080",
+"^ c #5A5A5A",
+"/ c #3A3A3B",
+"( c #929292",
+"_ c #A4A4A4",
+": c #949494",
+"< c #39393B",
+"[ c #1F1E22",
+"} c #5A5A59",
+"| c #3E3E3D",
+"1 c #353537",
+"2 c #18171B",
+"3 c #060606",
+"4 c #363636",
+"5 c #393939",
+"6 c #272727",
+"7 c #29292B",
+"8 c #141417",
+"9 c #0B0B0B",
+"0 c #1C1C1C",
+"a c #252527",
+"b c #2E2D2F",
+"c c #262628",
+"d c #1D1D1E",
+"e c #19191B",
+"f c #0A0A0B",
+"g c #111114",
+"h c #0F0F13",
+"i c #0F0E11",
+"j c #0E0E10",
+"k c #0D0D0F",
+" .. + ",
+" ++...+++ ",
+" ++.++ ",
+" ++++@+#++ ",
+" $%&&+ ++ ",
+" * = -;>++ ",
+" * ,'' ) + ",
+" * ! ''&!+ ",
+"* ~ {]^/'& ",
+" (_: <[&& ",
+"= }|123& ",
+"=45 6789( ",
+"!&0abcdef9! ",
+" !&ghijk&! ",
+" !&&&&&! ",
+" !&& ! "};
diff --git a/muse/muse/xpm/automation_clear_data.xpm b/muse/muse/xpm/automation_clear_data.xpm
new file mode 100644
index 00000000..e4648c29
--- /dev/null
+++ b/muse/muse/xpm/automation_clear_data.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * automation_clear_data_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #FF0000",
+"+ c #FFBEBE",
+" ",
+" ",
+" ",
+" ..+ +.. ",
+" ...+ +... ",
+" +...++...+ ",
+" +......+ ",
+" +....+ ",
+" +....+ ",
+" +......+ ",
+" +...++...+ ",
+" ...+ +... ",
+" ..+ +.. ",
+" ",
+" ",
+" "};
diff --git a/muse/muse/xpm/automation_mixer.xpm b/muse/muse/xpm/automation_mixer.xpm
new file mode 100644
index 00000000..4a59c220
--- /dev/null
+++ b/muse/muse/xpm/automation_mixer.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static const char * automation_mixer_xpm[] = {
+"16 16 16 1",
+" c None",
+". c #FF0000",
+"+ c #DA1007",
+"@ c #000000",
+"# c #710000",
+"$ c #FFBEBE",
+"% c #B00000",
+"& c #EA0904",
+"* c #B80000",
+"= c #A00000",
+"- c #CE160A",
+"; c #880000",
+"> c #990000",
+", c #BD0000",
+"' c #FF8E8E",
+") c #D32311",
+" ",
+" .",
+" .+",
+" @ @ @ #.. ",
+" @@@ @ @ $.. ",
+" @@@ @ @@%.. ",
+"& @ @ @*=.@ ",
+"-. @ @.... @ ",
+" ..@ .... @ ",
+" ...*;;.@ @@@ ",
+" ...>;,'@ @@@ ",
+" ....' @ @ ",
+" ... ",
+" .. ",
+" ) ",
+" "};
diff --git a/muse/muse/xpm/automation_take_snapshot.xpm b/muse/muse/xpm/automation_take_snapshot.xpm
new file mode 100644
index 00000000..8f7beae7
--- /dev/null
+++ b/muse/muse/xpm/automation_take_snapshot.xpm
@@ -0,0 +1,144 @@
+/* XPM */
+static const char * automation_take_snapshot_xpm[] = {
+"16 16 125 2",
+" c None",
+". c #616167",
+"+ c #6B6A6E",
+"@ c #66685A",
+"# c #9EA18A",
+"$ c #CACB0E",
+"% c #F7F810",
+"& c #FAFB10",
+"* c #FEFF0A",
+"= c #1F1D28",
+"- c #1D1B27",
+"; c #4E5047",
+"> c #7E8072",
+", c #F2F30F",
+"' c #EDEE10",
+") c #DCDD20",
+"! c #E9EA25",
+"~ c #52534E",
+"{ c #54564B",
+"] c #595C50",
+"^ c #5B5E53",
+"/ c #53544A",
+"( c #4F5148",
+"_ c #7D7F72",
+": c #7B7D6E",
+"< c #585944",
+"[ c #666848",
+"} c #5B5D51",
+"| c #535342",
+"1 c #535447",
+"2 c #595955",
+"3 c #4B4C47",
+"4 c #636558",
+"5 c #78796D",
+"6 c #84847F",
+"7 c #94958B",
+"8 c #413F4C",
+"9 c #0E0B1C",
+"0 c #201E2A",
+"a c #999990",
+"b c #8E907F",
+"c c #6D6F65",
+"d c #5A5D51",
+"e c #4E4F49",
+"f c #A9AB9E",
+"g c #4C4C48",
+"h c #585A4E",
+"i c #787A6F",
+"j c #A0A296",
+"k c #1A1725",
+"l c #1D1A27",
+"m c #181624",
+"n c #616165",
+"o c #A7A89A",
+"p c #86877F",
+"q c #595B4F",
+"r c #52544E",
+"s c #ADAFA3",
+"t c #53544F",
+"u c #9A9D88",
+"v c #A4A699",
+"w c #100D1D",
+"x c #2C2932",
+"y c #878A79",
+"z c #8A8A82",
+"A c #606255",
+"B c #53534E",
+"C c #A3A598",
+"D c #454641",
+"E c #5A5C50",
+"F c #797A6F",
+"G c #999C91",
+"H c #1C1A26",
+"I c #151321",
+"J c #292630",
+"K c #8D8F7E",
+"L c #A5A799",
+"M c #5E6053",
+"N c #9A9C8F",
+"O c #5F6155",
+"P c #727368",
+"Q c #9C9D92",
+"R c #2A2931",
+"S c #1C1A27",
+"T c #181523",
+"U c #26232F",
+"V c #98998F",
+"W c #8A8B82",
+"X c #464742",
+"Y c #A1A396",
+"Z c #6D6F61",
+"` c #6B6D62",
+" . c #A5A899",
+".. c #2A2A32",
+"+. c #1C1926",
+"@. c #181623",
+"#. c #1E1C28",
+"$. c #8E8F89",
+"%. c #81827B",
+"&. c #787A6E",
+"*. c #95978A",
+"=. c #3E3F3F",
+"-. c #484944",
+";. c #5E6054",
+">. c #57594E",
+",. c #55574C",
+"'. c #56584D",
+"). c #5A5C51",
+"!. c #5C5E53",
+"~. c #4B4C46",
+"{. c #53544E",
+"]. c #484847",
+"^. c #9B9D90",
+"/. c #B2B3A8",
+"(. c #AAAC9F",
+"_. c #AAACA0",
+":. c #9D9F93",
+"<. c #AAABA1",
+"[. c #B7B8AE",
+"}. c #AEB0A4",
+"|. c #ABADA1",
+"1. c #B4B6AB",
+"2. c #C8C9C1",
+"3. c #D4D4CE",
+"4. c #C0C1B8",
+" ",
+" ",
+" . + @ # $ % & * ",
+" = - ; > , ' ) ! ",
+"~ { ] ^ / ( _ : < [ } | 1 2 ",
+"3 4 5 6 7 8 9 9 0 a b c d e f ",
+"g h i j 9 9 k l m n o p q r s ",
+"t { u v 9 9 9 9 w x y z A B C ",
+"D E F G H I 9 9 9 J K L M 3 N ",
+"D O P Q R S 9 9 T U V W A X Y ",
+"D Z ` 7 ...+.@.#.$.%.&.q X *. ",
+"t =.-.3 } ;.>.,.'.).!.~.{.].^. ",
+" /.f (.(._.:.<.[.}._.|.f 1. ",
+" 2.3.3.2.2.3.3.3.2.3.2.2.4. ",
+" ",
+" "};
diff --git a/muse/muse/xpm/back.xpm b/muse/muse/xpm/back.xpm
new file mode 100644
index 00000000..917213c0
--- /dev/null
+++ b/muse/muse/xpm/back.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static const char*back_xpm[]={
+"16 16 5 1",
+"# c #000000",
+"a c #ffffff",
+"c c #808080",
+"b c #c0c0c0",
+". c None",
+"................",
+".......#........",
+"......##........",
+".....#a#........",
+"....#aa########.",
+"...#aabaaaaaaa#.",
+"..#aabbbbbbbbb#.",
+"...#abbbbbbbbb#.",
+"...c#ab########.",
+"....c#a#ccccccc.",
+".....c##c.......",
+"......c#c.......",
+".......cc.......",
+"........c.......",
+"................",
+"......................"};
+
diff --git a/muse/muse/xpm/bluedot.xpm b/muse/muse/xpm/bluedot.xpm
new file mode 100644
index 00000000..a92558f9
--- /dev/null
+++ b/muse/muse/xpm/bluedot.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static const char * bluedot_xpm[] = {
+"18 18 13 1",
+" c None",
+". c #F10606",
+"+ c #414141",
+"@ c #852A2A",
+"# c #473E3E",
+"$ c #723030",
+"% c #CB1212",
+"& c #4E3C3C",
+"* c #E20A0A",
+"= c #A51F1F",
+"- c #9E2121",
+"; c #832A2A",
+"> c #9C2222",
+" ",
+" ",
+" . ",
+" .. ",
+" ... ",
+" +++++++++@... ",
+" #+++++++$..% ",
+" &# ..*+ ",
+" .= ...-+ ",
+" ;.. ....++ ",
+" +... ... ++ ",
+" ++....... ++ ",
+" ++ ..... ++ ",
+" ++ .... ++ ",
+" ++ .. ++ ",
+" +++++>.+++++ ",
+" ++++++++++++ ",
+" "};
diff --git a/muse/muse/xpm/bold.xpm b/muse/muse/xpm/bold.xpm
new file mode 100644
index 00000000..b5d786ac
--- /dev/null
+++ b/muse/muse/xpm/bold.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static const char * bold_xpm[] = {
+"11 11 2 1",
+" g None",
+". g #000000",
+" ",
+" ....... ",
+" .. ... ",
+" .. .. ",
+" .. .. ",
+" ..... ",
+" .. ... ",
+" .. .. ",
+" .. ... ",
+" ....... ",
+" "};
diff --git a/muse/muse/xpm/bouncetofile.xpm b/muse/muse/xpm/bouncetofile.xpm
new file mode 100644
index 00000000..0744a7f9
--- /dev/null
+++ b/muse/muse/xpm/bouncetofile.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static const char *bounceToFileS_xpm[]={
+"16 16 6 1",
+"# c #000000",
+"c c #a0a0a0",
+"d c #c3c3c3",
+"b c #dcdcdc",
+". c #ff00ff",
+"a c #ffffff",
+"......###.......",
+".....#####......",
+"..aa###bb##aaa..",
+"..a###bbbb##aa..",
+"..###bbbcbb##a..",
+".###bbcccdbd##..",
+"##bbccddbbb####.",
+"##bbbddbb##cc##.",
+"####bbbb##ccc##.",
+".####b###ccccc#.",
+"..#####ccccccc..",
+"..a####cc#ccca..",
+"..aa####ccccaa..",
+"..aaa####ccaaa..",
+"......###.......",
+"................"};
diff --git a/muse/muse/xpm/buttondown.xpm b/muse/muse/xpm/buttondown.xpm
new file mode 100644
index 00000000..a8cff668
--- /dev/null
+++ b/muse/muse/xpm/buttondown.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char * buttondown_xpm[] = {
+"16 18 6 1",
+" c None",
+". c #F0F0F0",
+"+ c #000000",
+"@ c #F8FCF8",
+"# c #484C48",
+"$ c #D8DCD8",
+"...............+",
+".@@@@@@@@@@@@@#+",
+".@$$$$$$$$$$$$#+",
+".@$$$$$$$$$$$$#+",
+".@$$$$$$$$$$$$#+",
+".@$$$$$$$$$$$$#+",
+".@$$$$$$$$$$$$#+",
+".@$$+++++++$$$#+",
+".@$$$+++++$$$$#+",
+".@$$$$+++$$$$$#+",
+".@$$$$$+$$$$$$#+",
+".@$$$$$$$$$$$$#+",
+".@$$$$$$$$$$$$#+",
+".@$$$$$$$$$$$$#+",
+".@$$$$$$$$$$$$#+",
+".@$$$$$$$$$$$$#+",
+".##############+",
+"++++++++++++++++"};
diff --git a/muse/muse/xpm/cafter.xpm b/muse/muse/xpm/cafter.xpm
new file mode 100644
index 00000000..3ab12692
--- /dev/null
+++ b/muse/muse/xpm/cafter.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static const char *cafter_xpm[] = {
+"22 22 2 1",
+". c None",
+"# c #000000",
+"######################",
+"##...................#",
+"#.#..................#",
+"#..#.................#",
+"#...#................#",
+"#....#...............#",
+"#.....#..............#",
+"#......#.............#",
+"#.......#............#",
+"#........#...........#",
+"#.........#..........#",
+"#..........#.........#",
+"#...........#........#",
+"#............#.......#",
+"#.............#......#",
+"#..............#.....#",
+"#...............#....#",
+"#................#...#",
+"#.................#..#",
+"#..................#.#",
+"#...................##",
+"######################"
+};
+
diff --git a/muse/muse/xpm/cliplistS.xpm b/muse/muse/xpm/cliplistS.xpm
new file mode 100644
index 00000000..6ba516fc
--- /dev/null
+++ b/muse/muse/xpm/cliplistS.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *cliplistS_xpm[]={
+"16 16 9 1",
+"# c #000000",
+"f c #585858",
+"e c #808080",
+"d c #a0a0a0",
+"c c #c000c0",
+"g c #c3c3c3",
+"a c #dcdcdc",
+". c #ff00ff",
+"b c #ffffff",
+"................",
+"..############..",
+"..#aaaaaaaaaa#..",
+"..#abbbbbbbba#c.",
+"..#bbdeeeedbb#c.",
+"..#bdbbbbbbdb#c.",
+"..#bbbdffdbbb#c.",
+"..#bbbbbbbbbb#c.",
+"..#b#gggggg#b#c.",
+"..#bb######gb#c.",
+"..#bbb####gbb#c.",
+"..#bbbb##gbbb#c.",
+"..#bbbbggbbbb#c.",
+"..############c.",
+"....ccccccccccc.",
+"................"};
diff --git a/muse/muse/xpm/cmark.xpm b/muse/muse/xpm/cmark.xpm
new file mode 100644
index 00000000..5c8cf1fc
--- /dev/null
+++ b/muse/muse/xpm/cmark.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char* cmark_xpm[]={
+"18 18 2 1",
+"# c #ff0000",
+". c None",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+"##################",
+".################.",
+"..##############..",
+"...############...",
+"....##########....",
+".....########.....",
+"......######......",
+".......####.......",
+"........##........",
+"........##........",
+"........##........"};
diff --git a/muse/muse/xpm/config.xpm b/muse/muse/xpm/config.xpm
new file mode 100644
index 00000000..727c4095
--- /dev/null
+++ b/muse/muse/xpm/config.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static const char * config_xpm[] = {
+"16 16 17 1",
+" c None",
+". c #000000",
+"+ c #808080",
+"@ c #646464",
+"# c #DCDCDC",
+"$ c #C3C3C3",
+"% c #A0A0A0",
+"& c #B8B8B8",
+"* c #787878",
+"= c #FFFFFF",
+"- c #EDEDED",
+"; c #585858",
+"> c #C2C2C2",
+", c #B7B7B7",
+"' c #E7E7E7",
+") c #303030",
+"! c #CFCFCF",
+" ...... ",
+" .+@#$%.. ",
+" .&*@#$%. ",
+"... ..&@#$. ",
+".=$.. .@##%. ",
+".=-#$.;@>##,. ",
+".@=-######'$%.. ",
+")=@*=--##'$!$%%.",
+".$#=@@@*%$-#!$,%",
+" ..$#$$$*@*=-#!$",
+" ...%#$$%@*=-#",
+" ....-#%@*=",
+" ..-#%@",
+" ..-#",
+" ..",
+" "};
diff --git a/muse/muse/xpm/configure.xpm b/muse/muse/xpm/configure.xpm
new file mode 100644
index 00000000..5bcb079f
--- /dev/null
+++ b/muse/muse/xpm/configure.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static const char * configure_xpm[] = {
+"16 16 17 1",
+" c None",
+". c #000000",
+"+ c #808080",
+"@ c #646464",
+"# c #DCDCDC",
+"$ c #C3C3C3",
+"% c #A0A0A0",
+"& c #B8B8B8",
+"* c #787878",
+"= c #FFFFFF",
+"- c #EDEDED",
+"; c #585858",
+"> c #C2C2C2",
+", c #B7B7B7",
+"' c #E7E7E7",
+") c #303030",
+"! c #CFCFCF",
+" ...... ",
+" .+@#$%.. ",
+" .&*@#$%. ",
+"... ..&@#$. ",
+".=$.. .@##%. ",
+".=-#$.;@>##,. ",
+".@=-######'$%.. ",
+")=@*=--##'$!$%%.",
+".$#=@@@*%$-#!$,%",
+" ..$#$$$*@*=-#!$",
+" ...%#$$%@*=-#",
+" ....-#%@*=",
+" ..-#%@",
+" ..-#",
+" ..",
+" "};
diff --git a/muse/muse/xpm/context_help.xpm b/muse/muse/xpm/context_help.xpm
new file mode 100644
index 00000000..4b7838e9
--- /dev/null
+++ b/muse/muse/xpm/context_help.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static const char*context_help[]={
+"22 22 4 1",
+"# c #000000",
+"a c #000080",
+"b c #808080",
+". c None",
+"......................",
+"......................",
+"......................",
+"......................",
+"...#........aaaaab....",
+"...##......aa..baab...",
+"...###....aab...aaa...",
+"...####...aab...aaa...",
+"...#####..baa..baab...",
+"...######......aab....",
+"...#######....aa......",
+"...########..aab......",
+"...#####.....aab......",
+"...##.##..............",
+"...#...##....aaa......",
+".......##....aaa......",
+"........##............",
+"........##............",
+"......................",
+"......................",
+"......................",
+"......................"};
+
diff --git a/muse/muse/xpm/ctrl.xpm b/muse/muse/xpm/ctrl.xpm
new file mode 100644
index 00000000..01124b02
--- /dev/null
+++ b/muse/muse/xpm/ctrl.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char * ctrl_xpm[] = {
+"22 22 2 1",
+" c #FFFFFFFFFFFF",
+". c #000000000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ... . .. ",
+" .. .. . ",
+" . . . . ",
+" . ..... .. . ",
+" . . .. . ",
+" . . . . ",
+" . . . . . ",
+" .. .. . . . ",
+" .... ..... ... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/muse/muse/xpm/cut.xpm b/muse/muse/xpm/cut.xpm
new file mode 100644
index 00000000..b104bd1c
--- /dev/null
+++ b/muse/muse/xpm/cut.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static const char*cut_xpm[]={
+"18 18 7 1",
+"# c #a0a0a4",
+"a c #585858",
+"b c #303030",
+"d c #dcdcdc",
+"e c #ffffff",
+"c c #c0c0c0",
+". c None",
+"..................",
+"..................",
+"..#aba#...........",
+"..bccca#.....ab#..",
+"..accccb...#abaa#.",
+"..#aacaa..#aba#...",
+"...#bab#.#ab#.....",
+".....#aaaba#......",
+"aaaaaaaada#aaaaaa.",
+".....#baaaaeeeeed.",
+"...#aaa#.#dd#.....",
+"..#abcba..daba#...",
+"..accccb..e#abab#.",
+"..bccca#.....aa#..",
+"..#aba#...........",
+"..................",
+"..................",
+".................."};
+
diff --git a/muse/muse/xpm/darkgreendot.xpm b/muse/muse/xpm/darkgreendot.xpm
new file mode 100644
index 00000000..a9451396
--- /dev/null
+++ b/muse/muse/xpm/darkgreendot.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static const char *darkgreendot_xpm[] = {
+"12 12 2 1",
+". c None",
+"# c #007700",
+"...#####....",
+"..#######...",
+".#########..",
+"###########.",
+"###########.",
+"###########.",
+"###########.",
+"###########.",
+".#########..",
+"..#######...",
+"...#####....",
+"............"};
+
+
diff --git a/muse/muse/xpm/darkreddot.xpm b/muse/muse/xpm/darkreddot.xpm
new file mode 100644
index 00000000..a81b9f37
--- /dev/null
+++ b/muse/muse/xpm/darkreddot.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static const char *darkreddot_xpm[]={
+"12 12 2 1",
+". c None",
+"# c #a70000",
+"...#####....",
+"..#######...",
+".#########..",
+"###########.",
+"###########.",
+"###########.",
+"###########.",
+"###########.",
+".#########..",
+"..#######...",
+"...#####....",
+"............"};
diff --git a/muse/muse/xpm/delete.xpm b/muse/muse/xpm/delete.xpm
new file mode 100644
index 00000000..7c337199
--- /dev/null
+++ b/muse/muse/xpm/delete.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char* delete_xpm[]={
+"18 18 5 1",
+"# c #000000",
+"a c #ffffff",
+"b c #a0a0a4",
+"c c #dcdcdc",
+". c None",
+"..................",
+"..................",
+"..................",
+"..................",
+"........########..",
+".......#aaaaaa##b.",
+"......#aaaaaa#c#b.",
+".....#aaaaaa#cc#b.",
+"....#aaaaaa#cc#bb.",
+"...#aaaaaa#cc#bb..",
+"..#aaaaaa#cc#bb...",
+".########cc#bb....",
+".#cccccc#c#bb.....",
+".#cccccc##bb......",
+".########bb.......",
+"..bbbbbbbb........",
+"..................",
+".................."};
+
diff --git a/muse/muse/xpm/dot.xpm b/muse/muse/xpm/dot.xpm
new file mode 100644
index 00000000..6f905a79
--- /dev/null
+++ b/muse/muse/xpm/dot.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *dot_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 16 13 2 1",
+/* colors */
+". c none",
+"# c #00ff00",
+/* pixels */
+"................",
+"................",
+".......##.......",
+"......####......",
+".....######.....",
+"....########....",
+"....########....",
+"....########....",
+".....######.....",
+"......####......",
+".......##.......",
+"................",
+"................"
+};
diff --git a/muse/muse/xpm/dot1.xpm b/muse/muse/xpm/dot1.xpm
new file mode 100644
index 00000000..1b2d9887
--- /dev/null
+++ b/muse/muse/xpm/dot1.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *dot1_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 16 13 2 1",
+/* colors */
+". c none",
+"# c #909090",
+/* pixels */
+"................",
+"................",
+".......##.......",
+"......####......",
+".....######.....",
+"....########....",
+"....########....",
+"....########....",
+".....######.....",
+"......####......",
+".......##.......",
+"................",
+"................"
+};
diff --git a/muse/muse/xpm/doth.xpm b/muse/muse/xpm/doth.xpm
new file mode 100644
index 00000000..8ee77790
--- /dev/null
+++ b/muse/muse/xpm/doth.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *doth_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 16 13 2 1",
+/* colors */
+". c none",
+"# c #000000",
+/* pixels */
+"................",
+"................",
+".......##.......",
+"......#..#......",
+".....#....#.....",
+"....#......#....",
+"....#......#....",
+"....#......#....",
+".....#....#.....",
+"......#..#......",
+".......##.......",
+"................",
+"................"
+};
diff --git a/muse/muse/xpm/down.xpm b/muse/muse/xpm/down.xpm
new file mode 100644
index 00000000..9ac9f1f9
--- /dev/null
+++ b/muse/muse/xpm/down.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static const char* down_xpm[]={
+"14 10 2 1",
+"# c #000000",
+". c None",
+"..............",
+"......##......",
+"......##......",
+"......##......",
+"......##......",
+"...##.##.##...",
+"....######....",
+".....####.....",
+"......##......",
+".............."};
diff --git a/muse/muse/xpm/draw.xpm b/muse/muse/xpm/draw.xpm
new file mode 100644
index 00000000..5bb771a3
--- /dev/null
+++ b/muse/muse/xpm/draw.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static const char *draw_xpm[]={
+"18 18 4 1",
+". c None",
+"# c #000040",
+"b c #c3c3c3",
+"a c #ffffff",
+"..................",
+"..........###.....",
+"..........#a#.....",
+".........####.....",
+"........#b..#.....",
+".......#b....#....",
+"......#b.....#....",
+".....#bb......#...",
+"....#bb.......###.",
+".###bb........#a#.",
+".#a#b.........###.",
+".###b.............",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+".................."};
diff --git a/muse/muse/xpm/drumS.xpm b/muse/muse/xpm/drumS.xpm
new file mode 100644
index 00000000..d1f73e21
--- /dev/null
+++ b/muse/muse/xpm/drumS.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static const char *drumS_xpm[]={
+"16 16 11 1",
+"# c #000000",
+"i c #008000",
+"d c #008080",
+". c #00ff00",
+"c c #303030",
+"e c #808080",
+"a c #a0a0a0",
+"g c #c3c3c3",
+"h c #dcdcdc",
+"f c #f8f7f7",
+"b c #ffffff",
+"................",
+"..........##ab..",
+"..bbbbbbb##aab..",
+"..bbbbbb##aa.##.",
+"..bbbbb##aa.##a.",
+"..bccdd#cc.##aa.",
+"..#ebddff###aa..",
+".cgbhbeedd#aab..",
+".ccegggeddcabb..",
+".caccccc##cabb..",
+".cahhfhhhacabb..",
+".caefhfhaacabb..",
+"..chhfhhecabbb..",
+"..gccccccabbbb..",
+"....iiiiii......",
+"................"};
diff --git a/muse/muse/xpm/edit_drumms.xpm b/muse/muse/xpm/edit_drumms.xpm
new file mode 100644
index 00000000..8738f267
--- /dev/null
+++ b/muse/muse/xpm/edit_drumms.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static const char * edit_drumms_xpm[] = {
+"16 16 26 1",
+" c None",
+". c #13A913",
+"+ c #000100",
+"@ c #0AD700",
+"# c #496447",
+"$ c #FEFFFC",
+"% c #F8FEFF",
+"& c #A29FA3",
+"* c #9FA19E",
+"= c #FDF7F6",
+"- c #2F312E",
+"; c #797D7C",
+"> c #FBF5F4",
+", c #C2C4C0",
+"' c #DBDDDA",
+") c #F9FBF8",
+"! c #ACA5B1",
+"~ c #DDE2E5",
+"{ c #D3D8DA",
+"] c #7F817E",
+"^ c #E0CEC3",
+"/ c #F0F5F8",
+"( c #DEE0DD",
+"_ c #CED7DF",
+": c #078002",
+"< c #00C100",
+"...........+....",
+".@@@@@@@@@++#@@.",
+".@$$$$$$%++&*%+.",
+".@======++**%++.",
+".@%$%$%++&&$++*.",
+".@$--+++--$++**.",
+".@+;=++>>+++&&@.",
+".-,='$;;+++**)@.",
+".--;,,,;++-&%$@.",
+".-!-----++-&%=@.",
+".-&~~=~~'&+++++.",
+".-&;>~>{&++,&,]+",
+".@-~^/(']-+],,++",
+".@_------&++++++",
+".@@@::::::+*]]+.",
+"...........+++<."};
diff --git a/muse/muse/xpm/edit_list.xpm b/muse/muse/xpm/edit_list.xpm
new file mode 100644
index 00000000..19b62b41
--- /dev/null
+++ b/muse/muse/xpm/edit_list.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static const char * edit_list_xpm[] = {
+"16 16 12 1",
+" c None",
+". c #13A913",
+"+ c #0AD700",
+"@ c #000100",
+"# c #DBDDDA",
+"$ c #FDF7F6",
+"% c #D3D8DA",
+"& c #078002",
+"* c #F9FBF8",
+"= c #F8FEFF",
+"- c #DDE2E5",
+"; c #DEE0DD",
+"................",
+".+@@@@@@@@@@@@+.",
+".+@##########@+.",
+".+@$@$@$@$@$%@&.",
+".+@*=@=@=@=@#@&.",
+".+@$$*$*$*$$%@&.",
+".+@=@-@-@-@;#@&.",
+".+@**@#@-@#@%@&.",
+".+@$*$*$*$$$#@&.",
+".+@=@-@#@-@#-@&.",
+".+@**@#@#@-@#@&.",
+".+@$$*$*$$$$%@&.",
+".+@=$=$==*=$#@&.",
+".+@@@@@@@@@@@@&.",
+".+++&&&&&&&&&&&.",
+"................"};
diff --git a/muse/muse/xpm/edit_mastertrack.xpm b/muse/muse/xpm/edit_mastertrack.xpm
new file mode 100644
index 00000000..e4f1a948
--- /dev/null
+++ b/muse/muse/xpm/edit_mastertrack.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static const char * edit_mastertrack_xpm[] = {
+"16 16 19 1",
+" c None",
+". c #13A913",
+"+ c #000100",
+"@ c #0AD700",
+"# c #F9FBF8",
+"$ c #F8FEFF",
+"% c #FEFFFC",
+"& c #FDF7F6",
+"* c #ED9E9D",
+"= c #EA8B8B",
+"- c #5B6062",
+"; c #D78080",
+"> c #EC9594",
+", c #DA8A8A",
+"' c #797D7C",
+") c #747573",
+"! c #FF9797",
+"~ c #1C1D1C",
+"{ c #C2C4C0",
+"................",
+"++@@@@@@@@@@@@@.",
+".++##$%#%$%%&%@.",
+".@++&&&&&&&&$&@.",
+".@&++$**%$$%$%@.",
+".@%%++%=*%%%$&@.",
+".@%%%+-;;==++++.",
+".@%%%%>,;;;+'++.",
+".@%&&%%*=;;++++.",
+".@%$%$%)*=!++++.",
+".@%%&%$%%~$++++.",
+".@%%%%%%%%%{{{{.",
+".@%%%%%%%%&&&&@.",
+".@%%%%%%%%%%%%@.",
+".@@@@@@@@@@@@@@.",
+"................"};
diff --git a/muse/muse/xpm/edit_midi.xpm b/muse/muse/xpm/edit_midi.xpm
new file mode 100644
index 00000000..3c7071c0
--- /dev/null
+++ b/muse/muse/xpm/edit_midi.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static const char * edit_midi_xpm[] = {
+"16 16 7 1",
+" c None",
+". c #57A8FE",
+"+ c #A6DDFD",
+"@ c #000100",
+"# c #FDF7F6",
+"$ c #2F312E",
+"% c #FEFFFC",
+"................",
+".++++@@@@@@++++.",
+".+##@$$$$$$@##+.",
+".+%@$######$@#+.",
+".+@$#%%$$%#%$@+.",
+".@$#%%#$$%%%#$@.",
+".@$%$$###%$$#$@.",
+".@$#$$%%%#$$#$@.",
+".@$###%%%####$@.",
+".@$%$$%%%%$$#$@.",
+".@$#$$#%%#$$#$@.",
+".+@$##%%%###$@+.",
+".+#@$%%%%%%$@#+.",
+".+%%@$$$$$$@%#+.",
+".++++@@@@@@++++.",
+"................"};
diff --git a/muse/muse/xpm/edit_pianoroll.xpm b/muse/muse/xpm/edit_pianoroll.xpm
new file mode 100644
index 00000000..c2672271
--- /dev/null
+++ b/muse/muse/xpm/edit_pianoroll.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char * edit_pianoroll_xpm[] = {
+"16 16 9 1",
+" c None",
+". c #13A913",
+"+ c #0AD700",
+"@ c #000100",
+"# c #F8FEFF",
+"$ c #FDF7F6",
+"% c #FEFFFC",
+"& c #DBDDDA",
+"* c #006B00",
+"................",
+".++++++++++++++.",
+".+@@@@@@@@@###+.",
+".+@@@@@@@@@$$$+.",
+".+%&&&&&&&&&%#+.",
+".+@@@@@@@@@$%$+.",
+".+@@@@@@@@@%%%+.",
+".+%&&&&&&&&&#$+.",
+".+@@@@@@@@@%##+.",
+".+@@@@@@@@@%%$+.",
+".+%&&&&&&&&&%%+.",
+".+%$$$$$$$$$#$+.",
+".+@@@@@@@@@%#%+.",
+".+@@@@@@@@@%#$+.",
+".++*********+++.",
+"................"};
diff --git a/muse/muse/xpm/edit_score.xpm b/muse/muse/xpm/edit_score.xpm
new file mode 100644
index 00000000..a6cc1d99
--- /dev/null
+++ b/muse/muse/xpm/edit_score.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *edit_score_xpm[]={
+"16 16 5 1",
+"# c #000000",
+". c #00c000",
+"b c #00ff00",
+"a c #dcdcdc",
+"c c #ffffff",
+"................",
+".##############.",
+"..aaaaaa#aaaaa..",
+".bcccccc##ccccb.",
+".##############.",
+"..aaaaaa#a#aaa..",
+".bcccccc#aaaccb.",
+".##############.",
+"..aaaaaa#aaaaa..",
+".bccc####accccb.",
+".##############.",
+"..aaa###aaaaaa..",
+".bccccaaacccccb.",
+".##############.",
+"................",
+"................"};
diff --git a/muse/muse/xpm/edit_track_add.xpm b/muse/muse/xpm/edit_track_add.xpm
new file mode 100644
index 00000000..6f659f7f
--- /dev/null
+++ b/muse/muse/xpm/edit_track_add.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *edit_track_add_xpm[]={
+"16 16 5 1",
+"c c #404000",
+". c #800000",
+"b c #808080",
+"# c #c00000",
+"a c #ffffff",
+"................",
+".##############.",
+".#aaaaaaaaaaaa#.",
+".#aaaaaaaaaaaa#.",
+".#babababababa#.",
+".cccccccccccccc.",
+".#babababababa#.",
+".#babababababa#.",
+".#babababababa#.",
+".#babababababa#.",
+".cccccccccccccc.",
+".#babababababa#.",
+".#aaaaaaaaaaaa#.",
+".#aaaaaaaaaaaa#.",
+".##############.",
+"................"};
diff --git a/muse/muse/xpm/edit_track_del.xpm b/muse/muse/xpm/edit_track_del.xpm
new file mode 100644
index 00000000..4ead97ff
--- /dev/null
+++ b/muse/muse/xpm/edit_track_del.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static const char * edit_track_del_xpm[] = {
+"16 16 6 1",
+" c None",
+". c #800000",
+"+ c #C00000",
+"@ c #FFFFFF",
+"# c #808080",
+"$ c #404000",
+"................",
+".++++++++++++++.",
+".+++@@@@@@@@@@+.",
+".++++@@@@@@@@@+.",
+".+#+++#@#@#@#@+.",
+".$$$+++$$$$$$$$.",
+".+#@#+++#@#@#@+.",
+".+#@#@+++@#@#@+.",
+".+#@#@#+++#@#@+.",
+".+#@#@#@+++@#@+.",
+".$$$$$$$$+++$$$.",
+".+#@#@#@#@+++@+.",
+".+@@@@@@@@@++++.",
+".+@@@@@@@@@@+++.",
+".++++++++++++++.",
+"................"};
diff --git a/muse/muse/xpm/editcopy.xpm b/muse/muse/xpm/editcopy.xpm
new file mode 100644
index 00000000..7823c06b
--- /dev/null
+++ b/muse/muse/xpm/editcopy.xpm
@@ -0,0 +1,102 @@
+/* XPM */
+static const char * editcopy_xpm[] = {
+"22 22 77 1",
+" c None",
+". c #121212",
+"+ c #FFFFFF",
+"@ c #313131",
+"# c #898989",
+"$ c #3C3B3C",
+"% c #C9C9C9",
+"& c #828282",
+"* c #C6C6C6",
+"= c #474646",
+"- c #5C5B5B",
+"; c #FEFCFB",
+"> c #A4A4A4",
+", c #747474",
+"' c #FDFBF9",
+") c #FCF7F3",
+"! c #FAF4EE",
+"~ c #F0EAE6",
+"{ c #C1BAB3",
+"] c #C3C3C3",
+"^ c #5A5552",
+"/ c #7E7873",
+"( c #9F958D",
+"_ c #7D746E",
+": c #D8D0C8",
+"< c #FCF8F5",
+"[ c #FBF5F0",
+"} c #F9F1EA",
+"| c #F8EEE5",
+"1 c #F7EADF",
+"2 c #F5E7DA",
+"3 c #D6CABF",
+"4 c #5B5959",
+"5 c #C4C0BD",
+"6 c #807C79",
+"7 c #5A5653",
+"8 c #C0B5AC",
+"9 c #998778",
+"0 c #7B6F65",
+"a c #7A6D62",
+"b c #D3C3B4",
+"c c #FBF6F2",
+"d c #FAF2EC",
+"e c #F9EFE7",
+"f c #F7EBE1",
+"g c #F6E8DC",
+"h c #F4E4D6",
+"i c #F3E0D0",
+"j c #F2DDCB",
+"k c #D1BCAA",
+"l c #4D4D4D",
+"m c #7F7A76",
+"n c #595551",
+"o c #7B6F64",
+"p c #564C45",
+"q c #786A5C",
+"r c #CEB6A0",
+"s c #F8EDE3",
+"t c #F6E9DD",
+"u c #F5E5D8",
+"v c #F3E2D2",
+"w c #F2DECD",
+"x c #F1DAC7",
+"y c #EFD7C2",
+"z c #EED3BC",
+"A c #CCAF97",
+"B c #DEDEDE",
+"C c #D7CCC1",
+"D c #D5C7BA",
+"E c #D3C2B3",
+"F c #D1BEAC",
+"G c #CFB9A5",
+"H c #CEB49F",
+"I c #CCB097",
+"J c #CAAB90",
+"K c #C9A88C",
+"L c #000000",
+" ",
+" ......... ",
+" .++++++@#. ",
+" .++++++$+%. ",
+" .+&%&*+=%+#. ",
+" .++++++==$@. ",
+" .+&-%&%;*>,...... ",
+" .+++++')!~{.]++@#. ",
+" .+-&*&^/(_:.]++$+%. ",
+" .++;<[}|123.&*+=%+#. ",
+" .+4567890ab.]++==$@. ",
+" .+cdefghijk.l&%+*>&. ",
+" .+mn89op9qr.]+++++*. ",
+" .+stuvwxyzA.>&-&>&B. ",
+" .:CDEFGHIJK.]+++++B. ",
+" ..........LL&-*>&&B. ",
+" .]]]]+++++B. ",
+" .+&-*>&->&B. ",
+" .+++++++++B. ",
+" .BBBBBBBBBB. ",
+" ............ ",
+" "};
diff --git a/muse/muse/xpm/editcopyS.xpm b/muse/muse/xpm/editcopyS.xpm
new file mode 100644
index 00000000..3e1463ff
--- /dev/null
+++ b/muse/muse/xpm/editcopyS.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static const char * editcopyS_xpm[] = {
+"16 16 7 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #FFFFC0",
+"# c #303030",
+"$ c #A0A0A0",
+"% c #DCDCDC",
+"...... ",
+".++++.. ",
+".++++.@. ",
+".+##+.+@. ",
+".++++....... ",
+".+##++$$$.+.. ",
+".+++++@+@.+.%. ",
+".+###+##@.+.+%. ",
+".+++@+@@@.+.....",
+".+##+###@.++$$$.",
+".+@+@@@@@.++++%.",
+".........##+##+.",
+" .++++++++.",
+" .+##+###+.",
+" .++++++++.",
+" .........."};
diff --git a/muse/muse/xpm/editcut.xpm b/muse/muse/xpm/editcut.xpm
new file mode 100644
index 00000000..4efcb43c
--- /dev/null
+++ b/muse/muse/xpm/editcut.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static const char * editcut_xpm[] = {
+"22 22 8 1",
+" c None",
+". c #000000",
+"+ c #080203",
+"@ c #FFFFFF",
+"# c #C3C3C3",
+"$ c #010101",
+"% c #A0A0A0",
+"& c #303030",
+" ",
+" ",
+" ..+. ",
+" ... .. ... ",
+" .. .. .@@#. ",
+" .. .. .@@#. ",
+" .. . .@@#. ",
+" ... .. .@@#. ",
+" ....$ .@@#. ",
+" .....@@#. ",
+" %.@@#. ",
+" .@&#. ",
+" ....@.#. ",
+" ....$..@@#. ",
+" ... .. .@@#. ",
+" .. . .@@#. ",
+" .. .. .@@#. ",
+" .. .. .@@#. ",
+" .. .. .@@#. ",
+" ..+. ... ",
+" ",
+" "};
diff --git a/muse/muse/xpm/editcutS.xpm b/muse/muse/xpm/editcutS.xpm
new file mode 100644
index 00000000..06031f4a
--- /dev/null
+++ b/muse/muse/xpm/editcutS.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char * editcutS_xpm[] = {
+"16 16 5 1",
+" g None",
+". g #000000",
+"+ g #FFFFFF",
+"@ g #DCDCDC",
+"# g #808080",
+" ",
+" .... .. ",
+".. .. .+@.",
+".. .. .+@. ",
+" .. . .+@. ",
+" ...... .+@. ",
+" .....+@. ",
+" ..+@. ",
+" .+@.. ",
+" .....#@. ",
+" ...... .+@. ",
+" .. . .+@. ",
+".. .. .+@. ",
+".. .. .+@.",
+" .... .. ",
+" "};
diff --git a/muse/muse/xpm/editmute.xpm b/muse/muse/xpm/editmute.xpm
new file mode 100644
index 00000000..ff0e22ac
--- /dev/null
+++ b/muse/muse/xpm/editmute.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static const char * editmute_xpm[] = {
+"22 22 8 1",
+" c None",
+". c #000000",
+"+ c #080203",
+"@ c #FFFFFF",
+"# c #C3C3C3",
+"$ c #010101",
+"% c #A0A0A0",
+"& c #303030",
+" ",
+" ",
+" ",
+" ... ... ",
+" .@@#. .@@#. ",
+" .@@#. .@@#. ",
+" .@@#. .@@#. ",
+" .@@#. .@@#. ",
+" .@@#. .@@#. ",
+" .@@#..@@#. ",
+" .@@@@@#. ",
+" .#&&#. ",
+" .@@@@@#. ",
+" .@@#..@@#. ",
+" .@@#. .@@#. ",
+" .@@#. .@@#. ",
+" .@@#. .@@#. ",
+" .@@#. .@@#. ",
+" .@@#. .@@#. ",
+" ... ... ",
+" ",
+" "};
diff --git a/muse/muse/xpm/editmuteS.xpm b/muse/muse/xpm/editmuteS.xpm
new file mode 100644
index 00000000..92a9d4be
--- /dev/null
+++ b/muse/muse/xpm/editmuteS.xpm
@@ -0,0 +1,63 @@
+/* XPM */
+static const char * editmuteS_xpm[] = {
+"16 16 44 1",
+" c None",
+". c #313131",
+"+ c #E5141A",
+"@ c #E1180D",
+"# c #3F3F3F",
+"$ c #222222",
+"% c #9E000D",
+"& c #FB1300",
+"* c #E91900",
+"= c #3B3B3B",
+"- c #EB1420",
+"; c #A9010C",
+"> c #454545",
+", c #000000",
+"' c #E10E08",
+") c #DD1F0F",
+"! c #121212",
+"~ c #ED0014",
+"{ c #FF0603",
+"] c #F7001C",
+"^ c #4C4C4C",
+"/ c #525252",
+"( c #1E0700",
+"_ c #ED021A",
+": c #F00018",
+"< c #E21C19",
+"[ c #070707",
+"} c #030A1D",
+"| c #000F00",
+"1 c #E90412",
+"2 c #0B0017",
+"3 c #000700",
+"4 c #010101",
+"5 c #EC141D",
+"6 c #EA0900",
+"7 c #DE0B09",
+"8 c #E01000",
+"9 c #E81400",
+"0 c #F10E1C",
+"a c #EE0E16",
+"b c #E50300",
+"c c #FF0316",
+"d c #E70816",
+"e c #FF1901",
+" ",
+" . +@ ",
+" # $%&* ",
+" =. . -.; ",
+" #>, #'). ",
+" ##!, ~${], ",
+" #^/!(,_:,< [ ",
+" #.,}|,'1, , ",
+" .,,23,{], 4 ",
+" ,,,,,,< , , ",
+" ,,,, , , ",
+" 56,,, , , ",
+" 7890,, , , ",
+" abcd , , ",
+" 6e~ , ",
+" "};
diff --git a/muse/muse/xpm/editpaste.xpm b/muse/muse/xpm/editpaste.xpm
new file mode 100644
index 00000000..8793a955
--- /dev/null
+++ b/muse/muse/xpm/editpaste.xpm
@@ -0,0 +1,210 @@
+/* XPM */
+static const char * editpaste_xpm[] = {
+"22 22 185 2",
+" c None",
+". c #161616",
+"+ c #3A3616",
+"@ c #6F681E",
+"# c #625607",
+"$ c #575006",
+"% c #020202",
+"& c #060A06",
+"* c #262206",
+"= c #807529",
+"- c #FEFEFD",
+"; c #CAC682",
+"> c #A69E62",
+", c #362E16",
+"' c #EAEAEA",
+") c #EEEEEE",
+"! c #574D0A",
+"~ c #FFFFFF",
+"{ c #F6F6DE",
+"] c #EEEECA",
+"^ c #CECA96",
+"/ c #9E964A",
+"( c #4A462E",
+"_ c #C5C5C5",
+": c #C9C9C9",
+"< c #CCCCCC",
+"[ c #D4D4D4",
+"} c #DBDBDB",
+"| c #3A3636",
+"1 c #D6D6D6",
+"2 c #A6A6A6",
+"3 c #989898",
+"4 c #D6D29E",
+"5 c #CAC686",
+"6 c #B6B26A",
+"7 c #AAA65A",
+"8 c #7E721E",
+"9 c #818181",
+"0 c #888885",
+"a c #8C8C8C",
+"b c #262626",
+"c c #DADADA",
+"d c #A2A2A2",
+"e c #A9A9A9",
+"f c #B2B6B6",
+"g c #3E3A32",
+"h c #2E2E26",
+"i c #26261A",
+"j c #22221A",
+"k c #222216",
+"l c #161612",
+"m c #626266",
+"n c #727272",
+"o c #6E6E6E",
+"p c #7A7A7A",
+"q c #222222",
+"r c #D5D5D5",
+"s c #999999",
+"t c #9E9E9E",
+"u c #AAAAAA",
+"v c #BEBEBE",
+"w c #9A9A9A",
+"x c #828282",
+"y c #6C6C6C",
+"z c #5E5E5E",
+"A c #656565",
+"B c #5B5B5B",
+"C c #2E2E2E",
+"D c #B5B5B1",
+"E c #AFAFAF",
+"F c #9A9E9E",
+"G c #969696",
+"H c #7E7E7E",
+"I c #432E1A",
+"J c #372617",
+"K c #2C1F14",
+"L c #201711",
+"M c #15110D",
+"N c #1B1B1B",
+"O c #1E1E1E",
+"P c #939393",
+"Q c #9F9F9F",
+"R c #A4A4A4",
+"S c #A2A29E",
+"T c #313131",
+"U c #898989",
+"V c #121212",
+"W c #B6B6B6",
+"X c #9F9FA3",
+"Y c #979797",
+"Z c #8A8A8A",
+"` c #797979",
+" . c #676767",
+".. c #3C3B3C",
+"+. c #AEAEAE",
+"@. c #949494",
+"#. c #C6C6C6",
+"$. c #474646",
+"%. c #8E8E8E",
+"&. c #D2D2D2",
+"*. c #A2A2A6",
+"=. c #868686",
+"-. c #717171",
+";. c #5C5B5B",
+">. c #FEFCFB",
+",. c #747474",
+"'. c #868682",
+"). c #FDFBF9",
+"!. c #FCF7F3",
+"~. c #FAF4EE",
+"{. c #F0EAE6",
+"]. c #C1BAB3",
+"^. c #CACACA",
+"/. c #6A6A6A",
+"(. c #3A2818",
+"_. c #5A5552",
+":. c #7E7873",
+"<. c #9F958D",
+"[. c #7D746E",
+"}. c #D8D0C8",
+"|. c #CECECE",
+"1. c #767676",
+"2. c #636363",
+"3. c #322316",
+"4. c #FCF8F5",
+"5. c #FBF5F0",
+"6. c #F9F1EA",
+"7. c #F8EEE5",
+"8. c #F7EADF",
+"9. c #F5E7DA",
+"0. c #D6CABF",
+"a. c #2A1E14",
+"b. c #5B5959",
+"c. c #C4C0BD",
+"d. c #807C79",
+"e. c #5A5653",
+"f. c #C0B5AC",
+"g. c #998778",
+"h. c #7B6F65",
+"i. c #7A6D62",
+"j. c #D3C3B4",
+"k. c #707070",
+"l. c #595959",
+"m. c #221811",
+"n. c #FBF6F2",
+"o. c #FAF2EC",
+"p. c #F9EFE7",
+"q. c #F7EBE1",
+"r. c #F6E8DC",
+"s. c #F4E4D6",
+"t. c #F3E0D0",
+"u. c #F2DDCB",
+"v. c #D1BCAA",
+"w. c #808080",
+"x. c #4F4F4F",
+"y. c #19140F",
+"z. c #7F7A76",
+"A. c #595551",
+"B. c #7B6F64",
+"C. c #564C45",
+"D. c #786A5C",
+"E. c #CEB6A0",
+"F. c #6A6666",
+"G. c #565656",
+"H. c #494949",
+"I. c #120F0C",
+"J. c #F8EDE3",
+"K. c #F6E9DD",
+"L. c #F5E5D8",
+"M. c #F3E2D2",
+"N. c #F2DECD",
+"O. c #F1DAC7",
+"P. c #EFD7C2",
+"Q. c #EED3BC",
+"R. c #CCAF97",
+"S. c #D7CCC1",
+"T. c #D5C7BA",
+"U. c #D3C2B3",
+"V. c #D1BEAC",
+"W. c #CFB9A5",
+"X. c #CEB49F",
+"Y. c #CCB097",
+"Z. c #CAAB90",
+"`. c #C9A88C",
+" + c #000000",
+" . + @ # $ ",
+" % % % % % & * = - ; > , % % % % % % ",
+"% ' ) ) ) ) ) ! ~ { ] ^ / ( _ : < [ } | ",
+"% 1 2 2 2 3 = ~ 4 5 6 7 / 8 ( 9 0 9 a b ",
+"% c d e f 2 g h i i j i j k l m n o p q ",
+"% r s t u v u w x y z A B A z B A y w C ",
+"% 1 D E u F t G H I I I J K L M N N y O ",
+"% r P Q R S w G H I ~ ~ ~ ~ ~ ~ T U V O ",
+"% 1 W u X Y Z ` .I ~ ~ ~ ~ ~ ~ ..~ : V ",
+"% 1 G t t u +.@.x I ~ x : x #.~ $.: ~ U V ",
+"% 1 w 2 t %.x x o I ~ ~ ~ ~ ~ ~ $.$...T V ",
+"% &.%.G w 2 *.=.-.I ~ x ;.: x : >.#.R ,.V ",
+"% &.2 u 2 '.=.=.-.I ~ ~ ~ ~ ~ ).!.~.{.].V ",
+"% ^.H =.Z w G H /.(.~ ;.x #.x _.:.<.[.}.V ",
+"% |.w G =.H p 1.2.3.~ ~ >.4.5.6.7.8.9.0.V ",
+"% ^.=.%.%.=.x p .a.~ b.c.d.e.f.g.h.i.j.V ",
+"% ^.H x H p k./.l.m.~ n.o.p.q.r.s.t.u.v.V ",
+"% #.x =.=.w.w.z x.y.~ z.A.f.g.B.C.g.D.E.V ",
+"% u o o o o F.G.H.I.~ J.K.L.M.N.O.P.Q.R.V ",
+" % % % % % % % V N }.S.T.U.V.W.X.Y.Z.`.V ",
+" V V V V V V V V V V + + ",
+" "};
diff --git a/muse/muse/xpm/editpasteS.xpm b/muse/muse/xpm/editpasteS.xpm
new file mode 100644
index 00000000..71c424a4
--- /dev/null
+++ b/muse/muse/xpm/editpasteS.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char * editpasteS_xpm[] = {
+"16 16 8 1",
+" c None",
+". c #000000",
+"+ c #C0C000",
+"@ c #A0A0A0",
+"# c #DCDCDC",
+"$ c #FFFFFF",
+"% c #FFFFC0",
+"& c #303030",
+" .. ",
+" ......++..... ",
+".@@@@.+..+.@@@. ",
+".#@@.++++++.@@. ",
+".#@@........@@. ",
+".#@@@@.$$$$..@. ",
+".#@@@@.$$$$.%.. ",
+".#@@@@.$&&$.$%..",
+".#@@@@.$$$$.....",
+".#@@@@.$&&$$@@@.",
+".#@@@@.$$$$$%$%.",
+".#@@@@.$&&&$&&%.",
+".#@@@@.$$$%$%%%.",
+".@@@@@.$&&$&&&%.",
+" ......$%$%%%%%.",
+" .........."};
diff --git a/muse/muse/xpm/exit.xpm b/muse/muse/xpm/exit.xpm
new file mode 100644
index 00000000..eb2a1b7f
--- /dev/null
+++ b/muse/muse/xpm/exit.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static const char * exit_xpm[] = {
+"22 22 4 1",
+" c None",
+". c #000000",
+"+ c #757575",
+"@ c #303030",
+" ",
+" ",
+" .. ",
+" .. ",
+" . .. . ",
+" ... .. ... ",
+" +..+ .. +..+ ",
+" ..@ .. @.. ",
+" +..+ .. +..+ ",
+" ... .. ... ",
+" ..+ .. +.. ",
+" ..+ .. +.. ",
+" ... .. ... ",
+" +..+ +..+ ",
+" ..@ @.. ",
+" +..@+ +@..+ ",
+" +....++....+ ",
+" +........+ ",
+" +....+ ",
+" ",
+" ",
+" "};
diff --git a/muse/muse/xpm/exit1.xpm b/muse/muse/xpm/exit1.xpm
new file mode 100644
index 00000000..7e19d63b
--- /dev/null
+++ b/muse/muse/xpm/exit1.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static const char * exit1_xpm[] = {
+"22 22 4 1",
+" c None",
+". c #000000",
+"+ c #757575",
+"@ c #303030",
+" ",
+" ",
+" ",
+" ",
+" ....+ ",
+" +.......+ ",
+" ....++....+ ",
+" ...@ +@..+ ",
+" .+ @.. ",
+" +..+ ",
+" ... ",
+" .......... +.. ",
+" .......... +.. ",
+" ... ",
+" +..+ ",
+" .+ @.. ",
+" ..@+ +@..+ ",
+" .....++....+ ",
+" +........+ ",
+" +....+ ",
+" ",
+" "};
diff --git a/muse/muse/xpm/exitS.xpm b/muse/muse/xpm/exitS.xpm
new file mode 100644
index 00000000..f0edb227
--- /dev/null
+++ b/muse/muse/xpm/exitS.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static const char * exitS_xpm[] = {
+"16 16 6 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #DCDCDC",
+"# c #A0A0A4",
+"$ c #808080",
+" ",
+" ..... ",
+" ..+++++.. ",
+" .++@@@@@@@. ",
+" .+@@@.@@@@. ",
+" .+@@@@.@@@@#. ",
+" .+@@@@.@@@@#. ",
+" .+@@@@.@@@@#. ",
+" .+@@@@.@@@@#. ",
+" .+@@@@.@@@@#. ",
+" .@@@@.@@@#.$ ",
+" .@@@@@@@##. ",
+" ..#####.. ",
+" ..... ",
+" ",
+" "};
diff --git a/muse/muse/xpm/fforward.xpm b/muse/muse/xpm/fforward.xpm
new file mode 100644
index 00000000..11bf7523
--- /dev/null
+++ b/muse/muse/xpm/fforward.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static const char * fforward_xpm[] = {
+"17 12 2 1",
+" c None",
+". c #000000",
+" . . ",
+" ... ... ",
+" ... ... ",
+" .... .... ",
+" .... .... ",
+" ..... ..... ",
+" ..... ..... ",
+" .... .... ",
+" .... .... ",
+" ... ... ",
+" ... ... ",
+" . . "};
diff --git a/muse/muse/xpm/filenew.png b/muse/muse/xpm/filenew.png
new file mode 100644
index 00000000..1214837b
--- /dev/null
+++ b/muse/muse/xpm/filenew.png
Binary files differ
diff --git a/muse/muse/xpm/filenewS.xpm b/muse/muse/xpm/filenewS.xpm
new file mode 100644
index 00000000..1980070a
--- /dev/null
+++ b/muse/muse/xpm/filenewS.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static const char * filenewS_xpm[] = {
+"16 16 10 1",
+" c None",
+". c #000000",
+"+ c #303030",
+"@ c #DCDCDC",
+"# c #C3C3C3",
+"$ c #FFFFFF",
+"% c #585858",
+"& c #A0A0A0",
+"* c #FFFFC0",
+"= c #400000",
+" ..+...+.. ",
+" +@@@@@#+#. ",
+" .@$$$$$%$@. ",
+" .@$$$$$%@$#. ",
+" .@$$$$$%%%+. ",
+" .@$$$$$$@#&. ",
+" .@$$$$$$*$@. ",
+" .@$$$$$$$$$. ",
+" .@$$$$*$*$*. ",
+" .@$$$$$$$*$. ",
+" .@$$*$*$*$*. ",
+" .@$$$$$*$*$. ",
+" +@*$*$*$*$*. ",
+" .@$$$*$*$**. ",
+" .@*$*$*$***. ",
+" ......=..+.. "};
diff --git a/muse/muse/xpm/fileopen.png b/muse/muse/xpm/fileopen.png
new file mode 100644
index 00000000..bb35ee03
--- /dev/null
+++ b/muse/muse/xpm/fileopen.png
Binary files differ
diff --git a/muse/muse/xpm/fileopenS.xpm b/muse/muse/xpm/fileopenS.xpm
new file mode 100644
index 00000000..05ce7450
--- /dev/null
+++ b/muse/muse/xpm/fileopenS.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static const char * fileopenS_xpm[] = {
+"16 16 7 1",
+" c None",
+". c #000000",
+"+ c #FFA858",
+"@ c #FFDCA8",
+"# c #DCDCDC",
+"$ c #C3C3C3",
+"% c #A0A0A0",
+" .... ",
+" .. .... . ",
+" . .... ",
+" ... ",
+" .... ",
+" .... ",
+".+@@+....... ",
+".@@@@+++++++. ",
+".@@.............",
+".@+.###########.",
+".@.#$$$$%$%$%%. ",
+".+.#$$$%$%$%%%. ",
+"..#$$$%$%$%%%. ",
+"..#$$%$%$%%%%. ",
+".#$$%$%$%%%%. ",
+"............. "};
diff --git a/muse/muse/xpm/fileprint.xpm b/muse/muse/xpm/fileprint.xpm
new file mode 100644
index 00000000..8b485c4c
--- /dev/null
+++ b/muse/muse/xpm/fileprint.xpm
@@ -0,0 +1,102 @@
+/* XPM */
+static const char * fileprint_xpm[] = {
+"22 22 77 1",
+" c None",
+". c #000000",
+"+ c #121212",
+"@ c #FFFFFF",
+"# c #F8F4F1",
+"$ c #5C5B5B",
+"% c #828282",
+"& c #C9C9C9",
+"* c #DEDEDE",
+"= c #DBD7D4",
+"- c #C6C6C6",
+"; c #F5F0EC",
+"> c #D3C3B4",
+", c #0C0C0A",
+"' c #060606",
+") c #A4A4A4",
+"! c #FDFBF9",
+"~ c #FCF7F3",
+"{ c #FAF4EE",
+"] c #F0EAE6",
+"^ c #D5C7BC",
+"/ c #5A5552",
+"( c #7E7873",
+"_ c #9F958D",
+": c #7D746E",
+"< c #FEFCFB",
+"[ c #FCF8F5",
+"} c #FBF5F0",
+"| c #F9F1EA",
+"1 c #F8EEE5",
+"2 c #F7EADF",
+"3 c #F5E7DA",
+"4 c #684242",
+"5 c #400000",
+"6 c #5B5959",
+"7 c #C4C0BD",
+"8 c #807C79",
+"9 c #5A5653",
+"0 c #C0B5AC",
+"a c #998778",
+"b c #7B6F65",
+"c c #7A6D62",
+"d c #936E6E",
+"e c #FBF6F2",
+"f c #FAF2EC",
+"g c #F9EFE7",
+"h c #F7EBE1",
+"i c #F6E8DC",
+"j c #F4E4D6",
+"k c #F3E0D0",
+"l c #F2DDCB",
+"m c #D1BCAA",
+"n c #0B0B0B",
+"o c #353535",
+"p c #404040",
+"q c #EAEAEA",
+"r c #E3E3E3",
+"s c #C00000",
+"t c #FF0000",
+"u c #BABABA",
+"v c #D4D4D4",
+"w c #AAAAAA",
+"x c #BDBDBD",
+"y c #B2B2B2",
+"z c #979797",
+"A c #929292",
+"B c #8B8B8B",
+"C c #898989",
+"D c #888888",
+"E c #878787",
+"F c #868686",
+"G c #7D7D7D",
+"H c #313131",
+"I c #484848",
+"J c #424242",
+"K c #676767",
+"L c #949494",
+" ",
+" ............ ",
+" +@@@@@@@@##. ",
+" +@$@%&@&%#*. ",
+" +@@@@@@@@#=. ",
+" +@%&%-@%&;>, ",
+" +@@@@@@@#;>' ",
+" +@%$&%&#$)>. ",
+" +@@@@@!~{]^. ",
+" +@$%-%/(_:>. ",
+" ..+@@<[}|123>... ",
+" .45@67890abc>54. ",
+" .4d5@efghijklm555. ",
+"n.ooooppppppppppoooo..",
+".@@@@@@@@@@@@@@@@@@@q.",
+".rst****************u.",
+".v&&&&&&&&&&&&&&&&&&w.",
+".xyyyyyyyyyyyyyyyyyyz.",
+".ABBCCDDDDDDEEEEEEEFG.",
+".HHIIH..........HIIHH.",
+" .JKKKLLLLLLLLLLKKKJ. ",
+" .................. "};
diff --git a/muse/muse/xpm/fileprintS.xpm b/muse/muse/xpm/fileprintS.xpm
new file mode 100644
index 00000000..906bb986
--- /dev/null
+++ b/muse/muse/xpm/fileprintS.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static const char * fileprintS_xpm[] = {
+"16 16 7 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #808080",
+"# c #FFFFC0",
+"$ c #FF0000",
+"% c #C0C0C0",
+" .......... ",
+" .++++++++. ",
+" .+.@.+.@#. ",
+" .++++++++. ",
+" .+.@.+#+#. ",
+" .++++++#+. ",
+" .+.@.@.@#. ",
+" .++#+#+##. ",
+" .............. ",
+".++++++++++++++.",
+".+$$%%%%%%%%%%%.",
+".+%%%%%%%%%%%%%.",
+".+%%%%%%%%%%%%%.",
+"................",
+" .@@@@@@@@@@@@. ",
+" .............. "};
diff --git a/muse/muse/xpm/filesave.png b/muse/muse/xpm/filesave.png
new file mode 100644
index 00000000..d69158ee
--- /dev/null
+++ b/muse/muse/xpm/filesave.png
Binary files differ
diff --git a/muse/muse/xpm/filesaveS.xpm b/muse/muse/xpm/filesaveS.xpm
new file mode 100644
index 00000000..6c77f6ff
--- /dev/null
+++ b/muse/muse/xpm/filesaveS.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char * filesaveS_xpm[] = {
+"16 16 9 1",
+" c None",
+". c #000000",
+"+ c #303030",
+"@ c #800080",
+"# c #0000C0",
+"$ c #FFFFFF",
+"% c #DCDCDC",
+"& c #C3C3C3",
+"* c #585858",
+"................",
+".+.@#@#@#@#@#.+.",
+".$.$$$$$$$$$$...",
+".+.$$$$$$$$$$.+.",
+".+.$@#@#@#@#$.+.",
+".+.$$$$$$$$$$.+.",
+".+.$@#@#@#@#$.+.",
+".+.$$$$$$$$$$.+.",
+".++..........++.",
+".++++++++++++++.",
+".+++........+++.",
+".++.$%$%%%&%.++.",
+".++.%+*&%&%&.++.",
+".++.$+*%&%&&.++.",
+"..+.%&%&%&&&.++.",
+" ..............."};
diff --git a/muse/muse/xpm/filesaveasS.xpm b/muse/muse/xpm/filesaveasS.xpm
new file mode 100644
index 00000000..edc233cc
--- /dev/null
+++ b/muse/muse/xpm/filesaveasS.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char *filesaveasS_xpm[]={
+"16 16 8 1",
+"d c None",
+". c #000000",
+"b c #0000c0",
+"# c #303030",
+"e c #585858",
+"a c #800080",
+"f c #c3c3c3",
+"c c #ffffff",
+"................",
+".#.ababababab.#.",
+".c.cccccccccc...",
+".#.cccccccccc.#.",
+".#.cababababc.#.",
+".#.cccccccccc.#.",
+".#.cababab......",
+".#.cccccc.c.cc..",
+".##......cc.cc..",
+".#######....cc..",
+".###.....ccccc..",
+".##.cdcd.ccccc..",
+".##.d#ef.ccccc..",
+".##.c#ed........",
+"..#.dfdfdfff.##.",
+"d..............."};
diff --git a/muse/muse/xpm/find.xpm b/muse/muse/xpm/find.xpm
new file mode 100644
index 00000000..51c83119
--- /dev/null
+++ b/muse/muse/xpm/find.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static const char*find_xpm[]={
+"22 16 6 1",
+"# c #000000",
+"c c #ffffff",
+"b c #dcdcdc",
+"a c #a0a0a4",
+"d c #dcdcdc",
+". c None",
+".......####...........",
+".....a#bccd#a.........",
+".....#ccaacc#a........",
+"....#dcaccccd#........",
+"....#cccccccc#........",
+"....#cccccccc#........",
+"....#dccccccd#........",
+"....a#cccccc#a........",
+".....a#dccd###........",
+"......a####a###.......",
+".......aaaaaa###......",
+"............aa###.....",
+".............aa###....",
+"..............aa###...",
+"...............aa#a...",
+"................aa...."};
+
diff --git a/muse/muse/xpm/flag.xpm b/muse/muse/xpm/flag.xpm
new file mode 100644
index 00000000..f8bcf244
--- /dev/null
+++ b/muse/muse/xpm/flag.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char* flag_xpm[] = {
+"22 22 3 1",
+". c None",
+"+ c #000000",
+"@ c #00FF00",
+"......................",
+"......................",
+"......................",
+"......................",
+"........++............",
+"........+@++..........",
+"........+@@@+.........",
+"........+@@@@+........",
+"........+@@@@@+.......",
+"........+@@@@+........",
+"........+@@@+.........",
+"........+@++..........",
+"........++............",
+"........+.............",
+"........+.............",
+"........+.............",
+"........+.............",
+"........+.............",
+"........+.............",
+"......................",
+"......................",
+"......................"};
diff --git a/muse/muse/xpm/flagS.xpm b/muse/muse/xpm/flagS.xpm
new file mode 100644
index 00000000..741528e1
--- /dev/null
+++ b/muse/muse/xpm/flagS.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static const char* flagS_xpm[] = {
+"8 12 3 1",
+". c None",
+"+ c #000000",
+"@ c #00FF00",
+"+.......",
+"+@+.....",
+"+@@@+...",
+"+@@@@@+.",
+"+@@@@+..",
+"+@@@+...",
+"+@+.....",
+"+.......",
+"+.......",
+"+.......",
+"+.......",
+"+......."};
+
diff --git a/muse/muse/xpm/forward.xpm b/muse/muse/xpm/forward.xpm
new file mode 100644
index 00000000..c2104314
--- /dev/null
+++ b/muse/muse/xpm/forward.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static const char*forward_xpm[]={
+"16 16 5 1",
+"# c #000000",
+"a c #ffffff",
+"c c #808080",
+"b c #c0c0c0",
+". c None",
+"................",
+"................",
+".........#......",
+".........##.....",
+".........#a#....",
+"..########aa#...",
+"..#aaaaaaabaa#..",
+"..#bbbbbbbbbaa#.",
+"..#bbbbbbbbba#..",
+"..########ba#c..",
+"..ccccccc#a#c...",
+"........c##c....",
+"........c#c.....",
+"........cc......",
+"........c.......",
+"................",
+"................"};
+
diff --git a/muse/muse/xpm/frewind.xpm b/muse/muse/xpm/frewind.xpm
new file mode 100644
index 00000000..8c11fc3a
--- /dev/null
+++ b/muse/muse/xpm/frewind.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static const char * frewind_xpm[] = {
+"17 12 2 1",
+" c None",
+". c #000000",
+" . . ",
+" ... ... ",
+" ... ... ",
+" .... .... ",
+" .... .... ",
+" ..... ..... ",
+" ..... ..... ",
+" .... .... ",
+" .... .... ",
+" ... ... ",
+" ... ... ",
+" . . "};
diff --git a/muse/muse/xpm/glue.xpm b/muse/muse/xpm/glue.xpm
new file mode 100644
index 00000000..caff2484
--- /dev/null
+++ b/muse/muse/xpm/glue.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static const char * glue_xpm[] = {
+"22 22 24 1",
+" c None",
+". c #A0A0A4",
+"+ c #8C9BBA",
+"@ c #BBC4D6",
+"# c #7C8BAA",
+"$ c #A3ACBE",
+"% c #7D8EAE",
+"& c #98A6C0",
+"* c #8895B0",
+"= c #4F6693",
+"- c #0D1628",
+"; c #7586A6",
+"> c #4A566E",
+", c #000000",
+"' c #6D7FA2",
+") c #63779D",
+"! c #9B9B9F",
+"~ c #6A7A99",
+"{ c #687B9F",
+"] c #374664",
+"^ c #424F6A",
+"/ c #5C7199",
+"( c #3B4967",
+"_ c #3E4C68",
+" ",
+" ",
+" . ",
+" . ",
+" .+. ",
+" .+.. ",
+" .@+#. ",
+" .@+#.. ",
+" .@@@$#. ",
+" .@@@@@##. ",
+" .@@@@@$%.. ",
+" .&@@@@$*#=- ",
+" .&@@@@$;#>,. ",
+" .'*@@@*;'),. ",
+" !~;$$*{')],. ",
+" ,^;{*//(,.. ",
+" ,_#))_,.. ",
+" ,,,,,.. ",
+" ..... ",
+" ",
+" ",
+" "};
diff --git a/muse/muse/xpm/graydot.xpm b/muse/muse/xpm/graydot.xpm
new file mode 100644
index 00000000..daab6980
--- /dev/null
+++ b/muse/muse/xpm/graydot.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *graydot_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 12 12 2 1",
+/* colors */
+". c none",
+"# c #aaaaaa",
+/* pixels */
+"............",
+".....##.....",
+"....####....",
+"...######...",
+"..########..",
+"..########..",
+"..########..",
+"...######...",
+"....####....",
+".....##.....",
+"............",
+"............"
+};
diff --git a/muse/muse/xpm/greendot.xpm b/muse/muse/xpm/greendot.xpm
new file mode 100644
index 00000000..704d91a4
--- /dev/null
+++ b/muse/muse/xpm/greendot.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static const char *greendot_xpm[]={
+"12 12 2 1",
+". c None",
+"# c #00ff00",
+"...#####....",
+"..#######...",
+".#########..",
+"###########.",
+"###########.",
+"###########.",
+"###########.",
+"###########.",
+".#########..",
+"..#######...",
+"...#####....",
+"............"};
+
diff --git a/muse/muse/xpm/gv.xpm b/muse/muse/xpm/gv.xpm
new file mode 100644
index 00000000..cf4a2ed1
--- /dev/null
+++ b/muse/muse/xpm/gv.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * gv_xpm[] = {
+"16 16 4 1",
+" g None",
+". g #000000",
+"+ g #FFFFFF",
+"@ g #C0C0C0",
+" ........... ",
+".+++++++++++. ",
+".+@@@@+@@@++. ",
+".+++++++++++. ",
+".+@++@...@++. ",
+".+++@.+++.@+. ",
+".+@+.++@++.+. ",
+".+++.++@@+.+. ",
+".+++.+++++.+. ",
+".+++@.+++..+. ",
+".@@+@@....+.. ",
+".@+@@@++++.+. ",
+".@@++@+++++.+. ",
+".@+@@+++++++.+. ",
+" ........... .+.",
+" . "};
diff --git a/muse/muse/xpm/home.xpm b/muse/muse/xpm/home.xpm
new file mode 100644
index 00000000..de96eea3
--- /dev/null
+++ b/muse/muse/xpm/home.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static const char *home_xpm[]={
+"16 16 4 1",
+"# c #000000",
+"a c #ffffff",
+"b c #c0c0c0",
+". c None",
+"........... ....",
+" ....##.......",
+"..#...####......",
+"..#..#aabb#.....",
+"..#.#aaaabb#....",
+"..##aaaaaabb#...",
+"..#aaaaaaaabb#..",
+".#aaaaaaaaabbb#.",
+"###aaaaaaaabb###",
+"..#aaaaaaaabb#..",
+"..#aaa###aabb#..",
+"..#aaa#.#aabb#..",
+"..#aaa#.#aabb#..",
+"..#aaa#.#aabb#..",
+"..#aaa#.#aabb#..",
+"..#####.######..",
+"................"};
+
diff --git a/muse/muse/xpm/idea.xpm b/muse/muse/xpm/idea.xpm
new file mode 100644
index 00000000..c74c48b9
--- /dev/null
+++ b/muse/muse/xpm/idea.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static const char*idea[]={
+"22 22 7 1",
+"# c #000000",
+"a c #ffa858",
+"b c #ffff00",
+"c c #ffffc0",
+"d c #ffdca8",
+"e c #ffffff",
+". c None",
+"......................",
+"......................",
+"......................",
+"......................",
+"........#####.........",
+".......#aaaab#........",
+"......#acaaabb#.......",
+".....#aaadcaaab#......",
+".....#adddcaaab#......",
+".....#addcdcaab#......",
+".....#bcc#cbabb#......",
+"......#ba#b#bb#.......",
+".......#aa#bb#........",
+"........#b#b#.........",
+"........#ee##.........",
+"........###e#.........",
+"........###e#.........",
+"........#####.........",
+".........###..........",
+"......................",
+"......................",
+"......................"};
+
diff --git a/muse/muse/xpm/iiwusynth.xpm b/muse/muse/xpm/iiwusynth.xpm
new file mode 100644
index 00000000..073e517b
--- /dev/null
+++ b/muse/muse/xpm/iiwusynth.xpm
@@ -0,0 +1,1372 @@
+/* XPM */
+static const char * iiwusynth_xpm[] = {
+"124 45 1324 2",
+" c None",
+". c #D8D8D8",
+"+ c #A7A7A7",
+"@ c #B6B6B6",
+"# c #2D2D2D",
+"$ c #161616",
+"% c #1F201C",
+"& c #6A6B56",
+"* c #797B6E",
+"= c #858D77",
+"- c #809580",
+"; c #7F9F82",
+"> c #8BA790",
+", c #96AE9D",
+"' c #A7B7B1",
+") c #C6CCC9",
+"! c #BDC4C3",
+"~ c #9FAEAC",
+"{ c #9FADAC",
+"] c #BEC4C4",
+"^ c #D3D3D3",
+"/ c #D6D6D6",
+"( c #1F1F1F",
+"_ c #000000",
+": c #020201",
+"< c #393C2A",
+"[ c #7B7D67",
+"} c #828975",
+"| c #95A58B",
+"1 c #8EAB8E",
+"2 c #91B794",
+"3 c #9AC1A3",
+"4 c #B0CDBB",
+"5 c #C1D8CC",
+"6 c #E7F0ED",
+"7 c #E9F0EF",
+"8 c #C5D5D4",
+"9 c #B8CBC9",
+"0 c #D5E0DD",
+"a c #F8FBFA",
+"b c #FEFFFF",
+"c c #FFFFFF",
+"d c #FDFDFD",
+"e c #DEE7E7",
+"f c #A5BCBA",
+"g c #ABC1BF",
+"h c #AAC1BF",
+"i c #A0BAB9",
+"j c #E0E9E8",
+"k c #FEFEFE",
+"l c #12130C",
+"m c #5C5C46",
+"n c #7A7B6F",
+"o c #86927C",
+"p c #96A68D",
+"q c #8EAA8D",
+"r c #97B69A",
+"s c #A2C3AA",
+"t c #B1CDBB",
+"u c #C2D7CD",
+"v c #E7F0EC",
+"w c #F2F5F4",
+"x c #BCCDCA",
+"y c #CADAD8",
+"z c #EEF2F2",
+"A c #FDFEFD",
+"B c #E7EEED",
+"C c #719795",
+"D c #28635E",
+"E c #487B76",
+"F c #477B75",
+"G c #25615B",
+"H c #6F9893",
+"I c #EEF3F3",
+"J c #030302",
+"K c #343423",
+"L c #777964",
+"M c #797C74",
+"N c #8F9C84",
+"O c #97A392",
+"P c #8BAC8E",
+"Q c #9CBAA2",
+"R c #A6C3AE",
+"S c #BDD2C4",
+"T c #C4D8CE",
+"U c #E9F2EE",
+"V c #FAFCFB",
+"W c #E3ECE9",
+"X c #BACDCC",
+"Y c #C3D3D1",
+"Z c #E8EFED",
+"` c #FDFEFE",
+" . c #D4E1DF",
+".. c #427771",
+"+. c #1E5B56",
+"@. c #709894",
+"#. c #6D9692",
+"$. c #1D5D55",
+"%. c #3C726C",
+"&. c #E0E7E8",
+"*. c #0E0F0B",
+"=. c #666950",
+"-. c #787972",
+";. c #7F8779",
+">. c #96A48C",
+",. c #94A193",
+"'. c #90B394",
+"). c #A4BAA7",
+"!. c #AAC7B0",
+"~. c #C3D4C8",
+"{. c #C5D9CF",
+"]. c #EEF4F0",
+"^. c #FCFDFD",
+"/. c #EAEEEF",
+"(. c #C3D3D2",
+"_. c #BDCFCD",
+":. c #E6EBEC",
+"<. c #ECF1F0",
+"[. c #7DA19D",
+"}. c #2C675F",
+"|. c #3F746F",
+"1. c #3D756E",
+"2. c #29645F",
+"3. c #7EA19E",
+"4. c #F3F6F5",
+"5. c #FAFBFB",
+"6. c #D7E2E1",
+"7. c #B4C8C7",
+"8. c #D2DEDE",
+"9. c #F2F6F5",
+"0. c #C2D2D1",
+"a. c #BDCFCE",
+"b. c #EBF0F0",
+"c. c #3F4231",
+"d. c #828570",
+"e. c #767772",
+"f. c #8A9780",
+"g. c #9BA195",
+"h. c #90A593",
+"i. c #98B69C",
+"j. c #A4BAA6",
+"k. c #B0CBB7",
+"l. c #C8D7D0",
+"m. c #C6DAD0",
+"n. c #F0F6F3",
+"o. c #F3F6F6",
+"p. c #CEDAD9",
+"q. c #B5CBC6",
+"r. c #E1E8E8",
+"s. c #FBFCFB",
+"t. c #F9FBFB",
+"u. c #DFE8E7",
+"v. c #CAD8D6",
+"w. c #9EB8B4",
+"x. c #BECFCF",
+"y. c #BCCECE",
+"z. c #9CB8B5",
+"A. c #CADAD7",
+"B. c #F0F5F4",
+"C. c #DBE5E4",
+"D. c #D5E1E0",
+"E. c #DAE4E3",
+"F. c #F7F9F9",
+"G. c #E6EDEC",
+"H. c #D6E1E0",
+"I. c #F6F8F8",
+"J. c #DBE6E4",
+"K. c #E3EBEB",
+"L. c #D8E2E2",
+"M. c #EDF2F1",
+"N. c #E5ECEB",
+"O. c #F1F5F5",
+"P. c #AAC1C0",
+"Q. c #86A6A4",
+"R. c #B8CBCA",
+"S. c #EFF3F3",
+"T. c #84A5A3",
+"U. c #175651",
+"V. c #759B98",
+"W. c #427572",
+"X. c #346B67",
+"Y. c #C0D1D0",
+"Z. c #1F2116",
+"`. c #838369",
+" + c #767673",
+".+ c #808879",
+"++ c #99A58E",
+"@+ c #979D97",
+"#+ c #8EAD90",
+"$+ c #A6B9A8",
+"%+ c #A4BEAB",
+"&+ c #BCD4C3",
+"*+ c #C5D6CD",
+"=+ c #D0E0D7",
+"-+ c #F5F7F7",
+";+ c #CFDDDA",
+">+ c #BCCDCB",
+",+ c #FAFCFC",
+"'+ c #6F9593",
+")+ c #417571",
+"!+ c #4E807A",
+"~+ c #BBCDCC",
+"{+ c #4F817A",
+"]+ c #427671",
+"^+ c #739996",
+"/+ c #BDCFCC",
+"(+ c #5A8783",
+"_+ c #568480",
+":+ c #D9E4E2",
+"<+ c #8CADA8",
+"[+ c #427571",
+"}+ c #437572",
+"|+ c #92B0AC",
+"1+ c #D5E0DF",
+"2+ c #55837F",
+"3+ c #5D8A84",
+"4+ c #C8D7D5",
+"5+ c #81A3A1",
+"6+ c #437772",
+"7+ c #4A7B77",
+"8+ c #ABC2C0",
+"9+ c #A5BEBB",
+"0+ c #467974",
+"a+ c #407570",
+"b+ c #86A6A5",
+"c+ c #F0F4F4",
+"d+ c #B1C6C4",
+"e+ c #29635F",
+"f+ c #2D6661",
+"g+ c #5C8885",
+"h+ c #1C5A55",
+"i+ c #88A8A6",
+"j+ c #F2F5F5",
+"k+ c #75775E",
+"l+ c #797873",
+"m+ c #787974",
+"n+ c #92A285",
+"o+ c #9B9D98",
+"p+ c #90A390",
+"q+ c #98B499",
+"r+ c #AEBAB1",
+"s+ c #A6C5AF",
+"t+ c #CBDAD2",
+"u+ c #BED3CA",
+"v+ c #E2ECE7",
+"w+ c #F6F9F8",
+"x+ c #CCD9D8",
+"y+ c #B8CCC9",
+"z+ c #E0EAE7",
+"A+ c #DFE7E7",
+"B+ c #4E7E7A",
+"C+ c #15574F",
+"D+ c #27625D",
+"E+ c #B2C7C4",
+"F+ c #ACC3C0",
+"G+ c #28645D",
+"H+ c #185751",
+"I+ c #53827D",
+"J+ c #AEC3C2",
+"K+ c #336C66",
+"L+ c #165650",
+"M+ c #2F6863",
+"N+ c #D1DDDC",
+"O+ c #729B94",
+"P+ c #7B9F9B",
+"Q+ c #CBD9D8",
+"R+ c #2E6762",
+"S+ c #387069",
+"T+ c #BBCECC",
+"U+ c #648E8A",
+"V+ c #185952",
+"W+ c #215D58",
+"X+ c #98B5B1",
+"Y+ c #90AFAB",
+"Z+ c #1D5A56",
+"`+ c #15564F",
+" @ c #6A948F",
+".@ c #93B0AE",
+"+@ c #437672",
+"@@ c #B7CBC9",
+"#@ c #4E7E7B",
+"$@ c #729895",
+"%@ c #E6ECEC",
+"&@ c #AFC5C3",
+"*@ c #90AEAC",
+"=@ c #A6BEBC",
+"-@ c #A9C1BE",
+";@ c #A8C0BE",
+">@ c #D2DEDD",
+",@ c #ADC3C1",
+"'@ c #C7D6D5",
+")@ c #6E9592",
+"!@ c #D5E0E0",
+"~@ c #C9D8D7",
+"{@ c #9FB9B7",
+"]@ c #F5F8F7",
+"^@ c #080806",
+"/@ c #64674C",
+"(@ c #7B7B73",
+"_@ c #737373",
+":@ c #85927C",
+"<@ c #9FA597",
+"[@ c #999B99",
+"}@ c #8DAC90",
+"|@ c #ACBAAD",
+"1@ c #ACBBB0",
+"2@ c #B8CEBD",
+"3@ c #D4DDD8",
+"4@ c #BED4CC",
+"5@ c #EDF3F2",
+"6@ c #F4F7F7",
+"7@ c #CDDBD9",
+"8@ c #B8CDCA",
+"9@ c #E8EEED",
+"0@ c #DFE7E6",
+"a@ c #4C7D78",
+"b@ c #28625E",
+"c@ c #B4C6C6",
+"d@ c #AEC2C2",
+"e@ c #29645E",
+"f@ c #54827E",
+"g@ c #AEC4C1",
+"h@ c #356B66",
+"i@ c #175551",
+"j@ c #2E6962",
+"k@ c #D0DEDC",
+"l@ c #739A95",
+"m@ c #175750",
+"n@ c #165750",
+"o@ c #7B9E9B",
+"p@ c #3A6F6B",
+"q@ c #648D8C",
+"r@ c #1A5753",
+"s@ c #205D58",
+"t@ c #98B5B2",
+"u@ c #91AFAC",
+"v@ c #6B948F",
+"w@ c #51807D",
+"x@ c #DDE6E6",
+"y@ c #DEE7E6",
+"z@ c #1C5955",
+"A@ c #497A76",
+"B@ c #A0B9B8",
+"C@ c #507F7C",
+"D@ c #4D7E7A",
+"E@ c #A2BBBA",
+"F@ c #477975",
+"G@ c #68918E",
+"H@ c #6C9491",
+"I@ c #CEDBDA",
+"J@ c #386E6A",
+"K@ c #25605C",
+"L@ c #81A3A0",
+"M@ c #F1F5F4",
+"N@ c #545842",
+"O@ c #7D7E73",
+"P@ c #737371",
+"Q@ c #7B7F76",
+"R@ c #9EAE90",
+"S@ c #9C9B9A",
+"T@ c #90A491",
+"U@ c #9DB79C",
+"V@ c #B4BAB4",
+"W@ c #A7C0AA",
+"X@ c #D1DCD3",
+"Y@ c #CAD7D3",
+"Z@ c #CFDFD7",
+"`@ c #F8FBF9",
+" # c #F3F7F6",
+".# c #C9D7D6",
+"+# c #BECECC",
+"@# c #EAEFEE",
+"## c #FEFEFF",
+"$# c #4D7D79",
+"%# c #26635B",
+"&# c #B1C7C3",
+"*# c #ABC3BF",
+"=# c #27645D",
+"-# c #175850",
+";# c #ADC4C0",
+"># c #336C65",
+",# c #D0DDDC",
+"'# c #769897",
+")# c #7A9F9B",
+"!# c #2F6763",
+"~# c #3A6F6C",
+"{# c #BBCDCD",
+"]# c #638E8A",
+"^# c #195852",
+"/# c #1E5E56",
+"(# c #98B4B2",
+"_# c #1D5B55",
+":# c #E5ECEC",
+"<# c #CEDBDB",
+"[# c #D7E2E2",
+"}# c #B4C9C7",
+"|# c #497A77",
+"1# c #85A6A3",
+"2# c #E7EDED",
+"3# c #588682",
+"4# c #457773",
+"5# c #9EB8B6",
+"6# c #4C7D79",
+"7# c #A0BAB8",
+"8# c #E0E8E7",
+"9# c #92AFAD",
+"0# c #3B706C",
+"a# c #CFDCDB",
+"b# c #010101",
+"c# c #4E503E",
+"d# c #7F8074",
+"e# c #737372",
+"f# c #747572",
+"g# c #9BAB8B",
+"h# c #9C9F98",
+"i# c #979D98",
+"j# c #8FB090",
+"k# c #B4BAB2",
+"l# c #A6BAAA",
+"m# c #B4CDB9",
+"n# c #DDE2E0",
+"o# c #C3D5CE",
+"p# c #E6EEEC",
+"q# c #F0F3F4",
+"r# c #BFD0CD",
+"s# c #C6D7D4",
+"t# c #28625D",
+"u# c #B1C8C3",
+"v# c #ADC2C1",
+"w# c #29635E",
+"x# c #52827D",
+"y# c #CAD9D7",
+"z# c #6B938F",
+"A# c #729994",
+"B# c #C4D5D3",
+"C# c #2C6661",
+"D# c #377069",
+"E# c #638D8B",
+"F# c #1A5853",
+"G# c #1F5D56",
+"H# c #8EADAA",
+"I# c #87A8A4",
+"J# c #1C5A54",
+"K# c #8FADAB",
+"L# c #A1BAB8",
+"M# c #235F5A",
+"N# c #25615C",
+"O# c #50513C",
+"P# c #808072",
+"Q# c #737272",
+"R# c #747473",
+"S# c #95A18B",
+"T# c #9DA199",
+"U# c #9A9B9A",
+"V# c #8CA98C",
+"W# c #A9B9A9",
+"X# c #B4BAB6",
+"Y# c #9FBDA6",
+"Z# c #DAE1DE",
+"`# c #D0DBD6",
+" $ c #C7DCD2",
+".$ c #F7FBF8",
+"+$ c #E8EDEC",
+"@$ c #BDCECB",
+"#$ c #D1DCDA",
+"$$ c #F9FAFA",
+"%$ c #DEE8E6",
+"&$ c #4C7E78",
+"*$ c #26635C",
+"=$ c #B3C7C5",
+"-$ c #ADC3C0",
+";$ c #B5C9C6",
+">$ c #376D69",
+",$ c #477A74",
+"'$ c #2B655F",
+")$ c #175650",
+"!$ c #2D6662",
+"~$ c #457973",
+"{$ c #1B5B54",
+"]$ c #3D716E",
+"^$ c #C7D6D7",
+"/$ c #6D9592",
+"($ c #1B5954",
+"_$ c #185752",
+":$ c #2B6660",
+"<$ c #2A645F",
+"[$ c #769C99",
+"}$ c #EBF1F0",
+"|$ c #9CB7B5",
+"1$ c #8BABA8",
+"2$ c #6A938F",
+"3$ c #195752",
+"4$ c #A7BFBD",
+"5$ c #5B8884",
+"6$ c #040403",
+"7$ c #595B45",
+"8$ c #7D7E72",
+"9$ c #737271",
+"0$ c #747373",
+"a$ c #8E9A86",
+"b$ c #9DA298",
+"c$ c #9C9A9A",
+"d$ c #92A292",
+"e$ c #9BB69D",
+"f$ c #BCBBBB",
+"g$ c #A6B8AA",
+"h$ c #BDD3C2",
+"i$ c #DEE3DF",
+"j$ c #C1D4CA",
+"k$ c #E3EDE8",
+"l$ c #DCE7E5",
+"m$ c #4E7D7A",
+"n$ c #6D9590",
+"o$ c #1A5A53",
+"p$ c #1C5B54",
+"q$ c #175751",
+"r$ c #185651",
+"s$ c #759997",
+"t$ c #F6F8F9",
+"u$ c #AEC3C3",
+"v$ c #316964",
+"w$ c #356B67",
+"x$ c #B3C8C6",
+"y$ c #7A9E9B",
+"z$ c #EBF0EF",
+"A$ c #648E8B",
+"B$ c #1D5B56",
+"C$ c #C8D7D6",
+"D$ c #356C67",
+"E$ c #5A8784",
+"F$ c #090A06",
+"G$ c #696A50",
+"H$ c #7B7B72",
+"I$ c #899481",
+"J$ c #9EA598",
+"K$ c #9C9A9B",
+"L$ c #979E96",
+"M$ c #94B395",
+"N$ c #B6BBB6",
+"O$ c #ABC7B3",
+"P$ c #DDE1DE",
+"Q$ c #CFD9D5",
+"R$ c #CCDBD3",
+"S$ c #F6F9F9",
+"T$ c #CCDBDB",
+"U$ c #BDCECE",
+"V$ c #F3F5F4",
+"W$ c #E4EBEA",
+"X$ c #68918D",
+"Y$ c #BDD0CD",
+"Z$ c #B9CCCA",
+"`$ c #3A706C",
+" % c #6C9591",
+".% c #E1E9E8",
+"+% c #D7E3E0",
+"@% c #709794",
+"#% c #3E726D",
+"$% c #316965",
+"%% c #447872",
+"&% c #80A2A0",
+"*% c #7FA19F",
+"=% c #427672",
+"-% c #3E736E",
+";% c #719993",
+">% c #DBE5E3",
+",% c #9DB7B4",
+"'% c #4D7E79",
+")% c #A2BBB9",
+"!% c #8AAAA7",
+"~% c #628D8A",
+"{% c #5F8B87",
+"]% c #618C88",
+"^% c #92B0AD",
+"/% c #EAF0F0",
+"(% c #BFD0CF",
+"_% c #6E9693",
+":% c #E3EBEA",
+"<% c #82A4A1",
+"[% c #BECFCE",
+"}% c #7DA09E",
+"|% c #69928F",
+"1% c #E0E8E8",
+"2% c #96B2B0",
+"3% c #BCCECD",
+"4% c #8DACA9",
+"5% c #E4EBEB",
+"6% c #789D9A",
+"7% c #0F0F0B",
+"8% c #77795C",
+"9% c #797872",
+"0% c #87907F",
+"a% c #9EA696",
+"b% c #9A9B99",
+"c% c #91AF92",
+"d% c #B0BBB0",
+"e% c #BBBABA",
+"f% c #A5BFAB",
+"g% c #D0DCD2",
+"h% c #DFE2E0",
+"i% c #BCD1C6",
+"j% c #EFF6F3",
+"k% c #BDCFCB",
+"l% c #D0DEDB",
+"m% c #F9FAFB",
+"n% c #F8FAFA",
+"o% c #D1DDDD",
+"p% c #EEF3F2",
+"q% c #D1DEDD",
+"r% c #D9E5E3",
+"s% c #F7FAF9",
+"t% c #BACBCB",
+"u% c #BACCCB",
+"v% c #F8FAF9",
+"w% c #D9E3E2",
+"x% c #C0D1CF",
+"y% c #C1D1D0",
+"z% c #DCE5E5",
+"A% c #E9EFEE",
+"B% c #E8EEEE",
+"C% c #E2EAE9",
+"D% c #588582",
+"E% c #ECF1F1",
+"F% c #EDF2F2",
+"G% c #FBFCFC",
+"H% c #EAEFEF",
+"I% c #F4F7F6",
+"J% c #24261D",
+"K% c #82866C",
+"L% c #757572",
+"M% c #737172",
+"N% c #747370",
+"O% c #8B9080",
+"P% c #9C9B9B",
+"Q% c #90AC90",
+"R% c #ADBAAC",
+"S% c #BCBABB",
+"T% c #A8BBAC",
+"U% c #C0D3C4",
+"V% c #E7E6E4",
+"W% c #C7D6CF",
+"X% c #D4E4DC",
+"Y% c #B7CAC8",
+"Z% c #E1EAE9",
+"`% c #FDFDFE",
+" & c #8AA9A7",
+".& c #B4C8C6",
+"+& c #225E59",
+"@& c #4B4E3A",
+"#& c #808173",
+"$& c #747273",
+"%& c #8C9782",
+"&& c #9DA496",
+"*& c #9B9B9A",
+"=& c #92A992",
+"-& c #BBBBBB",
+";& c #ADB9B0",
+">& c #B4CBB8",
+",& c #E3E5E2",
+"'& c #DCE0DF",
+")& c #C3D7CD",
+"!& c #F4F8F6",
+"~& c #C4D4D3",
+"{& c #DDE6E5",
+"]& c #779C99",
+"^& c #A9C0BE",
+"/& c #578581",
+"(& c #12130E",
+"_& c #696C53",
+":& c #787871",
+"<& c #747372",
+"[& c #909D84",
+"}& c #9DA297",
+"|& c #9B9A9A",
+"1& c #92A892",
+"2& c #A7B8A7",
+"3& c #BBBBBA",
+"4& c #B3B9B4",
+"5& c #ACC5B1",
+"6& c #DDE2DC",
+"7& c #E4E5E5",
+"8& c #C3D5CD",
+"9& c #E8EFEB",
+"0& c #E2EBEA",
+"a& c #B9CDCB",
+"b& c #E9EEEE",
+"c& c #030402",
+"d& c #373928",
+"e& c #787968",
+"f& c #96A48B",
+"g& c #9DA098",
+"h& c #9B9A99",
+"i& c #94A595",
+"j& c #A4B9A5",
+"k& c #BBBCB7",
+"l& c #B5BAB6",
+"m& c #A6C0AC",
+"n& c #D6DED6",
+"o& c #E6E6E7",
+"p& c #CBD8D2",
+"q& c #DAE6E1",
+"r& c #CCDAD9",
+"s& c #C1D3D0",
+"t& c #181910",
+"u& c #65664E",
+"v& c #797870",
+"w& c #737273",
+"x& c #777775",
+"y& c #9DAC8E",
+"z& c #9C9D9A",
+"A& c #9C9A9C",
+"B& c #9B9A9B",
+"C& c #93A595",
+"D& c #A2B9A4",
+"E& c #B8BAB9",
+"F& c #A4BDAA",
+"G& c #CFDAD0",
+"H& c #E7E6E6",
+"I& c #D2DBD7",
+"J& c #D0DFD8",
+"K& c #F9FBFA",
+"L& c #B7CCC9",
+"M& c #DCE7E2",
+"N& c #FDFEF8",
+"O& c #FEFFF9",
+"P& c #FFFFF9",
+"Q& c #040503",
+"R& c #484B34",
+"S& c #7D7D69",
+"T& c #757471",
+"U& c #82877C",
+"V& c #9DAD92",
+"W& c #92A793",
+"X& c #A6BAA7",
+"Y& c #BBBCBA",
+"Z& c #B9BBB8",
+"`& c #A5BBAA",
+" * c #CCD9CF",
+".* c #E8E7E8",
+"+* c #D8DEDB",
+"@* c #C9DAD4",
+"#* c #F4F8F7",
+"$* c #FBFBFB",
+"%* c #CAD8D3",
+"&* c #BFD4AF",
+"** c #F2FAB5",
+"=* c #F9FFB6",
+"-* c #F8FFB7",
+";* c #F9FFB7",
+">* c #F8FFB6",
+",* c #FAFFB6",
+"'* c #F8FFB5",
+")* c #F9FFB5",
+"!* c #FAFFB7",
+"~* c #010000",
+"{* c #252416",
+"]* c #78795F",
+"^* c #787771",
+"/* c #737270",
+"(* c #747472",
+"_* c #8C9A81",
+":* c #9DA597",
+"<* c #9B9B99",
+"[* c #91A992",
+"}* c #AAB9A9",
+"|* c #BDBBBB",
+"1* c #B9BAB9",
+"2* c #A3B9A9",
+"3* c #C5D6CB",
+"4* c #E7E7E8",
+"5* c #C5D7CE",
+"6* c #F0F5F3",
+"7* c #FEFFFE",
+"8* c #E4ECE8",
+"9* c #B3CC9E",
+"0* c #DEED7B",
+"a* c #F6FF7D",
+"b* c #F3FF7D",
+"c* c #F5FF7D",
+"d* c #F3FF7C",
+"e* c #F4FF7D",
+"f* c #F4FF7C",
+"g* c #F5FF7C",
+"h* c #F5FF7E",
+"i* c #F3FF7E",
+"j* c #F4FF7E",
+"k* c #F2FF7D",
+"l* c #F4FF7F",
+"m* c #F6FF7E",
+"n* c #F2FF7C",
+"o* c #030202",
+"p* c #232418",
+"q* c #6C6F51",
+"r* c #777771",
+"s* c #97A787",
+"t* c #9C9C9B",
+"u* c #90AB91",
+"v* c #AEB9AD",
+"w* c #BABBBA",
+"x* c #BBBBB9",
+"y* c #A5BAA7",
+"z* c #C4D5C6",
+"A* c #E7E6E5",
+"B* c #E0E2E2",
+"C* c #C2D4CB",
+"D* c #EBF2EF",
+"E* c #F8F9FA",
+"F* c #C0D3C1",
+"G* c #C7DA80",
+"H* c #F0FC7C",
+"I* c #F6FF7C",
+"J* c #F5FF7F",
+"K* c #F4FF7B",
+"L* c #F3FF7F",
+"M* c #272519",
+"N* c #66654D",
+"O* c #7A796E",
+"P* c #757473",
+"Q* c #87917D",
+"R* c #9AA591",
+"S* c #999C98",
+"T* c #8FAF93",
+"U* c #BABABA",
+"V* c #A5B9A8",
+"W* c #C2D4C6",
+"X* c #E6E7E5",
+"Y* c #E3E5E4",
+"Z* c #C1D2CB",
+"`* c #E9F0ED",
+" = c #D7E3DA",
+".= c #B9D089",
+"+= c #E6F37B",
+"@= c #070705",
+"#= c #333323",
+"$= c #66674F",
+"%= c #78786B",
+"&= c #7A7D77",
+"*= c #93A187",
+"== c #9DA097",
+"-= c #969E97",
+";= c #94B497",
+">= c #B8BBB8",
+",= c #BCBBBA",
+"'= c #A4B9A8",
+")= c #C6D4C9",
+"!= c #E4E5E4",
+"~= c #C2D3CB",
+"{= c #E6EEEB",
+"]= c #EDF3F0",
+"^= c #B9CFA6",
+"/= c #D6E77C",
+"(= c #F3FD7D",
+"_= c #F3FF7B",
+":= c #11130B",
+"<= c #3D3F29",
+"[= c #72715B",
+"}= c #76766E",
+"|= c #747371",
+"1= c #86907E",
+"2= c #9BA791",
+"3= c #9C9D9B",
+"4= c #9DB79D",
+"5= c #B8BBB7",
+"6= c #A4BAAA",
+"7= c #CAD8CE",
+"8= c #E7E7E7",
+"9= c #E6E5E5",
+"0= c #C6D4CD",
+"a= c #DDEAE5",
+"b= c #C4D7BD",
+"c= c #C6DB81",
+"d= c #EFFA7C",
+"e= c #272724",
+"f= c #17160E",
+"g= c #3D3C28",
+"h= c #636448",
+"i= c #717365",
+"j= c #747471",
+"k= c #7F8377",
+"l= c #96A58B",
+"m= c #9CA098",
+"n= c #9A9C9A",
+"o= c #8CAA8D",
+"p= c #ABB9AB",
+"q= c #B7BAB8",
+"r= c #A3BDA8",
+"s= c #CFDAD2",
+"t= c #E9E7E6",
+"u= c #E5E6E4",
+"v= c #C4D4CB",
+"w= c #DDE7E2",
+"x= c #D9E4DA",
+"y= c #B9CF92",
+"z= c #E6F57C",
+"A= c #5D5E45",
+"B= c #6F714A",
+"C= c #838663",
+"D= c #858671",
+"E= c #848475",
+"F= c #848473",
+"G= c #848474",
+"H= c #848573",
+"I= c #848574",
+"J= c #868872",
+"K= c #9EAA81",
+"L= c #A8B292",
+"M= c #A7A898",
+"N= c #A8A697",
+"O= c #A8A896",
+"P= c #A8A798",
+"Q= c #A0AA91",
+"R= c #99BA8E",
+"S= c #BEC3AF",
+"T= c #C4C3B4",
+"U= c #C4C4B3",
+"V= c #BDC3AF",
+"W= c #ABC7A1",
+"X= c #D6E1C7",
+"Y= c #E9EAD9",
+"Z= c #E6E8D8",
+"`= c #C2D5C0",
+" - c #D5E7CD",
+".- c #FCFFED",
+"+- c #FDFFEE",
+"@- c #FEFFEE",
+"#- c #FDFEED",
+"$- c #E5EDD8",
+"%- c #B6CC96",
+"&- c #E0EF7B",
+"*- c #F5FF7B",
+"=- c #767764",
+"-- c #86876E",
+";- c #878873",
+">- c #878875",
+",- c #878874",
+"'- c #8C9076",
+")- c #9CA87F",
+"!- c #ABB490",
+"~- c #A9AB96",
+"{- c #A9A997",
+"]- c #AAA995",
+"^- c #AAAA96",
+"/- c #AAAA95",
+"(- c #9DB58A",
+"_- c #A7C299",
+":- c #C3C5B1",
+"<- c #C6C5B2",
+"[- c #C5C5B2",
+"}- c #BBC3AA",
+"|- c #AECCA1",
+"1- c #DBE5CA",
+"2- c #EAEAD8",
+"3- c #E6E9D5",
+"4- c #C1D6BD",
+"5- c #DBEAD0",
+"6- c #FCFFEA",
+"7- c #FDFFEB",
+"8- c #FEFFEB",
+"9- c #EFF4E0",
+"0- c #B8CFAF",
+"a- c #BBE17E",
+"b- c #CEF87A",
+"c- c #CCF979",
+"d- c #CEF979",
+"e- c #CCFA79",
+"f- c #CDFA79",
+"g- c #CBFA78",
+"h- c #CEFA79",
+"i- c #CFF97B",
+"j- c #CEF97A",
+"k- c #CDF97A",
+"l- c #CDF979",
+"m- c #CFF97A",
+"n- c #CCFA78",
+"o- c #CDFA7A",
+"p- c #CDFA78",
+"q- c #CCFA77",
+"r- c #CEFA7A",
+"s- c #CDF978",
+"t- c #CEF978",
+"u- c #CCF978",
+"v- c #CEFA78",
+"w- c #CFF979",
+"x- c #CEFA7B",
+"y- c #6B6A6A",
+"z- c #787874",
+"A- c #8A937F",
+"B- c #9BA78E",
+"C- c #9D9D99",
+"D- c #9D9C9B",
+"E- c #9D9B9A",
+"F- c #9D9A9B",
+"G- c #9D9B9C",
+"H- c #999E96",
+"I- c #90AF8F",
+"J- c #B1BAB0",
+"K- c #BCBCBA",
+"L- c #BBBCB9",
+"M- c #ABB9AE",
+"N- c #B1C9B5",
+"O- c #E3E4E2",
+"P- c #E8E8E6",
+"Q- c #E5E4E3",
+"R- c #C3D2CB",
+"S- c #FFFFFE",
+"T- c #F7F9F8",
+"U- c #C2D7C9",
+"V- c #97D37E",
+"W- c #B0F577",
+"X- c #B0F576",
+"Y- c #B1F577",
+"Z- c #AFF575",
+"`- c #B0F676",
+" ; c #B1F576",
+".; c #AFF675",
+"+; c #AFF576",
+"@; c #B0F677",
+"#; c #B2F478",
+"$; c #AFF574",
+"%; c #B1F677",
+"&; c #B1F477",
+"*; c #6A6969",
+"=; c #767875",
+"-; c #8A947D",
+";; c #9BA58F",
+">; c #9D9E99",
+",; c #90A490",
+"'; c #9CB69C",
+"); c #BABBB9",
+"!; c #A4B9AB",
+"~; c #BDD1C2",
+"{; c #E6E6E5",
+"]; c #E1E3E3",
+"^; c #C1D2CA",
+"/; c #FBFDFD",
+"(; c #D0E0DB",
+"_; c #92CA87",
+":; c #AEF376",
+"<; c #AFF476",
+"[; c #B0F477",
+"}; c #AEF575",
+"|; c #AEF675",
+"1; c #AFF676",
+"2; c #6A6A6A",
+"3; c #797E76",
+"4; c #8A9682",
+"5; c #9BA78F",
+"6; c #9C9E9A",
+"7; c #9C999C",
+"8; c #969F95",
+"9; c #8FAF90",
+"0; c #AEBAAE",
+"a; c #BCBBBC",
+"b; c #B9BABA",
+"c; c #9FBDA8",
+"d; c #CED9D2",
+"e; c #E8E7E7",
+"f; c #E7E7E6",
+"g; c #E0E3E1",
+"h; c #C1D5CC",
+"i; c #ECF3EF",
+"j; c #DDE7E6",
+"k; c #9DC79A",
+"l; c #A7ED75",
+"m; c #ADF574",
+"n; c #6A6A68",
+"o; c #737173",
+"p; c #7D8377",
+"q; c #919F84",
+"r; c #9BA592",
+"s; c #9C9C99",
+"t; c #8EA693",
+"u; c #9EB79F",
+"v; c #B8BBB6",
+"w; c #BCBABC",
+"x; c #B5BAB5",
+"y; c #A1C3AB",
+"z; c #DCE1DC",
+"A; c #E7E8E6",
+"B; c #DEE1DF",
+"C; c #C5D7CD",
+"D; c #F0F5F2",
+"E; c #E6EEED",
+"F; c #A0C9A3",
+"G; c #A2E774",
+"H; c #B1F478",
+"I; c #AEF576",
+"J; c #B1F578",
+"K; c #AEF674",
+"L; c #6A6A69",
+"M; c #737370",
+"N; c #757674",
+"O; c #7B8075",
+"P; c #8D9A81",
+"Q; c #99A68E",
+"R; c #9B9B9B",
+"S; c #93A193",
+"T; c #94B597",
+"U; c #B4BAB3",
+"V; c #BDBBBA",
+"W; c #BDBBBC",
+"X; c #A1B8A4",
+"Y; c #BCD1C2",
+"Z; c #E5E7E5",
+"`; c #D5DDD8",
+" > c #CBDCD2",
+".> c #F6F9F7",
+"+> c #EEF4F3",
+"@> c #A6CBAA",
+"#> c #9BE170",
+"$> c #6B6C6A",
+"%> c #777A73",
+"&> c #7F8676",
+"*> c #8A967F",
+"=> c #94A18A",
+"-> c #9CA395",
+";> c #9C9D99",
+">> c #9C999B",
+",> c #949F94",
+"'> c #8CAD8F",
+")> c #AFBAAE",
+"!> c #9ABAA0",
+"~> c #D8DED8",
+"{> c #E8E7E6",
+"]> c #E9E7E7",
+"^> c #E8E6E5",
+"/> c #CFDAD5",
+"(> c #D1E0D9",
+"_> c #AFCDB6",
+":> c #9ADE73",
+"<> c #7C8771",
+"[> c #93A682",
+"}> c #99AB89",
+"|> c #9DAB90",
+"1> c #9EA796",
+"2> c #9EA497",
+"3> c #9EA496",
+"4> c #9EA397",
+"5> c #98A693",
+"6> c #8CB289",
+"7> c #A2BD9D",
+"8> c #BAC1B3",
+"9> c #BBC1B4",
+"0> c #BAC1B2",
+"a> c #B9C1B2",
+"b> c #A3BEA1",
+"c> c #A9CAA7",
+"d> c #E0E8DA",
+"e> c #E2E9DB",
+"f> c #DFE7D8",
+"g> c #C1D7C7",
+"h> c #D1E6D4",
+"i> c #F4FCEF",
+"j> c #F6FEF0",
+"k> c #F7FEF1",
+"l> c #F7FEF0",
+"m> c #F1FAEC",
+"n> c #B2CEB9",
+"o> c #99DA77",
+"p> c #87937C",
+"q> c #9FB190",
+"r> c #9FB08F",
+"s> c #9FAE92",
+"t> c #A1AD94",
+"u> c #A0AE93",
+"v> c #A0AE92",
+"w> c #A1AE93",
+"x> c #9BB08F",
+"y> c #8EBB86",
+"z> c #9BC594",
+"A> c #B5C7A9",
+"B> c #B9C8AD",
+"C> c #B9C8AC",
+"D> c #B9C7AC",
+"E> c #B0C7A3",
+"F> c #9AC996",
+"G> c #C1DFB8",
+"H> c #DCEACE",
+"I> c #DBEACE",
+"J> c #D6E7C8",
+"K> c #B0D4B6",
+"L> c #D7EED1",
+"M> c #EDFDE1",
+"N> c #ECFDDF",
+"O> c #EEFDE2",
+"P> c #EEFCE1",
+"Q> c #EDFDE0",
+"R> c #EDFCE0",
+"S> c #ECFDE0",
+"T> c #ECFCDF",
+"U> c #AACDB0",
+"V> c #64CA5E",
+"W> c #74E35E",
+"X> c #77E55F",
+"Y> c #76E55F",
+"Z> c #75E55D",
+"`> c #77E45E",
+" , c #76E45E",
+"., c #76E55E",
+"+, c #75E45E",
+"@, c #76E460",
+"#, c #77E460",
+"$, c #76E45F",
+"%, c #76E560",
+"&, c #75E45F",
+"*, c #77E45F",
+"=, c #75E55E",
+"-, c #75E65D",
+";, c #77E65F",
+">, c #75E460",
+",, c #74E55B",
+"', c #75E55F",
+"), c #76E45D",
+"!, c #76E55D",
+"~, c #75E55C",
+"{, c #74E55D",
+"], c #77E560",
+"^, c #858384",
+"/, c #969E95",
+"(, c #8EAC8E",
+"_, c #9FB9A0",
+":, c #B9BBB9",
+"<, c #A7BAA9",
+"[, c #B4CBBA",
+"}, c #E1E4E2",
+"|, c #E9E7E9",
+"1, c #D7DDD9",
+"2, c #C4D9CF",
+"3, c #ACCDBC",
+"4, c #34BB49",
+"5, c #39D146",
+"6, c #39D347",
+"7, c #39D344",
+"8, c #39D345",
+"9, c #39D247",
+"0, c #39D346",
+"a, c #39D245",
+"b, c #39D446",
+"c, c #39D444",
+"d, c #39D246",
+"e, c #39D445",
+"f, c #858483",
+"g, c #9A9A9A",
+"h, c #92A092",
+"i, c #8CAD91",
+"j, c #A2B9A3",
+"k, c #B8BBB9",
+"l, c #BDBABC",
+"m, c #B1B9B3",
+"n, c #A2BFA9",
+"o, c #D1DBD4",
+"p, c #E6E6E6",
+"q, c #C3D5CB",
+"r, c #DAE8DF",
+"s, c #32BB48",
+"t, c #39D145",
+"u, c #39D348",
+"v, c #858484",
+"w, c #9C9B99",
+"x, c #91A491",
+"y, c #90AF91",
+"z, c #A6B7A8",
+"A, c #B8BAB7",
+"B, c #9EBAA4",
+"C, c #BBD0C1",
+"D, c #E9E6E6",
+"E, c #BCD2C7",
+"F, c #F4F7F5",
+"G, c #ADCCBC",
+"H, c #32BA48",
+"I, c #8CAB8E",
+"J, c #B2BAB1",
+"K, c #BABBB8",
+"L, c #BABCBA",
+"M, c #A4B8A8",
+"N, c #ACC8B2",
+"O, c #E5E6E5",
+"P, c #CFE0D7",
+"Q, c #39D147",
+"R, c #39D248",
+"S, c #858485",
+"T, c #93A195",
+"U, c #8FA890",
+"V, c #92B295",
+"W, c #A8B9A7",
+"X, c #B8BAB8",
+"Y, c #AAB9AE",
+"Z, c #A5C1AD",
+"`, c #D7DDD8",
+" ' c #DCE1DD",
+".' c #BDD3C9",
+"+' c #E8F1ED",
+"@' c #34BC47",
+"#' c #999C99",
+"$' c #959F96",
+"%' c #8EAB8F",
+"&' c #94B398",
+"*' c #A4B8A6",
+"=' c #BCBBB9",
+"-' c #ABB8AE",
+";' c #A1BEAA",
+">' c #CBD8CF",
+",' c #E6E5E6",
+"'' c #CBD8D0",
+")' c #CDDFD6",
+"!' c #F7FAFA",
+"~' c #AAC9B9",
+"{' c #33BF47",
+"]' c #39D244",
+"^' c #7B8B7B",
+"/' c #88AC8A",
+"(' c #8FB290",
+"_' c #9EB69F",
+":' c #AAB9AB",
+"<' c #B7BAB7",
+"[' c #B2B9B2",
+"}' c #99BCA1",
+"|' c #C3D4C7",
+"1' c #E5E5E3",
+"2' c #E8E8E7",
+"3' c #DAE0DE",
+"4' c #C1D4CD",
+"5' c #F4F6F7",
+"6' c #A5C9B8",
+"7' c #33C147",
+". + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ",
+"@ # $ $ $ $ $ $ $ % & * = - ; > , ' ) ! ~ { ] ^ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ",
+"@ ( _ _ _ _ _ _ _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c c c c c c c c c c c c c c c c c d e f g h i j k c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ l m n o p q r s t u v w 0 x y z A c c c c c c c c c c c c c c c c B C D E F G H I c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ J K L M N O P Q R S T U V W X Y Z ` c c c c c c c c c c c c c c c ...+.@.#.$.%.&.c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ *.=.-.;.>.,.'.).!.~.{.].^./.(._.:.` c c c c c c c c c c c c c c <.[.}.|.1.2.3.4.c c c c c c c c c c c c c c c c c c c c c c c c c c c c ^.5.5.5.5.k c c c c c c c c c c c c c c c c c c c 6.7.7.8.c c c 9.0.7.a.b.c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ c.d.e.f.g.h.i.j.k.l.m.n.c o.p.q.r.s.c c c c c c c c c c c c t.u.v.w.x.y.z.A.j B.C.D.E.F.G.H.H.B I.E.H.J.o.K.H.L.M.<.6.D.N.^.c c c c O.P.Q.Q.Q.Q.R.S.c c c c c c c c c c c c c c c c c c T.U.U.V.c c c L.W.U.X.Y.c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ Z.`. +.+++@+#+$+%+&+*+=+d c -+;+>+e ,+c c c c c c c c c c c N.'+)+!+Y.~+{+]+^+/+(+)+_+:+<+[+}+|+1+2+[+3+4+5+6+7+8+9+0+a+b+c+c c c d d+e+U.f+g+U.h+i+j+c c c c c c c c c c c c c c c c c T.U.U.V.c c c L.W.U.X.Y.c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ *.k+l+m+n+o+p+q+r+s+t+u+v+` c w+x+y+z+b c c c c c c c c c c A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+U.U.P+Q+R+L+S+T+U+V+W+X+Y+Z+`+ @M.c c c 5..@U.U.+@@@#@#@$@%@&@*@*@=@N+*@*@-@S.;@*@*@>@,@'@V c T.U.U.)@!@~@j+L.W.U.X.h {@Y ]@c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ ^@/@(@_@:@<@[@}@|@1@2@3@4@5@c c 6@7@8@9@` c c c c c c c c c 0@a@L+b@c@d@e@H+f@g@h@i@j@k@l@m@n@o@Q+R+C+p@~+q@r@s@t@u@Z+`+v@M.c c c c 8.w@M+_+O.x@y@<.` g+z@z@A@B@z@z@C@y@D@z@z@E@F@W+G@^.T.U.U.H@I@Y.S.L.W.U.X..@J@K@L@M@c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ J N@O@P@Q@R@S@T@U@V@W@X@Y@Z@`@c c #.#+#@###c c c c c c c c 0@$#L+%#&#*#=#-#I+;#>#L+M+,#'#m@n@)#Q+!#U.~#{#]#^#/#(#u@_#L+v@M.c c c c c :#<#[#}#F@|#1#2#3#U.U.4#5#U.U.6#x@7+U.U.7#W.U.D 8#T.U.U.V.c c c L.W.U.X.9#X.U.0#a#c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#k c c q#r#s#6@c c c c c c c c 0@a@L+t#u#v#w#H+x#J+K+i@R+y#z#U.U.A#B#C#L+D#{#E#F#G#H#I#J#L+v@M.c c c 9.V.V.V.K#L#U.U.M#7#3#U.U.4#5#U.U.6#x@7+U.U.7#W.U.N#~@T.U.U.V.c L.y@L.W.U.X.9#X.U.0#a#c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ b#O#P#Q#R#S#T#U#V#W#X#Y#Z#`# $.$c c k +$@$#$$$c c c c c c c %$&$L+*$=$-$G+H+x#;$>$L+J#,$'$L+)$!$~${$L+]$^$/$($_$:$<$m@n@[$O.c c c }$D+U.U.)+|$U.U.U.1$2$3$U.4#5#U.U.6#x@7+U.U.7#W.U.N#~@4$D+U.V.Q+F@5$R.W.U.X.9#X.U.0#a#c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ 6$7$8$9$0$a$b$c$d$e$f$g$h$i$j$k$c c c A l$@@e c c c c c c c A+m$L+b@=$,@e@3$I+1+n$o$U.L+n@_#p$q$`+r$J#s$t$u$v$m@C+L+q$w$x$A c c c I.y$s@U.U.U.U.U.D+;@!@0#U.4#5#U.U.6#x@7+U.U.7#W.U.N#~@z$A$B$^+C$D$E$~+W.U.X.9#X.U.0#a#c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ F$G$H$Q#_@I$J$K$L$M$N$X#O$P$Q$R$^.c c c S$T$U$V$c c c c c c W$X$S+F@Y$Z$|#`$ %.%+%@%#%$%%%&%*%=%$%-%;%>%c j+,%'%K+K+f@)%c+c c c c c :#!%~%{%{%{%]%^%/%c (%_%*%4$U.U.6#:%<%{%{%[%}%{%|%E.c 1%!%2%3%4%I@5%}%{%^+7.^+{%6%y@c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ 7%8%9%9$_@0%a%S@b%c%d%e%f%g%h%i%j%c c c ##I k%l%m%c c c c c n%:+I@o%p%M.q%I@r%s%` b.v.t%N+o.9.a#u%~@<.k c c v%w%x%y%z%v%c c c c c c c F.A%2#2#2#B%t.c c C%M@<.R.U.U.D%c+E%2#2#]@}$2#B%t.c c ,+F%M.]@c G%}$2#H%I%H%2#b.5.c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ _ J%K%L%M%N%O%<@P%U#Q%R%S%T%U%V%W%X%k c c c k .%Y%Z%` c c c c c c c c c c c c c c c c k `%c c c c `%k c c c c c c k k c c c c c c c c c c c c c c c c c c &.&j+u%_$+&=@^.c c c c c c c c c c c c c c c c c c c c c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ : @&#&Q#Q#$&%&&&P%*&=&W#-&;&>&,&'&)&!&c c c c G%B#~&6@c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c {&]&^&y%/&{@S.c c c c c c c c c c c c c c c c c c c c c c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ _ (&_&:&Q#Q#<&[&}&K$|&1&2&3&4&5&6&7&8&9&c c c c k 0&a&{&` c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c F.b&M@:#c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ c&d&e&<&9$9$<&f&g&c$h&i&j&k&l&m&n&o&p&q&^.c c c c F.r&s&t$c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c ",
+"@ ( _ _ _ _ _ _ _ _ t&u&v&Q#w&w&x&y&z&A&B&C&D&3&E&F&G&H&I&J&K&c c c c c A%L&M&N&O&O&O&P&O&O&O&O&P&O&O&P&P&O&O&P&P&O&O&P&O&P&P&O&P&P&P&P&O&O&P&O&O&O&O&O&O&O&O&O&O&P&P&P&O&P&O&P&O&P&P&O&P&O&P&P&O&O&P&P&O&P&O&P&O&P&P&P&O&P&P&O&P&P&O&O&P&P&O&O&O&O&O&O&",
+"@ ( _ _ _ _ _ _ _ Q&R&S&T&9$Q#Q#U&V&P%K$*&W&X&Y&Z&`& *.*+*@*#*c c c c c $*%*&***=*-*;*;*>*>*=*;*,*>*-*=*;*=*>*;*;*;*;*;*'*=*;*>*;*;*,*=*=*)*;*-*=*=*>*;*=*-*;*;*>*;*=*;*-*;*=*=*-*,*;*>*;*-*;*,*;*-*;*=*>*;*-*=*=*=*;*;*=*;*!*=*-*,*;*;*,*;*=*;*=*=*=*-*",
+"@ ( _ _ _ _ _ _ ~*{*]*^*/*w&w&(*_*:*A&K$<*[*}*|*1*2*3*4*P$5*6*c c c c c 7*8*9*0*a*b*c*d*d*e*f*c*f*b*e*c*e*c*d*g*h*i*j*k*c*e*g*b*l*b*m*e*e*h*b*e*d*h*c*i*h*b*f*d*i*c*h*h*j*i*f*b*f*h*e*b*e*e*e*n*b*b*c*c*e*h*i*c*b*e*e*h*j*i*h*f*j*f*j*i*e*e*e*g*f*g*f*b*",
+"@ ( _ _ _ _ _ o*p*q*r*Q#w&9$9$Q@s*t*c$K$b%u*v*w*x*y*z*A*B*C*D*c c c c c c E*F*G*H*b*d*h*c*I*J*b*e*h*d*f*k*g*c*b*b*f*I*K*e*i*i*j*e*c*e*d*c*e*f*h*h*e*d*e*e*e*h*j*f*e*n*f*d*d*c*f*j*e*d*h*j*f*e*h*h*h*n*h*f*f*g*e*i*c*g*i*f*f*e*b*k*h*f*g*g*k*L*b*J*e*e*h*",
+"@ ( _ _ _ _ 6$M*N*O*9$9$Q#Q#P*Q*R*K$K$K$S*T*k#3&U*V*W*X*Y*Z*`*c c c c c c c =.=+=e*e*e*b*g*c*e*e*e*e*e*h*d*e*j*c*b*e*e*c*e*f*h*b*e*d*j*e*e*k*c*e*f*c*g*c*i*f*f*b*h*f*h*e*f*e*b*i*h*e*e*d*c*d*g*e*e*c*g*b*e*b*b*e*i*h*f*e*b*j*g*h*f*j*e*e*g*e*f*c*e*e*e*",
+"@ ( _ _ _ @=#=$=%=<&9$Q#Q#9$&=*===c$c$K$-=;=>=,=1*'=)=H&!=~={=c c c c c c c ]=^=/=(=c*c*e*_=c*n*l*f*e*h*e*e*c*e*e*e*b*e*e*e*f*c*b*e*e*c*c*f*j*e*j*f*j*f*e*f*e*c*e*h*b*j*b*e*h*e*b*e*d*e*b*c*j*e*e*e*i*e*b*e*j*e*e*e*i*f*e*e*h*e*e*e*e*f*e*e*e*e*j*d*b*c*",
+"@ ( _ b#:=<=[=}=|=9$w&9$w&(*1=2=3=c$A&K$p+4=f$f$5=6=7=8=9=0=a=b c c c c c c v%b=c=d=b*e*j*d*b*K*h*f*e*f*K*c*f*a*k*g*c*f*c*j*e*f*e*e*h*n*c*e*g*k*e*d*e*e*f*h*j*j*h*e*f*e*f*e*e*j*e*d*e*e*f*c*e*c*f*e*c*d*h*g*c*c*c*b*g*e*f*e*b*i*f*b*e*e*K*e*d*j*e*f*c*g*",
+"@ e=f=g=h=i=j=9$M%M%/*M%Q#k=l=m=c$c$K$n=o=p=-&,=q=r=s=t=u=v=w=b c c c c c c ` x=y=z=c*c*e*f*f*i*h*e*b*i*J*k*i*b*g*e*g*b*h*d*e*l*i*h*g*j*d*i*e*e*h*f*j*f*f*b*c*f*d*j*e*j*J*b*f*j*e*h*b*h*f*b*f*b*h*f*j*f*d*i*b*b*d*j*b*e*j*h*j*g*g*h*g*c*b*h*e*c*g*j*e*e*",
+"@ A=B=C=D=E=F=G=H=I=G=H=J=K=L=M=N=O=P=Q=R=S=T=U=V=W=X=Y=Z=`= -.-+-+-+-@-@-+-#-$-%-&-f*i*f*e*i*i*h*d*c*f*c*e*e*j*e*e*j*c*b*e*c*e*e*e*b*e*c*e*c*f*b*g*d*e*e*j*f*c*f*c*e*e**-e*e*c*d*b*c*f*j*c*j*K*j*j*e*c*e*f*e*c*c*e*g*b*e*f*b*e*i*c*b*e*d*c*b*c*j*i*h*n*",
+"@ =---;->-;-,-;-;-,->-'-)-!-~-{-]-^-/-(-_-:-<-[-}-|-1-2-3-4-5-6-7-7-7-8-7-7-8-9-0-a-b-c-d-e-f-f-f-g-d-h-i-e-f-j-k-l-k-d-e-m-f-n-i-i-e-o-p-q-j-l-r-p-q-l-r-n-e-j-f-j-q-l-s-l-t-n-t-d-i-p-d-s-u-q-n-j-j-v-q-d-s-r-n-n-w-k-f-k-x-q-d-v-h-k-f-i-f-j-r-f-n-g-",
+"@ y-0$R#<&<&|=0$<&0$z-A-B-C-D-E-F-G-H-I-J-f$K-L-M-N-O-P-Q-R-9&S-S-S-S-S-S-S-S-T-U-V-W-X-Y-X-Z-X-`-Z-Y- ;.;+;@;@;X-X-Y-.;Y-`-X-Z-#;`-W-X-Y-Y-.;X-`-Y-$;Z-X-X-X-`-X-Z- ;Z-X-X-`-Y-%;Z-Z-X-Z-X-X-Y-Y-X-Y-%;X-Y-&;X-Y-Y-`-X-Y-X-Y-X-Y-X-Y-X-Z-Z-X-.;Z-Z-X-X-",
+"@ *;9$Q#Q#w&Q#Q#e#=;-;;;>;K$K$K$K$*&,;';x*f$,=);!;~;{;8=];^;`*c c c c c c c c /;(;_;:;+;+;<;[;+;+;+;};+;};+;W-+;W-};};|;W-W-W-};};+;+;1;};W-|;[;+;W-+;W-};1;+;X-};W-+;};};+;W-|;W-W-};<;W-W-+;W-+;+;};W-+;};|;+;+;};+;+;};+;};+;+;+;};};+;};<;+;[;+;+;+;",
+"@ 2;w&9$Q#9$w&e#3;4;5;6;P%7;A&K$A&8;9;0;a;3&K-b;c;d;e;f;g;h;i;c c c c c c c c k j;k;l;|;+;+;};};+;+;+;X-W-+;};};W-+;W-+;[;+;+;W-};W-W-W-W-+;};+;+;};+;+;};+;+;+;+;+;+;+;+;+;|;+;+;W-+;};+;+;m;W-+;+;1;@;+;+;W-+;W-+;[;+;+;+;+;1;+;};[;+;+;W-+;+;};+;+;+;",
+"@ n;Q#M%o;9$<&p;q;r;s;c$K$c$K$K$K$t;u;v;w;f$3&x;y;z;e;A;B;C;D;c c c c c c c c c E;F;G;W-[;};+;+;H;+;+;+;+;1;@;W-+;I;+;};1;W-};J;|;W-@;1;};};};[;+;K;H;W-<;};+;+;+;<;+;W-+;+;+;m;};@;1;W-};+;W-J;+;+;<;+;};W-};};+;m;W-@;1;};<;};+;W-+;@;+;+;+;W-+;W-+;+;",
+"@ L;Q#M;N;O;P;Q;m=S@A&7;A&K$S@R;S;T;U;a;V;W;f$X;Y;Z;8=H&`; >.>c c c c c c c c c +>@>#>+;+;H;W-1;+;1;+;+;W-[;+;1;};+;+;+;+;};+;+;<;};<;+;W-1;@;+;+;+;};};1;+;+;+;W-};+;+;};W-W-W-<;+;+;+;+;[;};};};+;+;};+;};<;[;+;W-+;<;+;W-+;W-1;<;+;+;|;[;};+;+;1;+;1;",
+"@ $>%>&>*>=>->;>K$K$>>K$c$A&R;,>'>)>3&f$w*a;V@!>~>{>]>^>/>(>V c c c c c c c c c -+_>:>+;};+;+;W-+;+;+;W-W-};+;+;};+;+;W-+;X-+;+;};+;+;+;|;<;};+;};1;+;W-+;+;};};W-+;W-+;+;+;+;[;m;W-+;};1;+;+;+;W-+;+;+;+;+;};+;+;+;+;+;+;+;+;+;+;+;W-+;+;+;|;+;+;W-+;};",
+"@ <>[>}>|>1>2>3>4>4>4>2>2>2>5>6>7>8>9>9>0>a>b>c>d>e>e>f>g>h>i>j>k>l>j>j>j>j>l>j>m>n>o>I;W-[;<;+;W-+;+;+;+;+;+;W-+;+;+;+;+;X-};+;+;+;@;+;};+;+;+;+;+;};X-};+;W-+;+;};+;+;W-};+;+;1;<;+;+;+;+;[;|;+;};+;W-+;+;};+;+;<;|;W-+;};+;};<;};+;<;+;W-+;+;+;+;[;|;",
+"@ p>q>r>s>t>s>u>v>v>v>w>u>x>y>z>A>B>C>B>D>E>F>G>H>H>I>J>K>L>M>N>O>P>Q>R>S>Q>R>S>T>U>V>W>X>Y>Z>`> ,.,.,+,@,Z>Y>#,$,Z>.,%,$,&,$,Z>$,@,@,*,Y>Z>$,.,=,Y>-,+,*,.,$,Y>Z>@,+,&,;,>,.,,,-,+,@,Z>',.,&,),=,Y>#,!,.,#,Z>$,),~,&,*,!,@,>,{,=,.,Y>=,],@,.,Y>=,`>`>Z>",
+"@ ^,A&K$K$c$P%S@A&7;>>|&/,(,_,Z&-&-&,=f$:,<,[,},|,f;t=1,2,v%c c c c c c c c c c c 3,4,5,6,7,8,9,9,0,8,8,7,a,b,0,8,0,0,c,a,0,0,7,0,c,a,b,8,8,0,8,0,d,0,b,d,0,8,8,0,8,8,8,8,b,0,8,6,a,7,8,0,0,8,0,0,0,b,0,b,8,0,8,8,6,7,8,0,e,0,d,8,9,6,8,7,8,0,0,8,6,6,6,",
+"@ f,K$K$K$c$7;A&K$K$g,h,i,j,k,f$L-l,V;,=m,n,o,H&f;{>p,q,r,7*c c c c c c c c c c c 3,s,t,b,8,7,8,c,8,0,0,0,8,0,7,6,8,0,e,0,0,0,c,0,0,d,0,8,6,c,0,8,6,7,0,8,e,8,e,8,u,e,9,0,0,8,e,8,0,0,8,e,a,8,0,8,d,0,a,0,6,0,0,8,0,d,0,8,6,7,0,0,7,0,c,0,0,8,0,7,8,8,7,",
+"@ v,K$K$>>w,7;c$K$U#x,y,z,Z&,=a;f$-&f$A,B,C,7&D,e;.*'&E,F,c c c c c c c c c c c c G,H,5,8,6,9,8,6,a,8,6,8,b,0,e,0,8,6,7,d,0,6,8,0,0,7,7,8,6,c,0,8,7,8,8,a,0,0,0,e,9,7,d,7,0,0,0,8,8,0,0,b,0,7,8,8,8,8,d,0,8,8,0,0,8,0,e,0,e,d,6,8,8,8,0,8,8,0,8,9,0,0,a,",
+"@ f,A&P%K$K$c$b%h,I,';J,K,,=-&|*L,a;U*M,N,g;.*]>8=O,l.P,` c c c c c c c c c c c c 3,s,Q,0,d,7,c,0,8,7,8,0,8,a,8,8,0,b,6,8,0,8,9,e,8,e,0,d,0,d,8,0,0,a,0,6,c,8,0,7,a,0,0,6,8,8,8,c,0,0,a,e,d,8,R,7,0,b,d,7,0,0,0,0,8,8,8,7,8,a,0,8,e,8,0,8,0,8,0,8,e,e,6,",
+"@ S,A&c$|&S*T,U,V,W,X,f$f$l,3&3&|*>=Y,Z,`,8=e;{>.* '.'+'c c c c c c c c c c c c ` G,@'d,8,0,0,0,8,0,0,0,0,0,0,0,c,0,8,0,0,8,0,8,6,8,6,8,0,8,8,e,0,0,8,8,8,0,0,0,8,6,8,8,8,0,0,0,0,8,0,8,8,0,8,6,0,8,8,7,6,0,6,8,8,0,8,0,8,0,8,0,7,0,a,8,c,0,0,8,0,0,7,9,",
+"@ f,#'$',;%'&'*'V@,=f$|*-&|*,=f$='-';'>'H&8=e;8=,''')'K&c c c c c c c c c c c c !'~'{'8,8,0,8,8,6,0,8,8,0,e,8,8,8,9,d,0,0,0,0,8,8,]'8,0,0,0,8,8,8,8,0,0,0,8,8,8,0,8,0,8,a,8,8,0,8,0,0,0,8,b,8,0,8,8,0,a,b,0,0,8,8,0,0,8,0,0,8,0,8,8,0,0,8,0,8,8,8,0,0,8,",
+"@ ^'/'('_':'<'3&V;|*-&|*);f$-&Y&['}'|'1'{>2'P-|,3'4'Z b c c c c c c c c c c c c 5'6'7'0,0,b,6,c,0,0,0,e,8,6,0,0,d,8,7,0,8,0,0,9,b,9,0,d,8,0,0,0,6,d,8,6,8,7,0,8,8,9,0,6,d,9,0,8,0,0,8,0,0,8,0,e,0,8,e,6,8,7,8,7,d,R,8,8,0,0,0,a,0,0,0,6,e,9,0,a,6,7,8,b,"};
diff --git a/muse/muse/xpm/initS.xpm b/muse/muse/xpm/initS.xpm
new file mode 100644
index 00000000..998b02fe
--- /dev/null
+++ b/muse/muse/xpm/initS.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * initS_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #C00000",
+"+ c #FFFFFF",
+"@ c #000000",
+"................",
+"................",
+"..++++++++++++..",
+"..+@@++++++@@+..",
+"..+@@@++++@@@+..",
+"..++@@@++@@@++..",
+"..+++@@@@@@+++..",
+"..++++@@@@++++..",
+"..++++@@@@++++..",
+"..+++@@@@@@+++..",
+"..++@@@++@@@++..",
+"..+@@@++++@@@+..",
+"..+@@++++++@@+..",
+"..++++++++++++..",
+"................",
+"................"};
diff --git a/muse/muse/xpm/inputpluginS.xpm b/muse/muse/xpm/inputpluginS.xpm
new file mode 100644
index 00000000..33e8e578
--- /dev/null
+++ b/muse/muse/xpm/inputpluginS.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *inputpluginS_xpm[]={
+"16 16 3 1",
+"a c #000000",
+". c #00ff00",
+"# c #ffffff",
+"................",
+"................",
+"..############..",
+"..#aaaaa######a.",
+".aaaaaaaaaa##a.a",
+"a.#aaaaa######a.",
+"..############..",
+"..#aaaaa######a.",
+"aaaaaaaaaaa##a.a",
+"..#aaaaa######a.",
+"..############..",
+"a.#aaaaa######a.",
+".aaaaaaaaaa##a.a",
+"..#aaaaa######a.",
+"................",
+"................"};
diff --git a/muse/muse/xpm/italic.xpm b/muse/muse/xpm/italic.xpm
new file mode 100644
index 00000000..e21ebbff
--- /dev/null
+++ b/muse/muse/xpm/italic.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static const char * italic_xpm[] = {
+"11 11 2 1",
+" g None",
+". g #000000",
+" ",
+" .... ",
+" .. ",
+" .. ",
+" .. ",
+" .. ",
+" .. ",
+" .. ",
+" .. ",
+" .... ",
+" "};
diff --git a/muse/muse/xpm/listS.xpm b/muse/muse/xpm/listS.xpm
new file mode 100644
index 00000000..cc561f06
--- /dev/null
+++ b/muse/muse/xpm/listS.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static const char *listS_xpm[]={
+"16 16 7 1",
+"# c #000000",
+"e c #008000",
+". c #00ff00",
+"b c #dbdbdb",
+"a c #dcdcdc",
+"d c #fafafa",
+"c c #fbfbfb",
+"................",
+"..############..",
+"..#aaaaaaaabb#..",
+"..#c#c#c#c#db#e.",
+"..#cc#c#c#c#b#e.",
+"..#cccccccccb#e.",
+"..#c#a#a#a#ab#e.",
+"..#cc#a#a#a#b#e.",
+"..#cccccccccb#e.",
+"..#c#a#a#a#ab#e.",
+"..#cc#a#a#a#b#e.",
+"..#cccccccccb#e.",
+"..#cccccccccb#e.",
+"..############e.",
+"....eeeeeeeeeee.",
+"................"};
diff --git a/muse/muse/xpm/lmark.xpm b/muse/muse/xpm/lmark.xpm
new file mode 100644
index 00000000..2da119b9
--- /dev/null
+++ b/muse/muse/xpm/lmark.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char* lmark_xpm[]={
+"18 18 2 1",
+"# c #0000ff",
+". c None",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+"##########........",
+".#########........",
+"..########........",
+"...#######........",
+"....######........",
+".....#####........",
+"......####........",
+".......###........",
+"........##........",
+"........##........",
+"........##........"};
diff --git a/muse/muse/xpm/localoffS.xpm b/muse/muse/xpm/localoffS.xpm
new file mode 100644
index 00000000..312793a5
--- /dev/null
+++ b/muse/muse/xpm/localoffS.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *localoffS_xpm[]={
+"16 16 3 1",
+"a c #000000",
+". c #c00000",
+"# c #ffffff",
+"................",
+"................",
+"..############..",
+"..############..",
+"..####aaaa####..",
+"..##aaaaaaaa##..",
+"..##aaaaaaaa##..",
+"..############..",
+"..############..",
+"..##aaaaaaaa##..",
+"..##aaaaaaaa##..",
+"..####aaaa####..",
+"..############..",
+"..############..",
+"................",
+"................"};
diff --git a/muse/muse/xpm/lock.xpm b/muse/muse/xpm/lock.xpm
new file mode 100644
index 00000000..9c38103b
--- /dev/null
+++ b/muse/muse/xpm/lock.xpm
@@ -0,0 +1,86 @@
+/* XPM */
+static const char * lock_xpm[] = {
+"15 15 68 1",
+" c None",
+". c #747474",
+"+ c #838383",
+"@ c #727272",
+"# c #808080",
+"$ c #929292",
+"% c #7F7F7F",
+"& c #7A7A7A",
+"* c #6A6A6A",
+"= c #8C8C8C",
+"- c #F3F3F3",
+"; c #DEDEDE",
+"> c #2F2F2F",
+", c #2C2C2C",
+"' c #191919",
+") c #242424",
+"! c #3A3A3A",
+"~ c #6D6D6D",
+"{ c #CBCBCB",
+"] c #212121",
+"^ c #B6B6B6",
+"/ c #D1D1D1",
+"( c #C6C6C6",
+"_ c #1D1D1D",
+": c #787878",
+"< c #C1C1C1",
+"[ c #757575",
+"} c #1F1F1F",
+"| c #404040",
+"1 c #BDBDBD",
+"2 c #878787",
+"3 c #CFCFCF",
+"4 c #282828",
+"5 c #1C1C1C",
+"6 c #DCDCDC",
+"7 c #7C7C7C",
+"8 c #B5B5B5",
+"9 c #262626",
+"0 c #202020",
+"a c #232323",
+"b c #A3A3A3",
+"c c #2D2D2D",
+"d c #C4C4C4",
+"e c #1E1E1E",
+"f c #D8D8D8",
+"g c #272727",
+"h c #292929",
+"i c #E3E3E3",
+"j c #D4D4D4",
+"k c #B8B8B8",
+"l c #EBEBEB",
+"m c #444444",
+"n c #323232",
+"o c #3B3B3B",
+"p c #414141",
+"q c #383838",
+"r c #434343",
+"s c #EFEFEF",
+"t c #ABABAB",
+"u c #E7E7E7",
+"v c #A0A0A0",
+"w c #353535",
+"x c #363636",
+"y c #373737",
+"z c #C3C3C3",
+"A c #969696",
+"B c #1B1B1B",
+"C c #8F8F8F",
+".+@#$.@%&+%%@+*",
+"=--;;>,')!;;--$",
+"~{;;]!^;/(_;{/:",
+"=<;)[^}_)/+|1<2",
+"&3/41);;;56}(/%",
+"73;)89;;;06_(/+",
+"2(5abc;;;]d)e/%",
+"7f5)90g]g0ahe3+",
+"+;ai<(j(<<k6]l@",
+"@;9bmncopqr1)-%",
+"+i4stui({(b;}l:",
+"2;}v|w>x|yp(g-+",
+".jn6z6uk<u<8]u#",
+"Aie9B4]a455>eiC",
+"@%@%=22@@%&+#=~"};
diff --git a/muse/muse/xpm/loop.xpm b/muse/muse/xpm/loop.xpm
new file mode 100644
index 00000000..91a2113f
--- /dev/null
+++ b/muse/muse/xpm/loop.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char *loop_xpm[] = {
+" 29 15 4 1",
+". c #000000",
+"# c #7f7f7f",
+"a c None",
+"b c #ffffff",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaa...#aaaaaaaaaaaa",
+"aaaaaa########....#####aaaaaa",
+"aaaaa#.................#aaaaa",
+"aaaa#.bbbbbb##....bbbbb.#aaaa",
+"aaa#.baaaaaaa...bbaaaaa#.baaa",
+"aaa#.baaaaaaabbbaaaaaaa#.baaa",
+"aaa#.aaaaaaaaaaaaaaaaaa#.baaa",
+"aaa#.aaaaaaaaaaaaaaaaaa#.baaa",
+"aaaa.aaaaaaaaaaaaaaaaaa#.baaa",
+"aaaa#.#################.baaaa",
+"aaaaa#.................baaaaa",
+"aaaaaabbbbbbbbbbbbbbbbbaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/muse/muse/xpm/loop1.xpm b/muse/muse/xpm/loop1.xpm
new file mode 100644
index 00000000..9fd00bfb
--- /dev/null
+++ b/muse/muse/xpm/loop1.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static const char *loop1_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 22 22 9 1",
+/* colors */
+". c #000000",
+"# c #00007f",
+"a c #0000ff",
+"b c #505850",
+"c c #7f7f7f",
+"d c None",
+"e c #dfdfdf",
+"f c #ffff00",
+"g c #ffffff",
+/* pixels */
+"dddddddddddddddddddddd",
+"dddddddddddddddddddddd",
+"dddddddggggggggddddddd",
+"ddddddg........cdddddd",
+"dddddg.cccccccc.cddddd",
+"ddddg.cddddddddg.cdddd",
+"ddddg.cddddddddg.cdddd",
+"ddddg.cddddddddg.cdddd",
+"ddddg.cdddddddg...dddd",
+"ddddg.cdddddddg...cddd",
+"ddddg.cddddddg.....ddd",
+"ddddg.cddddddg.....ddd",
+"ddddg.cddddddg.c.c.ddd",
+"ddddg.cddddddddc.cdddd",
+"ddddg.cddddddddg.cdddd",
+"ddddg.cddddddddg.cdddd",
+"ddddg.cddddddddg.cdddd",
+"dddddc.ddddddgg.cddddd",
+"ddddddc........cdddddd",
+"ddddddddcccccccddddddd",
+"dddddddddddddddddddddd",
+"dddddddddddddddddddddd"
+};
+
diff --git a/muse/muse/xpm/master.xpm b/muse/muse/xpm/master.xpm
new file mode 100644
index 00000000..8d241c9f
--- /dev/null
+++ b/muse/muse/xpm/master.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static const char*master_xpm[]={
+"10 10 2 1",
+"# c #000000",
+". c None",
+"..........",
+".#.,....#.",
+".##....##.",
+".###..###.",
+".########.",
+".##.##.##.",
+".##....##.",
+".##....##.",
+".##....##.",
+".........."};
diff --git a/muse/muse/xpm/mastertrackS.xpm b/muse/muse/xpm/mastertrackS.xpm
new file mode 100644
index 00000000..3f1dfcb9
--- /dev/null
+++ b/muse/muse/xpm/mastertrackS.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static const char *mastertrackS_xpm[]={
+"16 16 6 1",
+"# c #000000",
+". c #00ff00",
+"c c #808080",
+"d c #c3c3c3",
+"b c #ffc0c0",
+"a c #ffffff",
+"................",
+"................",
+"..#aaaaaaaaaaa..",
+"..##aaaaaaaaaa..",
+"..a##abbaaaaaa..",
+"..aa##abbaaaaa..",
+"..aaa#cbbbb####.",
+"..aaaabcbbb#c##.",
+"..aaaaabbbb####.",
+"..aaaaacbbb####.",
+"..aaaaaaa#a####.",
+"..aaaaaaaaadddd.",
+"..aaaaaaaaaaaa..",
+"..aaaaaaaaaaaa..",
+"................",
+"................"};
diff --git a/muse/muse/xpm/mastertrack_graphic.xpm b/muse/muse/xpm/mastertrack_graphic.xpm
new file mode 100644
index 00000000..0651619c
--- /dev/null
+++ b/muse/muse/xpm/mastertrack_graphic.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char * mastertrack_graphic_xpm[] = {
+"16 16 9 1",
+" c None",
+". c #13A913",
+"+ c #0AD700",
+"@ c #800000",
+"# c #FEFFFC",
+"$ c #C2C4C0",
+"% c #C20000",
+"& c #FF0000",
+"* c #078002",
+"................",
+".++@@++++++++++.",
+".+#@@$########+.",
+".+#%%$########+.",
+".+#%%$########+.",
+".+#&&$#@@#####+.",
+".+#&&$#@@####@@.",
+".@@&&$#%%####@@*",
+".@@&&@@%%$###%%*",
+".%%&&@@&&@@##%%*",
+".%%&&%%&&@@@@&&*",
+".&&&&%%&&%%@@&&*",
+".&&&&&&&&%%%%&&*",
+".&&&&&&&&&&%%&&*",
+".+**************",
+"................"};
diff --git a/muse/muse/xpm/mastertrack_list.xpm b/muse/muse/xpm/mastertrack_list.xpm
new file mode 100644
index 00000000..e8ed00db
--- /dev/null
+++ b/muse/muse/xpm/mastertrack_list.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char * mastertrack_list_xpm[] = {
+"16 16 8 1",
+" c None",
+". c #13A913",
+"+ c #0AD700",
+"@ c #000100",
+"# c #FEFFFC",
+"$ c #DBDDDA",
+"% c #078002",
+"& c #C2C4C0",
+"................",
+".+@@@@@@@@@@@@+.",
+".+@#$$$####$$@%.",
+".+@$@&@&@&@&#@%.",
+".+@##@&@&@&@#@%.",
+".+@#$##$#####@%.",
+".+@$@@#@#@#@#@%.",
+".+@$@@#$@#@##@%.",
+".+@$$##$#####@%.",
+".+@#@@#@$@#@#@%.",
+".+@#@@##@$@##@%.",
+".+@$#@@#@#@##@%.",
+".+@#@##@@#@@#@%.",
+".+@$#####$$#$@%.",
+".+@@@@@@@@@@@@%.",
+"...%%%%%%%%%%%%."};
diff --git a/muse/muse/xpm/meta.xpm b/muse/muse/xpm/meta.xpm
new file mode 100644
index 00000000..c424c23c
--- /dev/null
+++ b/muse/muse/xpm/meta.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char * meta_xpm[] = {
+"22 22 2 1",
+" c #FFFFFFFFFFFF",
+". c #000000000000",
+" ",
+" ",
+" ",
+" ",
+" ........ .... ",
+" .. .. .. .. .. ",
+" .. .. .. ...... ",
+" .. .. .. .. ",
+" .. .. .. .. . ",
+" ... .. ... .... ",
+" ",
+" ",
+" .. ",
+" .. ",
+" .... .... ",
+" .. .. ",
+" .. ..... ",
+" .. .. .. ",
+" .. .. .. ",
+" ... ....... ",
+" ",
+" "};
diff --git a/muse/muse/xpm/midi_edit_instrument.xpm b/muse/muse/xpm/midi_edit_instrument.xpm
new file mode 100644
index 00000000..90e3df49
--- /dev/null
+++ b/muse/muse/xpm/midi_edit_instrument.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char * midi_edit_instrument_xpm[] = {
+"16 16 8 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #FF0000",
+"# c #A0A0A0",
+"$ c #808000",
+"% c #404000",
+"& c #585858",
+" ",
+" ........... ",
+" .+++++++++. @@",
+" .+########.@@@",
+" .+++++++++$%@ ",
+" .+#######$%$ ",
+" .+++++++$%$ ",
+" .+####+$%$. ",
+" .+++++$%$+. ",
+" .+#++$%$++. ",
+" .+++&$$+++. ",
+" .+++&&++++. ",
+" .+++++++++. ",
+" .+#######+. ",
+" .+++++++++. ",
+" ........... "};
diff --git a/muse/muse/xpm/midi_init_instr.xpm b/muse/muse/xpm/midi_init_instr.xpm
new file mode 100644
index 00000000..a64dc56f
--- /dev/null
+++ b/muse/muse/xpm/midi_init_instr.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char * midi_init_instr_xpm[] = {
+"16 16 9 1",
+" c None",
+". c #800000",
+"+ c #C00000",
+"@ c #E1DDDA",
+"# c #C7C0BB",
+"$ c #FFFFFF",
+"% c #0E0702",
+"& c #080401",
+"* c #000000",
+"................",
+".++++++++++++++.",
+".+@###$$$$@##$+.",
+".+@%&#@$$##&&#+.",
+".+@%*&#@@@&*&#+.",
+".+@#&*&#@&**##+.",
+".+@$#&*&*&%@@@+.",
+".+@$$#&***#@@@+.",
+".+@$$#****#@$@+.",
+".+@@#%*%&&%#@@+.",
+".+@#&*%#@&*&#@+.",
+".+#&*%##$@**%#+.",
+".+#%%#@$$@#%%#+.",
+".+@@@@$$$$$##$+.",
+".++++++++++++++.",
+"................"};
diff --git a/muse/muse/xpm/midi_inputplugins.xpm b/muse/muse/xpm/midi_inputplugins.xpm
new file mode 100644
index 00000000..3874a052
--- /dev/null
+++ b/muse/muse/xpm/midi_inputplugins.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static const char * midi_inputplugins_xpm[] = {
+"16 16 14 1",
+" c None",
+". c #58A8FF",
+"+ c #A8DCFF",
+"@ c #FFFFFF",
+"# c #000000",
+"$ c #88B2CE",
+"% c #CECECE",
+"& c #396EA6",
+"* c #4788CE",
+"= c #B7D9F0",
+"- c #B1CFE5",
+"; c #99AEBE",
+"> c #94AFC2",
+", c #2E5986",
+"................",
+".++++++++++++++.",
+".+@@@@@@@@@@@@+.",
+".+@#####@@@@@@#.",
+".##########@@#+#",
+"#$%#####%%%%@@#&",
+"*+@@%%%%%@@@@@+&",
+".+@#####@@@@@@#.",
+"###########@@#+#",
+".+@#####%%%%@@#&",
+".+@@%%%%%@@@@@+&",
+"#+@#####@@@@@@#.",
+"*##########@@#+#",
+".$%#####%%%%@@#&",
+".+=-;;;;>++++++,",
+"................"};
diff --git a/muse/muse/xpm/midi_inputplugins_midi_input_filter.xpm b/muse/muse/xpm/midi_inputplugins_midi_input_filter.xpm
new file mode 100644
index 00000000..c218d3f7
--- /dev/null
+++ b/muse/muse/xpm/midi_inputplugins_midi_input_filter.xpm
@@ -0,0 +1,98 @@
+/* XPM */
+static const char * midi_inputplugins_midi_input_filter_xpm[] = {
+"16 16 79 1",
+" c None",
+". c #58A8FF",
+"+ c #A8DCFF",
+"@ c #FFFFFF",
+"# c #FCFCFC",
+"$ c #000000",
+"% c #030303",
+"& c #010101",
+"* c #FAFAFA",
+"= c #F1F1F1",
+"- c #F5F5F5",
+"; c #060606",
+"> c #A9A9A9",
+", c #989898",
+"' c #BCBCBC",
+") c #E3E3E3",
+"! c #0B0B0B",
+"~ c #F7F7F7",
+"{ c #040404",
+"] c #888888",
+"^ c #A4A4A4",
+"/ c #C5C5C5",
+"( c #CACACA",
+"_ c #CBCBCB",
+": c #C1C1C1",
+"< c #E4E4E4",
+"[ c #C6C6C6",
+"} c #0F0F0F",
+"| c #979797",
+"1 c #828282",
+"2 c #ACACAC",
+"3 c #BFBFBF",
+"4 c #C8C8C8",
+"5 c #D9D9D9",
+"6 c #E6E6E6",
+"7 c #88B2CE",
+"8 c #252525",
+"9 c #878787",
+"0 c #A7A7A7",
+"a c #C7C7C7",
+"b c #B1B1B1",
+"c c #C2C2C2",
+"d c #D8D8D8",
+"e c #020202",
+"f c #82ABC6",
+"g c #FDFDFD",
+"h c #0A0A0A",
+"i c #A8A8A8",
+"j c #CFCFCF",
+"k c #B6B6B6",
+"l c #090909",
+"m c #93B6CD",
+"n c #F8F8F8",
+"o c #A2A2A2",
+"p c #0D0D0D",
+"q c #CCCCCC",
+"r c #89B4D0",
+"s c #9F9F9F",
+"t c #9B9B9B",
+"u c #0E0E0E",
+"v c #A0A0A0",
+"w c #CDCDCD",
+"x c #F0F0F0",
+"y c #B0B0B0",
+"z c #ADADAD",
+"A c #F4F4F4",
+"B c #FBFBFB",
+"C c #050505",
+"D c #D0D0D0",
+"E c #999999",
+"F c #121212",
+"G c #F2F2F2",
+"H c #FEFEFE",
+"I c #B7B7B7",
+"J c #A1A1A1",
+"K c #F6F6F6",
+"L c #ECECEC",
+"M c #779CB5",
+"N c #3E77B5",
+"................",
+".++++++++++++++.",
+".+@@#@$%&$@*@@+.",
+".+=-;$>,')$!@~+.",
+".+{&]^/(_:<[$}+.",
+".+!|1234[/565{7.",
+".+8$90ab'c_de$f.",
+".+g$h$ibjk$$l$m.",
+".+@n;o%$$p^$$qr.",
+".+n@@$qstouvw4+.",
+".+~@x@$3y$zvg@+.",
+".+@ABnCDEFi@n@+.",
+".+GH@@$IJ$i~@K+.",
+".+@GH@;[y%i-L@+.",
+".++++++;;MM++++.",
+"........NN......"};
diff --git a/muse/muse/xpm/midi_inputplugins_midi_input_transform.xpm b/muse/muse/xpm/midi_inputplugins_midi_input_transform.xpm
new file mode 100644
index 00000000..35730e37
--- /dev/null
+++ b/muse/muse/xpm/midi_inputplugins_midi_input_transform.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static const char * midi_inputplugins_midi_input_transform_xpm[] = {
+"16 16 12 1",
+" c None",
+". c #58A8FF",
+"+ c #000000",
+"@ c #A8DCFF",
+"# c #FFFFFF",
+"$ c #CACACA",
+"% c #797C7E",
+"& c #808080",
+"* c #545454",
+"= c #7E7F7F",
+"- c #6F91A8",
+"; c #3A6FA8",
+"......+.........",
+".@@@@++@@@@@@@@.",
+".@##+++#######@.",
+".@#++$+$######@.",
+".@#+$$+$##++##@.",
+".@##$#+$#++++#@.",
+".%&&&&+*&++++*=.",
+".@####+$#+++$$@.",
+".@##+++$#+$$$#@.",
+".@#++++$#+$###@.",
+".&&++++*&+*&&&&.",
+".@##++$$#+$#+#@.",
+".@###$$##+$++$@.",
+".@#######+++$$@.",
+".@@@@@@@@++--@@.",
+".........+;;...."};
diff --git a/muse/muse/xpm/midi_inputplugins_random_rhythm_generator.xpm b/muse/muse/xpm/midi_inputplugins_random_rhythm_generator.xpm
new file mode 100644
index 00000000..beaef721
--- /dev/null
+++ b/muse/muse/xpm/midi_inputplugins_random_rhythm_generator.xpm
@@ -0,0 +1,67 @@
+/* XPM */
+static const char * midi_inputplugins_random_rhythm_generator_xpm[] = {
+"16 16 48 1",
+" c None",
+". c #58A8FF",
+"+ c #A8DCFF",
+"@ c #828181",
+"# c #1E1C1C",
+"$ c #FFFFFF",
+"% c #C6C5C5",
+"& c #4984C5",
+"* c #646464",
+"= c #4B4949",
+"- c #504E4E",
+"; c #5D5B5B",
+"> c #9B9A9A",
+", c #626060",
+"' c #464545",
+") c #7E7D7D",
+"! c #9F9E9E",
+"~ c #575555",
+"{ c #4A4848",
+"] c #85ABC5",
+"^ c #8A8989",
+"/ c #363535",
+"( c #2A2828",
+"_ c #2B2929",
+": c #2F2D2D",
+"< c #3A3838",
+"[ c #514F4F",
+"} c #605E5E",
+"| c #535252",
+"1 c #2E2C2C",
+"2 c #2C2A2A",
+"3 c #656464",
+"4 c #545353",
+"5 c #6E6D6D",
+"6 c #5B5A5A",
+"7 c #312F2F",
+"8 c #4D4C4C",
+"9 c #373535",
+"0 c #252323",
+"a c #4F4E4E",
+"b c #333131",
+"c c #272525",
+"d c #403E3E",
+"e c #777676",
+"f c #232121",
+"g c #434141",
+"h c #282626",
+"i c #6B879A",
+"................",
+".+++++++@#@++++.",
+".+$$$$$$###%@#@.",
+".+$$$$$$@#@%###&",
+".+*=--;$$#>%@#@&",
+".,'))!~{$#%$$#]&",
+".^/(_:<[%#%$$#].",
+".}|12<34%#%$$#].",
+".56:(7|5%#%$$#].",
+".58907|5%#%$$#].",
+".5abcda5%#%$$#].",
+".e69fg6e%#%$$#].",
+".]69cd6>%#%$$#].",
+".+3gh93>$$%$$#].",
+".++9h9]]++++++i.",
+"...9#d&........."};
diff --git a/muse/muse/xpm/midi_inputplugins_remote_control.xpm b/muse/muse/xpm/midi_inputplugins_remote_control.xpm
new file mode 100644
index 00000000..6347cdaf
--- /dev/null
+++ b/muse/muse/xpm/midi_inputplugins_remote_control.xpm
@@ -0,0 +1,64 @@
+/* XPM */
+static const char * midi_inputplugins_remote_control_xpm[] = {
+"16 16 45 1",
+" c None",
+". c #58A8FF",
+"+ c #9BCBFF",
+"@ c #CCE4FF",
+"# c #FBB2B2",
+"$ c #FF6363",
+"% c #F60D0D",
+"& c #FD0101",
+"* c #F6CDCD",
+"= c #A8DCFF",
+"- c #C5E8FF",
+"; c #D2EDFF",
+"> c #DAF0FF",
+", c #FFFFFF",
+"' c #B4B4B4",
+") c #525252",
+"! c #949494",
+"~ c #4A4949",
+"{ c #0D3A16",
+"] c #313131",
+"^ c #6D6D6D",
+"/ c #545454",
+"( c #2CD04B",
+"_ c #196A29",
+": c #2F2D2D",
+"< c #515151",
+"[ c #F0F9FF",
+"} c #9D9D9D",
+"| c #1B1A1A",
+"1 c #13521F",
+"2 c #1E1C1C",
+"3 c #A8D2FF",
+"4 c #201F1F",
+"5 c #CFCFCF",
+"6 c #3A3939",
+"7 c #8C8C8C",
+"8 c #000000",
+"9 c #101010",
+"0 c #D5D5D5",
+"a c #646464",
+"b c #323030",
+"c c #2E2B2B",
+"d c #E9E9E9",
+"e c #E8E8E8",
+"f c #8B8B8B",
+".....+@@##$$%%&*",
+".===-;>,,,,*,,&&",
+".=,,,,,##$%%**,%",
+".=,,,,,,,,,&&*,$",
+".=,,,,,,#%*,&%*$",
+".=,,,,,,,%%*,%,#",
+".=,,,')!,,%%,$,#",
+".=,,,~{]^,,#,#,,",
+".=,,/{(_:<,,,#,@",
+".[,}|1112<',,,[3",
+".[,/42122<,,,,[.",
+".[522226<',,,,=.",
+".,78229<',,,,,=.",
+".,0abcad,,,,,,=.",
+".=,efa0,,,=====.",
+"...,,,,........."};
diff --git a/muse/muse/xpm/midi_inputplugins_transpose.xpm b/muse/muse/xpm/midi_inputplugins_transpose.xpm
new file mode 100644
index 00000000..56cd1a8e
--- /dev/null
+++ b/muse/muse/xpm/midi_inputplugins_transpose.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static const char * midi_inputplugins_transpose_xpm[] = {
+"16 16 11 1",
+" c None",
+". c #58A8FF",
+"+ c #A8DCFF",
+"@ c #363636",
+"# c #FFFFFF",
+"$ c #CACACA",
+"% c #626262",
+"& c #000000",
+"* c #85AECA",
+"= c #010101",
+"- c #4685CA",
+"................",
+".+++++++++@@+++.",
+".+##@#####@@##+.",
+".+##@$####@@##+.",
+".+##@$####@@##+.",
+".+#%&%##%@&&@%+.",
+".+#%&%$#%@&&@%*.",
+".+#%&%$#%@&&@%*.",
+".+#%&%$#%@&&@%*.",
+".+##&$$#%@&&@%*.",
+".+#&=$##%@&&@%*.",
+".+&&$$###$=&$$*.",
+".&&$$####&&&$#+.",
+"&&$$####&&&$$#+.",
+"&**++++&&&**+++.",
+"--....&&&--....."};
diff --git a/muse/muse/xpm/midi_local_off.xpm b/muse/muse/xpm/midi_local_off.xpm
new file mode 100644
index 00000000..80dd1268
--- /dev/null
+++ b/muse/muse/xpm/midi_local_off.xpm
@@ -0,0 +1,105 @@
+/* XPM */
+static const char * midi_local_off_xpm[] = {
+"16 16 86 1",
+" c None",
+". c #800000",
+"+ c #C00000",
+"@ c #FFFFFF",
+"# c #F2F2F2",
+"$ c #3D3D3D",
+"% c #414141",
+"& c #FEFEFE",
+"* c #F1F1F1",
+"= c #BFBFBF",
+"- c #E7E7E7",
+"; c #EEEEEE",
+"> c #363636",
+", c #353535",
+"' c #D1D1D1",
+") c #B5B5B5",
+"! c #FAFAFA",
+"~ c #878787",
+"{ c #040404",
+"] c #636363",
+"^ c #E9E9E9",
+"/ c #6B6B6B",
+"( c #0E0E0E",
+"_ c #999999",
+": c #C4C4C4",
+"< c #1E1E1E",
+"[ c #1C1C1C",
+"} c #B7B7B7",
+"| c #ECECEC",
+"1 c #F7F7F7",
+"2 c #9E9E9E",
+"3 c #121212",
+"4 c #2E2E2E",
+"5 c #DFDFDF",
+"6 c #535353",
+"7 c #070707",
+"8 c #EFEFEF",
+"9 c #E5E5E5",
+"0 c #4C4C4C",
+"a c #0A0A0A",
+"b c #949494",
+"c c #212121",
+"d c #B8B8B8",
+"e c #979797",
+"f c #454545",
+"g c #171717",
+"h c #3C3C3C",
+"i c #DADADA",
+"j c #494949",
+"k c #BEBEBE",
+"l c #292929",
+"m c #242424",
+"n c #101010",
+"o c #A8A8A8",
+"p c #4B4B4B",
+"q c #FDFDFD",
+"r c #868686",
+"s c #373737",
+"t c #828282",
+"u c #090909",
+"v c #5C5C5C",
+"w c #F0F0F0",
+"x c #F4F4F4",
+"y c #FBFBFB",
+"z c #404040",
+"A c #0F0F0F",
+"B c #A5A5A5",
+"C c #111111",
+"D c #4E4E4E",
+"E c #B4B4B4",
+"F c #EBEBEB",
+"G c #ACACAC",
+"H c #464646",
+"I c #E8E8E8",
+"J c #131313",
+"K c #484848",
+"L c #2D2D2D",
+"M c #0D0D0D",
+"N c #5A5A5A",
+"O c #CECECE",
+"P c #FCFCFC",
+"Q c #CCCCCC",
+"R c #7F7F7F",
+"S c #262626",
+"T c #A7A7A7",
+"U c #E2E2E2",
+"................",
+".++++++++++++++.",
+".+@@@@#$%&@@@@+.",
+".+@*=-;>,&')!@+.",
+".+!~{]^>,^/(_@+.",
+".+:<[}|>,12345+.",
+".+67/8;>,&90ab+.",
+".+<cd@;>,&@eaf+.",
+".+ghi@;>j&@k<l+.",
+".+mno&8pj&qr{s+.",
+".+tuv9qwxyizAB+.",
+".+'%CDEF-GHA6I+.",
+".+qkf7JKLM7NO@+.",
+".+@PQRSCC/TU@@+.",
+".++++++++++++++.",
+"................"};
diff --git a/muse/muse/xpm/midi_plugS.xpm b/muse/muse/xpm/midi_plugS.xpm
new file mode 100644
index 00000000..330a4b35
--- /dev/null
+++ b/muse/muse/xpm/midi_plugS.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *midi_plugS_xpm[]={
+"16 16 3 1",
+". c #00ff00",
+"a c #303030",
+"# c #ffffff",
+"................",
+"................",
+"..###aaaaaa###..",
+"..##a######a##..",
+"..#a###aa###a#..",
+"..a####aa####a..",
+"..a#aa####aa#a..",
+"..a#aa####aa#a..",
+"..a##########a..",
+"..a#aa####aa#a..",
+"..a#aa####aa#a..",
+"..#a########a#..",
+"..##a######a##..",
+"..###aaaaaa###..",
+"................",
+"................"};
diff --git a/muse/muse/xpm/midi_reset_instr.xpm b/muse/muse/xpm/midi_reset_instr.xpm
new file mode 100644
index 00000000..9460fd41
--- /dev/null
+++ b/muse/muse/xpm/midi_reset_instr.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static const char * midi_reset_instr_xpm[] = {
+"16 16 36 1",
+" c None",
+". c #800000",
+"+ c #C00000",
+"@ c #FFFFFF",
+"# c #D4D4D4",
+"$ c #606060",
+"% c #000000",
+"& c #F8F8F8",
+"* c #DDDDDD",
+"= c #272727",
+"- c #E0E0E0",
+"; c #757575",
+"> c #E1E1E1",
+", c #AE0000",
+"' c #A3A3A3",
+") c #909090",
+"! c #474747",
+"~ c #D1D1D1",
+"{ c #E6E6E6",
+"] c #B3B3B3",
+"^ c #B0B0B0",
+"/ c #C0C0C0",
+"( c #CBCBCB",
+"_ c #B5B5B5",
+": c #DCDCDC",
+"< c #DBDBDB",
+"[ c #E4E4E4",
+"} c #2A2A2A",
+"| c #1E1E1E",
+"1 c #C2C2C2",
+"2 c #D3D3D3",
+"3 c #4E4E4E",
+"4 c #252525",
+"5 c #EAEAEA",
+"6 c #D7D7D7",
+"7 c #CCCCCC",
+"................",
+".++++++++++++++.",
+".+@@@@#$#@@@@@+.",
+".+@@@#%%#@@@@@+.",
+".+&@#%%%#####@+.",
+".+&*%%%%%%=$#@+.",
+".+&-%%%%%%%%;>,.",
+".+@@#%%%');%!~,.",
+".+@@{]%%']^%%]+.",
+".+@@@@]$/(_=%/+.",
+".+@@@:<]##;%=@+.",
+".+@@[}|%%%%=!1+.",
+".+@@234%%!$$]@+.",
+".+@@@5677777@{+.",
+".++++++++++++++.",
+"................"};
diff --git a/muse/muse/xpm/midi_transform.xpm b/muse/muse/xpm/midi_transform.xpm
new file mode 100644
index 00000000..d354191f
--- /dev/null
+++ b/muse/muse/xpm/midi_transform.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static const char * midi_transform_xpm[] = {
+"16 16 11 1",
+" c None",
+". c #58A8FF",
+"+ c #A8DCFF",
+"@ c #363636",
+"# c #FFFFFF",
+"$ c #CACACA",
+"% c #626262",
+"& c #000000",
+"* c #85AECA",
+"= c #010101",
+"- c #4685CA",
+"................",
+".+++++++++@@+++.",
+".+##@#####@@##+.",
+".+##@$####@@##+.",
+".+##@$####@@##+.",
+".+#%&%##%@&&@%+.",
+".+#%&%$#%@&&@%*.",
+".+#%&%$#%@&&@%*.",
+".+#%&%$#%@&&@%*.",
+".+##&$$#%@&&@%*.",
+".+#&=$##%@&&@%*.",
+".+&&$$###$=&$$*.",
+".&&$$####&&&$#+.",
+"&&$$####&&&$$#+.",
+"&**++++&&&**+++.",
+"--....&&&--....."};
diff --git a/muse/muse/xpm/midi_transpose.xpm b/muse/muse/xpm/midi_transpose.xpm
new file mode 100644
index 00000000..0fdf5ac0
--- /dev/null
+++ b/muse/muse/xpm/midi_transpose.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static const char * midi_transpose_xpm[] = {
+"16 16 12 1",
+" c None",
+". c #58A8FF",
+"+ c #000000",
+"@ c #A8DCFF",
+"# c #FFFFFF",
+"$ c #CACACA",
+"% c #797C7E",
+"& c #808080",
+"* c #545454",
+"= c #7E7F7F",
+"- c #6F91A8",
+"; c #3A6FA8",
+"......+.........",
+".@@@@++@@@@@@@@.",
+".@##+++#######@.",
+".@#++$+$######@.",
+".@#+$$+$##++##@.",
+".@##$#+$#++++#@.",
+".%&&&&+*&++++*=.",
+".@####+$#+++$$@.",
+".@##+++$#+$$$#@.",
+".@#++++$#+$###@.",
+".&&++++*&+*&&&&.",
+".@##++$$#+$#+#@.",
+".@###$$##+$++$@.",
+".@#######+++$$@.",
+".@@@@@@@@++--@@.",
+".........+;;...."};
diff --git a/muse/muse/xpm/midiin.xpm b/muse/muse/xpm/midiin.xpm
new file mode 100644
index 00000000..15b906ac
--- /dev/null
+++ b/muse/muse/xpm/midiin.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char* midiin_xpm[] ={
+"18 18 2 1",
+". c None",
+"# c #000000",
+"......#####.......",
+"....##.....##.....",
+"...#...##....#....",
+"..#....##.....#...",
+".#..##.....##..#..",
+".#..##.....##..#..",
+"#...............#.",
+"#...............#.",
+"#..##.......##..#.",
+"#..##.......##..#.",
+"#...............#.",
+".#....#####....#..",
+".#....#####....#..",
+"..#...##.##...#...",
+"...#.........#....",
+"....##.....##.....",
+"......#####.......",
+".................."};
diff --git a/muse/muse/xpm/miditransformS.xpm b/muse/muse/xpm/miditransformS.xpm
new file mode 100644
index 00000000..3e43e097
--- /dev/null
+++ b/muse/muse/xpm/miditransformS.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *miditransformS_xpm[]={
+"16 16 3 1",
+"a c #303030",
+". c #58a8ff",
+"# c #ffffff",
+"................",
+"................",
+"..###aaaaaa###..",
+"..##a######a##..",
+"..#a###aa###a#..",
+"..a####aa####a..",
+"..a#aa####aa#a..",
+"..a#aa####aa#a..",
+"..a##########a..",
+"..a#aa####aa#a..",
+"..a#aa####aa#a..",
+"..#a########a#..",
+"..##a######a##..",
+"..###aaaaaa###..",
+"................",
+"................"};
diff --git a/muse/muse/xpm/miditransposeS.xpm b/muse/muse/xpm/miditransposeS.xpm
new file mode 100644
index 00000000..fa4593f4
--- /dev/null
+++ b/muse/muse/xpm/miditransposeS.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static const char *miditransposeS_xpm[]={
+"16 16 6 1",
+"a c #303030",
+". c #58a8ff",
+"c c #800000",
+"b c #ff0000",
+"d c #ffc0c0",
+"# c #ffffff",
+"................",
+"................",
+"..###aaaaab###..",
+"..##a#####bb##..",
+"..#a###aa#bbb#..",
+"..a####aa#bbbb..",
+"..a#aabbbbccbbb.",
+"..a#aabbbbccbbb.",
+"..a###bb##bbbbd.",
+"..a#aabb##ccbd..",
+"..a#aabb##ccda..",
+"..#a##bb##bda#..",
+"..##a#bb##da##..",
+"..###abbaaa###..",
+"......bb........",
+"................"};
diff --git a/muse/muse/xpm/minus.xpm b/muse/muse/xpm/minus.xpm
new file mode 100644
index 00000000..7533722a
--- /dev/null
+++ b/muse/muse/xpm/minus.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char * minus_xpm[] = {
+"16 16 5 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #DCDCDC",
+"# c #A0A0A4",
+" ",
+" ..... ",
+" ..+++++.. ",
+" .++@@@@@@@. ",
+" .+@@@@@@@@. ",
+" .+@@@@@@@@@#. ",
+" .+@@@@@@@@@#. ",
+" .+@.......@#. ",
+" .+@@@@@@@@@#. ",
+" .+@@@@@@@@@#. ",
+" .@@@@@@@@#. ",
+" .@@@@@@@##. ",
+" ..#####.. ",
+" ..... ",
+" ",
+" "};
diff --git a/muse/muse/xpm/mixerS.xpm b/muse/muse/xpm/mixerS.xpm
new file mode 100644
index 00000000..b7b19735
--- /dev/null
+++ b/muse/muse/xpm/mixerS.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mixerS_xpm[] = {
+"16 16 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" . . . . ",
+" ... . ... . ",
+" ... . ... . ",
+" . . . . ",
+" . . . ... ",
+" . . . ... ",
+" . . . . ",
+" . . . . ",
+" . ... . . ",
+" . ... . . ",
+" ",
+" ",
+" "};
diff --git a/muse/muse/xpm/mixeraudioS.xpm b/muse/muse/xpm/mixeraudioS.xpm
new file mode 100644
index 00000000..bc02fc72
--- /dev/null
+++ b/muse/muse/xpm/mixeraudioS.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *mixerAudioS_xpm[]={
+"16 16 3 1",
+"a c #000000",
+". c #ff00ff",
+"# c #ffffff",
+"................",
+"................",
+"..############..",
+"..#a##a##a##a#..",
+"..aaa#a#aaa#a#..",
+"..aaa#a#aaa#a#..",
+"..#a##a##a##a#..",
+"..#a##a##a#aaa..",
+"..#a##a##a#aaa..",
+"..#a##a##a##a#..",
+"..#a#aaa#a##a#..",
+"..#a#aaa#a##a#..",
+"..############..",
+"..############..",
+"................",
+"................"};
diff --git a/muse/muse/xpm/mono.xpm b/muse/muse/xpm/mono.xpm
new file mode 100644
index 00000000..9acebb58
--- /dev/null
+++ b/muse/muse/xpm/mono.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static const char *mono_xpm[] = {
+"15 9 2 1",
+" c #303030",
+". c none",
+/* pixels */
+"..... .....",
+".... ....",
+"... ... ...",
+"... ..... ...",
+"... ..... ...",
+"... ..... ...",
+"... ... ...",
+".... ....",
+"..... ....."
+};
diff --git a/muse/muse/xpm/muse_icon.xpm b/muse/muse/xpm/muse_icon.xpm
new file mode 100644
index 00000000..a7621e34
--- /dev/null
+++ b/muse/muse/xpm/muse_icon.xpm
@@ -0,0 +1,411 @@
+/* XPM */
+static const char * muse_icon_xpm[] = {
+"32 32 376 2",
+" c None",
+". c #616161",
+"+ c #626262",
+"@ c #8E4B33",
+"# c #7C7B65",
+"$ c #C6C4A3",
+"% c #9F984E",
+"& c #B46C17",
+"* c #E6A34D",
+"= c #EBB268",
+"- c #E59F3C",
+"; c #BC7A1B",
+"> c #AB741E",
+", c #B6AB8B",
+"' c #E5E3B8",
+") c #C4C07B",
+"! c #BAAC17",
+"~ c #778E33",
+"{ c #87877C",
+"] c #DA9235",
+"^ c #E9B168",
+"/ c #E9B97A",
+"( c #E9AD5E",
+"_ c #E8A855",
+": c #E08B1D",
+"< c #75584E",
+"[ c #636363",
+"} c #BF8E48",
+"| c #EBDEB6",
+"1 c #ECE9BB",
+"2 c #C4BC75",
+"3 c #D2981B",
+"4 c #B57614",
+"5 c #6C6C6C",
+"6 c #6B6B6B",
+"7 c #979560",
+"8 c #FAFADD",
+"9 c #F7F6E4",
+"0 c #E3DAC2",
+"a c #CEBC9F",
+"b c #D59E56",
+"c c #E69E41",
+"d c #E0A045",
+"e c #9D794A",
+"f c #6A6A6A",
+"g c #696969",
+"h c #666666",
+"i c #646464",
+"j c #BE791F",
+"k c #D2BF9B",
+"l c #FDF9CE",
+"m c #E2E0B1",
+"n c #C2BC5D",
+"o c #C6941B",
+"p c #D1821C",
+"q c #B76F1A",
+"r c #6D6D6D",
+"s c #A7A164",
+"t c #C7C38F",
+"u c #C5C074",
+"v c #C5C06E",
+"w c #C5C380",
+"x c #CDCAA2",
+"y c #C9C09E",
+"z c #C5A772",
+"A c #E29A3D",
+"B c #E1AA5C",
+"C c #C89347",
+"D c #6F6A68",
+"E c #957548",
+"F c #C4A471",
+"G c #F6EBC1",
+"H c #F3F1C2",
+"I c #CDCB9C",
+"J c #C6BE3B",
+"K c #B8C300",
+"L c #CA8119",
+"M c #D4831B",
+"N c #BC7315",
+"O c #6E6E6E",
+"P c #6F6F6F",
+"Q c #717171",
+"R c #B7B342",
+"S c #E5DD18",
+"T c #EBE30C",
+"U c #E2DA11",
+"V c #E3DB0E",
+"W c #E0D521",
+"X c #CBC650",
+"Y c #C6C38D",
+"Z c #C7C19F",
+"` c #C29B63",
+" . c #E0A44F",
+".. c #DEAA5F",
+"+. c #D8953F",
+"@. c #CEA25D",
+"#. c #E7D7AC",
+"$. c #F7F4C8",
+"%. c #DDDAAA",
+"&. c #B5AE36",
+"*. c #6A6D62",
+"=. c #8C643D",
+"-. c #DA8B1B",
+";. c #727272",
+">. c #737373",
+",. c #A69F55",
+"'. c #BDB53E",
+"). c #EAE30F",
+"!. c #C1BB16",
+"~. c #7C784F",
+"{. c #ABA13C",
+"]. c #CEC533",
+"^. c #DDDBB0",
+"/. c #E0DBBD",
+"(. c #E6DBBB",
+"_. c #F2E9C5",
+":. c #FAFACF",
+"<. c #E3E0B0",
+"[. c #C5C180",
+"}. c #CCC333",
+"|. c #8F8B4E",
+"1. c #686868",
+"2. c #A8702D",
+"3. c #D7861E",
+"4. c #CC7F1B",
+"5. c #B77813",
+"6. c #747474",
+"7. c #AEAA3F",
+"8. c #B7AA10",
+"9. c #9F9C48",
+"0. c #C3BC4C",
+"a. c #D0CD9D",
+"b. c #CDCA9A",
+"c. c #CFC634",
+"d. c #A8A23D",
+"e. c #B17126",
+"f. c #CE7C1B",
+"g. c #C07719",
+"h. c #AF5A16",
+"i. c #BFB730",
+"j. c #D5CF28",
+"k. c #A6411D",
+"l. c #777664",
+"m. c #7C7C7C",
+"n. c #7B7B7B",
+"o. c #797979",
+"p. c #777777",
+"q. c #8A8761",
+"r. c #A39E4A",
+"s. c #A5A148",
+"t. c #91915A",
+"u. c #73746F",
+"v. c #9F692A",
+"w. c #B77210",
+"x. c #C13200",
+"y. c #C9C430",
+"z. c #C4BB31",
+"A. c #A7621E",
+"B. c #8D8A5C",
+"C. c #7A7A7A",
+"D. c #787878",
+"E. c #757575",
+"F. c #C6801D",
+"G. c #CCC337",
+"H. c #BDAF34",
+"I. c #B2771B",
+"J. c #928E63",
+"K. c #767676",
+"L. c #707070",
+"M. c #8D734E",
+"N. c #C2B669",
+"O. c #BDB048",
+"P. c #A29B45",
+"Q. c #968E3B",
+"R. c #7F7248",
+"S. c #CCC43B",
+"T. c #C2B635",
+"U. c #BF971E",
+"V. c #81826D",
+"W. c #BC9E4D",
+"X. c #C8C25D",
+"Y. c #CFC746",
+"Z. c #DFD424",
+"`. c #D6CB1F",
+" + c #6B754E",
+".+ c #CDC538",
+"++ c #C9BA36",
+"@+ c #BF9D28",
+"#+ c #997448",
+"$+ c #C0B65F",
+"%+ c #CEC949",
+"&+ c #D9CF30",
+"*+ c #EADD0B",
+"=+ c #A49D2B",
+"-+ c #CFC632",
+";+ c #CDC13C",
+">+ c #BF9B2C",
+",+ c #B29743",
+"'+ c #CAC355",
+")+ c #D4CE3B",
+"!+ c #E7E016",
+"~+ c #EEE609",
+"{+ c #C2BC19",
+"]+ c #CDC42E",
+"^+ c #CEC343",
+"/+ c #C09B2B",
+"(+ c #95764A",
+"_+ c #C6B44F",
+":+ c #D1C840",
+"<+ c #DDD328",
+"[+ c #D9D110",
+"}+ c #656565",
+"|+ c #C5BC2E",
+"1+ c #D3CA3C",
+"2+ c #C6A32B",
+"3+ c #7C7B5F",
+"4+ c #BA9337",
+"5+ c #CDC54A",
+"6+ c #D8CE31",
+"7+ c #E7DF0A",
+"8+ c #867C47",
+"9+ c #B7AC34",
+"0+ c #D8D231",
+"a+ c #C8AA2F",
+"b+ c #8B8754",
+"c+ c #676767",
+"d+ c #9D7940",
+"e+ c #C6B949",
+"f+ c #D6CC35",
+"g+ c #E5D918",
+"h+ c #ABA32C",
+"i+ c #9E9945",
+"j+ c #CFBB34",
+"k+ c #977F46",
+"l+ c #837056",
+"m+ c #B99A3C",
+"n+ c #D2C93F",
+"o+ c #DFD824",
+"p+ c #CCC617",
+"q+ c #7C7C5B",
+"r+ c #E4D819",
+"s+ c #D4CB37",
+"t+ c #B27A2B",
+"u+ c #A47A39",
+"v+ c #CCC441",
+"w+ c #DAD02D",
+"x+ c #DED20F",
+"y+ c #756E58",
+"z+ c #D8CD17",
+"A+ c #DCD629",
+"B+ c #C99F2C",
+"C+ c #80744D",
+"D+ c #976E3E",
+"E+ c #C0AF3B",
+"F+ c #E8DB15",
+"G+ c #EAE20B",
+"H+ c #989B34",
+"I+ c #BFB622",
+"J+ c #E5D91A",
+"K+ c #D4BE2D",
+"L+ c #BC7C21",
+"M+ c #73625C",
+"N+ c #AF8E36",
+"O+ c #D3CA3A",
+"P+ c #BFBA1E",
+"Q+ c #847C4B",
+"R+ c #E7DB10",
+"S+ c #DCD129",
+"T+ c #C89025",
+"U+ c #AB742C",
+"V+ c #A1793A",
+"W+ c #E0D523",
+"X+ c #EADD0F",
+"Y+ c #D3CD16",
+"Z+ c #D3C812",
+"`+ c #E8DB13",
+" @ c #CD7F1A",
+".@ c #A78034",
+"+@ c #6A6D60",
+"@@ c #8A7451",
+"#@ c #C4B941",
+"$@ c #E8E013",
+"%@ c #77755E",
+"&@ c #89864A",
+"*@ c #E9DC0E",
+"=@ c #C4AC57",
+"-@ c #DD8E28",
+";@ c #C3A358",
+">@ c #ADA86E",
+",@ c #8F8E78",
+"'@ c #8C7E69",
+")@ c #BEB591",
+"!@ c #DBD8A8",
+"~@ c #DCD127",
+"{@ c #95944A",
+"]@ c #B7AF30",
+"^@ c #DDD728",
+"/@ c #C6C06B",
+"(@ c #C7B17C",
+"_@ c #DC963B",
+":@ c #D99A38",
+"<@ c #B6AC75",
+"[@ c #BDB592",
+"}@ c #E8E6B5",
+"|@ c #D8D6A7",
+"1@ c #C6C367",
+"2@ c #AFA946",
+"3@ c #6F716A",
+"4@ c #CCC625",
+"5@ c #D5CF38",
+"6@ c #C5C384",
+"7@ c #DBD0A4",
+"8@ c #D3A966",
+"9@ c #C3AF7A",
+"0@ c #DCD9AB",
+"a@ c #C3BB3E",
+"b@ c #757671",
+"c@ c #7E7E7E",
+"d@ c #7F7F7F",
+"e@ c #7D7D7D",
+"f@ c #717467",
+"g@ c #D4C521",
+"h@ c #C5C288",
+"i@ c #EFECC6",
+"j@ c #EFEED0",
+"k@ c #C2C0A1",
+"l@ c #B4AE6F",
+"m@ c #C4A92F",
+"n@ c #A77D3A",
+"o@ c #837766",
+"p@ c #818181",
+"q@ c #838383",
+"r@ c #707366",
+"s@ c #D0C621",
+"t@ c #C5C078",
+"u@ c #E1DEB2",
+"v@ c #C6BBA1",
+"w@ c #DA9945",
+"x@ c #DE9639",
+"y@ c #E19426",
+"z@ c #D4881B",
+"A@ c #937C5E",
+"B@ c #808080",
+"C@ c #858585",
+"D@ c #888888",
+"E@ c #696D5C",
+"F@ c #D0C50B",
+"G@ c #D8D21F",
+"H@ c #B2A945",
+"I@ c #AB7622",
+"J@ c #A57536",
+"K@ c #746863",
+"L@ c #848484",
+"M@ c #828282",
+"N@ c #8B8B8B",
+"O@ c #8E8E8E",
+"P@ c #919191",
+"Q@ c #959595",
+"R@ c #979797",
+"S@ c #898989",
+"T@ c #878787",
+"U@ c #868686",
+"V@ c #8C8C8C",
+"W@ c #9A9A9A",
+"X@ c #9E9E9E",
+"Y@ c #A3A3A3",
+"Z@ c #A8A8A8",
+"`@ c #ABABAB",
+" # c #A0A0A0",
+".# c #989898",
+"+# c #9C9C9C",
+"@# c #969696",
+"## c #949494",
+"$# c #939393",
+"%# c #9B9B9B",
+"&# c #8F8F8F",
+". . . . . . . . . . . . . . . . . . . . . . . . . . + + . . . . ",
+". . . . . . . . @ . . . . . . . . . . . . . . . . # $ % . . . . ",
+". . . . . . & * = - ; . . . . . . . . . . . . > , ' ) ! . . . . ",
+". . . . ~ { ] ^ / ( _ : < [ [ + . . . . . . } | 1 2 3 4 . . . . ",
+"5 5 5 6 7 8 9 0 a b c * d e 5 6 f g h i j k l m n o p q . . . . ",
+"r r r 5 s t u v w x y z A B C D 5 f E F G H I J K L M N . . . . ",
+"O O P Q R S T U V W X Y Z ` ...+.@.#.$.%.v &.*.=.-.p q . . . . ",
+"P ;.;.>.,.'.).!.. ~.{.].u ^./.(._.:.<.[.}.|.1.5 2.3.4.5.. . . . ",
+"Q ;.;.>.6.7.S 8.i ;.Q Q 9.0.[.a.b.u c.d.*.r r 5 e.f.g.h.. . . . ",
+"Q ;.;.>.6.i.j.k.l.m.n.n.o.p.q.r.s.t.u.P r O 5 6 v.N w.x.+ + . . ",
+"Q ;.;.>.6.y.z.A.B.m.m.C.n.o.D.p.E.6.;.;.Q P r 6 F.A.. + + + + + ",
+"Q Q ;.;.>.G.H.I.J.C.o.n.o.D.p.K.E.6.;.Q L.P r M.N.O.P.Q.R.+ + + ",
+"Q Q Q ;.;.S.T.U.V.D.o.p.o.p.K.E.6.>.;.Q P 5 5 W.X.Y.Z.S `. ++ + ",
+"L.L.Q Q Q .+++@+>.>.;.>.>.K.K.6.>.;.Q P O 5 #+$+%+&+T *+=+[ + + ",
+"P P L.Q Q -+;+>+Q 5 Q Q ;.Q ;.>.;.Q L.P O r ,+'+)+!+~+{+i i [ + ",
+"P P P P L.]+^+/+O g 5 L.P Q L.L.Q L.P O r (+_+:+<+~+[+}+i i [ [ ",
+"P O O P P |+1+2+3+1.g O P P P O O P O r D 4+5+6+).7+8+}+i i i [ ",
+"O r O O O 9+0+a+b+c+1.f 5 O O r 5 5 r 5 d+e+f+g+~+h+}+}+i i [ [ ",
+"O 5 r r r i+<+j+k+c+c+g f f 5 5 5 6 6 l+m+n+o+~+p+h }+}+i i [ [ ",
+"r 5 5 5 5 q+r+s+t+c+c+c+g g g g f f f u+v+w+).x+y+}+}+i i [ [ [ ",
+"r 6 6 6 5 g z+A+B+C+h h 1.1.g 1.c+c+D+E+6+F+G+H+i i i [ i i i i ",
+"5 f f f 6 1.I+J+K+L+}+}+h 1.c+c+c+M+N+O+W ~+P+h c+c+c+c+c+h h }+",
+"5 g f f f 1.Q+R+S+T+U+}+}+c+c+h c+V+;+W+X+Y+g f f f f g g 1.c+c+",
+"5 g g g f c+c+Z+`+K+ @.@+@g f 5 @@#@S+$@V %@f f g f 6 6 f g g 1.",
+"6 1.1.g g c+h &@*@6+=@-@;@>@,@'@)@!@[.~@{@r 5 r 5 5 O O 6 6 f f ",
+"6 f 5 P Q O 5 5 ]@^@/@(@_@:@<@[@}@|@1@2@>.;.;.Q ;.O O f f f f f ",
+"K.D.p.p.D.K.5 O 3@4@5@6@7@8@9@m 0@[.a@b@K.6.6.;.;.L.O 5 6 f f g ",
+"D.n.c@d@c@e@K.O 5 f@g@:+h@i@j@k@l@m@n@o@>.6.6.6.6.;.Q L.P P 6 f ",
+"p.o.n.c@p@q@p@n.E.P r@s@5@t@u@v@w@x@y@z@A@B@d@n.D.K.6.;.Q L.O r ",
+"C.m.c@B@q@C@D@D@q@o.Q E@F@G@H@I@L J@K@;.6.o.L@d@d@m.m.n.o.o.p.K.",
+"e@d@M@L@D@N@O@P@Q@R@P@S@m.5 + g [ h ;.m.p@T@N@S@D@U@L@p@d@m.n.o.",
+"B@q@U@S@V@P@Q@W@X@Y@Z@`@Z@ #.#+#.#@###$#W@%#.#$#&#N@D@L@M@d@e@n."};
diff --git a/muse/muse/xpm/muse_icon_64x64.png b/muse/muse/xpm/muse_icon_64x64.png
new file mode 100644
index 00000000..5a1acb96
--- /dev/null
+++ b/muse/muse/xpm/muse_icon_64x64.png
Binary files differ
diff --git a/muse/muse/xpm/mustangS.xpm b/muse/muse/xpm/mustangS.xpm
new file mode 100644
index 00000000..e4e6be03
--- /dev/null
+++ b/muse/muse/xpm/mustangS.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char *mustangS_xpm[]={
+"16 16 4 1",
+"# c #000000",
+". c #c00000",
+"b c #c3c3c3",
+"a c #ffffff",
+"...#...#........",
+"...###.#........",
+"..aa##a##aaaaa..",
+"..a#b####aaaaa..",
+"..#b####aaaaaa..",
+".#b######baaaa..",
+".#####bb###aaa..",
+".###########aa..",
+".############a..",
+".#############..",
+".#####a#####b#..",
+".#####aaa#####..",
+".#####aaaaa##a..",
+".####aaaaaaaaa..",
+".####...........",
+"................"};
diff --git a/muse/muse/xpm/mute.xpm b/muse/muse/xpm/mute.xpm
new file mode 100644
index 00000000..c172cfc6
--- /dev/null
+++ b/muse/muse/xpm/mute.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static const char * mute_xpm[] = {
+"12 12 3 1",
+" c None",
+". c #F50E0E",
+"+ c #000000",
+". + .",
+" . +++. ",
+" . +++. ",
+" . ++ .+ ",
+" ++.+ .++ ",
+" +++.. ++ ",
+" +++.. ++ ",
+" ++.+ .++ ",
+" . ++ .+ ",
+" . +++. ",
+" . +++. ",
+". + ."};
diff --git a/muse/muse/xpm/mutebutton_off.xpm b/muse/muse/xpm/mutebutton_off.xpm
new file mode 100644
index 00000000..37c50f1c
--- /dev/null
+++ b/muse/muse/xpm/mutebutton_off.xpm
@@ -0,0 +1,165 @@
+/* XPM */
+static const char * mutebutton_off_xpm[] = {
+"22 22 140 2",
+" c #000000",
+". c #720000",
+"+ c #7B0000",
+"@ c #810000",
+"# c #840000",
+"$ c #870000",
+"% c #8D0000",
+"& c #930000",
+"* c #980000",
+"= c #9C0000",
+"- c #9B0000",
+"; c #970000",
+"> c #900000",
+", c #8C0000",
+"' c #850000",
+") c #800000",
+"! c #760000",
+"~ c #730000",
+"{ c #710000",
+"] c #770000",
+"^ c #A10000",
+"/ c #A90000",
+"( c #AE0000",
+"_ c #B10000",
+": c #B60000",
+"< c #B50000",
+"[ c #B30000",
+"} c #AC0000",
+"| c #A70000",
+"1 c #9E0000",
+"2 c #8F0000",
+"3 c #890000",
+"4 c #7F0000",
+"5 c #7A0000",
+"6 c #7C0000",
+"7 c #8E0000",
+"8 c #A00000",
+"9 c #AD0000",
+"0 c #B80000",
+"a c #C00000",
+"b c #C60000",
+"c c #C80000",
+"d c #CB0000",
+"e c #C70000",
+"f c #BB0000",
+"g c #B20000",
+"h c #A30000",
+"i c #960000",
+"j c #860000",
+"k c #920000",
+"l c #BA0000",
+"m c #C50000",
+"n c #CE0000",
+"o c #D40000",
+"p c #D80000",
+"q c #D70000",
+"r c #DA0000",
+"s c #D10000",
+"t c #C90000",
+"u c #C30000",
+"v c #B40000",
+"w c #A40000",
+"x c #910000",
+"y c #7D0000",
+"z c #950000",
+"A c #AB0000",
+"B c #BD0000",
+"C c #CC0000",
+"D c #D60000",
+"E c #DF0000",
+"F c #E30000",
+"G c #E10000",
+"H c #DC0000",
+"I c #D00000",
+"J c #C20000",
+"K c #BC0000",
+"L c #A50000",
+"M c #AF0000",
+"N c #E40000",
+"O c #E70000",
+"P c #E60000",
+"Q c #3F3F3F",
+"R c #DD0200",
+"S c #D90300",
+"T c #D40200",
+"U c #CD0000",
+"V c #B90000",
+"W c #AA0000",
+"X c #9A0000",
+"Y c #D20000",
+"Z c #D90000",
+"` c #DE0000",
+" . c #E20000",
+".. c #3B3B3B",
+"+. c #313131",
+"@. c #E00300",
+"#. c #DD0300",
+"$. c #D10100",
+"%. c #A80000",
+"&. c #880000",
+"*. c #C40000",
+"=. c #454545",
+"-. c #E40200",
+";. c #E10300",
+">. c #DC0100",
+",. c #D50100",
+"'. c #D50000",
+"). c #121212",
+"!. c #E90000",
+"~. c #CA0000",
+"{. c #4C4C4C",
+"]. c #525252",
+"^. c #1E0700",
+"/. c #E80000",
+"(. c #BE0000",
+"_. c #030A1D",
+":. c #000F00",
+"<. c #7E0000",
+"[. c #CF0000",
+"}. c #DB0000",
+"|. c #0B0017",
+"1. c #000700",
+"2. c #BF0000",
+"3. c #DD0000",
+"4. c #D30000",
+"5. c #990000",
+"6. c #B00000",
+"7. c #C10000",
+"8. c #E00000",
+"9. c #940000",
+"0. c #7A0100",
+"a. c #A60000",
+"b. c #9D0000",
+"c. c #9D0101",
+"d. c #7B0200",
+"e. c #8C0100",
+"f. c #9E0101",
+"g. c #8F0101",
+"h. c #7F0101",
+"i. c #720101",
+" ",
+" . + @ # $ % & & * = - ; > , ' ) + ! ~ { ",
+" ] $ & - ^ / ( _ : < [ } | 1 * 2 3 # 4 5 ",
+" 6 7 8 9 0 a b b c d e a f g / h - i 7 j ",
+" 6 k | l m n o p q r q s t u f v 9 w - x ",
+" y z A B C D r E F F G H q I d J K g L z ",
+" ) * M J n D H E N O P Q R S T U m V W i ",
+" # X _ u C Y Z ` .P ..+.@.#.S $.t f %.& ",
+" &.8 : *.n Y p r E Q =. -.;.>.,.C f L % ",
+" % L l c n '.Z r Q Q ). !.P F q d 0 ^ 3 ",
+" > / K ~.s p Q {.].).^. /./.F p ~.< - @ ",
+" > / (.U q H Q +. _.:. P /. .Z t g X <. ",
+" x %.(.[.q }.+. |.1. E F ` p t [ i 6 ",
+" 2 %.2.U '.}. 3.3.}.q c _ i y ",
+" % w f d 4.p }.D r H 3.q t g i <. ",
+" &.8 : c I 4.D 4.s H E ` D e g ; <. ",
+" # 5.6.7.~.U n n U n H 8.3.o e 6.; <. ",
+" 4 & / l a J m e t c n r }.Z n J 9 9.y ",
+" 0.x h g l f 2.(.a m t U 4.4.I c f a.> + ",
+" 0.% b.W M [ [ v 0 f 2.u e b u l 6.c.$ ! ",
+" d.e.5.8 a.L L a.W A 6.[ < v M %.f.g.h.i. ",
+" "};
diff --git a/muse/muse/xpm/mutebutton_on.xpm b/muse/muse/xpm/mutebutton_on.xpm
new file mode 100644
index 00000000..d66647d5
--- /dev/null
+++ b/muse/muse/xpm/mutebutton_on.xpm
@@ -0,0 +1,352 @@
+/* XPM */
+static const char * mutebutton_on_xpm[] = {
+"22 22 327 2",
+" c #000000",
+". c #066714",
+"+ c #056613",
+"@ c #076915",
+"# c #076A15",
+"$ c #076A16",
+"% c #086B17",
+"& c #096C18",
+"* c #066B15",
+"= c #066B14",
+"- c #076F17",
+"; c #0C751C",
+"> c #107B20",
+", c #0F7C1F",
+"' c #0D791D",
+") c #097318",
+"! c #066E15",
+"~ c #066C14",
+"{ c #066814",
+"] c #086B16",
+"^ c #0A6F19",
+"/ c #0B711A",
+"( c #0B721B",
+"_ c #0C731C",
+": c #0C731B",
+"< c #0A731A",
+"[ c #097219",
+"} c #077318",
+"| c #0A781B",
+"1 c #0E7E1F",
+"2 c #118522",
+"3 c #128722",
+"4 c #0F8321",
+"5 c #0B7D1B",
+"6 c #077517",
+"7 c #067016",
+"8 c #056713",
+"9 c #066914",
+"0 c #086D17",
+"a c #0A721A",
+"b c #0F771E",
+"c c #107A20",
+"d c #117D21",
+"e c #127E21",
+"f c #117F21",
+"g c #0E7D1F",
+"h c #0D801E",
+"i c #0F8620",
+"j c #128F25",
+"k c #159627",
+"l c #169828",
+"m c #159427",
+"n c #0F8B21",
+"o c #0B821C",
+"p c #087718",
+"q c #086E17",
+"r c #0B731A",
+"s c #0F791F",
+"t c #138223",
+"u c #168727",
+"v c #188A29",
+"w c #178D28",
+"x c #168D27",
+"y c #158C26",
+"z c #128D25",
+"A c #129125",
+"B c #313131",
+"C c #17A22B",
+"D c #19AA2D",
+"E c #1AAC2E",
+"F c #19A82C",
+"G c #159E29",
+"H c #119122",
+"I c #0C831D",
+"J c #066D15",
+"K c #0A7119",
+"L c #0C7A1D",
+"M c #118323",
+"N c #178D29",
+"O c #1B952E",
+"P c #1B9C2E",
+"Q c #1A9E2E",
+"R c #199C2B",
+"S c #3F3F3F",
+"T c #189E2B",
+"U c #17A32C",
+"V c #18AC2E",
+"W c #222222",
+"X c #1CC033",
+"Y c #1DC334",
+"Z c #1BBE32",
+"` c #18B22F",
+" . c #16A22A",
+".. c #129025",
+"+. c #097519",
+"@. c #0F801F",
+"#. c #158E27",
+"$. c #1A992E",
+"%. c #1DA633",
+"&. c #1EAD35",
+"*. c #1CAE32",
+"=. c #3B3B3B",
+"-. c #19AF2F",
+";. c #1ABE32",
+">. c #1CC835",
+",. c #1DD537",
+"'. c #1DCF37",
+"). c #1CC335",
+"!. c #19B130",
+"~. c #179C2A",
+"{. c #067015",
+"]. c #097A1A",
+"^. c #108922",
+"/. c #17982A",
+"(. c #1CA831",
+"_. c #1DB636",
+":. c #1DBB35",
+"<. c #454545",
+"[. c #1ABD31",
+"}. c #1AC332",
+"|. c #1BD435",
+"1. c #1BDE37",
+"2. c #1CDA38",
+"3. c #1DD038",
+"4. c #1BB832",
+"5. c #19A22D",
+"6. c #067215",
+"7. c #0A7F1B",
+"8. c #119124",
+"9. c #18A22D",
+"0. c #1BB635",
+"a. c #1BC336",
+"b. c #121212",
+"c. c #18C833",
+"d. c #18CC33",
+"e. c #19D934",
+"f. c #1AE236",
+"g. c #1BDF37",
+"h. c #1CD136",
+"i. c #1CBD35",
+"j. c #19A42E",
+"k. c #087618",
+"l. c #0B821D",
+"m. c #129725",
+"n. c #4C4C4C",
+"o. c #525252",
+"p. c #1E0700",
+"q. c #19CE33",
+"r. c #17D232",
+"s. c #18DA34",
+"t. c #19E036",
+"u. c #070707",
+"v. c #19DB36",
+"w. c #1ACF36",
+"x. c #1BBB33",
+"y. c #1AA22E",
+"z. c #087818",
+"A. c #0C861E",
+"B. c #129B26",
+"C. c #18B12F",
+"D. c #030A1D",
+"E. c #000F00",
+"F. c #17D231",
+"G. c #17D733",
+"H. c #18DB35",
+"I. c #19D534",
+"J. c #1ACB34",
+"K. c #1AB832",
+"L. c #199F2D",
+"M. c #087918",
+"N. c #0D891F",
+"O. c #129C26",
+"P. c #17B22F",
+"Q. c #0B0017",
+"R. c #000700",
+"S. c #16D230",
+"T. c #16D531",
+"U. c #16D731",
+"V. c #010101",
+"W. c #19D034",
+"X. c #18C432",
+"Y. c #19B230",
+"Z. c #169A2A",
+"`. c #087A19",
+" + c #0D881F",
+".+ c #139C27",
+"++ c #17AF2D",
+"@+ c #17CF30",
+"#+ c #14CF2F",
+"$+ c #14D130",
+"%+ c #15D330",
+"&+ c #16CC31",
+"*+ c #18C132",
+"=+ c #18B02E",
+"-+ c #159828",
+";+ c #0A7A1A",
+">+ c #149C27",
+",+ c #17AE2D",
+"'+ c #18BB31",
+")+ c #18C232",
+"!+ c #16CD31",
+"~+ c #14CC2F",
+"{+ c #14CE30",
+"]+ c #14CD2F",
+"^+ c #17CA31",
+"/+ c #15BF2F",
+"(+ c #15AE2B",
+"_+ c #129624",
+":+ c #0E8821",
+"<+ c #17AD2E",
+"[+ c #18BA31",
+"}+ c #19C331",
+"|+ c #17C730",
+"1+ c #15CC30",
+"2+ c #15CA30",
+"3+ c #14CB2E",
+"4+ c #15CD2F",
+"5+ c #14C72E",
+"6+ c #14BD2C",
+"7+ c #11AD29",
+"8+ c #0F9423",
+"9+ c #0B7B1A",
+"0+ c #0F8720",
+"a+ c #139B26",
+"b+ c #16AA2B",
+"c+ c #17B82D",
+"d+ c #17C130",
+"e+ c #17C72F",
+"f+ c #15CB30",
+"g+ c #16C730",
+"h+ c #15C82F",
+"i+ c #12C82B",
+"j+ c #11C52C",
+"k+ c #10BA29",
+"l+ c #0FA825",
+"m+ c #0C9020",
+"n+ c #0B791C",
+"o+ c #0D871F",
+"p+ c #119625",
+"q+ c #15A82A",
+"r+ c #16B52C",
+"s+ c #17C12E",
+"t+ c #16C82E",
+"u+ c #14CA30",
+"v+ c #15C92F",
+"w+ c #15C52F",
+"x+ c #14C42F",
+"y+ c #10C32A",
+"z+ c #10C02A",
+"A+ c #0EB526",
+"B+ c #0DA322",
+"C+ c #0A8D1D",
+"D+ c #097419",
+"E+ c #0E9121",
+"F+ c #11A126",
+"G+ c #14AF29",
+"H+ c #14BC2C",
+"I+ c #14C12D",
+"J+ c #14C32D",
+"K+ c #13C32E",
+"L+ c #14C22D",
+"M+ c #13C12D",
+"N+ c #13BA2B",
+"O+ c #10B928",
+"P+ c #10B828",
+"Q+ c #0EB426",
+"R+ c #0DAA23",
+"S+ c #0B9A20",
+"T+ c #08871B",
+"U+ c #077217",
+"V+ c #0A871D",
+"W+ c #0D9521",
+"X+ c #10A425",
+"Y+ c #11AE27",
+"Z+ c #11B228",
+"`+ c #12B529",
+" @ c #11B628",
+".@ c #10B429",
+"+@ c #10B227",
+"@@ c #10AF27",
+"#@ c #10AC27",
+"$@ c #0FAB26",
+"%@ c #0EA824",
+"&@ c #0DA624",
+"*@ c #0CA221",
+"=@ c #0B9C20",
+"-@ c #088F1C",
+";@ c #068018",
+">@ c #056D13",
+",@ c #057214",
+"'@ c #067A17",
+")@ c #09841B",
+"!@ c #0C911E",
+"~@ c #0D9921",
+"{@ c #0E9F22",
+"]@ c #0EA123",
+"^@ c #0DA222",
+"/@ c #0DA123",
+"(@ c #0C9C21",
+"_@ c #0B981F",
+":@ c #0C971F",
+"<@ c #0C951F",
+"[@ c #0B931F",
+"}@ c #0A911E",
+"|@ c #088E1C",
+"1@ c #07891A",
+"2@ c #058218",
+"3@ c #047715",
+"4@ c #036812",
+"5@ c #046C12",
+"6@ c #047014",
+"7@ c #057615",
+"8@ c #077D19",
+"9@ c #09831B",
+"0@ c #09871C",
+"a@ c #08891C",
+"b@ c #088A1B",
+"c@ c #078619",
+"d@ c #078419",
+"e@ c #078018",
+"f@ c #067D18",
+"g@ c #067C18",
+"h@ c #067D17",
+"i@ c #057B16",
+"j@ c #047815",
+"k@ c #037313",
+"l@ c #036D12",
+" ",
+" . + + . @ # $ % & % * = - ; > , ' ) ! ~ ",
+" . + { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 ",
+" 8 9 0 a b c d e f g 1 h i j k l m n o p ",
+" { q r s t u v w x y z A B C D E F G H I ",
+" J K L M N O P Q R S T U V W X Y Z ` ... ",
+" J +.@.#.$.%.&.*.=.B -.B ;.>.B ,.'.).!.~. ",
+" {.].^./.(._.:.S <. [.}.S |.1.B 2.3.4.5. ",
+" 6.7.8.9.0.a.S S b. c.d.W e.f. g.h.i.j. ",
+" k.l.m.V S n.o.b.p. q.r. s.t.u.v.w.x.y. ",
+" z.A.B.C.S B D.E. r.F. G.H. I.J.K.L. ",
+" M.N.O.P.B Q.R. F.S. T.U.V.W.X.Y.Z. ",
+" `. +.+++ @+#+ $+%+ &+*+=+-+ ",
+" ;+N.>+,+'+)+ !+~+ {+]+ ^+/+(+_+ ",
+" ;+:+>+<+[+}+|+ 1+2+ 3+4+ 5+6+7+8+ ",
+" 9+0+a+b+c+d+e+f+ 2+ g+h+ i+j+k+l+m+ ",
+" n+o+p+q+r+s+t+u+v+ v+w+x+ j+y+z+A+B+C+ ",
+" D+l.E+F+G+H+I+J+K+L+M+6+ N+O+P+Q+R+S+T+ ",
+" U+`.V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@;@ ",
+" >@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@ ",
+" 4@5@6@7@8@9@0@a@b@1@c@d@e@f@g@h@i@j@k@l@ ",
+" "};
diff --git a/muse/muse/xpm/newmutebutton.xpm b/muse/muse/xpm/newmutebutton.xpm
new file mode 100644
index 00000000..994e3321
--- /dev/null
+++ b/muse/muse/xpm/newmutebutton.xpm
@@ -0,0 +1,69 @@
+/* XPM */
+static const char * newmutebutton_xpm[] = {
+"22 22 44 1",
+" c None",
+". c #000000",
+"+ c #313131",
+"@ c #E5141A",
+"# c #E1180D",
+"$ c #3F3F3F",
+"% c #222222",
+"& c #9E000D",
+"* c #FB1300",
+"= c #E91900",
+"- c #3B3B3B",
+"; c #EB1420",
+"> c #A9010C",
+", c #454545",
+"' c #E10E08",
+") c #DD1F0F",
+"! c #121212",
+"~ c #ED0014",
+"{ c #FF0603",
+"] c #F7001C",
+"^ c #4C4C4C",
+"/ c #525252",
+"( c #1E0700",
+"_ c #ED021A",
+": c #F00018",
+"< c #E21C19",
+"[ c #070707",
+"} c #030A1D",
+"| c #000F00",
+"1 c #E90412",
+"2 c #0B0017",
+"3 c #000700",
+"4 c #010101",
+"5 c #EC141D",
+"6 c #EA0900",
+"7 c #DE0B09",
+"8 c #E01000",
+"9 c #E81400",
+"0 c #F10E1C",
+"a c #EE0E16",
+"b c #E50300",
+"c c #FF0316",
+"d c #E70816",
+"e c #FF1901",
+"......................",
+". .",
+". .",
+". .",
+". + @# .",
+". $ %&*= .",
+". -+ + ;+> .",
+". $,. $')+ .",
+". $$!. ~%{]. .",
+". $^/!(._:.< [ .",
+". $+.}|.'1. . .",
+". +..23.{]. 4 .",
+". ......< . . .",
+". .... . . .",
+". 56... . . .",
+". 7890.. . . .",
+". abcd . . .",
+". 6e~ . .",
+". .",
+". .",
+". .",
+"......................"};
diff --git a/muse/muse/xpm/note.xpm b/muse/muse/xpm/note.xpm
new file mode 100644
index 00000000..46064dbf
--- /dev/null
+++ b/muse/muse/xpm/note.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * note_xpm[] = {
+"16 16 4 1",
+" c None",
+". c #000000",
+"+ c #808080",
+"@ c #404000",
+" .. ",
+" ... ",
+" .... ",
+" . .. ",
+" + + + . . ",
+" @@@@@@@@.@@@@@ ",
+" + + + . + ",
+" + + + . + ",
+" + + + . + ",
+" + + .... + ",
+" @@@@.....@@@@@ ",
+" + +..... + ",
+" ... ",
+" ",
+" ",
+" "};
diff --git a/muse/muse/xpm/note1.xpm b/muse/muse/xpm/note1.xpm
new file mode 100644
index 00000000..b8b85caf
--- /dev/null
+++ b/muse/muse/xpm/note1.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char* note1_xpm[]={
+"22 22 3 1",
+"a c #ffc0c0",
+"# c #000000",
+". c None",
+"......................",
+"......................",
+"......................",
+"......................",
+".............#........",
+".............#........",
+".............#........",
+".............#........",
+".............#........",
+".............#........",
+".............#........",
+".............#........",
+".............#........",
+".........#####........",
+"........##aaa#........",
+".......##aaaa#........",
+".......#aaaa##........",
+".......##aa##.........",
+"........####..........",
+"......................",
+"......................",
+"......................"};
diff --git a/muse/muse/xpm/off.xpm b/muse/muse/xpm/off.xpm
new file mode 100644
index 00000000..64ddd452
--- /dev/null
+++ b/muse/muse/xpm/off.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static const char * off_xpm[] = {
+"16 16 6 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #DCDCDC",
+"# c #A0A0A4",
+"$ c #808080",
+" ",
+" ..... ",
+" ..+++++.. ",
+" .++@@@@@@@. ",
+" .+@@@.@@@@. ",
+" .+@@@@.@@@@#. ",
+" .+@@@@.@@@@#. ",
+" .+@@@@.@@@@#. ",
+" .+@@@@.@@@@#. ",
+" .+@@@@.@@@@#. ",
+" .@@@@.@@@#.$ ",
+" .@@@@@@@##. ",
+" ..#####.. ",
+" ..... ",
+" ",
+" "};
diff --git a/muse/muse/xpm/pafter.xpm b/muse/muse/xpm/pafter.xpm
new file mode 100644
index 00000000..a39ed901
--- /dev/null
+++ b/muse/muse/xpm/pafter.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static const char *pafter_xpm[] = {
+"22 22 2 1",
+". c None",
+"# c #000000",
+"######################",
+"##...................#",
+"#.#..................#",
+"#..#.................#",
+"#...#................#",
+"#....#...............#",
+"#.....#..............#",
+"#......#.............#",
+"#.......#............#",
+"#........#...........#",
+"#.........#..........#",
+"#..........#.........#",
+"#...........#........#",
+"#............#.......#",
+"#.............#......#",
+"#..............#.....#",
+"#...............#....#",
+"#................#...#",
+"#.................#..#",
+"#..................#.#",
+"#...................##",
+"######################"
+};
+
diff --git a/muse/muse/xpm/panic.xpm b/muse/muse/xpm/panic.xpm
new file mode 100644
index 00000000..9b8f937c
--- /dev/null
+++ b/muse/muse/xpm/panic.xpm
@@ -0,0 +1,50 @@
+/* XPM */
+static const char * panic_xpm[] = {
+"18 18 29 1",
+" c None",
+". c #F7001C",
+"+ c #EB1420",
+"@ c #FB1300",
+"# c #E10E08",
+"$ c #E21C19",
+"% c #DD1F0F",
+"& c #313131",
+"* c #ED0014",
+"= c #FF0603",
+"- c #F00018",
+"; c #3F3F3F",
+"> c #222222",
+", c #ED021A",
+"' c #3B3B3B",
+") c #E90412",
+"! c #454545",
+"~ c #000000",
+"{ c #525252",
+"] c #121212",
+"^ c #4C4C4C",
+"/ c #1E0700",
+"( c #070707",
+"_ c #030A1D",
+": c #0B0017",
+"< c #000700",
+"[ c #010101",
+"} c #E1180D",
+"| c #E50300",
+".. +@",
+"#.$ +#%",
+"$... & *#=.",
+" .-$ ; >#-=$ ",
+" #,. '& & .&) ",
+" # ;!~ ;#=& ",
+" {;]~ > ~ ",
+" ;^{~/~ ~ ( ",
+" ;&~_~~ ~ ~ ",
+" &~~:<~ ~ [ ",
+" ~~~~~~ ~ ~ ",
+" ~~~~ ~ ~ ",
+" }~~~ ~##~ ",
+" #% ~~ ~ #~# ",
+" *|$ ~ ~#$. ",
+" ,-% ~ $... ",
+"*$). $$$.",
+"-$. .$$"};
diff --git a/muse/muse/xpm/pencil.xpm b/muse/muse/xpm/pencil.xpm
new file mode 100644
index 00000000..16c06603
--- /dev/null
+++ b/muse/muse/xpm/pencil.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char*pencil_xpm[]={
+"18 18 5 1",
+"# c #000000",
+"c c #ffffff",
+"b c #a0a0a4",
+"a c #dcdcdc",
+". c None",
+"..................",
+"........####......",
+"........#aaa#.....",
+".......#aaaa#b....",
+".......##aa#bb....",
+"......#cc###b.....",
+"......#caa#bb.....",
+".....#ccaa#b......",
+".....#caa#bb......",
+"....#ccaa#b.......",
+"....#caa#bb.......",
+"....##aa#b........",
+"....####bb........",
+"....###bb.........",
+"....##bb..........",
+"....#bb...........",
+".....b............",
+".................."};
+
diff --git a/muse/muse/xpm/piano.xpm b/muse/muse/xpm/piano.xpm
new file mode 100644
index 00000000..3b321274
--- /dev/null
+++ b/muse/muse/xpm/piano.xpm
@@ -0,0 +1,170 @@
+/* XPM */
+static const char * piano_xpm[] = {
+"22 22 145 2",
+" c None",
+". c #535353",
+"+ c #4A4A4A",
+"@ c #424242",
+"# c #3A3A3A",
+"$ c #313131",
+"% c #292929",
+"& c #212121",
+"* c #181818",
+"= c #101010",
+"- c #080808",
+"; c #000000",
+"> c #4C4C4C",
+", c #DEDEDE",
+"' c #D6D6D6",
+") c #C6C6C6",
+"! c #B4B4B4",
+"~ c #989898",
+"{ c #464646",
+"] c #FFFFFF",
+"^ c #ECECEC",
+"/ c #E1E1E1",
+"( c #141414",
+"_ c #C9C9C9",
+": c #3F3F3F",
+"< c #393939",
+"[ c #3E3E3E",
+"} c #E0E0E0",
+"| c #333333",
+"1 c #2C2C2C",
+"2 c #FDFDFD",
+"3 c #F0EEEC",
+"4 c #CFCBC4",
+"5 c #B8B1A9",
+"6 c #857F7A",
+"7 c #262626",
+"8 c #FEFDFC",
+"9 c #FDFAF7",
+"0 c #E4E0DB",
+"a c #D0C8C1",
+"b c #A09B97",
+"c c #1F1F1F",
+"d c #FEFDFB",
+"e c #FCF8F5",
+"f c #FBF3EE",
+"g c #F9F0E8",
+"h c #EADFD5",
+"i c #BBB2AB",
+"j c #191919",
+"k c #FEFCFB",
+"l c #FAF4EE",
+"m c #F9EFE7",
+"n c #F7EBE1",
+"o c #F5E6D9",
+"p c #C6B8AC",
+"q c #131313",
+"r c #FFFEFE",
+"s c #FDFCFA",
+"t c #FBF7F3",
+"u c #FAF3ED",
+"v c #F8EEE6",
+"w c #F6EADF",
+"x c #F3E1D2",
+"y c #D2C0B1",
+"z c #0C0C0C",
+"A c #FEFEFE",
+"B c #FDFBFA",
+"C c #FCF7F3",
+"D c #FAF2EC",
+"E c #F7EADF",
+"F c #F5E6D8",
+"G c #F4E1D2",
+"H c #F2DDCB",
+"I c #D0BCAB",
+"J c #060606",
+"K c #FDFBF9",
+"L c #FBF6F2",
+"M c #FAF3EC",
+"N c #F8EDE4",
+"O c #F7EADE",
+"P c #F5E5D8",
+"Q c #F3E1D1",
+"R c #F0D8C3",
+"S c #CFB8A5",
+"T c #FEFEFD",
+"U c #FDFAF8",
+"V c #FBF6F1",
+"W c #FAF2EB",
+"X c #F8EEE4",
+"Y c #F6E8DD",
+"Z c #F5E5D7",
+"` c #F3E0D0",
+" . c #F1DCC9",
+".. c #EFD8C3",
+"+. c #EED3BC",
+"@. c #CEB49F",
+"#. c #FCF6F1",
+"$. c #F6E9DD",
+"%. c #F4E4D6",
+"&. c #EFD8C2",
+"*. c #ECCEB5",
+"=. c #CCB099",
+"-. c #020202",
+";. c #FBF5F0",
+">. c #F9F0EA",
+",. c #F7ECE2",
+"'. c #F6E8DC",
+"). c #F2DFCE",
+"!. c #F1DBC8",
+"~. c #EFD6C1",
+"{. c #EED2BB",
+"]. c #ECCEB4",
+"^. c #EAC9AD",
+"/. c #CBAC93",
+"(. c #F9F0E9",
+"_. c #F4E3D5",
+":. c #F2E0CF",
+"<. c #F1DAC7",
+"[. c #EFD7C1",
+"}. c #EED2BA",
+"|. c #E9C5A6",
+"1. c #C9A88D",
+"2. c #F6E8DB",
+"3. c #F4E3D4",
+"4. c #F2DECE",
+"5. c #F1DBC7",
+"6. c #EFD6C0",
+"7. c #ECCDB3",
+"8. c #EAC9AC",
+"9. c #E8C5A6",
+"0. c #E7C2A2",
+"a. c #C8A487",
+"b. c #D8D0CA",
+"c. c #D7CCC4",
+"d. c #D6C8BE",
+"e. c #D4C4B8",
+"f. c #D2C0B2",
+"g. c #D1BDAC",
+"h. c #CFB8A6",
+"i. c #CEB5A0",
+"j. c #CDB09A",
+"k. c #CBAD94",
+"l. c #C9A88E",
+"m. c #C8A488",
+"n. c #C7A081",
+" ",
+" . + @ # $ % & * = - ; ; ",
+" > , , , , , , ' ) ! ; ~ ; ",
+" { , ] ] ] ] ] ] ^ / ( _ ~ ; ",
+" : , ] ] ] ] ] ] ] ^ % ] _ ~ ; ",
+" < , ] ] ] ] ] ] ] ] [ } ] _ ~ ; ",
+" | , ] ] ] ] ] ] ] ] . [ % ( ; ; ",
+" 1 , ] ] ] ] ] ] ] ] 2 3 4 5 6 ; ",
+" 7 , ] ] ] ] ] ] ] ] 8 9 0 a b ; ",
+" c , ] ] ] ] ] ] ] d e f g h i ; ",
+" j , ] ] ] ] ] ] k e l m n o p ; ",
+" q , ] ] ] ] r s t u v w o x y ; ",
+" z , ] ] ] A B C D v E F G H I ; ",
+" J , ] ] A K L M N O P Q H R S ; ",
+" J , ] ] A K L M N O P Q H R S ; ",
+" ; , ] T U V W X Y Z ` ...+.@.; ",
+" ; , r 9 #.W N $.%.` .&.+.*.=.; ",
+" -., 9 ;.>.,.'.%.).!.~.{.].^./.; ",
+" ; , ;.(.,.'._.:.<.[.}.].^.|.1.; ",
+" ; , g n 2.3.4.5.6.}.7.8.9.0.a.; ",
+" ; b.b.c.d.e.f.g.h.i.j.k.l.m.n.; ",
+" ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; "};
diff --git a/muse/muse/xpm/pianoS.xpm b/muse/muse/xpm/pianoS.xpm
new file mode 100644
index 00000000..3649919e
--- /dev/null
+++ b/muse/muse/xpm/pianoS.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *pianoS_xpm[]={
+"16 16 5 1",
+"# c #000000",
+"c c #00c000",
+". c #00ff00",
+"b c #dcdcdc",
+"a c #ffffff",
+"................",
+"................",
+"..#########aaa..",
+"..#########aaa..",
+"..abbbbbbbbaaa..",
+"..#########aaa..",
+"..#########aaa..",
+"..abbbbbbbbaaa..",
+"..#########aaa..",
+"..#########aaa..",
+"..abbbbbbbbaaa..",
+"..aaaaaaaaaaaa..",
+"..#########aaa..",
+"..#########aaa..",
+"...ccccccccc....",
+"................"};
diff --git a/muse/muse/xpm/pitch.xpm b/muse/muse/xpm/pitch.xpm
new file mode 100644
index 00000000..e8f67efb
--- /dev/null
+++ b/muse/muse/xpm/pitch.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pitch_xpm[]={
+"22 22 3 1",
+"a c #303030",
+"# c #808080",
+". c None",
+"..............#..#....",
+"...............#..#...",
+"................#.#...",
+".......a......a.#.#...",
+".......a......a.#.#...",
+".......a......a.#.#...",
+".......a......a.#.#...",
+".......a......a.#.#...",
+".......a......a#..#...",
+".......a......a..#....",
+"........a....a..#.....",
+".........aaaa.........",
+"..........aa..........",
+"..........aa..........",
+"..........aa..........",
+".........aaaa.........",
+"........aaaaaa........",
+"........aaaaaa........",
+".........aaaa.........",
+"..........aa..........",
+"......................",
+"......................"};
diff --git a/muse/muse/xpm/play.xpm b/muse/muse/xpm/play.xpm
new file mode 100644
index 00000000..b38afc78
--- /dev/null
+++ b/muse/muse/xpm/play.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static const char * play_xpm[] = {
+"12 12 2 1",
+" c None",
+". c #000000",
+" . ",
+" ... ",
+" ... ",
+" .... ",
+" .... ",
+" ..... ",
+" ..... ",
+" .... ",
+" .... ",
+" ... ",
+" ... ",
+" . "};
diff --git a/muse/muse/xpm/plus.xpm b/muse/muse/xpm/plus.xpm
new file mode 100644
index 00000000..e68e8db2
--- /dev/null
+++ b/muse/muse/xpm/plus.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * plus_xpm[] = {
+"13 13 5 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #DCDCDC",
+"# c #A0A0A4",
+" ..... ",
+" ..+++++.. ",
+" .++@@@@@@@. ",
+" .+@@@.@@@@. ",
+".+@@@@.@@@@#.",
+".+@@@@.@@@@#.",
+".+@.......@#.",
+".+@@@@.@@@@#.",
+".+@@@@.@@@@#.",
+" .@@@@.@@@#. ",
+" .@@@@@@@##. ",
+" ..#####.. ",
+" ..... " };
diff --git a/muse/muse/xpm/pointer.xpm b/muse/muse/xpm/pointer.xpm
new file mode 100644
index 00000000..87801aa7
--- /dev/null
+++ b/muse/muse/xpm/pointer.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static const char*pointer_xpm[]={
+"18 18 4 1",
+"# c #000000",
+"a c #000080",
+"b c #808080",
+". c None",
+"..................",
+"..................",
+".....#............",
+".....##...........",
+".....###..........",
+".....####.........",
+".....#####........",
+".....######.......",
+".....#######......",
+".....########.....",
+".....#####........",
+".....##.##........",
+".....#...##.......",
+".........##.......",
+"..........##......",
+"..........##......",
+"..................",
+".................."};
+
diff --git a/muse/muse/xpm/punchin.xpm b/muse/muse/xpm/punchin.xpm
new file mode 100644
index 00000000..4c0809c5
--- /dev/null
+++ b/muse/muse/xpm/punchin.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char *punchin_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 22 16 3 1",
+/* colors */
+". c #000000",
+"f c None",
+"h c #ffffff",
+/* pixels */
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"fff.......ffffffffffff",
+"ffffffffff.fffffffffff",
+"fffffffffff.ffffffffff",
+"ffffffffffff.fffffffff",
+"fffffffffffff......fff",
+"fffffffffffffhhhhhhhff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+};
+
diff --git a/muse/muse/xpm/punchin1.xpm b/muse/muse/xpm/punchin1.xpm
new file mode 100644
index 00000000..90d0961c
--- /dev/null
+++ b/muse/muse/xpm/punchin1.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static const char* punchin1_xpm[]={
+"12 12 3 1",
+"a c #c0c0c0",
+"# c #000000",
+". c None",
+"............",
+"####........",
+"######......",
+"....##......",
+"....##......",
+"....##......",
+"....##......",
+"....##......",
+"....########",
+"......######",
+"............",
+"............"};
diff --git a/muse/muse/xpm/punchout.xpm b/muse/muse/xpm/punchout.xpm
new file mode 100644
index 00000000..98d22f43
--- /dev/null
+++ b/muse/muse/xpm/punchout.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *punchout_xpm[] = {
+"22 16 3 1",
+". c #000000",
+"f c None",
+"h c #ffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"fffffffffffff......fff",
+"ffffffffffff.fffffffff",
+"fffffffffff.ffffffffff",
+"ffffffffff.fffffffffff",
+"fff.......ffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+"ffffffffffffffffffffff",
+};
+
diff --git a/muse/muse/xpm/punchout1.xpm b/muse/muse/xpm/punchout1.xpm
new file mode 100644
index 00000000..1d3a2ae4
--- /dev/null
+++ b/muse/muse/xpm/punchout1.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static const char* punchout1_xpm[]={
+"12 12 3 1",
+"a c #c0c0c0",
+"# c #000000",
+". c None",
+"............",
+"............",
+"......######",
+"....########",
+"....##......",
+"....##......",
+"....##......",
+"....##......",
+"######......",
+"####........",
+"............",
+"............"};
diff --git a/muse/muse/xpm/quant.xpm b/muse/muse/xpm/quant.xpm
new file mode 100644
index 00000000..70d763dd
--- /dev/null
+++ b/muse/muse/xpm/quant.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char* quant_xpm[]={
+"22 22 2 1",
+"x c #000000",
+". c None",
+"......................",
+"......................",
+"......................",
+".........xxxx.........",
+".......xx....xx.......",
+".....xx........xx.....",
+"....x............x....",
+"...x..............x...",
+"...x..............x...",
+"..x................x..",
+"..x................x..",
+"..x................x..",
+"..x................x..",
+"...x..............x...",
+"...x.......x......x...",
+"....x.......x....x....",
+".....xx......x.xx.....",
+".......xx....xx.......",
+".........xxxx..x......",
+"................x.....",
+"......................",
+"......................"};
+
diff --git a/muse/muse/xpm/record.xpm b/muse/muse/xpm/record.xpm
new file mode 100644
index 00000000..9be6ceed
--- /dev/null
+++ b/muse/muse/xpm/record.xpm
@@ -0,0 +1,160 @@
+/* XPM */
+static const char * record_xpm[] = {
+"15 15 142 2",
+" c None",
+". c #9B0500",
+"+ c #900601",
+"@ c #AF0205",
+"# c #980401",
+"$ c #AF0206",
+"% c #A70205",
+"& c #A80204",
+"* c #A9040A",
+"= c #990502",
+"- c #A00400",
+"; c #CC0004",
+"> c #A30404",
+", c #BD0212",
+"' c #B20207",
+") c #AC0201",
+"! c #A30800",
+"~ c #A70409",
+"{ c #990500",
+"] c #D50002",
+"^ c #DB0400",
+"/ c #E70004",
+"( c #F20010",
+"_ c #E30018",
+": c #E00010",
+"< c #C00202",
+"[ c #AB0200",
+"} c #AB0800",
+"| c #A90401",
+"1 c #A50406",
+"2 c #B90201",
+"3 c #DE1800",
+"4 c #E62300",
+"5 c #F10900",
+"6 c #FF0016",
+"7 c #E60000",
+"8 c #E40800",
+"9 c #E10900",
+"0 c #BB0600",
+"a c #BE0200",
+"b c #B00200",
+"c c #DA0400",
+"d c #EB2500",
+"e c #F33000",
+"f c #F80D00",
+"g c #FF0018",
+"h c #FE0F00",
+"i c #F11000",
+"j c #E40F00",
+"k c #DF0B00",
+"l c #B30200",
+"m c #A20200",
+"n c #BB0304",
+"o c #A00403",
+"p c #E40000",
+"q c #F90B00",
+"r c #FF0F00",
+"s c #F90006",
+"t c #FB0012",
+"u c #F40D00",
+"v c #EE0800",
+"w c #E70000",
+"x c #DA0000",
+"y c #D00004",
+"z c #AC0500",
+"A c #A40202",
+"B c #B40207",
+"C c #F40010",
+"D c #FD0014",
+"E c #FF0008",
+"F c #F70009",
+"G c #EE0010",
+"H c #D6000F",
+"I c #CF0009",
+"J c #A80800",
+"K c #BB0211",
+"L c #E10018",
+"M c #EA0000",
+"N c #F10B00",
+"O c #EE3000",
+"P c #EF0F00",
+"Q c #F5000D",
+"R c #DA0010",
+"S c #B10202",
+"T c #A50200",
+"U c #A70600",
+"V c #9B0403",
+"W c #970500",
+"X c #E20010",
+"Y c #E30800",
+"Z c #EF1000",
+"` c #F10800",
+" . c #FF0009",
+".. c #F01000",
+"+. c #E10800",
+"@. c #DE0000",
+"#. c #DA0004",
+"$. c #B80207",
+"%. c #AF0207",
+"&. c #EC0004",
+"*. c #AB0204",
+"=. c #B30207",
+"-. c #E20800",
+";. c #E20F00",
+">. c #E50002",
+",. c #EB000F",
+"'. c #EF000D",
+"). c #E00000",
+"!. c #D70F00",
+"~. c #B90500",
+"{. c #B10200",
+"]. c #AF020C",
+"^. c #A90201",
+"/. c #A70200",
+"(. c #DA0B00",
+"_. c #E20D00",
+":. c #D90000",
+"<. c #D5000F",
+"[. c #DD0010",
+"}. c #DC0004",
+"|. c #D30400",
+"1. c #AD0200",
+"2. c #AE0204",
+"3. c #B3020A",
+"4. c #9A0600",
+"5. c #AC0800",
+"6. c #AF0200",
+"7. c #C90000",
+"8. c #CD0004",
+"9. c #D10009",
+"0. c #CA0004",
+"a. c #B50207",
+"b. c #B40200",
+"c. c #9C0400",
+"d. c #A90400",
+"e. c #A30200",
+"f. c #AA0200",
+"g. c #B6020E",
+"h. c #A90402",
+"i. c #A50800",
+"j. c #AB0600",
+"k. c #B50302",
+" ",
+" . + @ # $ % & ",
+" * = - ; > , - ' ) ! ",
+" ~ { ] ^ / ( _ : < [ } ",
+" | 1 2 3 4 5 6 7 8 9 0 - a ",
+" > b c d e f g h i j k l m n ",
+" o - p q r s t u v w x y [ z ",
+" A B C 6 g D t E F G H I [ J ",
+" o K L M r N E O P Q R S T U ",
+" V W X Y Z ` ...+.@.#.$.%.&.",
+" *.=.< -.;.>.,.'.).!.~.{.]. ",
+" ^./.(._.:.<.[.}.|.1.2.3. ",
+" 4.5.6.7.8.9.0.a.b.c.} ",
+" d.e.6.b e.f.g.3. ",
+" h.z i.j.k. "};
diff --git a/muse/muse/xpm/record1.xpm b/muse/muse/xpm/record1.xpm
new file mode 100644
index 00000000..5b0d8e6f
--- /dev/null
+++ b/muse/muse/xpm/record1.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *record1_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 12 12 2 1",
+/* colors */
+". c none",
+"# c #ff0000",
+/* pixels */
+"............",
+".....##.....",
+"....####....",
+"...######...",
+"..########..",
+"..########..",
+"..########..",
+"...######...",
+"....####....",
+".....##.....",
+"............",
+"............"
+};
diff --git a/muse/muse/xpm/record_off.xpm b/muse/muse/xpm/record_off.xpm
new file mode 100644
index 00000000..3f25c366
--- /dev/null
+++ b/muse/muse/xpm/record_off.xpm
@@ -0,0 +1,150 @@
+/* XPM */
+static const char * record_off_xpm[] = {
+"15 15 132 2",
+" c None",
+". c #520002",
+"+ c #420002",
+"@ c #3F0002",
+"# c #350002",
+"$ c #3E0002",
+"% c #360002",
+"& c #370002",
+"* c #590006",
+"= c #490002",
+"- c #3F0000",
+"; c #450002",
+"> c #470003",
+", c #5A0006",
+"' c #430003",
+") c #3B0001",
+"! c #450200",
+"~ c #530006",
+"{ c #470000",
+"] c #520001",
+"^ c #5C0200",
+"/ c #760002",
+"( c #980201",
+"_ c #6E0006",
+": c #660004",
+"< c #630002",
+"[ c #3B0000",
+"} c #3B0200",
+"| c #5A0002",
+"1 c #4D0004",
+"2 c #610600",
+"3 c #740800",
+"4 c #990200",
+"5 c #B20201",
+"6 c #740000",
+"7 c #6E0200",
+"8 c #680200",
+"9 c #560200",
+"0 c #390100",
+"a c #460002",
+"b c #400000",
+"c c #590200",
+"d c #830800",
+"e c #A40B00",
+"f c #A80400",
+"g c #B00400",
+"h c #960400",
+"i c #6E0400",
+"j c #630300",
+"k c #450000",
+"l c #330000",
+"m c #700000",
+"n c #AA0300",
+"o c #A60300",
+"p c #AA0200",
+"q c #B40101",
+"r c #AC0400",
+"s c #8E0200",
+"t c #750000",
+"u c #590000",
+"v c #4B0002",
+"w c #680100",
+"x c #330002",
+"y c #9D0201",
+"z c #A70200",
+"A c #B00201",
+"B c #AC0001",
+"C c #B20101",
+"D c #C00000",
+"E c #AE0001",
+"F c #8C0004",
+"G c #530004",
+"H c #3A0000",
+"I c #540200",
+"J c #400002",
+"K c #560006",
+"L c #670006",
+"M c #7F0000",
+"N c #A70400",
+"O c #990300",
+"P c #AF0100",
+"Q c #8E0600",
+"R c #920400",
+"S c #9E0001",
+"T c #5A0004",
+"U c #430002",
+"V c #340000",
+"W c #510200",
+"X c #6A0004",
+"Y c #6C0200",
+"Z c #9C0200",
+"` c #B20200",
+" . c #930300",
+".. c #610000",
+"+. c #4F0003",
+"@. c #3F0003",
+"#. c #390002",
+"$. c #450003",
+"%. c #640002",
+"&. c #6A0200",
+"*. c #6A0400",
+"=. c #710001",
+"-. c #810004",
+";. c #900004",
+">. c #650000",
+",. c #540400",
+"'. c #500200",
+"). c #430000",
+"!. c #3F0004",
+"~. c #370001",
+"{. c #350000",
+"]. c #590300",
+"^. c #570000",
+"/. c #510004",
+"(. c #5F0004",
+"_. c #5D0002",
+":. c #4F0200",
+"<. c #3D0000",
+"[. c #450004",
+"}. c #4D0200",
+"|. c #4C0002",
+"1. c #440002",
+"2. c #490003",
+"3. c #380000",
+"4. c #370000",
+"5. c #3E0000",
+"6. c #310000",
+"7. c #390000",
+"8. c #4A0006",
+"9. c #440004",
+"0. c #670100",
+"a. c #5E0200",
+" ",
+" . + @ # $ % & ",
+" * = - ; > , - ' ) ! ",
+" ~ { ] ^ / ( _ : < [ } ",
+" | 1 ] 2 3 4 5 6 7 8 9 - 0 ",
+" a b c d e f 5 g h i j k l ",
+" @ - m n o p q r s t u v [ w ",
+" x > y z A B C D E F G = H I ",
+" J K L M N O P Q R S T U V W ",
+" # b X Y R Z ` .8 ..| +.@. ",
+" #.$.%.&.*.=.-.;.>.,.'.).!. ",
+" ~.{.].*.^./.(._.:.<.$ [. ",
+" }.} - ).a |.1.2.{ 3.} ",
+" 0 4.5.b 6.7.8.9. ",
+" 0.}.a. "};
diff --git a/muse/muse/xpm/record_on.xpm b/muse/muse/xpm/record_on.xpm
new file mode 100644
index 00000000..64a67cf4
--- /dev/null
+++ b/muse/muse/xpm/record_on.xpm
@@ -0,0 +1,160 @@
+/* XPM */
+static const char * record_on_xpm[] = {
+"15 15 142 2",
+" c None",
+". c #9B0500",
+"+ c #900601",
+"@ c #AF0205",
+"# c #980401",
+"$ c #AF0206",
+"% c #A70205",
+"& c #A80204",
+"* c #A9040A",
+"= c #990502",
+"- c #A00400",
+"; c #CC0004",
+"> c #A30404",
+", c #BD0212",
+"' c #B20207",
+") c #AC0201",
+"! c #A30800",
+"~ c #A70409",
+"{ c #990500",
+"] c #D50002",
+"^ c #DB0400",
+"/ c #E70004",
+"( c #F20010",
+"_ c #E30018",
+": c #E00010",
+"< c #C00202",
+"[ c #AB0200",
+"} c #AB0800",
+"| c #A90401",
+"1 c #A50406",
+"2 c #B90201",
+"3 c #DE1800",
+"4 c #E62300",
+"5 c #F10900",
+"6 c #FF0016",
+"7 c #E60000",
+"8 c #E40800",
+"9 c #E10900",
+"0 c #BB0600",
+"a c #BE0200",
+"b c #B00200",
+"c c #DA0400",
+"d c #EB2500",
+"e c #F33000",
+"f c #F80D00",
+"g c #FF0018",
+"h c #FE0F00",
+"i c #F11000",
+"j c #E40F00",
+"k c #DF0B00",
+"l c #B30200",
+"m c #A20200",
+"n c #BB0304",
+"o c #A00403",
+"p c #E40000",
+"q c #F90B00",
+"r c #FF0F00",
+"s c #F90006",
+"t c #FB0012",
+"u c #F40D00",
+"v c #EE0800",
+"w c #E70000",
+"x c #DA0000",
+"y c #D00004",
+"z c #AC0500",
+"A c #A40202",
+"B c #B40207",
+"C c #F40010",
+"D c #FD0014",
+"E c #FF0008",
+"F c #F70009",
+"G c #EE0010",
+"H c #D6000F",
+"I c #CF0009",
+"J c #A80800",
+"K c #BB0211",
+"L c #E10018",
+"M c #EA0000",
+"N c #F10B00",
+"O c #EE3000",
+"P c #EF0F00",
+"Q c #F5000D",
+"R c #DA0010",
+"S c #B10202",
+"T c #A50200",
+"U c #A70600",
+"V c #9B0403",
+"W c #970500",
+"X c #E20010",
+"Y c #E30800",
+"Z c #EF1000",
+"` c #F10800",
+" . c #FF0009",
+".. c #F01000",
+"+. c #E10800",
+"@. c #DE0000",
+"#. c #DA0004",
+"$. c #B80207",
+"%. c #AF0207",
+"&. c #EC0004",
+"*. c #AB0204",
+"=. c #B30207",
+"-. c #E20800",
+";. c #E20F00",
+">. c #E50002",
+",. c #EB000F",
+"'. c #EF000D",
+"). c #E00000",
+"!. c #D70F00",
+"~. c #B90500",
+"{. c #B10200",
+"]. c #AF020C",
+"^. c #A90201",
+"/. c #A70200",
+"(. c #DA0B00",
+"_. c #E20D00",
+":. c #D90000",
+"<. c #D5000F",
+"[. c #DD0010",
+"}. c #DC0004",
+"|. c #D30400",
+"1. c #AD0200",
+"2. c #AE0204",
+"3. c #B3020A",
+"4. c #9A0600",
+"5. c #AC0800",
+"6. c #AF0200",
+"7. c #C90000",
+"8. c #CD0004",
+"9. c #D10009",
+"0. c #CA0004",
+"a. c #B50207",
+"b. c #B40200",
+"c. c #9C0400",
+"d. c #A90400",
+"e. c #A30200",
+"f. c #AA0200",
+"g. c #B6020E",
+"h. c #A90402",
+"i. c #A50800",
+"j. c #AB0600",
+"k. c #B50302",
+" ",
+" . + @ # $ % & ",
+" * = - ; > , - ' ) ! ",
+" ~ { ] ^ / ( _ : < [ } ",
+" | 1 2 3 4 5 6 7 8 9 0 - a ",
+" > b c d e f g h i j k l m n ",
+" o - p q r s t u v w x y [ z ",
+" A B C 6 g D t E F G H I [ J ",
+" o K L M r N E O P Q R S T U ",
+" V W X Y Z ` ...+.@.#.$.%.&.",
+" *.=.< -.;.>.,.'.).!.~.{.]. ",
+" ^./.(._.:.<.[.}.|.1.2.3. ",
+" 4.5.6.7.8.9.0.a.b.c.} ",
+" d.e.6.b e.f.g.3. ",
+" h.z i.j.k. "};
diff --git a/muse/muse/xpm/reddot.xpm b/muse/muse/xpm/reddot.xpm
new file mode 100644
index 00000000..c094934a
--- /dev/null
+++ b/muse/muse/xpm/reddot.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static const char *reddot_xpm[]={
+"12 12 2 1",
+". c None",
+"# c #ff5600",
+"...#####....",
+"..#######...",
+".#########..",
+"###########.",
+"###########.",
+"###########.",
+"###########.",
+"###########.",
+".#########..",
+"..#######...",
+"...#####....",
+"............"};
diff --git a/muse/muse/xpm/redo.xpm b/muse/muse/xpm/redo.xpm
new file mode 100644
index 00000000..24771785
--- /dev/null
+++ b/muse/muse/xpm/redo.xpm
@@ -0,0 +1,92 @@
+/* XPM */
+static const char * redo_xpm[] = {
+"22 22 67 1",
+" c None",
+". c #275F0B",
+"+ c #9AC589",
+"@ c #CDE2C1",
+"# c #E5EEDF",
+"$ c #FFFFFF",
+"% c #91D56B",
+"& c #79BE53",
+"* c #C7E0BA",
+"= c #F5F9F4",
+"- c #1C4408",
+"; c #47AB29",
+"> c #3FA21C",
+", c #4AA721",
+"' c #87C86A",
+") c #C8E1BE",
+"! c #000000",
+"~ c #020202",
+"{ c #53B529",
+"] c #5BC930",
+"^ c #6FD63D",
+"/ c #8AC963",
+"( c #35691B",
+"_ c #2B6A0E",
+": c #E4ECDF",
+"< c #79B658",
+"[ c #41821F",
+"} c #0E2005",
+"| c #060D03",
+"1 c #102806",
+"2 c #42A01E",
+"3 c #A7C49A",
+"4 c #7FAA67",
+"5 c #3A8816",
+"6 c #1C4508",
+"7 c #0B1B05",
+"8 c #72C24F",
+"9 c #7FCC67",
+"0 c #67A050",
+"a c #40A513",
+"b c #275E0D",
+"c c #122B06",
+"d c #469D24",
+"e c #51B929",
+"f c #38AA18",
+"g c #3F9524",
+"h c #173807",
+"i c #081204",
+"j c #63C53E",
+"k c #41AE20",
+"l c #48B227",
+"m c #53A82F",
+"n c #071003",
+"o c #5B973A",
+"p c #50932F",
+"q c #4A8D2D",
+"r c #428727",
+"s c #428525",
+"t c #15260E",
+"u c #070D04",
+"v c #0F1C09",
+"w c #102009",
+"x c #12230A",
+"y c #13250A",
+"z c #234413",
+"A c #15270C",
+"B c #13200C",
+" ",
+" ",
+" ..... ",
+" ..+@#@+.. ",
+" .+$%&&&&*=-- ",
+" .#%;>>>>,,')=! ~ ",
+" .+%>{]^^^^]>,/=! -! ",
+" .$>{(_!!!!{^]>/=!-:! ",
+"-+<[_}| 1!{^2/3:4! ",
+"-$567 !{^2890! ",
+"-abc !de2fg! ",
+" -hi -:jklm! ",
+" !-n -:opqrs! ",
+" -t ~!!!!!!!! ",
+" u-v ",
+" w-x ",
+" yzA ",
+" !-B ",
+" !!! ",
+" ",
+" ",
+" "};
diff --git a/muse/muse/xpm/redoS.xpm b/muse/muse/xpm/redoS.xpm
new file mode 100644
index 00000000..686e2e72
--- /dev/null
+++ b/muse/muse/xpm/redoS.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static const char * redoS_xpm[] = {
+"16 16 6 1",
+" c None",
+". c #000000",
+"+ c #00FF00",
+"@ c #00C000",
+"# c #008000",
+"$ c #004000",
+" ",
+" .... ",
+" ..++++.. ",
+" .+@@@@@++. .",
+" .+#$..#@@@+. #.",
+" .$.. ..#@@+.#.",
+".@. .#@@@#.",
+"... .@@@#.",
+"... .@@@#.",
+"... ######.",
+" .. ........",
+" ... ",
+" ... ",
+" .... ",
+" ... ",
+" "};
diff --git a/muse/muse/xpm/resetS.xpm b/muse/muse/xpm/resetS.xpm
new file mode 100644
index 00000000..261af17e
--- /dev/null
+++ b/muse/muse/xpm/resetS.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *resetS_xpm[]={
+"16 16 3 1",
+"a c #000000",
+". c #c00000",
+"# c #ffffff",
+"................",
+"................",
+"..############..",
+"..####aa######..",
+"..###aaa######..",
+"..##aaaaaaaa##..",
+"..##aaaaaaaaa#..",
+"..###aaa##aaa#..",
+"..####aa###aa#..",
+"..#########aa#..",
+"..########aaa#..",
+"..##aaaaaaaaa#..",
+"..##aaaaaaaa##..",
+"..############..",
+"................",
+"................"};
diff --git a/muse/muse/xpm/rmark.xpm b/muse/muse/xpm/rmark.xpm
new file mode 100644
index 00000000..c0dbd780
--- /dev/null
+++ b/muse/muse/xpm/rmark.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char* rmark_xpm[]={
+"18 18 2 1",
+"# c #0000ff",
+". c None",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+"..................",
+"........##########",
+"........#########.",
+"........########..",
+"........#######...",
+"........######....",
+"........#####.....",
+"........####......",
+"........###.......",
+"........##........",
+"........##........",
+"........##........"};
diff --git a/muse/muse/xpm/score.xpm b/muse/muse/xpm/score.xpm
new file mode 100644
index 00000000..055ddd32
--- /dev/null
+++ b/muse/muse/xpm/score.xpm
@@ -0,0 +1,170 @@
+/* XPM */
+static const char * score_xpm[] = {
+"22 22 145 2",
+" c None",
+". c #535353",
+"+ c #4A4A4A",
+"@ c #424242",
+"# c #3A3A3A",
+"$ c #313131",
+"% c #292929",
+"& c #212121",
+"* c #181818",
+"= c #101010",
+"- c #080808",
+"; c #000000",
+"> c #4C4C4C",
+", c #DEDEDE",
+"' c #D6D6D6",
+") c #C6C6C6",
+"! c #B4B4B4",
+"~ c #989898",
+"{ c #464646",
+"] c #FFFFFF",
+"^ c #ECECEC",
+"/ c #E1E1E1",
+"( c #141414",
+"_ c #C9C9C9",
+": c #3F3F3F",
+"< c #393939",
+"[ c #3E3E3E",
+"} c #E0E0E0",
+"| c #333333",
+"1 c #2C2C2C",
+"2 c #FDFDFD",
+"3 c #F0EEEC",
+"4 c #CFCBC4",
+"5 c #B8B1A9",
+"6 c #857F7A",
+"7 c #262626",
+"8 c #FEFDFC",
+"9 c #FDFAF7",
+"0 c #E4E0DB",
+"a c #D0C8C1",
+"b c #A09B97",
+"c c #1F1F1F",
+"d c #FEFDFB",
+"e c #FCF8F5",
+"f c #FBF3EE",
+"g c #F9F0E8",
+"h c #EADFD5",
+"i c #BBB2AB",
+"j c #191919",
+"k c #FEFCFB",
+"l c #FAF4EE",
+"m c #F9EFE7",
+"n c #F7EBE1",
+"o c #F5E6D9",
+"p c #C6B8AC",
+"q c #131313",
+"r c #FFFEFE",
+"s c #FDFCFA",
+"t c #FBF7F3",
+"u c #FAF3ED",
+"v c #F8EEE6",
+"w c #F6EADF",
+"x c #F3E1D2",
+"y c #D2C0B1",
+"z c #0C0C0C",
+"A c #FEFEFE",
+"B c #FDFBFA",
+"C c #FCF7F3",
+"D c #FAF2EC",
+"E c #F7EADF",
+"F c #F5E6D8",
+"G c #F4E1D2",
+"H c #F2DDCB",
+"I c #D0BCAB",
+"J c #060606",
+"K c #FDFBF9",
+"L c #FBF6F2",
+"M c #FAF3EC",
+"N c #F8EDE4",
+"O c #F7EADE",
+"P c #F5E5D8",
+"Q c #F3E1D1",
+"R c #F0D8C3",
+"S c #CFB8A5",
+"T c #FEFEFD",
+"U c #FDFAF8",
+"V c #FBF6F1",
+"W c #FAF2EB",
+"X c #F8EEE4",
+"Y c #F6E8DD",
+"Z c #F5E5D7",
+"` c #F3E0D0",
+" . c #F1DCC9",
+".. c #EFD8C3",
+"+. c #EED3BC",
+"@. c #CEB49F",
+"#. c #FCF6F1",
+"$. c #F6E9DD",
+"%. c #F4E4D6",
+"&. c #EFD8C2",
+"*. c #ECCEB5",
+"=. c #CCB099",
+"-. c #020202",
+";. c #FBF5F0",
+">. c #F9F0EA",
+",. c #F7ECE2",
+"'. c #F6E8DC",
+"). c #F2DFCE",
+"!. c #F1DBC8",
+"~. c #EFD6C1",
+"{. c #EED2BB",
+"]. c #ECCEB4",
+"^. c #EAC9AD",
+"/. c #CBAC93",
+"(. c #F9F0E9",
+"_. c #F4E3D5",
+":. c #F2E0CF",
+"<. c #F1DAC7",
+"[. c #EFD7C1",
+"}. c #EED2BA",
+"|. c #E9C5A6",
+"1. c #C9A88D",
+"2. c #F6E8DB",
+"3. c #F4E3D4",
+"4. c #F2DECE",
+"5. c #F1DBC7",
+"6. c #EFD6C0",
+"7. c #ECCDB3",
+"8. c #EAC9AC",
+"9. c #E8C5A6",
+"0. c #E7C2A2",
+"a. c #C8A487",
+"b. c #D8D0CA",
+"c. c #D7CCC4",
+"d. c #D6C8BE",
+"e. c #D4C4B8",
+"f. c #D2C0B2",
+"g. c #D1BDAC",
+"h. c #CFB8A6",
+"i. c #CEB5A0",
+"j. c #CDB09A",
+"k. c #CBAD94",
+"l. c #C9A88E",
+"m. c #C8A488",
+"n. c #C7A081",
+" ",
+" . + @ # $ % & * = - ; ; ",
+" > , , , , , , ' ) ! ; ~ ; ",
+" { , ] ] ] ] ] ] ^ / ( _ ~ ; ",
+" : , ] ] ] ] ] ] ] ^ % ] _ ~ ; ",
+" < , ] ] ] ] ] ] ] ] [ } ] _ ~ ; ",
+" | , ] ] ] ] ] ] ] ] . [ % ( ; ; ",
+" 1 , ] ] ] ] ] ] ] ] 2 3 4 5 6 ; ",
+" 7 , ] ] ] ] ] ] ] ] 8 9 0 a b ; ",
+" c , ] ] ] ] ] ] ] d e f g h i ; ",
+" j , ] ] ] ] ] ] k e l m n o p ; ",
+" q , ] ] ] ] r s t u v w o x y ; ",
+" z , ] ] ] A B C D v E F G H I ; ",
+" J , ] ] A K L M N O P Q H R S ; ",
+" J , ] ] A K L M N O P Q H R S ; ",
+" ; , ] T U V W X Y Z ` ...+.@.; ",
+" ; , r 9 #.W N $.%.` .&.+.*.=.; ",
+" -., 9 ;.>.,.'.%.).!.~.{.].^./.; ",
+" ; , ;.(.,.'._.:.<.[.}.].^.|.1.; ",
+" ; , g n 2.3.4.5.6.}.7.8.9.0.a.; ",
+" ; b.b.c.d.e.f.g.h.i.j.k.l.m.n.; ",
+" ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; "};
diff --git a/muse/muse/xpm/scoreS.xpm b/muse/muse/xpm/scoreS.xpm
new file mode 100644
index 00000000..ec2ddd43
--- /dev/null
+++ b/muse/muse/xpm/scoreS.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char *scoreS_xpm[]={
+"16 16 4 1",
+"# c #000000",
+". c #00ff00",
+"b c #dcdcdc",
+"a c #ffffff",
+"................",
+"..############..",
+"..aaaaaa#aaaaa..",
+"..aaaaaa##aaaa..",
+"..############..",
+"..aaaaaa#b#baa..",
+"..aaaaaa#bbbaa..",
+"..############..",
+"..aaaaaa#baaaa..",
+"..aaaa###baaaa..",
+"..############..",
+"..aaaa##bbaaaa..",
+"..aaaabbbaaaaa..",
+"..############..",
+"................",
+"................"};
diff --git a/muse/muse/xpm/select.xpm b/muse/muse/xpm/select.xpm
new file mode 100644
index 00000000..a29f3370
--- /dev/null
+++ b/muse/muse/xpm/select.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *select_xpm[]={
+"16 16 2 1",
+". c #000000",
+"# c #ffffff",
+"..#..#..#..#..#.",
+"###############.",
+".###############",
+".##############.",
+"###############.",
+".###############",
+".##############.",
+"###############.",
+".###############",
+".##############.",
+"###############.",
+".###############",
+".##############.",
+"###############.",
+".###############",
+".#..#..#..#..#.."};
diff --git a/muse/muse/xpm/select_all.xpm b/muse/muse/xpm/select_all.xpm
new file mode 100644
index 00000000..b0133636
--- /dev/null
+++ b/muse/muse/xpm/select_all.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *select_all_xpm[]={
+"16 16 2 1",
+". c #000000",
+"# c #ffffff",
+"..#..#..#..#..#.",
+"###############.",
+".###############",
+".##############.",
+"###############.",
+".###############",
+".##############.",
+"###############.",
+".###############",
+".##############.",
+"###############.",
+".###############",
+".##############.",
+"###############.",
+".###############",
+".#..#..#..#..#.."};
diff --git a/muse/muse/xpm/select_all_parts_on_track.xpm b/muse/muse/xpm/select_all_parts_on_track.xpm
new file mode 100644
index 00000000..4761a256
--- /dev/null
+++ b/muse/muse/xpm/select_all_parts_on_track.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static const char * select_all_parts_on_track_xpm[] = {
+"16 16 20 1",
+" c None",
+". c #000100",
+"+ c #FEFFFC",
+"@ c #FDF7F6",
+"# c #FFFFFF",
+"$ c #F8FEFF",
+"% c #F4F1E9",
+"& c #AA8747",
+"* c #9E772E",
+"= c #8A5C04",
+"- c #0F0F0F",
+"; c #000000",
+"> c #95702B",
+", c #CECECE",
+"' c #F3F3F3",
+") c #AE8E51",
+"! c #FDFDFD",
+"~ c #FCFCFC",
+"{ c #926716",
+"] c #2B2B2B",
+"..+..+..+..+..+.",
+"+++++++++++++++.",
+".@#############+",
+".+#############.",
+"$%#############.",
+".&*##=*##=*##=*#",
+"-;;;;;;;;;;;;;;;",
+">*,'=),,=*,,=*,#",
+"*,!=),,=*,,=*,#=",
+",~{*,#=*,#=*##=;",
+";;;;;;;];;;;;;;;",
+"#=*,#=*,#=*##=*#",
+".##############;",
+"###############;",
+".###############",
+".+..+..+..+..+.."};
diff --git a/muse/muse/xpm/select_deselect_all.xpm b/muse/muse/xpm/select_deselect_all.xpm
new file mode 100644
index 00000000..d3a9bce9
--- /dev/null
+++ b/muse/muse/xpm/select_deselect_all.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *select_deselect_all[]={
+"16 16 3 1",
+". c #000000",
+"a c #ff0000",
+"# c #ffffff",
+"..#..#..#..#..#.",
+"###############.",
+".#aa########aa##",
+".#aaa######aaa#.",
+"###aaa####aaa##.",
+".###aaa##aaa####",
+".####aaaaaa####.",
+"######aaaa#####.",
+".#####aaaa######",
+".####aaaaaa####.",
+"####aaa##aaa###.",
+".##aaa####aaa###",
+".#aaa######aaa#.",
+"##aa########aa#.",
+".###############",
+".#..#..#..#..#.."};
diff --git a/muse/muse/xpm/select_inside_loop.xpm b/muse/muse/xpm/select_inside_loop.xpm
new file mode 100644
index 00000000..46d57b28
--- /dev/null
+++ b/muse/muse/xpm/select_inside_loop.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *select_inside_loop_xpm[]={
+"16 16 2 1",
+". c #000000",
+"# c #ffffff",
+"................",
+"................",
+"....########....",
+"....#......#....",
+"....#......#....",
+".#######...#....",
+"..#####....#....",
+"...###.....#....",
+"....#.....###...",
+"....#....#####..",
+"....#...#######.",
+"....#......#....",
+"....#......#....",
+"....########....",
+"................",
+"................"};
diff --git a/muse/muse/xpm/select_invert_selection.xpm b/muse/muse/xpm/select_invert_selection.xpm
new file mode 100644
index 00000000..c2f11b55
--- /dev/null
+++ b/muse/muse/xpm/select_invert_selection.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *select_invert_selection[]={
+"16 16 2 1",
+". c #000000",
+"# c #ffffff",
+"................",
+"...............#",
+"..............##",
+"......#####..###",
+".....#######.###",
+"....#######..###",
+"...#######....##",
+"...######.....##",
+"...#####......##",
+"...####.......##",
+"...###........##",
+"....#........###",
+"............####",
+"...###.....#####",
+"..##############",
+".###############"};
diff --git a/muse/muse/xpm/select_outside_loop.xpm b/muse/muse/xpm/select_outside_loop.xpm
new file mode 100644
index 00000000..555b6157
--- /dev/null
+++ b/muse/muse/xpm/select_outside_loop.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *select_outside_loop_xpm[]={
+"16 16 2 1",
+"# c #000000",
+". c #ffffff",
+"................",
+"................",
+"....########....",
+"....#......#....",
+"....#......#....",
+".#######...#....",
+"..#####....#....",
+"...###.....#....",
+"....#.....###...",
+"....#....#####..",
+"....#...#######.",
+"....#......#....",
+"....#......#....",
+"....########....",
+"................",
+"................"};
diff --git a/muse/muse/xpm/settings_appearance_settings.xpm b/muse/muse/xpm/settings_appearance_settings.xpm
new file mode 100644
index 00000000..46dcc335
--- /dev/null
+++ b/muse/muse/xpm/settings_appearance_settings.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static const char * settings_appearance_settings_xpm[] = {
+"16 16 47 1",
+" c None",
+". c #000000",
+"+ c #A80000",
+"@ c #B60000",
+"# c #D40000",
+"$ c #93440B",
+"% c #A44C0C",
+"& c #B7550D",
+"* c #E56A10",
+"= c #CD5F0E",
+"- c #C9CC00",
+"; c #FCFF00",
+"> c #B4B600",
+", c #A1A300",
+"' c #CC0000",
+") c #E40000",
+"! c #E1E400",
+"~ c #909200",
+"{ c #4E8F00",
+"] c #61B300",
+"^ c #57A000",
+"/ c #B000B6",
+"( c #6CC800",
+"_ c #79E000",
+": c #DC00E4",
+"< c #C500CC",
+"[ c #9D00A3",
+"} c #009836",
+"| c #468000",
+"1 c #7D0083",
+"2 c #1B687D",
+"3 c #008830",
+"4 c #22829D",
+"5 c #00D44B",
+"6 c #00AA3C",
+"7 c #250492",
+"8 c #3304CB",
+"9 c #2E04B6",
+"0 c #3905E3",
+"a c #2904A3",
+"b c #2691B0",
+"c c #2AA2C5",
+"d c #00ED54",
+"e c #00BE43",
+"f c #2FB5DC",
+"g c #185D70",
+"h c #1E748C",
+"................",
+".+@#.$%&*=.-;>,.",
+".'').==*=.--!->.",
+".')).===.~!-!;-.",
+".))).=&.........",
+"..)'.&....{]^]{.",
+"./.).......((_].",
+".:<.........(((.",
+".:::.........]^.",
+"./[::.......}.|.",
+".1<:<[....2.}3..",
+".........44.556.",
+".78908a.bbc.d5e.",
+".88888.4fbc.6de.",
+".aa09.ghcc4.3e6.",
+"................"};
diff --git a/muse/muse/xpm/settings_configureshortcuts.xpm b/muse/muse/xpm/settings_configureshortcuts.xpm
new file mode 100644
index 00000000..bd858629
--- /dev/null
+++ b/muse/muse/xpm/settings_configureshortcuts.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static const char *settings_configureshortcuts_xpm[] = {
+"16 16 17 1",
+" c None",
+". c #000000",
+"+ c #808080",
+"@ c #646464",
+"# c #DCDCDC",
+"$ c #C3C3C3",
+"% c #A0A0A0",
+"& c #B8B8B8",
+"* c #787878",
+"= c #FFFFFF",
+"- c #EDEDED",
+"; c #585858",
+"> c #C2C2C2",
+", c #B7B7B7",
+"' c #E7E7E7",
+") c #303030",
+"! c #CFCFCF",
+" ...... ",
+" .+@#$%.. ",
+" .&*@#$%. ",
+"... ..&@#$. ",
+".=$.. .@##%. ",
+".=-#$.;@>##,. ",
+".@=-######'$%.. ",
+")=@*=--##'$!$%%.",
+".$#=@@@*%$-#!$,%",
+" ..$#$$$*@*=-#!$",
+" ...%#$$%@*=-#",
+" ....-#%@*=",
+" ..-#%@",
+" ..-#",
+" ..",
+" "};
diff --git a/muse/muse/xpm/settings_follow_song.xpm b/muse/muse/xpm/settings_follow_song.xpm
new file mode 100644
index 00000000..9a066715
--- /dev/null
+++ b/muse/muse/xpm/settings_follow_song.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static const char * settings_follow_song_xpm[] = {
+"16 16 11 1",
+" c None",
+". c #545454",
+"+ c #202020",
+"@ c #696969",
+"# c #7C7C7C",
+"$ c #000000",
+"% c #3C3C3C",
+"& c #C3C3C3",
+"* c #CBCBCB",
+"= c #8C8C8C",
+"- c #DCDCDC",
+" ",
+" .+@ ",
+" #$+%& ",
+" .$$+&#%% ",
+" .$$+&@$.. ",
+" .$$$&%$+@& ",
+" +$$$&%$+%& ",
+" $$$$&$$+%& ",
+" $$$+&+$$$& ",
+" $+@&++$$& ",
+" **&+$$$& ",
+" .$@&=.+&& ",
+" +$$& &&& ",
+" &&&.$@ ",
+" -- $++ ",
+" --- -- "};
diff --git a/muse/muse/xpm/settings_globalsettings.xpm b/muse/muse/xpm/settings_globalsettings.xpm
new file mode 100644
index 00000000..2593ee83
--- /dev/null
+++ b/muse/muse/xpm/settings_globalsettings.xpm
@@ -0,0 +1,89 @@
+/* XPM */
+static const char * settings_globalsettings_xpm[] = {
+"16 16 70 1",
+" c None",
+". c #BDBDBD",
+"+ c #000000",
+"@ c #B0B0B0",
+"# c #ABABAB",
+"$ c #CAC8C1",
+"% c #B5B5B5",
+"& c #EBEBE8",
+"* c #D7D7D7",
+"= c #D8D8D8",
+"- c #C4C4C4",
+"; c #F9F8F8",
+"> c #BBBBBB",
+", c #828282",
+"' c #D2D0CC",
+") c #F7F7F7",
+"! c #DEDBD6",
+"~ c #9C9C9C",
+"{ c #7B7B7B",
+"] c #7D7D7D",
+"^ c #D2D2D2",
+"/ c #D3D2CF",
+"( c #E3E2E1",
+"_ c #DFDEDC",
+": c #DBDAD7",
+"< c #A4A19C",
+"[ c #5F5F5F",
+"} c #292929",
+"| c #D3D3D3",
+"1 c #1C1C1C",
+"2 c #D2D1D0",
+"3 c #50504F",
+"4 c #101010",
+"5 c #3A3A3A",
+"6 c #494746",
+"7 c #D1D1D1",
+"8 c #DADADA",
+"9 c #363636",
+"0 c #C8C7C6",
+"a c #6C6967",
+"b c #CCCCCC",
+"c c #708295",
+"d c #CFD6DD",
+"e c #7C91A7",
+"f c #D6D5D5",
+"g c #8A8784",
+"h c #C9C9C9",
+"i c #7D8C9C",
+"j c #788DA4",
+"k c #7F99B3",
+"l c #1F272F",
+"m c #ECEBEA",
+"n c #72706D",
+"o c #CBCBCB",
+"p c #8D99A5",
+"q c #748AA2",
+"r c #849EB9",
+"s c #4D5F73",
+"t c #D5D4D3",
+"u c #6B6A69",
+"v c #7D91A7",
+"w c #849EBA",
+"x c #D6D6D6",
+"y c #525252",
+"z c #717171",
+"A c #484848",
+"B c #66798F",
+"C c #CACACA",
+"D c #6F6F6F",
+"E c #8D8D8D",
+" ",
+" .+@ #+#",
+" +$+# #+%+",
+" +&+* +=+#",
+" -+ +;+> ,++# ",
+" +'++)!+~ {+] ",
+" ^+/(_:<+[}{ ",
+" |+1++23+[ ",
+" 456+78 ",
+" +++9+0a+b ",
+" +cde+ +fg+h8 ",
+" +idjkl -+mn+o ",
+" +pdqrs+ +tu+b",
+" +dvws+^ x+2yz",
+" AvBs+C ++D",
+" EA++> "};
diff --git a/muse/muse/xpm/settings_metronome.xpm b/muse/muse/xpm/settings_metronome.xpm
new file mode 100644
index 00000000..985b1910
--- /dev/null
+++ b/muse/muse/xpm/settings_metronome.xpm
@@ -0,0 +1,99 @@
+/* XPM */
+static const char * settings_metronome_xpm[] = {
+"16 16 80 1",
+" c None",
+". c #C4B71A",
+"+ c #BAAE17",
+"@ c #B4AA40",
+"# c #D1C440",
+"$ c #E0D123",
+"% c #87824B",
+"& c #E9D926",
+"* c #F8E407",
+"= c #F9E60D",
+"- c #752D08",
+"; c #9D3D0B",
+"> c #82330A",
+", c #6D2B08",
+"' c #FCEE4E",
+") c #612607",
+"! c #813308",
+"~ c #DCD05F",
+"{ c #EADC49",
+"] c #933A09",
+"^ c #712D07",
+"/ c #6F5E58",
+"( c #2A1006",
+"_ c #C04B0C",
+": c #FCEB2D",
+"< c #6D2B07",
+"[ c #4E3826",
+"} c #FCEF5D",
+"| c #F7EA49",
+"1 c #470A31",
+"2 c #7A3108",
+"3 c #752F07",
+"4 c #704517",
+"5 c #F1E132",
+"6 c #FBED4A",
+"7 c #F1E141",
+"8 c #7C3B3A",
+"9 c #BC6130",
+"0 c #7F3F0A",
+"a c #482B0E",
+"b c #F5E537",
+"c c #ECDB33",
+"d c #51142E",
+"e c #8E5C41",
+"f c #A8420A",
+"g c #612D07",
+"h c #43260A",
+"i c #50350F",
+"j c #673013",
+"k c #A95A2E",
+"l c #693208",
+"m c #281003",
+"n c #341403",
+"o c #C1500D",
+"p c #B9541A",
+"q c #B85C29",
+"r c #706914",
+"s c #120803",
+"t c #331608",
+"u c #774A33",
+"v c #62290A",
+"w c #B6AA20",
+"x c #131307",
+"y c #2C1103",
+"z c #662F12",
+"A c #743008",
+"B c #7D3E1B",
+"C c #251309",
+"D c #331809",
+"E c #BA6334",
+"F c #B75D2C",
+"G c #73300B",
+"H c #793A17",
+"I c #7F3208",
+"J c #903909",
+"K c #883609",
+"L c #622809",
+"M c #371908",
+"N c #4D2108",
+"O c #722E07",
+" .+ ",
+" @#$% ",
+" &*=& ",
+" -;;> ",
+" ,'') ",
+" !,~{]^ /( ",
+" ^_:~_< [}|1",
+" 2^_{~_345678",
+" ^]9{{_0abcd ",
+" e;_f'{_ghid ",
+" jf_k{:lmno ",
+" j_pq_{rstq_u ",
+" vf_f_wxy]f_z ",
+" AApqpBCDEFpqGA ",
+" HHIJKLMNOOO^HH ",
+" aaaaaaaaaaaaaa"};
diff --git a/muse/muse/xpm/settings_midifileexport.xpm b/muse/muse/xpm/settings_midifileexport.xpm
new file mode 100644
index 00000000..ec65b59d
--- /dev/null
+++ b/muse/muse/xpm/settings_midifileexport.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static const char * settings_midifileexport_xpm[] = {
+"16 16 11 1",
+" c None",
+". c #292929",
+"+ c #000000",
+"@ c #676767",
+"# c #C9C9C9",
+"$ c #793C11",
+"% c #994C15",
+"& c #C2611B",
+"* c #4F270B",
+"= c #371B07",
+"- c #5F2F0D",
+" ",
+" . ",
+" ++ ",
+" +@+ ",
+" +#+# ",
+" +### ",
+" +# ++++++++",
+" +# +$%&&%$++",
+" +# +$%&&%$+$+",
+" +++#++++++++$$+",
+"++++#+$$%&%$+%&+",
+"++++#+*$$$$%+&$+",
+" ####+&$$=$%+$+#",
+" +$$%&%-++##",
+" ++++++++## ",
+" ######## "};
diff --git a/muse/muse/xpm/settings_midiport_softsynths.xpm b/muse/muse/xpm/settings_midiport_softsynths.xpm
new file mode 100644
index 00000000..b637e5c1
--- /dev/null
+++ b/muse/muse/xpm/settings_midiport_softsynths.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static const char * settings_midiport_softsynths_xpm[] = {
+"16 16 10 1",
+" c None",
+". c #000000",
+"+ c #CECECE",
+"@ c #313131",
+"# c #939393",
+"$ c #797979",
+"% c #595959",
+"& c #282828",
+"* c #A6A6A6",
+"= c #484848",
+" .... ",
+" . . ",
+" .. ..+ ",
+" @..@+ ",
+" #..$+ ",
+" ...... ",
+" ..+++ ",
+" ..+ ",
+" $$ ..+$$ ",
+" ... ..+ ... ",
+" ..$ ..+ $.. ",
+" $.%.. ..+..$.$ ",
+" $ +&......@++$ ",
+" *=....%++ ",
+" =..=++ ",
+" ++++ "};
diff --git a/muse/muse/xpm/settings_midisync.xpm b/muse/muse/xpm/settings_midisync.xpm
new file mode 100644
index 00000000..3bfdb180
--- /dev/null
+++ b/muse/muse/xpm/settings_midisync.xpm
@@ -0,0 +1,53 @@
+/* XPM */
+static const char * settings_midisync_xpm[] = {
+"16 16 34 1",
+" c None",
+". c #7C7C7C",
+"+ c #787878",
+"@ c #818181",
+"# c #747474",
+"$ c #757575",
+"% c #000000",
+"& c #636363",
+"* c #8C8C8C",
+"= c #909090",
+"- c #939393",
+"; c #8A8A8A",
+"> c #7F7F7F",
+", c #9A9A9A",
+"' c #777777",
+") c #949494",
+"! c #828282",
+"~ c #9E9E9E",
+"{ c #999999",
+"] c #888888",
+"^ c #979797",
+"/ c #929292",
+"( c #969696",
+"_ c #9B9B9B",
+": c #858585",
+"< c #848484",
+"[ c #898989",
+"} c #7A7A7A",
+"| c #7E7E7E",
+"1 c #808080",
+"2 c #838383",
+"3 c #737373",
+"4 c #6A6A6A",
+"5 c #676767",
+" ",
+" ",
+" .+@#$% ",
+" & **% ",
+" =% ",
+" +% #% ",
+" -;>% >% ",
+" +;,'.% )!-~{)]%",
+"^/(_{-]% :,<[!% ",
+" }@% .|>% ",
+" 12% <% ",
+" }<%% ",
+" 34% 4% ",
+" }55}% ",
+" ",
+" "};
diff --git a/muse/muse/xpm/solobutton.xpm b/muse/muse/xpm/solobutton.xpm
new file mode 100644
index 00000000..e0c1002a
--- /dev/null
+++ b/muse/muse/xpm/solobutton.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static const char * solobutton_xpm[] = {
+"22 22 14 1",
+" c None",
+". c #000000",
+"+ c #F10606",
+"@ c #414141",
+"# c #852A2A",
+"$ c #473E3E",
+"% c #723030",
+"& c #CB1212",
+"* c #4E3C3C",
+"= c #E20A0A",
+"- c #A51F1F",
+"; c #9E2121",
+"> c #832A2A",
+", c #9C2222",
+"......................",
+". .",
+". .",
+". .",
+". + .",
+". ++ .",
+". +++ .",
+". @@@@@@@@@#+++ .",
+". $@@@@@@@%++& .",
+". *$ ++=@ .",
+". +- +++;@ .",
+". >++ ++++@@ .",
+". @+++ +++ @@ .",
+". @@+++++++ @@ .",
+". @@ +++++ @@ .",
+". @@ ++++ @@ .",
+". @@ ++ @@ .",
+". @@@@@,+@@@@@ .",
+". @@@@@@@@@@@@ .",
+". .",
+". .",
+"......................"};
diff --git a/muse/muse/xpm/solobutton_off.xpm b/muse/muse/xpm/solobutton_off.xpm
new file mode 100644
index 00000000..31cc8e5a
--- /dev/null
+++ b/muse/muse/xpm/solobutton_off.xpm
@@ -0,0 +1,146 @@
+/* XPM */
+static const char * solobutton_off_xpm[] = {
+"22 22 121 2",
+" c #000000",
+". c #720000",
+"+ c #7B0000",
+"@ c #810000",
+"# c #840000",
+"$ c #870000",
+"% c #8D0000",
+"& c #930000",
+"* c #980000",
+"= c #9C0000",
+"- c #9B0000",
+"; c #970000",
+"> c #900000",
+", c #8C0000",
+"' c #850000",
+") c #800000",
+"! c #760000",
+"~ c #730000",
+"{ c #710000",
+"] c #770000",
+"^ c #A10000",
+"/ c #A90000",
+"( c #AE0000",
+"_ c #B10000",
+": c #B60000",
+"< c #B50000",
+"[ c #B30000",
+"} c #AC0000",
+"| c #A70000",
+"1 c #9E0000",
+"2 c #8F0000",
+"3 c #890000",
+"4 c #7F0000",
+"5 c #7A0000",
+"6 c #7C0000",
+"7 c #8E0000",
+"8 c #A00000",
+"9 c #AD0000",
+"0 c #B80000",
+"a c #C00000",
+"b c #C60000",
+"c c #C80000",
+"d c #CB0000",
+"e c #C70000",
+"f c #BB0000",
+"g c #B20000",
+"h c #A30000",
+"i c #960000",
+"j c #860000",
+"k c #920000",
+"l c #BA0000",
+"m c #C50000",
+"n c #CE0000",
+"o c #D40000",
+"p c #D80000",
+"q c #D70000",
+"r c #DA0000",
+"s c #D10000",
+"t c #C90000",
+"u c #C30000",
+"v c #B40000",
+"w c #A40000",
+"x c #910000",
+"y c #7D0000",
+"z c #950000",
+"A c #AB0000",
+"B c #BD0000",
+"C c #CC0000",
+"D c #D60000",
+"E c #DF0000",
+"F c #E30000",
+"G c #E10000",
+"H c #DC0000",
+"I c #D00000",
+"J c #C20000",
+"K c #BC0000",
+"L c #A50000",
+"M c #AF0000",
+"N c #414141",
+"O c #CD0000",
+"P c #B90000",
+"Q c #AA0000",
+"R c #9A0000",
+"S c #473E3E",
+"T c #D10100",
+"U c #A80000",
+"V c #880000",
+"W c #D20000",
+"X c #E50000",
+"Y c #E80000",
+"Z c #E40200",
+"` c #D50100",
+" . c #D50000",
+".. c #D90000",
+"+. c #DE0000",
+"@. c #E20000",
+"#. c #E40000",
+"$. c #E70000",
+"%. c #E90000",
+"&. c #DB0000",
+"*. c #CA0000",
+"=. c #BE0000",
+"-. c #E00000",
+";. c #E60000",
+">. c #7E0000",
+",. c #DD0000",
+"'. c #BF0000",
+"). c #D30000",
+"!. c #990000",
+"~. c #B00000",
+"{. c #940000",
+"]. c #7A0100",
+"^. c #A60000",
+"/. c #9D0000",
+"(. c #9D0101",
+"_. c #7B0200",
+":. c #8C0100",
+"<. c #9E0101",
+"[. c #8F0101",
+"}. c #7F0101",
+"|. c #720101",
+" ",
+" . + @ # $ % & & * = - ; > , ' ) + ! ~ { ",
+" ] $ & - ^ / ( _ : < [ } | 1 * 2 3 # 4 5 ",
+" 6 7 8 9 0 a b b c d e a f g / h - i 7 j ",
+" 6 k | l m n o p q r q s t u f v 9 w - x ",
+" y z A B C D r E F F G H q I d J K g L z ",
+" ) * M N N N N N N N N N N N N O m P Q i ",
+" # R _ S N N N N N N N N N N N T t f U & ",
+" V 8 : N N W p r E X Y X Z N N ` C f L % ",
+" % L l N N ...r +.@.#.$.%.N N q d 0 ^ 3 ",
+" > / K N N p p r &.+.@.#.Y N N p *.< - @ ",
+" > / =.N N H &.&.&.&.E -.;.N N ..t g R >. ",
+" x U =.N N &.,.&.p ..r H E N N p t [ i 6 ",
+" 2 U '.N N &.+...D . ...,.N N q c _ i y ",
+" % w f N N p &.D ).).). .r N N q t g i >. ",
+" V 8 : N N ).D ).s I ).D H N N D e g ; >. ",
+" # !.~.N N N N N N N N N N N N o e ~.; >. ",
+" 4 & / N N N N N N N N N N N N n J 9 {.y ",
+" ].x h g l f '.=.a m t O ).).I c f ^.> + ",
+" ].% /.Q M [ [ v 0 f '.u e b u l ~.(.$ ! ",
+" _.:.!.8 ^.L L ^.Q A ~.[ < v M U <.[.}.|. ",
+" "};
diff --git a/muse/muse/xpm/solobutton_on.xpm b/muse/muse/xpm/solobutton_on.xpm
new file mode 100644
index 00000000..c53e5884
--- /dev/null
+++ b/muse/muse/xpm/solobutton_on.xpm
@@ -0,0 +1,300 @@
+/* XPM */
+static const char * solobutton_on_xpm[] = {
+"22 22 275 2",
+" c #000000",
+". c #066714",
+"+ c #056613",
+"@ c #076915",
+"# c #076A15",
+"$ c #076A16",
+"% c #086B17",
+"& c #096C18",
+"* c #066B15",
+"= c #066B14",
+"- c #076F17",
+"; c #0C751C",
+"> c #107B20",
+", c #0F7C1F",
+"' c #0D791D",
+") c #097318",
+"! c #066E15",
+"~ c #066C14",
+"{ c #066814",
+"] c #086B16",
+"^ c #0A6F19",
+"/ c #0B711A",
+"( c #0B721B",
+"_ c #0C731C",
+": c #0C731B",
+"< c #0A731A",
+"[ c #097219",
+"} c #077318",
+"| c #0A781B",
+"1 c #0E7E1F",
+"2 c #118522",
+"3 c #128722",
+"4 c #0F8321",
+"5 c #0B7D1B",
+"6 c #077517",
+"7 c #067016",
+"8 c #056713",
+"9 c #066914",
+"0 c #086D17",
+"a c #0A721A",
+"b c #0F771E",
+"c c #107A20",
+"d c #117D21",
+"e c #127E21",
+"f c #117F21",
+"g c #0E7D1F",
+"h c #0D801E",
+"i c #0F8620",
+"j c #128F25",
+"k c #159627",
+"l c #169828",
+"m c #159427",
+"n c #F10606",
+"o c #0B821C",
+"p c #087718",
+"q c #086E17",
+"r c #0B731A",
+"s c #0F791F",
+"t c #138223",
+"u c #168727",
+"v c #188A29",
+"w c #178D28",
+"x c #168D27",
+"y c #158C26",
+"z c #128D25",
+"A c #129125",
+"B c #149926",
+"C c #17A22B",
+"D c #19AA2D",
+"E c #1AAC2E",
+"F c #119122",
+"G c #0C831D",
+"H c #066D15",
+"I c #0A7119",
+"J c #0C7A1D",
+"K c #118323",
+"L c #178D29",
+"M c #1B952E",
+"N c #1B9C2E",
+"O c #1A9E2E",
+"P c #199C2B",
+"Q c #189D2B",
+"R c #189E2B",
+"S c #17A32C",
+"T c #18AC2E",
+"U c #19B630",
+"V c #1CC033",
+"W c #16A22A",
+"X c #129025",
+"Y c #097519",
+"Z c #0F801F",
+"` c #158E27",
+" . c #414141",
+".. c #852A2A",
+"+. c #1CC335",
+"@. c #19B130",
+"#. c #179C2A",
+"$. c #067015",
+"%. c #097A1A",
+"&. c #108922",
+"*. c #17982A",
+"=. c #473E3E",
+"-. c #723030",
+";. c #CB1212",
+">. c #1CDA38",
+",. c #1DD038",
+"'. c #1BB832",
+"). c #19A22D",
+"!. c #067215",
+"~. c #0A7F1B",
+"{. c #119124",
+"]. c #18A22D",
+"^. c #4E3C3C",
+"/. c #1BCB35",
+"(. c #1ACD35",
+"_. c #19CB34",
+":. c #1AC932",
+"<. c #18C833",
+"[. c #18CC33",
+"}. c #E20A0A",
+"|. c #1BDF37",
+"1. c #1CD136",
+"2. c #1CBD35",
+"3. c #19A42E",
+"4. c #087618",
+"5. c #0B821D",
+"6. c #129725",
+"7. c #A51F1F",
+"8. c #18D435",
+"9. c #18D433",
+"0. c #18D333",
+"a. c #18D033",
+"b. c #19CE33",
+"c. c #9E2121",
+"d. c #19DB36",
+"e. c #1ACF36",
+"f. c #1BBB33",
+"g. c #1AA22E",
+"h. c #087818",
+"i. c #0C861E",
+"j. c #129B26",
+"k. c #18B12F",
+"l. c #832A2A",
+"m. c #19D833",
+"n. c #17D433",
+"o. c #19D534",
+"p. c #1ACB34",
+"q. c #1AB832",
+"r. c #199F2D",
+"s. c #087918",
+"t. c #0D891F",
+"u. c #129C26",
+"v. c #17B22F",
+"w. c #17D232",
+"x. c #16D531",
+"y. c #19D034",
+"z. c #18C432",
+"A. c #19B230",
+"B. c #169A2A",
+"C. c #087A19",
+"D. c #0D881F",
+"E. c #139C27",
+"F. c #17AF2D",
+"G. c #14D130",
+"H. c #16CC31",
+"I. c #18C132",
+"J. c #18B02E",
+"K. c #159828",
+"L. c #0A7A1A",
+"M. c #149C27",
+"N. c #17AE2D",
+"O. c #16C830",
+"P. c #14CD2E",
+"Q. c #14CE30",
+"R. c #17CA31",
+"S. c #15BF2F",
+"T. c #15AE2B",
+"U. c #129624",
+"V. c #0E8821",
+"W. c #17AD2E",
+"X. c #17C730",
+"Y. c #16CA31",
+"Z. c #15C92E",
+"`. c #14CB2E",
+" + c #14C72E",
+".+ c #14BD2C",
+"++ c #11AD29",
+"@+ c #0F9423",
+"#+ c #0B7B1A",
+"$+ c #0F8720",
+"%+ c #139B26",
+"&+ c #16AA2B",
+"*+ c #17C72F",
+"=+ c #15CB30",
+"-+ c #15CC31",
+";+ c #15C82F",
+">+ c #16C730",
+",+ c #11C52C",
+"'+ c #10BA29",
+")+ c #0FA825",
+"!+ c #0C9020",
+"~+ c #0B791C",
+"{+ c #0D871F",
+"]+ c #119625",
+"^+ c #15A82A",
+"/+ c #9C2222",
+"(+ c #10C02A",
+"_+ c #0EB526",
+":+ c #0DA322",
+"<+ c #0A8D1D",
+"[+ c #097419",
+"}+ c #0E9121",
+"|+ c #11A126",
+"1+ c #0EB426",
+"2+ c #0DAA23",
+"3+ c #0B9A20",
+"4+ c #08871B",
+"5+ c #077217",
+"6+ c #0A871D",
+"7+ c #0D9521",
+"8+ c #10A425",
+"9+ c #11AE27",
+"0+ c #11B228",
+"a+ c #12B529",
+"b+ c #11B628",
+"c+ c #10B429",
+"d+ c #10B227",
+"e+ c #10AF27",
+"f+ c #10AC27",
+"g+ c #0FAB26",
+"h+ c #0EA824",
+"i+ c #0DA624",
+"j+ c #0CA221",
+"k+ c #0B9C20",
+"l+ c #088F1C",
+"m+ c #068018",
+"n+ c #056D13",
+"o+ c #057214",
+"p+ c #067A17",
+"q+ c #09841B",
+"r+ c #0C911E",
+"s+ c #0D9921",
+"t+ c #0E9F22",
+"u+ c #0EA123",
+"v+ c #0DA222",
+"w+ c #0DA123",
+"x+ c #0C9C21",
+"y+ c #0B981F",
+"z+ c #0C971F",
+"A+ c #0C951F",
+"B+ c #0B931F",
+"C+ c #0A911E",
+"D+ c #088E1C",
+"E+ c #07891A",
+"F+ c #058218",
+"G+ c #047715",
+"H+ c #036812",
+"I+ c #046C12",
+"J+ c #047014",
+"K+ c #057615",
+"L+ c #077D19",
+"M+ c #09831B",
+"N+ c #09871C",
+"O+ c #08891C",
+"P+ c #088A1B",
+"Q+ c #078619",
+"R+ c #078419",
+"S+ c #078018",
+"T+ c #067D18",
+"U+ c #067C18",
+"V+ c #067D17",
+"W+ c #057B16",
+"X+ c #047815",
+"Y+ c #037313",
+"Z+ c #036D12",
+" ",
+" . + + . @ # $ % & % * = - ; > , ' ) ! ~ ",
+" . + { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 ",
+" 8 9 0 a b c d e f g 1 h i j k l m n o p ",
+" { q r s t u v w x y z A B C D E n n F G ",
+" H I J K L M N O P Q R S T U V n n n W X ",
+" H Y Z ` . . . . . . . . ...n n n +.@.#. ",
+" $.%.&.*.=. . . . . . . .-.n n ;.>.,.'.). ",
+" !.~.{.].^.=./.(._.:.<.[.n n }. .|.1.2.3. ",
+" 4.5.6.T n 7.8.9.0.a.b.n n n c. .d.e.f.g. ",
+" h.i.j.k.l.n n m.n.0.n n n n . .o.p.q.r. ",
+" s.t.u.v. .n n n w.w.n n n x. . .y.z.A.B. ",
+" C.D.E.F. . .n n n n n n n G. . .H.I.J.K. ",
+" L.t.M.N. . .O.n n n n n P.Q. . .R.S.T.U. ",
+" L.V.M.W. . .X.Y.n n n n Z.`. . . +.+++@+ ",
+" #+$+%+&+ . .*+=+-+n n ;+>+;+ . .,+'+)+!+ ",
+" ~+{+]+^+ . . . . ./+n . . . . .(+_+:+<+ ",
+" [+5.}+|+ . . . . . . . . . . . .1+2+3+4+ ",
+" 5+C.6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+l+m+ ",
+" n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+ ",
+" H+I+J+K+L+M+N+O+P+E+Q+R+S+T+U+V+W+X+Y+Z+ ",
+" "};
diff --git a/muse/muse/xpm/speaker.xpm b/muse/muse/xpm/speaker.xpm
new file mode 100644
index 00000000..1595e298
--- /dev/null
+++ b/muse/muse/xpm/speaker.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * speaker_xpm[] = {
+"18 18 2 1",
+" c None",
+". c #000000",
+" ",
+" .. ",
+" . . ",
+" . . ",
+" . . ",
+" ..... . ",
+" . . ",
+" . . ",
+" . . ",
+" . . ",
+" . . ",
+" . . ",
+" ..... . ",
+" . . ",
+" . . ",
+" . . ",
+" .. ",
+" "};
diff --git a/muse/muse/xpm/splash.png b/muse/muse/xpm/splash.png
new file mode 100644
index 00000000..077e305e
--- /dev/null
+++ b/muse/muse/xpm/splash.png
Binary files differ
diff --git a/muse/muse/xpm/start.xpm b/muse/muse/xpm/start.xpm
new file mode 100644
index 00000000..cc5b8f9c
--- /dev/null
+++ b/muse/muse/xpm/start.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static const char * start_xpm[] = {
+"17 12 2 1",
+" c None",
+". c #000000",
+" .... . ",
+" .... ... ",
+" .... ... ",
+" .... .... ",
+" .... .... ",
+" .... ..... ",
+" .... ..... ",
+" .... .... ",
+" .... .... ",
+" .... ... ",
+" .... ... ",
+" .... . "};
diff --git a/muse/muse/xpm/steprec.xpm b/muse/muse/xpm/steprec.xpm
new file mode 100644
index 00000000..4c606c15
--- /dev/null
+++ b/muse/muse/xpm/steprec.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char* steprec_xpm[]={
+"18 18 3 1",
+". c None",
+"a c #ffffff",
+"# c #ff0000",
+"......#####.......",
+"....##aaaaa##.....",
+"...#aaa####aa#....",
+"..#aa########a#...",
+".#aaa##aaaa##aa#..",
+".#aaa##aaaaaaaa#..",
+"#aaaa##aaaaaaaaa#.",
+"#aaaaa#####aaaaa#.",
+"#aaaaaa#####aaaa#.",
+"#aaaaaaaaaa##aaa#.",
+"#aaaa#aaaaa##aaa#.",
+".#aaa##aaaa##aa#..",
+".#aaaa#######aa#..",
+"..#aaaa#####aa#...",
+"...#aaaaaaaaa#....",
+"....##aaaaa##.....",
+"......#####.......",
+".................."};
diff --git a/muse/muse/xpm/stereo.xpm b/muse/muse/xpm/stereo.xpm
new file mode 100644
index 00000000..c2787780
--- /dev/null
+++ b/muse/muse/xpm/stereo.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static const char* stereo_xpm[] = {
+"15 9 2 1",
+" c none",
+". c #303030",
+" ..... ..... ",
+" ............. ",
+"... ... ...",
+".. ... ..",
+".. .... ..",
+".. ... ..",
+"... ... ...",
+" ............. ",
+" ..... ..... "};
diff --git a/muse/muse/xpm/stick.xpm b/muse/muse/xpm/stick.xpm
new file mode 100644
index 00000000..b5817f1f
--- /dev/null
+++ b/muse/muse/xpm/stick.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static const char * stick_xpm[] = {
+"16 16 14 1",
+" c None",
+". c #000100",
+"+ c #9FA19E",
+"@ c #A29FA3",
+"# c #2F312E",
+"$ c #878A8A",
+"% c #ABAFB0",
+"& c #DDE2E5",
+"* c #6D706F",
+"= c #6D6F6C",
+"- c #D3D8DA",
+"; c #C2C4C0",
+"> c #7F817E",
+", c #868885",
+" . ",
+" ..+ ",
+" ..@+ . ",
+" ..++ ..+",
+" ..@@ ..++",
+" ##...## ..++ ",
+" .$%..$$...@@ ",
+" #$%&&&%...++ ",
+" ##$%&%$..#@ ",
+" #*#####..#@ ",
+" #*$&&%$=#..... ",
+" #*%&&&-*..;@;>.",
+" #$&&%,##.>;;..",
+" ###### ......",
+" .+>>. ",
+" ... "};
diff --git a/muse/muse/xpm/stop.xpm b/muse/muse/xpm/stop.xpm
new file mode 100644
index 00000000..c4c5dbe2
--- /dev/null
+++ b/muse/muse/xpm/stop.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static const char * stop_xpm[] = {
+"12 12 2 1",
+" c None",
+". c #000000",
+" ",
+" .......... ",
+" .......... ",
+" .......... ",
+" .......... ",
+" .......... ",
+" .......... ",
+" .......... ",
+" .......... ",
+" .......... ",
+" .......... ",
+" "};
diff --git a/muse/muse/xpm/sysex.xpm b/muse/muse/xpm/sysex.xpm
new file mode 100644
index 00000000..3cc5734e
--- /dev/null
+++ b/muse/muse/xpm/sysex.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char * sysex_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000000000",
+" ... . ",
+" . .. ",
+" . . ",
+" .. .. .. ... ",
+" ... . . . . ",
+" .. . .. .. ",
+" . . . . .. ",
+" .. .. .. . . ",
+" . ... . ... ",
+" . ",
+" . ",
+" .. ",
+" ....... ",
+" . . ",
+" . ",
+" . . .. .. ",
+" ..... . . ",
+" . . . ",
+" . . ",
+" . . . . ",
+" ....... .. .. ",
+" "};
diff --git a/muse/muse/xpm/toc.xpm b/muse/muse/xpm/toc.xpm
new file mode 100644
index 00000000..e8791dbc
--- /dev/null
+++ b/muse/muse/xpm/toc.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char*toc_xpm[]={
+"18 18 6 1",
+"d c #a0a0a0",
+"# c #c0c0c0",
+"a c #000000",
+". c None",
+"c c #00c000",
+"b c #ffffff",
+"..................",
+"..................",
+".#aaaaaaaaaaa.....",
+".#a...abbba#a#....",
+".#a#c#abbba#.aa#..",
+".#a.c.abbba###a#..",
+".#a.c.abbbaaaaa#..",
+".#a#c#abbbbbbba#..",
+".#a.c.abdddbbba#..",
+".#a.c.abbbbbbba#..",
+".#a#c.abbddddba##.",
+".#a#c.abbbbbbba##.",
+".#a#c.abbbbbbba##.",
+".#a#c.abddddbba##.",
+".#a...abbbbbbba#..",
+".#aaaaaaaaaaaaa#..",
+"..............###.",
+".................."};
diff --git a/muse/muse/xpm/track_add.xpm b/muse/muse/xpm/track_add.xpm
new file mode 100644
index 00000000..0d78d13b
--- /dev/null
+++ b/muse/muse/xpm/track_add.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char *track_add_xpm[]={
+"16 16 4 1",
+"b c #404000",
+"a c #808080",
+". c #c00000",
+"# c #ffffff",
+"................",
+"................",
+"..############..",
+"..############..",
+"..a#a#a#a#a#a#..",
+".bbbbbbbbbbbbbb.",
+"..a#a#a#a#a#a#..",
+"..a#a#a#a#a#a#..",
+"..a#a#a#a#a#a#..",
+"..a#a#a#a#a#a#..",
+".bbbbbbbbbbbbbb.",
+"..a#a#a#a#a#a#..",
+"..############..",
+"..############..",
+"................",
+"................"};
diff --git a/muse/muse/xpm/track_delete.xpm b/muse/muse/xpm/track_delete.xpm
new file mode 100644
index 00000000..e8a60338
--- /dev/null
+++ b/muse/muse/xpm/track_delete.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static const char *track_delete_xpm[]={
+"16 16 4 1",
+"b c #404000",
+"a c #808080",
+". c #c00000",
+"# c #ffffff",
+"................",
+"................",
+"....##########..",
+".....#########..",
+"..a...a#a#a#a#..",
+".bbb...bbbbbbbb.",
+"..a#a...a#a#a#..",
+"..a#a#...#a#a#..",
+"..a#a#a...a#a#..",
+"..a#a#a#...#a#..",
+".bbbbbbbb...bbb.",
+"..a#a#a#a#...#..",
+"..#########.....",
+"..##########....",
+"................",
+"................"};
diff --git a/muse/muse/xpm/underlined.xpm b/muse/muse/xpm/underlined.xpm
new file mode 100644
index 00000000..a84a1e7d
--- /dev/null
+++ b/muse/muse/xpm/underlined.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static const char * underlined_xpm[] = {
+"11 11 2 1",
+" g None",
+". g #000000",
+" .... ... ",
+" .. . ",
+" .. . ",
+" .. . ",
+" .. . ",
+" .. . ",
+" .. . ",
+" ... .. ",
+" ..... ",
+" ",
+" ......... "};
diff --git a/muse/muse/xpm/undo.xpm b/muse/muse/xpm/undo.xpm
new file mode 100644
index 00000000..4ba2b07b
--- /dev/null
+++ b/muse/muse/xpm/undo.xpm
@@ -0,0 +1,93 @@
+/* XPM */
+static const char * undo_xpm[] = {
+"22 22 68 1",
+" c None",
+". c #275F0B",
+"+ c #9AC589",
+"@ c #CDE2C1",
+"# c #E5EEDF",
+"$ c #F5F9F4",
+"% c #C7E0BA",
+"& c #79BE53",
+"* c #91D56B",
+"= c #C8E1BE",
+"- c #87C86A",
+"; c #4AA721",
+"> c #3FA21C",
+", c #47AB29",
+"' c #000000",
+") c #8AC963",
+"! c #5BC930",
+"~ c #6FD63D",
+"{ c #53B529",
+"] c #D4E4CB",
+"^ c #2B6A0E",
+"/ c #35691B",
+"( c #FFFFFF",
+"_ c #E4ECDF",
+": c #A7C49A",
+"< c #42A01E",
+"[ c #102806",
+"} c #060D03",
+"| c #0E2005",
+"1 c #41821F",
+"2 c #79B658",
+"3 c #1C4408",
+"4 c #ECF3E8",
+"5 c #7FCC67",
+"6 c #72C24F",
+"7 c #0B1B05",
+"8 c #1C4508",
+"9 c #3A8816",
+"0 c #38AA18",
+"a c #34A814",
+"b c #51B929",
+"c c #469D24",
+"d c #122B06",
+"e c #275E0D",
+"f c #40A513",
+"g c #CCE5C2",
+"h c #48B227",
+"i c #4BB626",
+"j c #79D54B",
+"k c #081204",
+"l c #173807",
+"m c #88BE71",
+"n c #3F8222",
+"o c #478824",
+"p c #5B923C",
+"q c #3E8320",
+"r c #529033",
+"s c #071003",
+"t c #020202",
+"u c #15260E",
+"v c #0F1C09",
+"w c #070D04",
+"x c #12230A",
+"y c #102009",
+"z c #15270C",
+"A c #234413",
+"B c #13250A",
+"C c #13200C",
+" ",
+" ",
+" ..... ",
+" ..+@#@+.. ",
+" ..$%&&&&*#+. ",
+" . .$=-;;>>>>,*#' ",
+" .. .$);>!~~~~!{>*+' ",
+" .]..$)>!~{''''^/{>(' ",
+" .]_:)<~{'[ }|^12+3",
+" .456<~{' 789(3",
+" .40abc' def3",
+" .ghaij3 kl3 ",
+" .mnopqr3 s3' ",
+" .'''''''t u3 ",
+" v3w ",
+" x3y ",
+" zAB ",
+" C3' ",
+" ''' ",
+" ",
+" ",
+" "};
diff --git a/muse/muse/xpm/undoS.xpm b/muse/muse/xpm/undoS.xpm
new file mode 100644
index 00000000..f8520fd7
--- /dev/null
+++ b/muse/muse/xpm/undoS.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static const char * undoS_xpm[] = {
+"16 16 6 1",
+" c None",
+". c #000000",
+"+ c #00FF00",
+"@ c #00C000",
+"# c #008000",
+"$ c #004000",
+" ",
+" .... ",
+" ..+++@.. ",
+". .++@@@#@#. ",
+".# .+@@@#..$##. ",
+".+.+@@#.. ..$. ",
+".++@@#. .$.",
+".+@@@. ...",
+".+@@@. ...",
+".+##### ...",
+"........ .. ",
+" ... ",
+" ... ",
+" .... ",
+" ... ",
+" "};
diff --git a/muse/muse/xpm/up.xpm b/muse/muse/xpm/up.xpm
new file mode 100644
index 00000000..94ad7cd5
--- /dev/null
+++ b/muse/muse/xpm/up.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static const char* up_xpm[]={
+"14 10 2 1",
+"# c #000000",
+". c None",
+"..............",
+"......##......",
+".....####.....",
+"....######....",
+"...##.##.##...",
+"......##......",
+"......##......",
+"......##......",
+"......##......",
+".............."};
diff --git a/muse/muse/xpm/view_bigtime_window.xpm b/muse/muse/xpm/view_bigtime_window.xpm
new file mode 100644
index 00000000..9ff59a5a
--- /dev/null
+++ b/muse/muse/xpm/view_bigtime_window.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * view_bigtime_window_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #D4D4D4",
+"+ c #000000",
+" .++. ",
+" .++..++. ",
+" +. ++ .+ ",
+" +. ++ .+ ",
+" .. ++. .. ",
+" + ++. + ",
+".+ ++. +.",
+"+. ++. .+",
+"+. + .. .+",
+".+ + . +.",
+" + + . + ",
+" ..+ . .. ",
+" +.. .+ ",
+" +. .+ ",
+" .++..++. ",
+" .++. "};
diff --git a/muse/muse/xpm/view_cliplist.xpm b/muse/muse/xpm/view_cliplist.xpm
new file mode 100644
index 00000000..6217b397
--- /dev/null
+++ b/muse/muse/xpm/view_cliplist.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static const char * view_cliplist_xpm[] = {
+"16 16 13 1",
+" c None",
+". c #5E2ABF",
+"+ c #945BFD",
+"@ c #000000",
+"# c #DCDCDC",
+"$ c #CACACA",
+"% c #E6E6E6",
+"& c #EAEAEA",
+"* c #FFFFFF",
+"= c #FCFCFC",
+"- c #461F8E",
+"; c #FBFBFB",
+"> c #F9F9F9",
+"................",
+".+@@@@@@@@@@+++.",
+".+@####$###@@++.",
+".+@%&@***@*@@@+.",
+".+@%@@#&@@#*=@-.",
+".+@%@@#*@@#@=@-.",
+".+@;&@#**@#*@@-.",
+".+@;&&#&&*#@=@-.",
+".+@;&@***@*=@@-.",
+".+@%@@#&@@#@>@-.",
+".+@%@@#*@@#=@@-.",
+".+@%%@#;;@#@=@-.",
+".+@;%%#;%;#;#@-.",
+".+@@@@@@@@@@@@-.",
+".++------------.",
+"................"};
diff --git a/muse/muse/xpm/view_marker.xpm b/muse/muse/xpm/view_marker.xpm
new file mode 100644
index 00000000..26dba09a
--- /dev/null
+++ b/muse/muse/xpm/view_marker.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static const char * view_marker_xpm[] = {
+"16 16 18 1",
+" c None",
+". c #DCDCDC",
+"+ c #0C0C0C",
+"@ c #253B52",
+"# c #395B7F",
+"$ c #588DC4",
+"% c #531228",
+"& c #C3B2E5",
+"* c #240E16",
+"= c #5F132A",
+"- c #828282",
+"; c #542838",
+"> c #232323",
+", c #020202",
+"' c #BDBDBD",
+") c #4C4C4C",
+"! c #A6A6A6",
+"~ c #331B5F",
+" ... ",
+" ... . ",
+". ++++ . ",
+".+@#$#++. ... ",
+".+#$$$$#+. . ..",
+" ++$$$$#++++++++",
+"..+$$$$#+#$$#++.",
+" .+$$##@%$$++ &",
+" +**+=$$+. . ",
+" +- . *; . ",
+" -> ",
+" ,' ",
+" +) ",
+" !+ ",
+" ++ ",
+" ~ "};
diff --git a/muse/muse/xpm/view_mixer.xpm b/muse/muse/xpm/view_mixer.xpm
new file mode 100644
index 00000000..ec64f3c8
--- /dev/null
+++ b/muse/muse/xpm/view_mixer.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static const char * view_mixer_xpm[] = {
+"16 16 7 1",
+" c None",
+". c #5E2ABF",
+"+ c #945BFD",
+"@ c #FFFFFF",
+"# c #000000",
+"$ c #CACACA",
+"% c #5727B0",
+"................",
+".++++++++++++++.",
+".+@@@@@@@@@@@@+.",
+".+@#@@#@@#@@#@+.",
+".+###@#$###@#$+.",
+".+###$#$###$#$+.",
+".+@#$$#$@#$$#$+.",
+".+@#$@#$@#$###+.",
+".+@#$@#$@#$###%.",
+".+@#$@#$@#$@#$%.",
+".+@#$###@#$@#$+.",
+".+@#$###$#$@#$+.",
+".+@@$@@@$@$@@$+.",
+".+@@@@@@@@@@@@+.",
+".++++++++++++++.",
+"................"};
diff --git a/muse/muse/xpm/view_transport_window.xpm b/muse/muse/xpm/view_transport_window.xpm
new file mode 100644
index 00000000..fba8696f
--- /dev/null
+++ b/muse/muse/xpm/view_transport_window.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char * view_transport_window_xpm[] = {
+"16 16 5 1",
+" c None",
+". c #575757",
+"+ c #000000",
+"@ c #D4D4D4",
+"# c #D1CFD5",
+" .+. ",
+" .+++. ",
+" .+++.@ ",
+" .+.@@ ",
+" ",
+" ",
+" .+++.@ ",
+" .+++++@ ",
+" .@++++@ ",
+" @++.@@ ",
+" ++ ",
+" .++@@ ",
+" +++@++ ",
+" .+++++.@ ",
+" .++++.@# ",
+" @@@@@@ "};
diff --git a/muse/muse/xpm/wave.xpm b/muse/muse/xpm/wave.xpm
new file mode 100644
index 00000000..f2a93c66
--- /dev/null
+++ b/muse/muse/xpm/wave.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static const char * wave_xpm[] = {
+"16 16 14 1",
+" c None",
+". c #828282",
+"+ c #000000",
+"@ c #7F7F7F",
+"# c #8A8A8A",
+"$ c #4B4B4B",
+"% c #444444",
+"& c #E50000",
+"* c #290000",
+"= c #FF0000",
+"- c #1E0000",
+"; c #F20000",
+"> c #1B0000",
+", c #D50000",
+" ",
+" . ",
+" .+. ",
+" @@ #+@+# ",
+" $++$ +@ @+ ",
+" +@@+ + + @",
+" + + + + %",
+" + + + + +",
+" + + + + +",
+" + + + + +",
+"&*==-&;&>,==+;=+",
+"%+ + + + +",
+"+@ +@ @+ + +",
+"% #+@+# +@@+",
+"@ .+. $++$",
+" . @@ "};
diff --git a/muse/packaging/muse_icon.png b/muse/packaging/muse_icon.png
new file mode 100644
index 00000000..5a1acb96
--- /dev/null
+++ b/muse/packaging/muse_icon.png
Binary files differ
diff --git a/muse/packaging/muse_mdk.spec b/muse/packaging/muse_mdk.spec
new file mode 100755
index 00000000..1a7a68ff
--- /dev/null
+++ b/muse/packaging/muse_mdk.spec
@@ -0,0 +1,274 @@
+%define name muse
+%define museversion 0.7.0pre3
+%define release 1thac
+%define alsa_version 0.9.8
+%define jackit_version 0.93.11
+%define libjack0_version 0.93.11
+%define libsndfile1_version 1.0.5
+%define ladspa_version 1.12
+%define glib2_0_version 2.2.3
+%define qtversion 3.2
+%define dssslver 1.78
+%define musever 0.7.0pre3
+%define musedir 0.7.0pre3
+%define capver 1.0
+%define fluidsynth_version 1.0.3
+%define graphviz_version 1.9.0
+%define jade_version 1.3.1
+%define doxy_version 1.2.17
+%define ladccaver 0.4.0
+
+%define major 0
+%define libname %mklibname %name %major
+
+
+Name: %{name}
+Summary: MusE is a MIDI/Audio sequencer with recording and editing capabilities.
+Version: %{museversion}
+Release: %{release}
+URL: http://muse.sourceforge.net/
+Source0: %{name}-%{musever}.tar.bz2
+Source1: %{name}-ardour-tutorial.tar.bz2
+Group: Sound
+BuildRoot: %{_tmppath}/%{name}-buildroot
+License: GPL
+Requires: libqt3 >= %{qtversion}
+Requires: libsndfile1 >= %{libsndfile1_version}
+Requires: libalsa2 >= %{alsa_version}
+Requires: jackit >= %{jackit_version}
+Requires: libjack0 >= %{libjack0_version}
+BuildRequires: graphviz >= %{graphviz_version}
+BuildRequires: libgraphviz7 >= %{graphviz_version}
+BuildRequires: openjade >= %{jade_version}
+BuildRequires: doxygen >= %{doxy_version}
+BuildRequires: libfluidsynth1 >= %{fluidsynth_version}
+BuildRequires: libfluidsynth1-devel >= %{fluidsynth_version}
+BuildRequires: fluidsynth >= %{fluidsynth_version}
+BuildRequires: libalsa2-devel >= %{alsa_version}
+BuildRequires: docbook-style-dsssl >= %{dssslver}
+BuildRequires: libjack0-devel >= %{libjack0_version}
+BuildRequires: libsndfile1-devel >= %{libsndfile1_version}
+BuildRequires: libgraphviz7-devel >= %{graphviz_version}
+BuildRequires: libcap1-devel >= %{capver}
+BuildRequires: ladcca >= %{ladccaver}
+BuildRequires: docbook-dtd41-sgml
+BuildRequires: libext2fs2-devel
+
+%description
+MusE is a MIDI/Audio sequencer with recording and editing capabilities.
+Some Highlights:
+
+ * standard midifile (smf) import-/export
+ * organizes songs in tracks and parts which you can arrange
+ with the part editor
+ * midi editors: pianoroll, drum, list, controller
+ * score editor with high quality postscript printer output
+ * realtime: editing while playing
+ * unlimited number of open editors
+ * unlimited undo/redo
+ * realtime and step-recording
+ * multiple midi devices
+ * unlimited number of tracks
+ * audio playback/recording
+ * Sync to external devices: MTC/MMC, Midi Clock,
+ Master/Slave (currently only partial implemented)
+ * LADSPA host
+ * ALSA and JACK audio driver
+ * uses raw midi devices (ALSA, OSS & serial ports)
+ * XML project file
+ * project file contains complete app state (session data)
+ * Application spanning Cut/Paste Drag/Drop
+ * uses C++, QT2 GUI Library, STL
+ * GPL Licenced
+
+%package -n %libname
+Summary: Main libraries for %name.
+Group: System/Libraries
+
+%description -n %{libname}
+This package contains the dynamic library of plugins from %name.
+
+%package -n %{libname}-static
+Summary: Static libraries for %name plugins.
+Group: System/Libraries
+
+%description -n %{libname}-static
+This package contains the dynamic library of plugins from %name.
+
+
+Group: Development/C++
+%package -n givertcap
+Summary: Give applications real-time capabilities
+Version: %{capver}
+Group: Sound
+URL: http://www.tml.hut.fi/~tilmonen/givertcap/
+
+%description -n givertcap
+Givertcap is a small Linux application that is used to give other
+application real-time capabilities. With the aid of givertcap you can
+run real-time applications (audio and video -processing apps for
+example) with high priority without running the application as root.
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+
+%setup -n %{name}-%{musever} -a 1
+#perl -p -i -e 's|version="3.2.3"|version="3.1"||g' widgets/*.ui
+
+
+%build
+
+export QTDIR=/usr/lib/qt3
+export KDEDIR=%_prefix
+export LD_LIBRARY_PATH=$QTDIR/lib:$KDEDIR/lib:$LD_LIBRARY_PATH
+export PATH=$QTDIR/bin:$KDEDIR/bin:$PATH
+
+%configure2_5x --prefix=%{_prefix} --datadir=%{_datadir} --libdir=%{_libdir} --with-jack \
+ --disable-suid-install --disable-suid-build --enable-patchbay --disable-rtcap \
+ --with-docbook-stylesheets=/usr/share/sgml/docbook/dsssl-stylesheets-%{dssslver} \
+ --enable-arch=i586 --enable-laddca
+# --disable-static --enable-shared --disable-qttest
+
+%make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+%makeinstall
+
+mkdir -p $RPM_BUILD_ROOT%_menudir
+
+# (mandrake) menu support
+cat << EOF > %{buildroot}%{_menudir}/%{name}
+?package(%{name}): longtitle="MusE audio editor" \
+command="/usr/bin/muse" title="MusE audio editor" needs="x11" \
+section="Multimedia/Sound" \
+icon="sound_section.png"
+EOF
+
+
+%post
+%update_menus
+/sbin/ldconfig
+
+%postun
+%clean_menus
+ /sbin/ldconfig
+
+%post -n %{libname} -p /sbin/ldconfig
+
+%postun -n %{libname} -p /sbin/ldconfig
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root,0755)
+%doc AUTHORS COPYING INSTALL ChangeLog NEWS README* SECURITY
+%doc html
+%{_bindir}/muse
+%{_bindir}/grepmidi
+%{_libdir}/%name
+%{_datadir}/%name
+%{_menudir}/*
+
+%files -n %{libname}
+%defattr(-,root,root)
+%{_libdir}/%name/plugins/*.so*
+%{_libdir}/%name/synthi/*.so*
+
+%files -n %{libname}-static
+%defattr(-,root,root)
+%{_libdir}/%name/plugins/*.la
+%{_libdir}/%name/plugins/*.a
+%{_libdir}/%name/synthi/*.a
+%{_libdir}/%name/synthi/*.la
+
+#%files -n givertcap
+#%attr(4755, root, root)
+#%{_bindir}/givertcap
+
+
+
+%changelog
+* Thu May 27 2004 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.7.0pre3-1thac
+- Updated to latest version
+
+* Wed May 05 2004 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.7.0pre2-1thac
+- Updated to latest version
+
+* Tue Apr 20 2004 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.7.0pre1-1thac
+- Updated to latest version
+
+* Tue Apr 20 2004 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.3-2thac
+- Rebuilt against Mandrake 10.0 official
+
+* Mon Jan 12 2004 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.3-1thac
+- Updated to latest version
+
+* Mon Nov 17 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.2-2thac
+- Rebuilt for jackit-0.9.0
+
+* Fri Nov 07 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.2-1thac
+- Rebuilt for Mandrake 9.2
+
+* Thu Oct 30 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.1-1thac
+- Rebuilt for Mandrake 9.2
+
+* Tue Sep 09 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.1-1thac
+- Added muse-softsynth-fix
+ on muse 0.6.1, it results in a dead lock when muse starts a softsynth
+ without RT. the patch is an adhoc fix for this problem.
+- Added jackit 0.80.0 type patch
+- Changed naming to differ from Mandrake cooker
+
+* Fri Jul 25 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.1-1mdk
+- Updated to 0.6.1 final built against fluidsynth-1.0.2
+- Built with qt-3.1.2 patch
+
+* Sat May 17 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0-1mdk
+- Updated to 0.6.0 final built against fluidsynth-1.0.1
+
+* Sat May 03 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre8.3mdk
+- Rebuilt with rpmmacro patch that removes nvidia dependency.
+
+* Tue Apr 22 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre8.2mdk
+- Rebuilt against latest version of jackit 0.67.2
+
+* Fri Apr 04 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre8.1mdk
+- Updated to latest version
+
+* Wed Mar 26 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre7.2mdk
+- Rebuilt for Mandrake 9.1
+
+* Sun Mar 23 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre7.2mdk
+- Updated to latest version
+- Compiled against jackit-0.62.0 and iiwusynth-0.2.5
+
+* Sun Feb 16 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre5.4mdk
+- Recompiled against jackit-0.51.0.
+
+* Fri Feb 14 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre5.3mdk
+- Recompiled against libsndfile-1.0.4.
+
+* Sat Feb 08 2003 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre5.2mdk
+- Recompiled against jack-0.44,graphviz and i586 optimized.
+
+* Wed Dec 11 2002 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre5.1mdk
+- Removed jack dependency again
+
+* Mon Dec 09 2002 Torbjorn Turpeinen <tobbe@nyvalls.se> 0.6.0pre5mdk
+- Rebuilt for Mandrake 9.0
+
+* Fri Nov 15 2002 Lenny Cartier <lenny@mandrakesoft.com> 0.6.0-0.pre3.2mdk
+- remove jack dependency
+
+* Wed Nov 13 2002 Lenny Cartier <lenny@mandrakesoft.com> 0.6.0-0.pre3.1mdk
+- 0.6.0pre3
+- clean filelist
+- disable-suid-build for now
+- from James Gregory <james@james.id.au> :
+ - fixed file locations to use macros rather than absolute paths
+
+* Thu Oct 3 2002 James Gregory <james@james.id.au> 0.6.0-0.pre2.2mdk
+- First version to build.
diff --git a/muse/plugins/CMakeLists.txt b/muse/plugins/CMakeLists.txt
new file mode 100644
index 00000000..21630660
--- /dev/null
+++ b/muse/plugins/CMakeLists.txt
@@ -0,0 +1,22 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+subdirs( freeverb )
+
diff --git a/muse/plugins/freeverb/CMakeLists.txt b/muse/plugins/freeverb/CMakeLists.txt
new file mode 100644
index 00000000..2ccecfa8
--- /dev/null
+++ b/muse/plugins/freeverb/CMakeLists.txt
@@ -0,0 +1,32 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+add_library ( freeverb SHARED
+ freeverb.cpp revmodel.cpp
+ )
+
+# tell cmake to name the target freeverb.so instead of
+# libfreeverb.so
+#
+set_target_properties (freeverb
+ PROPERTIES PREFIX ""
+ )
+
+install_files( /lib/muse-1.0pre1/plugins .so libfreeverb.so)
diff --git a/muse/plugins/freeverb/allpass.h b/muse/plugins/freeverb/allpass.h
new file mode 100644
index 00000000..4eb1c1a0
--- /dev/null
+++ b/muse/plugins/freeverb/allpass.h
@@ -0,0 +1,50 @@
+// Allpass filter declaration
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#ifndef _allpass_
+#define _allpass_
+#include "denormals.h"
+
+//---------------------------------------------------------
+// allpass
+//---------------------------------------------------------
+
+class allpass
+ {
+ float feedback;
+ float *buffer;
+ int bufsize;
+ int bufidx;
+
+ public:
+ allpass() { bufidx = 0; }
+ void setbuffer(float *buf, int size) {
+ buffer = buf;
+ bufsize = size;
+ }
+ float process(float input) {
+ float bufout = buffer[bufidx];
+ undenormalise(bufout);
+ float output = -input + bufout;
+ buffer[bufidx] = input + (bufout*feedback);
+ if (++bufidx >= bufsize)
+ bufidx = 0;
+// bufidx = ++bufidx % bufsize;
+ return output;
+ }
+ void mute() {
+ for (int i=0; i<bufsize; i++)
+ buffer[i]=0;
+ }
+ void setfeedback(float val) { feedback = val; }
+ float getfeedback() { return feedback; }
+ };
+
+
+// Big to inline - but crucial for speed
+
+
+#endif//_allpass
diff --git a/muse/plugins/freeverb/comb.h b/muse/plugins/freeverb/comb.h
new file mode 100644
index 00000000..d2e0f871
--- /dev/null
+++ b/muse/plugins/freeverb/comb.h
@@ -0,0 +1,66 @@
+// Comb filter class declaration
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#ifndef _comb_
+#define _comb_
+
+#include "denormals.h"
+
+
+//---------------------------------------------------------
+// comb
+//---------------------------------------------------------
+
+class comb
+ {
+ float feedback;
+ float filterstore;
+ float damp1;
+ float damp2;
+ float *buffer;
+ int bufsize;
+ int bufidx;
+
+public:
+ comb() {
+ filterstore = 0;
+ bufidx = 0;
+ }
+ void setbuffer(float *buf, int size) {
+ buffer = buf;
+ bufsize = size;
+ }
+ float process(float input) {
+ float output = buffer[bufidx];
+ undenormalise(output);
+ filterstore = (output*damp2) + (filterstore*damp1);
+ undenormalise(filterstore);
+ buffer[bufidx] = input + (filterstore*feedback);
+ if (++bufidx >= bufsize)
+ bufidx = 0;
+// bufidx = ++bufidx % bufsize;
+ return output;
+ }
+ void mute() {
+ for (int i=0; i<bufsize; i++)
+ buffer[i]=0;
+ }
+ void setdamp(float val) {
+ damp1 = val;
+ damp2 = 1-val;
+ }
+ float getdamp() { return damp1; }
+ void setfeedback(float val) { feedback = val; }
+ float getfeedback() { return feedback; }
+ };
+
+
+// Big to inline - but crucial for speed
+
+
+#endif //_comb_
+
+//ends
diff --git a/muse/plugins/freeverb/denormals.h b/muse/plugins/freeverb/denormals.h
new file mode 100644
index 00000000..d18412b4
--- /dev/null
+++ b/muse/plugins/freeverb/denormals.h
@@ -0,0 +1,28 @@
+// Macro for killing denormalled numbers
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// Based on IS_DENORMAL macro by Jon Watte
+// This code is public domain
+
+#ifndef _denormals_
+#define _denormals_
+
+// this does not work with at least gcc3.3 and -O2:
+// #define undenormalise(sample) if(((*(unsigned int*)&sample)&0x7f800000)==0) sample=0.0f
+//
+// from Laurent de Soras Paper: Denormal numbers in floating point
+// signal processing applications
+// (ws)
+
+#define undenormalise(sample) \
+ { \
+ float anti_denormal = 1e-18; \
+ sample += anti_denormal; \
+ sample -= anti_denormal; \
+ }
+
+#endif//_denormals_
+
+//ends
+
diff --git a/muse/plugins/freeverb/freeverb.cpp b/muse/plugins/freeverb/freeverb.cpp
new file mode 100644
index 00000000..0385e887
--- /dev/null
+++ b/muse/plugins/freeverb/freeverb.cpp
@@ -0,0 +1,166 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: freeverb.cpp,v 1.1.1.1 2003/10/27 18:57:03 wschweer Exp $
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "revmodel.h"
+
+//---------------------------------------------------------
+// instantiateFreeverb
+// Construct a new plugin instance.
+//---------------------------------------------------------
+
+LADSPA_Handle instantiate(const LADSPA_Descriptor* /*Descriptor*/,
+ unsigned long /* samplerate*/)
+ {
+ return new Revmodel;
+ }
+
+//---------------------------------------------------------
+// connectPortToFreeverb
+// Connect a port to a data location.
+//---------------------------------------------------------
+
+void connect(LADSPA_Handle Instance, unsigned long port,
+ LADSPA_Data* data)
+ {
+ ((Revmodel *)Instance)->port[port] = data;
+ }
+
+//---------------------------------------------------------
+// activate
+//---------------------------------------------------------
+
+void activate(LADSPA_Handle instance)
+ {
+ ((Revmodel *)instance)->activate();
+ }
+
+//---------------------------------------------------------
+// deactivate
+//---------------------------------------------------------
+
+void deactivate(LADSPA_Handle /*Instance*/)
+ {
+ }
+
+//---------------------------------------------------------
+// runFreeverb
+//---------------------------------------------------------
+
+void run(LADSPA_Handle Instance, unsigned long n)
+ {
+ ((Revmodel*)Instance)->processreplace(n);
+ }
+
+//---------------------------------------------------------
+// runAddingFreeverb
+// *ADD* the output to the output buffer.
+//---------------------------------------------------------
+
+void runAdding(LADSPA_Handle Instance, unsigned long n)
+ {
+ ((Revmodel*)Instance)->processmix(n);
+ }
+
+//---------------------------------------------------------
+// setFreeverbRunAddingGain
+//---------------------------------------------------------
+
+void setGain(LADSPA_Handle /*Instance*/, LADSPA_Data /*Gain*/)
+ {
+// ((Freeverb *)Instance)->m_fRunAddingGain = Gain;
+ }
+
+//---------------------------------------------------------
+// cleanupFreeverb
+//---------------------------------------------------------
+
+void cleanup(LADSPA_Handle Instance)
+ {
+ delete (Revmodel *)Instance;
+ }
+
+static const char* portNames[] = {
+ "Input (Left)",
+ "Input (Right)",
+ "Output (Left)",
+ "Output (Right)",
+ "Room Size",
+ "Damping",
+ "Wet Level",
+ };
+
+LADSPA_PortDescriptor portDescriptors[] = {
+ LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO,
+ LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO,
+ LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
+ LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
+ LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL,
+ LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL,
+ LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL,
+ };
+
+LADSPA_PortRangeHint portRangeHints[] = {
+ { 0, 0.0, 0.0 },
+ { 0, 0.0, 0.0 },
+ { 0, 0.0, 0.0 },
+ { 0, 0.0, 0.0 },
+ { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 },
+ { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_LOGARITHMIC, 0.0, 1.0 },
+ { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_LOGARITHMIC, 0.0, 1.0 },
+ };
+
+LADSPA_Descriptor descriptor = {
+ 1050,
+ "freeverb1",
+ LADSPA_PROPERTY_HARD_RT_CAPABLE,
+ "Freeverb",
+ "Werner Schweer",
+ "None",
+ 7,
+ portDescriptors,
+ portNames,
+ portRangeHints,
+ 0, // impl. data
+ instantiate,
+ connect,
+ activate,
+ run,
+ runAdding,
+ setGain,
+ deactivate,
+ cleanup
+ };
+
+//---------------------------------------------------------
+// _init
+// called automatically when the plugin library is first
+// loaded.
+//---------------------------------------------------------
+
+void _init()
+ {
+ }
+
+//---------------------------------------------------------
+// _fini
+// called automatically when the library is unloaded.
+//---------------------------------------------------------
+
+void _fini()
+ {
+ }
+
+//---------------------------------------------------------
+// ladspa_descriptor
+// Return a descriptor of the requested plugin type.
+//---------------------------------------------------------
+
+const LADSPA_Descriptor* ladspa_descriptor(unsigned long i)
+ {
+ return (i == 0) ? &descriptor : 0;
+ }
+
diff --git a/muse/plugins/freeverb/readme.txt b/muse/plugins/freeverb/readme.txt
new file mode 100644
index 00000000..2c1349a3
--- /dev/null
+++ b/muse/plugins/freeverb/readme.txt
@@ -0,0 +1,147 @@
+readme from original freeverb-source:
+==============================================
+
+
+Freeverb - Free, studio-quality reverb SOURCE CODE in the public domain
+-----------------------------------------------------------------------
+
+Written by Jezar at Dreampoint - http://www.dreampoint.co.uk
+
+
+Introduction
+------------
+
+Hello.
+
+I'll try to keep this "readme" reasonably small.
+There are few things in the world that I hate more than long "readme" files.
+Except "coding conventions" - but more on that later...
+
+In this zip file you will find two folders of C++ source code:
+
+"Components" - Contains files that should clean-compile
+ ON ANY TYPE OF COMPUTER OR SYSTEM WHATSOEVER. It should not be necessary
+ to make ANY changes to these files to get them to compile, except to make
+ up for inadequacies of certain compilers. These files create three classes
+ - a comb filter, an allpass filter, and a reverb model made up of a number
+ of instances of the filters, with some features to control the filters at
+ a macro level. You will need to link these classes into another program that
+ interfaces with them. The files in the components drawer are completely
+ independant, and can be built without dependancies on anything else.
+ Because of the simple interface, it should be possible to interface
+ these files to any system - VST, DirectX, anything - without changing
+ them AT ALL.
+
+"FreeverbVST" - Contains a Steinberg VST implementation of this version of
+ Freeverb, using the components in (surprise) the components folder.
+ It was built on a PC but may compile properly for the Macintosh with
+ no problems. I don't know - I don't have a Macintosh. If you've
+ figured out how to compile the examples in the Steinberg VST
+ Development Kit, then you should easilly figure out how to bring the
+ files into a project and get it working in a few minutes. It should
+ be very simple.
+
+Note that this version of Freeverb doesn't contain predelay, or any EQ.
+I thought that might make it difficult to understand the "reverb" part of
+the code. Once you figure out how Freeverb works, you should find it trivial
+to add such features with little CPU overhead.
+
+Also, the code in this version of Freeverb has been optimised. This has changed
+the sound *slightly*, but not significantly compared to how much processing
+power it saves.
+
+Finally, note that there is also a built copy of this version of Freeverb called
+"Freeverb3.dll" - this is a VST plugin for the PC. If you want a version for
+the Mac or anything else, then you'll need to build it yourself from the code.
+
+
+Technical Explanation
+---------------------
+
+Freeverb is a simple implementation of the standard Schroeder/Moorer reverb
+model. I guess the only reason why it sounds better than other reverbs,
+is simply because I spent a long while doing listening tests in order to create
+the values found in "tuning.h". It uses 8 comb filters on both the left and right
+channels), and you might possibly be able to get away with less if CPU power
+is a serious constraint for you. It then feeds the result of the reverb through
+4 allpass filters on both the left and right channels. These "smooth" the sound.
+Adding more than four allpasses doesn't seem to add anything significant
+to the sound, and if you use less, the sound gets a bit "grainy".
+The filters on the right channel are slightly detuned compared to the left channel
+in order to create a stereo effect.
+
+Hopefully, you should find the code in the components drawer a model of
+brevity and clarity. Notice that I don't use any "coding conventions".
+Personally, I think that coding conventions suck. They are meant to make
+the code "clearer", but they inevitably do the complete opposite, making
+the code completely unfathomable. Anyone whose done Windows programming
+with its - frankly stupid - "Hungarian notation" will know exactly what
+I mean. Coding conventions typically promote issues that are irrelevant
+up to the status of appearing supremely important. It may have helped back
+people in the days when compilers where somewhat feeble in their type-safety,
+but not in the new millenium with advanced C++ compilers.
+
+Imagine if we rewrote the English language to conform to coding conventions.
+After all, The arguments should be just as valid for the English language as
+they are for a computer language. For example, we could put a lower-case "n"
+in front of every noun, a lower-case "p" in front of a persons name,
+a lower-case "v" in front of every verb, and a lower-case "a" in front
+of every adjective. Can you imagine what the English language would look like?
+All in the name of "clarity". It's just as stupid to do this for computer
+code as it would be to do it for the English language. I hope that the
+code for Freeverb in the components drawer demonstrates this, and helps start
+a movement back towards sanity in coding practices.
+
+
+Background
+----------
+
+Why is the Freeverb code now public domain? Simple. I only intended to create
+Freeverb to provide me and my friends with studio-quality reverb for free.
+I never intended to make any money out of it. However, I simply do not have the
+time to develop it any further. I'm working on a "concept album" at the moment,
+and I'll never finish it if I spend any more time programming.
+
+In any case, I make more far money as a contract programmer - making Mobile
+Internet products - than I ever could writing plugins, so it simply doesn't
+make financial sense for me to spend any more time on it.
+
+Rather than give Freeverb to any particular individual or organisation
+to profit from it, I've decided to give it away to the internet community
+at large, so that quality, FREE (or at the very least, low-cost) reverbs can
+be developed for all platforms.
+
+Feel free to use the source code for Freeverb in any of your own products,
+whether they are also available for free, or even if they are commercial -
+I really don't mind. You may do with the code whatever you wish. If you use
+it in a product (whether commercial or not), it would be very nice of you,
+if you were to send me a copy of your product - although I appreciate that
+this isn't always possible in all circumstances.
+
+HOWEVER, please don't bug me with questions about how to use this code.
+I gave away Freeverb because I don't have time to maintain it. That means
+I *certainly* don't have time to answer questions about the source code, so
+please don't email questions to me. I *will* ignore them. If you can't figure
+the code for Freeverb out - then find somebody who can. I hope that either
+way, you enjoy experimenting with it.
+
+
+Disclaimer
+----------
+
+This software and source code is given away for free, without any warranties
+of any kind. It has been given away to the internet community as a free gift,
+so please treat it in the same spirit.
+
+
+I hope this code is useful and interesting to you all!
+I hope you have lots of fun experimenting with it and make good products!
+
+Very best regards,
+Jezar.
+Technology Consultant
+Dreampoint Design and Engineering
+http://www.dreampoint.co.uk
+
+
+//ends
diff --git a/muse/plugins/freeverb/revmodel.cpp b/muse/plugins/freeverb/revmodel.cpp
new file mode 100644
index 00000000..c72ee22b
--- /dev/null
+++ b/muse/plugins/freeverb/revmodel.cpp
@@ -0,0 +1,232 @@
+// Reverb model implementation
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#include <stdio.h>
+#include "revmodel.h"
+
+//---------------------------------------------------------
+// Revmodel
+//---------------------------------------------------------
+
+Revmodel::Revmodel()
+ {
+ // Tie the components to their buffers
+ combL[0].setbuffer(bufcombL1,combtuningL1);
+ combR[0].setbuffer(bufcombR1,combtuningR1);
+ combL[1].setbuffer(bufcombL2,combtuningL2);
+ combR[1].setbuffer(bufcombR2,combtuningR2);
+ combL[2].setbuffer(bufcombL3,combtuningL3);
+ combR[2].setbuffer(bufcombR3,combtuningR3);
+ combL[3].setbuffer(bufcombL4,combtuningL4);
+ combR[3].setbuffer(bufcombR4,combtuningR4);
+ combL[4].setbuffer(bufcombL5,combtuningL5);
+ combR[4].setbuffer(bufcombR5,combtuningR5);
+ combL[5].setbuffer(bufcombL6,combtuningL6);
+ combR[5].setbuffer(bufcombR6,combtuningR6);
+ combL[6].setbuffer(bufcombL7,combtuningL7);
+ combR[6].setbuffer(bufcombR7,combtuningR7);
+ combL[7].setbuffer(bufcombL8,combtuningL8);
+ combR[7].setbuffer(bufcombR8,combtuningR8);
+ allpassL[0].setbuffer(bufallpassL1,allpasstuningL1);
+ allpassR[0].setbuffer(bufallpassR1,allpasstuningR1);
+ allpassL[1].setbuffer(bufallpassL2,allpasstuningL2);
+ allpassR[1].setbuffer(bufallpassR2,allpasstuningR2);
+ allpassL[2].setbuffer(bufallpassL3,allpasstuningL3);
+ allpassR[2].setbuffer(bufallpassR3,allpasstuningR3);
+ allpassL[3].setbuffer(bufallpassL4,allpasstuningL4);
+ allpassR[3].setbuffer(bufallpassR4,allpasstuningR4);
+
+ // Set default values
+ allpassL[0].setfeedback(0.5f);
+ allpassR[0].setfeedback(0.5f);
+ allpassL[1].setfeedback(0.5f);
+ allpassR[1].setfeedback(0.5f);
+ allpassL[2].setfeedback(0.5f);
+ allpassR[2].setfeedback(0.5f);
+ allpassL[3].setfeedback(0.5f);
+ allpassR[3].setfeedback(0.5f);
+
+ param[0] = initialroom;
+ param[1] = initialdamp;
+ param[2] = initialwet;
+
+ setroomsize(initialroom);
+ setdamp(initialdamp);
+ setwidth(initialwidth);
+ setmode(initialmode);
+
+ // Buffer will be full of rubbish - so we MUST mute them
+
+ for (int i = 0; i < numcombs; i++) {
+ combL[i].mute();
+ combR[i].mute();
+ }
+ for (int i=0;i<numallpasses;i++) {
+ allpassL[i].mute();
+ allpassR[i].mute();
+ }
+ }
+
+//---------------------------------------------------------
+// activate
+//---------------------------------------------------------
+
+void Revmodel::activate()
+ {
+ *port[4] = param[0];
+ *port[5] = param[1];
+ *port[6] = param[2];
+ }
+
+//---------------------------------------------------------
+// processreplace
+//---------------------------------------------------------
+
+void Revmodel::processreplace(long n)
+ {
+ if (param[0] != *port[4]) {
+ param[0] = *port[4];
+ setroomsize(param[0]);
+ }
+ if (param[1] != *port[5]) {
+ param[1] = *port[5];
+ setdamp(param[1]);
+ }
+
+ float wet = (1.0f - *port[6]) * scalewet;
+ float dry = *port[6] * scaledry;
+ float wet1 = wet * (width/2 + 0.5f);
+ float wet2 = wet * ((1-width)/2);
+
+ for (int i = 0; i < n; ++i) {
+ float outL = 0;
+ float outR = 0;
+ float input = (port[0][i] + port[1][i]) * gain;
+
+ // Accumulate comb filters in parallel
+ for (int k = 0; k < numcombs; k++) {
+ outL += combL[k].process(input);
+ outR += combR[k].process(input);
+ }
+
+ // Feed through allpasses in series
+ for (int k=0; k < numallpasses; k++) {
+ outL = allpassL[k].process(outL);
+ outR = allpassR[k].process(outR);
+ }
+
+ // Calculate output REPLACING anything already there
+ port[2][i] = outL*wet1 + outR*wet2 + port[0][i]*dry;
+ port[3][i] = outR*wet1 + outL*wet2 + port[1][i]*dry;
+ }
+ }
+
+void Revmodel::processmix(long n)
+ {
+ if (param[0] != *port[4]) {
+ param[0] = *port[4];
+ setroomsize(param[0]);
+ }
+ if (param[1] != *port[5]) {
+ param[1] = *port[5];
+ setdamp(param[1]);
+ }
+
+ float wet = (1.0f - *port[6]) * scalewet;
+ float dry = *port[6] * scaledry;
+ float wet1 = wet * (width/2 + 0.5f);
+ float wet2 = wet * ((1-width)/2);
+
+ for (int i = 0; i < n; ++i) {
+ float outL = 0;
+ float outR = 0;
+ float input = (port[0][i] + port[1][i]) * gain;
+
+ // Accumulate comb filters in parallel
+ for (int k = 0; k < numcombs; k++) {
+ outL += combL[k].process(input);
+ outR += combR[k].process(input);
+ }
+
+ // Feed through allpasses in series
+ for (int k=0; k < numallpasses; k++) {
+ outL = allpassL[k].process(outL);
+ outR = allpassR[k].process(outR);
+ }
+
+ // Calculate output REPLACING anything already there
+ port[2][i] += outL*wet1 + outR*wet2 + port[0][i]*dry;
+ port[3][i] += outR*wet1 + outL*wet2 + port[1][i]*dry;
+ }
+ }
+
+//---------------------------------------------------------
+// update
+// Recalculate internal values after parameter change
+//---------------------------------------------------------
+
+void Revmodel::update()
+ {
+ if (mode >= freezemode) {
+ roomsize1 = 1;
+ damp1 = 0;
+ gain = muted;
+ }
+ else {
+ roomsize1 = roomsize;
+ damp1 = damp;
+ gain = fixedgain;
+ }
+
+ for (int i = 0; i < numcombs; i++) {
+ combL[i].setfeedback(roomsize1);
+ combR[i].setfeedback(roomsize1);
+ }
+
+ for (int i = 0; i < numcombs; i++) {
+ combL[i].setdamp(damp1);
+ combR[i].setdamp(damp1);
+ }
+ }
+
+// The following get/set functions are not inlined, because
+// speed is never an issue when calling them, and also
+// because as you develop the reverb model, you may
+// wish to take dynamic action when they are called.
+
+void Revmodel::setroomsize(float value)
+ {
+ roomsize = (value*scaleroom) + offsetroom;
+ update();
+ }
+
+float Revmodel::getroomsize()
+ {
+ return (roomsize-offsetroom)/scaleroom;
+ }
+
+void Revmodel::setdamp(float value)
+ {
+ damp = value*scaledamp;
+ update();
+ }
+
+void Revmodel::setwidth(float value)
+ {
+ width = value;
+ update();
+ }
+
+void Revmodel::setmode(float value)
+ {
+ mode = value;
+ update();
+ }
+
+float Revmodel::getmode()
+ {
+ return (mode >= freezemode) ? 1 : 0;
+ }
diff --git a/muse/plugins/freeverb/revmodel.h b/muse/plugins/freeverb/revmodel.h
new file mode 100644
index 00000000..bfa1f0b3
--- /dev/null
+++ b/muse/plugins/freeverb/revmodel.h
@@ -0,0 +1,79 @@
+// Reverb model declaration
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#ifndef _revmodel_
+#define _revmodel_
+
+#include "comb.h"
+#include "allpass.h"
+#include "tuning.h"
+#include "../../muse/ladspa.h"
+
+//---------------------------------------------------------
+// Revmodel
+//---------------------------------------------------------
+
+class Revmodel {
+ float gain;
+ float roomsize,roomsize1;
+ float damp,damp1;
+ float width;
+ float mode;
+
+ // Comb filters
+ comb combL[numcombs];
+ comb combR[numcombs];
+
+ // Allpass filters
+ allpass allpassL[numallpasses];
+ allpass allpassR[numallpasses];
+
+ // Buffers for the combs
+ float bufcombL1[combtuningL1];
+ float bufcombR1[combtuningR1];
+ float bufcombL2[combtuningL2];
+ float bufcombR2[combtuningR2];
+ float bufcombL3[combtuningL3];
+ float bufcombR3[combtuningR3];
+ float bufcombL4[combtuningL4];
+ float bufcombR4[combtuningR4];
+ float bufcombL5[combtuningL5];
+ float bufcombR5[combtuningR5];
+ float bufcombL6[combtuningL6];
+ float bufcombR6[combtuningR6];
+ float bufcombL7[combtuningL7];
+ float bufcombR7[combtuningR7];
+ float bufcombL8[combtuningL8];
+ float bufcombR8[combtuningR8];
+
+ // Buffers for the allpasses
+ float bufallpassL1[allpasstuningL1];
+ float bufallpassR1[allpasstuningR1];
+ float bufallpassL2[allpasstuningL2];
+ float bufallpassR2[allpasstuningR2];
+ float bufallpassL3[allpasstuningL3];
+ float bufallpassR3[allpasstuningR3];
+ float bufallpassL4[allpasstuningL4];
+ float bufallpassR4[allpasstuningR4];
+ void update();
+
+ public:
+ LADSPA_Data* port[7];
+ float param[3];
+
+ Revmodel();
+ void processmix(long numsamples);
+ void processreplace(long numsamples);
+ void setroomsize(float value);
+ float getroomsize();
+ void setdamp(float value);
+ void setwidth(float value);
+ void setmode(float value);
+ float getmode();
+ void activate();
+ };
+
+#endif
diff --git a/muse/plugins/freeverb/tuning.h b/muse/plugins/freeverb/tuning.h
new file mode 100644
index 00000000..ced89252
--- /dev/null
+++ b/muse/plugins/freeverb/tuning.h
@@ -0,0 +1,60 @@
+// Reverb model tuning values
+//
+// Written by Jezar at Dreampoint, June 2000
+// http://www.dreampoint.co.uk
+// This code is public domain
+
+#ifndef _tuning_
+#define _tuning_
+
+const int numcombs = 8;
+const int numallpasses = 4;
+const float muted = 0;
+const float fixedgain = 0.015f;
+const float scalewet = 3;
+const float scaledry = 2;
+const float scaledamp = 0.4f;
+const float scaleroom = 0.28f;
+const float offsetroom = 0.7f;
+const float initialroom = 0.5f;
+const float initialdamp = 0.5f;
+const float initialwet = 1/scalewet;
+const float initialdry = 0;
+const float initialwidth = 1;
+const float initialmode = 0;
+const float freezemode = 0.5f;
+const int stereospread = 23;
+
+// These values assume 44.1KHz sample rate
+// they will probably be OK for 48KHz sample rate
+// but would need scaling for 96KHz (or other) sample rates.
+// The values were obtained by listening tests.
+const int combtuningL1 = 1116;
+const int combtuningR1 = 1116+stereospread;
+const int combtuningL2 = 1188;
+const int combtuningR2 = 1188+stereospread;
+const int combtuningL3 = 1277;
+const int combtuningR3 = 1277+stereospread;
+const int combtuningL4 = 1356;
+const int combtuningR4 = 1356+stereospread;
+const int combtuningL5 = 1422;
+const int combtuningR5 = 1422+stereospread;
+const int combtuningL6 = 1491;
+const int combtuningR6 = 1491+stereospread;
+const int combtuningL7 = 1557;
+const int combtuningR7 = 1557+stereospread;
+const int combtuningL8 = 1617;
+const int combtuningR8 = 1617+stereospread;
+const int allpasstuningL1 = 556;
+const int allpasstuningR1 = 556+stereospread;
+const int allpasstuningL2 = 441;
+const int allpasstuningR2 = 441+stereospread;
+const int allpasstuningL3 = 341;
+const int allpasstuningR3 = 341+stereospread;
+const int allpasstuningL4 = 225;
+const int allpasstuningR4 = 225+stereospread;
+
+#endif//_tuning_
+
+//ends
+
diff --git a/muse/share/CMakeLists.txt b/muse/share/CMakeLists.txt
new file mode 100644
index 00000000..ea8b595a
--- /dev/null
+++ b/muse/share/CMakeLists.txt
@@ -0,0 +1,22 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+subdirs( html instruments locale plugins templates wallpapers )
+
diff --git a/muse/share/html/CMakeLists.txt b/muse/share/html/CMakeLists.txt
new file mode 100644
index 00000000..2c1928ad
--- /dev/null
+++ b/muse/share/html/CMakeLists.txt
@@ -0,0 +1,24 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+install_files( /share/muse-1.0pre1/html *.html
+ index.html
+ )
+
diff --git a/muse/share/html/COPYING.html b/muse/share/html/COPYING.html
new file mode 100644
index 00000000..86b6fa8e
--- /dev/null
+++ b/muse/share/html/COPYING.html
@@ -0,0 +1,353 @@
+<qt>
+<pre>
+ Note that the GPL below is copyrighted by the Free Software
+ Foundation, but the instance of code that it refers to (the
+ MusE music editor) is copyrighted by me and others who
+ actually wrote it.
+
+ Werner Schweer
+
+----------------------------------------
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) 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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. 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.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+ 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
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This 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 Library General
+Public License instead of this License.
+</pre>
+</qt>
diff --git a/muse/share/html/button_bar.jpg b/muse/share/html/button_bar.jpg
new file mode 100644
index 00000000..204328c8
--- /dev/null
+++ b/muse/share/html/button_bar.jpg
Binary files differ
diff --git a/muse/share/html/getting_started.html b/muse/share/html/getting_started.html
new file mode 100644
index 00000000..0d6c4344
--- /dev/null
+++ b/muse/share/html/getting_started.html
@@ -0,0 +1,89 @@
+<qt bgcolor="#f4f4c8" title="MusE - The Linux (Midi) Music Editor">
+<center><h1>MusE - The Linux (Midi) Music Editor</h1></center>
+
+<h2>5. Getting Started</h2>
+<p>
+<h2>5.1 Creating A New Song</h2>
+<p>
+Here's a very short tutorial on how to create a new song from scratch.
+
+<p>
+
+<ol>
+ <li> Start MusE with the name of a new song (ie. a filename that doesn't
+already exist):
+<pre>
+ muse blues1.med
+</pre>
+Alternatively, start MusE and select <tt>File-&gt;New</tt>. The default song
+name is <tt>default</tt> and the first time you select <tt>File-&gt;Save</tt>,
+MusE asks you for a real name.
+
+ <li> Select a song type from the <tt>Type</tt> pulldown menu in the
+Toolbar. This selects the capabilities of your MIDI hardware (either
+NO, GM, GS, or XG).
+
+ <li> Doubleclick on the first empty track to create a new track.
+ <li> Select the MIDI channel for the new track; click with the right mouse
+button on Ch column in the track list to increment channel nummber, click
+with middle mouse button to decrement.
+ <li> If the TrackInfo window is not visible, press TrackInfo.
+ <li> Select a MIDI instrument for the MIDI channel of your new track.
+ <li> Click with the middle mouse button on ruler to set left locator mark.
+ <li> Click with the right mouse button on the ruler to set right locator mark.
+<b>Note:</b> The right mark must be set to the right of the left mark.
+ <li> Double click between the left and right locators on first track to
+create a new part, <b>or</b> select the Pencil tool and draw with the left
+mouse button pressed to create a new part.
+</ol>
+
+<p>
+<h2>5.2 Recording Events</h2>
+<p>
+<b>Entering Notes Manually</b>
+
+<ol>
+ <li> Select Pointer tool from toolbar
+ <li> Double click on part in part canvas to start the pianoroll editor
+ <li> Select Pencil tool from toolbar in the pianoroll editor
+ <li> Now you can draw events into the event canvas
+</ol>
+
+<p>
+<b>Play The Notes</b>
+
+<ol>
+ <li> Click with middle mouse button on ruler to set left locator mark
+ <li> Click with right mouse button on ruler to set right locator mark
+ <li> Note: right mark must be set right to left mark
+ <li> Click with left mouse button on ruler to set current position between left and right locator
+ <li> Select "loop" in the transport toolbar
+ <li> Press play to start sequencer
+ <li> You can enter new notes while the sequencer is playing
+</ol>
+
+<p>
+<b>Some Hints</b>
+
+<ol>
+ <li> You can "play" in realtime on the piano keyboard on the left side of the pianoroll editor
+ <li> You can change Channel Info and Track Info values during play
+</ol>
+
+<p>
+<h2>5.3 Step Recording</h2>
+<p>
+<ol>
+ <li> Start the pianoroll editor
+ <li> Click with left mouse button on ruler to set current position to the start position of your recording
+ <li> Set the Snap value to the step distance
+ <li> Set the Quantize value to the length of the notes to record
+ <li> Enter step record mode by pressing the "S" toolbar button
+ <li> Every click on the piano keyboard records a note with "Quantize" len and advances the current record position to
+ <li> The next "Snap" position
+ <li> Shift+click records a note without advancing the current record position
+ <li> Change the current position with the cursor keys
+ <li> Shift+space inserts a gap; all notes to the right of the current position move to the next snap position
+</ol>
+
+</qt>
diff --git a/muse/share/html/index.html b/muse/share/html/index.html
new file mode 100644
index 00000000..7fe5b109
--- /dev/null
+++ b/muse/share/html/index.html
@@ -0,0 +1,62 @@
+<html>
+<center><h1>MusE - The Linux Music Editor</h1></center>
+<p>
+<h2>About MusE</h2>
+
+MusE is a multitrack virtual studio for Linux that has support
+for sequencing of both midi and audio and has, among other things,
+support for LADSPA, Jack and ALSA. <br>
+MusE is written by Werner Schweer and others and is published under the
+<a href="COPYING.html"> GNU General Public License</a>.
+The latest release of MusE can be found at the MusE hompage:
+<a href="http://lmuse.sourceforge.net/">http://muse.sourceforge.net/</a>.
+
+<p>
+<h2>1. Introduction (still to be written)</h2>
+
+<p>
+<h2>2. <a href="installation.html">Installation</a></h2>
+<ul>
+ <li>2.1 How to Obtain MusE
+ <li>2.2 System Requirements
+ <li>2.3 Compiliation and Installation
+</ul>
+
+<p>
+<h2>3. <a href="invocation.html">Invoking MusE</a></h2>
+<ul>
+ <li>3.1 Invoking MusE
+ <li>3.2 Command Line Options
+ <li>3.3 File Types Recognized by MusE
+</ul>
+
+<p>
+<h2>4. <a href="window_ref.html">Window Reference Guide</a></h2>
+<ul>
+ <li>4.1 The Main Window
+ <li>4.2 The Arranger
+ <li>4.2.1 The Left Pane
+ <li>4.2.1.1 Track Info
+ <li>4.2.2 The Right Pane
+
+ <li>4.3 The Button Bar &amp; Menus
+</ul>
+
+<p>
+<h2>5. <a href="getting_started.html">Getting Started</a></h2>
+<ul>
+ <li>5.1 Creating A New Song
+ <li>5.2 Recording Events
+ <li>5.3 Step Recording
+</ul>
+
+<p>
+<h2>6. Mixer Automation (still to be written)</h2>
+<ul>
+ <li>6.1 Record Automation Events (still to be written)
+</ul>
+
+
+<p>
+<h2>Glossary (still to be written)</h2>
+</html>
diff --git a/muse/share/html/installation.html b/muse/share/html/installation.html
new file mode 100644
index 00000000..19527333
--- /dev/null
+++ b/muse/share/html/installation.html
@@ -0,0 +1,64 @@
+<qt bgcolor="#f4f4c8" title="MusE - The Linux (Midi) Music Editor">
+<center><h1>MusE - The Linux (Midi) Music Editor</h1></center>
+
+<h2>2. Installation</h2>
+<p>
+<h2>2.1 How to Obtain MusE</h2>
+MusE is available at the MusE Homepage, located at
+<a href="http://www.muse-sequencer.org/">http://www.muse-sequencer.org/</a>.
+Download the latest non-beta release and follow the
+installation instructions below.
+
+<h2>2.2 System Requirements</h2>
+To run MusE on your workstation, the following conditions must be met:
+<ul>
+ <li>A GNU/Linux distribution (Red Hat, Debian, etc.)
+ <li>A working windowing system (most likely X Windows)
+ <li>qt 2.2 (<a href="http://www.trolltech.com/products/qt">http://www.trolltech.com/products/qt</a>)
+ <li>gcc 2.95.2 (<a href="http://www.gnu.org/software/gcc/gcc.html">http://www.gnu.org/software/gcc/gcc.html</a>)
+ <li>glibc 2.1 (<a href="http://ftp.gnu.org/gnu/glibc">http://ftp.gnu.org/gnu/glibc</a>)
+ <li>Linux kernel configured with RealTimeClock support (<tt>/dev/rtc</tt>)
+ <li>ALSA (Advanced Linux Sound Architecture) 0.5.9c (it should work with standard OSS drivers as well)
+ <li>an external midi device
+</ul>
+
+<h2>2.3 Compiliation and Installation</h2>
+Unpack the newly-downloaded tarball into a directory and edit
+the file <tt>make.inc</tt>.
+<p>
+The most important variables to set in this file are:
+<ul>
+ <li>QTDIR
+ <li>ALSA
+ <li>OSS
+</ul>
+
+Point <tt>QTDIR</tt> to where your QT libraries are installed.
+<tt>ALSA</tt> and <tt>OSS</tt> are boolean values (ie. <tt>yes</tt>
+or <tt>no</tt>) that tell MusE how to handle Midi and Audio on your
+system. It is safe to say <tt>yes</tt> to both.
+<p>
+A sample config:
+<p>
+<pre>
+ QTDIR = /usr/local/qt
+ ALSA = no
+ OSS = yes
+</pre>
+
+<p>
+When done, save <tt>make.inc</tt> and run the following commands:
+<pre>
+ make depend
+ make
+ make install
+</pre>
+
+<p>
+Note that <tt>make install</tt> will ask for the <tt>root</tt> password,
+as MusE is installed as a setuid-root binary. Setuid-root is needed to allow
+MusE to get proper timing functions from the Linux kernel.
+<p>
+<b>Hint:</b> To get even better timing than that, run MusE with the -R option.
+
+</qt>
diff --git a/muse/share/html/invocation.html b/muse/share/html/invocation.html
new file mode 100644
index 00000000..778422c2
--- /dev/null
+++ b/muse/share/html/invocation.html
@@ -0,0 +1,54 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>MusE: Linux Music Editor</title>
+ <link rel="stylesheet" type="text/css" href="styles.css">
+</head>
+
+<body>
+<center><h1>MusE - The Linux (Midi) Music Editor</h1></center>
+
+<h2>3. Invoking MusE</h2>
+<p>
+<h2>3.1 Invoking MusE</h2>
+MusE is invoked from the command line by typing in:
+<pre>
+ <tt>muse</tt>
+</pre>
+
+Optionally, you can use command line options of the form:
+
+<pre>
+ muse &lt;options&gt; &lt;midifile&gt;
+</pre>
+
+&lt;options&gt; : see section 3.2 below for details on options.
+&lt;midifile&gt; can be either a standard MIDI file or a MusE
+file (*.med, *.med.gz or *.med.bz2).
+
+<h2>3.2 Command Line Options</h2>
+<p>
+MusE accepts some options as listed below:
+<pre>
+ -v print version
+ -d debug mode: no threads
+ -D debug mode: enable some debug messages
+ -m debug mode: trace midi Input
+ -M debug mode: trace midi Output
+ -s debug mode: trace sync
+ -R enable real time scheduling
+</pre>
+
+<h2>3.3 File Types Recognized by MusE</h2>
+<p>
+<table border=1 cellpadding=5>
+<tr><td><tt>~/.MusE<td>MusE Configuration File ("~" refers to your home directory)
+<tr><td><tt>.musePrj<td>Hidden Project File; stores list of last projects
+<tr><td><tt>*.med<td>MusE song file; internal MusE format
+<tr><td><tt>*.mid<td>midi file; can be imported
+<tr><td><tt>*.kar<td>karaoke: midi file with additional information; some types can be imported
+</table>
+<p>
+With adding the additional extensions <tt>.gz</tt> or <tt>.bz2</tt>
+you can read or write compressed files.
+
+</qt>
diff --git a/muse/share/html/left_pane.jpg b/muse/share/html/left_pane.jpg
new file mode 100644
index 00000000..a659e1ee
--- /dev/null
+++ b/muse/share/html/left_pane.jpg
Binary files differ
diff --git a/muse/share/html/main_window.jpg b/muse/share/html/main_window.jpg
new file mode 100644
index 00000000..eee1e43f
--- /dev/null
+++ b/muse/share/html/main_window.jpg
Binary files differ
diff --git a/muse/share/html/main_window_track_info.jpg b/muse/share/html/main_window_track_info.jpg
new file mode 100644
index 00000000..d4dc207c
--- /dev/null
+++ b/muse/share/html/main_window_track_info.jpg
Binary files differ
diff --git a/muse/share/html/right_pane.jpg b/muse/share/html/right_pane.jpg
new file mode 100644
index 00000000..a770a4e8
--- /dev/null
+++ b/muse/share/html/right_pane.jpg
Binary files differ
diff --git a/muse/share/html/styles.css b/muse/share/html/styles.css
new file mode 100644
index 00000000..53026fa1
--- /dev/null
+++ b/muse/share/html/styles.css
@@ -0,0 +1,85 @@
+:link { color: #091cef; }
+:visited { color: #091cef; }
+
+body {
+ background: #eeeeee;
+ color: #00;
+ font-family: Arial, Geneva;
+ font-size: 10pt;
+ }
+h1.head {
+ margin: 0.05em 0.3em;
+ font-family: Arial, helvetica, sans-serif;
+ color: #091cef;
+ }
+td.head {
+ background: #aeb3e8;
+ color: #091cef;
+ }
+td.nav {
+ background: #aeb3e8;
+ color: #000;
+ }
+td.ld {
+ background: #aeb3e8;
+ valign: top;
+ width: 60;
+ font-weight: bold;
+ }
+td.lh {
+ background: #aeb3e8;
+ }
+td.lb {
+ background: #ced1e2;
+ }
+
+h3.navhead {
+ margin-top: 0.2em;
+ margin-bottom: 0em;
+ font-size: small;
+ font-family: Verdana, Geneva, Arial, sans-serif;
+ }
+
+.navlink {
+ font-size: small;
+ font-family: Verdana, Geneva, Arial, sans-serif;
+ }
+
+p, input {
+ font-family: Arial, Geneva;
+ font-size: 10pt;
+}
+
+b {
+ font-family: Arial, Geneva;
+ font-size: 10pt;
+ font-weight: bold;
+}
+
+h1 {
+ font-family: Arial, Geneva;
+ font-size: 24pt;
+ font-weight: bold;
+}
+h2 {
+ font-family: Arial, Geneva;
+ font-size: 18pt;
+ font-weight: bold;
+}
+
+a {
+ font-family: Arial, Geneva;
+ font-size: 12pt;
+}
+
+th {
+ font-family: Arial, Geneva;
+ font-size: 10pt;
+
+}
+
+td {
+ font-family: Arial, Geneva;
+ font-size: 12pt;
+ color: #000000;
+ }
diff --git a/muse/share/html/toc_.txt b/muse/share/html/toc_.txt
new file mode 100644
index 00000000..d8503ff4
--- /dev/null
+++ b/muse/share/html/toc_.txt
@@ -0,0 +1,13 @@
+"Glossary" "glossary.html"
+"Getting Started" "getting_started.html"
++"Window Reference Guide" "window_ref.html"
+ +"The Arranger" "window_ref.html"
+ "The Button Bar & Menus" "window_ref.html"
+ "The Right Pane" "window_ref.html"
+ +"The Left Pane" "window_ref.html"
+ "Track Info" "window_ref.html"
+ "The Main Window" "window_ref.html"
+"Invoking MusE" "invocation.html"
+"Installation" "installation.html"
+"Introduction" "introduction.html"
+"Index" "index.html"
diff --git a/muse/share/html/track_info.jpg b/muse/share/html/track_info.jpg
new file mode 100644
index 00000000..89834d71
--- /dev/null
+++ b/muse/share/html/track_info.jpg
Binary files differ
diff --git a/muse/share/html/window_ref.html b/muse/share/html/window_ref.html
new file mode 100644
index 00000000..549e88d3
--- /dev/null
+++ b/muse/share/html/window_ref.html
@@ -0,0 +1,180 @@
+<qt bgcolor="#f4f4c8" title="MusE - The Linux (Midi) Music Editor">
+<center><h1>MusE - The Linux (Midi) Music Editor</h1></center>
+
+<h2>4. Window Reference Guide</h2>
+<p>
+<h2>4.1 The Main Window</h2>
+Here's a screenshot of the main window, with a standard MIDI file already
+loaded:
+<p>
+<img src="main_window.jpg"</img>
+
+<p>
+The main window is basically divided up into two panes separated by a
+veritcal bar that is movable horizontally. These two panes together
+are called the Arranger.
+
+<h2>4.2 The Arranger</h2>
+<p>
+The left pane of the Arranger describes each track in detail,
+while the right pane describes each track graphically.
+
+<h3>4.2.1 The Left Pane</h3>
+<img src="left_pane.jpg"</img>
+<p>
+The left pane details the following information for each track:
+<ul>
+ <li>A -??
+ <li>M - Mute the track
+ <li>C - Defines whether the track is one of MIDI, Drum or Wave.
+ <li>Track - A freely-editable track name.
+ <li>Ch - Defines which MIDI Channel this track plays on.
+ <li>Port - Defines which MIDI port this track plays on.
+ <li>T -??
+</ul>
+
+You can select which track is currently "active" by simply clicking
+on the track.
+<p>
+When a track's M column is clicked, that track is marked as Muted with
+a red circle and upon playback that track will not be heard. To hear
+the track, click on the M column for that track again.
+<p>
+Right click on the C column for a track to declare the track to be of
+type MIDI, Drum or Wave.
+<p>
+The Track column is free-form, meaning that a double-click on a track's
+Track column will allow you to enter a descriptive name for the track,
+for example "Hot Lead Guitar".
+<p>
+The Ch column for a track is changed by right-clicking to increment the
+number or middle-clicking to decrement the number. It's generally a
+good idea to keep differing instruments on different MIDI channels and it's
+considered common to have the drum kit on channel 10.
+<p>
+<h4>4.2.1.1 Track Info</h4>
+<p>
+At the bottom of the left pane, you'll see a little button labelled
+"TrackInfo". When clicked, the standard information plus more about
+the currently selected track is presented:
+<p>
+<img src="track_info.jpg"</img>
+<ul>
+ <li>Track Name
+ <li>Channel
+ <li>Transpose
+ <li>Delay
+ <li>Length
+ <li>Velocity
+ <li>Compr
+</ul>
+The bottom half of the TrackInfo display describes MIDI channel information:
+<ul>
+ <li>MIDI Instrument
+ <li>H-Bank
+ <li>L-Bank
+ <li>Progr
+ <li>Volume
+ <li>Pan
+</ul>
+
+<p>
+Operations that can be performed on the left pane:
+<table border=1>
+<th> <strong>Track Functions </strong></th> <th>&nbsp;</th>
+<tr><td>Select Track<td>
+ <ul>
+ <li>Left Mouse Button
+ </ul>
+<tr><td>Select multiple Tracks<td>
+ <ul>
+ <li>Shift + Left Mouse Button
+ </ul>
+<tr><td>Change Selected Track<td>
+ <ul>
+ <li>Key Up: previous Track
+ <li>Key Down: next Track
+ <li>click with left mouse button in name field
+ </ul>
+<tr><td>Move Track<td>
+ <ul>
+ <li>Drag with left Mouse Button
+ </ul>
+<tr><td>Create New Track<td>
+ <ul>
+ <li>Pulldown Edit<br>
+ <li>Ctrl T
+ <li>double click in empty track
+ </ul>
+<tr><td>Delete selected Track(s)<td>
+ <ul>
+ <li>Pulldown Edit
+ <li>Del
+ </ul>
+<tr><td>Rename Track<td>
+ <ul>
+ <li>doubleClick with left mouse button
+ on track name
+ </ul>
+<tr><td>Change Midi Channel<td>
+ <ul>
+ <li> left mouse button increments midi channel
+ <li> middle mouse button decrements midi channel
+ </ul>
+<tr><td>Select Midi Port<td>
+ <ul>
+ <li> click with right mouse button on portname;
+ select from pulldown menu
+ </ul>
+<tr><td>Mute Track<td>
+ <ul>
+ <li> click with left mouse button on "M" field in
+ Tracklist
+ </ul>
+<tr><td>Solo Track<td>
+ <ul>
+ <li> click "Solo" button
+ </ul>
+</table>
+
+
+<h2>4.2.2 The Right Pane</h2>
+<img src="right_pane.jpg"</img>
+<p>
+The right pane desribes each track graphically. Time moves from left
+to right and is measured in beats that are referenced at the top of
+the right pane. Tracks are displayed vertically in boxes, called
+"Parts", that depict where MIDI and audio data are played.
+<p>
+The small sliders that are adjacent to the bottom right corner affect
+the view of the right pane in terms of "zooming". The vertical slider
+affects the height of the tracks, while the horizontal slider affects
+the width.
+<p>
+Operations that can be performed on the right pane:
+<p>
+<table border=1>
+<tr><td><b>To do this...</b><td><b>...Do this</b>
+<tr><td>Select Part<td>Left Click
+<tr><td>Select multiple parts<td>Shift + left click
+<tr><td>Change selected track<td>Key left: previous part, Key right: next part
+<tr><td>Move part<td>Drag with left mouse button
+<tr><td>Create new part<td>select Pencil tool; draw with left mouse button pressed, OR set left and right mark; double click on track
+<tr><td>Delete selected part(s)<td>select rubber tool; click part to delete
+<tr><td>Rename part<td>double click with left mouse button on part
+<tr><td>Copy part<td>drag with shift + left mouse button
+<tr><td>Cut part<td>select Cut Tool; click on part to cut
+<tr><td>Glue part<td>select Glue Tool; click on part to glue with next part
+</table>
+<p>
+
+<h2>4.2.3 The Button Bar &amp; Menus</h2>
+<img src="button_bar.jpg"</img>
+<p>
+Across the top, above the Arranger, are a menu system, icons and other
+widgets that you use to manipulate your project. Most of these are
+self-explanatory, while others are described later in this document.
+
+
+
+</qt>
diff --git a/muse/share/instruments/Access_Virus.idf b/muse/share/instruments/Access_Virus.idf
new file mode 100644
index 00000000..e54e57fe
--- /dev/null
+++ b/muse/share/instruments/Access_Virus.idf
@@ -0,0 +1,1045 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Access Virus">
+ <PatchGroup name="Bank A">
+ <Patch name="A 000" prog="000" hbank="0" lbank="0"/>
+ <Patch name="A 001" prog="001" hbank="0" lbank="0"/>
+ <Patch name="A 002" prog="002" hbank="0" lbank="0"/>
+ <Patch name="A 003" prog="003" hbank="0" lbank="0"/>
+ <Patch name="A 004" prog="004" hbank="0" lbank="0"/>
+ <Patch name="A 005" prog="005" hbank="0" lbank="0"/>
+ <Patch name="A 006" prog="006" hbank="0" lbank="0"/>
+ <Patch name="A 007" prog="007" hbank="0" lbank="0"/>
+ <Patch name="A 008" prog="008" hbank="0" lbank="0"/>
+ <Patch name="A 009" prog="009" hbank="0" lbank="0"/>
+ <Patch name="A 010" prog="010" hbank="0" lbank="0"/>
+ <Patch name="A 011" prog="011" hbank="0" lbank="0"/>
+ <Patch name="A 012" prog="012" hbank="0" lbank="0"/>
+ <Patch name="A 013" prog="013" hbank="0" lbank="0"/>
+ <Patch name="A 014" prog="014" hbank="0" lbank="0"/>
+ <Patch name="A 015" prog="015" hbank="0" lbank="0"/>
+ <Patch name="A 016" prog="016" hbank="0" lbank="0"/>
+ <Patch name="A 017" prog="017" hbank="0" lbank="0"/>
+ <Patch name="A 018" prog="018" hbank="0" lbank="0"/>
+ <Patch name="A 019" prog="019" hbank="0" lbank="0"/>
+ <Patch name="A 020" prog="020" hbank="0" lbank="0"/>
+ <Patch name="A 021" prog="021" hbank="0" lbank="0"/>
+ <Patch name="A 022" prog="022" hbank="0" lbank="0"/>
+ <Patch name="A 023" prog="023" hbank="0" lbank="0"/>
+ <Patch name="A 024" prog="024" hbank="0" lbank="0"/>
+ <Patch name="A 025" prog="025" hbank="0" lbank="0"/>
+ <Patch name="A 026" prog="026" hbank="0" lbank="0"/>
+ <Patch name="A 027" prog="027" hbank="0" lbank="0"/>
+ <Patch name="A 028" prog="028" hbank="0" lbank="0"/>
+ <Patch name="A 029" prog="029" hbank="0" lbank="0"/>
+ <Patch name="A 030" prog="030" hbank="0" lbank="0"/>
+ <Patch name="A 031" prog="031" hbank="0" lbank="0"/>
+ <Patch name="A 032" prog="032" hbank="0" lbank="0"/>
+ <Patch name="A 033" prog="033" hbank="0" lbank="0"/>
+ <Patch name="A 034" prog="034" hbank="0" lbank="0"/>
+ <Patch name="A 035" prog="035" hbank="0" lbank="0"/>
+ <Patch name="A 036" prog="036" hbank="0" lbank="0"/>
+ <Patch name="A 037" prog="037" hbank="0" lbank="0"/>
+ <Patch name="A 038" prog="038" hbank="0" lbank="0"/>
+ <Patch name="A 039" prog="039" hbank="0" lbank="0"/>
+ <Patch name="A 040" prog="040" hbank="0" lbank="0"/>
+ <Patch name="A 041" prog="041" hbank="0" lbank="0"/>
+ <Patch name="A 042" prog="042" hbank="0" lbank="0"/>
+ <Patch name="A 043" prog="043" hbank="0" lbank="0"/>
+ <Patch name="A 044" prog="044" hbank="0" lbank="0"/>
+ <Patch name="A 045" prog="045" hbank="0" lbank="0"/>
+ <Patch name="A 046" prog="046" hbank="0" lbank="0"/>
+ <Patch name="A 047" prog="047" hbank="0" lbank="0"/>
+ <Patch name="A 048" prog="048" hbank="0" lbank="0"/>
+ <Patch name="A 049" prog="049" hbank="0" lbank="0"/>
+ <Patch name="A 050" prog="050" hbank="0" lbank="0"/>
+ <Patch name="A 051" prog="051" hbank="0" lbank="0"/>
+ <Patch name="A 052" prog="052" hbank="0" lbank="0"/>
+ <Patch name="A 053" prog="053" hbank="0" lbank="0"/>
+ <Patch name="A 054" prog="054" hbank="0" lbank="0"/>
+ <Patch name="A 055" prog="055" hbank="0" lbank="0"/>
+ <Patch name="A 056" prog="056" hbank="0" lbank="0"/>
+ <Patch name="A 057" prog="057" hbank="0" lbank="0"/>
+ <Patch name="A 058" prog="058" hbank="0" lbank="0"/>
+ <Patch name="A 059" prog="059" hbank="0" lbank="0"/>
+ <Patch name="A 060" prog="060" hbank="0" lbank="0"/>
+ <Patch name="A 061" prog="061" hbank="0" lbank="0"/>
+ <Patch name="A 062" prog="062" hbank="0" lbank="0"/>
+ <Patch name="A 063" prog="063" hbank="0" lbank="0"/>
+ <Patch name="A 064" prog="064" hbank="0" lbank="0"/>
+ <Patch name="A 065" prog="065" hbank="0" lbank="0"/>
+ <Patch name="A 066" prog="066" hbank="0" lbank="0"/>
+ <Patch name="A 067" prog="067" hbank="0" lbank="0"/>
+ <Patch name="A 068" prog="068" hbank="0" lbank="0"/>
+ <Patch name="A 069" prog="069" hbank="0" lbank="0"/>
+ <Patch name="A 070" prog="070" hbank="0" lbank="0"/>
+ <Patch name="A 071" prog="071" hbank="0" lbank="0"/>
+ <Patch name="A 072" prog="072" hbank="0" lbank="0"/>
+ <Patch name="A 073" prog="073" hbank="0" lbank="0"/>
+ <Patch name="A 074" prog="074" hbank="0" lbank="0"/>
+ <Patch name="A 075" prog="075" hbank="0" lbank="0"/>
+ <Patch name="A 076" prog="076" hbank="0" lbank="0"/>
+ <Patch name="A 077" prog="077" hbank="0" lbank="0"/>
+ <Patch name="A 078" prog="078" hbank="0" lbank="0"/>
+ <Patch name="A 079" prog="079" hbank="0" lbank="0"/>
+ <Patch name="A 080" prog="080" hbank="0" lbank="0"/>
+ <Patch name="A 081" prog="081" hbank="0" lbank="0"/>
+ <Patch name="A 082" prog="082" hbank="0" lbank="0"/>
+ <Patch name="A 083" prog="083" hbank="0" lbank="0"/>
+ <Patch name="A 084" prog="084" hbank="0" lbank="0"/>
+ <Patch name="A 085" prog="085" hbank="0" lbank="0"/>
+ <Patch name="A 086" prog="086" hbank="0" lbank="0"/>
+ <Patch name="A 087" prog="087" hbank="0" lbank="0"/>
+ <Patch name="A 088" prog="088" hbank="0" lbank="0"/>
+ <Patch name="A 089" prog="089" hbank="0" lbank="0"/>
+ <Patch name="A 090" prog="090" hbank="0" lbank="0"/>
+ <Patch name="A 091" prog="091" hbank="0" lbank="0"/>
+ <Patch name="A 092" prog="092" hbank="0" lbank="0"/>
+ <Patch name="A 093" prog="093" hbank="0" lbank="0"/>
+ <Patch name="A 094" prog="094" hbank="0" lbank="0"/>
+ <Patch name="A 095" prog="095" hbank="0" lbank="0"/>
+ <Patch name="A 096" prog="096" hbank="0" lbank="0"/>
+ <Patch name="A 097" prog="097" hbank="0" lbank="0"/>
+ <Patch name="A 098" prog="098" hbank="0" lbank="0"/>
+ <Patch name="A 099" prog="099" hbank="0" lbank="0"/>
+ <Patch name="A 100" prog="100" hbank="0" lbank="0"/>
+ <Patch name="A 101" prog="101" hbank="0" lbank="0"/>
+ <Patch name="A 102" prog="102" hbank="0" lbank="0"/>
+ <Patch name="A 103" prog="103" hbank="0" lbank="0"/>
+ <Patch name="A 104" prog="104" hbank="0" lbank="0"/>
+ <Patch name="A 105" prog="105" hbank="0" lbank="0"/>
+ <Patch name="A 106" prog="106" hbank="0" lbank="0"/>
+ <Patch name="A 107" prog="107" hbank="0" lbank="0"/>
+ <Patch name="A 108" prog="108" hbank="0" lbank="0"/>
+ <Patch name="A 109" prog="109" hbank="0" lbank="0"/>
+ <Patch name="A 110" prog="110" hbank="0" lbank="0"/>
+ <Patch name="A 111" prog="111" hbank="0" lbank="0"/>
+ <Patch name="A 112" prog="112" hbank="0" lbank="0"/>
+ <Patch name="A 113" prog="113" hbank="0" lbank="0"/>
+ <Patch name="A 114" prog="114" hbank="0" lbank="0"/>
+ <Patch name="A 115" prog="115" hbank="0" lbank="0"/>
+ <Patch name="A 116" prog="116" hbank="0" lbank="0"/>
+ <Patch name="A 117" prog="117" hbank="0" lbank="0"/>
+ <Patch name="A 118" prog="118" hbank="0" lbank="0"/>
+ <Patch name="A 119" prog="119" hbank="0" lbank="0"/>
+ <Patch name="A 120" prog="120" hbank="0" lbank="0"/>
+ <Patch name="A 121" prog="121" hbank="0" lbank="0"/>
+ <Patch name="A 122" prog="122" hbank="0" lbank="0"/>
+ <Patch name="A 123" prog="123" hbank="0" lbank="0"/>
+ <Patch name="A 124" prog="124" hbank="0" lbank="0"/>
+ <Patch name="A 125" prog="125" hbank="0" lbank="0"/>
+ <Patch name="A 126" prog="126" hbank="0" lbank="0"/>
+ <Patch name="A 127" prog="127" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Bank B">
+ <Patch name="B 000" prog="000" hbank="0" lbank="1"/>
+ <Patch name="B 001" prog="001" hbank="0" lbank="1"/>
+ <Patch name="B 002" prog="002" hbank="0" lbank="1"/>
+ <Patch name="B 003" prog="003" hbank="0" lbank="1"/>
+ <Patch name="B 004" prog="004" hbank="0" lbank="1"/>
+ <Patch name="B 005" prog="005" hbank="0" lbank="1"/>
+ <Patch name="B 006" prog="006" hbank="0" lbank="1"/>
+ <Patch name="B 007" prog="007" hbank="0" lbank="1"/>
+ <Patch name="B 008" prog="008" hbank="0" lbank="1"/>
+ <Patch name="B 009" prog="009" hbank="0" lbank="1"/>
+ <Patch name="B 010" prog="010" hbank="0" lbank="1"/>
+ <Patch name="B 011" prog="011" hbank="0" lbank="1"/>
+ <Patch name="B 012" prog="012" hbank="0" lbank="1"/>
+ <Patch name="B 013" prog="013" hbank="0" lbank="1"/>
+ <Patch name="B 014" prog="014" hbank="0" lbank="1"/>
+ <Patch name="B 015" prog="015" hbank="0" lbank="1"/>
+ <Patch name="B 016" prog="016" hbank="0" lbank="1"/>
+ <Patch name="B 017" prog="017" hbank="0" lbank="1"/>
+ <Patch name="B 018" prog="018" hbank="0" lbank="1"/>
+ <Patch name="B 019" prog="019" hbank="0" lbank="1"/>
+ <Patch name="B 020" prog="020" hbank="0" lbank="1"/>
+ <Patch name="B 021" prog="021" hbank="0" lbank="1"/>
+ <Patch name="B 022" prog="022" hbank="0" lbank="1"/>
+ <Patch name="B 023" prog="023" hbank="0" lbank="1"/>
+ <Patch name="B 024" prog="024" hbank="0" lbank="1"/>
+ <Patch name="B 025" prog="025" hbank="0" lbank="1"/>
+ <Patch name="B 026" prog="026" hbank="0" lbank="1"/>
+ <Patch name="B 027" prog="027" hbank="0" lbank="1"/>
+ <Patch name="B 028" prog="028" hbank="0" lbank="1"/>
+ <Patch name="B 029" prog="029" hbank="0" lbank="1"/>
+ <Patch name="B 030" prog="030" hbank="0" lbank="1"/>
+ <Patch name="B 031" prog="031" hbank="0" lbank="1"/>
+ <Patch name="B 032" prog="032" hbank="0" lbank="1"/>
+ <Patch name="B 033" prog="033" hbank="0" lbank="1"/>
+ <Patch name="B 034" prog="034" hbank="0" lbank="1"/>
+ <Patch name="B 035" prog="035" hbank="0" lbank="1"/>
+ <Patch name="B 036" prog="036" hbank="0" lbank="1"/>
+ <Patch name="B 037" prog="037" hbank="0" lbank="1"/>
+ <Patch name="B 038" prog="038" hbank="0" lbank="1"/>
+ <Patch name="B 039" prog="039" hbank="0" lbank="1"/>
+ <Patch name="B 040" prog="040" hbank="0" lbank="1"/>
+ <Patch name="B 041" prog="041" hbank="0" lbank="1"/>
+ <Patch name="B 042" prog="042" hbank="0" lbank="1"/>
+ <Patch name="B 043" prog="043" hbank="0" lbank="1"/>
+ <Patch name="B 044" prog="044" hbank="0" lbank="1"/>
+ <Patch name="B 045" prog="045" hbank="0" lbank="1"/>
+ <Patch name="B 046" prog="046" hbank="0" lbank="1"/>
+ <Patch name="B 047" prog="047" hbank="0" lbank="1"/>
+ <Patch name="B 048" prog="048" hbank="0" lbank="1"/>
+ <Patch name="B 049" prog="049" hbank="0" lbank="1"/>
+ <Patch name="B 050" prog="050" hbank="0" lbank="1"/>
+ <Patch name="B 051" prog="051" hbank="0" lbank="1"/>
+ <Patch name="B 052" prog="052" hbank="0" lbank="1"/>
+ <Patch name="B 053" prog="053" hbank="0" lbank="1"/>
+ <Patch name="B 054" prog="054" hbank="0" lbank="1"/>
+ <Patch name="B 055" prog="055" hbank="0" lbank="1"/>
+ <Patch name="B 056" prog="056" hbank="0" lbank="1"/>
+ <Patch name="B 057" prog="057" hbank="0" lbank="1"/>
+ <Patch name="B 058" prog="058" hbank="0" lbank="1"/>
+ <Patch name="B 059" prog="059" hbank="0" lbank="1"/>
+ <Patch name="B 060" prog="060" hbank="0" lbank="1"/>
+ <Patch name="B 061" prog="061" hbank="0" lbank="1"/>
+ <Patch name="B 062" prog="062" hbank="0" lbank="1"/>
+ <Patch name="B 063" prog="063" hbank="0" lbank="1"/>
+ <Patch name="B 064" prog="064" hbank="0" lbank="1"/>
+ <Patch name="B 065" prog="065" hbank="0" lbank="1"/>
+ <Patch name="B 066" prog="066" hbank="0" lbank="1"/>
+ <Patch name="B 067" prog="067" hbank="0" lbank="1"/>
+ <Patch name="B 068" prog="068" hbank="0" lbank="1"/>
+ <Patch name="B 069" prog="069" hbank="0" lbank="1"/>
+ <Patch name="B 070" prog="070" hbank="0" lbank="1"/>
+ <Patch name="B 071" prog="071" hbank="0" lbank="1"/>
+ <Patch name="B 072" prog="072" hbank="0" lbank="1"/>
+ <Patch name="B 073" prog="073" hbank="0" lbank="1"/>
+ <Patch name="B 074" prog="074" hbank="0" lbank="1"/>
+ <Patch name="B 075" prog="075" hbank="0" lbank="1"/>
+ <Patch name="B 076" prog="076" hbank="0" lbank="1"/>
+ <Patch name="B 077" prog="077" hbank="0" lbank="1"/>
+ <Patch name="B 078" prog="078" hbank="0" lbank="1"/>
+ <Patch name="B 079" prog="079" hbank="0" lbank="1"/>
+ <Patch name="B 080" prog="080" hbank="0" lbank="1"/>
+ <Patch name="B 081" prog="081" hbank="0" lbank="1"/>
+ <Patch name="B 082" prog="082" hbank="0" lbank="1"/>
+ <Patch name="B 083" prog="083" hbank="0" lbank="1"/>
+ <Patch name="B 084" prog="084" hbank="0" lbank="1"/>
+ <Patch name="B 085" prog="085" hbank="0" lbank="1"/>
+ <Patch name="B 086" prog="086" hbank="0" lbank="1"/>
+ <Patch name="B 087" prog="087" hbank="0" lbank="1"/>
+ <Patch name="B 088" prog="088" hbank="0" lbank="1"/>
+ <Patch name="B 089" prog="089" hbank="0" lbank="1"/>
+ <Patch name="B 090" prog="090" hbank="0" lbank="1"/>
+ <Patch name="B 091" prog="091" hbank="0" lbank="1"/>
+ <Patch name="B 092" prog="092" hbank="0" lbank="1"/>
+ <Patch name="B 093" prog="093" hbank="0" lbank="1"/>
+ <Patch name="B 094" prog="094" hbank="0" lbank="1"/>
+ <Patch name="B 095" prog="095" hbank="0" lbank="1"/>
+ <Patch name="B 096" prog="096" hbank="0" lbank="1"/>
+ <Patch name="B 097" prog="097" hbank="0" lbank="1"/>
+ <Patch name="B 098" prog="098" hbank="0" lbank="1"/>
+ <Patch name="B 099" prog="099" hbank="0" lbank="1"/>
+ <Patch name="B 100" prog="100" hbank="0" lbank="1"/>
+ <Patch name="B 101" prog="101" hbank="0" lbank="1"/>
+ <Patch name="B 102" prog="102" hbank="0" lbank="1"/>
+ <Patch name="B 103" prog="103" hbank="0" lbank="1"/>
+ <Patch name="B 104" prog="104" hbank="0" lbank="1"/>
+ <Patch name="B 105" prog="105" hbank="0" lbank="1"/>
+ <Patch name="B 106" prog="106" hbank="0" lbank="1"/>
+ <Patch name="B 107" prog="107" hbank="0" lbank="1"/>
+ <Patch name="B 108" prog="108" hbank="0" lbank="1"/>
+ <Patch name="B 109" prog="109" hbank="0" lbank="1"/>
+ <Patch name="B 110" prog="110" hbank="0" lbank="1"/>
+ <Patch name="B 111" prog="111" hbank="0" lbank="1"/>
+ <Patch name="B 112" prog="112" hbank="0" lbank="1"/>
+ <Patch name="B 113" prog="113" hbank="0" lbank="1"/>
+ <Patch name="B 114" prog="114" hbank="0" lbank="1"/>
+ <Patch name="B 115" prog="115" hbank="0" lbank="1"/>
+ <Patch name="B 116" prog="116" hbank="0" lbank="1"/>
+ <Patch name="B 117" prog="117" hbank="0" lbank="1"/>
+ <Patch name="B 118" prog="118" hbank="0" lbank="1"/>
+ <Patch name="B 119" prog="119" hbank="0" lbank="1"/>
+ <Patch name="B 120" prog="120" hbank="0" lbank="1"/>
+ <Patch name="B 121" prog="121" hbank="0" lbank="1"/>
+ <Patch name="B 122" prog="122" hbank="0" lbank="1"/>
+ <Patch name="B 123" prog="123" hbank="0" lbank="1"/>
+ <Patch name="B 124" prog="124" hbank="0" lbank="1"/>
+ <Patch name="B 125" prog="125" hbank="0" lbank="1"/>
+ <Patch name="B 126" prog="126" hbank="0" lbank="1"/>
+ <Patch name="B 127" prog="127" hbank="0" lbank="1"/>
+ </PatchGroup>
+ <PatchGroup name="Bank C">
+ <Patch name="C 000" prog="000" hbank="0" lbank="2"/>
+ <Patch name="C 001" prog="001" hbank="0" lbank="2"/>
+ <Patch name="C 002" prog="002" hbank="0" lbank="2"/>
+ <Patch name="C 003" prog="003" hbank="0" lbank="2"/>
+ <Patch name="C 004" prog="004" hbank="0" lbank="2"/>
+ <Patch name="C 005" prog="005" hbank="0" lbank="2"/>
+ <Patch name="C 006" prog="006" hbank="0" lbank="2"/>
+ <Patch name="C 007" prog="007" hbank="0" lbank="2"/>
+ <Patch name="C 008" prog="008" hbank="0" lbank="2"/>
+ <Patch name="C 009" prog="009" hbank="0" lbank="2"/>
+ <Patch name="C 010" prog="010" hbank="0" lbank="2"/>
+ <Patch name="C 011" prog="011" hbank="0" lbank="2"/>
+ <Patch name="C 012" prog="012" hbank="0" lbank="2"/>
+ <Patch name="C 013" prog="013" hbank="0" lbank="2"/>
+ <Patch name="C 014" prog="014" hbank="0" lbank="2"/>
+ <Patch name="C 015" prog="015" hbank="0" lbank="2"/>
+ <Patch name="C 016" prog="016" hbank="0" lbank="2"/>
+ <Patch name="C 017" prog="017" hbank="0" lbank="2"/>
+ <Patch name="C 018" prog="018" hbank="0" lbank="2"/>
+ <Patch name="C 019" prog="019" hbank="0" lbank="2"/>
+ <Patch name="C 020" prog="020" hbank="0" lbank="2"/>
+ <Patch name="C 021" prog="021" hbank="0" lbank="2"/>
+ <Patch name="C 022" prog="022" hbank="0" lbank="2"/>
+ <Patch name="C 023" prog="023" hbank="0" lbank="2"/>
+ <Patch name="C 024" prog="024" hbank="0" lbank="2"/>
+ <Patch name="C 025" prog="025" hbank="0" lbank="2"/>
+ <Patch name="C 026" prog="026" hbank="0" lbank="2"/>
+ <Patch name="C 027" prog="027" hbank="0" lbank="2"/>
+ <Patch name="C 028" prog="028" hbank="0" lbank="2"/>
+ <Patch name="C 029" prog="029" hbank="0" lbank="2"/>
+ <Patch name="C 030" prog="030" hbank="0" lbank="2"/>
+ <Patch name="C 031" prog="031" hbank="0" lbank="2"/>
+ <Patch name="C 032" prog="032" hbank="0" lbank="2"/>
+ <Patch name="C 033" prog="033" hbank="0" lbank="2"/>
+ <Patch name="C 034" prog="034" hbank="0" lbank="2"/>
+ <Patch name="C 035" prog="035" hbank="0" lbank="2"/>
+ <Patch name="C 036" prog="036" hbank="0" lbank="2"/>
+ <Patch name="C 037" prog="037" hbank="0" lbank="2"/>
+ <Patch name="C 038" prog="038" hbank="0" lbank="2"/>
+ <Patch name="C 039" prog="039" hbank="0" lbank="2"/>
+ <Patch name="C 040" prog="040" hbank="0" lbank="2"/>
+ <Patch name="C 041" prog="041" hbank="0" lbank="2"/>
+ <Patch name="C 042" prog="042" hbank="0" lbank="2"/>
+ <Patch name="C 043" prog="043" hbank="0" lbank="2"/>
+ <Patch name="C 044" prog="044" hbank="0" lbank="2"/>
+ <Patch name="C 045" prog="045" hbank="0" lbank="2"/>
+ <Patch name="C 046" prog="046" hbank="0" lbank="2"/>
+ <Patch name="C 047" prog="047" hbank="0" lbank="2"/>
+ <Patch name="C 048" prog="048" hbank="0" lbank="2"/>
+ <Patch name="C 049" prog="049" hbank="0" lbank="2"/>
+ <Patch name="C 050" prog="050" hbank="0" lbank="2"/>
+ <Patch name="C 051" prog="051" hbank="0" lbank="2"/>
+ <Patch name="C 052" prog="052" hbank="0" lbank="2"/>
+ <Patch name="C 053" prog="053" hbank="0" lbank="2"/>
+ <Patch name="C 054" prog="054" hbank="0" lbank="2"/>
+ <Patch name="C 055" prog="055" hbank="0" lbank="2"/>
+ <Patch name="C 056" prog="056" hbank="0" lbank="2"/>
+ <Patch name="C 057" prog="057" hbank="0" lbank="2"/>
+ <Patch name="C 058" prog="058" hbank="0" lbank="2"/>
+ <Patch name="C 059" prog="059" hbank="0" lbank="2"/>
+ <Patch name="C 060" prog="060" hbank="0" lbank="2"/>
+ <Patch name="C 061" prog="061" hbank="0" lbank="2"/>
+ <Patch name="C 062" prog="062" hbank="0" lbank="2"/>
+ <Patch name="C 063" prog="063" hbank="0" lbank="2"/>
+ <Patch name="C 064" prog="064" hbank="0" lbank="2"/>
+ <Patch name="C 065" prog="065" hbank="0" lbank="2"/>
+ <Patch name="C 066" prog="066" hbank="0" lbank="2"/>
+ <Patch name="C 067" prog="067" hbank="0" lbank="2"/>
+ <Patch name="C 068" prog="068" hbank="0" lbank="2"/>
+ <Patch name="C 069" prog="069" hbank="0" lbank="2"/>
+ <Patch name="C 070" prog="070" hbank="0" lbank="2"/>
+ <Patch name="C 071" prog="071" hbank="0" lbank="2"/>
+ <Patch name="C 072" prog="072" hbank="0" lbank="2"/>
+ <Patch name="C 073" prog="073" hbank="0" lbank="2"/>
+ <Patch name="C 074" prog="074" hbank="0" lbank="2"/>
+ <Patch name="C 075" prog="075" hbank="0" lbank="2"/>
+ <Patch name="C 076" prog="076" hbank="0" lbank="2"/>
+ <Patch name="C 077" prog="077" hbank="0" lbank="2"/>
+ <Patch name="C 078" prog="078" hbank="0" lbank="2"/>
+ <Patch name="C 079" prog="079" hbank="0" lbank="2"/>
+ <Patch name="C 080" prog="080" hbank="0" lbank="2"/>
+ <Patch name="C 081" prog="081" hbank="0" lbank="2"/>
+ <Patch name="C 082" prog="082" hbank="0" lbank="2"/>
+ <Patch name="C 083" prog="083" hbank="0" lbank="2"/>
+ <Patch name="C 084" prog="084" hbank="0" lbank="2"/>
+ <Patch name="C 085" prog="085" hbank="0" lbank="2"/>
+ <Patch name="C 086" prog="086" hbank="0" lbank="2"/>
+ <Patch name="C 087" prog="087" hbank="0" lbank="2"/>
+ <Patch name="C 088" prog="088" hbank="0" lbank="2"/>
+ <Patch name="C 089" prog="089" hbank="0" lbank="2"/>
+ <Patch name="C 090" prog="090" hbank="0" lbank="2"/>
+ <Patch name="C 091" prog="091" hbank="0" lbank="2"/>
+ <Patch name="C 092" prog="092" hbank="0" lbank="2"/>
+ <Patch name="C 093" prog="093" hbank="0" lbank="2"/>
+ <Patch name="C 094" prog="094" hbank="0" lbank="2"/>
+ <Patch name="C 095" prog="095" hbank="0" lbank="2"/>
+ <Patch name="C 096" prog="096" hbank="0" lbank="2"/>
+ <Patch name="C 097" prog="097" hbank="0" lbank="2"/>
+ <Patch name="C 098" prog="098" hbank="0" lbank="2"/>
+ <Patch name="C 099" prog="099" hbank="0" lbank="2"/>
+ <Patch name="C 100" prog="100" hbank="0" lbank="2"/>
+ <Patch name="C 101" prog="101" hbank="0" lbank="2"/>
+ <Patch name="C 102" prog="102" hbank="0" lbank="2"/>
+ <Patch name="C 103" prog="103" hbank="0" lbank="2"/>
+ <Patch name="C 104" prog="104" hbank="0" lbank="2"/>
+ <Patch name="C 105" prog="105" hbank="0" lbank="2"/>
+ <Patch name="C 106" prog="106" hbank="0" lbank="2"/>
+ <Patch name="C 107" prog="107" hbank="0" lbank="2"/>
+ <Patch name="C 108" prog="108" hbank="0" lbank="2"/>
+ <Patch name="C 109" prog="109" hbank="0" lbank="2"/>
+ <Patch name="C 110" prog="110" hbank="0" lbank="2"/>
+ <Patch name="C 111" prog="111" hbank="0" lbank="2"/>
+ <Patch name="C 112" prog="112" hbank="0" lbank="2"/>
+ <Patch name="C 113" prog="113" hbank="0" lbank="2"/>
+ <Patch name="C 114" prog="114" hbank="0" lbank="2"/>
+ <Patch name="C 115" prog="115" hbank="0" lbank="2"/>
+ <Patch name="C 116" prog="116" hbank="0" lbank="2"/>
+ <Patch name="C 117" prog="117" hbank="0" lbank="2"/>
+ <Patch name="C 118" prog="118" hbank="0" lbank="2"/>
+ <Patch name="C 119" prog="119" hbank="0" lbank="2"/>
+ <Patch name="C 120" prog="120" hbank="0" lbank="2"/>
+ <Patch name="C 121" prog="121" hbank="0" lbank="2"/>
+ <Patch name="C 122" prog="122" hbank="0" lbank="2"/>
+ <Patch name="C 123" prog="123" hbank="0" lbank="2"/>
+ <Patch name="C 124" prog="124" hbank="0" lbank="2"/>
+ <Patch name="C 125" prog="125" hbank="0" lbank="2"/>
+ <Patch name="C 126" prog="126" hbank="0" lbank="2"/>
+ <Patch name="C 127" prog="127" hbank="0" lbank="2"/>
+ </PatchGroup>
+ <PatchGroup name="Bank D">
+ <Patch name="D 000" prog="000" hbank="0" lbank="3"/>
+ <Patch name="D 001" prog="001" hbank="0" lbank="3"/>
+ <Patch name="D 002" prog="002" hbank="0" lbank="3"/>
+ <Patch name="D 003" prog="003" hbank="0" lbank="3"/>
+ <Patch name="D 004" prog="004" hbank="0" lbank="3"/>
+ <Patch name="D 005" prog="005" hbank="0" lbank="3"/>
+ <Patch name="D 006" prog="006" hbank="0" lbank="3"/>
+ <Patch name="D 007" prog="007" hbank="0" lbank="3"/>
+ <Patch name="D 008" prog="008" hbank="0" lbank="3"/>
+ <Patch name="D 009" prog="009" hbank="0" lbank="3"/>
+ <Patch name="D 010" prog="010" hbank="0" lbank="3"/>
+ <Patch name="D 011" prog="011" hbank="0" lbank="3"/>
+ <Patch name="D 012" prog="012" hbank="0" lbank="3"/>
+ <Patch name="D 013" prog="013" hbank="0" lbank="3"/>
+ <Patch name="D 014" prog="014" hbank="0" lbank="3"/>
+ <Patch name="D 015" prog="015" hbank="0" lbank="3"/>
+ <Patch name="D 016" prog="016" hbank="0" lbank="3"/>
+ <Patch name="D 017" prog="017" hbank="0" lbank="3"/>
+ <Patch name="D 018" prog="018" hbank="0" lbank="3"/>
+ <Patch name="D 019" prog="019" hbank="0" lbank="3"/>
+ <Patch name="D 020" prog="020" hbank="0" lbank="3"/>
+ <Patch name="D 021" prog="021" hbank="0" lbank="3"/>
+ <Patch name="D 022" prog="022" hbank="0" lbank="3"/>
+ <Patch name="D 023" prog="023" hbank="0" lbank="3"/>
+ <Patch name="D 024" prog="024" hbank="0" lbank="3"/>
+ <Patch name="D 025" prog="025" hbank="0" lbank="3"/>
+ <Patch name="D 026" prog="026" hbank="0" lbank="3"/>
+ <Patch name="D 027" prog="027" hbank="0" lbank="3"/>
+ <Patch name="D 028" prog="028" hbank="0" lbank="3"/>
+ <Patch name="D 029" prog="029" hbank="0" lbank="3"/>
+ <Patch name="D 030" prog="030" hbank="0" lbank="3"/>
+ <Patch name="D 031" prog="031" hbank="0" lbank="3"/>
+ <Patch name="D 032" prog="032" hbank="0" lbank="3"/>
+ <Patch name="D 033" prog="033" hbank="0" lbank="3"/>
+ <Patch name="D 034" prog="034" hbank="0" lbank="3"/>
+ <Patch name="D 035" prog="035" hbank="0" lbank="3"/>
+ <Patch name="D 036" prog="036" hbank="0" lbank="3"/>
+ <Patch name="D 037" prog="037" hbank="0" lbank="3"/>
+ <Patch name="D 038" prog="038" hbank="0" lbank="3"/>
+ <Patch name="D 039" prog="039" hbank="0" lbank="3"/>
+ <Patch name="D 040" prog="040" hbank="0" lbank="3"/>
+ <Patch name="D 041" prog="041" hbank="0" lbank="3"/>
+ <Patch name="D 042" prog="042" hbank="0" lbank="3"/>
+ <Patch name="D 043" prog="043" hbank="0" lbank="3"/>
+ <Patch name="D 044" prog="044" hbank="0" lbank="3"/>
+ <Patch name="D 045" prog="045" hbank="0" lbank="3"/>
+ <Patch name="D 046" prog="046" hbank="0" lbank="3"/>
+ <Patch name="D 047" prog="047" hbank="0" lbank="3"/>
+ <Patch name="D 048" prog="048" hbank="0" lbank="3"/>
+ <Patch name="D 049" prog="049" hbank="0" lbank="3"/>
+ <Patch name="D 050" prog="050" hbank="0" lbank="3"/>
+ <Patch name="D 051" prog="051" hbank="0" lbank="3"/>
+ <Patch name="D 052" prog="052" hbank="0" lbank="3"/>
+ <Patch name="D 053" prog="053" hbank="0" lbank="3"/>
+ <Patch name="D 054" prog="054" hbank="0" lbank="3"/>
+ <Patch name="D 055" prog="055" hbank="0" lbank="3"/>
+ <Patch name="D 056" prog="056" hbank="0" lbank="3"/>
+ <Patch name="D 057" prog="057" hbank="0" lbank="3"/>
+ <Patch name="D 058" prog="058" hbank="0" lbank="3"/>
+ <Patch name="D 059" prog="059" hbank="0" lbank="3"/>
+ <Patch name="D 060" prog="060" hbank="0" lbank="3"/>
+ <Patch name="D 061" prog="061" hbank="0" lbank="3"/>
+ <Patch name="D 062" prog="062" hbank="0" lbank="3"/>
+ <Patch name="D 063" prog="063" hbank="0" lbank="3"/>
+ <Patch name="D 064" prog="064" hbank="0" lbank="3"/>
+ <Patch name="D 065" prog="065" hbank="0" lbank="3"/>
+ <Patch name="D 066" prog="066" hbank="0" lbank="3"/>
+ <Patch name="D 067" prog="067" hbank="0" lbank="3"/>
+ <Patch name="D 068" prog="068" hbank="0" lbank="3"/>
+ <Patch name="D 069" prog="069" hbank="0" lbank="3"/>
+ <Patch name="D 070" prog="070" hbank="0" lbank="3"/>
+ <Patch name="D 071" prog="071" hbank="0" lbank="3"/>
+ <Patch name="D 072" prog="072" hbank="0" lbank="3"/>
+ <Patch name="D 073" prog="073" hbank="0" lbank="3"/>
+ <Patch name="D 074" prog="074" hbank="0" lbank="3"/>
+ <Patch name="D 075" prog="075" hbank="0" lbank="3"/>
+ <Patch name="D 076" prog="076" hbank="0" lbank="3"/>
+ <Patch name="D 077" prog="077" hbank="0" lbank="3"/>
+ <Patch name="D 078" prog="078" hbank="0" lbank="3"/>
+ <Patch name="D 079" prog="079" hbank="0" lbank="3"/>
+ <Patch name="D 080" prog="080" hbank="0" lbank="3"/>
+ <Patch name="D 081" prog="081" hbank="0" lbank="3"/>
+ <Patch name="D 082" prog="082" hbank="0" lbank="3"/>
+ <Patch name="D 083" prog="083" hbank="0" lbank="3"/>
+ <Patch name="D 084" prog="084" hbank="0" lbank="3"/>
+ <Patch name="D 085" prog="085" hbank="0" lbank="3"/>
+ <Patch name="D 086" prog="086" hbank="0" lbank="3"/>
+ <Patch name="D 087" prog="087" hbank="0" lbank="3"/>
+ <Patch name="D 088" prog="088" hbank="0" lbank="3"/>
+ <Patch name="D 089" prog="089" hbank="0" lbank="3"/>
+ <Patch name="D 090" prog="090" hbank="0" lbank="3"/>
+ <Patch name="D 091" prog="091" hbank="0" lbank="3"/>
+ <Patch name="D 092" prog="092" hbank="0" lbank="3"/>
+ <Patch name="D 093" prog="093" hbank="0" lbank="3"/>
+ <Patch name="D 094" prog="094" hbank="0" lbank="3"/>
+ <Patch name="D 095" prog="095" hbank="0" lbank="3"/>
+ <Patch name="D 096" prog="096" hbank="0" lbank="3"/>
+ <Patch name="D 097" prog="097" hbank="0" lbank="3"/>
+ <Patch name="D 098" prog="098" hbank="0" lbank="3"/>
+ <Patch name="D 099" prog="099" hbank="0" lbank="3"/>
+ <Patch name="D 100" prog="100" hbank="0" lbank="3"/>
+ <Patch name="D 101" prog="101" hbank="0" lbank="3"/>
+ <Patch name="D 102" prog="102" hbank="0" lbank="3"/>
+ <Patch name="D 103" prog="103" hbank="0" lbank="3"/>
+ <Patch name="D 104" prog="104" hbank="0" lbank="3"/>
+ <Patch name="D 105" prog="105" hbank="0" lbank="3"/>
+ <Patch name="D 106" prog="106" hbank="0" lbank="3"/>
+ <Patch name="D 107" prog="107" hbank="0" lbank="3"/>
+ <Patch name="D 108" prog="108" hbank="0" lbank="3"/>
+ <Patch name="D 109" prog="109" hbank="0" lbank="3"/>
+ <Patch name="D 110" prog="110" hbank="0" lbank="3"/>
+ <Patch name="D 111" prog="111" hbank="0" lbank="3"/>
+ <Patch name="D 112" prog="112" hbank="0" lbank="3"/>
+ <Patch name="D 113" prog="113" hbank="0" lbank="3"/>
+ <Patch name="D 114" prog="114" hbank="0" lbank="3"/>
+ <Patch name="D 115" prog="115" hbank="0" lbank="3"/>
+ <Patch name="D 116" prog="116" hbank="0" lbank="3"/>
+ <Patch name="D 117" prog="117" hbank="0" lbank="3"/>
+ <Patch name="D 118" prog="118" hbank="0" lbank="3"/>
+ <Patch name="D 119" prog="119" hbank="0" lbank="3"/>
+ <Patch name="D 120" prog="120" hbank="0" lbank="3"/>
+ <Patch name="D 121" prog="121" hbank="0" lbank="3"/>
+ <Patch name="D 122" prog="122" hbank="0" lbank="3"/>
+ <Patch name="D 123" prog="123" hbank="0" lbank="3"/>
+ <Patch name="D 124" prog="124" hbank="0" lbank="3"/>
+ <Patch name="D 125" prog="125" hbank="0" lbank="3"/>
+ <Patch name="D 126" prog="126" hbank="0" lbank="3"/>
+ <Patch name="D 127" prog="127" hbank="0" lbank="3"/>
+ </PatchGroup>
+ <PatchGroup name="Bank E">
+ <Patch name="E 000" prog="000" hbank="0" lbank="4"/>
+ <Patch name="E 001" prog="001" hbank="0" lbank="4"/>
+ <Patch name="E 002" prog="002" hbank="0" lbank="4"/>
+ <Patch name="E 003" prog="003" hbank="0" lbank="4"/>
+ <Patch name="E 004" prog="004" hbank="0" lbank="4"/>
+ <Patch name="E 005" prog="005" hbank="0" lbank="4"/>
+ <Patch name="E 006" prog="006" hbank="0" lbank="4"/>
+ <Patch name="E 007" prog="007" hbank="0" lbank="4"/>
+ <Patch name="E 008" prog="008" hbank="0" lbank="4"/>
+ <Patch name="E 009" prog="009" hbank="0" lbank="4"/>
+ <Patch name="E 010" prog="010" hbank="0" lbank="4"/>
+ <Patch name="E 011" prog="011" hbank="0" lbank="4"/>
+ <Patch name="E 012" prog="012" hbank="0" lbank="4"/>
+ <Patch name="E 013" prog="013" hbank="0" lbank="4"/>
+ <Patch name="E 014" prog="014" hbank="0" lbank="4"/>
+ <Patch name="E 015" prog="015" hbank="0" lbank="4"/>
+ <Patch name="E 016" prog="016" hbank="0" lbank="4"/>
+ <Patch name="E 017" prog="017" hbank="0" lbank="4"/>
+ <Patch name="E 018" prog="018" hbank="0" lbank="4"/>
+ <Patch name="E 019" prog="019" hbank="0" lbank="4"/>
+ <Patch name="E 020" prog="020" hbank="0" lbank="4"/>
+ <Patch name="E 021" prog="021" hbank="0" lbank="4"/>
+ <Patch name="E 022" prog="022" hbank="0" lbank="4"/>
+ <Patch name="E 023" prog="023" hbank="0" lbank="4"/>
+ <Patch name="E 024" prog="024" hbank="0" lbank="4"/>
+ <Patch name="E 025" prog="025" hbank="0" lbank="4"/>
+ <Patch name="E 026" prog="026" hbank="0" lbank="4"/>
+ <Patch name="E 027" prog="027" hbank="0" lbank="4"/>
+ <Patch name="E 028" prog="028" hbank="0" lbank="4"/>
+ <Patch name="E 029" prog="029" hbank="0" lbank="4"/>
+ <Patch name="E 030" prog="030" hbank="0" lbank="4"/>
+ <Patch name="E 031" prog="031" hbank="0" lbank="4"/>
+ <Patch name="E 032" prog="032" hbank="0" lbank="4"/>
+ <Patch name="E 033" prog="033" hbank="0" lbank="4"/>
+ <Patch name="E 034" prog="034" hbank="0" lbank="4"/>
+ <Patch name="E 035" prog="035" hbank="0" lbank="4"/>
+ <Patch name="E 036" prog="036" hbank="0" lbank="4"/>
+ <Patch name="E 037" prog="037" hbank="0" lbank="4"/>
+ <Patch name="E 038" prog="038" hbank="0" lbank="4"/>
+ <Patch name="E 039" prog="039" hbank="0" lbank="4"/>
+ <Patch name="E 040" prog="040" hbank="0" lbank="4"/>
+ <Patch name="E 041" prog="041" hbank="0" lbank="4"/>
+ <Patch name="E 042" prog="042" hbank="0" lbank="4"/>
+ <Patch name="E 043" prog="043" hbank="0" lbank="4"/>
+ <Patch name="E 044" prog="044" hbank="0" lbank="4"/>
+ <Patch name="E 045" prog="045" hbank="0" lbank="4"/>
+ <Patch name="E 046" prog="046" hbank="0" lbank="4"/>
+ <Patch name="E 047" prog="047" hbank="0" lbank="4"/>
+ <Patch name="E 048" prog="048" hbank="0" lbank="4"/>
+ <Patch name="E 049" prog="049" hbank="0" lbank="4"/>
+ <Patch name="E 050" prog="050" hbank="0" lbank="4"/>
+ <Patch name="E 051" prog="051" hbank="0" lbank="4"/>
+ <Patch name="E 052" prog="052" hbank="0" lbank="4"/>
+ <Patch name="E 053" prog="053" hbank="0" lbank="4"/>
+ <Patch name="E 054" prog="054" hbank="0" lbank="4"/>
+ <Patch name="E 055" prog="055" hbank="0" lbank="4"/>
+ <Patch name="E 056" prog="056" hbank="0" lbank="4"/>
+ <Patch name="E 057" prog="057" hbank="0" lbank="4"/>
+ <Patch name="E 058" prog="058" hbank="0" lbank="4"/>
+ <Patch name="E 059" prog="059" hbank="0" lbank="4"/>
+ <Patch name="E 060" prog="060" hbank="0" lbank="4"/>
+ <Patch name="E 061" prog="061" hbank="0" lbank="4"/>
+ <Patch name="E 062" prog="062" hbank="0" lbank="4"/>
+ <Patch name="E 063" prog="063" hbank="0" lbank="4"/>
+ <Patch name="E 064" prog="064" hbank="0" lbank="4"/>
+ <Patch name="E 065" prog="065" hbank="0" lbank="4"/>
+ <Patch name="E 066" prog="066" hbank="0" lbank="4"/>
+ <Patch name="E 067" prog="067" hbank="0" lbank="4"/>
+ <Patch name="E 068" prog="068" hbank="0" lbank="4"/>
+ <Patch name="E 069" prog="069" hbank="0" lbank="4"/>
+ <Patch name="E 070" prog="070" hbank="0" lbank="4"/>
+ <Patch name="E 071" prog="071" hbank="0" lbank="4"/>
+ <Patch name="E 072" prog="072" hbank="0" lbank="4"/>
+ <Patch name="E 073" prog="073" hbank="0" lbank="4"/>
+ <Patch name="E 074" prog="074" hbank="0" lbank="4"/>
+ <Patch name="E 075" prog="075" hbank="0" lbank="4"/>
+ <Patch name="E 076" prog="076" hbank="0" lbank="4"/>
+ <Patch name="E 077" prog="077" hbank="0" lbank="4"/>
+ <Patch name="E 078" prog="078" hbank="0" lbank="4"/>
+ <Patch name="E 079" prog="079" hbank="0" lbank="4"/>
+ <Patch name="E 080" prog="080" hbank="0" lbank="4"/>
+ <Patch name="E 081" prog="081" hbank="0" lbank="4"/>
+ <Patch name="E 082" prog="082" hbank="0" lbank="4"/>
+ <Patch name="E 083" prog="083" hbank="0" lbank="4"/>
+ <Patch name="E 084" prog="084" hbank="0" lbank="4"/>
+ <Patch name="E 085" prog="085" hbank="0" lbank="4"/>
+ <Patch name="E 086" prog="086" hbank="0" lbank="4"/>
+ <Patch name="E 087" prog="087" hbank="0" lbank="4"/>
+ <Patch name="E 088" prog="088" hbank="0" lbank="4"/>
+ <Patch name="E 089" prog="089" hbank="0" lbank="4"/>
+ <Patch name="E 090" prog="090" hbank="0" lbank="4"/>
+ <Patch name="E 091" prog="091" hbank="0" lbank="4"/>
+ <Patch name="E 092" prog="092" hbank="0" lbank="4"/>
+ <Patch name="E 093" prog="093" hbank="0" lbank="4"/>
+ <Patch name="E 094" prog="094" hbank="0" lbank="4"/>
+ <Patch name="E 095" prog="095" hbank="0" lbank="4"/>
+ <Patch name="E 096" prog="096" hbank="0" lbank="4"/>
+ <Patch name="E 097" prog="097" hbank="0" lbank="4"/>
+ <Patch name="E 098" prog="098" hbank="0" lbank="4"/>
+ <Patch name="E 099" prog="099" hbank="0" lbank="4"/>
+ <Patch name="E 100" prog="100" hbank="0" lbank="4"/>
+ <Patch name="E 101" prog="101" hbank="0" lbank="4"/>
+ <Patch name="E 102" prog="102" hbank="0" lbank="4"/>
+ <Patch name="E 103" prog="103" hbank="0" lbank="4"/>
+ <Patch name="E 104" prog="104" hbank="0" lbank="4"/>
+ <Patch name="E 105" prog="105" hbank="0" lbank="4"/>
+ <Patch name="E 106" prog="106" hbank="0" lbank="4"/>
+ <Patch name="E 107" prog="107" hbank="0" lbank="4"/>
+ <Patch name="E 108" prog="108" hbank="0" lbank="4"/>
+ <Patch name="E 109" prog="109" hbank="0" lbank="4"/>
+ <Patch name="E 110" prog="110" hbank="0" lbank="4"/>
+ <Patch name="E 111" prog="111" hbank="0" lbank="4"/>
+ <Patch name="E 112" prog="112" hbank="0" lbank="4"/>
+ <Patch name="E 113" prog="113" hbank="0" lbank="4"/>
+ <Patch name="E 114" prog="114" hbank="0" lbank="4"/>
+ <Patch name="E 115" prog="115" hbank="0" lbank="4"/>
+ <Patch name="E 116" prog="116" hbank="0" lbank="4"/>
+ <Patch name="E 117" prog="117" hbank="0" lbank="4"/>
+ <Patch name="E 118" prog="118" hbank="0" lbank="4"/>
+ <Patch name="E 119" prog="119" hbank="0" lbank="4"/>
+ <Patch name="E 120" prog="120" hbank="0" lbank="4"/>
+ <Patch name="E 121" prog="121" hbank="0" lbank="4"/>
+ <Patch name="E 122" prog="122" hbank="0" lbank="4"/>
+ <Patch name="E 123" prog="123" hbank="0" lbank="4"/>
+ <Patch name="E 124" prog="124" hbank="0" lbank="4"/>
+ <Patch name="E 125" prog="125" hbank="0" lbank="4"/>
+ <Patch name="E 126" prog="126" hbank="0" lbank="4"/>
+ <Patch name="E 127" prog="127" hbank="0" lbank="4"/>
+ </PatchGroup>
+ <PatchGroup name="Bank F">
+ <Patch name="F 000" prog="000" hbank="0" lbank="5"/>
+ <Patch name="F 001" prog="001" hbank="0" lbank="5"/>
+ <Patch name="F 002" prog="002" hbank="0" lbank="5"/>
+ <Patch name="F 003" prog="003" hbank="0" lbank="5"/>
+ <Patch name="F 004" prog="004" hbank="0" lbank="5"/>
+ <Patch name="F 005" prog="005" hbank="0" lbank="5"/>
+ <Patch name="F 006" prog="006" hbank="0" lbank="5"/>
+ <Patch name="F 007" prog="007" hbank="0" lbank="5"/>
+ <Patch name="F 008" prog="008" hbank="0" lbank="5"/>
+ <Patch name="F 009" prog="009" hbank="0" lbank="5"/>
+ <Patch name="F 010" prog="010" hbank="0" lbank="5"/>
+ <Patch name="F 011" prog="011" hbank="0" lbank="5"/>
+ <Patch name="F 012" prog="012" hbank="0" lbank="5"/>
+ <Patch name="F 013" prog="013" hbank="0" lbank="5"/>
+ <Patch name="F 014" prog="014" hbank="0" lbank="5"/>
+ <Patch name="F 015" prog="015" hbank="0" lbank="5"/>
+ <Patch name="F 016" prog="016" hbank="0" lbank="5"/>
+ <Patch name="F 017" prog="017" hbank="0" lbank="5"/>
+ <Patch name="F 018" prog="018" hbank="0" lbank="5"/>
+ <Patch name="F 019" prog="019" hbank="0" lbank="5"/>
+ <Patch name="F 020" prog="020" hbank="0" lbank="5"/>
+ <Patch name="F 021" prog="021" hbank="0" lbank="5"/>
+ <Patch name="F 022" prog="022" hbank="0" lbank="5"/>
+ <Patch name="F 023" prog="023" hbank="0" lbank="5"/>
+ <Patch name="F 024" prog="024" hbank="0" lbank="5"/>
+ <Patch name="F 025" prog="025" hbank="0" lbank="5"/>
+ <Patch name="F 026" prog="026" hbank="0" lbank="5"/>
+ <Patch name="F 027" prog="027" hbank="0" lbank="5"/>
+ <Patch name="F 028" prog="028" hbank="0" lbank="5"/>
+ <Patch name="F 029" prog="029" hbank="0" lbank="5"/>
+ <Patch name="F 030" prog="030" hbank="0" lbank="5"/>
+ <Patch name="F 031" prog="031" hbank="0" lbank="5"/>
+ <Patch name="F 032" prog="032" hbank="0" lbank="5"/>
+ <Patch name="F 033" prog="033" hbank="0" lbank="5"/>
+ <Patch name="F 034" prog="034" hbank="0" lbank="5"/>
+ <Patch name="F 035" prog="035" hbank="0" lbank="5"/>
+ <Patch name="F 036" prog="036" hbank="0" lbank="5"/>
+ <Patch name="F 037" prog="037" hbank="0" lbank="5"/>
+ <Patch name="F 038" prog="038" hbank="0" lbank="5"/>
+ <Patch name="F 039" prog="039" hbank="0" lbank="5"/>
+ <Patch name="F 040" prog="040" hbank="0" lbank="5"/>
+ <Patch name="F 041" prog="041" hbank="0" lbank="5"/>
+ <Patch name="F 042" prog="042" hbank="0" lbank="5"/>
+ <Patch name="F 043" prog="043" hbank="0" lbank="5"/>
+ <Patch name="F 044" prog="044" hbank="0" lbank="5"/>
+ <Patch name="F 045" prog="045" hbank="0" lbank="5"/>
+ <Patch name="F 046" prog="046" hbank="0" lbank="5"/>
+ <Patch name="F 047" prog="047" hbank="0" lbank="5"/>
+ <Patch name="F 048" prog="048" hbank="0" lbank="5"/>
+ <Patch name="F 049" prog="049" hbank="0" lbank="5"/>
+ <Patch name="F 050" prog="050" hbank="0" lbank="5"/>
+ <Patch name="F 051" prog="051" hbank="0" lbank="5"/>
+ <Patch name="F 052" prog="052" hbank="0" lbank="5"/>
+ <Patch name="F 053" prog="053" hbank="0" lbank="5"/>
+ <Patch name="F 054" prog="054" hbank="0" lbank="5"/>
+ <Patch name="F 055" prog="055" hbank="0" lbank="5"/>
+ <Patch name="F 056" prog="056" hbank="0" lbank="5"/>
+ <Patch name="F 057" prog="057" hbank="0" lbank="5"/>
+ <Patch name="F 058" prog="058" hbank="0" lbank="5"/>
+ <Patch name="F 059" prog="059" hbank="0" lbank="5"/>
+ <Patch name="F 060" prog="060" hbank="0" lbank="5"/>
+ <Patch name="F 061" prog="061" hbank="0" lbank="5"/>
+ <Patch name="F 062" prog="062" hbank="0" lbank="5"/>
+ <Patch name="F 063" prog="063" hbank="0" lbank="5"/>
+ <Patch name="F 064" prog="064" hbank="0" lbank="5"/>
+ <Patch name="F 065" prog="065" hbank="0" lbank="5"/>
+ <Patch name="F 066" prog="066" hbank="0" lbank="5"/>
+ <Patch name="F 067" prog="067" hbank="0" lbank="5"/>
+ <Patch name="F 068" prog="068" hbank="0" lbank="5"/>
+ <Patch name="F 069" prog="069" hbank="0" lbank="5"/>
+ <Patch name="F 070" prog="070" hbank="0" lbank="5"/>
+ <Patch name="F 071" prog="071" hbank="0" lbank="5"/>
+ <Patch name="F 072" prog="072" hbank="0" lbank="5"/>
+ <Patch name="F 073" prog="073" hbank="0" lbank="5"/>
+ <Patch name="F 074" prog="074" hbank="0" lbank="5"/>
+ <Patch name="F 075" prog="075" hbank="0" lbank="5"/>
+ <Patch name="F 076" prog="076" hbank="0" lbank="5"/>
+ <Patch name="F 077" prog="077" hbank="0" lbank="5"/>
+ <Patch name="F 078" prog="078" hbank="0" lbank="5"/>
+ <Patch name="F 079" prog="079" hbank="0" lbank="5"/>
+ <Patch name="F 080" prog="080" hbank="0" lbank="5"/>
+ <Patch name="F 081" prog="081" hbank="0" lbank="5"/>
+ <Patch name="F 082" prog="082" hbank="0" lbank="5"/>
+ <Patch name="F 083" prog="083" hbank="0" lbank="5"/>
+ <Patch name="F 084" prog="084" hbank="0" lbank="5"/>
+ <Patch name="F 085" prog="085" hbank="0" lbank="5"/>
+ <Patch name="F 086" prog="086" hbank="0" lbank="5"/>
+ <Patch name="F 087" prog="087" hbank="0" lbank="5"/>
+ <Patch name="F 088" prog="088" hbank="0" lbank="5"/>
+ <Patch name="F 089" prog="089" hbank="0" lbank="5"/>
+ <Patch name="F 090" prog="090" hbank="0" lbank="5"/>
+ <Patch name="F 091" prog="091" hbank="0" lbank="5"/>
+ <Patch name="F 092" prog="092" hbank="0" lbank="5"/>
+ <Patch name="F 093" prog="093" hbank="0" lbank="5"/>
+ <Patch name="F 094" prog="094" hbank="0" lbank="5"/>
+ <Patch name="F 095" prog="095" hbank="0" lbank="5"/>
+ <Patch name="F 096" prog="096" hbank="0" lbank="5"/>
+ <Patch name="F 097" prog="097" hbank="0" lbank="5"/>
+ <Patch name="F 098" prog="098" hbank="0" lbank="5"/>
+ <Patch name="F 099" prog="099" hbank="0" lbank="5"/>
+ <Patch name="F 100" prog="100" hbank="0" lbank="5"/>
+ <Patch name="F 101" prog="101" hbank="0" lbank="5"/>
+ <Patch name="F 102" prog="102" hbank="0" lbank="5"/>
+ <Patch name="F 103" prog="103" hbank="0" lbank="5"/>
+ <Patch name="F 104" prog="104" hbank="0" lbank="5"/>
+ <Patch name="F 105" prog="105" hbank="0" lbank="5"/>
+ <Patch name="F 106" prog="106" hbank="0" lbank="5"/>
+ <Patch name="F 107" prog="107" hbank="0" lbank="5"/>
+ <Patch name="F 108" prog="108" hbank="0" lbank="5"/>
+ <Patch name="F 109" prog="109" hbank="0" lbank="5"/>
+ <Patch name="F 110" prog="110" hbank="0" lbank="5"/>
+ <Patch name="F 111" prog="111" hbank="0" lbank="5"/>
+ <Patch name="F 112" prog="112" hbank="0" lbank="5"/>
+ <Patch name="F 113" prog="113" hbank="0" lbank="5"/>
+ <Patch name="F 114" prog="114" hbank="0" lbank="5"/>
+ <Patch name="F 115" prog="115" hbank="0" lbank="5"/>
+ <Patch name="F 116" prog="116" hbank="0" lbank="5"/>
+ <Patch name="F 117" prog="117" hbank="0" lbank="5"/>
+ <Patch name="F 118" prog="118" hbank="0" lbank="5"/>
+ <Patch name="F 119" prog="119" hbank="0" lbank="5"/>
+ <Patch name="F 120" prog="120" hbank="0" lbank="5"/>
+ <Patch name="F 121" prog="121" hbank="0" lbank="5"/>
+ <Patch name="F 122" prog="122" hbank="0" lbank="5"/>
+ <Patch name="F 123" prog="123" hbank="0" lbank="5"/>
+ <Patch name="F 124" prog="124" hbank="0" lbank="5"/>
+ <Patch name="F 125" prog="125" hbank="0" lbank="5"/>
+ <Patch name="F 126" prog="126" hbank="0" lbank="5"/>
+ <Patch name="F 127" prog="127" hbank="0" lbank="5"/>
+ </PatchGroup>
+ <PatchGroup name="Bank G">
+ <Patch name="G 000" prog="000" hbank="0" lbank="6"/>
+ <Patch name="G 001" prog="001" hbank="0" lbank="6"/>
+ <Patch name="G 002" prog="002" hbank="0" lbank="6"/>
+ <Patch name="G 003" prog="003" hbank="0" lbank="6"/>
+ <Patch name="G 004" prog="004" hbank="0" lbank="6"/>
+ <Patch name="G 005" prog="005" hbank="0" lbank="6"/>
+ <Patch name="G 006" prog="006" hbank="0" lbank="6"/>
+ <Patch name="G 007" prog="007" hbank="0" lbank="6"/>
+ <Patch name="G 008" prog="008" hbank="0" lbank="6"/>
+ <Patch name="G 009" prog="009" hbank="0" lbank="6"/>
+ <Patch name="G 010" prog="010" hbank="0" lbank="6"/>
+ <Patch name="G 011" prog="011" hbank="0" lbank="6"/>
+ <Patch name="G 012" prog="012" hbank="0" lbank="6"/>
+ <Patch name="G 013" prog="013" hbank="0" lbank="6"/>
+ <Patch name="G 014" prog="014" hbank="0" lbank="6"/>
+ <Patch name="G 015" prog="015" hbank="0" lbank="6"/>
+ <Patch name="G 016" prog="016" hbank="0" lbank="6"/>
+ <Patch name="G 017" prog="017" hbank="0" lbank="6"/>
+ <Patch name="G 018" prog="018" hbank="0" lbank="6"/>
+ <Patch name="G 019" prog="019" hbank="0" lbank="6"/>
+ <Patch name="G 020" prog="020" hbank="0" lbank="6"/>
+ <Patch name="G 021" prog="021" hbank="0" lbank="6"/>
+ <Patch name="G 022" prog="022" hbank="0" lbank="6"/>
+ <Patch name="G 023" prog="023" hbank="0" lbank="6"/>
+ <Patch name="G 024" prog="024" hbank="0" lbank="6"/>
+ <Patch name="G 025" prog="025" hbank="0" lbank="6"/>
+ <Patch name="G 026" prog="026" hbank="0" lbank="6"/>
+ <Patch name="G 027" prog="027" hbank="0" lbank="6"/>
+ <Patch name="G 028" prog="028" hbank="0" lbank="6"/>
+ <Patch name="G 029" prog="029" hbank="0" lbank="6"/>
+ <Patch name="G 030" prog="030" hbank="0" lbank="6"/>
+ <Patch name="G 031" prog="031" hbank="0" lbank="6"/>
+ <Patch name="G 032" prog="032" hbank="0" lbank="6"/>
+ <Patch name="G 033" prog="033" hbank="0" lbank="6"/>
+ <Patch name="G 034" prog="034" hbank="0" lbank="6"/>
+ <Patch name="G 035" prog="035" hbank="0" lbank="6"/>
+ <Patch name="G 036" prog="036" hbank="0" lbank="6"/>
+ <Patch name="G 037" prog="037" hbank="0" lbank="6"/>
+ <Patch name="G 038" prog="038" hbank="0" lbank="6"/>
+ <Patch name="G 039" prog="039" hbank="0" lbank="6"/>
+ <Patch name="G 040" prog="040" hbank="0" lbank="6"/>
+ <Patch name="G 041" prog="041" hbank="0" lbank="6"/>
+ <Patch name="G 042" prog="042" hbank="0" lbank="6"/>
+ <Patch name="G 043" prog="043" hbank="0" lbank="6"/>
+ <Patch name="G 044" prog="044" hbank="0" lbank="6"/>
+ <Patch name="G 045" prog="045" hbank="0" lbank="6"/>
+ <Patch name="G 046" prog="046" hbank="0" lbank="6"/>
+ <Patch name="G 047" prog="047" hbank="0" lbank="6"/>
+ <Patch name="G 048" prog="048" hbank="0" lbank="6"/>
+ <Patch name="G 049" prog="049" hbank="0" lbank="6"/>
+ <Patch name="G 050" prog="050" hbank="0" lbank="6"/>
+ <Patch name="G 051" prog="051" hbank="0" lbank="6"/>
+ <Patch name="G 052" prog="052" hbank="0" lbank="6"/>
+ <Patch name="G 053" prog="053" hbank="0" lbank="6"/>
+ <Patch name="G 054" prog="054" hbank="0" lbank="6"/>
+ <Patch name="G 055" prog="055" hbank="0" lbank="6"/>
+ <Patch name="G 056" prog="056" hbank="0" lbank="6"/>
+ <Patch name="G 057" prog="057" hbank="0" lbank="6"/>
+ <Patch name="G 058" prog="058" hbank="0" lbank="6"/>
+ <Patch name="G 059" prog="059" hbank="0" lbank="6"/>
+ <Patch name="G 060" prog="060" hbank="0" lbank="6"/>
+ <Patch name="G 061" prog="061" hbank="0" lbank="6"/>
+ <Patch name="G 062" prog="062" hbank="0" lbank="6"/>
+ <Patch name="G 063" prog="063" hbank="0" lbank="6"/>
+ <Patch name="G 064" prog="064" hbank="0" lbank="6"/>
+ <Patch name="G 065" prog="065" hbank="0" lbank="6"/>
+ <Patch name="G 066" prog="066" hbank="0" lbank="6"/>
+ <Patch name="G 067" prog="067" hbank="0" lbank="6"/>
+ <Patch name="G 068" prog="068" hbank="0" lbank="6"/>
+ <Patch name="G 069" prog="069" hbank="0" lbank="6"/>
+ <Patch name="G 070" prog="070" hbank="0" lbank="6"/>
+ <Patch name="G 071" prog="071" hbank="0" lbank="6"/>
+ <Patch name="G 072" prog="072" hbank="0" lbank="6"/>
+ <Patch name="G 073" prog="073" hbank="0" lbank="6"/>
+ <Patch name="G 074" prog="074" hbank="0" lbank="6"/>
+ <Patch name="G 075" prog="075" hbank="0" lbank="6"/>
+ <Patch name="G 076" prog="076" hbank="0" lbank="6"/>
+ <Patch name="G 077" prog="077" hbank="0" lbank="6"/>
+ <Patch name="G 078" prog="078" hbank="0" lbank="6"/>
+ <Patch name="G 079" prog="079" hbank="0" lbank="6"/>
+ <Patch name="G 080" prog="080" hbank="0" lbank="6"/>
+ <Patch name="G 081" prog="081" hbank="0" lbank="6"/>
+ <Patch name="G 082" prog="082" hbank="0" lbank="6"/>
+ <Patch name="G 083" prog="083" hbank="0" lbank="6"/>
+ <Patch name="G 084" prog="084" hbank="0" lbank="6"/>
+ <Patch name="G 085" prog="085" hbank="0" lbank="6"/>
+ <Patch name="G 086" prog="086" hbank="0" lbank="6"/>
+ <Patch name="G 087" prog="087" hbank="0" lbank="6"/>
+ <Patch name="G 088" prog="088" hbank="0" lbank="6"/>
+ <Patch name="G 089" prog="089" hbank="0" lbank="6"/>
+ <Patch name="G 090" prog="090" hbank="0" lbank="6"/>
+ <Patch name="G 091" prog="091" hbank="0" lbank="6"/>
+ <Patch name="G 092" prog="092" hbank="0" lbank="6"/>
+ <Patch name="G 093" prog="093" hbank="0" lbank="6"/>
+ <Patch name="G 094" prog="094" hbank="0" lbank="6"/>
+ <Patch name="G 095" prog="095" hbank="0" lbank="6"/>
+ <Patch name="G 096" prog="096" hbank="0" lbank="6"/>
+ <Patch name="G 097" prog="097" hbank="0" lbank="6"/>
+ <Patch name="G 098" prog="098" hbank="0" lbank="6"/>
+ <Patch name="G 099" prog="099" hbank="0" lbank="6"/>
+ <Patch name="G 100" prog="100" hbank="0" lbank="6"/>
+ <Patch name="G 101" prog="101" hbank="0" lbank="6"/>
+ <Patch name="G 102" prog="102" hbank="0" lbank="6"/>
+ <Patch name="G 103" prog="103" hbank="0" lbank="6"/>
+ <Patch name="G 104" prog="104" hbank="0" lbank="6"/>
+ <Patch name="G 105" prog="105" hbank="0" lbank="6"/>
+ <Patch name="G 106" prog="106" hbank="0" lbank="6"/>
+ <Patch name="G 107" prog="107" hbank="0" lbank="6"/>
+ <Patch name="G 108" prog="108" hbank="0" lbank="6"/>
+ <Patch name="G 109" prog="109" hbank="0" lbank="6"/>
+ <Patch name="G 110" prog="110" hbank="0" lbank="6"/>
+ <Patch name="G 111" prog="111" hbank="0" lbank="6"/>
+ <Patch name="G 112" prog="112" hbank="0" lbank="6"/>
+ <Patch name="G 113" prog="113" hbank="0" lbank="6"/>
+ <Patch name="G 114" prog="114" hbank="0" lbank="6"/>
+ <Patch name="G 115" prog="115" hbank="0" lbank="6"/>
+ <Patch name="G 116" prog="116" hbank="0" lbank="6"/>
+ <Patch name="G 117" prog="117" hbank="0" lbank="6"/>
+ <Patch name="G 118" prog="118" hbank="0" lbank="6"/>
+ <Patch name="G 119" prog="119" hbank="0" lbank="6"/>
+ <Patch name="G 120" prog="120" hbank="0" lbank="6"/>
+ <Patch name="G 121" prog="121" hbank="0" lbank="6"/>
+ <Patch name="G 122" prog="122" hbank="0" lbank="6"/>
+ <Patch name="G 123" prog="123" hbank="0" lbank="6"/>
+ <Patch name="G 124" prog="124" hbank="0" lbank="6"/>
+ <Patch name="G 125" prog="125" hbank="0" lbank="6"/>
+ <Patch name="G 126" prog="126" hbank="0" lbank="6"/>
+ <Patch name="G 127" prog="127" hbank="0" lbank="6"/>
+ </PatchGroup>
+ <PatchGroup name="Bank H">
+ <Patch name="H 000" prog="000" hbank="0" lbank="7"/>
+ <Patch name="H 001" prog="001" hbank="0" lbank="7"/>
+ <Patch name="H 002" prog="002" hbank="0" lbank="7"/>
+ <Patch name="H 003" prog="003" hbank="0" lbank="7"/>
+ <Patch name="H 004" prog="004" hbank="0" lbank="7"/>
+ <Patch name="H 005" prog="005" hbank="0" lbank="7"/>
+ <Patch name="H 006" prog="006" hbank="0" lbank="7"/>
+ <Patch name="H 007" prog="007" hbank="0" lbank="7"/>
+ <Patch name="H 008" prog="008" hbank="0" lbank="7"/>
+ <Patch name="H 009" prog="009" hbank="0" lbank="7"/>
+ <Patch name="H 010" prog="010" hbank="0" lbank="7"/>
+ <Patch name="H 011" prog="011" hbank="0" lbank="7"/>
+ <Patch name="H 012" prog="012" hbank="0" lbank="7"/>
+ <Patch name="H 013" prog="013" hbank="0" lbank="7"/>
+ <Patch name="H 014" prog="014" hbank="0" lbank="7"/>
+ <Patch name="H 015" prog="015" hbank="0" lbank="7"/>
+ <Patch name="H 016" prog="016" hbank="0" lbank="7"/>
+ <Patch name="H 017" prog="017" hbank="0" lbank="7"/>
+ <Patch name="H 018" prog="018" hbank="0" lbank="7"/>
+ <Patch name="H 019" prog="019" hbank="0" lbank="7"/>
+ <Patch name="H 020" prog="020" hbank="0" lbank="7"/>
+ <Patch name="H 021" prog="021" hbank="0" lbank="7"/>
+ <Patch name="H 022" prog="022" hbank="0" lbank="7"/>
+ <Patch name="H 023" prog="023" hbank="0" lbank="7"/>
+ <Patch name="H 024" prog="024" hbank="0" lbank="7"/>
+ <Patch name="H 025" prog="025" hbank="0" lbank="7"/>
+ <Patch name="H 026" prog="026" hbank="0" lbank="7"/>
+ <Patch name="H 027" prog="027" hbank="0" lbank="7"/>
+ <Patch name="H 028" prog="028" hbank="0" lbank="7"/>
+ <Patch name="H 029" prog="029" hbank="0" lbank="7"/>
+ <Patch name="H 030" prog="030" hbank="0" lbank="7"/>
+ <Patch name="H 031" prog="031" hbank="0" lbank="7"/>
+ <Patch name="H 032" prog="032" hbank="0" lbank="7"/>
+ <Patch name="H 033" prog="033" hbank="0" lbank="7"/>
+ <Patch name="H 034" prog="034" hbank="0" lbank="7"/>
+ <Patch name="H 035" prog="035" hbank="0" lbank="7"/>
+ <Patch name="H 036" prog="036" hbank="0" lbank="7"/>
+ <Patch name="H 037" prog="037" hbank="0" lbank="7"/>
+ <Patch name="H 038" prog="038" hbank="0" lbank="7"/>
+ <Patch name="H 039" prog="039" hbank="0" lbank="7"/>
+ <Patch name="H 040" prog="040" hbank="0" lbank="7"/>
+ <Patch name="H 041" prog="041" hbank="0" lbank="7"/>
+ <Patch name="H 042" prog="042" hbank="0" lbank="7"/>
+ <Patch name="H 043" prog="043" hbank="0" lbank="7"/>
+ <Patch name="H 044" prog="044" hbank="0" lbank="7"/>
+ <Patch name="H 045" prog="045" hbank="0" lbank="7"/>
+ <Patch name="H 046" prog="046" hbank="0" lbank="7"/>
+ <Patch name="H 047" prog="047" hbank="0" lbank="7"/>
+ <Patch name="H 048" prog="048" hbank="0" lbank="7"/>
+ <Patch name="H 049" prog="049" hbank="0" lbank="7"/>
+ <Patch name="H 050" prog="050" hbank="0" lbank="7"/>
+ <Patch name="H 051" prog="051" hbank="0" lbank="7"/>
+ <Patch name="H 052" prog="052" hbank="0" lbank="7"/>
+ <Patch name="H 053" prog="053" hbank="0" lbank="7"/>
+ <Patch name="H 054" prog="054" hbank="0" lbank="7"/>
+ <Patch name="H 055" prog="055" hbank="0" lbank="7"/>
+ <Patch name="H 056" prog="056" hbank="0" lbank="7"/>
+ <Patch name="H 057" prog="057" hbank="0" lbank="7"/>
+ <Patch name="H 058" prog="058" hbank="0" lbank="7"/>
+ <Patch name="H 059" prog="059" hbank="0" lbank="7"/>
+ <Patch name="H 060" prog="060" hbank="0" lbank="7"/>
+ <Patch name="H 061" prog="061" hbank="0" lbank="7"/>
+ <Patch name="H 062" prog="062" hbank="0" lbank="7"/>
+ <Patch name="H 063" prog="063" hbank="0" lbank="7"/>
+ <Patch name="H 064" prog="064" hbank="0" lbank="7"/>
+ <Patch name="H 065" prog="065" hbank="0" lbank="7"/>
+ <Patch name="H 066" prog="066" hbank="0" lbank="7"/>
+ <Patch name="H 067" prog="067" hbank="0" lbank="7"/>
+ <Patch name="H 068" prog="068" hbank="0" lbank="7"/>
+ <Patch name="H 069" prog="069" hbank="0" lbank="7"/>
+ <Patch name="H 070" prog="070" hbank="0" lbank="7"/>
+ <Patch name="H 071" prog="071" hbank="0" lbank="7"/>
+ <Patch name="H 072" prog="072" hbank="0" lbank="7"/>
+ <Patch name="H 073" prog="073" hbank="0" lbank="7"/>
+ <Patch name="H 074" prog="074" hbank="0" lbank="7"/>
+ <Patch name="H 075" prog="075" hbank="0" lbank="7"/>
+ <Patch name="H 076" prog="076" hbank="0" lbank="7"/>
+ <Patch name="H 077" prog="077" hbank="0" lbank="7"/>
+ <Patch name="H 078" prog="078" hbank="0" lbank="7"/>
+ <Patch name="H 079" prog="079" hbank="0" lbank="7"/>
+ <Patch name="H 080" prog="080" hbank="0" lbank="7"/>
+ <Patch name="H 081" prog="081" hbank="0" lbank="7"/>
+ <Patch name="H 082" prog="082" hbank="0" lbank="7"/>
+ <Patch name="H 083" prog="083" hbank="0" lbank="7"/>
+ <Patch name="H 084" prog="084" hbank="0" lbank="7"/>
+ <Patch name="H 085" prog="085" hbank="0" lbank="7"/>
+ <Patch name="H 086" prog="086" hbank="0" lbank="7"/>
+ <Patch name="H 087" prog="087" hbank="0" lbank="7"/>
+ <Patch name="H 088" prog="088" hbank="0" lbank="7"/>
+ <Patch name="H 089" prog="089" hbank="0" lbank="7"/>
+ <Patch name="H 090" prog="090" hbank="0" lbank="7"/>
+ <Patch name="H 091" prog="091" hbank="0" lbank="7"/>
+ <Patch name="H 092" prog="092" hbank="0" lbank="7"/>
+ <Patch name="H 093" prog="093" hbank="0" lbank="7"/>
+ <Patch name="H 094" prog="094" hbank="0" lbank="7"/>
+ <Patch name="H 095" prog="095" hbank="0" lbank="7"/>
+ <Patch name="H 096" prog="096" hbank="0" lbank="7"/>
+ <Patch name="H 097" prog="097" hbank="0" lbank="7"/>
+ <Patch name="H 098" prog="098" hbank="0" lbank="7"/>
+ <Patch name="H 099" prog="099" hbank="0" lbank="7"/>
+ <Patch name="H 100" prog="100" hbank="0" lbank="7"/>
+ <Patch name="H 101" prog="101" hbank="0" lbank="7"/>
+ <Patch name="H 102" prog="102" hbank="0" lbank="7"/>
+ <Patch name="H 103" prog="103" hbank="0" lbank="7"/>
+ <Patch name="H 104" prog="104" hbank="0" lbank="7"/>
+ <Patch name="H 105" prog="105" hbank="0" lbank="7"/>
+ <Patch name="H 106" prog="106" hbank="0" lbank="7"/>
+ <Patch name="H 107" prog="107" hbank="0" lbank="7"/>
+ <Patch name="H 108" prog="108" hbank="0" lbank="7"/>
+ <Patch name="H 109" prog="109" hbank="0" lbank="7"/>
+ <Patch name="H 110" prog="110" hbank="0" lbank="7"/>
+ <Patch name="H 111" prog="111" hbank="0" lbank="7"/>
+ <Patch name="H 112" prog="112" hbank="0" lbank="7"/>
+ <Patch name="H 113" prog="113" hbank="0" lbank="7"/>
+ <Patch name="H 114" prog="114" hbank="0" lbank="7"/>
+ <Patch name="H 115" prog="115" hbank="0" lbank="7"/>
+ <Patch name="H 116" prog="116" hbank="0" lbank="7"/>
+ <Patch name="H 117" prog="117" hbank="0" lbank="7"/>
+ <Patch name="H 118" prog="118" hbank="0" lbank="7"/>
+ <Patch name="H 119" prog="119" hbank="0" lbank="7"/>
+ <Patch name="H 120" prog="120" hbank="0" lbank="7"/>
+ <Patch name="H 121" prog="121" hbank="0" lbank="7"/>
+ <Patch name="H 122" prog="122" hbank="0" lbank="7"/>
+ <Patch name="H 123" prog="123" hbank="0" lbank="7"/>
+ <Patch name="H 124" prog="124" hbank="0" lbank="7"/>
+ <Patch name="H 125" prog="125" hbank="0" lbank="7"/>
+ <Patch name="H 126" prog="126" hbank="0" lbank="7"/>
+ <Patch name="H 127" prog="127" hbank="0" lbank="7"/>
+ </PatchGroup>
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/Alesis-Ion.idf b/muse/share/instruments/Alesis-Ion.idf
new file mode 100644
index 00000000..a7ce3695
--- /dev/null
+++ b/muse/share/instruments/Alesis-Ion.idf
@@ -0,0 +1,731 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Alesis Ion">
+ <Init>
+ </Init>
+
+ <PatchGroup name="Red">
+ <Patch name="Red 000" hbank="0" lbank="0" prog="0" />
+ <Patch name="Red 001" hbank="0" lbank="0" prog="1" />
+ <Patch name="Red 002" hbank="0" lbank="0" prog="2" />
+ <Patch name="Red 003" hbank="0" lbank="0" prog="3" />
+ <Patch name="Red 004" hbank="0" lbank="0" prog="4" />
+ <Patch name="Red 005" hbank="0" lbank="0" prog="5" />
+ <Patch name="Red 006" hbank="0" lbank="0" prog="6" />
+ <Patch name="Red 007" hbank="0" lbank="0" prog="7" />
+ <Patch name="Red 008" hbank="0" lbank="0" prog="8" />
+ <Patch name="Red 009" hbank="0" lbank="0" prog="9" />
+ <Patch name="Red 010" hbank="0" lbank="0" prog="10" />
+ <Patch name="Red 011" hbank="0" lbank="0" prog="11" />
+ <Patch name="Red 012" hbank="0" lbank="0" prog="12" />
+ <Patch name="Red 013" hbank="0" lbank="0" prog="13" />
+ <Patch name="Red 014" hbank="0" lbank="0" prog="14" />
+ <Patch name="Red 015" hbank="0" lbank="0" prog="15" />
+ <Patch name="Red 016" hbank="0" lbank="0" prog="16" />
+ <Patch name="Red 017" hbank="0" lbank="0" prog="17" />
+ <Patch name="Red 018" hbank="0" lbank="0" prog="18" />
+ <Patch name="Red 019" hbank="0" lbank="0" prog="19" />
+ <Patch name="Red 020" hbank="0" lbank="0" prog="20" />
+ <Patch name="Red 021" hbank="0" lbank="0" prog="21" />
+ <Patch name="Red 022" hbank="0" lbank="0" prog="22" />
+ <Patch name="Red 023" hbank="0" lbank="0" prog="23" />
+ <Patch name="Red 024" hbank="0" lbank="0" prog="24" />
+ <Patch name="Red 025" hbank="0" lbank="0" prog="25" />
+ <Patch name="Red 026" hbank="0" lbank="0" prog="26" />
+ <Patch name="Red 027" hbank="0" lbank="0" prog="27" />
+ <Patch name="Red 028" hbank="0" lbank="0" prog="28" />
+ <Patch name="Red 029" hbank="0" lbank="0" prog="29" />
+ <Patch name="Red 030" hbank="0" lbank="0" prog="30" />
+ <Patch name="Red 031" hbank="0" lbank="0" prog="31" />
+ <Patch name="Red 032" hbank="0" lbank="0" prog="32" />
+ <Patch name="Red 033" hbank="0" lbank="0" prog="33" />
+ <Patch name="Red 034" hbank="0" lbank="0" prog="34" />
+ <Patch name="Red 035" hbank="0" lbank="0" prog="35" />
+ <Patch name="Red 036" hbank="0" lbank="0" prog="36" />
+ <Patch name="Red 037" hbank="0" lbank="0" prog="37" />
+ <Patch name="Red 038" hbank="0" lbank="0" prog="38" />
+ <Patch name="Red 039" hbank="0" lbank="0" prog="39" />
+ <Patch name="Red 040" hbank="0" lbank="0" prog="40" />
+ <Patch name="Red 041" hbank="0" lbank="0" prog="41" />
+ <Patch name="Red 042" hbank="0" lbank="0" prog="42" />
+ <Patch name="Red 043" hbank="0" lbank="0" prog="43" />
+ <Patch name="Red 044" hbank="0" lbank="0" prog="44" />
+ <Patch name="Red 045" hbank="0" lbank="0" prog="45" />
+ <Patch name="Red 046" hbank="0" lbank="0" prog="46" />
+ <Patch name="Red 047" hbank="0" lbank="0" prog="47" />
+ <Patch name="Red 048" hbank="0" lbank="0" prog="48" />
+ <Patch name="Red 049" hbank="0" lbank="0" prog="49" />
+ <Patch name="Red 050" hbank="0" lbank="0" prog="50" />
+ <Patch name="Red 051" hbank="0" lbank="0" prog="51" />
+ <Patch name="Red 052" hbank="0" lbank="0" prog="52" />
+ <Patch name="Red 053" hbank="0" lbank="0" prog="53" />
+ <Patch name="Red 054" hbank="0" lbank="0" prog="54" />
+ <Patch name="Red 055" hbank="0" lbank="0" prog="55" />
+ <Patch name="Red 056" hbank="0" lbank="0" prog="56" />
+ <Patch name="Red 057" hbank="0" lbank="0" prog="57" />
+ <Patch name="Red 058" hbank="0" lbank="0" prog="58" />
+ <Patch name="Red 059" hbank="0" lbank="0" prog="59" />
+ <Patch name="Red 060" hbank="0" lbank="0" prog="60" />
+ <Patch name="Red 061" hbank="0" lbank="0" prog="61" />
+ <Patch name="Red 062" hbank="0" lbank="0" prog="62" />
+ <Patch name="Red 063" hbank="0" lbank="0" prog="63" />
+ <Patch name="Red 064" hbank="0" lbank="0" prog="64" />
+ <Patch name="Red 065" hbank="0" lbank="0" prog="65" />
+ <Patch name="Red 066" hbank="0" lbank="0" prog="66" />
+ <Patch name="Red 067" hbank="0" lbank="0" prog="67" />
+ <Patch name="Red 068" hbank="0" lbank="0" prog="68" />
+ <Patch name="Red 069" hbank="0" lbank="0" prog="69" />
+ <Patch name="Red 070" hbank="0" lbank="0" prog="70" />
+ <Patch name="Red 071" hbank="0" lbank="0" prog="71" />
+ <Patch name="Red 072" hbank="0" lbank="0" prog="72" />
+ <Patch name="Red 073" hbank="0" lbank="0" prog="73" />
+ <Patch name="Red 074" hbank="0" lbank="0" prog="74" />
+ <Patch name="Red 075" hbank="0" lbank="0" prog="75" />
+ <Patch name="Red 076" hbank="0" lbank="0" prog="76" />
+ <Patch name="Red 077" hbank="0" lbank="0" prog="77" />
+ <Patch name="Red 078" hbank="0" lbank="0" prog="78" />
+ <Patch name="Red 079" hbank="0" lbank="0" prog="79" />
+ <Patch name="Red 080" hbank="0" lbank="0" prog="80" />
+ <Patch name="Red 081" hbank="0" lbank="0" prog="81" />
+ <Patch name="Red 082" hbank="0" lbank="0" prog="82" />
+ <Patch name="Red 083" hbank="0" lbank="0" prog="83" />
+ <Patch name="Red 084" hbank="0" lbank="0" prog="84" />
+ <Patch name="Red 085" hbank="0" lbank="0" prog="85" />
+ <Patch name="Red 086" hbank="0" lbank="0" prog="86" />
+ <Patch name="Red 087" hbank="0" lbank="0" prog="87" />
+ <Patch name="Red 088" hbank="0" lbank="0" prog="88" />
+ <Patch name="Red 089" hbank="0" lbank="0" prog="89" />
+ <Patch name="Red 090" hbank="0" lbank="0" prog="90" />
+ <Patch name="Red 091" hbank="0" lbank="0" prog="91" />
+ <Patch name="Red 092" hbank="0" lbank="0" prog="92" />
+ <Patch name="Red 093" hbank="0" lbank="0" prog="93" />
+ <Patch name="Red 094" hbank="0" lbank="0" prog="94" />
+ <Patch name="Red 095" hbank="0" lbank="0" prog="95" />
+ <Patch name="Red 096" hbank="0" lbank="0" prog="96" />
+ <Patch name="Red 097" hbank="0" lbank="0" prog="97" />
+ <Patch name="Red 098" hbank="0" lbank="0" prog="98" />
+ <Patch name="Red 099" hbank="0" lbank="0" prog="99" />
+ <Patch name="Red 100" hbank="0" lbank="0" prog="100" />
+ <Patch name="Red 101" hbank="0" lbank="0" prog="101" />
+ <Patch name="Red 102" hbank="0" lbank="0" prog="102" />
+ <Patch name="Red 103" hbank="0" lbank="0" prog="103" />
+ <Patch name="Red 104" hbank="0" lbank="0" prog="104" />
+ <Patch name="Red 105" hbank="0" lbank="0" prog="105" />
+ <Patch name="Red 106" hbank="0" lbank="0" prog="106" />
+ <Patch name="Red 107" hbank="0" lbank="0" prog="107" />
+ <Patch name="Red 108" hbank="0" lbank="0" prog="108" />
+ <Patch name="Red 109" hbank="0" lbank="0" prog="109" />
+ <Patch name="Red 110" hbank="0" lbank="0" prog="110" />
+ <Patch name="Red 111" hbank="0" lbank="0" prog="111" />
+ <Patch name="Red 112" hbank="0" lbank="0" prog="112" />
+ <Patch name="Red 113" hbank="0" lbank="0" prog="113" />
+ <Patch name="Red 114" hbank="0" lbank="0" prog="114" />
+ <Patch name="Red 115" hbank="0" lbank="0" prog="115" />
+ <Patch name="Red 116" hbank="0" lbank="0" prog="116" />
+ <Patch name="Red 117" hbank="0" lbank="0" prog="117" />
+ <Patch name="Red 118" hbank="0" lbank="0" prog="118" />
+ <Patch name="Red 119" hbank="0" lbank="0" prog="119" />
+ <Patch name="Red 120" hbank="0" lbank="0" prog="120" />
+ <Patch name="Red 121" hbank="0" lbank="0" prog="121" />
+ <Patch name="Red 122" hbank="0" lbank="0" prog="122" />
+ <Patch name="Red 123" hbank="0" lbank="0" prog="123" />
+ <Patch name="Red 124" hbank="0" lbank="0" prog="124" />
+ <Patch name="Red 125" hbank="0" lbank="0" prog="125" />
+ <Patch name="Red 126" hbank="0" lbank="0" prog="126" />
+ <Patch name="Red 127" hbank="0" lbank="0" prog="127" />
+ </PatchGroup>
+
+ <PatchGroup name="Green">
+ <Patch name="Green 000" hbank="1" lbank="0" prog="0" />
+ <Patch name="Green 001" hbank="1" lbank="0" prog="1" />
+ <Patch name="Green 002" hbank="1" lbank="0" prog="2" />
+ <Patch name="Green 003" hbank="1" lbank="0" prog="3" />
+ <Patch name="Green 004" hbank="1" lbank="0" prog="4" />
+ <Patch name="Green 005" hbank="1" lbank="0" prog="5" />
+ <Patch name="Green 006" hbank="1" lbank="0" prog="6" />
+ <Patch name="Green 007" hbank="1" lbank="0" prog="7" />
+ <Patch name="Green 008" hbank="1" lbank="0" prog="8" />
+ <Patch name="Green 009" hbank="1" lbank="0" prog="9" />
+ <Patch name="Green 010" hbank="1" lbank="0" prog="10" />
+ <Patch name="Green 011" hbank="1" lbank="0" prog="11" />
+ <Patch name="Green 012" hbank="1" lbank="0" prog="12" />
+ <Patch name="Green 013" hbank="1" lbank="0" prog="13" />
+ <Patch name="Green 014" hbank="1" lbank="0" prog="14" />
+ <Patch name="Green 015" hbank="1" lbank="0" prog="15" />
+ <Patch name="Green 016" hbank="1" lbank="0" prog="16" />
+ <Patch name="Green 017" hbank="1" lbank="0" prog="17" />
+ <Patch name="Green 018" hbank="1" lbank="0" prog="18" />
+ <Patch name="Green 019" hbank="1" lbank="0" prog="19" />
+ <Patch name="Green 020" hbank="1" lbank="0" prog="20" />
+ <Patch name="Green 021" hbank="1" lbank="0" prog="21" />
+ <Patch name="Green 022" hbank="1" lbank="0" prog="22" />
+ <Patch name="Green 023" hbank="1" lbank="0" prog="23" />
+ <Patch name="Green 024" hbank="1" lbank="0" prog="24" />
+ <Patch name="Green 025" hbank="1" lbank="0" prog="25" />
+ <Patch name="Green 026" hbank="1" lbank="0" prog="26" />
+ <Patch name="Green 027" hbank="1" lbank="0" prog="27" />
+ <Patch name="Green 028" hbank="1" lbank="0" prog="28" />
+ <Patch name="Green 029" hbank="1" lbank="0" prog="29" />
+ <Patch name="Green 030" hbank="1" lbank="0" prog="30" />
+ <Patch name="Green 031" hbank="1" lbank="0" prog="31" />
+ <Patch name="Green 032" hbank="1" lbank="0" prog="32" />
+ <Patch name="Green 033" hbank="1" lbank="0" prog="33" />
+ <Patch name="Green 034" hbank="1" lbank="0" prog="34" />
+ <Patch name="Green 035" hbank="1" lbank="0" prog="35" />
+ <Patch name="Green 036" hbank="1" lbank="0" prog="36" />
+ <Patch name="Green 037" hbank="1" lbank="0" prog="37" />
+ <Patch name="Green 038" hbank="1" lbank="0" prog="38" />
+ <Patch name="Green 039" hbank="1" lbank="0" prog="39" />
+ <Patch name="Green 040" hbank="1" lbank="0" prog="40" />
+ <Patch name="Green 041" hbank="1" lbank="0" prog="41" />
+ <Patch name="Green 042" hbank="1" lbank="0" prog="42" />
+ <Patch name="Green 043" hbank="1" lbank="0" prog="43" />
+ <Patch name="Green 044" hbank="1" lbank="0" prog="44" />
+ <Patch name="Green 045" hbank="1" lbank="0" prog="45" />
+ <Patch name="Green 046" hbank="1" lbank="0" prog="46" />
+ <Patch name="Green 047" hbank="1" lbank="0" prog="47" />
+ <Patch name="Green 048" hbank="1" lbank="0" prog="48" />
+ <Patch name="Green 049" hbank="1" lbank="0" prog="49" />
+ <Patch name="Green 050" hbank="1" lbank="0" prog="50" />
+ <Patch name="Green 051" hbank="1" lbank="0" prog="51" />
+ <Patch name="Green 052" hbank="1" lbank="0" prog="52" />
+ <Patch name="Green 053" hbank="1" lbank="0" prog="53" />
+ <Patch name="Green 054" hbank="1" lbank="0" prog="54" />
+ <Patch name="Green 055" hbank="1" lbank="0" prog="55" />
+ <Patch name="Green 056" hbank="1" lbank="0" prog="56" />
+ <Patch name="Green 057" hbank="1" lbank="0" prog="57" />
+ <Patch name="Green 058" hbank="1" lbank="0" prog="58" />
+ <Patch name="Green 059" hbank="1" lbank="0" prog="59" />
+ <Patch name="Green 060" hbank="1" lbank="0" prog="60" />
+ <Patch name="Green 061" hbank="1" lbank="0" prog="61" />
+ <Patch name="Green 062" hbank="1" lbank="0" prog="62" />
+ <Patch name="Green 063" hbank="1" lbank="0" prog="63" />
+ <Patch name="Green 064" hbank="1" lbank="0" prog="64" />
+ <Patch name="Green 065" hbank="1" lbank="0" prog="65" />
+ <Patch name="Green 066" hbank="1" lbank="0" prog="66" />
+ <Patch name="Green 067" hbank="1" lbank="0" prog="67" />
+ <Patch name="Green 068" hbank="1" lbank="0" prog="68" />
+ <Patch name="Green 069" hbank="1" lbank="0" prog="69" />
+ <Patch name="Green 070" hbank="1" lbank="0" prog="70" />
+ <Patch name="Green 071" hbank="1" lbank="0" prog="71" />
+ <Patch name="Green 072" hbank="1" lbank="0" prog="72" />
+ <Patch name="Green 073" hbank="1" lbank="0" prog="73" />
+ <Patch name="Green 074" hbank="1" lbank="0" prog="74" />
+ <Patch name="Green 075" hbank="1" lbank="0" prog="75" />
+ <Patch name="Green 076" hbank="1" lbank="0" prog="76" />
+ <Patch name="Green 077" hbank="1" lbank="0" prog="77" />
+ <Patch name="Green 078" hbank="1" lbank="0" prog="78" />
+ <Patch name="Green 079" hbank="1" lbank="0" prog="79" />
+ <Patch name="Green 080" hbank="1" lbank="0" prog="80" />
+ <Patch name="Green 081" hbank="1" lbank="0" prog="81" />
+ <Patch name="Green 082" hbank="1" lbank="0" prog="82" />
+ <Patch name="Green 083" hbank="1" lbank="0" prog="83" />
+ <Patch name="Green 084" hbank="1" lbank="0" prog="84" />
+ <Patch name="Green 085" hbank="1" lbank="0" prog="85" />
+ <Patch name="Green 086" hbank="1" lbank="0" prog="86" />
+ <Patch name="Green 087" hbank="1" lbank="0" prog="87" />
+ <Patch name="Green 088" hbank="1" lbank="0" prog="88" />
+ <Patch name="Green 089" hbank="1" lbank="0" prog="89" />
+ <Patch name="Green 090" hbank="1" lbank="0" prog="90" />
+ <Patch name="Green 091" hbank="1" lbank="0" prog="91" />
+ <Patch name="Green 092" hbank="1" lbank="0" prog="92" />
+ <Patch name="Green 093" hbank="1" lbank="0" prog="93" />
+ <Patch name="Green 094" hbank="1" lbank="0" prog="94" />
+ <Patch name="Green 095" hbank="1" lbank="0" prog="95" />
+ <Patch name="Green 096" hbank="1" lbank="0" prog="96" />
+ <Patch name="Green 097" hbank="1" lbank="0" prog="97" />
+ <Patch name="Green 098" hbank="1" lbank="0" prog="98" />
+ <Patch name="Green 099" hbank="1" lbank="0" prog="99" />
+ <Patch name="Green 100" hbank="1" lbank="0" prog="100" />
+ <Patch name="Green 101" hbank="1" lbank="0" prog="101" />
+ <Patch name="Green 102" hbank="1" lbank="0" prog="102" />
+ <Patch name="Green 103" hbank="1" lbank="0" prog="103" />
+ <Patch name="Green 104" hbank="1" lbank="0" prog="104" />
+ <Patch name="Green 105" hbank="1" lbank="0" prog="105" />
+ <Patch name="Green 106" hbank="1" lbank="0" prog="106" />
+ <Patch name="Green 107" hbank="1" lbank="0" prog="107" />
+ <Patch name="Green 108" hbank="1" lbank="0" prog="108" />
+ <Patch name="Green 109" hbank="1" lbank="0" prog="109" />
+ <Patch name="Green 110" hbank="1" lbank="0" prog="110" />
+ <Patch name="Green 111" hbank="1" lbank="0" prog="111" />
+ <Patch name="Green 112" hbank="1" lbank="0" prog="112" />
+ <Patch name="Green 113" hbank="1" lbank="0" prog="113" />
+ <Patch name="Green 114" hbank="1" lbank="0" prog="114" />
+ <Patch name="Green 115" hbank="1" lbank="0" prog="115" />
+ <Patch name="Green 116" hbank="1" lbank="0" prog="116" />
+ <Patch name="Green 117" hbank="1" lbank="0" prog="117" />
+ <Patch name="Green 118" hbank="1" lbank="0" prog="118" />
+ <Patch name="Green 119" hbank="1" lbank="0" prog="119" />
+ <Patch name="Green 120" hbank="1" lbank="0" prog="120" />
+ <Patch name="Green 121" hbank="1" lbank="0" prog="121" />
+ <Patch name="Green 122" hbank="1" lbank="0" prog="122" />
+ <Patch name="Green 123" hbank="1" lbank="0" prog="123" />
+ <Patch name="Green 124" hbank="1" lbank="0" prog="124" />
+ <Patch name="Green 125" hbank="1" lbank="0" prog="125" />
+ <Patch name="Green 126" hbank="1" lbank="0" prog="126" />
+ <Patch name="Green 127" hbank="1" lbank="0" prog="127" />
+ </PatchGroup>
+
+ <PatchGroup name="Blue">
+ <Patch name="Blue 000" hbank="2" lbank="0" prog="0" />
+ <Patch name="Blue 001" hbank="2" lbank="0" prog="1" />
+ <Patch name="Blue 002" hbank="2" lbank="0" prog="2" />
+ <Patch name="Blue 003" hbank="2" lbank="0" prog="3" />
+ <Patch name="Blue 004" hbank="2" lbank="0" prog="4" />
+ <Patch name="Blue 005" hbank="2" lbank="0" prog="5" />
+ <Patch name="Blue 006" hbank="2" lbank="0" prog="6" />
+ <Patch name="Blue 007" hbank="2" lbank="0" prog="7" />
+ <Patch name="Blue 008" hbank="2" lbank="0" prog="8" />
+ <Patch name="Blue 009" hbank="2" lbank="0" prog="9" />
+ <Patch name="Blue 010" hbank="2" lbank="0" prog="10" />
+ <Patch name="Blue 011" hbank="2" lbank="0" prog="11" />
+ <Patch name="Blue 012" hbank="2" lbank="0" prog="12" />
+ <Patch name="Blue 013" hbank="2" lbank="0" prog="13" />
+ <Patch name="Blue 014" hbank="2" lbank="0" prog="14" />
+ <Patch name="Blue 015" hbank="2" lbank="0" prog="15" />
+ <Patch name="Blue 016" hbank="2" lbank="0" prog="16" />
+ <Patch name="Blue 017" hbank="2" lbank="0" prog="17" />
+ <Patch name="Blue 018" hbank="2" lbank="0" prog="18" />
+ <Patch name="Blue 019" hbank="2" lbank="0" prog="19" />
+ <Patch name="Blue 020" hbank="2" lbank="0" prog="20" />
+ <Patch name="Blue 021" hbank="2" lbank="0" prog="21" />
+ <Patch name="Blue 022" hbank="2" lbank="0" prog="22" />
+ <Patch name="Blue 023" hbank="2" lbank="0" prog="23" />
+ <Patch name="Blue 024" hbank="2" lbank="0" prog="24" />
+ <Patch name="Blue 025" hbank="2" lbank="0" prog="25" />
+ <Patch name="Blue 026" hbank="2" lbank="0" prog="26" />
+ <Patch name="Blue 027" hbank="2" lbank="0" prog="27" />
+ <Patch name="Blue 028" hbank="2" lbank="0" prog="28" />
+ <Patch name="Blue 029" hbank="2" lbank="0" prog="29" />
+ <Patch name="Blue 030" hbank="2" lbank="0" prog="30" />
+ <Patch name="Blue 031" hbank="2" lbank="0" prog="31" />
+ <Patch name="Blue 032" hbank="2" lbank="0" prog="32" />
+ <Patch name="Blue 033" hbank="2" lbank="0" prog="33" />
+ <Patch name="Blue 034" hbank="2" lbank="0" prog="34" />
+ <Patch name="Blue 035" hbank="2" lbank="0" prog="35" />
+ <Patch name="Blue 036" hbank="2" lbank="0" prog="36" />
+ <Patch name="Blue 037" hbank="2" lbank="0" prog="37" />
+ <Patch name="Blue 038" hbank="2" lbank="0" prog="38" />
+ <Patch name="Blue 039" hbank="2" lbank="0" prog="39" />
+ <Patch name="Blue 040" hbank="2" lbank="0" prog="40" />
+ <Patch name="Blue 041" hbank="2" lbank="0" prog="41" />
+ <Patch name="Blue 042" hbank="2" lbank="0" prog="42" />
+ <Patch name="Blue 043" hbank="2" lbank="0" prog="43" />
+ <Patch name="Blue 044" hbank="2" lbank="0" prog="44" />
+ <Patch name="Blue 045" hbank="2" lbank="0" prog="45" />
+ <Patch name="Blue 046" hbank="2" lbank="0" prog="46" />
+ <Patch name="Blue 047" hbank="2" lbank="0" prog="47" />
+ <Patch name="Blue 048" hbank="2" lbank="0" prog="48" />
+ <Patch name="Blue 049" hbank="2" lbank="0" prog="49" />
+ <Patch name="Blue 050" hbank="2" lbank="0" prog="50" />
+ <Patch name="Blue 051" hbank="2" lbank="0" prog="51" />
+ <Patch name="Blue 052" hbank="2" lbank="0" prog="52" />
+ <Patch name="Blue 053" hbank="2" lbank="0" prog="53" />
+ <Patch name="Blue 054" hbank="2" lbank="0" prog="54" />
+ <Patch name="Blue 055" hbank="2" lbank="0" prog="55" />
+ <Patch name="Blue 056" hbank="2" lbank="0" prog="56" />
+ <Patch name="Blue 057" hbank="2" lbank="0" prog="57" />
+ <Patch name="Blue 058" hbank="2" lbank="0" prog="58" />
+ <Patch name="Blue 059" hbank="2" lbank="0" prog="59" />
+ <Patch name="Blue 060" hbank="2" lbank="0" prog="60" />
+ <Patch name="Blue 061" hbank="2" lbank="0" prog="61" />
+ <Patch name="Blue 062" hbank="2" lbank="0" prog="62" />
+ <Patch name="Blue 063" hbank="2" lbank="0" prog="63" />
+ <Patch name="Blue 064" hbank="2" lbank="0" prog="64" />
+ <Patch name="Blue 065" hbank="2" lbank="0" prog="65" />
+ <Patch name="Blue 066" hbank="2" lbank="0" prog="66" />
+ <Patch name="Blue 067" hbank="2" lbank="0" prog="67" />
+ <Patch name="Blue 068" hbank="2" lbank="0" prog="68" />
+ <Patch name="Blue 069" hbank="2" lbank="0" prog="69" />
+ <Patch name="Blue 070" hbank="2" lbank="0" prog="70" />
+ <Patch name="Blue 071" hbank="2" lbank="0" prog="71" />
+ <Patch name="Blue 072" hbank="2" lbank="0" prog="72" />
+ <Patch name="Blue 073" hbank="2" lbank="0" prog="73" />
+ <Patch name="Blue 074" hbank="2" lbank="0" prog="74" />
+ <Patch name="Blue 075" hbank="2" lbank="0" prog="75" />
+ <Patch name="Blue 076" hbank="2" lbank="0" prog="76" />
+ <Patch name="Blue 077" hbank="2" lbank="0" prog="77" />
+ <Patch name="Blue 078" hbank="2" lbank="0" prog="78" />
+ <Patch name="Blue 079" hbank="2" lbank="0" prog="79" />
+ <Patch name="Blue 080" hbank="2" lbank="0" prog="80" />
+ <Patch name="Blue 081" hbank="2" lbank="0" prog="81" />
+ <Patch name="Blue 082" hbank="2" lbank="0" prog="82" />
+ <Patch name="Blue 083" hbank="2" lbank="0" prog="83" />
+ <Patch name="Blue 084" hbank="2" lbank="0" prog="84" />
+ <Patch name="Blue 085" hbank="2" lbank="0" prog="85" />
+ <Patch name="Blue 086" hbank="2" lbank="0" prog="86" />
+ <Patch name="Blue 087" hbank="2" lbank="0" prog="87" />
+ <Patch name="Blue 088" hbank="2" lbank="0" prog="88" />
+ <Patch name="Blue 089" hbank="2" lbank="0" prog="89" />
+ <Patch name="Blue 090" hbank="2" lbank="0" prog="90" />
+ <Patch name="Blue 091" hbank="2" lbank="0" prog="91" />
+ <Patch name="Blue 092" hbank="2" lbank="0" prog="92" />
+ <Patch name="Blue 093" hbank="2" lbank="0" prog="93" />
+ <Patch name="Blue 094" hbank="2" lbank="0" prog="94" />
+ <Patch name="Blue 095" hbank="2" lbank="0" prog="95" />
+ <Patch name="Blue 096" hbank="2" lbank="0" prog="96" />
+ <Patch name="Blue 097" hbank="2" lbank="0" prog="97" />
+ <Patch name="Blue 098" hbank="2" lbank="0" prog="98" />
+ <Patch name="Blue 099" hbank="2" lbank="0" prog="99" />
+ <Patch name="Blue 100" hbank="2" lbank="0" prog="100" />
+ <Patch name="Blue 101" hbank="2" lbank="0" prog="101" />
+ <Patch name="Blue 102" hbank="2" lbank="0" prog="102" />
+ <Patch name="Blue 103" hbank="2" lbank="0" prog="103" />
+ <Patch name="Blue 104" hbank="2" lbank="0" prog="104" />
+ <Patch name="Blue 105" hbank="2" lbank="0" prog="105" />
+ <Patch name="Blue 106" hbank="2" lbank="0" prog="106" />
+ <Patch name="Blue 107" hbank="2" lbank="0" prog="107" />
+ <Patch name="Blue 108" hbank="2" lbank="0" prog="108" />
+ <Patch name="Blue 109" hbank="2" lbank="0" prog="109" />
+ <Patch name="Blue 110" hbank="2" lbank="0" prog="110" />
+ <Patch name="Blue 111" hbank="2" lbank="0" prog="111" />
+ <Patch name="Blue 112" hbank="2" lbank="0" prog="112" />
+ <Patch name="Blue 113" hbank="2" lbank="0" prog="113" />
+ <Patch name="Blue 114" hbank="2" lbank="0" prog="114" />
+ <Patch name="Blue 115" hbank="2" lbank="0" prog="115" />
+ <Patch name="Blue 116" hbank="2" lbank="0" prog="116" />
+ <Patch name="Blue 117" hbank="2" lbank="0" prog="117" />
+ <Patch name="Blue 118" hbank="2" lbank="0" prog="118" />
+ <Patch name="Blue 119" hbank="2" lbank="0" prog="119" />
+ <Patch name="Blue 120" hbank="2" lbank="0" prog="120" />
+ <Patch name="Blue 121" hbank="2" lbank="0" prog="121" />
+ <Patch name="Blue 122" hbank="2" lbank="0" prog="122" />
+ <Patch name="Blue 123" hbank="2" lbank="0" prog="123" />
+ <Patch name="Blue 124" hbank="2" lbank="0" prog="124" />
+ <Patch name="Blue 125" hbank="2" lbank="0" prog="125" />
+ <Patch name="Blue 126" hbank="2" lbank="0" prog="126" />
+ <Patch name="Blue 127" hbank="2" lbank="0" prog="127" />
+ </PatchGroup>
+
+ <PatchGroup name="User">
+ <Patch name="User 000" hbank="3" lbank="0" prog="0" />
+ <Patch name="User 001" hbank="3" lbank="0" prog="1" />
+ <Patch name="User 002" hbank="3" lbank="0" prog="2" />
+ <Patch name="User 003" hbank="3" lbank="0" prog="3" />
+ <Patch name="User 004" hbank="3" lbank="0" prog="4" />
+ <Patch name="User 005" hbank="3" lbank="0" prog="5" />
+ <Patch name="User 006" hbank="3" lbank="0" prog="6" />
+ <Patch name="User 007" hbank="3" lbank="0" prog="7" />
+ <Patch name="User 008" hbank="3" lbank="0" prog="8" />
+ <Patch name="User 009" hbank="3" lbank="0" prog="9" />
+ <Patch name="User 010" hbank="3" lbank="0" prog="10" />
+ <Patch name="User 011" hbank="3" lbank="0" prog="11" />
+ <Patch name="User 012" hbank="3" lbank="0" prog="12" />
+ <Patch name="User 013" hbank="3" lbank="0" prog="13" />
+ <Patch name="User 014" hbank="3" lbank="0" prog="14" />
+ <Patch name="User 015" hbank="3" lbank="0" prog="15" />
+ <Patch name="User 016" hbank="3" lbank="0" prog="16" />
+ <Patch name="User 017" hbank="3" lbank="0" prog="17" />
+ <Patch name="User 018" hbank="3" lbank="0" prog="18" />
+ <Patch name="User 019" hbank="3" lbank="0" prog="19" />
+ <Patch name="User 020" hbank="3" lbank="0" prog="20" />
+ <Patch name="User 021" hbank="3" lbank="0" prog="21" />
+ <Patch name="User 022" hbank="3" lbank="0" prog="22" />
+ <Patch name="User 023" hbank="3" lbank="0" prog="23" />
+ <Patch name="User 024" hbank="3" lbank="0" prog="24" />
+ <Patch name="User 025" hbank="3" lbank="0" prog="25" />
+ <Patch name="User 026" hbank="3" lbank="0" prog="26" />
+ <Patch name="User 027" hbank="3" lbank="0" prog="27" />
+ <Patch name="User 028" hbank="3" lbank="0" prog="28" />
+ <Patch name="User 029" hbank="3" lbank="0" prog="29" />
+ <Patch name="User 030" hbank="3" lbank="0" prog="30" />
+ <Patch name="User 031" hbank="3" lbank="0" prog="31" />
+ <Patch name="User 032" hbank="3" lbank="0" prog="32" />
+ <Patch name="User 033" hbank="3" lbank="0" prog="33" />
+ <Patch name="User 034" hbank="3" lbank="0" prog="34" />
+ <Patch name="User 035" hbank="3" lbank="0" prog="35" />
+ <Patch name="User 036" hbank="3" lbank="0" prog="36" />
+ <Patch name="User 037" hbank="3" lbank="0" prog="37" />
+ <Patch name="User 038" hbank="3" lbank="0" prog="38" />
+ <Patch name="User 039" hbank="3" lbank="0" prog="39" />
+ <Patch name="User 040" hbank="3" lbank="0" prog="40" />
+ <Patch name="User 041" hbank="3" lbank="0" prog="41" />
+ <Patch name="User 042" hbank="3" lbank="0" prog="42" />
+ <Patch name="User 043" hbank="3" lbank="0" prog="43" />
+ <Patch name="User 044" hbank="3" lbank="0" prog="44" />
+ <Patch name="User 045" hbank="3" lbank="0" prog="45" />
+ <Patch name="User 046" hbank="3" lbank="0" prog="46" />
+ <Patch name="User 047" hbank="3" lbank="0" prog="47" />
+ <Patch name="User 048" hbank="3" lbank="0" prog="48" />
+ <Patch name="User 049" hbank="3" lbank="0" prog="49" />
+ <Patch name="User 050" hbank="3" lbank="0" prog="50" />
+ <Patch name="User 051" hbank="3" lbank="0" prog="51" />
+ <Patch name="User 052" hbank="3" lbank="0" prog="52" />
+ <Patch name="User 053" hbank="3" lbank="0" prog="53" />
+ <Patch name="User 054" hbank="3" lbank="0" prog="54" />
+ <Patch name="User 055" hbank="3" lbank="0" prog="55" />
+ <Patch name="User 056" hbank="3" lbank="0" prog="56" />
+ <Patch name="User 057" hbank="3" lbank="0" prog="57" />
+ <Patch name="User 058" hbank="3" lbank="0" prog="58" />
+ <Patch name="User 059" hbank="3" lbank="0" prog="59" />
+ <Patch name="User 060" hbank="3" lbank="0" prog="60" />
+ <Patch name="User 061" hbank="3" lbank="0" prog="61" />
+ <Patch name="User 062" hbank="3" lbank="0" prog="62" />
+ <Patch name="User 063" hbank="3" lbank="0" prog="63" />
+ <Patch name="User 064" hbank="3" lbank="0" prog="64" />
+ <Patch name="User 065" hbank="3" lbank="0" prog="65" />
+ <Patch name="User 066" hbank="3" lbank="0" prog="66" />
+ <Patch name="User 067" hbank="3" lbank="0" prog="67" />
+ <Patch name="User 068" hbank="3" lbank="0" prog="68" />
+ <Patch name="User 069" hbank="3" lbank="0" prog="69" />
+ <Patch name="User 070" hbank="3" lbank="0" prog="70" />
+ <Patch name="User 071" hbank="3" lbank="0" prog="71" />
+ <Patch name="User 072" hbank="3" lbank="0" prog="72" />
+ <Patch name="User 073" hbank="3" lbank="0" prog="73" />
+ <Patch name="User 074" hbank="3" lbank="0" prog="74" />
+ <Patch name="User 075" hbank="3" lbank="0" prog="75" />
+ <Patch name="User 076" hbank="3" lbank="0" prog="76" />
+ <Patch name="User 077" hbank="3" lbank="0" prog="77" />
+ <Patch name="User 078" hbank="3" lbank="0" prog="78" />
+ <Patch name="User 079" hbank="3" lbank="0" prog="79" />
+ <Patch name="User 080" hbank="3" lbank="0" prog="80" />
+ <Patch name="User 081" hbank="3" lbank="0" prog="81" />
+ <Patch name="User 082" hbank="3" lbank="0" prog="82" />
+ <Patch name="User 083" hbank="3" lbank="0" prog="83" />
+ <Patch name="User 084" hbank="3" lbank="0" prog="84" />
+ <Patch name="User 085" hbank="3" lbank="0" prog="85" />
+ <Patch name="User 086" hbank="3" lbank="0" prog="86" />
+ <Patch name="User 087" hbank="3" lbank="0" prog="87" />
+ <Patch name="User 088" hbank="3" lbank="0" prog="88" />
+ <Patch name="User 089" hbank="3" lbank="0" prog="89" />
+ <Patch name="User 090" hbank="3" lbank="0" prog="90" />
+ <Patch name="User 091" hbank="3" lbank="0" prog="91" />
+ <Patch name="User 092" hbank="3" lbank="0" prog="92" />
+ <Patch name="User 093" hbank="3" lbank="0" prog="93" />
+ <Patch name="User 094" hbank="3" lbank="0" prog="94" />
+ <Patch name="User 095" hbank="3" lbank="0" prog="95" />
+ <Patch name="User 096" hbank="3" lbank="0" prog="96" />
+ <Patch name="User 097" hbank="3" lbank="0" prog="97" />
+ <Patch name="User 098" hbank="3" lbank="0" prog="98" />
+ <Patch name="User 099" hbank="3" lbank="0" prog="99" />
+ <Patch name="User 100" hbank="3" lbank="0" prog="100" />
+ <Patch name="User 101" hbank="3" lbank="0" prog="101" />
+ <Patch name="User 102" hbank="3" lbank="0" prog="102" />
+ <Patch name="User 103" hbank="3" lbank="0" prog="103" />
+ <Patch name="User 104" hbank="3" lbank="0" prog="104" />
+ <Patch name="User 105" hbank="3" lbank="0" prog="105" />
+ <Patch name="User 106" hbank="3" lbank="0" prog="106" />
+ <Patch name="User 107" hbank="3" lbank="0" prog="107" />
+ <Patch name="User 108" hbank="3" lbank="0" prog="108" />
+ <Patch name="User 109" hbank="3" lbank="0" prog="109" />
+ <Patch name="User 110" hbank="3" lbank="0" prog="110" />
+ <Patch name="User 111" hbank="3" lbank="0" prog="111" />
+ <Patch name="User 112" hbank="3" lbank="0" prog="112" />
+ <Patch name="User 113" hbank="3" lbank="0" prog="113" />
+ <Patch name="User 114" hbank="3" lbank="0" prog="114" />
+ <Patch name="User 115" hbank="3" lbank="0" prog="115" />
+ <Patch name="User 116" hbank="3" lbank="0" prog="116" />
+ <Patch name="User 117" hbank="3" lbank="0" prog="117" />
+ <Patch name="User 118" hbank="3" lbank="0" prog="118" />
+ <Patch name="User 119" hbank="3" lbank="0" prog="119" />
+ <Patch name="User 120" hbank="3" lbank="0" prog="120" />
+ <Patch name="User 121" hbank="3" lbank="0" prog="121" />
+ <Patch name="User 122" hbank="3" lbank="0" prog="122" />
+ <Patch name="User 123" hbank="3" lbank="0" prog="123" />
+ <Patch name="User 124" hbank="3" lbank="0" prog="124" />
+ <Patch name="User 125" hbank="3" lbank="0" prog="125" />
+ <Patch name="User 126" hbank="3" lbank="0" prog="126" />
+ <Patch name="User 127" hbank="3" lbank="0" prog="127" />
+ </PatchGroup>
+
+
+ <!-- Standard Controllers -->
+ <Controller name="CC 1" type="Control" l="1" />
+ <Controller name="CC 2" type="Control" l="2" />
+ <Controller name="CC 3" type="Control" l="3" />
+ <Controller name="CC 4" type="Control" l="4" />
+ <Controller name="CC 5" type="Control" l="5" />
+ <Controller name="CC 6" type="Control" l="6" />
+ <Controller name="CC 7" type="Control" l="7" />
+ <Controller name="CC 8" type="Control" l="8" />
+ <Controller name="CC 9" type="Control" l="9" />
+ <Controller name="CC 10" type="Control" l="10" />
+ <Controller name="CC 11" type="Control" l="11" />
+ <Controller name="CC 12" type="Control" l="12" />
+ <Controller name="CC 13" type="Control" l="13" />
+ <Controller name="CC 14" type="Control" l="14" />
+ <Controller name="CC 15" type="Control" l="15" />
+ <Controller name="CC 16" type="Control" l="16" />
+ <Controller name="CC 17" type="Control" l="17" />
+ <Controller name="CC 18" type="Control" l="18" />
+ <Controller name="CC 19" type="Control" l="19" />
+ <Controller name="CC 20" type="Control" l="20" />
+ <Controller name="CC 21" type="Control" l="21" />
+ <Controller name="CC 22" type="Control" l="22" />
+ <Controller name="CC 23" type="Control" l="23" />
+ <Controller name="CC 24" type="Control" l="24" />
+ <Controller name="CC 25" type="Control" l="25" />
+ <Controller name="CC 26" type="Control" l="26" />
+ <Controller name="CC 27" type="Control" l="27" />
+ <Controller name="CC 28" type="Control" l="28" />
+ <Controller name="CC 29" type="Control" l="29" />
+ <Controller name="CC 30" type="Control" l="30" />
+ <Controller name="CC 31" type="Control" l="31" />
+ <Controller name="CC 32" type="Control" l="32" />
+ <Controller name="CC 33" type="Control" l="33" />
+ <Controller name="CC 34" type="Control" l="34" />
+ <Controller name="CC 35" type="Control" l="35" />
+ <Controller name="CC 36" type="Control" l="36" />
+ <Controller name="CC 37" type="Control" l="37" />
+ <Controller name="CC 38" type="Control" l="38" />
+ <Controller name="CC 39" type="Control" l="39" />
+ <Controller name="CC 40" type="Control" l="40" />
+ <Controller name="CC 41" type="Control" l="41" />
+ <Controller name="CC 42" type="Control" l="42" />
+ <Controller name="CC 43" type="Control" l="43" />
+ <Controller name="CC 44" type="Control" l="44" />
+ <Controller name="CC 45" type="Control" l="45" />
+ <Controller name="CC 46" type="Control" l="46" />
+ <Controller name="CC 47" type="Control" l="47" />
+ <Controller name="CC 48" type="Control" l="48" />
+ <Controller name="CC 49" type="Control" l="49" />
+ <Controller name="CC 50" type="Control" l="50" />
+ <Controller name="CC 51" type="Control" l="51" />
+ <Controller name="CC 52" type="Control" l="52" />
+ <Controller name="CC 53" type="Control" l="53" />
+ <Controller name="CC 54" type="Control" l="54" />
+ <Controller name="CC 55" type="Control" l="55" />
+ <Controller name="CC 56" type="Control" l="56" />
+ <Controller name="CC 57" type="Control" l="57" />
+ <Controller name="CC 58" type="Control" l="58" />
+ <Controller name="CC 59" type="Control" l="59" />
+ <Controller name="CC 60" type="Control" l="60" />
+ <Controller name="CC 61" type="Control" l="61" />
+ <Controller name="CC 62" type="Control" l="62" />
+ <Controller name="CC 63" type="Control" l="63" />
+ <Controller name="CC 64" type="Control" l="64" />
+ <Controller name="CC 65" type="Control" l="65" />
+ <Controller name="CC 66" type="Control" l="66" />
+ <Controller name="CC 67" type="Control" l="67" />
+ <Controller name="CC 68" type="Control" l="68" />
+ <Controller name="CC 69" type="Control" l="69" />
+ <Controller name="CC 70" type="Control" l="70" />
+ <Controller name="CC 71" type="Control" l="71" />
+ <Controller name="CC 72" type="Control" l="72" />
+ <Controller name="CC 73" type="Control" l="73" />
+ <Controller name="CC 74" type="Control" l="74" />
+ <Controller name="CC 75" type="Control" l="75" />
+ <Controller name="CC 76" type="Control" l="76" />
+ <Controller name="CC 77" type="Control" l="77" />
+ <Controller name="CC 78" type="Control" l="78" />
+ <Controller name="CC 79" type="Control" l="79" />
+ <Controller name="CC 80" type="Control" l="80" />
+ <Controller name="CC 81" type="Control" l="81" />
+ <Controller name="CC 82" type="Control" l="82" />
+ <Controller name="CC 83" type="Control" l="83" />
+ <Controller name="CC 84" type="Control" l="84" />
+ <Controller name="CC 85" type="Control" l="85" />
+ <Controller name="CC 86" type="Control" l="86" />
+ <Controller name="CC 87" type="Control" l="87" />
+ <Controller name="CC 88" type="Control" l="88" />
+ <Controller name="CC 89" type="Control" l="89" />
+ <Controller name="CC 90" type="Control" l="90" />
+ <Controller name="CC 91" type="Control" l="91" />
+ <Controller name="CC 92" type="Control" l="92" />
+ <Controller name="CC 93" type="Control" l="93" />
+ <Controller name="CC 94" type="Control" l="94" />
+ <Controller name="CC 95" type="Control" l="95" />
+ <Controller name="CC 96" type="Control" l="96" />
+ <Controller name="CC 97" type="Control" l="97" />
+ <Controller name="CC 98" type="Control" l="98" />
+ <Controller name="CC 99" type="Control" l="99" />
+ <Controller name="CC 100" type="Control" l="100" />
+ <Controller name="CC 101" type="Control" l="101" />
+ <Controller name="CC 102" type="Control" l="102" />
+ <Controller name="CC 103" type="Control" l="103" />
+ <Controller name="CC 104" type="Control" l="104" />
+ <Controller name="CC 105" type="Control" l="105" />
+ <Controller name="CC 106" type="Control" l="106" />
+ <Controller name="CC 107" type="Control" l="107" />
+ <Controller name="CC 108" type="Control" l="108" />
+ <Controller name="CC 109" type="Control" l="109" />
+ <Controller name="CC 110" type="Control" l="110" />
+ <Controller name="CC 111" type="Control" l="111" />
+ <Controller name="CC 112" type="Control" l="112" />
+ <Controller name="CC 113" type="Control" l="113" />
+ <Controller name="CC 114" type="Control" l="114" />
+ <Controller name="CC 115" type="Control" l="115" />
+ <Controller name="CC 116" type="Control" l="116" />
+ <Controller name="CC 117" type="Control" l="117" />
+ <Controller name="CC 118" type="Control" l="118" />
+ <Controller name="CC 119" type="Control" l="119" />
+
+ <Controller name="Modulation MW1" type="Control" l="1" />
+
+ <!-- LFO -->
+ <Controller name="LFO1 Rate Synced" type="NRPN14" h="2" l="0" min="0" max="24" />
+ <Controller name="LFO1 Rate" type="NRPN14" h="2" l="1" min="0" max="1023" />
+ <Controller name="LFO2 Rate Synced" type="NRPN14" h="2" l="2" min="0" max="24" />
+ <Controller name="LFO2 Rate" type="NRPN14" h="2" l="3" min="0" max="1023" />
+ <Controller name="S/H Rate Synced" type="NRPN14" h="2" l="4" min="0" max="24" />
+ <Controller name="S/H Rate" type="NRPN14" h="2" l="5" min="0" max="1023" />
+
+ <!-- Tempo -->
+ <Controller name="Tempo" type="NRPN14" h="4" l="8" min="500" max="2500" />
+
+ <!-- OSC -->
+ <Controller name="OSC1 Waveform" type="NRPN14" h="6" l="12" min="0" max="2" />
+ <Controller name="OSC1 Shape" type="NRPN14" h="6" l="6" min="-100" max="100" />
+ <Controller name="OSC1 Octave" type="NRPN14" h="6" l="9" min="-3" max="3" />
+
+ <Controller name="OSC2 Waveform" type="NRPN14" h="6" l="13" min="0" max="2" />
+ <Controller name="OSC2 Shape" type="NRPN14" h="6" l="7" min="-100" max="100" />
+ <Controller name="OSC2 Pitch" type="NRPN14" h="6" l="4" min="-995" max="995" />
+ <Controller name="OSC2 Octave" type="NRPN14" h="6" l="10" min="-3" max="3" />
+
+ <Controller name="OSC3 Waveform" type="NRPN14" h="6" l="14" min="0" max="2" />
+ <Controller name="OSC3 Shape" type="NRPN14" h="6" l="8" min="-100" max="100" />
+ <Controller name="OSC3 Pitch" type="NRPN14" h="6" l="5" min="-995" max="995" />
+ <Controller name="OSC3 Octave" type="NRPN14" h="6" l="11" min="-3" max="3" />
+
+ <Controller name="FM" type="NRPN14" h="6" l="22" min="0" max="1000" />
+
+ <!-- Pre Filter Mix -->
+ <Controller name="OSC1 Level" type="NRPN14" h="8" l="0" min="0" max="100" />
+ <Controller name="OSC2 Level" type="NRPN14" h="8" l="1" min="0" max="100" />
+ <Controller name="OSC3 Level" type="NRPN14" h="8" l="2" min="0" max="100" />
+ <Controller name="Noise Level" type="NRPN14" h="8" l="5" min="0" max="100" />
+ <Controller name="External Level" type="NRPN14" h="8" l="4" min="0" max="100" />
+ <Controller name="RingMod Level" type="NRPN14" h="8" l="3" min="0" max="100" />
+
+ <!-- Filter -->
+ <Controller name="Filter1 Freq" type="NRPN14" h="14" l="0" min="0" max="1023" />
+ <Controller name="Filter1 Res" type="NRPN14" h="14" l="6" min="0" max="100" />
+ <Controller name="Filter1 Env Amt" type="NRPN14" h="14" l="8" min="-100" max="100" />
+
+ <Controller name="Filter2 Freq" type="NRPN14" h="14" l="1" min="0" max="1023" />
+ <Controller name="Filter2 Freq Octave (Offset)" type="NRPN14" h="14" l="2" min="0" max="1023" />
+ <Controller name="Filter2 Res" type="NRPN14" h="14" l="7" min="0" max="100" />
+ <Controller name="Filter2 Env Amt" type="NRPN14" h="14" l="9" min="-100" max="100" />
+
+ <!-- Post Filter Mix -->
+ <Controller name="Filter1 Level" type="NRPN14" h="16" l="0" min="0" max="100" />
+ <Controller name="Filter2 Level" type="NRPN14" h="16" l="1" min="0" max="100" />
+ <Controller name="Prefilter Level" type="NRPN14" h="16" l="2" min="0" max="100" />
+
+ <!-- Env -->
+ <Controller name="Amp Attack" type="NRPN14" h="12" l="0" min="0" max="255" />
+ <Controller name="Amp Decay" type="NRPN14" h="12" l="3" min="0" max="255" />
+ <Controller name="Amp Sust Level" type="NRPN14" h="12" l="6" min="0" max="100" />
+ <Controller name="Amp Sust Time" type="NRPN14" h="12" l="9" min="0" max="256" />
+ <Controller name="Amp Release" type="NRPN14" h="12" l="12" min="0" max="256" />
+
+ <Controller name="Filter Attack" type="NRPN14" h="12" l="1" min="0" max="255" />
+ <Controller name="Filter Decay" type="NRPN14" h="12" l="4" min="0" max="255" />
+ <Controller name="Filter Sust Level" type="NRPN14" h="12" l="7" min="-100" max="100" />
+ <Controller name="Filter Sust Time" type="NRPN14" h="12" l="10" min="0" max="256" />
+ <Controller name="Filter Release" type="NRPN14" h="12" l="13" min="0" max="256" />
+
+ <Controller name="Pitch/Mod Attack" type="NRPN14" h="12" l="2" min="0" max="255" />
+ <Controller name="Pitch/Mod Decay" type="NRPN14" h="12" l="5" min="0" max="255" />
+ <Controller name="Pitch/Mod Sust Level" type="NRPN14" h="12" l="8" min="-100" max="100" />
+ <Controller name="Pitch/Mod Sust Time" type="NRPN14" h="12" l="11" min="0" max="256" />
+ <Controller name="Pitch/Mod Release" type="NRPN14" h="12" l="14" min="0" max="256" />
+
+ <!-- Output -->
+ <Controller name="Drive Level" type="NRPN14" h="18" l="0" min="0" max="100" />
+ <Controller name="Effects Dry/Wet Mix" type="NRPN14" h="20" l="2" min="-100" max="100" />
+ <Controller name="Program Level" type="NRPN14" h="18" l="1" min="0" max="100" />
+
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/Alesis-QS-78R.idf b/muse/share/instruments/Alesis-QS-78R.idf
new file mode 100644
index 00000000..bfc474fb
--- /dev/null
+++ b/muse/share/instruments/Alesis-QS-78R.idf
@@ -0,0 +1,700 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Alesis QS7, QS8 &amp; QSR">
+ <PatchGroup name="General Midi">
+ <Patch name="Acoustic Grand Piano" prog="0" hbank="4" lbank="32"/>
+ <Patch name="Bright Acoustic Piano" prog="1" hbank="4" lbank="32"/>
+ <Patch name="Electric Grand Piano" prog="2" hbank="4" lbank="32"/>
+ <Patch name="Honky-tonk Piano" prog="3" hbank="4" lbank="32"/>
+ <Patch name="Electric Piano 1" prog="4" hbank="4" lbank="32"/>
+ <Patch name="Electric Piano 2" prog="5" hbank="4" lbank="32"/>
+ <Patch name="Harpsichord" prog="6" hbank="4" lbank="32"/>
+ <Patch name="Clavi" prog="7" hbank="4" lbank="32"/>
+ <Patch name="Celesta" prog="8" hbank="4" lbank="32"/>
+ <Patch name="Glockenspiel" prog="9" hbank="4" lbank="32"/>
+ <Patch name="Music Box" prog="10" hbank="4" lbank="32"/>
+ <Patch name="Vibraphone" prog="11" hbank="4" lbank="32"/>
+ <Patch name="Marimba" prog="12" hbank="4" lbank="32"/>
+ <Patch name="Xylophone" prog="13" hbank="4" lbank="32"/>
+ <Patch name="Tubular Bells" prog="14" hbank="4" lbank="32"/>
+ <Patch name="Dulcimer" prog="15" hbank="4" lbank="32"/>
+ <Patch name="Drawbar Organ" prog="16" hbank="4" lbank="32"/>
+ <Patch name="Percussive Organ" prog="17" hbank="4" lbank="32"/>
+ <Patch name="Rock Organ" prog="18" hbank="4" lbank="32"/>
+ <Patch name="Church Organ" prog="19" hbank="4" lbank="32"/>
+ <Patch name="Reed Organ" prog="20" hbank="4" lbank="32"/>
+ <Patch name="Accordion" prog="21" hbank="4" lbank="32"/>
+ <Patch name="Harmonica" prog="22" hbank="4" lbank="32"/>
+ <Patch name="Tango Accordion" prog="23" hbank="4" lbank="32"/>
+ <Patch name="Acoustic Guitar (nylon)" prog="24" hbank="4" lbank="32"/>
+ <Patch name="Acoustic Guitar (steel)" prog="25" hbank="4" lbank="32"/>
+ <Patch name="Electric Guitar (jazz)" prog="26" hbank="4" lbank="32"/>
+ <Patch name="Electric Guitar (clean)" prog="27" hbank="4" lbank="32"/>
+ <Patch name="Electric Guitar (muted)" prog="28" hbank="4" lbank="32"/>
+ <Patch name="Overdriven Guitar" prog="29" hbank="4" lbank="32"/>
+ <Patch name="Distortion Guitar" prog="30" hbank="4" lbank="32"/>
+ <Patch name="Guitar harmonics" prog="31" hbank="4" lbank="32"/>
+ <Patch name="Acoustic Bass" prog="32" hbank="4" lbank="32"/>
+ <Patch name="Fingered Bass" prog="33" hbank="4" lbank="32"/>
+ <Patch name="Picked Bass" prog="34" hbank="4" lbank="32"/>
+ <Patch name="Fretless Bass" prog="35" hbank="4" lbank="32"/>
+ <Patch name="Slap Bass 1" prog="36" hbank="4" lbank="32"/>
+ <Patch name="Slap Bass 2" prog="37" hbank="4" lbank="32"/>
+ <Patch name="Synth Bass 1" prog="38" hbank="4" lbank="32"/>
+ <Patch name="Synth Bass 2" prog="39" hbank="4" lbank="32"/>
+ <Patch name="Violin" prog="40" hbank="4" lbank="32"/>
+ <Patch name="Viola" prog="41" hbank="4" lbank="32"/>
+ <Patch name="Cello" prog="42" hbank="4" lbank="32"/>
+ <Patch name="Contrabass" prog="43" hbank="4" lbank="32"/>
+ <Patch name="Tremolo Strings" prog="44" hbank="4" lbank="32"/>
+ <Patch name="Pizzicato Strings" prog="45" hbank="4" lbank="32"/>
+ <Patch name="Orchestral Harp" prog="46" hbank="4" lbank="32"/>
+ <Patch name="Timpani" prog="47" hbank="4" lbank="32"/>
+ <Patch name="String Ensemble 1" prog="48" hbank="4" lbank="32"/>
+ <Patch name="String Ensemble 2" prog="49" hbank="4" lbank="32"/>
+ <Patch name="SynthStrings 1" prog="50" hbank="4" lbank="32"/>
+ <Patch name="SynthStrings 2" prog="51" hbank="4" lbank="32"/>
+ <Patch name="Choir Aahs" prog="52" hbank="4" lbank="32"/>
+ <Patch name="Voice Oohs" prog="53" hbank="4" lbank="32"/>
+ <Patch name="Synth Voice" prog="54" hbank="4" lbank="32"/>
+ <Patch name="Orchestra Hit" prog="55" hbank="4" lbank="32"/>
+ <Patch name="Trumpet" prog="56" hbank="4" lbank="32"/>
+ <Patch name="Trombone" prog="57" hbank="4" lbank="32"/>
+ <Patch name="Tuba" prog="58" hbank="4" lbank="32"/>
+ <Patch name="Muted Trumpet" prog="59" hbank="4" lbank="32"/>
+ <Patch name="French Horn" prog="60" hbank="4" lbank="32"/>
+ <Patch name="Brass Section" prog="61" hbank="4" lbank="32"/>
+ <Patch name="SynthBrass 1" prog="62" hbank="4" lbank="32"/>
+ <Patch name="SynthBrass 2" prog="63" hbank="4" lbank="32"/>
+ <Patch name="Soprano Sax" prog="64" hbank="4" lbank="32"/>
+ <Patch name="Alto Sax" prog="65" hbank="4" lbank="32"/>
+ <Patch name="Tenor Sax" prog="66" hbank="4" lbank="32"/>
+ <Patch name="Baritone Sax" prog="67" hbank="4" lbank="32"/>
+ <Patch name="Oboe" prog="68" hbank="4" lbank="32"/>
+ <Patch name="English Horn" prog="69" hbank="4" lbank="32"/>
+ <Patch name="Bassoon" prog="70" hbank="4" lbank="32"/>
+ <Patch name="Clarinet" prog="71" hbank="4" lbank="32"/>
+ <Patch name="Piccolo" prog="72" hbank="4" lbank="32"/>
+ <Patch name="Flute" prog="73" hbank="4" lbank="32"/>
+ <Patch name="Recorder" prog="74" hbank="4" lbank="32"/>
+ <Patch name="Pan Flute" prog="75" hbank="4" lbank="32"/>
+ <Patch name="Blown Bottle" prog="76" hbank="4" lbank="32"/>
+ <Patch name="Shakuhachi" prog="77" hbank="4" lbank="32"/>
+ <Patch name="Whistle" prog="78" hbank="4" lbank="32"/>
+ <Patch name="Ocarina" prog="79" hbank="4" lbank="32"/>
+ <Patch name="Lead 1 (square)" prog="80" hbank="4" lbank="32"/>
+ <Patch name="Lead 2 (sawtooth)" prog="81" hbank="4" lbank="32"/>
+ <Patch name="Lead 3 (calliope)" prog="82" hbank="4" lbank="32"/>
+ <Patch name="Lead 4 (chiff)" prog="83" hbank="4" lbank="32"/>
+ <Patch name="Lead 5 (charang)" prog="84" hbank="4" lbank="32"/>
+ <Patch name="Lead 6 (voice)" prog="85" hbank="4" lbank="32"/>
+ <Patch name="Lead 7 (fifths)" prog="86" hbank="4" lbank="32"/>
+ <Patch name="Lead 8 (bass + lead)" prog="87" hbank="4" lbank="32"/>
+ <Patch name="Pad 1 (new age)" prog="88" hbank="4" lbank="32"/>
+ <Patch name="Pad 2 (warm)" prog="89" hbank="4" lbank="32"/>
+ <Patch name="Pad 3 (polysynth)" prog="90" hbank="4" lbank="32"/>
+ <Patch name="Pad 4 (choir)" prog="91" hbank="4" lbank="32"/>
+ <Patch name="Pad 5 (bowed)" prog="92" hbank="4" lbank="32"/>
+ <Patch name="Pad 6 (metallic)" prog="93" hbank="4" lbank="32"/>
+ <Patch name="Pad 7 (halo)" prog="94" hbank="4" lbank="32"/>
+ <Patch name="Pad 8 (sweep)" prog="95" hbank="4" lbank="32"/>
+ <Patch name="FX 1 (rain)" prog="96" hbank="4" lbank="32"/>
+ <Patch name="FX 2 (soundtrack)" prog="97" hbank="4" lbank="32"/>
+ <Patch name="FX 3 (crystal)" prog="98" hbank="4" lbank="32"/>
+ <Patch name="FX 4 (atmosphere)" prog="99" hbank="4" lbank="32"/>
+ <Patch name="FX 5 (brightness)" prog="100" hbank="4" lbank="32"/>
+ <Patch name="FX 6 (goblins)" prog="101" hbank="4" lbank="32"/>
+ <Patch name="FX 7 (echoes)" prog="102" hbank="4" lbank="32"/>
+ <Patch name="FX 8 (sci-fi)" prog="103" hbank="4" lbank="32"/>
+ <Patch name="Sitar" prog="104" hbank="4" lbank="32"/>
+ <Patch name="Banjo" prog="105" hbank="4" lbank="32"/>
+ <Patch name="Shamisen" prog="106" hbank="4" lbank="32"/>
+ <Patch name="Koto" prog="107" hbank="4" lbank="32"/>
+ <Patch name="Kalimba" prog="108" hbank="4" lbank="32"/>
+ <Patch name="Bag pipe" prog="109" hbank="4" lbank="32"/>
+ <Patch name="Fiddle" prog="110" hbank="4" lbank="32"/>
+ <Patch name="Shanai" prog="111" hbank="4" lbank="32"/>
+ <Patch name="Tinkle Bell" prog="112" hbank="4" lbank="32"/>
+ <Patch name="Agogo" prog="113" hbank="4" lbank="32"/>
+ <Patch name="Steel Drums" prog="114" hbank="4" lbank="32"/>
+ <Patch name="Woodblock" prog="115" hbank="4" lbank="32"/>
+ <Patch name="Taiko Drum" prog="116" hbank="4" lbank="32"/>
+ <Patch name="Melodic Tom" prog="117" hbank="4" lbank="32"/>
+ <Patch name="Synth Drum" prog="118" hbank="4" lbank="32"/>
+ <Patch name="Reverse Cymbal" prog="119" hbank="4" lbank="32"/>
+ <Patch name="Guitar Fret Noise" prog="120" hbank="4" lbank="32"/>
+ <Patch name="Breath Noise" prog="121" hbank="4" lbank="32"/>
+ <Patch name="Seashore" prog="122" hbank="4" lbank="32"/>
+ <Patch name="Bird Tweet" prog="123" hbank="4" lbank="32"/>
+ <Patch name="Telephone Ring" prog="124" hbank="4" lbank="32"/>
+ <Patch name="Helicopter" prog="125" hbank="4" lbank="32"/>
+ <Patch name="Applause" prog="126" hbank="4" lbank="32"/>
+ <Patch name="Gunshot" prog="127" hbank="4" lbank="32"/>
+ </PatchGroup>
+
+
+
+
+ <PatchGroup name="Pianos">
+ <Patch name="True Stereo" prog="0" hbank="1" lbank="32"/>
+ <Patch name="DarkClascl" prog="0" hbank="2" lbank="32"/>
+ <Patch name="64 Grand" prog="0" hbank="3" lbank="32"/>
+ <Patch name="PureStereo" prog="0" hbank="0" lbank="32"/>
+ <Patch name="Titanium88" prog="1" hbank="1" lbank="32"/>
+ <Patch name="InThePiano" prog="1" hbank="2" lbank="32"/>
+ <Patch name="HyperPiano" prog="1" hbank="3" lbank="32"/>
+ <Patch name="Rave Knave" prog="1" hbank="0" lbank="32"/>
+ <Patch name="OctavPiano" prog="2" hbank="1" lbank="32"/>
+ <Patch name="Player Pno" prog="2" hbank="2" lbank="32"/>
+ <Patch name="HousePiano" prog="2" hbank="3" lbank="32"/>
+ <Patch name="AntiquePno" prog="2" hbank="0" lbank="32"/>
+ <Patch name="PianoMorph" prog="3" hbank="1" lbank="32"/>
+ <Patch name="PianoStrng" prog="3" hbank="2" lbank="32"/>
+ <Patch name="Piano Pad" prog="3" hbank="3" lbank="32"/>
+ <Patch name="Pianooohs" prog="3" hbank="0" lbank="32"/>
+ <Patch name="BellPianah" prog="4" hbank="1" lbank="32"/>
+ <Patch name="EP &amp; String" prog="4" hbank="2" lbank="32"/>
+ <Patch name="EP &amp; Oohs" prog="4" hbank="3" lbank="32"/>
+ <Patch name="LA Studio" prog="4" hbank="0" lbank="32"/>
+ <Patch name="Rayz Roadz" prog="5" hbank="1" lbank="32"/>
+ <Patch name="Hard Roads" prog="5" hbank="2" lbank="32"/>
+ <Patch name="SuperRoadz" prog="5" hbank="3" lbank="32"/>
+ <Patch name="No Quarter" prog="5" hbank="0" lbank="32"/>
+ <Patch name="QS Tines" prog="6" hbank="1" lbank="32"/>
+ <Patch name="Suitcase" prog="6" hbank="2" lbank="32"/>
+ <Patch name="SoftSuitcs" prog="6" hbank="3" lbank="32"/>
+ <Patch name="Fat Roadz" prog="6" hbank="0" lbank="32"/>
+ <Patch name="ClascWurly" prog="7" hbank="1" lbank="32"/>
+ <Patch name="DirtyWurly" prog="7" hbank="2" lbank="32"/>
+ <Patch name="TrampWurly" prog="7" hbank="3" lbank="32"/>
+ <Patch name="Whirl Lee" prog="7" hbank="0" lbank="32"/>
+ <Patch name="FM E Piano" prog="8" hbank="1" lbank="32"/>
+ <Patch name="Soft FM EP" prog="8" hbank="2" lbank="32"/>
+ <Patch name="Crysalis" prog="8" hbank="3" lbank="32"/>
+ <Patch name="Mars E Pno" prog="8" hbank="0" lbank="32"/>
+ <Patch name="Wave Piano" prog="9" hbank="1" lbank="32"/>
+ <Patch name="Toy Grand" prog="9" hbank="2" lbank="32"/>
+ <Patch name="PnoStrVox" prog="9" hbank="3" lbank="32"/>
+ <Patch name="TineString" prog="9" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Chromatic">
+ <Patch name="Clavitube" prog="10" hbank="1" lbank="32"/>
+ <Patch name="Quack Clav" prog="10" hbank="2" lbank="32"/>
+ <Patch name="LiquidClav" prog="10" hbank="3" lbank="32"/>
+ <Patch name="Clavislap" prog="10" hbank="0" lbank="32"/>
+ <Patch name="Real Clav" prog="11" hbank="1" lbank="32"/>
+ <Patch name="Clavatar" prog="11" hbank="2" lbank="32"/>
+ <Patch name="ProfitClav" prog="11" hbank="3" lbank="32"/>
+ <Patch name="Digi Clav" prog="11" hbank="0" lbank="32"/>
+ <Patch name="TrueHarpsi" prog="12" hbank="1" lbank="32"/>
+ <Patch name="Harpsifunk" prog="12" hbank="2" lbank="32"/>
+ <Patch name="8'4'Harpsi" prog="12" hbank="3" lbank="32"/>
+ <Patch name="Ana Harpsi" prog="12" hbank="0" lbank="32"/>
+ <Patch name="Cool Vibes" prog="13" hbank="1" lbank="32"/>
+ <Patch name="Mad Vibes" prog="13" hbank="2" lbank="32"/>
+ <Patch name="Rezophone" prog="13" hbank="3" lbank="32"/>
+ <Patch name="Toy Hammer" prog="13" hbank="0" lbank="32"/>
+ <Patch name="BriteMarim" prog="14" hbank="1" lbank="32"/>
+ <Patch name="Woody Xylo" prog="14" hbank="2" lbank="32"/>
+ <Patch name="Yanklungs" prog="14" hbank="3" lbank="32"/>
+ <Patch name="Chasers" prog="14" hbank="0" lbank="32"/>
+ <Patch name="Kalimba MW" prog="15" hbank="1" lbank="32"/>
+ <Patch name="Potsticker" prog="15" hbank="2" lbank="32"/>
+ <Patch name="Roundup" prog="15" hbank="3" lbank="32"/>
+ <Patch name="Sebastian" prog="15" hbank="0" lbank="32"/>
+ <Patch name="Brake Drum" prog="16" hbank="1" lbank="32"/>
+ <Patch name="Watercan" prog="16" hbank="2" lbank="32"/>
+ <Patch name="AlloyGlock" prog="16" hbank="3" lbank="32"/>
+ <Patch name="Met Talls" prog="16" hbank="0" lbank="32"/>
+ <Patch name="St. Thomas" prog="17" hbank="1" lbank="32"/>
+ <Patch name="AttakOfice" prog="17" hbank="2" lbank="32"/>
+ <Patch name="FairyBellz" prog="17" hbank="3" lbank="32"/>
+ <Patch name="GlassBells" prog="17" hbank="0" lbank="32"/>
+ <Patch name="Basic Bell" prog="18" hbank="1" lbank="32"/>
+ <Patch name="BlkBoxBell" prog="18" hbank="2" lbank="32"/>
+ <Patch name="Ice Bell" prog="18" hbank="3" lbank="32"/>
+ <Patch name="MorphBells" prog="18" hbank="0" lbank="32"/>
+ <Patch name="ClockTower" prog="19" hbank="1" lbank="32"/>
+ <Patch name="Tacko Bell" prog="19" hbank="2" lbank="32"/>
+ <Patch name="Waterphone" prog="19" hbank="3" lbank="32"/>
+ <Patch name="MW RvrsBel" prog="19" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Organ">
+ <Patch name="Real Prc B" prog="20" hbank="1" lbank="32"/>
+ <Patch name="AmericaOrg" prog="20" hbank="2" lbank="32"/>
+ <Patch name="3Draw Rock" prog="20" hbank="3" lbank="32"/>
+ <Patch name="4Draw Rock" prog="20" hbank="0" lbank="32"/>
+ <Patch name="High Life" prog="21" hbank="1" lbank="32"/>
+ <Patch name="BluesOrgan" prog="21" hbank="2" lbank="32"/>
+ <Patch name="KeyClikOrg" prog="21" hbank="3" lbank="32"/>
+ <Patch name="DrawbarCtl" prog="21" hbank="0" lbank="32"/>
+ <Patch name="Grit Organ" prog="22" hbank="1" lbank="32"/>
+ <Patch name="Purple B" prog="22" hbank="2" lbank="32"/>
+ <Patch name="Rockin' B3" prog="22" hbank="3" lbank="32"/>
+ <Patch name="Keith's C3" prog="22" hbank="0" lbank="32"/>
+ <Patch name="ABCDrawbar" prog="23" hbank="1" lbank="32"/>
+ <Patch name="Jazz Prc B" prog="23" hbank="2" lbank="32"/>
+ <Patch name="GospelOrgn" prog="23" hbank="3" lbank="32"/>
+ <Patch name="Ballad B" prog="23" hbank="0" lbank="32"/>
+ <Patch name="WhitrShade" prog="24" hbank="1" lbank="32"/>
+ <Patch name="Survival" prog="24" hbank="2" lbank="32"/>
+ <Patch name="MetalOrgan" prog="24" hbank="3" lbank="32"/>
+ <Patch name="LFO Lezly" prog="24" hbank="0" lbank="32"/>
+ <Patch name="Toccata&amp;Fg" prog="25" hbank="1" lbank="32"/>
+ <Patch name="High Mass" prog="25" hbank="2" lbank="32"/>
+ <Patch name="Full Ranks" prog="25" hbank="3" lbank="32"/>
+ <Patch name="PhantomOrg" prog="25" hbank="0" lbank="32"/>
+ <Patch name="KingsCourt" prog="26" hbank="1" lbank="32"/>
+ <Patch name="SftPipeOrg" prog="26" hbank="2" lbank="32"/>
+ <Patch name="Communion" prog="26" hbank="3" lbank="32"/>
+ <Patch name="PositivPuff" prog="26" hbank="0" lbank="32"/>
+ <Patch name="3rdHarmPerc" prog="27" hbank="1" lbank="32"/>
+ <Patch name="2 Drawbars" prog="27" hbank="2" lbank="32"/>
+ <Patch name="KiknPedals" prog="27" hbank="3" lbank="32"/>
+ <Patch name="Eng Organ" prog="27" hbank="0" lbank="32"/>
+ <Patch name="FrAccrdion" prog="28" hbank="1" lbank="32"/>
+ <Patch name="WrmAcrdion" prog="28" hbank="2" lbank="32"/>
+ <Patch name="Surf Organ" prog="28" hbank="3" lbank="32"/>
+ <Patch name="Gypsies" prog="28" hbank="0" lbank="32"/>
+ <Patch name="WhammerJmr" prog="29" hbank="1" lbank="32"/>
+ <Patch name="JazzHrmnca" prog="29" hbank="2" lbank="32"/>
+ <Patch name="Synthonica" prog="29" hbank="3" lbank="32"/>
+ <Patch name="JamHarmnca" prog="29" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Guitar">
+ <Patch name="Steel Ride" prog="30" hbank="1" lbank="32"/>
+ <Patch name="LegatoAGtr" prog="30" hbank="2" lbank="32"/>
+ <Patch name="SteelHorse" prog="30" hbank="3" lbank="32"/>
+ <Patch name="Quiet Time" prog="30" hbank="0" lbank="32"/>
+ <Patch name="GuildedAge" prog="31" hbank="1" lbank="32"/>
+ <Patch name="Big Body12" prog="31" hbank="2" lbank="32"/>
+ <Patch name="TuesdayAft" prog="31" hbank="3" lbank="32"/>
+ <Patch name="FolkBarGtr" prog="31" hbank="0" lbank="32"/>
+ <Patch name="Gitarala" prog="32" hbank="1" lbank="32"/>
+ <Patch name="GuitarsOoh" prog="32" hbank="2" lbank="32"/>
+ <Patch name="Dulcioto" prog="32" hbank="3" lbank="32"/>
+ <Patch name="GuitarPoem" prog="32" hbank="0" lbank="32"/>
+ <Patch name="ThickNylon" prog="33" hbank="1" lbank="32"/>
+ <Patch name="AcHarmonic" prog="33" hbank="2" lbank="32"/>
+ <Patch name="ElHarmonic" prog="33" hbank="3" lbank="32"/>
+ <Patch name="SteelNylon" prog="33" hbank="0" lbank="32"/>
+ <Patch name="Fat Strat" prog="34" hbank="1" lbank="32"/>
+ <Patch name="818 Guitar" prog="34" hbank="2" lbank="32"/>
+ <Patch name="PassGuitar" prog="34" hbank="3" lbank="32"/>
+ <Patch name="InstntEdge" prog="34" hbank="0" lbank="32"/>
+ <Patch name="TreMellow" prog="35" hbank="1" lbank="32"/>
+ <Patch name="Silvertone" prog="35" hbank="2" lbank="32"/>
+ <Patch name="PedalSteel" prog="35" hbank="3" lbank="32"/>
+ <Patch name="PulpGuuitar" prog="35" hbank="0" lbank="32"/>
+ <Patch name="Total Chug" prog="36" hbank="1" lbank="32"/>
+ <Patch name="Chunky" prog="36" hbank="2" lbank="32"/>
+ <Patch name="Hyperdrivr" prog="36" hbank="3" lbank="32"/>
+ <Patch name="Hard 5ths" prog="36" hbank="0" lbank="32"/>
+ <Patch name="FacePlantr" prog="37" hbank="1" lbank="32"/>
+ <Patch name="Fuzzhead" prog="37" hbank="2" lbank="32"/>
+ <Patch name="HeroHarmnx" prog="37" hbank="3" lbank="32"/>
+ <Patch name="Feedbacker" prog="37" hbank="0" lbank="32"/>
+ <Patch name="WorldSitar" prog="38" hbank="1" lbank="32"/>
+ <Patch name="CaralLezli" prog="38" hbank="2" lbank="32"/>
+ <Patch name="Dulcimer" prog="38" hbank="3" lbank="32"/>
+ <Patch name="Ethnoba" prog="38" hbank="0" lbank="32"/>
+ <Patch name="Koto Pluck" prog="39" hbank="1" lbank="32"/>
+ <Patch name="Spamisen" prog="39" hbank="2" lbank="32"/>
+ <Patch name="Mando Trem" prog="39" hbank="3" lbank="32"/>
+ <Patch name="kotobaba" prog="39" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+ <PatchGroup name="Bass">
+ <Patch name="BigUpright" prog="40" hbank="1" lbank="32"/>
+ <Patch name="FatUpright" prog="40" hbank="2" lbank="32"/>
+ <Patch name="SharpStick" prog="40" hbank="3" lbank="32"/>
+ <Patch name="Dance X" prog="40" hbank="0" lbank="32"/>
+ <Patch name="QS Bass" prog="41" hbank="1" lbank="32"/>
+ <Patch name="Face Bass" prog="41" hbank="2" lbank="32"/>
+ <Patch name="Deep Bass" prog="41" hbank="3" lbank="32"/>
+ <Patch name="PsychoBass" prog="41" hbank="0" lbank="32"/>
+ <Patch name="007 Bass" prog="42" hbank="1" lbank="32"/>
+ <Patch name="Heavy Bass" prog="42" hbank="2" lbank="32"/>
+ <Patch name="Roundwound" prog="42" hbank="3" lbank="32"/>
+ <Patch name="Space Bass" prog="42" hbank="0" lbank="32"/>
+ <Patch name="Slap It!" prog="43" hbank="1" lbank="32"/>
+ <Patch name="GothamBass" prog="43" hbank="2" lbank="32"/>
+ <Patch name="Pop'n Bass" prog="43" hbank="3" lbank="32"/>
+ <Patch name="House Bass" prog="43" hbank="0" lbank="32"/>
+ <Patch name="VolumeKnob" prog="44" hbank="1" lbank="32"/>
+ <Patch name="No Frets!" prog="44" hbank="2" lbank="32"/>
+ <Patch name="Octaver" prog="44" hbank="3" lbank="32"/>
+ <Patch name="Jazzy Bass" prog="44" hbank="0" lbank="32"/>
+ <Patch name="Fat Mini" prog="45" hbank="1" lbank="32"/>
+ <Patch name="FM Pluxx" prog="45" hbank="2" lbank="32"/>
+ <Patch name="FunkSnapBs" prog="45" hbank="3" lbank="32"/>
+ <Patch name="Lately Bass" prog="45" hbank="0" lbank="32"/>
+ <Patch name="Filter Wow" prog="46" hbank="1" lbank="32"/>
+ <Patch name="Touch Bass" prog="46" hbank="2" lbank="32"/>
+ <Patch name="Funky Acid" prog="46" hbank="3" lbank="32"/>
+ <Patch name="SynAtkBass" prog="46" hbank="0" lbank="32"/>
+ <Patch name="IndustryRez" prog="47" hbank="1" lbank="32"/>
+ <Patch name="Buzzz Base" prog="47" hbank="2" lbank="32"/>
+ <Patch name="MellowBass" prog="47" hbank="3" lbank="32"/>
+ <Patch name="Quack" prog="47" hbank="0" lbank="32"/>
+ <Patch name="DeutschBas" prog="48" hbank="1" lbank="32"/>
+ <Patch name="TranceBass" prog="48" hbank="2" lbank="32"/>
+ <Patch name="ArndsHouse" prog="48" hbank="3" lbank="32"/>
+ <Patch name="Trick Bass" prog="48" hbank="0" lbank="32"/>
+ <Patch name="CyberBass" prog="49" hbank="1" lbank="32"/>
+ <Patch name="Dist Bass" prog="49" hbank="2" lbank="32"/>
+ <Patch name="BassHarmnc" prog="49" hbank="3" lbank="32"/>
+ <Patch name="DanceGlide" prog="49" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Strings">
+ <Patch name="Violinist" prog="50" hbank="1" lbank="32"/>
+ <Patch name="MI Viola" prog="50" hbank="2" lbank="32"/>
+ <Patch name="Solo Cello" prog="50" hbank="3" lbank="32"/>
+ <Patch name="ContraBass" prog="50" hbank="0" lbank="32"/>
+ <Patch name="MedSection" prog="51" hbank="1" lbank="32"/>
+ <Patch name="SmlSection" prog="51" hbank="2" lbank="32"/>
+ <Patch name="Solodious" prog="51" hbank="3" lbank="32"/>
+ <Patch name="DSP Violin" prog="51" hbank="0" lbank="32"/>
+ <Patch name="StringVox" prog="52" hbank="1" lbank="32"/>
+ <Patch name="LushStrngs" prog="52" hbank="2" lbank="32"/>
+ <Patch name="RichString" prog="52" hbank="3" lbank="32"/>
+ <Patch name="DiamondStr" prog="52" hbank="0" lbank="32"/>
+ <Patch name="LA Phil" prog="53" hbank="1" lbank="32"/>
+ <Patch name="Violin Orc" prog="53" hbank="2" lbank="32"/>
+ <Patch name="Film Score" prog="53" hbank="3" lbank="32"/>
+ <Patch name="SynthEnsmb" prog="53" hbank="0" lbank="32"/>
+ <Patch name="Arco Ens" prog="54" hbank="1" lbank="32"/>
+ <Patch name="OctaString" prog="54" hbank="2" lbank="32"/>
+ <Patch name="HugeString" prog="54" hbank="3" lbank="32"/>
+ <Patch name="Syn Arcos" prog="54" hbank="0" lbank="32"/>
+ <Patch name="Bali Hai" prog="55" hbank="1" lbank="32"/>
+ <Patch name="Pit String" prog="55" hbank="2" lbank="32"/>
+ <Patch name="Strng&amp;Perc" prog="55" hbank="3" lbank="32"/>
+ <Patch name="StarDustMW" prog="55" hbank="0" lbank="32"/>
+ <Patch name="Obersphere" prog="56" hbank="1" lbank="32"/>
+ <Patch name="Tron Mood" prog="56" hbank="2" lbank="32"/>
+ <Patch name="True Tron" prog="56" hbank="3" lbank="32"/>
+ <Patch name="DreamStrgs" prog="56" hbank="0" lbank="32"/>
+ <Patch name="J Strings" prog="57" hbank="1" lbank="32"/>
+ <Patch name="SE Flange" prog="57" hbank="2" lbank="32"/>
+ <Patch name="StrgMachin" prog="57" hbank="3" lbank="32"/>
+ <Patch name="Ana String" prog="57" hbank="0" lbank="32"/>
+ <Patch name="Pizz Pluck" prog="58" hbank="1" lbank="32"/>
+ <Patch name="Pitzi" prog="58" hbank="2" lbank="32"/>
+ <Patch name="PizzViolin" prog="58" hbank="3" lbank="32"/>
+ <Patch name="SpacePluck" prog="58" hbank="0" lbank="32"/>
+ <Patch name="Harp Pluck" prog="59" hbank="1" lbank="32"/>
+ <Patch name="HeavenHarp" prog="59" hbank="2" lbank="32"/>
+ <Patch name="Harp Gliss" prog="59" hbank="3" lbank="32"/>
+ <Patch name="Waterfalls" prog="59" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Brass">
+ <Patch name="FlugelSolo" prog="60" hbank="1" lbank="32"/>
+ <Patch name="Bone-afied" prog="60" hbank="2" lbank="32"/>
+ <Patch name="Francaise" prog="60" hbank="3" lbank="32"/>
+ <Patch name="SmokeyRoom" prog="60" hbank="0" lbank="32"/>
+ <Patch name="ClsclTrmpt" prog="61" hbank="1" lbank="32"/>
+ <Patch name="Jazz Mute" prog="61" hbank="2" lbank="32"/>
+ <Patch name="Orch Mutes" prog="61" hbank="3" lbank="32"/>
+ <Patch name="MW Mute TP" prog="61" hbank="0" lbank="32"/>
+ <Patch name="Solo Tromb" prog="62" hbank="1" lbank="32"/>
+ <Patch name="RegalBones" prog="62" hbank="2" lbank="32"/>
+ <Patch name="Tromb Ens" prog="62" hbank="3" lbank="32"/>
+ <Patch name="Hard Tuba" prog="62" hbank="0" lbank="32"/>
+ <Patch name="Dual Horns" prog="63" hbank="1" lbank="32"/>
+ <Patch name="Ooh Horns" prog="63" hbank="2" lbank="32"/>
+ <Patch name="3rdImpTrpt" prog="63" hbank="3" lbank="32"/>
+ <Patch name="FusionHorn" prog="63" hbank="0" lbank="32"/>
+ <Patch name="Real Brass" prog="64" hbank="1" lbank="32"/>
+ <Patch name="ClsclHorns" prog="64" hbank="2" lbank="32"/>
+ <Patch name="TrumpetEns" prog="64" hbank="3" lbank="32"/>
+ <Patch name="Vivaldian" prog="64" hbank="0" lbank="32"/>
+ <Patch name="Pop Brass" prog="65" hbank="1" lbank="32"/>
+ <Patch name="Gold Brass" prog="65" hbank="2" lbank="32"/>
+ <Patch name="Four Horns" prog="65" hbank="3" lbank="32"/>
+ <Patch name="BigBrsSect" prog="65" hbank="0" lbank="32"/>
+ <Patch name="Bigg Brass" prog="66" hbank="1" lbank="32"/>
+ <Patch name="BeBopHorns" prog="66" hbank="2" lbank="32"/>
+ <Patch name="Dixi Brass" prog="66" hbank="3" lbank="32"/>
+ <Patch name="ButtahHrns" prog="66" hbank="0" lbank="32"/>
+ <Patch name="Brass Pump" prog="67" hbank="1" lbank="32"/>
+ <Patch name="Sfz Brass" prog="67" hbank="2" lbank="32"/>
+ <Patch name="HornExpans" prog="67" hbank="3" lbank="32"/>
+ <Patch name="TrumpletMW" prog="67" hbank="0" lbank="32"/>
+ <Patch name="ClassBrass" prog="68" hbank="1" lbank="32"/>
+ <Patch name="Orchestral" prog="68" hbank="2" lbank="32"/>
+ <Patch name="GhostHorns" prog="68" hbank="3" lbank="32"/>
+ <Patch name="SkyWatcher" prog="68" hbank="0" lbank="32"/>
+ <Patch name="Ohbe Brass" prog="69" hbank="1" lbank="32"/>
+ <Patch name="ClscSynBrs" prog="69" hbank="2" lbank="32"/>
+ <Patch name="OB Horns" prog="69" hbank="3" lbank="32"/>
+ <Patch name="Mighty5th" prog="69" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Winds">
+ <Patch name="Lyric Flute" prog="70" hbank="1" lbank="32"/>
+ <Patch name="SingleFlut" prog="70" hbank="2" lbank="32"/>
+ <Patch name="Hard Flute" prog="70" hbank="3" lbank="32"/>
+ <Patch name="ChiffFlute" prog="70" hbank="0" lbank="32"/>
+ <Patch name="TronFlutes" prog="71" hbank="1" lbank="32"/>
+ <Patch name="SpaceFlute" prog="71" hbank="2" lbank="32"/>
+ <Patch name="Mutablow" prog="71" hbank="3" lbank="32"/>
+ <Patch name="TalkinPipe" prog="71" hbank="0" lbank="32"/>
+ <Patch name="PanPeople" prog="72" hbank="1" lbank="32"/>
+ <Patch name="Hard Pipes" prog="72" hbank="2" lbank="32"/>
+ <Patch name="PetersPipe" prog="72" hbank="3" lbank="32"/>
+ <Patch name="PanBristle" prog="72" hbank="0" lbank="32"/>
+ <Patch name="Bottle Pad" prog="73" hbank="1" lbank="32"/>
+ <Patch name="Tripan" prog="73" hbank="2" lbank="32"/>
+ <Patch name="Minotaur" prog="73" hbank="3" lbank="32"/>
+ <Patch name="BlowDeTune" prog="73" hbank="0" lbank="32"/>
+ <Patch name="Wind Ensmb" prog="74" hbank="1" lbank="32"/>
+ <Patch name="Wind Orch" prog="74" hbank="2" lbank="32"/>
+ <Patch name="Dark Winds" prog="74" hbank="3" lbank="32"/>
+ <Patch name="Wind Woods" prog="74" hbank="0" lbank="32"/>
+ <Patch name="SoloBasoon" prog="75" hbank="1" lbank="32"/>
+ <Patch name="Oboe Blow" prog="75" hbank="2" lbank="32"/>
+ <Patch name="G. Soprano" prog="75" hbank="3" lbank="32"/>
+ <Patch name="Croccodile" prog="75" hbank="0" lbank="32"/>
+ <Patch name="Tenor Solo" prog="76" hbank="1" lbank="32"/>
+ <Patch name="Brite Alto" prog="76" hbank="2" lbank="32"/>
+ <Patch name="Sax Touch" prog="76" hbank="3" lbank="32"/>
+ <Patch name="BreathySax" prog="76" hbank="0" lbank="32"/>
+ <Patch name="ThoseSaxes" prog="77" hbank="1" lbank="32"/>
+ <Patch name="Big Band" prog="77" hbank="2" lbank="32"/>
+ <Patch name="Sax Mass" prog="77" hbank="3" lbank="32"/>
+ <Patch name="SprnoRcrdr" prog="77" hbank="0" lbank="32"/>
+ <Patch name="Nautical" prog="78" hbank="1" lbank="32"/>
+ <Patch name="Wistelaan" prog="78" hbank="2" lbank="32"/>
+ <Patch name="Transformr" prog="78" hbank="3" lbank="32"/>
+ <Patch name="HybridBlow" prog="78" hbank="0" lbank="32"/>
+ <Patch name="FantaFlute" prog="79" hbank="1" lbank="32"/>
+ <Patch name="Shamanixst" prog="79" hbank="2" lbank="32"/>
+ <Patch name="1001Nights" prog="79" hbank="3" lbank="32"/>
+ <Patch name="Cartoonin'" prog="79" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Synth 1">
+ <Patch name="Ooh Choir" prog="80" hbank="1" lbank="32"/>
+ <Patch name="Oohzee" prog="80" hbank="2" lbank="32"/>
+ <Patch name="VelOooz&amp;Aaz" prog="80" hbank="3" lbank="32"/>
+ <Patch name="PavlovsDog" prog="80" hbank="0" lbank="32"/>
+ <Patch name="Ahh Choir" prog="81" hbank="1" lbank="32"/>
+ <Patch name="Glory Ahhs" prog="81" hbank="2" lbank="32"/>
+ <Patch name="Voxalon" prog="81" hbank="3" lbank="32"/>
+ <Patch name="MorphChoir" prog="81" hbank="0" lbank="32"/>
+ <Patch name="Sunsrizer" prog="82" hbank="1" lbank="32"/>
+ <Patch name="Dead Sea" prog="82" hbank="2" lbank="32"/>
+ <Patch name="Final Dawn" prog="82" hbank="3" lbank="32"/>
+ <Patch name="Air Pad MW" prog="82" hbank="0" lbank="32"/>
+ <Patch name="Afterglow" prog="83" hbank="1" lbank="32"/>
+ <Patch name="Anasthesia" prog="83" hbank="2" lbank="32"/>
+ <Patch name="1stContact" prog="83" hbank="3" lbank="32"/>
+ <Patch name="GlideVoxMW" prog="83" hbank="0" lbank="32"/>
+ <Patch name="TyrellCorp" prog="84" hbank="1" lbank="32"/>
+ <Patch name="Sparks" prog="84" hbank="2" lbank="32"/>
+ <Patch name="Applewine" prog="84" hbank="3" lbank="32"/>
+ <Patch name="JoshuaTree" prog="84" hbank="0" lbank="32"/>
+ <Patch name="MindSweep" prog="85" hbank="1" lbank="32"/>
+ <Patch name="Hol&amp;Sampl" prog="85" hbank="2" lbank="32"/>
+ <Patch name="Shiftaling" prog="85" hbank="3" lbank="32"/>
+ <Patch name="Metal Wash" prog="85" hbank="0" lbank="32"/>
+ <Patch name="GenesisWav" prog="86" hbank="1" lbank="32"/>
+ <Patch name="Dew Drops" prog="86" hbank="2" lbank="32"/>
+ <Patch name="Comet Rain" prog="86" hbank="3" lbank="32"/>
+ <Patch name="HeavenCent" prog="86" hbank="0" lbank="32"/>
+ <Patch name="Rainforest" prog="87" hbank="1" lbank="32"/>
+ <Patch name="Outland" prog="87" hbank="2" lbank="32"/>
+ <Patch name="7th Wave" prog="87" hbank="3" lbank="32"/>
+ <Patch name="Ocean Mood" prog="87" hbank="0" lbank="32"/>
+ <Patch name="Sahara Sun" prog="88" hbank="1" lbank="32"/>
+ <Patch name="Emperor" prog="88" hbank="2" lbank="32"/>
+ <Patch name="Eno Pad" prog="88" hbank="3" lbank="32"/>
+ <Patch name="MoonRise" prog="88" hbank="0" lbank="32"/>
+ <Patch name="Water!!!" prog="89" hbank="1" lbank="32"/>
+ <Patch name="Ascent" prog="89" hbank="2" lbank="32"/>
+ <Patch name="Tsynami" prog="89" hbank="3" lbank="32"/>
+ <Patch name="InnerPhase" prog="89" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Synth 2">
+ <Patch name="Quadatix" prog="90" hbank="1" lbank="32"/>
+ <Patch name="Fanfare GX" prog="90" hbank="2" lbank="32"/>
+ <Patch name="Touch &amp; Go" prog="90" hbank="3" lbank="32"/>
+ <Patch name="TicSawlead" prog="90" hbank="0" lbank="32"/>
+ <Patch name="VoltagePad" prog="91" hbank="1" lbank="32"/>
+ <Patch name="PowerChirp" prog="91" hbank="2" lbank="32"/>
+ <Patch name="EmersonSaw" prog="91" hbank="3" lbank="32"/>
+ <Patch name="Spaceport" prog="91" hbank="0" lbank="32"/>
+ <Patch name="Xpando Pad" prog="92" hbank="1" lbank="32"/>
+ <Patch name="BladeRunnr" prog="92" hbank="2" lbank="32"/>
+ <Patch name="Fluid Pad" prog="92" hbank="3" lbank="32"/>
+ <Patch name="FlashBack" prog="92" hbank="0" lbank="32"/>
+ <Patch name="Scarlamare" prog="93" hbank="1" lbank="32"/>
+ <Patch name="Distance" prog="93" hbank="2" lbank="32"/>
+ <Patch name="Vector Pad" prog="93" hbank="3" lbank="32"/>
+ <Patch name="VintageRez" prog="93" hbank="0" lbank="32"/>
+ <Patch name="A/V Pad" prog="94" hbank="1" lbank="32"/>
+ <Patch name="Angelsynth" prog="94" hbank="2" lbank="32"/>
+ <Patch name="Fuzz Choir" prog="94" hbank="3" lbank="32"/>
+ <Patch name="Mink Pad" prog="94" hbank="0" lbank="32"/>
+ <Patch name="AirLAYER" prog="95" hbank="1" lbank="32"/>
+ <Patch name="HighGlissz" prog="95" hbank="2" lbank="32"/>
+ <Patch name="Hihowareya" prog="95" hbank="3" lbank="32"/>
+ <Patch name="Cromaphon" prog="95" hbank="0" lbank="32"/>
+ <Patch name="Kalimpanad" prog="96" hbank="1" lbank="32"/>
+ <Patch name="Delectea" prog="96" hbank="2" lbank="32"/>
+ <Patch name="Scientific" prog="96" hbank="3" lbank="32"/>
+ <Patch name="Amakudari" prog="96" hbank="0" lbank="32"/>
+ <Patch name="Blacksmith" prog="97" hbank="1" lbank="32"/>
+ <Patch name="PatchCords" prog="97" hbank="2" lbank="32"/>
+ <Patch name="Pop Out" prog="97" hbank="3" lbank="32"/>
+ <Patch name="RubberMetl" prog="97" hbank="0" lbank="32"/>
+ <Patch name="Digidee" prog="98" hbank="1" lbank="32"/>
+ <Patch name="Silk&amp;Satin" prog="98" hbank="2" lbank="32"/>
+ <Patch name="Voice Bell" prog="98" hbank="3" lbank="32"/>
+ <Patch name="TinSynLead" prog="98" hbank="0" lbank="32"/>
+ <Patch name="Marburg" prog="99" hbank="1" lbank="32"/>
+ <Patch name="FuzzyGlass" prog="99" hbank="2" lbank="32"/>
+ <Patch name="PebbleBell" prog="99" hbank="3" lbank="32"/>
+ <Patch name="Marimpanad" prog="99" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Synth 3">
+ <Patch name="Porta Lead" prog="100" hbank="1" lbank="32"/>
+ <Patch name="FmDBgining" prog="100" hbank="2" lbank="32"/>
+ <Patch name="Fast Sync" prog="100" hbank="3" lbank="32"/>
+ <Patch name="Zoo Lead" prog="100" hbank="0" lbank="32"/>
+ <Patch name="ClassicSqr" prog="101" hbank="1" lbank="32"/>
+ <Patch name="EPROM Boy" prog="101" hbank="2" lbank="32"/>
+ <Patch name="Spork Boy" prog="101" hbank="3" lbank="32"/>
+ <Patch name="Spring Boy" prog="101" hbank="0" lbank="32"/>
+ <Patch name="Triangular" prog="102" hbank="1" lbank="32"/>
+ <Patch name="EmoL7 Lead" prog="102" hbank="2" lbank="32"/>
+ <Patch name="Tri Lead" prog="102" hbank="3" lbank="32"/>
+ <Patch name="3oh3 SawMW" prog="102" hbank="0" lbank="32"/>
+ <Patch name="Maze Lead" prog="103" hbank="1" lbank="32"/>
+ <Patch name="DiodeDoodl" prog="103" hbank="2" lbank="32"/>
+ <Patch name="Beta Lead" prog="103" hbank="3" lbank="32"/>
+ <Patch name="3oh3 SqrMW" prog="103" hbank="0" lbank="32"/>
+ <Patch name="BPF Lead" prog="104" hbank="1" lbank="32"/>
+ <Patch name="MellowGold" prog="104" hbank="2" lbank="32"/>
+ <Patch name="WhstleLead" prog="104" hbank="3" lbank="32"/>
+ <Patch name="HiPassCtrl" prog="104" hbank="0" lbank="32"/>
+ <Patch name="Screamer!" prog="105" hbank="1" lbank="32"/>
+ <Patch name="PortaWheel" prog="105" hbank="2" lbank="32"/>
+ <Patch name="Alpha Lead" prog="105" hbank="3" lbank="32"/>
+ <Patch name="'74 Square" prog="105" hbank="0" lbank="32"/>
+ <Patch name="ShineOn..." prog="106" hbank="1" lbank="32"/>
+ <Patch name="Sweet Lead" prog="106" hbank="2" lbank="32"/>
+ <Patch name="Rezzathing" prog="106" hbank="3" lbank="32"/>
+ <Patch name="RaveSaw QS" prog="106" hbank="0" lbank="32"/>
+ <Patch name="Touchsaw" prog="107" hbank="1" lbank="32"/>
+ <Patch name="Brassy 5th" prog="107" hbank="2" lbank="32"/>
+ <Patch name="Trilogy Ld" prog="107" hbank="3" lbank="32"/>
+ <Patch name="RaveSqr QS" prog="107" hbank="0" lbank="32"/>
+ <Patch name="Fuzz Box" prog="108" hbank="1" lbank="32"/>
+ <Patch name="SuperNova" prog="108" hbank="2" lbank="32"/>
+ <Patch name="Hazy Lead" prog="108" hbank="3" lbank="32"/>
+ <Patch name="Buzz Clip" prog="108" hbank="0" lbank="32"/>
+ <Patch name="AquaTarkus" prog="109" hbank="1" lbank="32"/>
+ <Patch name="AbdnsTriad" prog="109" hbank="2" lbank="32"/>
+ <Patch name="The Sage" prog="109" hbank="3" lbank="32"/>
+ <Patch name="SyncNSaws!" prog="109" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Rhythm/FX">
+ <Patch name="Synergy MW" prog="110" hbank="1" lbank="32"/>
+ <Patch name="Transcope" prog="110" hbank="2" lbank="32"/>
+ <Patch name="Pitch-Bot" prog="110" hbank="3" lbank="32"/>
+ <Patch name="Wormholes" prog="110" hbank="0" lbank="32"/>
+ <Patch name="Discotron" prog="111" hbank="1" lbank="32"/>
+ <Patch name="Groovy-bot" prog="111" hbank="2" lbank="32"/>
+ <Patch name="Disco Boy" prog="111" hbank="3" lbank="32"/>
+ <Patch name="Bonk" prog="111" hbank="0" lbank="32"/>
+ <Patch name="Bhangra" prog="112" hbank="1" lbank="32"/>
+ <Patch name="Yonderland" prog="112" hbank="2" lbank="32"/>
+ <Patch name="Braveheart" prog="112" hbank="3" lbank="32"/>
+ <Patch name="No Age" prog="112" hbank="0" lbank="32"/>
+ <Patch name="Randomania" prog="113" hbank="1" lbank="32"/>
+ <Patch name="Robotechno" prog="113" hbank="2" lbank="32"/>
+ <Patch name="NineIncher" prog="113" hbank="3" lbank="32"/>
+ <Patch name="Funkngruvn" prog="113" hbank="0" lbank="32"/>
+ <Patch name="Pop Thing" prog="114" hbank="1" lbank="32"/>
+ <Patch name="JungleGruv" prog="114" hbank="2" lbank="32"/>
+ <Patch name="TheSandMan" prog="114" hbank="3" lbank="32"/>
+ <Patch name="New Waves" prog="114" hbank="0" lbank="32"/>
+ <Patch name="Loop-O-Mat" prog="115" hbank="1" lbank="32"/>
+ <Patch name="WhereDrums" prog="115" hbank="2" lbank="32"/>
+ <Patch name="ConsumRism" prog="115" hbank="3" lbank="32"/>
+ <Patch name="Pss Roll" prog="115" hbank="0" lbank="32"/>
+ <Patch name="Clockwork" prog="116" hbank="1" lbank="32"/>
+ <Patch name="Sardauker" prog="116" hbank="2" lbank="32"/>
+ <Patch name="Fanfare" prog="116" hbank="3" lbank="32"/>
+ <Patch name="TseTse Fly" prog="116" hbank="0" lbank="32"/>
+ <Patch name="Heartbeat" prog="117" hbank="1" lbank="32"/>
+ <Patch name="Circles" prog="117" hbank="2" lbank="32"/>
+ <Patch name="Big Sur" prog="117" hbank="3" lbank="32"/>
+ <Patch name="DogsInSpac" prog="117" hbank="0" lbank="32"/>
+ <Patch name="Nanites" prog="118" hbank="1" lbank="32"/>
+ <Patch name="T-Minus 1" prog="118" hbank="2" lbank="32"/>
+ <Patch name="BubbleHead" prog="118" hbank="3" lbank="32"/>
+ <Patch name="Insectagon" prog="118" hbank="0" lbank="32"/>
+ <Patch name="MonstrMash" prog="119" hbank="1" lbank="32"/>
+ <Patch name="Creeps" prog="119" hbank="2" lbank="32"/>
+ <Patch name="Hyperspace" prog="119" hbank="3" lbank="32"/>
+ <Patch name="Laboratory" prog="119" hbank="0" lbank="32"/>
+ </PatchGroup>
+
+
+ <PatchGroup name="Drums/Percussion">
+ <Patch name="DM5 Drums" prog="120" hbank="1" lbank="32"/>
+ <Patch name="Pop Up Kit" prog="120" hbank="2" lbank="32"/>
+ <Patch name="CountryKit" prog="120" hbank="3" lbank="32"/>
+ <Patch name="Real Rock" prog="120" hbank="0" lbank="32"/>
+ <Patch name="Straight 8" prog="121" hbank="1" lbank="32"/>
+ <Patch name="9 Time" prog="121" hbank="2" lbank="32"/>
+ <Patch name="See our 78" prog="121" hbank="3" lbank="32"/>
+ <Patch name="Asylum Kit" prog="121" hbank="0" lbank="32"/>
+ <Patch name="Industro" prog="122" hbank="1" lbank="32"/>
+ <Patch name="HardcoreKit" prog="122" hbank="2" lbank="32"/>
+ <Patch name="Groovy Lube" prog="122" hbank="3" lbank="32"/>
+ <Patch name="Harlem Tek" prog="122" hbank="0" lbank="32"/>
+ <Patch name="StreetBeat" prog="123" hbank="1" lbank="32"/>
+ <Patch name="UrbanBliss" prog="123" hbank="2" lbank="32"/>
+ <Patch name="Disco Kit" prog="123" hbank="3" lbank="32"/>
+ <Patch name="15ips Kit" prog="123" hbank="0" lbank="32"/>
+ <Patch name="Outer Kit" prog="124" hbank="1" lbank="32"/>
+ <Patch name="GuessTrips" prog="124" hbank="2" lbank="32"/>
+ <Patch name="UFO Drums" prog="124" hbank="3" lbank="32"/>
+ <Patch name="GuessDrums" prog="124" hbank="0" lbank="32"/>
+ <Patch name="AfricaPerc" prog="125" hbank="1" lbank="32"/>
+ <Patch name="India Perc" prog="125" hbank="2" lbank="32"/>
+ <Patch name="Asia Perc" prog="125" hbank="3" lbank="32"/>
+ <Patch name="VocoderKit" prog="125" hbank="0" lbank="32"/>
+ <Patch name="Marktree" prog="126" hbank="1" lbank="32"/>
+ <Patch name="TimpaniHit" prog="126" hbank="2" lbank="32"/>
+ <Patch name="Doom Toms" prog="126" hbank="3" lbank="32"/>
+ <Patch name="Rainstick" prog="126" hbank="0" lbank="32"/>
+ <Patch name="Orch Hits" prog="127" hbank="1" lbank="32"/>
+ <Patch name="Danz Hitz" prog="127" hbank="2" lbank="32"/>
+ <Patch name="Film Hit" prog="127" hbank="3" lbank="32"/>
+ <Patch name="Deja Hitz" prog="127" hbank="0" lbank="32"/>
+ </PatchGroup>
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/AlesisQS6.idf b/muse/share/instruments/AlesisQS6.idf
new file mode 100644
index 00000000..d10177b1
--- /dev/null
+++ b/muse/share/instruments/AlesisQS6.idf
@@ -0,0 +1,658 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="AlesisQS6">
+ <PatchGroup name="General Midi">
+ <Patch name="Acoustic Grand Piano" prog="0" hbank="4" lbank="32"/>
+ <Patch name="Bright Acoustic Piano" prog="1" hbank="4" lbank="32"/>
+ <Patch name="Electric Grand Piano" prog="2" hbank="4" lbank="32"/>
+ <Patch name="Honky-tonk Piano" prog="3" hbank="4" lbank="32"/>
+ <Patch name="Electric Piano 1" prog="4" hbank="4" lbank="32"/>
+ <Patch name="Electric Piano 2" prog="5" hbank="4" lbank="32"/>
+ <Patch name="Harpsichord" prog="6" hbank="4" lbank="32"/>
+ <Patch name="Clavi" prog="7" hbank="4" lbank="32"/>
+ <Patch name="Celesta" prog="8" hbank="4" lbank="32"/>
+ <Patch name="Glockenspiel" prog="9" hbank="4" lbank="32"/>
+ <Patch name="Music Box" prog="10" hbank="4" lbank="32"/>
+ <Patch name="Vibraphone" prog="11" hbank="4" lbank="32"/>
+ <Patch name="Marimba" prog="12" hbank="4" lbank="32"/>
+ <Patch name="Xylophone" prog="13" hbank="4" lbank="32"/>
+ <Patch name="Tubular Bells" prog="14" hbank="4" lbank="32"/>
+ <Patch name="Dulcimer" prog="15" hbank="4" lbank="32"/>
+ <Patch name="Drawbar Organ" prog="16" hbank="4" lbank="32"/>
+ <Patch name="Percussive Organ" prog="17" hbank="4" lbank="32"/>
+ <Patch name="Rock Organ" prog="18" hbank="4" lbank="32"/>
+ <Patch name="Church Organ" prog="19" hbank="4" lbank="32"/>
+ <Patch name="Reed Organ" prog="20" hbank="4" lbank="32"/>
+ <Patch name="Accordion" prog="21" hbank="4" lbank="32"/>
+ <Patch name="Harmonica" prog="22" hbank="4" lbank="32"/>
+ <Patch name="Tango Accordion" prog="23" hbank="4" lbank="32"/>
+ <Patch name="Acoustic Guitar (nylon)" prog="24" hbank="4" lbank="32"/>
+ <Patch name="Acoustic Guitar (steel)" prog="25" hbank="4" lbank="32"/>
+ <Patch name="Electric Guitar (jazz)" prog="26" hbank="4" lbank="32"/>
+ <Patch name="Electric Guitar (clean)" prog="27" hbank="4" lbank="32"/>
+ <Patch name="Electric Guitar (muted)" prog="28" hbank="4" lbank="32"/>
+ <Patch name="Overdriven Guitar" prog="29" hbank="4" lbank="32"/>
+ <Patch name="Distortion Guitar" prog="30" hbank="4" lbank="32"/>
+ <Patch name="Guitar harmonics" prog="31" hbank="4" lbank="32"/>
+ <Patch name="Acoustic Bass" prog="32" hbank="4" lbank="32"/>
+ <Patch name="Fingered Bass" prog="33" hbank="4" lbank="32"/>
+ <Patch name="Picked Bass" prog="34" hbank="4" lbank="32"/>
+ <Patch name="Fretless Bass" prog="35" hbank="4" lbank="32"/>
+ <Patch name="Slap Bass 1" prog="36" hbank="4" lbank="32"/>
+ <Patch name="Slap Bass 2" prog="37" hbank="4" lbank="32"/>
+ <Patch name="Synth Bass 1" prog="38" hbank="4" lbank="32"/>
+ <Patch name="Synth Bass 2" prog="39" hbank="4" lbank="32"/>
+ <Patch name="Violin" prog="40" hbank="4" lbank="32"/>
+ <Patch name="Viola" prog="41" hbank="4" lbank="32"/>
+ <Patch name="Cello" prog="42" hbank="4" lbank="32"/>
+ <Patch name="Contrabass" prog="43" hbank="4" lbank="32"/>
+ <Patch name="Tremolo Strings" prog="44" hbank="4" lbank="32"/>
+ <Patch name="Pizzicato Strings" prog="45" hbank="4" lbank="32"/>
+ <Patch name="Orchestral Harp" prog="46" hbank="4" lbank="32"/>
+ <Patch name="Timpani" prog="47" hbank="4" lbank="32"/>
+ <Patch name="String Ensemble 1" prog="48" hbank="4" lbank="32"/>
+ <Patch name="String Ensemble 2" prog="49" hbank="4" lbank="32"/>
+ <Patch name="SynthStrings 1" prog="50" hbank="4" lbank="32"/>
+ <Patch name="SynthStrings 2" prog="51" hbank="4" lbank="32"/>
+ <Patch name="Choir Aahs" prog="52" hbank="4" lbank="32"/>
+ <Patch name="Voice Oohs" prog="53" hbank="4" lbank="32"/>
+ <Patch name="Synth Voice" prog="54" hbank="4" lbank="32"/>
+ <Patch name="Orchestra Hit" prog="55" hbank="4" lbank="32"/>
+ <Patch name="Trumpet" prog="56" hbank="4" lbank="32"/>
+ <Patch name="Trombone" prog="57" hbank="4" lbank="32"/>
+ <Patch name="Tuba" prog="58" hbank="4" lbank="32"/>
+ <Patch name="Muted Trumpet" prog="59" hbank="4" lbank="32"/>
+ <Patch name="French Horn" prog="60" hbank="4" lbank="32"/>
+ <Patch name="Brass Section" prog="61" hbank="4" lbank="32"/>
+ <Patch name="SynthBrass 1" prog="62" hbank="4" lbank="32"/>
+ <Patch name="SynthBrass 2" prog="63" hbank="4" lbank="32"/>
+ <Patch name="Soprano Sax" prog="64" hbank="4" lbank="32"/>
+ <Patch name="Alto Sax" prog="65" hbank="4" lbank="32"/>
+ <Patch name="Tenor Sax" prog="66" hbank="4" lbank="32"/>
+ <Patch name="Baritone Sax" prog="67" hbank="4" lbank="32"/>
+ <Patch name="Oboe" prog="68" hbank="4" lbank="32"/>
+ <Patch name="English Horn" prog="69" hbank="4" lbank="32"/>
+ <Patch name="Bassoon" prog="70" hbank="4" lbank="32"/>
+ <Patch name="Clarinet" prog="71" hbank="4" lbank="32"/>
+ <Patch name="Piccolo" prog="72" hbank="4" lbank="32"/>
+ <Patch name="Flute" prog="73" hbank="4" lbank="32"/>
+ <Patch name="Recorder" prog="74" hbank="4" lbank="32"/>
+ <Patch name="Pan Flute" prog="75" hbank="4" lbank="32"/>
+ <Patch name="Blown Bottle" prog="76" hbank="4" lbank="32"/>
+ <Patch name="Shakuhachi" prog="77" hbank="4" lbank="32"/>
+ <Patch name="Whistle" prog="78" hbank="4" lbank="32"/>
+ <Patch name="Ocarina" prog="79" hbank="4" lbank="32"/>
+ <Patch name="Lead 1 (square)" prog="80" hbank="4" lbank="32"/>
+ <Patch name="Lead 2 (sawtooth)" prog="81" hbank="4" lbank="32"/>
+ <Patch name="Lead 3 (calliope)" prog="82" hbank="4" lbank="32"/>
+ <Patch name="Lead 4 (chiff)" prog="83" hbank="4" lbank="32"/>
+ <Patch name="Lead 5 (charang)" prog="84" hbank="4" lbank="32"/>
+ <Patch name="Lead 6 (voice)" prog="85" hbank="4" lbank="32"/>
+ <Patch name="Lead 7 (fifths)" prog="86" hbank="4" lbank="32"/>
+ <Patch name="Lead 8 (bass + lead)" prog="87" hbank="4" lbank="32"/>
+ <Patch name="Pad 1 (new age)" prog="88" hbank="4" lbank="32"/>
+ <Patch name="Pad 2 (warm)" prog="89" hbank="4" lbank="32"/>
+ <Patch name="Pad 3 (polysynth)" prog="90" hbank="4" lbank="32"/>
+ <Patch name="Pad 4 (choir)" prog="91" hbank="4" lbank="32"/>
+ <Patch name="Pad 5 (bowed)" prog="92" hbank="4" lbank="32"/>
+ <Patch name="Pad 6 (metallic)" prog="93" hbank="4" lbank="32"/>
+ <Patch name="Pad 7 (halo)" prog="94" hbank="4" lbank="32"/>
+ <Patch name="Pad 8 (sweep)" prog="95" hbank="4" lbank="32"/>
+ <Patch name="FX 1 (rain)" prog="96" hbank="4" lbank="32"/>
+ <Patch name="FX 2 (soundtrack)" prog="97" hbank="4" lbank="32"/>
+ <Patch name="FX 3 (crystal)" prog="98" hbank="4" lbank="32"/>
+ <Patch name="FX 4 (atmosphere)" prog="99" hbank="4" lbank="32"/>
+ <Patch name="FX 5 (brightness)" prog="100" hbank="4" lbank="32"/>
+ <Patch name="FX 6 (goblins)" prog="101" hbank="4" lbank="32"/>
+ <Patch name="FX 7 (echoes)" prog="102" hbank="4" lbank="32"/>
+ <Patch name="FX 8 (sci-fi)" prog="103" hbank="4" lbank="32"/>
+ <Patch name="Sitar" prog="104" hbank="4" lbank="32"/>
+ <Patch name="Banjo" prog="105" hbank="4" lbank="32"/>
+ <Patch name="Shamisen" prog="106" hbank="4" lbank="32"/>
+ <Patch name="Koto" prog="107" hbank="4" lbank="32"/>
+ <Patch name="Kalimba" prog="108" hbank="4" lbank="32"/>
+ <Patch name="Bag pipe" prog="109" hbank="4" lbank="32"/>
+ <Patch name="Fiddle" prog="110" hbank="4" lbank="32"/>
+ <Patch name="Shanai" prog="111" hbank="4" lbank="32"/>
+ <Patch name="Tinkle Bell" prog="112" hbank="4" lbank="32"/>
+ <Patch name="Agogo" prog="113" hbank="4" lbank="32"/>
+ <Patch name="Steel Drums" prog="114" hbank="4" lbank="32"/>
+ <Patch name="Woodblock" prog="115" hbank="4" lbank="32"/>
+ <Patch name="Taiko Drum" prog="116" hbank="4" lbank="32"/>
+ <Patch name="Melodic Tom" prog="117" hbank="4" lbank="32"/>
+ <Patch name="Synth Drum" prog="118" hbank="4" lbank="32"/>
+ <Patch name="Reverse Cymbal" prog="119" hbank="4" lbank="32"/>
+ <Patch name="Guitar Fret Noise" prog="120" hbank="4" lbank="32"/>
+ <Patch name="Breath Noise" prog="121" hbank="4" lbank="32"/>
+ <Patch name="Seashore" prog="122" hbank="4" lbank="32"/>
+ <Patch name="Bird Tweet" prog="123" hbank="4" lbank="32"/>
+ <Patch name="Telephone Ring" prog="124" hbank="4" lbank="32"/>
+ <Patch name="Helicopter" prog="125" hbank="4" lbank="32"/>
+ <Patch name="Applause" prog="126" hbank="4" lbank="32"/>
+ <Patch name="Gunshot" prog="127" hbank="4" lbank="32"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset1 Programs">
+ <Patch name="GrandPiano" prog="0" hbank="1" lbank="32"/>
+ <Patch name="PianoMorph" prog="1" hbank="1" lbank="32"/>
+ <Patch name="HyperPiano" prog="2" hbank="1" lbank="32"/>
+ <Patch name="Rayz Rhodz" prog="3" hbank="1" lbank="32"/>
+ <Patch name="61 Tines" prog="4" hbank="1" lbank="32"/>
+ <Patch name="FM E Piano" prog="5" hbank="1" lbank="32"/>
+ <Patch name="EP &amp; Oohs" prog="6" hbank="1" lbank="32"/>
+ <Patch name="Wave Piano" prog="7" hbank="1" lbank="32"/>
+ <Patch name="ClascWurly" prog="8" hbank="1" lbank="32"/>
+ <Patch name="Jazz Duo" prog="9" hbank="1" lbank="32"/>
+ <Patch name="Clavitube" prog="10" hbank="1" lbank="32"/>
+ <Patch name="Real Clav" prog="11" hbank="1" lbank="32"/>
+ <Patch name="TrueHarpsi" prog="12" hbank="1" lbank="32"/>
+ <Patch name="Cool Vibes" prog="13" hbank="1" lbank="32"/>
+ <Patch name="BriteMarim" prog="14" hbank="1" lbank="32"/>
+ <Patch name="Kalimba MW" prog="15" hbank="1" lbank="32"/>
+ <Patch name="Brake Drum" prog="16" hbank="1" lbank="32"/>
+ <Patch name="St. Thomas" prog="17" hbank="1" lbank="32"/>
+ <Patch name="Basic Bell" prog="18" hbank="1" lbank="32"/>
+ <Patch name="ClockTower" prog="19" hbank="1" lbank="32"/>
+ <Patch name="Real Prc B" prog="20" hbank="1" lbank="32"/>
+ <Patch name="High Life" prog="21" hbank="1" lbank="32"/>
+ <Patch name="Grit Organ" prog="22" hbank="1" lbank="32"/>
+ <Patch name="HoedownOrg" prog="23" hbank="1" lbank="32"/>
+ <Patch name="Purple B" prog="24" hbank="1" lbank="32"/>
+ <Patch name="Toccata&amp;Fg" prog="25" hbank="1" lbank="32"/>
+ <Patch name="High Mass" prog="26" hbank="1" lbank="32"/>
+ <Patch name="Communion" prog="27" hbank="1" lbank="32"/>
+ <Patch name="FrAccrdion" prog="28" hbank="1" lbank="32"/>
+ <Patch name="WhammerJmr" prog="29" hbank="1" lbank="32"/>
+ <Patch name="SteelHorse" prog="30" hbank="1" lbank="32"/>
+ <Patch name="GuildedAge" prog="31" hbank="1" lbank="32"/>
+ <Patch name="Gitarala" prog="32" hbank="1" lbank="32"/>
+ <Patch name="Nylon&amp;Oohs" prog="33" hbank="1" lbank="32"/>
+ <Patch name="TreMellow" prog="34" hbank="1" lbank="32"/>
+ <Patch name="TurboSlidr" prog="35" hbank="1" lbank="32"/>
+ <Patch name="Total Chug" prog="36" hbank="1" lbank="32"/>
+ <Patch name="Feebacker" prog="37" hbank="1" lbank="32"/>
+ <Patch name="WorldSitar" prog="38" hbank="1" lbank="32"/>
+ <Patch name="Koto Pluck" prog="39" hbank="1" lbank="32"/>
+ <Patch name="BigUpright" prog="40" hbank="1" lbank="32"/>
+ <Patch name="QS Bass" prog="41" hbank="1" lbank="32"/>
+ <Patch name="007 Bass" prog="42" hbank="1" lbank="32"/>
+ <Patch name="Slap It!" prog="43" hbank="1" lbank="32"/>
+ <Patch name="VolumeKnob" prog="44" hbank="1" lbank="32"/>
+ <Patch name="Fat Mini" prog="45" hbank="1" lbank="32"/>
+ <Patch name="Filter Wow" prog="46" hbank="1" lbank="32"/>
+ <Patch name="IndustryRez" prog="47" hbank="1" lbank="32"/>
+ <Patch name="DeutschBas" prog="48" hbank="1" lbank="32"/>
+ <Patch name="CyberBass" prog="49" hbank="1" lbank="32"/>
+ <Patch name="Stradivari" prog="50" hbank="1" lbank="32"/>
+ <Patch name="SmlSection" prog="51" hbank="1" lbank="32"/>
+ <Patch name="MedSection" prog="52" hbank="1" lbank="32"/>
+ <Patch name="FireStrngs" prog="53" hbank="1" lbank="32"/>
+ <Patch name="ArcoStrngs" prog="54" hbank="1" lbank="32"/>
+ <Patch name="Pit String" prog="55" hbank="1" lbank="32"/>
+ <Patch name="Obersphere" prog="56" hbank="1" lbank="32"/>
+ <Patch name="J Strings" prog="57" hbank="1" lbank="32"/>
+ <Patch name="PizzViolin" prog="58" hbank="1" lbank="32"/>
+ <Patch name="Harp Pluck" prog="59" hbank="1" lbank="32"/>
+ <Patch name="FlugelSolo" prog="60" hbank="1" lbank="32"/>
+ <Patch name="Jazz Mute" prog="61" hbank="1" lbank="32"/>
+ <Patch name="Solor Tromb" prog="62" hbank="1" lbank="32"/>
+ <Patch name="FHrn Ens" prog="63" hbank="1" lbank="32"/>
+ <Patch name="BriteBass" prog="64" hbank="1" lbank="32"/>
+ <Patch name="Ohbe Brass" prog="65" hbank="1" lbank="32"/>
+ <Patch name="Stab Brass" prog="66" hbank="1" lbank="32"/>
+ <Patch name="Brass Pump" prog="67" hbank="1" lbank="32"/>
+ <Patch name="Big Brass" prog="68" hbank="1" lbank="32"/>
+ <Patch name="Orchestral" prog="69" hbank="1" lbank="32"/>
+ <Patch name="Lyric Flute" prog="70" hbank="1" lbank="32"/>
+ <Patch name="TronFlutes" prog="71" hbank="1" lbank="32"/>
+ <Patch name="PanPeople" prog="72" hbank="1" lbank="32"/>
+ <Patch name="Velo Shaku" prog="73" hbank="1" lbank="32"/>
+ <Patch name="Wind Ensmb" prog="74" hbank="1" lbank="32"/>
+ <Patch name="SoloBasoon" prog="75" hbank="1" lbank="32"/>
+ <Patch name="Tenor Solo" prog="76" hbank="1" lbank="32"/>
+ <Patch name="ThoseSaxes" prog="77" hbank="1" lbank="32"/>
+ <Patch name="Nautical" prog="78" hbank="1" lbank="32"/>
+ <Patch name="MagicFlute" prog="79" hbank="1" lbank="32"/>
+ <Patch name="Air Choir" prog="80" hbank="1" lbank="32"/>
+ <Patch name="Ooh LaLa" prog="81" hbank="1" lbank="32"/>
+ <Patch name="Sunsrizer" prog="82" hbank="1" lbank="32"/>
+ <Patch name="Afterglow" prog="83" hbank="1" lbank="32"/>
+ <Patch name="Meditation" prog="84" hbank="1" lbank="32"/>
+ <Patch name="Marburg" prog="85" hbank="1" lbank="32"/>
+ <Patch name="Kalimpanad" prog="86" hbank="1" lbank="32"/>
+ <Patch name="Ocean Mood" prog="87" hbank="1" lbank="32"/>
+ <Patch name="Bali Hai" prog="88" hbank="1" lbank="32"/>
+ <Patch name="StaticMing" prog="89" hbank="1" lbank="32"/>
+ <Patch name="Scientific" prog="90" hbank="1" lbank="32"/>
+ <Patch name="Digidee" prog="91" hbank="1" lbank="32"/>
+ <Patch name="Technoids" prog="92" hbank="1" lbank="32"/>
+ <Patch name="C Quenced" prog="93" hbank="1" lbank="32"/>
+ <Patch name="Dew Drops" prog="94" hbank="1" lbank="32"/>
+ <Patch name="GldnFleece" prog="95" hbank="1" lbank="32"/>
+ <Patch name="Dreamscape" prog="96" hbank="1" lbank="32"/>
+ <Patch name="HighGlissz" prog="97" hbank="1" lbank="32"/>
+ <Patch name="Shiftaling" prog="98" hbank="1" lbank="32"/>
+ <Patch name="GenesisWav" prog="99" hbank="1" lbank="32"/>
+ <Patch name="Quadratix" prog="100" hbank="1" lbank="32"/>
+ <Patch name="Analogist" prog="101" hbank="1" lbank="32"/>
+ <Patch name="Scarlamare" prog="102" hbank="1" lbank="32"/>
+ <Patch name="ShineOn..." prog="103" hbank="1" lbank="32"/>
+ <Patch name="ClassicSqr" prog="104" hbank="1" lbank="32"/>
+ <Patch name="Porta Lead" prog="105" hbank="1" lbank="32"/>
+ <Patch name="FatAnaLead" prog="106" hbank="1" lbank="32"/>
+ <Patch name="Screamer!" prog="107" hbank="1" lbank="32"/>
+ <Patch name="Fuzz Box" prog="108" hbank="1" lbank="32"/>
+ <Patch name="Transformr" prog="109" hbank="1" lbank="32"/>
+ <Patch name="AutoBahn" prog="110" hbank="1" lbank="32"/>
+ <Patch name="ThrobPants" prog="111" hbank="1" lbank="32"/>
+ <Patch name="EkectriKyv" prog="112" hbank="1" lbank="32"/>
+ <Patch name="TheBeatnik" prog="113" hbank="1" lbank="32"/>
+ <Patch name="ShakYerLup" prog="114" hbank="1" lbank="32"/>
+ <Patch name="Raga No.1" prog="115" hbank="1" lbank="32"/>
+ <Patch name="T I M E !" prog="116" hbank="1" lbank="32"/>
+ <Patch name="Heartbeat" prog="117" hbank="1" lbank="32"/>
+ <Patch name="Amazonia" prog="118" hbank="1" lbank="32"/>
+ <Patch name="Nanites" prog="119" hbank="1" lbank="32"/>
+ <Patch name="Basic Kit" prog="120" hbank="1" lbank="32"/>
+ <Patch name="Straight 8" prog="121" hbank="1" lbank="32"/>
+ <Patch name="Club Kit" prog="123" hbank="1" lbank="32"/>
+ <Patch name="T Funk Era" prog="124" hbank="1" lbank="32"/>
+ <Patch name="IsmellFUNK" prog="125" hbank="1" lbank="32"/>
+ <Patch name="Chimes" prog="126" hbank="1" lbank="32"/>
+ <Patch name="Orch Hits" prog="127" hbank="1" lbank="32"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset2 Programs">
+ <Patch name="Solo Piano" prog="0" hbank="2" lbank="32"/>
+ <Patch name="Pno&amp;Strngs" prog="1" hbank="2" lbank="32"/>
+ <Patch name="Pno&amp;Roadz" prog="2" hbank="2" lbank="32"/>
+ <Patch name="Hard Roads" prog="3" hbank="2" lbank="32"/>
+ <Patch name="Suitcase" prog="4" hbank="2" lbank="32"/>
+ <Patch name="Soft FM EP" prog="5" hbank="2" lbank="32"/>
+ <Patch name="EP &amp; String" prog="6" hbank="2" lbank="32"/>
+ <Patch name="Glassworks" prog="7" hbank="2" lbank="32"/>
+ <Patch name="DirtyWurly" prog="8" hbank="2" lbank="32"/>
+ <Patch name="Stik&amp;Tines" prog="9" hbank="2" lbank="32"/>
+ <Patch name="Clavicomp" prog="10" hbank="2" lbank="32"/>
+ <Patch name="Clavatar" prog="11" hbank="2" lbank="32"/>
+ <Patch name="Harpsifunk" prog="12" hbank="2" lbank="32"/>
+ <Patch name="Mad Vibes" prog="13" hbank="2" lbank="32"/>
+ <Patch name="Woody Xylo" prog="14" hbank="2" lbank="32"/>
+ <Patch name="Potsticker" prog="15" hbank="2" lbank="32"/>
+ <Patch name="Watercan" prog="16" hbank="2" lbank="32"/>
+ <Patch name="Chiff Bell" prog="17" hbank="2" lbank="32"/>
+ <Patch name="Toy Bell" prog="18" hbank="2" lbank="32"/>
+ <Patch name="Tacko Bell" prog="19" hbank="2" lbank="32"/>
+ <Patch name="WhitrShade" prog="20" hbank="2" lbank="32"/>
+ <Patch name="BluesOrgan" prog="21" hbank="2" lbank="32"/>
+ <Patch name="GreasyOrgan" prog="22" hbank="2" lbank="32"/>
+ <Patch name="Organ 66" prog="23" hbank="2" lbank="32"/>
+ <Patch name="MetalOrgan" prog="24" hbank="2" lbank="32"/>
+ <Patch name="Full Ranks" prog="25" hbank="2" lbank="32"/>
+ <Patch name="SftPipeOrg" prog="26" hbank="2" lbank="32"/>
+ <Patch name="2 Drawbars" prog="27" hbank="2" lbank="32"/>
+ <Patch name="WrmAcrdion" prog="28" hbank="2" lbank="32"/>
+ <Patch name="JazzHrmnca" prog="29" hbank="2" lbank="32"/>
+ <Patch name="Acous6strg" prog="30" hbank="2" lbank="32"/>
+ <Patch name="Big Body12" prog="31" hbank="2" lbank="32"/>
+ <Patch name="Guitar Poem" prog="32" hbank="2" lbank="32"/>
+ <Patch name="ThickNylon" prog="33" hbank="2" lbank="32"/>
+ <Patch name="Silvertone" prog="34" hbank="2" lbank="32"/>
+ <Patch name="818 Guitar" prog="35" hbank="2" lbank="32"/>
+ <Patch name="Chunky" prog="36" hbank="2" lbank="32"/>
+ <Patch name="Rock Lead" prog="37" hbank="2" lbank="32"/>
+ <Patch name="CaralLezli" prog="38" hbank="2" lbank="32"/>
+ <Patch name="Ethnoplukk" prog="39" hbank="2" lbank="32"/>
+ <Patch name="FatUpright" prog="40" hbank="2" lbank="32"/>
+ <Patch name="Face Bass" prog="41" hbank="2" lbank="32"/>
+ <Patch name="Heavy Bass" prog="42" hbank="2" lbank="32"/>
+ <Patch name="GothamBass" prog="43" hbank="2" lbank="32"/>
+ <Patch name="No Frets!" prog="44" hbank="2" lbank="32"/>
+ <Patch name="House Bass" prog="45" hbank="2" lbank="32"/>
+ <Patch name="Rezzo Baze" prog="46" hbank="2" lbank="32"/>
+ <Patch name="StreetBass" prog="47" hbank="2" lbank="32"/>
+ <Patch name="TranceBass" prog="48" hbank="2" lbank="32"/>
+ <Patch name="Dist Bass" prog="49" hbank="2" lbank="32"/>
+ <Patch name="2 Violins" prog="50" hbank="2" lbank="32"/>
+ <Patch name="Violin Orc" prog="51" hbank="2" lbank="32"/>
+ <Patch name="Concerto" prog="52" hbank="2" lbank="32"/>
+ <Patch name="StringAura" prog="53" hbank="2" lbank="32"/>
+ <Patch name="OctaString" prog="54" hbank="2" lbank="32"/>
+ <Patch name="Strng&amp;Timp" prog="55" hbank="2" lbank="32"/>
+ <Patch name="SE Flange" prog="56" hbank="2" lbank="32"/>
+ <Patch name="SynStrings" prog="57" hbank="2" lbank="32"/>
+ <Patch name="Cello/Pizz" prog="58" hbank="2" lbank="32"/>
+ <Patch name="HeavenHarp" prog="59" hbank="2" lbank="32"/>
+ <Patch name="UseMWandAT" prog="60" hbank="2" lbank="32"/>
+ <Patch name="Mute&amp;Flute" prog="61" hbank="2" lbank="32"/>
+ <Patch name="RegalBones" prog="62" hbank="2" lbank="32"/>
+ <Patch name="Fhorn&amp;Bssn" prog="63" hbank="2" lbank="32"/>
+ <Patch name="ClsclHorns" prog="64" hbank="2" lbank="32"/>
+ <Patch name="ClscSynBrs" prog="65" hbank="2" lbank="32"/>
+ <Patch name="BrassTouch" prog="66" hbank="2" lbank="32"/>
+ <Patch name="Sfz Brass" prog="67" hbank="2" lbank="32"/>
+ <Patch name="BeBopHorns" prog="68" hbank="2" lbank="32"/>
+ <Patch name="Orchestra2" prog="69" hbank="2" lbank="32"/>
+ <Patch name="SingleFlut" prog="70" hbank="2" lbank="32"/>
+ <Patch name="Bottle Pad" prog="71" hbank="2" lbank="32"/>
+ <Patch name="PetersPipe" prog="72" hbank="2" lbank="32"/>
+ <Patch name="Hard Pipes" prog="73" hbank="2" lbank="32"/>
+ <Patch name="Wind Orch" prog="74" hbank="2" lbank="32"/>
+ <Patch name="VeryEnglsh" prog="75" hbank="2" lbank="32"/>
+ <Patch name="Brite Alto" prog="76" hbank="2" lbank="32"/>
+ <Patch name="Sax ouch" prog="77" hbank="2" lbank="32"/>
+ <Patch name="Wistelaan" prog="78" hbank="2" lbank="32"/>
+ <Patch name="Shamanixst" prog="79" hbank="2" lbank="32"/>
+ <Patch name="Nice Voice" prog="80" hbank="2" lbank="32"/>
+ <Patch name="Glory Ahhs" prog="81" hbank="2" lbank="32"/>
+ <Patch name="Dead Sea" prog="82" hbank="2" lbank="32"/>
+ <Patch name="Anasthesia" prog="83" hbank="2" lbank="32"/>
+ <Patch name="Sparks" prog="84" hbank="2" lbank="32"/>
+ <Patch name="Rain Pad" prog="85" hbank="2" lbank="32"/>
+ <Patch name="Pluck Pad" prog="86" hbank="2" lbank="32"/>
+ <Patch name="Outland" prog="87" hbank="2" lbank="32"/>
+ <Patch name="Swell Pad" prog="88" hbank="2" lbank="32"/>
+ <Patch name="Mirage" prog="89" hbank="2" lbank="32"/>
+ <Patch name="Blacksmith" prog="90" hbank="2" lbank="32"/>
+ <Patch name="Silk&amp;Satin" prog="91" hbank="2" lbank="32"/>
+ <Patch name="Synctax" prog="92" hbank="2" lbank="32"/>
+ <Patch name="Delecea" prog="93" hbank="2" lbank="32"/>
+ <Patch name="Comet Rain" prog="94" hbank="2" lbank="32"/>
+ <Patch name="Nitrous" prog="95" hbank="2" lbank="32"/>
+ <Patch name="Rez Blastz" prog="96" hbank="2" lbank="32"/>
+ <Patch name="Intertwine" prog="97" hbank="2" lbank="32"/>
+ <Patch name="Hold&amp;Sampl" prog="98" hbank="2" lbank="32"/>
+ <Patch name="Serengeti" prog="99" hbank="2" lbank="32"/>
+ <Patch name="VoltagePad" prog="100" hbank="2" lbank="32"/>
+ <Patch name="Taurus III" prog="101" hbank="2" lbank="32"/>
+ <Patch name="BladeRunnr" prog="102" hbank="2" lbank="32"/>
+ <Patch name="SynTrumpet" prog="103" hbank="2" lbank="32"/>
+ <Patch name="Triangular" prog="104" hbank="2" lbank="32"/>
+ <Patch name="PortaWheel" prog="105" hbank="2" lbank="32"/>
+ <Patch name="DiodeDoodl" prog="106" hbank="2" lbank="32"/>
+ <Patch name="SuperNova" prog="107" hbank="2" lbank="32"/>
+ <Patch name="Buzz Clip" prog="108" hbank="2" lbank="32"/>
+ <Patch name="Angelsynth" prog="109" hbank="2" lbank="32"/>
+ <Patch name="NineIncher" prog="110" hbank="2" lbank="32"/>
+ <Patch name="Wonderland" prog="111" hbank="2" lbank="32"/>
+ <Patch name="SyncoPress" prog="112" hbank="2" lbank="32"/>
+ <Patch name="Disco Boy" prog="113" hbank="2" lbank="32"/>
+ <Patch name="CrazyHorse" prog="114" hbank="2" lbank="32"/>
+ <Patch name="TheSandMan" prog="115" hbank="2" lbank="32"/>
+ <Patch name="OnionClock" prog="116" hbank="2" lbank="32"/>
+ <Patch name="RoboShop" prog="117" hbank="2" lbank="32"/>
+ <Patch name="TseTse Fly" prog="118" hbank="2" lbank="32"/>
+ <Patch name="Bat Cave" prog="119" hbank="2" lbank="32"/>
+ <Patch name="Pop Up Kit" prog="120" hbank="2" lbank="32"/>
+ <Patch name="UrbanBliss" prog="121" hbank="2" lbank="32"/>
+ <Patch name="Harlem Tek" prog="122" hbank="2" lbank="32"/>
+ <Patch name="Techno Kit" prog="123" hbank="2" lbank="32"/>
+ <Patch name="Dry70&apos;sKit" prog="124" hbank="2" lbank="32"/>
+ <Patch name="Gruvy Lube" prog="125" hbank="2" lbank="32"/>
+ <Patch name="Marktree" prog="126" hbank="2" lbank="32"/>
+ <Patch name="Danz Hitz" prog="127" hbank="2" lbank="32"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset3 Programs">
+ <Patch name="Stoneway" prog="0" hbank="3" lbank="32"/>
+ <Patch name="Piano&amp;Pad" prog="1" hbank="3" lbank="32"/>
+ <Patch name="Player Ori" prog="2" hbank="3" lbank="32"/>
+ <Patch name="SuperRoadz" prog="3" hbank="3" lbank="32"/>
+ <Patch name="SoftSuitcs" prog="4" hbank="3" lbank="32"/>
+ <Patch name="FM Tines" prog="5" hbank="3" lbank="32"/>
+ <Patch name="Balladeer" prog="6" hbank="3" lbank="32"/>
+ <Patch name="Electratak" prog="7" hbank="3" lbank="32"/>
+ <Patch name="TrampWurly" prog="8" hbank="3" lbank="32"/>
+ <Patch name="Bass&amp;Roadz" prog="9" hbank="3" lbank="32"/>
+ <Patch name="LiquidClav" prog="10" hbank="3" lbank="32"/>
+ <Patch name="ProfitClav" prog="11" hbank="3" lbank="32"/>
+ <Patch name="8&apos;4&apos;Harpsi" prog="12" hbank="3" lbank="32"/>
+ <Patch name="Elf Hammer" prog="13" hbank="3" lbank="32"/>
+ <Patch name="Strukit" prog="14" hbank="3" lbank="32"/>
+ <Patch name="Roundup" prog="15" hbank="3" lbank="32"/>
+ <Patch name="AlloyGlock" prog="16" hbank="3" lbank="32"/>
+ <Patch name="FairyBellz" prog="17" hbank="3" lbank="32"/>
+ <Patch name="Ice Bell" prog="18" hbank="3" lbank="32"/>
+ <Patch name="Waterphone" prog="19" hbank="3" lbank="32"/>
+ <Patch name="BigBadPerc" prog="20" hbank="3" lbank="32"/>
+ <Patch name="KeyClikOrg" prog="21" hbank="3" lbank="32"/>
+ <Patch name="Dist Organ" prog="22" hbank="3" lbank="32"/>
+ <Patch name="Survival" prog="23" hbank="3" lbank="32"/>
+ <Patch name="LFO Lezly" prog="24" hbank="3" lbank="32"/>
+ <Patch name="BritePipes" prog="25" hbank="3" lbank="32"/>
+ <Patch name="Gothic Org" prog="26" hbank="3" lbank="32"/>
+ <Patch name="KingsCourt" prog="27" hbank="3" lbank="32"/>
+ <Patch name="ClrAcrdion" prog="28" hbank="3" lbank="32"/>
+ <Patch name="PocketHarp" prog="29" hbank="3" lbank="32"/>
+ <Patch name="AcHarmonic" prog="30" hbank="3" lbank="32"/>
+ <Patch name="Gut Strung" prog="31" hbank="3" lbank="32"/>
+ <Patch name="Dulcioto" prog="32" hbank="3" lbank="32"/>
+ <Patch name="Steel Ride" prog="33" hbank="3" lbank="32"/>
+ <Patch name="PedalSteel" prog="34" hbank="3" lbank="32"/>
+ <Patch name="PassGuitar" prog="35" hbank="3" lbank="32"/>
+ <Patch name="PowerSplit" prog="36" hbank="3" lbank="32"/>
+ <Patch name="HeroHarmnx" prog="37" hbank="3" lbank="32"/>
+ <Patch name="Ethnoba" prog="38" hbank="3" lbank="32"/>
+ <Patch name="Ethnotal" prog="39" hbank="3" lbank="32"/>
+ <Patch name="SharpStick" prog="40" hbank="3" lbank="32"/>
+ <Patch name="Deep Bass" prog="41" hbank="3" lbank="32"/>
+ <Patch name="Roundwound" prog="42" hbank="3" lbank="32"/>
+ <Patch name="NuStudioBs" prog="43" hbank="3" lbank="32"/>
+ <Patch name="Octaver" prog="44" hbank="3" lbank="32"/>
+ <Patch name="SynAtkBass" prog="45" hbank="3" lbank="32"/>
+ <Patch name="Funky Acid" prog="46" hbank="3" lbank="32"/>
+ <Patch name="Dunce Biss" prog="47" hbank="3" lbank="32"/>
+ <Patch name="ArndsHouse" prog="48" hbank="3" lbank="32"/>
+ <Patch name="BassHarmnc" prog="49" hbank="3" lbank="32"/>
+ <Patch name="Dark Cello" prog="50" hbank="3" lbank="32"/>
+ <Patch name="Celli" prog="51" hbank="3" lbank="32"/>
+ <Patch name="RichString" prog="52" hbank="3" lbank="32"/>
+ <Patch name="SynthEnsmb" prog="53" hbank="3" lbank="32"/>
+ <Patch name="HugeString" prog="54" hbank="3" lbank="32"/>
+ <Patch name="Strng&amp;Perc" prog="55" hbank="3" lbank="32"/>
+ <Patch name="LushStrings" prog="56" hbank="3" lbank="32"/>
+ <Patch name="Ana String" prog="57" hbank="3" lbank="32"/>
+ <Patch name="Pizz Pluck" prog="58" hbank="3" lbank="32"/>
+ <Patch name="Harp Gliss" prog="59" hbank="3" lbank="32"/>
+ <Patch name="TrumpetEns" prog="60" hbank="3" lbank="32"/>
+ <Patch name="Orch Mutes" prog="61" hbank="3" lbank="32"/>
+ <Patch name="Tromb Ens" prog="62" hbank="3" lbank="32"/>
+ <Patch name="Ooh Horns" prog="63" hbank="3" lbank="32"/>
+ <Patch name="Hard Tuba" prog="64" hbank="3" lbank="32"/>
+ <Patch name="Matrix Brs" prog="65" hbank="3" lbank="32"/>
+ <Patch name="EssexBrass" prog="66" hbank="3" lbank="32"/>
+ <Patch name="HornExpans" prog="67" hbank="3" lbank="32"/>
+ <Patch name="Sax&amp;Brass" prog="68" hbank="3" lbank="32"/>
+ <Patch name="Fanfare" prog="69" hbank="3" lbank="32"/>
+ <Patch name="Hard Flute" prog="70" hbank="3" lbank="32"/>
+ <Patch name="Mutablow" prog="71" hbank="3" lbank="32"/>
+ <Patch name="PanBristle" prog="72" hbank="3" lbank="32"/>
+ <Patch name="Pastorale" prog="73" hbank="3" lbank="32"/>
+ <Patch name="Dark Winds" prog="74" hbank="3" lbank="32"/>
+ <Patch name="SprnoRcrdr" prog="75" hbank="3" lbank="32"/>
+ <Patch name="G. Soprano" prog="76" hbank="3" lbank="32"/>
+ <Patch name="BreathySax" prog="77" hbank="3" lbank="32"/>
+ <Patch name="Maze Lead" prog="78" hbank="3" lbank="32"/>
+ <Patch name="1001Nights" prog="79" hbank="3" lbank="32"/>
+ <Patch name="VelOooz&amp;Aaz" prog="80" hbank="3" lbank="32"/>
+ <Patch name="Atlantis" prog="81" hbank="3" lbank="32"/>
+ <Patch name="Hen-Ya" prog="82" hbank="3" lbank="32"/>
+ <Patch name="1stContact" prog="83" hbank="3" lbank="32"/>
+ <Patch name="Applewine" prog="84" hbank="3" lbank="32"/>
+ <Patch name="Amakudari" prog="85" hbank="3" lbank="32"/>
+ <Patch name="ChirpPluck" prog="86" hbank="3" lbank="32"/>
+ <Patch name="7th Wave" prog="87" hbank="3" lbank="32"/>
+ <Patch name="Tidal Wave" prog="88" hbank="3" lbank="32"/>
+ <Patch name="Nostromo" prog="89" hbank="3" lbank="32"/>
+ <Patch name="Chromaphon" prog="90" hbank="3" lbank="32"/>
+ <Patch name="Voice Bell" prog="91" hbank="3" lbank="32"/>
+ <Patch name="TinSynLead" prog="92" hbank="3" lbank="32"/>
+ <Patch name="Xpando Pad" prog="93" hbank="3" lbank="32"/>
+ <Patch name="HeavenCent" prog="94" hbank="3" lbank="32"/>
+ <Patch name="ShimmerPad" prog="95" hbank="3" lbank="32"/>
+ <Patch name="Laboratory" prog="96" hbank="3" lbank="32"/>
+ <Patch name="Red Aurora" prog="97" hbank="3" lbank="32"/>
+ <Patch name="Helical" prog="98" hbank="3" lbank="32"/>
+ <Patch name="Ice Forest" prog="99" hbank="3" lbank="32"/>
+ <Patch name="Synth Bite" prog="100" hbank="3" lbank="32"/>
+ <Patch name="Quentex" prog="101" hbank="3" lbank="32"/>
+ <Patch name="Zalfous" prog="102" hbank="3" lbank="32"/>
+ <Patch name="Brassy 5th" prog="103" hbank="3" lbank="32"/>
+ <Patch name="Alpha Lead" prog="104" hbank="3" lbank="32"/>
+ <Patch name="HighFunkLd" prog="105" hbank="3" lbank="32"/>
+ <Patch name="BriteRezzo" prog="106" hbank="3" lbank="32"/>
+ <Patch name="Wicked Owl" prog="107" hbank="3" lbank="32"/>
+ <Patch name="Zip Lead" prog="108" hbank="3" lbank="32"/>
+ <Patch name="T-Minus 1" prog="109" hbank="3" lbank="32"/>
+ <Patch name="New Waves" prog="110" hbank="3" lbank="32"/>
+ <Patch name="Rhythm X" prog="111" hbank="3" lbank="32"/>
+ <Patch name="Insta-Gig" prog="112" hbank="3" lbank="32"/>
+ <Patch name="Lung Gravy" prog="113" hbank="3" lbank="32"/>
+ <Patch name="Spec Perc" prog="114" hbank="3" lbank="32"/>
+ <Patch name="The Rat" prog="115" hbank="3" lbank="32"/>
+ <Patch name="Teknologiz" prog="116" hbank="3" lbank="32"/>
+ <Patch name="Gutteral" prog="117" hbank="3" lbank="32"/>
+ <Patch name="VoodooBeat" prog="118" hbank="3" lbank="32"/>
+ <Patch name="Final Dawn" prog="119" hbank="3" lbank="32"/>
+ <Patch name="Ambi Rock" prog="120" hbank="3" lbank="32"/>
+ <Patch name="Trash Canz" prog="121" hbank="3" lbank="32"/>
+ <Patch name="Destructo!" prog="122" hbank="3" lbank="32"/>
+ <Patch name="VocoderKit" prog="123" hbank="3" lbank="32"/>
+ <Patch name="15ips Kit" prog="124" hbank="3" lbank="32"/>
+ <Patch name="Trashy Kit" prog="125" hbank="3" lbank="32"/>
+ <Patch name="Rainstick" prog="126" hbank="3" lbank="32"/>
+ <Patch name="Hitz Peak" prog="127" hbank="3" lbank="32"/>
+ </PatchGroup>
+
+ <PatchGroup name="User Programs">
+ <Patch name="1" prog="0" hbank="0" lbank="32"/>
+ <Patch name="2" prog="1" hbank="0" lbank="32"/>
+ <Patch name="3" prog="2" hbank="0" lbank="32"/>
+ <Patch name="4" prog="3" hbank="0" lbank="32"/>
+ <Patch name="5" prog="4" hbank="0" lbank="32"/>
+ <Patch name="6" prog="5" hbank="0" lbank="32"/>
+ <Patch name="7" prog="6" hbank="0" lbank="32"/>
+ <Patch name="8" prog="7" hbank="0" lbank="32"/>
+ <Patch name="9" prog="8" hbank="0" lbank="32"/>
+ <Patch name="10" prog="9" hbank="0" lbank="32"/>
+ <Patch name="11" prog="10" hbank="0" lbank="32"/>
+ <Patch name="12" prog="11" hbank="0" lbank="32"/>
+ <Patch name="13" prog="12" hbank="0" lbank="32"/>
+ <Patch name="14" prog="13" hbank="0" lbank="32"/>
+ <Patch name="15" prog="14" hbank="0" lbank="32"/>
+ <Patch name="16" prog="15" hbank="0" lbank="32"/>
+ <Patch name="17" prog="16" hbank="0" lbank="32"/>
+ <Patch name="18" prog="17" hbank="0" lbank="32"/>
+ <Patch name="19" prog="18" hbank="0" lbank="32"/>
+ <Patch name="20" prog="19" hbank="0" lbank="32"/>
+ <Patch name="21" prog="20" hbank="0" lbank="32"/>
+ <Patch name="22" prog="21" hbank="0" lbank="32"/>
+ <Patch name="23" prog="22" hbank="0" lbank="32"/>
+ <Patch name="24" prog="23" hbank="0" lbank="32"/>
+ <Patch name="25" prog="24" hbank="0" lbank="32"/>
+ <Patch name="26" prog="25" hbank="0" lbank="32"/>
+ <Patch name="27" prog="26" hbank="0" lbank="32"/>
+ <Patch name="28" prog="27" hbank="0" lbank="32"/>
+ <Patch name="29" prog="28" hbank="0" lbank="32"/>
+ <Patch name="30" prog="29" hbank="0" lbank="32"/>
+ <Patch name="31" prog="30" hbank="0" lbank="32"/>
+ <Patch name="32" prog="31" hbank="0" lbank="32"/>
+ <Patch name="33" prog="32" hbank="0" lbank="32"/>
+ <Patch name="34" prog="33" hbank="0" lbank="32"/>
+ <Patch name="35" prog="34" hbank="0" lbank="32"/>
+ <Patch name="36" prog="35" hbank="0" lbank="32"/>
+ <Patch name="37" prog="36" hbank="0" lbank="32"/>
+ <Patch name="38" prog="37" hbank="0" lbank="32"/>
+ <Patch name="39" prog="38" hbank="0" lbank="32"/>
+ <Patch name="40" prog="39" hbank="0" lbank="32"/>
+ <Patch name="41" prog="40" hbank="0" lbank="32"/>
+ <Patch name="42" prog="41" hbank="0" lbank="32"/>
+ <Patch name="43" prog="42" hbank="0" lbank="32"/>
+ <Patch name="44" prog="43" hbank="0" lbank="32"/>
+ <Patch name="45" prog="44" hbank="0" lbank="32"/>
+ <Patch name="46" prog="45" hbank="0" lbank="32"/>
+ <Patch name="47" prog="46" hbank="0" lbank="32"/>
+ <Patch name="48" prog="47" hbank="0" lbank="32"/>
+ <Patch name="49" prog="48" hbank="0" lbank="32"/>
+ <Patch name="50" prog="49" hbank="0" lbank="32"/>
+ <Patch name="51" prog="50" hbank="0" lbank="32"/>
+ <Patch name="52" prog="51" hbank="0" lbank="32"/>
+ <Patch name="53" prog="52" hbank="0" lbank="32"/>
+ <Patch name="54" prog="53" hbank="0" lbank="32"/>
+ <Patch name="55" prog="54" hbank="0" lbank="32"/>
+ <Patch name="56" prog="55" hbank="0" lbank="32"/>
+ <Patch name="57" prog="56" hbank="0" lbank="32"/>
+ <Patch name="58" prog="57" hbank="0" lbank="32"/>
+ <Patch name="59" prog="58" hbank="0" lbank="32"/>
+ <Patch name="60" prog="59" hbank="0" lbank="32"/>
+ <Patch name="61" prog="60" hbank="0" lbank="32"/>
+ <Patch name="62" prog="61" hbank="0" lbank="32"/>
+ <Patch name="63" prog="62" hbank="0" lbank="32"/>
+ <Patch name="64" prog="63" hbank="0" lbank="32"/>
+ <Patch name="65" prog="64" hbank="0" lbank="32"/>
+ <Patch name="66" prog="65" hbank="0" lbank="32"/>
+ <Patch name="67" prog="66" hbank="0" lbank="32"/>
+ <Patch name="68" prog="67" hbank="0" lbank="32"/>
+ <Patch name="69" prog="68" hbank="0" lbank="32"/>
+ <Patch name="70" prog="69" hbank="0" lbank="32"/>
+ <Patch name="71" prog="70" hbank="0" lbank="32"/>
+ <Patch name="72" prog="71" hbank="0" lbank="32"/>
+ <Patch name="73" prog="72" hbank="0" lbank="32"/>
+ <Patch name="74" prog="73" hbank="0" lbank="32"/>
+ <Patch name="75" prog="74" hbank="0" lbank="32"/>
+ <Patch name="76" prog="75" hbank="0" lbank="32"/>
+ <Patch name="77" prog="76" hbank="0" lbank="32"/>
+ <Patch name="78" prog="77" hbank="0" lbank="32"/>
+ <Patch name="79" prog="78" hbank="0" lbank="32"/>
+ <Patch name="80" prog="79" hbank="0" lbank="32"/>
+ <Patch name="81" prog="80" hbank="0" lbank="32"/>
+ <Patch name="82" prog="81" hbank="0" lbank="32"/>
+ <Patch name="83" prog="82" hbank="0" lbank="32"/>
+ <Patch name="84" prog="83" hbank="0" lbank="32"/>
+ <Patch name="85" prog="84" hbank="0" lbank="32"/>
+ <Patch name="86" prog="85" hbank="0" lbank="32"/>
+ <Patch name="87" prog="86" hbank="0" lbank="32"/>
+ <Patch name="88" prog="87" hbank="0" lbank="32"/>
+ <Patch name="89" prog="88" hbank="0" lbank="32"/>
+ <Patch name="90" prog="89" hbank="0" lbank="32"/>
+ <Patch name="91" prog="90" hbank="0" lbank="32"/>
+ <Patch name="92" prog="91" hbank="0" lbank="32"/>
+ <Patch name="93" prog="92" hbank="0" lbank="32"/>
+ <Patch name="94" prog="93" hbank="0" lbank="32"/>
+ <Patch name="95" prog="94" hbank="0" lbank="32"/>
+ <Patch name="96" prog="95" hbank="0" lbank="32"/>
+ <Patch name="97" prog="96" hbank="0" lbank="32"/>
+ <Patch name="98" prog="97" hbank="0" lbank="32"/>
+ <Patch name="99" prog="98" hbank="0" lbank="32"/>
+ <Patch name="100" prog="99" hbank="0" lbank="32"/>
+ <Patch name="101" prog="100" hbank="0" lbank="32"/>
+ <Patch name="102" prog="101" hbank="0" lbank="32"/>
+ <Patch name="103" prog="102" hbank="0" lbank="32"/>
+ <Patch name="104" prog="103" hbank="0" lbank="32"/>
+ <Patch name="105" prog="104" hbank="0" lbank="32"/>
+ <Patch name="106" prog="105" hbank="0" lbank="32"/>
+ <Patch name="107" prog="106" hbank="0" lbank="32"/>
+ <Patch name="108" prog="107" hbank="0" lbank="32"/>
+ <Patch name="109" prog="108" hbank="0" lbank="32"/>
+ <Patch name="110" prog="109" hbank="0" lbank="32"/>
+ <Patch name="111" prog="110" hbank="0" lbank="32"/>
+ <Patch name="112" prog="111" hbank="0" lbank="32"/>
+ <Patch name="113" prog="112" hbank="0" lbank="32"/>
+ <Patch name="114" prog="113" hbank="0" lbank="32"/>
+ <Patch name="115" prog="114" hbank="0" lbank="32"/>
+ <Patch name="116" prog="115" hbank="0" lbank="32"/>
+ <Patch name="117" prog="116" hbank="0" lbank="32"/>
+ <Patch name="118" prog="117" hbank="0" lbank="32"/>
+ <Patch name="119" prog="118" hbank="0" lbank="32"/>
+ <Patch name="120" prog="119" hbank="0" lbank="32"/>
+ <Patch name="121" prog="120" hbank="0" lbank="32"/>
+ <Patch name="122" prog="121" hbank="0" lbank="32"/>
+ <Patch name="123" prog="122" hbank="0" lbank="32"/>
+ <Patch name="124" prog="123" hbank="0" lbank="32"/>
+ <Patch name="125" prog="124" hbank="0" lbank="32"/>
+ <Patch name="126" prog="125" hbank="0" lbank="32"/>
+ <Patch name="127" prog="126" hbank="0" lbank="32"/>
+ <Patch name="128" prog="127" hbank="0" lbank="32"/>
+ </PatchGroup>
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/CMakeLists.txt b/muse/share/instruments/CMakeLists.txt
new file mode 100644
index 00000000..d0fc11dc
--- /dev/null
+++ b/muse/share/instruments/CMakeLists.txt
@@ -0,0 +1,22 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+install_files( /share/muse-1.0pre1/instruments .*\\.idf )
+
diff --git a/muse/share/instruments/Hammond_XB-1.idf b/muse/share/instruments/Hammond_XB-1.idf
new file mode 100644
index 00000000..6ac9b951
--- /dev/null
+++ b/muse/share/instruments/Hammond_XB-1.idf
@@ -0,0 +1,88 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Hammond XB-1">
+ <PatchGroup name="Cancel">
+ <Patch name="Cancel" prog="000" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Bank A">
+ <Patch name="A-1" prog="001" hbank="0" lbank="0"/>
+ <Patch name="A-2" prog="002" hbank="0" lbank="0"/>
+ <Patch name="A-3" prog="003" hbank="0" lbank="0"/>
+ <Patch name="A-4" prog="004" hbank="0" lbank="0"/>
+ <Patch name="A-5" prog="005" hbank="0" lbank="0"/>
+ <Patch name="A-6" prog="006" hbank="0" lbank="0"/>
+ <Patch name="A-7" prog="007" hbank="0" lbank="0"/>
+ <Patch name="A-8" prog="008" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Bank B">
+ <Patch name="B-1" prog="009" hbank="0" lbank="0"/>
+ <Patch name="B-2" prog="010" hbank="0" lbank="0"/>
+ <Patch name="B-3" prog="011" hbank="0" lbank="0"/>
+ <Patch name="B-4" prog="012" hbank="0" lbank="0"/>
+ <Patch name="B-5" prog="013" hbank="0" lbank="0"/>
+ <Patch name="B-6" prog="014" hbank="0" lbank="0"/>
+ <Patch name="B-7" prog="015" hbank="0" lbank="0"/>
+ <Patch name="B-8" prog="016" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Bank C">
+ <Patch name="C-1" prog="017" hbank="0" lbank="0"/>
+ <Patch name="C-2" prog="018" hbank="0" lbank="0"/>
+ <Patch name="C-3" prog="019" hbank="0" lbank="0"/>
+ <Patch name="C-4" prog="020" hbank="0" lbank="0"/>
+ <Patch name="C-5" prog="021" hbank="0" lbank="0"/>
+ <Patch name="C-6" prog="022" hbank="0" lbank="0"/>
+ <Patch name="C-7" prog="023" hbank="0" lbank="0"/>
+ <Patch name="C-8" prog="024" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Bank D">
+ <Patch name="D-1" prog="025" hbank="0" lbank="0"/>
+ <Patch name="D-2" prog="026" hbank="0" lbank="0"/>
+ <Patch name="D-3" prog="027" hbank="0" lbank="0"/>
+ <Patch name="D-4" prog="028" hbank="0" lbank="0"/>
+ <Patch name="D-5" prog="029" hbank="0" lbank="0"/>
+ <Patch name="D-6" prog="030" hbank="0" lbank="0"/>
+ <Patch name="D-7" prog="031" hbank="0" lbank="0"/>
+ <Patch name="D-8" prog="032" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Bank E">
+ <Patch name="E-1" prog="033" hbank="0" lbank="0"/>
+ <Patch name="E-2" prog="034" hbank="0" lbank="0"/>
+ <Patch name="E-3" prog="035" hbank="0" lbank="0"/>
+ <Patch name="E-4" prog="036" hbank="0" lbank="0"/>
+ <Patch name="E-5" prog="037" hbank="0" lbank="0"/>
+ <Patch name="E-6" prog="038" hbank="0" lbank="0"/>
+ <Patch name="E-7" prog="039" hbank="0" lbank="0"/>
+ <Patch name="E-8" prog="040" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Bank F">
+ <Patch name="F-1" prog="041" hbank="0" lbank="0"/>
+ <Patch name="F-2" prog="042" hbank="0" lbank="0"/>
+ <Patch name="F-3" prog="043" hbank="0" lbank="0"/>
+ <Patch name="F-4" prog="044" hbank="0" lbank="0"/>
+ <Patch name="F-5" prog="045" hbank="0" lbank="0"/>
+ <Patch name="F-6" prog="046" hbank="0" lbank="0"/>
+ <Patch name="F-7" prog="047" hbank="0" lbank="0"/>
+ <Patch name="F-8" prog="048" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Bank G">
+ <Patch name="G-1" prog="049" hbank="0" lbank="0"/>
+ <Patch name="G-2" prog="050" hbank="0" lbank="0"/>
+ <Patch name="G-3" prog="051" hbank="0" lbank="0"/>
+ <Patch name="G-4" prog="052" hbank="0" lbank="0"/>
+ <Patch name="G-5" prog="053" hbank="0" lbank="0"/>
+ <Patch name="G-6" prog="054" hbank="0" lbank="0"/>
+ <Patch name="G-7" prog="055" hbank="0" lbank="0"/>
+ <Patch name="G-8" prog="056" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Bank H">
+ <Patch name="H-1" prog="057" hbank="0" lbank="0"/>
+ <Patch name="H-2" prog="058" hbank="0" lbank="0"/>
+ <Patch name="H-3" prog="059" hbank="0" lbank="0"/>
+ <Patch name="H-4" prog="060" hbank="0" lbank="0"/>
+ <Patch name="H-5" prog="061" hbank="0" lbank="0"/>
+ <Patch name="H-6" prog="062" hbank="0" lbank="0"/>
+ <Patch name="H-7" prog="063" hbank="0" lbank="0"/>
+ <Patch name="H-8" prog="064" hbank="0" lbank="0"/>
+ </PatchGroup>
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/MC303.idf b/muse/share/instruments/MC303.idf
new file mode 100644
index 00000000..308e897c
--- /dev/null
+++ b/muse/share/instruments/MC303.idf
@@ -0,0 +1,528 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="MC303">
+ <PatchGroup name="Bank 01 Synthesizer">
+ <Patch name="Lead TB 1" hbank="64" lbank="0" prog="0"/>
+ <Patch name="Lead TB 2" hbank="65" lbank="0" prog="0"/>
+ <Patch name="Wow TB" hbank="66" lbank="0" prog="0"/>
+ <Patch name="Lead TB 3" hbank="67" lbank="0" prog="0"/>
+ <Patch name="MG Saw" hbank="64" lbank="0" prog="1"/>
+ <Patch name="Voc.Saw" hbank="65" lbank="0" prog="1"/>
+ <Patch name="Cheese Saw" hbank="66" lbank="0" prog="1"/>
+ <Patch name="Saw Lead" hbank="67" lbank="0" prog="1"/>
+ <Patch name="Calc.Saw" hbank="68" lbank="0" prog="1"/>
+ <Patch name="OB2 Saw 1" hbank="69" lbank="0" prog="1"/>
+ <Patch name="Juno6 Saw" hbank="70" lbank="0" prog="1"/>
+ <Patch name="JP8 Pls 1" hbank="71" lbank="0" prog="1"/>
+ <Patch name="MG Pls 1" hbank="72" lbank="0" prog="1"/>
+ <Patch name="Flicker Pls" hbank="73" lbank="0" prog="1"/>
+ <Patch name="Tri Lead 1" hbank="64" lbank="0" prog="2"/>
+ <Patch name="Tri Lead 2" hbank="65" lbank="0" prog="2"/>
+ <Patch name="PR5 Squ.1" hbank="66" lbank="0" prog="2"/>
+ <Patch name="JU2 SubOsc" hbank="64" lbank="0" prog="3"/>
+ <Patch name="Frog Wave" hbank="65" lbank="0" prog="3"/>
+ <Patch name="Seq.Synth" hbank="64" lbank="0" prog="4"/>
+ <Patch name="PolySynth" hbank="65" lbank="0" prog="4"/>
+ <Patch name="JP8 Pls.2" hbank="66" lbank="0" prog="4"/>
+ <Patch name="JP8 Squ" hbank="67" lbank="0" prog="4"/>
+ <Patch name="260 Pls.90" hbank="68" lbank="0" prog="4"/>
+ <Patch name="Reso.Pls" hbank="69" lbank="0" prog="4"/>
+ <Patch name="Reso.Stack" hbank="70" lbank="0" prog="4"/>
+ <Patch name="Soft Lead" hbank="64" lbank="0" prog="5"/>
+ <Patch name="8DV Saw 1" hbank="65" lbank="0" prog="5"/>
+ <Patch name="PR5 Saw 1" hbank="66" lbank="0" prog="5"/>
+ <Patch name="D50 Saw" hbank="67" lbank="0" prog="5"/>
+ <Patch name="MG Sweep" hbank="64" lbank="0" prog="6"/>
+ <Patch name="Sweep Lead" hbank="65" lbank="0" prog="6"/>
+ <Patch name="Vocoderman" hbank="66" lbank="0" prog="6"/>
+ <Patch name="4th Lead 1" hbank="64" lbank="0" prog="7"/>
+ <Patch name="4th Lead 2" hbank="65" lbank="0" prog="7"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Bass">
+ <Patch name="Normal TB" hbank="64" lbank="0" prog="8"/>
+ <Patch name="Dist.TB 1" hbank="65" lbank="0" prog="8"/>
+ <Patch name="Dist.TB 2" hbank="66" lbank="0" prog="8"/>
+ <Patch name="Acid TB 1" hbank="67" lbank="0" prog="8"/>
+ <Patch name="Acid TB 2" hbank="68" lbank="0" prog="8"/>
+ <Patch name="Acid TB 3" hbank="69" lbank="0" prog="8"/>
+ <Patch name="Acid TB 4" hbank="70" lbank="0" prog="8"/>
+ <Patch name="101 Bass 1" hbank="64" lbank="0" prog="9"/>
+ <Patch name="101 Bass 2" hbank="65" lbank="0" prog="9"/>
+ <Patch name="101 Bass 3" hbank="66" lbank="0" prog="9"/>
+ <Patch name="House Bass" hbank="67" lbank="0" prog="9"/>
+ <Patch name="Sine Bass" hbank="68" lbank="0" prog="9"/>
+ <Patch name="Dub Bass" hbank="69" lbank="0" prog="9"/>
+ <Patch name="Pizz.Bass" hbank="64" lbank="0" prog="10"/>
+ <Patch name="MG Bass 1" hbank="64" lbank="0" prog="11"/>
+ <Patch name="MG Bass 2" hbank="65" lbank="0" prog="11"/>
+ <Patch name="MG Bass 3" hbank="66" lbank="0" prog="11"/>
+ <Patch name="MG Bass 4" hbank="67" lbank="0" prog="11"/>
+ <Patch name="FM Super Bs" hbank="68" lbank="0" prog="11"/>
+ <Patch name="Cheese Bass" hbank="69" lbank="0" prog="11"/>
+ <Patch name="Syn.SB Bass" hbank="70" lbank="0" prog="11"/>
+ <Patch name="Blip Bass" hbank="64" lbank="0" prog="12"/>
+ <Patch name="KGP Bass" hbank="65" lbank="0" prog="12"/>
+ <Patch name="TBMG Bass 1" hbank="66" lbank="0" prog="12"/>
+ <Patch name="MG Bass5" hbank="67" lbank="0" prog="12"/>
+ <Patch name="JPMG Bass" hbank="68" lbank="0" prog="12"/>
+ <Patch name="Click Bass" hbank="69" lbank="0" prog="12"/>
+ <Patch name="KMP Bass" hbank="70" lbank="0" prog="12"/>
+ <Patch name="Osc.Bass" hbank="71" lbank="0" prog="12"/>
+ <Patch name="Reso.Bass" hbank="64" lbank="0" prog="13"/>
+ <Patch name="Wow MG Bass" hbank="65" lbank="0" prog="13"/>
+ <Patch name="Wow 101 Bass" hbank="66" lbank="0" prog="13"/>
+ <Patch name="Sweep Wow Bass" hbank="67" lbank="0" prog="13"/>
+ <Patch name="MG 5th Bass" hbank="68" lbank="0" prog="13"/>
+ <Patch name="Doom Bass" hbank="69" lbank="0" prog="13"/>
+ <Patch name="Rubber Bass 1" hbank="70" lbank="0" prog="13"/>
+ <Patch name="Rubber Bass 2" hbank="71" lbank="0" prog="13"/>
+ <Patch name="Acid Bass" hbank="64" lbank="0" prog="14"/>
+ <Patch name="Bubble Bass" hbank="65" lbank="0" prog="14"/>
+ <Patch name="Organ Bass" hbank="64" lbank="0" prog="15"/>
+ </PatchGroup>
+ <PatchGroup name="Bass Guitar">
+ <Patch name="Ac.Bass 1" hbank="64" lbank="0" prog="16"/>
+ <Patch name="AC.Bass 2" hbank="65" lbank="0" prog="16"/>
+ <Patch name="Fingered Bs 1" hbank="64" lbank="0" prog="17"/>
+ <Patch name="Fingered Bs 2" hbank="65" lbank="0" prog="17"/>
+ <Patch name="Picked Bass 1" hbank="64" lbank="0" prog="18"/>
+ <Patch name="Dust Pick Bass" hbank="65" lbank="0" prog="18"/>
+ <Patch name="Picked Bass 2" hbank="66" lbank="0" prog="18"/>
+ <Patch name="Fretless Bass" hbank="64" lbank="0" prog="19"/>
+ <Patch name="Slap Bass 1" hbank="64" lbank="0" prog="20"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Stack">
+ <Patch name="Syn.Stack 1" hbank="64" lbank="0" prog="21"/>
+ <Patch name="Oct.Stack" hbank="65" lbank="0" prog="21"/>
+ <Patch name="Syn.Stack 2" hbank="66" lbank="0" prog="21"/>
+ <Patch name="Saw Stack" hbank="67" lbank="0" prog="21"/>
+ <Patch name="Syn.SB 1" hbank="64" lbank="0" prog="22"/>
+ <Patch name="Syn.SB 2" hbank="65" lbank="0" prog="22"/>
+ <Patch name="Brass Perc." hbank="66" lbank="0" prog="22"/>
+ <Patch name="Dirty SB" hbank="67" lbank="0" prog="22"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Pad">
+ <Patch name="Atmosphere" hbank="64" lbank="0" prog="23"/>
+ <Patch name="Feedback Wave" hbank="65" lbank="0" prog="23"/>
+ <Patch name="X-MOD" hbank="66" lbank="0" prog="23"/>
+ <Patch name="Pacifica" hbank="67" lbank="0" prog="23"/>
+ <Patch name="7th Atom" hbank="68" lbank="0" prog="23"/>
+ <Patch name="Outer Space" hbank="69" lbank="0" prog="23"/>
+ <Patch name="Rev.Atom" hbank="70" lbank="0" prog="23"/>
+ <Patch name="2.2 Pad" hbank="64" lbank="0" prog="24"/>
+ <Patch name="Jungle Pad" hbank="65" lbank="0" prog="24"/>
+ <Patch name="Psycho Pad" hbank="66" lbank="0" prog="24"/>
+ <Patch name="Pipe Pad" hbank="67" lbank="0" prog="24"/>
+ <Patch name="Ambient Pad" hbank="68" lbank="0" prog="24"/>
+ <Patch name="Flanger Pad" hbank="69" lbank="0" prog="24"/>
+ <Patch name="Bell Pad" hbank="64" lbank="0" prog="25"/>
+ <Patch name="7th Bell Pad" hbank="65" lbank="0" prog="25"/>
+ <Patch name="Fantasia" hbank="66" lbank="0" prog="25"/>
+ <Patch name="Crystal" hbank="67" lbank="0" prog="25"/>
+ <Patch name="Exo.Bell Pad" hbank="68" lbank="0" prog="25"/>
+ <Patch name="Echo Bell" hbank="69" lbank="0" prog="25"/>
+ <Patch name="Warm Pad" hbank="64" lbank="0" prog="26"/>
+ <Patch name="Soundtrack" hbank="65" lbank="0" prog="26"/>
+ <Patch name="Oct.Pad" hbank="66" lbank="0" prog="26"/>
+ <Patch name="OB Str. Pad" hbank="67" lbank="0" prog="26"/>
+ <Patch name="X-MOD Pad" hbank="68" lbank="0" prog="26"/>
+ <Patch name="Sweep Pad 1" hbank="69" lbank="0" prog="26"/>
+ <Patch name="Sweep Pad 2" hbank="70" lbank="0" prog="26"/>
+ <Patch name="OB Soft Pad" hbank="71" lbank="0" prog="26"/>
+ <Patch name="Goblin" hbank="72" lbank="0" prog="26"/>
+ <Patch name="Echo Drops" hbank="73" lbank="0" prog="26"/>
+ <Patch name="Random Pad" hbank="64" lbank="0" prog="27"/>
+ <Patch name="LFO Sweep" hbank="65" lbank="0" prog="27"/>
+ <Patch name="Horror Pad" hbank="66" lbank="0" prog="27"/>
+ <Patch name="Pulse Key Pad" hbank="67" lbank="0" prog="27"/>
+ </PatchGroup>
+ <PatchGroup name="Strings">
+ <Patch name="Real Strings 1" hbank="64" lbank="0" prog="28"/>
+ <Patch name="Real Strings 2" hbank="65" lbank="0" prog="28"/>
+ <Patch name="Auh Strings" hbank="64" lbank="0" prog="29"/>
+ <Patch name="Hi Strings" hbank="65" lbank="0" prog="29"/>
+ <Patch name="Syn.Strings 1" hbank="66" lbank="0" prog="29"/>
+ <Patch name="Syn.Strings 2" hbank="67" lbank="0" prog="29"/>
+ <Patch name="Syn.Strings 3" hbank="68" lbank="0" prog="29"/>
+ <Patch name="Noise Strings" hbank="64" lbank="0" prog="30"/>
+ <Patch name="RND Strings" hbank="65" lbank="0" prog="30"/>
+ <Patch name="LFO Strings" hbank="66" lbank="0" prog="30"/>
+ <Patch name="Slow Strings" hbank="64" lbank="0" prog="31"/>
+ <Patch name="Slow SynStr" hbank="65" lbank="0" prog="31"/>
+ <Patch name="Pizzicato Str" hbank="64" lbank="0" prog="32"/>
+ </PatchGroup>
+ <PatchGroup name="Voice">
+ <Patch name="Choir Auhs" hbank="64" lbank="0" prog="33"/>
+ <Patch name="Space Voice" hbank="64" lbank="0" prog="34"/>
+ <Patch name="Sweepvox" hbank="65" lbank="0" prog="34"/>
+ <Patch name="Synthvox 1" hbank="66" lbank="0" prog="34"/>
+ <Patch name="Auhs" hbank="67" lbank="0" prog="34"/>
+ <Patch name="Synthvox 2" hbank="68" lbank="0" prog="34"/>
+ <Patch name="Leadvox" hbank="69" lbank="0" prog="34"/>
+ <Patch name="Auh Auh" hbank="70" lbank="0" prog="34"/>
+ <Patch name="Sky Vox" hbank="71" lbank="0" prog="34"/>
+ <Patch name="Auhbient" hbank="72" lbank="0" prog="34"/>
+ <Patch name="Vibravox" hbank="73" lbank="0" prog="34"/>
+ <Patch name="Noisevox" hbank="74" lbank="0" prog="34"/>
+ </PatchGroup>
+ <PatchGroup name="Synth FX">
+ <Patch name="UFO FX" hbank="64" lbank="0" prog="35"/>
+ <Patch name="Saw in Saw" hbank="65" lbank="0" prog="35"/>
+ <Patch name="Feed Bell" hbank="66" lbank="0" prog="35"/>
+ <Patch name="Abduction" hbank="67" lbank="0" prog="35"/>
+ <Patch name="Loop Sweep" hbank="68" lbank="0" prog="35"/>
+ <Patch name="UP FX" hbank="69" lbank="0" prog="35"/>
+ <Patch name="Robocoder" hbank="70" lbank="0" prog="35"/>
+ <Patch name="Noise Grow" hbank="71" lbank="0" prog="35"/>
+ <Patch name="LFO Techno" hbank="64" lbank="0" prog="36"/>
+ <Patch name="Calculating" hbank="65" lbank="0" prog="36"/>
+ <Patch name="Emergency!" hbank="66" lbank="0" prog="36"/>
+ <Patch name="FX Beats" hbank="67" lbank="0" prog="36"/>
+ <Patch name="Analog FX" hbank="68" lbank="0" prog="36"/>
+ <Patch name="Transformer" hbank="69" lbank="0" prog="36"/>
+ <Patch name="Dusty Scratch" hbank="70" lbank="0" prog="36"/>
+ <Patch name="Space Worms" hbank="71" lbank="0" prog="36"/>
+ <Patch name="Winky Worms" hbank="72" lbank="0" prog="36"/>
+ </PatchGroup>
+ <PatchGroup name="Noise">
+ <Patch name="PR5 Noise1" hbank="64" lbank="0" prog="37"/>
+ <Patch name="PR5 Noise2" hbank="65" lbank="0" prog="37"/>
+ <Patch name="Pink Noice" hbank="66" lbank="0" prog="37"/>
+ <Patch name="White Noise" hbank="67" lbank="0" prog="37"/>
+ <Patch name="Bomb Wind" hbank="64" lbank="0" prog="38"/>
+ <Patch name="Syn.Wind" hbank="65" lbank="0" prog="38"/>
+ <Patch name="Vinyl Noise" hbank="66" lbank="0" prog="38"/>
+ <Patch name="Noise Snare" hbank="67" lbank="0" prog="38"/>
+ <Patch name="Explanation" hbank="64" lbank="0" prog="39"/>
+ <Patch name="Pink Bomb" hbank="65" lbank="0" prog="39"/>
+ </PatchGroup>
+ <PatchGroup name="Piano">
+ <Patch name="Ac.Piano" hbank="64" lbank="0" prog="40"/>
+ <Patch name="Bright Piano" hbank="65" lbank="0" prog="40"/>
+ <Patch name="E.Piano 1" hbank="64" lbank="0" prog="41"/>
+ <Patch name="E.Piano 2" hbank="65" lbank="0" prog="41"/>
+ <Patch name="E.Piano 3" hbank="66" lbank="0" prog="41"/>
+ <Patch name="E.Piano 4" hbank="67" lbank="0" prog="41"/>
+ <Patch name="Org.E.Piano" hbank="64" lbank="0" prog="42"/>
+ <Patch name="Noise Piano" hbank="65" lbank="0" prog="42"/>
+ <Patch name="Clav" hbank="64" lbank="0" prog="43"/>
+ <Patch name="Ana.Clav" hbank="65" lbank="0" prog="43"/>
+ <Patch name="Digi.Clav" hbank="66" lbank="0" prog="43"/>
+ </PatchGroup>
+ <PatchGroup name="Organ">
+ <Patch name="Organ 1" hbank="64" lbank="0" prog="44"/>
+ <Patch name="Lp-Hp Organ" hbank="65" lbank="0" prog="44"/>
+ <Patch name="Organ 2" hbank="64" lbank="0" prog="45"/>
+ <Patch name="Percsv Organ" hbank="65" lbank="0" prog="45"/>
+ <Patch name="Slow Organ" hbank="64" lbank="0" prog="46"/>
+ <Patch name="Smokey Org.Chrd" hbank="64" lbank="0" prog="47"/>
+ <Patch name="Organ Chord" hbank="65" lbank="0" prog="47"/>
+ <Patch name="'60s Organ" hbank="64" lbank="0" prog="48"/>
+ <Patch name="Dist.Organ" hbank="64" lbank="0" prog="49"/>
+ <Patch name="Church Org.1" hbank="64" lbank="0" prog="50"/>
+ <Patch name="Organ Loop" hbank="64" lbank="0" prog="51"/>
+ <Patch name="LF-Organ" hbank="65" lbank="0" prog="51"/>
+ </PatchGroup>
+ <PatchGroup name="Chromatic Percussion">
+ <Patch name="Glockenspiel" hbank="64" lbank="0" prog="52"/>
+ <Patch name="Vibraphone" hbank="65" lbank="0" prog="52"/>
+ <Patch name="Beat Glocken" hbank="66" lbank="0" prog="52"/>
+ <Patch name="Marimba" hbank="67" lbank="0" prog="52"/>
+ <Patch name="Timpani" hbank="64" lbank="0" prog="53"/>
+ <Patch name="Steel Drums" hbank="65" lbank="0" prog="53"/>
+ <Patch name="Sqr. Perc." hbank="64" lbank="0" prog="54"/>
+ <Patch name="Juno Bell" hbank="65" lbank="0" prog="54"/>
+ <Patch name="MG Perc" hbank="66" lbank="0" prog="54"/>
+ <Patch name="Perc.Glass" hbank="67" lbank="0" prog="54"/>
+ </PatchGroup>
+ <PatchGroup name="Bell">
+ <Patch name="Tubular Bell" hbank="64" lbank="0" prog="55"/>
+ <Patch name="Vib. Bell" hbank="65" lbank="0" prog="55"/>
+ <Patch name="7th Bells" hbank="64" lbank="0" prog="56"/>
+ <Patch name="Ring Bell" hbank="65" lbank="0" prog="56"/>
+ <Patch name="Digi.Bell 1" hbank="66" lbank="0" prog="56"/>
+ <Patch name="Ring Mod" hbank="67" lbank="0" prog="56"/>
+ <Patch name="Digi.Bell 2" hbank="68" lbank="0" prog="56"/>
+ <Patch name="Dirty Bell 1" hbank="69" lbank="0" prog="56"/>
+ <Patch name="Dirty Bell 2" hbank="70" lbank="0" prog="56"/>
+ <Patch name="Digi.Bell 3" hbank="71" lbank="0" prog="56"/>
+ </PatchGroup>
+ <PatchGroup name="Guitar">
+ <Patch name="Steel Str.Gt" hbank="64" lbank="0" prog="57"/>
+ <Patch name="12str.Guitar" hbank="65" lbank="0" prog="57"/>
+ <Patch name="Jazz Guitar" hbank="64" lbank="0" prog="58"/>
+ <Patch name="Clean Guitar" hbank="65" lbank="0" prog="58"/>
+ <Patch name="Distortion Guitar" hbank="66" lbank="0" prog="58"/>
+ <Patch name="Gt.Harmonics" hbank="67" lbank="0" prog="58"/>
+ <Patch name="Acid Guitar 1" hbank="64" lbank="0" prog="59"/>
+ <Patch name="Acid Guitar 2" hbank="65" lbank="0" prog="59"/>
+ <Patch name="Jazz Steel Guitar" hbank="66" lbank="0" prog="59"/>
+ <Patch name="Sitar Guitar" hbank="67" lbank="0" prog="59"/>
+ <Patch name="Wah Guitar" hbank="68" lbank="0" prog="59"/>
+ </PatchGroup>
+ <PatchGroup name="Brass Section">
+ <Patch name="Brass 1" hbank="64" lbank="0" prog="61"/>
+ <Patch name="Bright Brass 1" hbank="65" lbank="0" prog="61"/>
+ <Patch name="Bright Brass 2" hbank="66" lbank="0" prog="61"/>
+ <Patch name="Brass&amp;Strings" hbank="64" lbank="0" prog="62"/>
+ <Patch name="SB Brass Sect." hbank="65" lbank="0" prog="62"/>
+ <Patch name="ST Brass Sect." hbank="66" lbank="0" prog="62"/>
+ <Patch name="OB Brass Sect." hbank="64" lbank="0" prog="63"/>
+ <Patch name="Hybrid Brs." hbank="65" lbank="0" prog="63"/>
+ <Patch name="4th Brass" hbank="64" lbank="0" prog="64"/>
+ </PatchGroup>
+ <PatchGroup name="Brass/Pipe">
+ <Patch name="Synth Brass 1" hbank="64" lbank="0" prog="65"/>
+ <Patch name="Synth Brass 2" hbank="65" lbank="0" prog="65"/>
+ <Patch name="Bright Syn.Brs 1" hbank="66" lbank="0" prog="65"/>
+ <Patch name="Bright Syn.Brs 2" hbank="67" lbank="0" prog="65"/>
+ <Patch name="Warm Brass 1" hbank="68" lbank="0" prog="65"/>
+ <Patch name="Stack Brass 1" hbank="69" lbank="0" prog="65"/>
+ <Patch name="Warm Brass 2" hbank="70" lbank="0" prog="65"/>
+ <Patch name="Strings Brass" hbank="71" lbank="0" prog="65"/>
+ <Patch name="Warm Brass 3" hbank="72" lbank="0" prog="65"/>
+ <Patch name="Stack Brass 2" hbank="73" lbank="0" prog="65"/>
+ <Patch name="Trumpet" hbank="64" lbank="0" prog="66"/>
+ <Patch name="Muted Trumpet" hbank="65" lbank="0" prog="66"/>
+ <Patch name="Sax&amp;Trumpet" hbank="66" lbank="0" prog="66"/>
+ <Patch name="Alto Sax" hbank="64" lbank="0" prog="67"/>
+ <Patch name="Baritone Sax" hbank="65" lbank="0" prog="67"/>
+ <Patch name="Bright Sax" hbank="66" lbank="0" prog="67"/>
+ <Patch name="Flute" hbank="64" lbank="0" prog="68"/>
+ <Patch name="Pan Flute" hbank="64" lbank="0" prog="69"/>
+ <Patch name="Afro Flute" hbank="65" lbank="0" prog="69"/>
+ <Patch name="Pipe Lead 1" hbank="66" lbank="0" prog="69"/>
+ <Patch name="Pipe Lead 2" hbank="67" lbank="0" prog="69"/>
+ <Patch name="Shakuhachi" hbank="64" lbank="0" prog="70"/>
+ </PatchGroup>
+ <PatchGroup name="Ethik">
+ <Patch name="Sitar 1" hbank="64" lbank="0" prog="71"/>
+ <Patch name="Sitar 2" hbank="65" lbank="0" prog="71"/>
+ <Patch name="Kalimba" hbank="64" lbank="0" prog="72"/>
+ <Patch name="Bagpipe" hbank="64" lbank="0" prog="73"/>
+ </PatchGroup>
+ <PatchGroup name="Hit">
+ <Patch name="MG Blip 1" hbank="64" lbank="0" prog="75"/>
+ <Patch name="Rev.Blip" hbank="65" lbank="0" prog="75"/>
+ <Patch name="MG Blip 2" hbank="66" lbank="0" prog="75"/>
+ <Patch name="Syn.Perc" hbank="67" lbank="0" prog="75"/>
+ <Patch name="Powa" hbank="68" lbank="0" prog="75"/>
+ <Patch name="Douby" hbank="69" lbank="0" prog="75"/>
+ <Patch name="P-MOD Perc" hbank="70" lbank="0" prog="75"/>
+ <Patch name="Bam Hit" hbank="64" lbank="0" prog="76"/>
+ <Patch name="Bit Hit" hbank="65" lbank="0" prog="76"/>
+ <Patch name="Orch. Hit" hbank="66" lbank="0" prog="76"/>
+ <Patch name="BF Hit" hbank="67" lbank="0" prog="76"/>
+ <Patch name="Organ Hit" hbank="68" lbank="0" prog="76"/>
+ <Patch name="Bim Hit" hbank="69" lbank="0" prog="76"/>
+ <Patch name="Dist.Hit" hbank="70" lbank="0" prog="76"/>
+ <Patch name="Brass Fall" hbank="71" lbank="0" prog="76"/>
+ <Patch name="Strings Hit" hbank="72" lbank="0" prog="76"/>
+ <Patch name="Space Frog" hbank="73" lbank="0" prog="76"/>
+ <Patch name="Hoo!" hbank="64" lbank="0" prog="77"/>
+ <Patch name="Ha!" hbank="65" lbank="0" prog="77"/>
+ <Patch name="Afro Feet" hbank="66" lbank="0" prog="77"/>
+ <Patch name="Breath 3" hbank="67" lbank="0" prog="77"/>
+ <Patch name="Scratch Rwnd" hbank="64" lbank="0" prog="78"/>
+ <Patch name="Scratch Push" hbank="65" lbank="0" prog="78"/>
+ <Patch name="Scratch Pull" hbank="66" lbank="0" prog="78"/>
+ <Patch name="Tape Rewind" hbank="64" lbank="0" prog="79"/>
+ <Patch name="Vinyl Stop" hbank="65" lbank="0" prog="79"/>
+ </PatchGroup>
+ <PatchGroup name="SFX">
+ <Patch name="Starship" hbank="64" lbank="0" prog="80"/>
+ <Patch name="Burst Noise" hbank="65" lbank="0" prog="80"/>
+ <Patch name="Laser-gun" hbank="66" lbank="0" prog="80"/>
+ <Patch name="Seashore" hbank="64" lbank="0" prog="81"/>
+ <Patch name="Rain" hbank="65" lbank="0" prog="81"/>
+ <Patch name="Thunder" hbank="66" lbank="0" prog="81"/>
+ <Patch name="Wind" hbank="67" lbank="0" prog="81"/>
+ <Patch name="Stream" hbank="68" lbank="0" prog="81"/>
+ <Patch name="Bubble" hbank="69" lbank="0" prog="81"/>
+ <Patch name="Bird" hbank="64" lbank="0" prog="82"/>
+ <Patch name="Low Bird" hbank="65" lbank="0" prog="82"/>
+ <Patch name="Telefon" hbank="64" lbank="0" prog="83"/>
+ <Patch name="Gun Shot" hbank="65" lbank="0" prog="83"/>
+ <Patch name="Machine-gun" hbank="66" lbank="0" prog="83"/>
+ <Patch name="Car-Pass" hbank="64" lbank="0" prog="84"/>
+ <Patch name="Car-Crash" hbank="65" lbank="0" prog="84"/>
+ <Patch name="Siren" hbank="66" lbank="0" prog="84"/>
+ <Patch name="Jetplane" hbank="67" lbank="0" prog="84"/>
+ <Patch name="Helicopter" hbank="68" lbank="0" prog="84"/>
+ <Patch name="Laughting" hbank="64" lbank="0" prog="85"/>
+ <Patch name="Screaming" hbank="65" lbank="0" prog="85"/>
+ <Patch name="Punch" hbank="66" lbank="0" prog="85"/>
+ <Patch name="Heart Beat" hbank="67" lbank="0" prog="85"/>
+ <Patch name="Applause" hbank="68" lbank="0" prog="85"/>
+ </PatchGroup>
+ <PatchGroup name="Drum Percussion">
+ <Patch name="909 Tom" hbank="64" lbank="0" prog="86"/>
+ <Patch name="Synth Tom" hbank="65" lbank="0" prog="86"/>
+ <Patch name="808 Tom" hbank="66" lbank="0" prog="86"/>
+ <Patch name="Elec. Tom" hbank="67" lbank="0" prog="86"/>
+ <Patch name="Ac.Tom" hbank="68" lbank="0" prog="86"/>
+ <Patch name="78 Tom" hbank="69" lbank="0" prog="86"/>
+ <Patch name="Hi Bongo Mute" hbank="64" lbank="0" prog="87"/>
+ <Patch name="Hi Bongo Open" hbank="65" lbank="0" prog="87"/>
+ <Patch name="Lo Bongo Mute" hbank="66" lbank="0" prog="87"/>
+ <Patch name="Lo Bongo Open" hbank="67" lbank="0" prog="87"/>
+ <Patch name="Hi Conga Slap" hbank="64" lbank="0" prog="88"/>
+ <Patch name="Hi Conga Mute" hbank="65" lbank="0" prog="88"/>
+ <Patch name="Hi Conga Open" hbank="66" lbank="0" prog="88"/>
+ <Patch name="Hi Conga Mute" hbank="67" lbank="0" prog="88"/>
+ <Patch name="Hi Conga Open" hbank="68" lbank="0" prog="88"/>
+ <Patch name="808 Conga" hbank="69" lbank="0" prog="88"/>
+ <Patch name="Mute Surdo" hbank="64" lbank="0" prog="89"/>
+ <Patch name="Open Surdo" hbank="65" lbank="0" prog="89"/>
+ <Patch name="Open Pandeiro" hbank="64" lbank="0" prog="90"/>
+ <Patch name="Mute Pandeiro" hbank="65" lbank="0" prog="90"/>
+ <Patch name="Mute Cuica" hbank="64" lbank="0" prog="91"/>
+ <Patch name="Open Cuica" hbank="65" lbank="0" prog="91"/>
+ <Patch name="Timbale" hbank="64" lbank="0" prog="92"/>
+ <Patch name="Tablabaya" hbank="64" lbank="0" prog="93"/>
+ <Patch name="Udo" hbank="65" lbank="0" prog="93"/>
+ <Patch name="Latin menu *1" hbank="64" lbank="0" prog="94"/>
+ </PatchGroup>
+ <PatchGroup name="Metal Percusion">
+ <Patch name="Jungle Tamb." hbank="64" lbank="0" prog="95"/>
+ <Patch name="Tamburine" hbank="65" lbank="0" prog="95"/>
+ <Patch name="Hit Tamburine" hbank="66" lbank="0" prog="95"/>
+ <Patch name="Shake Tamb." hbank="67" lbank="0" prog="95"/>
+ <Patch name="78 Tamb" hbank="68" lbank="0" prog="95"/>
+ <Patch name="Cowbell" hbank="64" lbank="0" prog="96"/>
+ <Patch name="808 Cowbell" hbank="65" lbank="0" prog="96"/>
+ <Patch name="78 Cowbell" hbank="66" lbank="0" prog="96"/>
+ <Patch name="Mute Triangle" hbank="64" lbank="0" prog="97"/>
+ <Patch name="Open Triangle" hbank="65" lbank="0" prog="97"/>
+ <Patch name="Agogo" hbank="64" lbank="0" prog="98"/>
+ <Patch name="78 Metal Beat" hbank="65" lbank="0" prog="98"/>
+ <Patch name="Jingle Bell" hbank="64" lbank="0" prog="99"/>
+ <Patch name="Bell Time" hbank="65" lbank="0" prog="99"/>
+ <Patch name="Wind-chime" hbank="66" lbank="0" prog="99"/>
+ </PatchGroup>
+ <PatchGroup name="Other Percussion">
+ <Patch name="Maracas" hbank="64" lbank="0" prog="100"/>
+ <Patch name="808 Maracas" hbank="65" lbank="0" prog="100"/>
+ <Patch name="Cabasa Up" hbank="64" lbank="0" prog="101"/>
+ <Patch name="Cabasa Down" hbank="65" lbank="0" prog="101"/>
+ <Patch name="626 Shaker" hbank="64" lbank="0" prog="102"/>
+ <Patch name="Short Whistle" hbank="64" lbank="0" prog="103"/>
+ <Patch name="Long Whistle" hbank="65" lbank="0" prog="103"/>
+ <Patch name="Short Guiro" hbank="64" lbank="0" prog="104"/>
+ <Patch name="Long Guiro" hbank="65" lbank="0" prog="104"/>
+ <Patch name="78 Guiro" hbank="66" lbank="0" prog="104"/>
+ <Patch name="Click Noise" hbank="64" lbank="0" prog="105"/>
+ <Patch name="909 Rim Shot" hbank="64" lbank="0" prog="106"/>
+ <Patch name="808 Rim Shot" hbank="65" lbank="0" prog="106"/>
+ <Patch name="Rim Shot" hbank="66" lbank="0" prog="106"/>
+ <Patch name="Hyoshigi" hbank="64" lbank="0" prog="107"/>
+ <Patch name="Claves" hbank="65" lbank="0" prog="107"/>
+ <Patch name="808 Claves" hbank="66" lbank="0" prog="107"/>
+ <Patch name="Wood Block" hbank="67" lbank="0" prog="107"/>
+ <Patch name="Vibra-slap" hbank="64" lbank="0" prog="108"/>
+ </PatchGroup>
+ <PatchGroup name="Hi-Hat">
+ <Patch name="Real CH 1" hbank="64" lbank="0" prog="109"/>
+ <Patch name="Real PH 1" hbank="65" lbank="0" prog="109"/>
+ <Patch name="Real OH 1" hbank="66" lbank="0" prog="109"/>
+ <Patch name="Room CH" hbank="67" lbank="0" prog="109"/>
+ <Patch name="Room OH" hbank="68" lbank="0" prog="109"/>
+ <Patch name="Real CH 2" hbank="69" lbank="0" prog="109"/>
+ <Patch name="Real PH 2" hbank="70" lbank="0" prog="109"/>
+ <Patch name="Real OH 2" hbank="71" lbank="0" prog="109"/>
+ <Patch name="808 CH" hbank="64" lbank="0" prog="110"/>
+ <Patch name="808 OH" hbank="65" lbank="0" prog="110"/>
+ <Patch name="78 CH" hbank="66" lbank="0" prog="110"/>
+ <Patch name="78 OH" hbank="67" lbank="0" prog="110"/>
+ <Patch name="707 CH" hbank="68" lbank="0" prog="110"/>
+ <Patch name="707 OH" hbank="69" lbank="0" prog="110"/>
+ <Patch name="606 CH" hbank="70" lbank="0" prog="110"/>
+ <Patch name="909 CH 1" hbank="71" lbank="0" prog="110"/>
+ <Patch name="909 CH 2" hbank="72" lbank="0" prog="110"/>
+ <Patch name="909 OH" hbank="73" lbank="0" prog="110"/>
+ <Patch name="909 Dist.OH" hbank="74" lbank="0" prog="110"/>
+ </PatchGroup>
+ <PatchGroup name="Cymbal">
+ <Patch name="909 Crash" hbank="64" lbank="0" prog="111"/>
+ <Patch name="808 Cymbal" hbank="65" lbank="0" prog="111"/>
+ <Patch name="909 Ride Cym." hbank="64" lbank="0" prog="112"/>
+ <Patch name="Ride Cymbal" hbank="65" lbank="0" prog="112"/>
+ <Patch name="Ride Bell" hbank="64" lbank="0" prog="113"/>
+ <Patch name="Asian Gong" hbank="64" lbank="0" prog="114"/>
+ <Patch name="Reverse Cymbal" hbank="64" lbank="0" prog="115"/>
+ </PatchGroup>
+ <PatchGroup name="Clap">
+ <Patch name="808 Clap" hbank="64" lbank="0" prog="116"/>
+ <Patch name="Finger Snap" hbank="65" lbank="0" prog="116"/>
+ <Patch name="Hip Clap" hbank="66" lbank="0" prog="116"/>
+ <Patch name="Shape &amp; Light Clap *2" hbank="64" lbank="0" prog="117"/>
+ <Patch name="Rap &amp; Real Clap *2" hbank="65" lbank="0" prog="117"/>
+ <Patch name="909 &amp; Hard Clap *2" hbank="66" lbank="0" prog="117"/>
+ <Patch name="HC2 &amp; 707 Clap *2" hbank="67" lbank="0" prog="117"/>
+ </PatchGroup>
+ <PatchGroup name="Snare Drum(Single)">
+ <Patch name="Funky Ghost" hbank="64" lbank="0" prog="118"/>
+ <Patch name="Clap SD" hbank="65" lbank="0" prog="118"/>
+ <Patch name="Fat SD" hbank="66" lbank="0" prog="118"/>
+ <Patch name="Tight SD" hbank="67" lbank="0" prog="118"/>
+ <Patch name="909 SD" hbank="64" lbank="0" prog="119"/>
+ <Patch name="808 SD" hbank="65" lbank="0" prog="119"/>
+ <Patch name="Elec.SD" hbank="66" lbank="0" prog="119"/>
+ <Patch name="80809 SD" hbank="67" lbank="0" prog="119"/>
+ <Patch name="Slap" hbank="68" lbank="0" prog="119"/>
+ <Patch name="Blip SD" hbank="69" lbank="0" prog="119"/>
+ </PatchGroup>
+ <PatchGroup name="Snare Drum(Kit)">
+ <Patch name="Rim SD Kit *2" hbank="64" lbank="0" prog="120"/>
+ <Patch name="Jngl SD Kit 1 *2" hbank="65" lbank="0" prog="120"/>
+ <Patch name="Jngl SD Kit 2 *2" hbank="66" lbank="0" prog="120"/>
+ <Patch name="Mute SD Kit *2" hbank="67" lbank="0" prog="120"/>
+ <Patch name="Funky SD Kit *2" hbank="68" lbank="0" prog="120"/>
+ <Patch name="Rap SD Kit *2" hbank="69" lbank="0" prog="120"/>
+ <Patch name="Dry SD Kit *2" hbank="70" lbank="0" prog="120"/>
+ <Patch name="Brush Tap *2" hbank="64" lbank="0" prog="121"/>
+ <Patch name="Brush Slap *2" hbank="65" lbank="0" prog="121"/>
+ <Patch name="Brush Swirl *2" hbank="66" lbank="0" prog="121"/>
+ <Patch name="909 SD Kit *2" hbank="64" lbank="0" prog="122"/>
+ <Patch name="808 SD Kit 1 *2" hbank="65" lbank="0" prog="122"/>
+ <Patch name="Hyper SD Kit *2" hbank="66" lbank="0" prog="122"/>
+ <Patch name="FX SD Kit *2" hbank="67" lbank="0" prog="122"/>
+ <Patch name="808 SD Kit 2 *2" hbank="68" lbank="0" prog="122"/>
+ <Patch name="606 SD Kit *2" hbank="69" lbank="0" prog="122"/>
+ </PatchGroup>
+ <PatchGroup name="Bass Drum (Single)">
+ <Patch name="Blip BD" hbank="64" lbank="0" prog="124"/>
+ <Patch name="Cave BD" hbank="65" lbank="0" prog="124"/>
+ <Patch name="808 BD 1" hbank="66" lbank="0" prog="124"/>
+ <Patch name="808 BD 2" hbank="67" lbank="0" prog="124"/>
+ <Patch name="Elec.BD" hbank="68" lbank="0" prog="124"/>
+ <Patch name="Afro Feet BD" hbank="69" lbank="0" prog="124"/>
+ </PatchGroup>
+ <PatchGroup name="Bank 29">
+ <Patch name="Dist.BD Kit *2" hbank="64" lbank="0" prog="126"/>
+ <Patch name="Jngl.BD Kit *2" hbank="65" lbank="0" prog="126"/>
+ <Patch name="909 BD Kit 1 *2" hbank="66" lbank="0" prog="126"/>
+ <Patch name="909 BD Kit 2 *2" hbank="67" lbank="0" prog="126"/>
+ <Patch name="909 BD Kit 3 *2" hbank="68" lbank="0" prog="126"/>
+ <Patch name="Dry BD Kit *2" hbank="69" lbank="0" prog="126"/>
+ <Patch name="606 BD Kit *2" hbank="70" lbank="0" prog="126"/>
+ </PatchGroup>
+ <PatchGroup name="Drum 303">
+ <Patch name="909" hbank="64" lbank="0" prog="0"/>
+ <Patch name="808" hbank="64" lbank="0" prog="8"/>
+ <Patch name="C78" hbank="64" lbank="0" prog="16"/>
+ <Patch name="JAZZ" hbank="64" lbank="0" prog="24"/>
+ <Patch name="BR5" hbank="64" lbank="0" prog="25"/>
+ <Patch name="JUNGLE" hbank="64" lbank="0" prog="32"/>
+ <Patch name="HOUSE" hbank="64" lbank="0" prog="40"/>
+ <Patch name="TC1" hbank="64" lbank="0" prog="48"/>
+ <Patch name="TC2" hbank="64" lbank="0" prog="56"/>
+ <Patch name="TC3" hbank="64" lbank="0" prog="64"/>
+ <Patch name="ABT" hbank="64" lbank="0" prog="72"/>
+ <Patch name="HIP HOP" hbank="64" lbank="0" prog="80"/>
+ </PatchGroup>
+
+ </MidiInstrument>
+ </muse>
+
+
diff --git a/muse/share/instruments/MC505.idf b/muse/share/instruments/MC505.idf
new file mode 100644
index 00000000..cced8ffa
--- /dev/null
+++ b/muse/share/instruments/MC505.idf
@@ -0,0 +1,560 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="MC505">
+
+<PatchGroup name="Preset A">
+<Patch name="Lead TB 1" hbank="81" lbank="0" prog="1"/>
+<Patch name="Dist TB 1" hbank="81" lbank="0" prog="2"/>
+<Patch name="Dist Sqr TB" hbank="81" lbank="0" prog="3"/>
+<Patch name="Dist TB 2" hbank="81" lbank="0" prog="4"/>
+<Patch name="Dist TB 3" hbank="81" lbank="0" prog="5"/>
+<Patch name="TB + Voco" hbank="81" lbank="0" prog="6"/>
+<Patch name="Dist TB 4" hbank="81" lbank="0" prog="7"/>
+<Patch name="Lead TB 2" hbank="81" lbank="0" prog="8"/>
+<Patch name="Devil TB " hbank="81" lbank="0" prog="9"/>
+<Patch name="Dual TB" hbank="81" lbank="0" prog="10"/>
+<Patch name="HiLo303ModSw" hbank="81" lbank="0" prog="11"/>
+<Patch name="Arpness TB " hbank="81" lbank="0" prog="12"/>
+<Patch name="Acid Line" hbank="81" lbank="0" prog="13"/>
+<Patch name="Dist TB 5" hbank="81" lbank="0" prog="14"/>
+<Patch name="Lead TB 3" hbank="81" lbank="0" prog="15"/>
+<Patch name="Lead TB 4" hbank="81" lbank="0" prog="16"/>
+<Patch name="TB Tra Bass" hbank="81" lbank="0" prog="17"/>
+<Patch name="Acid TB" hbank="81" lbank="0" prog="18"/>
+<Patch name="Psyche-TB" hbank="81" lbank="0" prog="19"/>
+<Patch name="TB + Sine" hbank="81" lbank="0" prog="20"/>
+<Patch name="Hi-Pass TB " hbank="81" lbank="0" prog="21"/>
+<Patch name="Moog Saw " hbank="81" lbank="0" prog="22"/>
+<Patch name="OB Saw" hbank="81" lbank="0" prog="23"/>
+<Patch name="MG Lead" hbank="81" lbank="0" prog="24"/>
+<Patch name="Poly Key " hbank="81" lbank="0" prog="25"/>
+<Patch name="Synth Pulse" hbank="81" lbank="0" prog="26"/>
+<Patch name="Dual Profs " hbank="81" lbank="0" prog="27"/>
+<Patch name="Axe of 80" hbank="81" lbank="0" prog="28"/>
+<Patch name="MG Square" hbank="81" lbank="0" prog="29"/>
+<Patch name="Square Lead1" hbank="81" lbank="0" prog="30"/>
+<Patch name="Square Lead2" hbank="81" lbank="0" prog="31"/>
+<Patch name="Square Lead3" hbank="81" lbank="0" prog="32"/>
+<Patch name="Lucky" hbank="81" lbank="0" prog="33"/>
+<Patch name="Synth Lead 1" hbank="81" lbank="0" prog="34"/>
+<Patch name="Moon Lead" hbank="81" lbank="0" prog="35"/>
+<Patch name="Rezo SynLead" hbank="81" lbank="0" prog="36"/>
+<Patch name="Wspy Synth" hbank="81" lbank="0" prog="37"/>
+<Patch name="Enorjizor" hbank="81" lbank="0" prog="38"/>
+<Patch name="JP8 Sprang " hbank="81" lbank="0" prog="39"/>
+<Patch name="PortaSynLead" hbank="81" lbank="0" prog="40"/>
+<Patch name="Wah Lead " hbank="81" lbank="0" prog="41"/>
+<Patch name="Beep Mod " hbank="81" lbank="0" prog="42"/>
+<Patch name="Dist Lead 1" hbank="81" lbank="0" prog="43"/>
+<Patch name="Freaky Fry " hbank="81" lbank="0" prog="44"/>
+<Patch name="JU2 SubOsc 1" hbank="81" lbank="0" prog="45"/>
+<Patch name="JU2 SubOsc 2" hbank="81" lbank="0" prog="46"/>
+<Patch name="Froggy" hbank="81" lbank="0" prog="47"/>
+<Patch name="Synth Lead 2" hbank="81" lbank="0" prog="48"/>
+<Patch name="Singin' MINI" hbank="81" lbank="0" prog="49"/>
+<Patch name="Plastic Tone" hbank="81" lbank="0" prog="50"/>
+<Patch name="SinusoidRave" hbank="81" lbank="0" prog="51"/>
+<Patch name="Sine Me Up " hbank="81" lbank="0" prog="52"/>
+<Patch name="Spooky Sine" hbank="81" lbank="0" prog="53"/>
+<Patch name="Sine Tone" hbank="81" lbank="0" prog="54"/>
+<Patch name="D50 Saw Lead" hbank="81" lbank="0" prog="55"/>
+<Patch name="Dst Syn Lead" hbank="81" lbank="0" prog="56"/>
+<Patch name="Big Up Massv" hbank="81" lbank="0" prog="57"/>
+<Patch name="Warm SawLead" hbank="81" lbank="0" prog="58"/>
+<Patch name="Hartnoll Era" hbank="81" lbank="0" prog="59"/>
+<Patch name="Skegness 97" hbank="81" lbank="0" prog="60"/>
+<Patch name="Simply June" hbank="81" lbank="0" prog="61"/>
+<Patch name="The Brothers" hbank="81" lbank="0" prog="62"/>
+<Patch name="Dist Lead 2" hbank="81" lbank="0" prog="63"/>
+<Patch name="Dark SawLead" hbank="81" lbank="0" prog="64"/>
+<Patch name="Dist Lead 3" hbank="81" lbank="0" prog="65"/>
+<Patch name="Mosquito" hbank="81" lbank="0" prog="66"/>
+<Patch name="Phazyn Vox" hbank="81" lbank="0" prog="67"/>
+<Patch name="Voc Saw" hbank="81" lbank="0" prog="68"/>
+<Patch name="VT Vox" hbank="81" lbank="0" prog="69"/>
+<Patch name="Pure Voice" hbank="81" lbank="0" prog="70"/>
+<Patch name="Robo Vox" hbank="81" lbank="0" prog="71"/>
+<Patch name="Hallucinate" hbank="81" lbank="0" prog="72"/>
+<Patch name="Seq.Synth" hbank="81" lbank="0" prog="73"/>
+<Patch name="Analog Seq " hbank="81" lbank="0" prog="74"/>
+<Patch name="Ana Punch" hbank="81" lbank="0" prog="75"/>
+<Patch name="Atom Brain" hbank="81" lbank="0" prog="76"/>
+<Patch name="Fooled MC" hbank="81" lbank="0" prog="77"/>
+<Patch name="101 Bass 1 " hbank="81" lbank="0" prog="78"/>
+<Patch name="House Bass " hbank="81" lbank="0" prog="79"/>
+<Patch name="101 Bass 2 " hbank="81" lbank="0" prog="80"/>
+<Patch name="202 Bass " hbank="81" lbank="0" prog="81"/>
+<Patch name="Psycho Funk" hbank="81" lbank="0" prog="82"/>
+<Patch name="Talking Line" hbank="81" lbank="0" prog="83"/>
+<Patch name="Inside Bass" hbank="81" lbank="0" prog="84"/>
+<Patch name="Bubble Bass" hbank="81" lbank="0" prog="85"/>
+<Patch name="Bass Bleep " hbank="81" lbank="0" prog="86"/>
+<Patch name="Wiggle Bass" hbank="81" lbank="0" prog="87"/>
+<Patch name="Twist Bass" hbank="81" lbank="0" prog="88"/>
+<Patch name="Octa Bass" hbank="81" lbank="0" prog="89"/>
+<Patch name="BT's Sticky" hbank="81" lbank="0" prog="90"/>
+<Patch name="MG Bass" hbank="81" lbank="0" prog="91"/>
+<Patch name="FM Super Bs" hbank="81" lbank="0" prog="92"/>
+<Patch name="Solid Bass " hbank="81" lbank="0" prog="93"/>
+<Patch name="T Nite Bass" hbank="81" lbank="0" prog="94"/>
+<Patch name="Front 505" hbank="81" lbank="0" prog="95"/>
+<Patch name="Def Bass 1 " hbank="81" lbank="0" prog="96"/>
+<Patch name="Def Bass 2" hbank="81" lbank="0" prog="97"/>
+<Patch name="Sine Bass 1" hbank="81" lbank="0" prog="98"/>
+<Patch name="Sine Bass 2" hbank="81" lbank="0" prog="99"/>
+<Patch name="RollModRezBs" hbank="81" lbank="0" prog="100"/>
+<Patch name="Gate Me Buzz" hbank="81" lbank="0" prog="101"/>
+<Patch name="System Bass" hbank="81" lbank="0" prog="102"/>
+<Patch name="Spike Bass " hbank="81" lbank="0" prog="103"/>
+<Patch name="Solid Goa" hbank="81" lbank="0" prog="104"/>
+<Patch name="Rezo Bass" hbank="81" lbank="0" prog="105"/>
+<Patch name="Blip Bass" hbank="81" lbank="0" prog="106"/>
+<Patch name="Pizz Bass" hbank="81" lbank="0" prog="107"/>
+<Patch name="Voco Bass" hbank="81" lbank="0" prog="108"/>
+<Patch name="VoCoRoBo" hbank="81" lbank="0" prog="109"/>
+<Patch name="Dust Bass" hbank="81" lbank="0" prog="110"/>
+<Patch name="ArtCore Bass" hbank="81" lbank="0" prog="111"/>
+<Patch name="NU-NRG Bass" hbank="81" lbank="0" prog="112"/>
+<Patch name="TalkBox Bass" hbank="81" lbank="0" prog="113"/>
+<Patch name="Incontinence" hbank="81" lbank="0" prog="114"/>
+<Patch name="Bari Voice" hbank="81" lbank="0" prog="115"/>
+<Patch name="Ac.Bass" hbank="81" lbank="0" prog="116"/>
+<Patch name="E.Ac.Bass" hbank="81" lbank="0" prog="117"/>
+<Patch name="Acid Jazz Bs" hbank="81" lbank="0" prog="118"/>
+<Patch name="Soup's Bass" hbank="81" lbank="0" prog="119"/>
+<Patch name="Fingered Bs" hbank="81" lbank="0" prog="120"/>
+<Patch name="FingBsVeloSw" hbank="81" lbank="0" prog="121"/>
+<Patch name="PickedBass 1" hbank="81" lbank="0" prog="122"/>
+<Patch name="PickedBass 2" hbank="81" lbank="0" prog="123"/>
+<Patch name="Fretless Bs" hbank="81" lbank="0" prog="124"/>
+<Patch name="Phot Bass" hbank="81" lbank="0" prog="125"/>
+<Patch name="Slap Bass" hbank="81" lbank="0" prog="126"/>
+<Patch name="R&amp;B B-Slides " hbank="81" lbank="0" prog="127"/>
+<Patch name="Syn Stack 1" hbank="81" lbank="0" prog="128"/>
+</PatchGroup>
+
+<PatchGroup name="Preset B">
+<Patch name="Strong Brass" hbank="82" lbank="0" prog="1"/>
+<Patch name="You Can Fly" hbank="82" lbank="0" prog="2"/>
+<Patch name="Syn stack 2 " hbank="82" lbank="0" prog="3"/>
+<Patch name="Dawn Of Man" hbank="82" lbank="0" prog="4"/>
+<Patch name="Saw Stack 1 " hbank="82" lbank="0" prog="5"/>
+<Patch name="Saw Stack 2 " hbank="82" lbank="0" prog="6"/>
+<Patch name="DLM Stack " hbank="82" lbank="0" prog="7"/>
+<Patch name="DOC Stack " hbank="82" lbank="0" prog="8"/>
+<Patch name="LN2 Stack " hbank="82" lbank="0" prog="9"/>
+<Patch name="Bend Stack" hbank="82" lbank="0" prog="10"/>
+<Patch name="Freedom" hbank="82" lbank="0" prog="11"/>
+<Patch name="Good Bean " hbank="82" lbank="0" prog="12"/>
+<Patch name="JP8000 5th" hbank="82" lbank="0" prog="13"/>
+<Patch name="Mega 5th " hbank="82" lbank="0" prog="14"/>
+<Patch name="5th Saw " hbank="82" lbank="0" prog="15"/>
+<Patch name="4th Saw" hbank="82" lbank="0" prog="16"/>
+<Patch name="Soundtrack" hbank="82" lbank="0" prog="17"/>
+<Patch name="Rise Pad " hbank="82" lbank="0" prog="18"/>
+<Patch name="Warm Pad " hbank="82" lbank="0" prog="19"/>
+<Patch name="JP + OB Pad " hbank="82" lbank="0" prog="20"/>
+<Patch name="Planet " hbank="82" lbank="0" prog="21"/>
+<Patch name="Additive " hbank="82" lbank="0" prog="22"/>
+<Patch name="Noise Pad" hbank="82" lbank="0" prog="23"/>
+<Patch name="Sweep Pad 1 " hbank="82" lbank="0" prog="24"/>
+<Patch name="Sweep Pad 2" hbank="82" lbank="0" prog="25"/>
+<Patch name="Alles Padde " hbank="82" lbank="0" prog="26"/>
+<Patch name="Sky Light " hbank="82" lbank="0" prog="27"/>
+<Patch name="Stargate MC " hbank="82" lbank="0" prog="28"/>
+<Patch name="Middle Grow " hbank="82" lbank="0" prog="29"/>
+<Patch name="AiRye Bread-" hbank="82" lbank="0" prog="30"/>
+<Patch name="NU-NRG Org" hbank="82" lbank="0" prog="31"/>
+<Patch name="Halo Pad " hbank="82" lbank="0" prog="32"/>
+<Patch name="Str/Brs Pad " hbank="82" lbank="0" prog="33"/>
+<Patch name="Syn Brs Pad " hbank="82" lbank="0" prog="34"/>
+<Patch name="Simple Pad" hbank="82" lbank="0" prog="35"/>
+<Patch name="OB Rezo Pad " hbank="82" lbank="0" prog="36"/>
+<Patch name="Sweet Vocode" hbank="82" lbank="0" prog="37"/>
+<Patch name="Thin Pad " hbank="82" lbank="0" prog="38"/>
+<Patch name="Attack Pad" hbank="82" lbank="0" prog="39"/>
+<Patch name="Metal Pad " hbank="82" lbank="0" prog="40"/>
+<Patch name="Atmosphere" hbank="82" lbank="0" prog="41"/>
+<Patch name="Fantasia " hbank="82" lbank="0" prog="42"/>
+<Patch name="Feedbackwave" hbank="82" lbank="0" prog="43"/>
+<Patch name="Pacifica " hbank="82" lbank="0" prog="44"/>
+<Patch name="Atmosphere 2" hbank="82" lbank="0" prog="45"/>
+<Patch name="Sub Atmosphe" hbank="82" lbank="0" prog="46"/>
+<Patch name="Machine Pad " hbank="82" lbank="0" prog="47"/>
+<Patch name="Detuned Pad " hbank="82" lbank="0" prog="48"/>
+<Patch name="Scoop Pad " hbank="82" lbank="0" prog="49"/>
+<Patch name="Psycho Trevor " hbank="82" lbank="0" prog="50"/>
+<Patch name="Floating Pad" hbank="82" lbank="0" prog="51"/>
+<Patch name="Fancy Pad " hbank="82" lbank="0" prog="52"/>
+<Patch name="Strings 1 " hbank="82" lbank="0" prog="53"/>
+<Patch name="Strings 2 " hbank="82" lbank="0" prog="54"/>
+<Patch name="Old StringSW" hbank="82" lbank="0" prog="55"/>
+<Patch name="Swim Strings" hbank="82" lbank="0" prog="56"/>
+<Patch name="Eclip-Str" hbank="82" lbank="0" prog="57"/>
+<Patch name="Slow Strings" hbank="82" lbank="0" prog="58"/>
+<Patch name="OB Slow Str " hbank="82" lbank="0" prog="59"/>
+<Patch name="Syn.Strings1" hbank="82" lbank="0" prog="60"/>
+<Patch name="Syn.Strings2" hbank="82" lbank="0" prog="61"/>
+<Patch name="OB Strings" hbank="82" lbank="0" prog="62"/>
+<Patch name="Rhap Strings" hbank="82" lbank="0" prog="63"/>
+<Patch name="Banded Jupe" hbank="82" lbank="0" prog="64"/>
+<Patch name="NU-NRG Str" hbank="82" lbank="0" prog="65"/>
+<Patch name="Violin " hbank="82" lbank="0" prog="66"/>
+<Patch name="Contrabass" hbank="82" lbank="0" prog="67"/>
+<Patch name="Tremolo Str " hbank="82" lbank="0" prog="68"/>
+<Patch name="Pizzicato 1 " hbank="82" lbank="0" prog="69"/>
+<Patch name="Pizzicato 2 " hbank="82" lbank="0" prog="70"/>
+<Patch name="Pizz It " hbank="82" lbank="0" prog="71"/>
+<Patch name="Guardians" hbank="82" lbank="0" prog="72"/>
+<Patch name="Gat Passion " hbank="82" lbank="0" prog="73"/>
+<Patch name="Syn Harp " hbank="82" lbank="0" prog="74"/>
+<Patch name="Voice Oohs" hbank="82" lbank="0" prog="75"/>
+<Patch name="Solo Vox " hbank="82" lbank="0" prog="76"/>
+<Patch name="Syn Vox " hbank="82" lbank="0" prog="77"/>
+<Patch name="Choir Aahs" hbank="82" lbank="0" prog="78"/>
+<Patch name="Space Voice " hbank="82" lbank="0" prog="79"/>
+<Patch name="Star Voice" hbank="82" lbank="0" prog="80"/>
+<Patch name="Brightness" hbank="82" lbank="0" prog="81"/>
+<Patch name="Vox Lead " hbank="82" lbank="0" prog="82"/>
+<Patch name="Auhbient " hbank="82" lbank="0" prog="83"/>
+<Patch name="Auh Luv Rave" hbank="82" lbank="0" prog="84"/>
+<Patch name="PCM Life " hbank="82" lbank="0" prog="85"/>
+<Patch name="Noisevox " hbank="82" lbank="0" prog="86"/>
+<Patch name="Trance Voice" hbank="82" lbank="0" prog="87"/>
+<Patch name="Effect Acer " hbank="82" lbank="0" prog="88"/>
+<Patch name="Alternative " hbank="82" lbank="0" prog="89"/>
+<Patch name="Hard Pure " hbank="82" lbank="0" prog="90"/>
+<Patch name="Metal EF " hbank="82" lbank="0" prog="91"/>
+<Patch name="Dly Tone " hbank="82" lbank="0" prog="92"/>
+<Patch name="Osci Frog " hbank="82" lbank="0" prog="93"/>
+<Patch name="Cal + After " hbank="82" lbank="0" prog="94"/>
+<Patch name="8b Pad " hbank="82" lbank="0" prog="95"/>
+<Patch name="SpaceHighway" hbank="82" lbank="0" prog="96"/>
+<Patch name="Trek Storm" hbank="82" lbank="0" prog="97"/>
+<Patch name="Abduction " hbank="82" lbank="0" prog="98"/>
+<Patch name="1st Contact " hbank="82" lbank="0" prog="99"/>
+<Patch name="Ice Cave " hbank="82" lbank="0" prog="100"/>
+<Patch name="Rev Cord " hbank="82" lbank="0" prog="101"/>
+<Patch name="Blue Random " hbank="82" lbank="0" prog="102"/>
+<Patch name="Sync Tone" hbank="82" lbank="0" prog="103"/>
+<Patch name="Seq Up " hbank="82" lbank="0" prog="104"/>
+<Patch name="SawLFOSaw " hbank="82" lbank="0" prog="105"/>
+<Patch name="Calculating" hbank="82" lbank="0" prog="106"/>
+<Patch name="Touch EF " hbank="82" lbank="0" prog="107"/>
+<Patch name="Welding " hbank="82" lbank="0" prog="108"/>
+<Patch name="Press Machin" hbank="82" lbank="0" prog="109"/>
+<Patch name="EF Tribe " hbank="82" lbank="0" prog="110"/>
+<Patch name="Scratch Alt " hbank="82" lbank="0" prog="111"/>
+<Patch name="Analog FX " hbank="82" lbank="0" prog="112"/>
+<Patch name="Non TB " hbank="82" lbank="0" prog="113"/>
+<Patch name="Nasty Filt" hbank="82" lbank="0" prog="114"/>
+<Patch name="Psy-Ence" hbank="82" lbank="0" prog="115"/>
+<Patch name="Music Hi " hbank="82" lbank="0" prog="116"/>
+<Patch name="Uber Zone " hbank="82" lbank="0" prog="117"/>
+<Patch name="Down Gown " hbank="82" lbank="0" prog="118"/>
+<Patch name="For Giving" hbank="82" lbank="0" prog="119"/>
+<Patch name="Sound Alarm " hbank="82" lbank="0" prog="120"/>
+<Patch name="Acid Drone" hbank="82" lbank="0" prog="121"/>
+<Patch name="X-Mod" hbank="82" lbank="0" prog="122"/>
+<Patch name="X-FM/Org " hbank="82" lbank="0" prog="123"/>
+<Patch name="X-FM Bass " hbank="82" lbank="0" prog="124"/>
+<Patch name="Hard BD? " hbank="82" lbank="0" prog="125"/>
+<Patch name="S&amp;H Voc " hbank="82" lbank="0" prog="126"/>
+<Patch name="X-TlkBxBass " hbank="82" lbank="0" prog="127"/>
+<Patch name="X-Kick/TB" hbank="82" lbank="0" prog="128"/>
+</PatchGroup>
+
+<PatchGroup name="Preset C">
+<Patch name="X-Org/Nz " hbank="83" lbank="0" prog="1"/>
+<Patch name="X-Pizz/Rng" hbank="83" lbank="0" prog="2"/>
+<Patch name="White Noise" hbank="83" lbank="0" prog="3"/>
+<Patch name="Pink Noise " hbank="83" lbank="0" prog="4"/>
+<Patch name="P5 Noise " hbank="83" lbank="0" prog="5"/>
+<Patch name="Toy Noise " hbank="83" lbank="0" prog="6"/>
+<Patch name="Rezo Noise " hbank="83" lbank="0" prog="7"/>
+<Patch name="Vinyl Noise" hbank="83" lbank="0" prog="8"/>
+<Patch name="Tornado Jet" hbank="83" lbank="0" prog="9"/>
+<Patch name="Smooth Jet " hbank="83" lbank="0" prog="10"/>
+<Patch name="Sweep Noise" hbank="83" lbank="0" prog="11"/>
+<Patch name="ModWhtSweep" hbank="83" lbank="0" prog="12"/>
+<Patch name="Perk Breath" hbank="83" lbank="0" prog="13"/>
+<Patch name="Pink Bomb " hbank="83" lbank="0" prog="14"/>
+<Patch name="64voicePiano" hbank="83" lbank="0" prog="15"/>
+<Patch name="Ac.Piano 1 " hbank="83" lbank="0" prog="16"/>
+<Patch name="Ac.Piano 2 " hbank="83" lbank="0" prog="17"/>
+<Patch name="Epic House " hbank="83" lbank="0" prog="18"/>
+<Patch name="Hush Piano " hbank="83" lbank="0" prog="19"/>
+<Patch name="Happy Piano" hbank="83" lbank="0" prog="20"/>
+<Patch name="BPF Piano " hbank="83" lbank="0" prog="21"/>
+<Patch name="Honky-tonk " hbank="83" lbank="0" prog="22"/>
+<Patch name="NY Piano+Str" hbank="83" lbank="0" prog="23"/>
+<Patch name="Voice Piano" hbank="83" lbank="0" prog="24"/>
+<Patch name="Old E.Piano" hbank="83" lbank="0" prog="25"/>
+<Patch name="E.Piano 1 " hbank="83" lbank="0" prog="26"/>
+<Patch name="E.Piano 2 " hbank="83" lbank="0" prog="27"/>
+<Patch name="Cool Rhodes" hbank="83" lbank="0" prog="28"/>
+<Patch name="Psycho EP " hbank="83" lbank="0" prog="29"/>
+<Patch name="Trip E.Piano" hbank="83" lbank="0" prog="30"/>
+<Patch name="Rotary Rhode" hbank="83" lbank="0" prog="31"/>
+<Patch name="EP-Organ " hbank="83" lbank="0" prog="32"/>
+<Patch name="Harpsichord" hbank="83" lbank="0" prog="33"/>
+<Patch name="Clavi" hbank="83" lbank="0" prog="34"/>
+<Patch name="Digi Clavi " hbank="83" lbank="0" prog="35"/>
+<Patch name="FM Clavi " hbank="83" lbank="0" prog="36"/>
+<Patch name="AnalogClavi1" hbank="83" lbank="0" prog="37"/>
+<Patch name="AnalogClavi2" hbank="83" lbank="0" prog="38"/>
+<Patch name="Funky Clavi" hbank="83" lbank="0" prog="39"/>
+<Patch name="RotaryOrg Sl" hbank="83" lbank="0" prog="40"/>
+<Patch name="RotaryOrg Fs" hbank="83" lbank="0" prog="41"/>
+<Patch name="Gospel Spin" hbank="83" lbank="0" prog="42"/>
+<Patch name="L Org F " hbank="83" lbank="0" prog="43"/>
+<Patch name="Organ 1 " hbank="83" lbank="0" prog="44"/>
+<Patch name="Lp-Hp Organ" hbank="83" lbank="0" prog="45"/>
+<Patch name="Organ 2 " hbank="83" lbank="0" prog="46"/>
+<Patch name="Percsv Organ" hbank="83" lbank="0" prog="47"/>
+<Patch name="Ballad B " hbank="83" lbank="0" prog="48"/>
+<Patch name="FM Club Org" hbank="83" lbank="0" prog="49"/>
+<Patch name="Pop Organ " hbank="83" lbank="0" prog="50"/>
+<Patch name="Cheese Organ" hbank="83" lbank="0" prog="51"/>
+<Patch name="Reed Organ " hbank="83" lbank="0" prog="52"/>
+<Patch name="Telstar" hbank="83" lbank="0" prog="53"/>
+<Patch name="Church Org " hbank="83" lbank="0" prog="54"/>
+<Patch name="Organ Bass" hbank="83" lbank="0" prog="55"/>
+<Patch name="Strict Organ" hbank="83" lbank="0" prog="56"/>
+<Patch name="SmkyChrd Org" hbank="83" lbank="0" prog="57"/>
+<Patch name="Sweep Organ" hbank="83" lbank="0" prog="58"/>
+<Patch name="Accordion " hbank="83" lbank="0" prog="59"/>
+<Patch name="Vibraphone " hbank="83" lbank="0" prog="60"/>
+<Patch name="FM Marimba " hbank="83" lbank="0" prog="61"/>
+<Patch name="Marimba " hbank="83" lbank="0" prog="62"/>
+<Patch name="Xylophone " hbank="83" lbank="0" prog="63"/>
+<Patch name="Balaphone " hbank="83" lbank="0" prog="64"/>
+<Patch name="Timpani " hbank="83" lbank="0" prog="65"/>
+<Patch name="Steel Drum " hbank="83" lbank="0" prog="66"/>
+<Patch name="Digi Bell " hbank="83" lbank="0" prog="67"/>
+<Patch name="Acid Perc" hbank="83" lbank="0" prog="68"/>
+<Patch name="MetaL-SD" hbank="83" lbank="0" prog="69"/>
+<Patch name="Classy Pulse" hbank="83" lbank="0" prog="70"/>
+<Patch name="Glockenspiel" hbank="83" lbank="0" prog="71"/>
+<Patch name="Fanta Bell " hbank="83" lbank="0" prog="72"/>
+<Patch name="Crystal " hbank="83" lbank="0" prog="73"/>
+<Patch name="Tubular-Bell" hbank="83" lbank="0" prog="74"/>
+<Patch name="Shank Bells" hbank="83" lbank="0" prog="75"/>
+<Patch name="MKS-30 Melts" hbank="83" lbank="0" prog="76"/>
+<Patch name="Trip Lead " hbank="83" lbank="0" prog="77"/>
+<Patch name="Steel-Str.Gt" hbank="83" lbank="0" prog="78"/>
+<Patch name="Clean Gtr " hbank="83" lbank="0" prog="79"/>
+<Patch name="Jazz Gtr 1 " hbank="83" lbank="0" prog="80"/>
+<Patch name="Jazz Gtr 2 " hbank="83" lbank="0" prog="81"/>
+<Patch name="Muted Gtr " hbank="83" lbank="0" prog="82"/>
+<Patch name="Lo-Fi Gtr " hbank="83" lbank="0" prog="83"/>
+<Patch name="Terror Dome" hbank="83" lbank="0" prog="84"/>
+<Patch name="Psycho-G" hbank="83" lbank="0" prog="85"/>
+<Patch name="Dist Gtr Chd" hbank="83" lbank="0" prog="86"/>
+<Patch name="Going Bald " hbank="83" lbank="0" prog="87"/>
+<Patch name="Gt.Harmonic1" hbank="83" lbank="0" prog="88"/>
+<Patch name="Gt.Harmonic2" hbank="83" lbank="0" prog="89"/>
+<Patch name="Shafted Gtr" hbank="83" lbank="0" prog="90"/>
+<Patch name="WahGT 2 Menu" hbank="83" lbank="0" prog="91"/>
+<Patch name="Gtr Up" hbank="83" lbank="0" prog="92"/>
+<Patch name="Gtr Down " hbank="83" lbank="0" prog="93"/>
+<Patch name="Gtr Sweep " hbank="83" lbank="0" prog="94"/>
+<Patch name="Orch Gtr" hbank="83" lbank="0" prog="95"/>
+<Patch name="Brass" hbank="83" lbank="0" prog="96"/>
+<Patch name="Bright Brass" hbank="83" lbank="0" prog="97"/>
+<Patch name="Hush Brass " hbank="83" lbank="0" prog="98"/>
+<Patch name="Synth Brass1" hbank="83" lbank="0" prog="99"/>
+<Patch name="Synth Brass2" hbank="83" lbank="0" prog="100"/>
+<Patch name="Synth Brass3" hbank="83" lbank="0" prog="101"/>
+<Patch name="Syn Brs Lead" hbank="83" lbank="0" prog="102"/>
+<Patch name="Obilator " hbank="83" lbank="0" prog="103"/>
+<Patch name="OpenUp Brass" hbank="83" lbank="0" prog="104"/>
+<Patch name="Brass Fall " hbank="83" lbank="0" prog="105"/>
+<Patch name="Trumpet " hbank="83" lbank="0" prog="106"/>
+<Patch name="MutedTrumpet" hbank="83" lbank="0" prog="107"/>
+<Patch name="Soprano Sax" hbank="83" lbank="0" prog="108"/>
+<Patch name="Alto Sax " hbank="83" lbank="0" prog="109"/>
+<Patch name="Baritone Sax" hbank="83" lbank="0" prog="110"/>
+<Patch name="SlideBiteSax" hbank="83" lbank="0" prog="111"/>
+<Patch name="Sax &amp; Tp " hbank="83" lbank="0" prog="112"/>
+<Patch name="Tuba" hbank="83" lbank="0" prog="113"/>
+<Patch name="Syn F.Horn " hbank="83" lbank="0" prog="114"/>
+<Patch name="Oboe" hbank="83" lbank="0" prog="115"/>
+<Patch name="Whistle " hbank="83" lbank="0" prog="116"/>
+<Patch name="Ocarina " hbank="83" lbank="0" prog="117"/>
+<Patch name="Recorder " hbank="83" lbank="0" prog="118"/>
+<Patch name="Jazz SynLead" hbank="83" lbank="0" prog="119"/>
+<Patch name="Solo Flute " hbank="83" lbank="0" prog="120"/>
+<Patch name="Pan Flute " hbank="83" lbank="0" prog="121"/>
+<Patch name="Bottle Blow" hbank="83" lbank="0" prog="122"/>
+<Patch name="Funky Pipe " hbank="83" lbank="0" prog="123"/>
+<Patch name="Breath Noise" hbank="83" lbank="0" prog="124"/>
+<Patch name="Shakuhachi " hbank="83" lbank="0" prog="125"/>
+<Patch name="Sitar 1 " hbank="83" lbank="0" prog="126"/>
+<Patch name="Sitar 2 " hbank="83" lbank="0" prog="127"/>
+<Patch name="Santur" hbank="83" lbank="0" prog="128"/>
+</PatchGroup>
+
+<PatchGroup name="Preset D">
+<Patch name="Kalimba" hbank="84" lbank="0" prog="1"/>
+<Patch name="Bagpipes" hbank="84" lbank="0" prog="2"/>
+<Patch name="PnoBendM7-m7" hbank="84" lbank="0" prog="3"/>
+<Patch name="Org Chd m7" hbank="84" lbank="0" prog="4"/>
+<Patch name="BalapChd 9th" hbank="84" lbank="0" prog="5"/>
+<Patch name="Wah Gtr Hit" hbank="84" lbank="0" prog="6"/>
+<Patch name="Orch Hit 1" hbank="84" lbank="0" prog="7"/>
+<Patch name="Orch Hit 2" hbank="84" lbank="0" prog="8"/>
+<Patch name="Rave-X-Tasy" hbank="84" lbank="0" prog="9"/>
+<Patch name="Philly Hit 1" hbank="84" lbank="0" prog="10"/>
+<Patch name="Philly Hit 2" hbank="84" lbank="0" prog="11"/>
+<Patch name="Attack Hit" hbank="84" lbank="0" prog="12"/>
+<Patch name="Funky Hit" hbank="84" lbank="0" prog="13"/>
+<Patch name="Tekno ChdHit" hbank="84" lbank="0" prog="14"/>
+<Patch name="Dist Hit" hbank="84" lbank="0" prog="15"/>
+<Patch name="Glasgow Hit" hbank="84" lbank="0" prog="16"/>
+<Patch name="Happy Hit" hbank="84" lbank="0" prog="17"/>
+<Patch name="Scene Hit 1" hbank="84" lbank="0" prog="18"/>
+<Patch name="Scene Hit 2" hbank="84" lbank="0" prog="19"/>
+<Patch name="Drill Hit" hbank="84" lbank="0" prog="20"/>
+<Patch name="Gaia Message" hbank="84" lbank="0" prog="21"/>
+<Patch name="Rezo Perc" hbank="84" lbank="0" prog="22"/>
+<Patch name="Syn Perc" hbank="84" lbank="0" prog="23"/>
+<Patch name="MG Blip" hbank="84" lbank="0" prog="24"/>
+<Patch name="Rev Blip" hbank="84" lbank="0" prog="25"/>
+<Patch name="Air Blip" hbank="84" lbank="0" prog="26"/>
+<Patch name="Radical Perc" hbank="84" lbank="0" prog="27"/>
+<Patch name="Machine" hbank="84" lbank="0" prog="28"/>
+<Patch name="Metal Hit" hbank="84" lbank="0" prog="29"/>
+<Patch name="Tanz Devil" hbank="84" lbank="0" prog="30"/>
+<Patch name="Headz Direkt" hbank="84" lbank="0" prog="31"/>
+<Patch name="ShoppingCart" hbank="84" lbank="0" prog="32"/>
+<Patch name="Noisy Drill" hbank="84" lbank="0" prog="33"/>
+<Patch name="Thump Bounce" hbank="84" lbank="0" prog="34"/>
+<Patch name="Tape Rewind" hbank="84" lbank="0" prog="35"/>
+<Patch name="Stop" hbank="84" lbank="0" prog="36"/>
+<Patch name="Ao!" hbank="84" lbank="0" prog="37"/>
+<Patch name="Ha!" hbank="84" lbank="0" prog="38"/>
+<Patch name="Seashore" hbank="84" lbank="0" prog="39"/>
+<Patch name="Bird" hbank="84" lbank="0" prog="40"/>
+<Patch name="Telephone" hbank="84" lbank="0" prog="41"/>
+<Patch name="Helicopter" hbank="84" lbank="0" prog="42"/>
+<Patch name="Applause" hbank="84" lbank="0" prog="43"/>
+<Patch name="Gun Shot" hbank="84" lbank="0" prog="44"/>
+<Patch name="Machine Gun" hbank="84" lbank="0" prog="45"/>
+<Patch name="Laser Gun" hbank="84" lbank="0" prog="46"/>
+<Patch name="Sci-Fi Laser" hbank="84" lbank="0" prog="47"/>
+<Patch name="Breath" hbank="84" lbank="0" prog="48"/>
+<Patch name="Rain" hbank="84" lbank="0" prog="49"/>
+<Patch name="Siren" hbank="84" lbank="0" prog="50"/>
+<Patch name="TR909 Tom" hbank="84" lbank="0" prog="51"/>
+<Patch name="TR808 Tom" hbank="84" lbank="0" prog="52"/>
+<Patch name="Syn Tom 1" hbank="84" lbank="0" prog="53"/>
+<Patch name="Syn Tom 2" hbank="84" lbank="0" prog="54"/>
+<Patch name="Old Syn Tom" hbank="84" lbank="0" prog="55"/>
+<Patch name="Taiko" hbank="84" lbank="0" prog="56"/>
+<Patch name="Slow Down" hbank="84" lbank="0" prog="57"/>
+<Patch name="Boom Drop" hbank="84" lbank="0" prog="58"/>
+<Patch name="B-Tom-D" hbank="84" lbank="0" prog="59"/>
+<Patch name="Mr.Bong Bass" hbank="84" lbank="0" prog="60"/>
+<Patch name="Friends of 0" hbank="84" lbank="0" prog="61"/>
+<Patch name="Latin Perc" hbank="84" lbank="0" prog="62"/>
+<Patch name="Bongo Fury" hbank="84" lbank="0" prog="63"/>
+<Patch name="High Timbale" hbank="84" lbank="0" prog="64"/>
+<Patch name="MutePandeiro" hbank="84" lbank="0" prog="65"/>
+<Patch name="Open Surdo" hbank="84" lbank="0" prog="66"/>
+<Patch name="Brazil Perc" hbank="84" lbank="0" prog="67"/>
+<Patch name="Tablabaya" hbank="84" lbank="0" prog="68"/>
+<Patch name="Mute Cuica" hbank="84" lbank="0" prog="69"/>
+<Patch name="Long Whistle" hbank="84" lbank="0" prog="70"/>
+<Patch name="Agogo" hbank="84" lbank="0" prog="71"/>
+<Patch name="Short Tamb" hbank="84" lbank="0" prog="72"/>
+<Patch name="808 Cowbell" hbank="84" lbank="0" prog="73"/>
+<Patch name="CR78 Cowbell" hbank="84" lbank="0" prog="74"/>
+<Patch name="CR78 Beat" hbank="84" lbank="0" prog="75"/>
+<Patch name="Wind-Chime" hbank="84" lbank="0" prog="76"/>
+<Patch name="Rim Shot" hbank="84" lbank="0" prog="77"/>
+<Patch name="TR909 Rim" hbank="84" lbank="0" prog="78"/>
+<Patch name="Hyoshigi" hbank="84" lbank="0" prog="79"/>
+<Patch name="TR626 Shaker" hbank="84" lbank="0" prog="80"/>
+<Patch name="727 Quijada" hbank="84" lbank="0" prog="81"/>
+<Patch name="Real CH" hbank="84" lbank="0" prog="82"/>
+<Patch name="TR909 OH" hbank="84" lbank="0" prog="83"/>
+<Patch name="Syn OH" hbank="84" lbank="0" prog="84"/>
+<Patch name="TR909 Crash" hbank="84" lbank="0" prog="85"/>
+<Patch name="Reverse Cym." hbank="84" lbank="0" prog="86"/>
+<Patch name="Asian Gong" hbank="84" lbank="0" prog="87"/>
+<Patch name="TR808 Clap" hbank="84" lbank="0" prog="88"/>
+<Patch name="Down Clap" hbank="84" lbank="0" prog="89"/>
+<Patch name="Clap Tail" hbank="84" lbank="0" prog="90"/>
+<Patch name="Rap&amp;Real Clp" hbank="84" lbank="0" prog="91"/>
+<Patch name="Maddening" hbank="84" lbank="0" prog="92"/>
+<Patch name="TR909 Snare" hbank="84" lbank="0" prog="93"/>
+<Patch name="TR808 Snare" hbank="84" lbank="0" prog="94"/>
+<Patch name="House Snare" hbank="84" lbank="0" prog="95"/>
+<Patch name="Jungle Snr 1" hbank="84" lbank="0" prog="96"/>
+<Patch name="Jungle Snr 2" hbank="84" lbank="0" prog="97"/>
+<Patch name="TR808 Kick" hbank="84" lbank="0" prog="98"/>
+<Patch name="Plastic BD" hbank="84" lbank="0" prog="99"/>
+<Patch name="Gate Kick" hbank="84" lbank="0" prog="100"/>
+<Patch name="Jungle Kick" hbank="84" lbank="0" prog="101"/>
+<Patch name="Scrtch/Vo Mn" hbank="84" lbank="0" prog="102"/>
+<Patch name="Flexi Vox Mn" hbank="84" lbank="0" prog="103"/>
+<Patch name="Hit Menu" hbank="84" lbank="0" prog="104"/>
+<Patch name="Indust Menu" hbank="84" lbank="0" prog="105"/>
+<Patch name="Tom Menu" hbank="84" lbank="0" prog="106"/>
+<Patch name="Percus1 Menu" hbank="84" lbank="0" prog="107"/>
+<Patch name="Percus2 Menu" hbank="84" lbank="0" prog="108"/>
+<Patch name="Cowbell Menu" hbank="84" lbank="0" prog="109"/>
+<Patch name="Shaker+ Menu" hbank="84" lbank="0" prog="110"/>
+<Patch name="Rim Menu" hbank="84" lbank="0" prog="111"/>
+<Patch name="Cymbal Menu" hbank="84" lbank="0" prog="112"/>
+<Patch name="CHH 1 Menu" hbank="84" lbank="0" prog="113"/>
+<Patch name="CHH 2 Menu" hbank="84" lbank="0" prog="114"/>
+<Patch name="PHH Menu" hbank="84" lbank="0" prog="115"/>
+<Patch name="OHH 1 Menu" hbank="84" lbank="0" prog="116"/>
+<Patch name="OHH 2 Menu" hbank="84" lbank="0" prog="117"/>
+<Patch name="Clap 1 Menu" hbank="84" lbank="0" prog="118"/>
+<Patch name="Clap 2 Menu" hbank="84" lbank="0" prog="119"/>
+<Patch name="Snare 1 Menu" hbank="84" lbank="0" prog="120"/>
+<Patch name="Snare 2 Menu" hbank="84" lbank="0" prog="121"/>
+<Patch name="Snare 3 Menu" hbank="84" lbank="0" prog="122"/>
+<Patch name="Snare 4 Menu" hbank="84" lbank="0" prog="123"/>
+<Patch name="Snare 5 Menu" hbank="84" lbank="0" prog="124"/>
+<Patch name="Snare 6 Menu" hbank="84" lbank="0" prog="125"/>
+<Patch name="Kick 1 Menu" hbank="84" lbank="0" prog="126"/>
+<Patch name="Kick 2 Menu" hbank="84" lbank="0" prog="127"/>
+<Patch name="Kick 3 Menu" hbank="84" lbank="0" prog="128"/>
+</PatchGroup>
+
+<PatchGroup name="Drum 505">
+<Patch name="TR-909" hbank="81" lbank="0" prog="1"/>
+<Patch name="TR-808" hbank="81" lbank="0" prog="2"/>
+<Patch name="TR-606" hbank="81" lbank="0" prog="3"/>
+<Patch name="CR78&amp;Cheaps" hbank="81" lbank="0" prog="4"/>
+<Patch name="Techno 1" hbank="81" lbank="0" prog="5"/>
+<Patch name="Techno 2" hbank="81" lbank="0" prog="6"/>
+<Patch name="Techno 3" hbank="81" lbank="0" prog="7"/>
+<Patch name="Hardcore" hbank="81" lbank="0" prog="8"/>
+<Patch name="Ambient" hbank="81" lbank="0" prog="9"/>
+<Patch name="House 1" hbank="81" lbank="0" prog="10"/>
+<Patch name="House 2" hbank="81" lbank="0" prog="11"/>
+<Patch name="Jungle" hbank="81" lbank="0" prog="12"/>
+<Patch name="Drum n bass 1" hbank="81" lbank="0" prog="13"/>
+<Patch name="Drum n bass 2" hbank="81" lbank="0" prog="14"/>
+<Patch name="Hip-Hop 1" hbank="81" lbank="0" prog="15"/>
+<Patch name="Hip-Hop 2" hbank="81" lbank="0" prog="16"/>
+<Patch name="Funk" hbank="81" lbank="0" prog="17"/>
+<Patch name="Electro" hbank="81" lbank="0" prog="18"/>
+<Patch name="Jazz" hbank="81" lbank="0" prog="19"/>
+<Patch name="Brush" hbank="81" lbank="0" prog="20"/>
+<Patch name="Disco" hbank="81" lbank="0" prog="21"/>
+<Patch name="Ragga" hbank="81" lbank="0" prog="22"/>
+<Patch name="Rock" hbank="81" lbank="0" prog="23"/>
+<Patch name="Industrial" hbank="81" lbank="0" prog="24"/>
+<Patch name="Ethnic" hbank="81" lbank="0" prog="25"/>
+<Patch name="Reverse" hbank="81" lbank="0" prog="26"/>
+</PatchGroup>
+
+
+ </MidiInstrument>
+ </muse>
diff --git a/muse/share/instruments/Quasimidi-Sirius.idf b/muse/share/instruments/Quasimidi-Sirius.idf
new file mode 100644
index 00000000..35e3ea3a
--- /dev/null
+++ b/muse/share/instruments/Quasimidi-Sirius.idf
@@ -0,0 +1,735 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Quasimidi Sirius">
+ <PatchGroup name="Kick">
+ <Patch name="606Kick" hbank="0" lbank="1" prog="1"/>
+ <Patch name="808 High" hbank="0" lbank="1" prog="2"/>
+ <Patch name="808 Kic2" hbank="0" lbank="1" prog="3"/>
+ <Patch name="808Kick1" hbank="0" lbank="1" prog="4"/>
+ <Patch name="808XFett" hbank="0" lbank="1" prog="5"/>
+ <Patch name="909" hbank="0" lbank="1" prog="6"/>
+ <Patch name="909 2" hbank="0" lbank="1" prog="7"/>
+ <Patch name="909 3" hbank="0" lbank="1" prog="8"/>
+ <Patch name="909 4" hbank="0" lbank="1" prog="9"/>
+ <Patch name="909 5" hbank="0" lbank="1" prog="10"/>
+ <Patch name="AttackBD" hbank="0" lbank="1" prog="11"/>
+ <Patch name="AW-Brain" hbank="0" lbank="1" prog="12"/>
+ <Patch name="Basket" hbank="0" lbank="1" prog="13"/>
+ <Patch name="Big \\" hbank="0" lbank="1" prog="14"/>
+ <Patch name="Big 808" hbank="0" lbank="1" prog="15"/>
+ <Patch name="BigDirty" hbank="0" lbank="1" prog="16"/>
+ <Patch name="Big Kick" hbank="0" lbank="1" prog="17"/>
+ <Patch name="BIgPitch" hbank="0" lbank="1" prog="18"/>
+ <Patch name="Big Tom" hbank="0" lbank="1" prog="19"/>
+ <Patch name="BlamKick" hbank="0" lbank="1" prog="20"/>
+ <Patch name="Boom" hbank="0" lbank="1" prog="21"/>
+ <Patch name="BuckHard" hbank="0" lbank="1" prog="22"/>
+ <Patch name="Bumpi" hbank="0" lbank="1" prog="23"/>
+ <Patch name="Calculat" hbank="0" lbank="1" prog="24"/>
+ <Patch name="CallKick" hbank="0" lbank="1" prog="25"/>
+ <Patch name="Cascade" hbank="0" lbank="1" prog="26"/>
+ <Patch name="Classic" hbank="0" lbank="1" prog="27"/>
+ <Patch name="Clean808" hbank="0" lbank="1" prog="28"/>
+ <Patch name="ClipKick" hbank="0" lbank="1" prog="29"/>
+ <Patch name="C.P.808" hbank="0" lbank="1" prog="30"/>
+ <Patch name="Daftkick" hbank="0" lbank="1" prog="31"/>
+ <Patch name="DancKick" hbank="0" lbank="1" prog="32"/>
+ <Patch name="Deep808" hbank="0" lbank="1" prog="33"/>
+ <Patch name="DeepEnou" hbank="0" lbank="1" prog="34"/>
+ <Patch name="Deeper" hbank="0" lbank="1" prog="35"/>
+ <Patch name="DeepKick" hbank="0" lbank="1" prog="36"/>
+ <Patch name="Dindada" hbank="0" lbank="1" prog="37"/>
+ <Patch name="Dirty" hbank="0" lbank="1" prog="38"/>
+ <Patch name="Dirty 2" hbank="0" lbank="1" prog="39"/>
+ <Patch name="Dirty909" hbank="0" lbank="1" prog="40"/>
+ <Patch name="DirtySFX" hbank="0" lbank="1" prog="41"/>
+ <Patch name="Discus" hbank="0" lbank="1" prog="42"/>
+ <Patch name="Dist-808" hbank="0" lbank="1" prog="43"/>
+ <Patch name="Dutch" hbank="0" lbank="1" prog="44"/>
+ <Patch name="ElectroK" hbank="0" lbank="1" prog="45"/>
+ <Patch name="ElekSHot" hbank="0" lbank="1" prog="46"/>
+ <Patch name="Far Noiz" hbank="0" lbank="1" prog="47"/>
+ <Patch name="Fluf808K" hbank="0" lbank="1" prog="48"/>
+ <Patch name="FootKick" hbank="0" lbank="1" prog="49"/>
+ <Patch name="Formant" hbank="0" lbank="1" prog="50"/>
+ <Patch name="GlideKick" hbank="0" lbank="1" prog="51"/>
+ <Patch name="Gummm808" hbank="0" lbank="1" prog="52"/>
+ <Patch name="HardAttk" hbank="0" lbank="1" prog="53"/>
+ <Patch name="HerzShlg" hbank="0" lbank="1" prog="54"/>
+ <Patch name="HiLo" hbank="0" lbank="1" prog="55"/>
+ <Patch name="HipKick" hbank="0" lbank="1" prog="56"/>
+ <Patch name="House 1" hbank="0" lbank="1" prog="57"/>
+ <Patch name="HouseKic" hbank="0" lbank="1" prog="58"/>
+ <Patch name="Knall:-)" hbank="0" lbank="1" prog="59"/>
+ <Patch name="LAVAsse" hbank="0" lbank="1" prog="60"/>
+ <Patch name="Litf-Off" hbank="0" lbank="1" prog="61"/>
+ <Patch name="LogiKick" hbank="0" lbank="1" prog="62"/>
+ <Patch name="Medium" hbank="0" lbank="1" prog="63"/>
+ <Patch name="MelloKck" hbank="0" lbank="1" prog="64"/>
+ <Patch name="Mod 909" hbank="0" lbank="1" prog="65"/>
+ <Patch name="ModoKic" hbank="0" lbank="1" prog="66"/>
+ <Patch name="Modular" hbank="0" lbank="1" prog="67"/>
+ <Patch name="NL-Kick" hbank="0" lbank="1" prog="68"/>
+ <Patch name="NormalKc" hbank="0" lbank="1" prog="69"/>
+ <Patch name="Pitch" hbank="0" lbank="1" prog="70"/>
+ <Patch name="Pitcher" hbank="0" lbank="1" prog="71"/>
+ <Patch name="PitchKic" hbank="0" lbank="1" prog="72"/>
+ <Patch name="PlusKlas" hbank="0" lbank="1" prog="73"/>
+ <Patch name="Pump909" hbank="0" lbank="1" prog="74"/>
+ <Patch name="Pump It" hbank="0" lbank="1" prog="75"/>
+ <Patch name="PunchKic" hbank="0" lbank="1" prog="76"/>
+ <Patch name="RaffKick" hbank="0" lbank="1" prog="77"/>
+ <Patch name="Rat!" hbank="0" lbank="1" prog="78"/>
+ <Patch name="ReverbKk" hbank="0" lbank="1" prog="79"/>
+ <Patch name="RockKick" hbank="0" lbank="1" prog="80"/>
+ <Patch name="SFX-Kick" hbank="0" lbank="1" prog="81"/>
+ <Patch name="SlamKick" hbank="0" lbank="1" prog="82"/>
+ <Patch name="Special" hbank="0" lbank="1" prog="83"/>
+ <Patch name="Splatt" hbank="0" lbank="1" prog="84"/>
+ <Patch name="Staub" hbank="0" lbank="1" prog="85"/>
+ <Patch name="Staubig" hbank="0" lbank="1" prog="86"/>
+ <Patch name="Stopped" hbank="0" lbank="1" prog="87"/>
+ <Patch name="SuperDry" hbank="0" lbank="1" prog="88"/>
+ <Patch name="TAmmBD" hbank="0" lbank="1" prog="89"/>
+ <Patch name="The Grid" hbank="0" lbank="1" prog="90"/>
+ <Patch name="ToneKick" hbank="0" lbank="1" prog="91"/>
+ <Patch name="Ultra!" hbank="0" lbank="1" prog="92"/>
+ <Patch name="UltraDry" hbank="0" lbank="1" prog="93"/>
+ <Patch name="WetKick" hbank="0" lbank="1" prog="94"/>
+ <Patch name="ZannZ BD" hbank="0" lbank="1" prog="95"/>
+ <Patch name="ZunchKic" hbank="0" lbank="1" prog="96"/>
+ </PatchGroup>
+ <PatchGroup name="Snare">
+ <Patch name="16 Toms" hbank="0" lbank="1" prog="1"/>
+ <Patch name="1943" hbank="0" lbank="1" prog="2"/>
+ <Patch name="606 Snar" hbank="0" lbank="1" prog="3"/>
+ <Patch name="606 Snar2" hbank="0" lbank="1" prog="4"/>
+ <Patch name="808" hbank="0" lbank="1" prog="5"/>
+ <Patch name="808 2" hbank="0" lbank="1" prog="6"/>
+ <Patch name="808 3" hbank="0" lbank="1" prog="7"/>
+ <Patch name="808Bottm" hbank="0" lbank="1" prog="8"/>
+ <Patch name="808HiPas" hbank="0" lbank="1" prog="9"/>
+ <Patch name="808HiPas2" hbank="0" lbank="1" prog="10"/>
+ <Patch name="808 HP" hbank="0" lbank="1" prog="11"/>
+ <Patch name="808Snapp" hbank="0" lbank="1" prog="12"/>
+ <Patch name="808Snar1" hbank="0" lbank="1" prog="13"/>
+ <Patch name="808Snar2" hbank="0" lbank="1" prog="14"/>
+ <Patch name="808Snar3" hbank="0" lbank="1" prog="15"/>
+ <Patch name="808Snar4" hbank="0" lbank="1" prog="16"/>
+ <Patch name="808Velo" hbank="0" lbank="1" prog="17"/>
+ <Patch name="909" hbank="0" lbank="1" prog="18"/>
+ <Patch name="909 2" hbank="0" lbank="1" prog="19"/>
+ <Patch name="909 High" hbank="0" lbank="1" prog="20"/>
+ <Patch name="909 High2" hbank="0" lbank="1" prog="21"/>
+ <Patch name="909 Snd" hbank="0" lbank="1" prog="22"/>
+ <Patch name="BadTuned" hbank="0" lbank="1" prog="23"/>
+ <Patch name="Blood" hbank="0" lbank="1" prog="24"/>
+ <Patch name="Carpt909" hbank="0" lbank="1" prog="25"/>
+ <Patch name="Clear" hbank="0" lbank="1" prog="26"/>
+ <Patch name="ClickSnar" hbank="0" lbank="1" prog="27"/>
+ <Patch name="DanceSnd" hbank="0" lbank="1" prog="28"/>
+ <Patch name="DB Snare" hbank="0" lbank="1" prog="29"/>
+ <Patch name="DeepTras" hbank="0" lbank="1" prog="30"/>
+ <Patch name="Delayed" hbank="0" lbank="1" prog="31"/>
+ <Patch name="Delayed2" hbank="0" lbank="1" prog="32"/>
+ <Patch name="DeppTund" hbank="0" lbank="1" prog="33"/>
+ <Patch name="DirtySht" hbank="0" lbank="1" prog="34"/>
+ <Patch name="Djacka" hbank="0" lbank="1" prog="35"/>
+ <Patch name="DrMnBsSD" hbank="0" lbank="1" prog="36"/>
+ <Patch name="DropjeBB" hbank="0" lbank="1" prog="37"/>
+ <Patch name="DryDrop" hbank="0" lbank="1" prog="38"/>
+ <Patch name="DryLow" hbank="0" lbank="1" prog="39"/>
+ <Patch name="Effector" hbank="0" lbank="1" prog="40"/>
+ <Patch name="Egon Hal" hbank="0" lbank="1" prog="41"/>
+ <Patch name="Electro" hbank="0" lbank="1" prog="42"/>
+ <Patch name="Eventtic" hbank="0" lbank="1" prog="43"/>
+ <Patch name="Fats" hbank="0" lbank="1" prog="44"/>
+ <Patch name="FilterVL" hbank="0" lbank="1" prog="45"/>
+ <Patch name="Hallsnd" hbank="0" lbank="1" prog="46"/>
+ <Patch name="HighEnd" hbank="0" lbank="1" prog="47"/>
+ <Patch name="HipHopSD" hbank="0" lbank="1" prog="48"/>
+ <Patch name="HipSnare" hbank="0" lbank="1" prog="49"/>
+ <Patch name="Hi Snare" hbank="0" lbank="1" prog="50"/>
+ <Patch name="HouseSnd" hbank="0" lbank="1" prog="51"/>
+ <Patch name="HughSnar" hbank="0" lbank="1" prog="52"/>
+ <Patch name="Hypasnar" hbank="0" lbank="1" prog="53"/>
+ <Patch name="Linn1" hbank="0" lbank="1" prog="54"/>
+ <Patch name="LinnReso" hbank="0" lbank="1" prog="55"/>
+ <Patch name="LoFiSnar" hbank="0" lbank="1" prog="56"/>
+ <Patch name="MAchine" hbank="0" lbank="1" prog="57"/>
+ <Patch name="MelloSnd" hbank="0" lbank="1" prog="58"/>
+ <Patch name="MellwSnd" hbank="0" lbank="1" prog="59"/>
+ <Patch name="MetaLead" hbank="0" lbank="1" prog="60"/>
+ <Patch name="Modulate" hbank="0" lbank="1" prog="61"/>
+ <Patch name="MouthSnd" hbank="0" lbank="1" prog="62"/>
+ <Patch name="MS202 Sna" hbank="0" lbank="1" prog="63"/>
+ <Patch name="NatSnare" hbank="0" lbank="1" prog="64"/>
+ <Patch name="NoFiSnar" hbank="0" lbank="1" prog="65"/>
+ <Patch name="NoiseMod" hbank="0" lbank="1" prog="66"/>
+ <Patch name="NoiseSnr" hbank="0" lbank="1" prog="67"/>
+ <Patch name="Noise Snr" hbank="0" lbank="1" prog="68"/>
+ <Patch name="Noizclap" hbank="0" lbank="1" prog="69"/>
+ <Patch name="Noname" hbank="0" lbank="1" prog="70"/>
+ <Patch name="NoSense" hbank="0" lbank="1" prog="71"/>
+ <Patch name="Pactroni" hbank="0" lbank="1" prog="72"/>
+ <Patch name="PCM Sna1" hbank="0" lbank="1" prog="73"/>
+ <Patch name="Pitch EG" hbank="0" lbank="1" prog="74"/>
+ <Patch name="Pitch EG2" hbank="0" lbank="1" prog="75"/>
+ <Patch name="QM-High" hbank="0" lbank="1" prog="76"/>
+ <Patch name="RachgSnd" hbank="0" lbank="1" prog="77"/>
+ <Patch name="Reso 909" hbank="0" lbank="1" prog="78"/>
+ <Patch name="Reverb" hbank="0" lbank="1" prog="79"/>
+ <Patch name="Reverse" hbank="0" lbank="1" prog="80"/>
+ <Patch name="RollSnar" hbank="0" lbank="1" prog="81"/>
+ <Patch name="Scratch!" hbank="0" lbank="1" prog="82"/>
+ <Patch name="Short909" hbank="0" lbank="1" prog="83"/>
+ <Patch name="ShortBig" hbank="0" lbank="1" prog="84"/>
+ <Patch name="ShortSnr" hbank="0" lbank="1" prog="85"/>
+ <Patch name="Shorty" hbank="0" lbank="1" prog="86"/>
+ <Patch name="Short@@YY" hbank="0" lbank="1" prog="87"/>
+ <Patch name="SniffSnd" hbank="0" lbank="1" prog="88"/>
+ <Patch name="SnipSnar" hbank="0" lbank="1" prog="89"/>
+ <Patch name="Stopped" hbank="0" lbank="1" prog="90"/>
+ <Patch name="Sweepeea" hbank="0" lbank="1" prog="91"/>
+ <Patch name="Ticker" hbank="0" lbank="1" prog="92"/>
+ <Patch name="UniVox" hbank="0" lbank="1" prog="93"/>
+ <Patch name="Velo 909" hbank="0" lbank="1" prog="94"/>
+ <Patch name="WindSnar" hbank="0" lbank="1" prog="95"/>
+ <Patch name="WirbelXT" hbank="0" lbank="1" prog="96"/>
+ </PatchGroup>
+ <PatchGroup name="HH">
+ <Patch name="808 ??" hbank="0" lbank="1" prog="1"/>
+ <Patch name="808 1" hbank="0" lbank="1" prog="2"/>
+ <Patch name="808 2" hbank="0" lbank="1" prog="3"/>
+ <Patch name="808Tickl" hbank="0" lbank="1" prog="4"/>
+ <Patch name="8.8 mono" hbank="0" lbank="1" prog="5"/>
+ <Patch name="909**_**" hbank="0" lbank="1" prog="6"/>
+ <Patch name="909CutEG" hbank="0" lbank="1" prog="7"/>
+ <Patch name="909 Hatt" hbank="0" lbank="1" prog="8"/>
+ <Patch name="909 High" hbank="0" lbank="1" prog="9"/>
+ <Patch name="909HP+" hbank="0" lbank="1" prog="10"/>
+ <Patch name="909itsch" hbank="0" lbank="1" prog="11"/>
+ <Patch name="909 mono" hbank="0" lbank="1" prog="12"/>
+ <Patch name="Agressiv" hbank="0" lbank="1" prog="13"/>
+ <Patch name="Aua-HH" hbank="0" lbank="1" prog="14"/>
+ <Patch name="Bad 808" hbank="0" lbank="1" prog="15"/>
+ <Patch name="Blech" hbank="0" lbank="1" prog="16"/>
+ <Patch name="Blech HH" hbank="0" lbank="1" prog="17"/>
+ <Patch name="Bubbles" hbank="0" lbank="1" prog="18"/>
+ <Patch name="ButterHH" hbank="0" lbank="1" prog="19"/>
+ <Patch name="CR-808" hbank="0" lbank="1" prog="20"/>
+ <Patch name="Crackle" hbank="0" lbank="1" prog="21"/>
+ <Patch name="DanceHH" hbank="0" lbank="1" prog="22"/>
+ <Patch name="Delay808" hbank="0" lbank="1" prog="23"/>
+ <Patch name="DirtEcho" hbank="0" lbank="1" prog="24"/>
+ <Patch name="Dirty" hbank="0" lbank="1" prog="25"/>
+ <Patch name="DirtyHH1" hbank="0" lbank="1" prog="26"/>
+ <Patch name="DJ Best" hbank="0" lbank="1" prog="27"/>
+ <Patch name="DynaLinn" hbank="0" lbank="1" prog="28"/>
+ <Patch name="Glitsch" hbank="0" lbank="1" prog="29"/>
+ <Patch name="God-HH" hbank="0" lbank="1" prog="30"/>
+ <Patch name="Gogo" hbank="0" lbank="1" prog="31"/>
+ <Patch name="Gongs" hbank="0" lbank="1" prog="32"/>
+ <Patch name="HAT LFO1" hbank="0" lbank="1" prog="33"/>
+ <Patch name="HAT LFO2" hbank="0" lbank="1" prog="34"/>
+ <Patch name="HAT mono" hbank="0" lbank="1" prog="35"/>
+ <Patch name="HighEcho" hbank="0" lbank="1" prog="36"/>
+ <Patch name="Higher" hbank="0" lbank="1" prog="37"/>
+ <Patch name="HighPas1" hbank="0" lbank="1" prog="38"/>
+ <Patch name="HighPas2" hbank="0" lbank="1" prog="39"/>
+ <Patch name="HighPas3" hbank="0" lbank="1" prog="40"/>
+ <Patch name="HighPas4" hbank="0" lbank="1" prog="41"/>
+ <Patch name="HipHop" hbank="0" lbank="1" prog="42"/>
+ <Patch name="Indust" hbank="0" lbank="1" prog="43"/>
+ <Patch name="JazHat" hbank="0" lbank="1" prog="44"/>
+ <Patch name="LFO" hbank="0" lbank="1" prog="45"/>
+ <Patch name="LFO-Hatt" hbank="0" lbank="1" prog="46"/>
+ <Patch name="Lofihat" hbank="0" lbank="1" prog="47"/>
+ <Patch name="LongMS" hbank="0" lbank="1" prog="48"/>
+ <Patch name="LusChig" hbank="0" lbank="1" prog="49"/>
+ <Patch name="Mad HH" hbank="0" lbank="1" prog="50"/>
+ <Patch name="MayBeam" hbank="0" lbank="1" prog="51"/>
+ <Patch name="Mean HH" hbank="0" lbank="1" prog="52"/>
+ <Patch name="MesserHH" hbank="0" lbank="1" prog="53"/>
+ <Patch name="Metalic" hbank="0" lbank="1" prog="54"/>
+ <Patch name="Modulat2" hbank="0" lbank="1" prog="55"/>
+ <Patch name="Modulat2" hbank="0" lbank="1" prog="56"/>
+ <Patch name="Modulate" hbank="0" lbank="1" prog="57"/>
+ <Patch name="Modulate" hbank="0" lbank="1" prog="58"/>
+ <Patch name="Modulate" hbank="0" lbank="1" prog="59"/>
+ <Patch name="ModulSnd" hbank="0" lbank="1" prog="60"/>
+ <Patch name="MS 20" hbank="0" lbank="1" prog="61"/>
+ <Patch name="MS 20Pit" hbank="0" lbank="1" prog="62"/>
+ <Patch name="NatHi-Hat" hbank="0" lbank="1" prog="63"/>
+ <Patch name="Natura" hbank="0" lbank="1" prog="64"/>
+ <Patch name="Naturell" hbank="0" lbank="1" prog="65"/>
+ <Patch name="NHi-Hat-1" hbank="0" lbank="1" prog="66"/>
+ <Patch name="NoizeHat" hbank="0" lbank="1" prog="67"/>
+ <Patch name="Norm-909" hbank="0" lbank="1" prog="68"/>
+ <Patch name="PingPong" hbank="0" lbank="1" prog="69"/>
+ <Patch name="PitchChg" hbank="0" lbank="1" prog="70"/>
+ <Patch name="Pitch EG" hbank="0" lbank="1" prog="71"/>
+ <Patch name="Pitch EG2" hbank="0" lbank="1" prog="72"/>
+ <Patch name="Pitch EG3" hbank="0" lbank="1" prog="73"/>
+ <Patch name="Pitch EG4" hbank="0" lbank="1" prog="74"/>
+ <Patch name="Q Wa Dis" hbank="0" lbank="1" prog="75"/>
+ <Patch name="Remix" hbank="0" lbank="1" prog="76"/>
+ <Patch name="Resonance" hbank="0" lbank="1" prog="77"/>
+ <Patch name="RockHiHat" hbank="0" lbank="1" prog="78"/>
+ <Patch name="RoqueY" hbank="0" lbank="1" prog="79"/>
+ <Patch name="Short 808" hbank="0" lbank="1" prog="80"/>
+ <Patch name="Short909" hbank="0" lbank="1" prog="81"/>
+ <Patch name="ShortTac" hbank="0" lbank="1" prog="82"/>
+ <Patch name="Shorty" hbank="0" lbank="1" prog="83"/>
+ <Patch name="Sirius" hbank="0" lbank="1" prog="84"/>
+ <Patch name="Slitsch" hbank="0" lbank="1" prog="85"/>
+ <Patch name="SwiftHH" hbank="0" lbank="1" prog="86"/>
+ <Patch name="TakeThis" hbank="0" lbank="1" prog="87"/>
+ <Patch name="Thor" hbank="0" lbank="1" prog="88"/>
+ <Patch name="TinHiHat" hbank="0" lbank="1" prog="89"/>
+ <Patch name="Tricky" hbank="0" lbank="1" prog="90"/>
+ <Patch name="Unikat" hbank="0" lbank="1" prog="91"/>
+ <Patch name="UniVox" hbank="0" lbank="1" prog="92"/>
+ <Patch name="VinylHat" hbank="0" lbank="1" prog="93"/>
+ <Patch name="WolligHH" hbank="0" lbank="1" prog="94"/>
+ <Patch name="Worm-909" hbank="0" lbank="1" prog="95"/>
+ <Patch name="Zippi" hbank="0" lbank="1" prog="96"/>
+ </PatchGroup>
+ <PatchGroup name="Perc">
+ <Patch name="808 Set" hbank="0" lbank="1" prog="1"/>
+ <Patch name="Aborigin" hbank="0" lbank="1" prog="2"/>
+ <Patch name="Animals?" hbank="0" lbank="1" prog="3"/>
+ <Patch name="ARPEG-DR" hbank="0" lbank="1" prog="4"/>
+ <Patch name="Attack1" hbank="0" lbank="1" prog="5"/>
+ <Patch name="Attack2" hbank="0" lbank="1" prog="6"/>
+ <Patch name="Be Fxed" hbank="0" lbank="1" prog="7"/>
+ <Patch name="Bingo" hbank="0" lbank="1" prog="8"/>
+ <Patch name="ClapClap" hbank="0" lbank="1" prog="9"/>
+ <Patch name="Condensed" hbank="0" lbank="1" prog="10"/>
+ <Patch name="Cut This" hbank="0" lbank="1" prog="11"/>
+ <Patch name="Daft1Set" hbank="0" lbank="1" prog="12"/>
+ <Patch name="Daft2Set" hbank="0" lbank="1" prog="13"/>
+ <Patch name="Dance" hbank="0" lbank="1" prog="14"/>
+ <Patch name="DanceSet" hbank="0" lbank="1" prog="15"/>
+ <Patch name="DeepNois" hbank="0" lbank="1" prog="16"/>
+ <Patch name="Distor2" hbank="0" lbank="1" prog="17"/>
+ <Patch name="Distorto" hbank="0" lbank="1" prog="18"/>
+ <Patch name="DrmBass1" hbank="0" lbank="1" prog="19"/>
+ <Patch name="E-D-S" hbank="0" lbank="1" prog="20"/>
+ <Patch name="Effekted" hbank="0" lbank="1" prog="21"/>
+ <Patch name="Electro" hbank="0" lbank="1" prog="22"/>
+ <Patch name="Electro2" hbank="0" lbank="1" prog="23"/>
+ <Patch name="FatePerc" hbank="0" lbank="1" prog="24"/>
+ <Patch name="FilterIt" hbank="0" lbank="1" prog="25"/>
+ <Patch name="GatePerc" hbank="0" lbank="1" prog="26"/>
+ <Patch name="Good For" hbank="0" lbank="1" prog="27"/>
+ <Patch name="GrooveDT" hbank="0" lbank="1" prog="28"/>
+ <Patch name="Groov Fx" hbank="0" lbank="1" prog="29"/>
+ <Patch name="Groov HP" hbank="0" lbank="1" prog="30"/>
+ <Patch name="GroovSet" hbank="0" lbank="1" prog="31"/>
+ <Patch name="GroovSet" hbank="0" lbank="1" prog="32"/>
+ <Patch name="Help!" hbank="0" lbank="1" prog="33"/>
+ <Patch name="HiFreq 8" hbank="0" lbank="1" prog="34"/>
+ <Patch name="HiFreq 9" hbank="0" lbank="1" prog="35"/>
+ <Patch name="HopSet1" hbank="0" lbank="1" prog="36"/>
+ <Patch name="HouseSet" hbank="0" lbank="1" prog="37"/>
+ <Patch name="Lambura" hbank="0" lbank="1" prog="38"/>
+ <Patch name="Latin" hbank="0" lbank="1" prog="39"/>
+ <Patch name="Linn 2" hbank="0" lbank="1" prog="40"/>
+ <Patch name="LinnShrt" hbank="0" lbank="1" prog="41"/>
+ <Patch name="Lirasis" hbank="0" lbank="1" prog="42"/>
+ <Patch name="LoFi 1" hbank="0" lbank="1" prog="43"/>
+ <Patch name="LoFi 2" hbank="0" lbank="1" prog="44"/>
+ <Patch name="Lofi 808" hbank="0" lbank="1" prog="45"/>
+ <Patch name="Lofi 909" hbank="0" lbank="1" prog="46"/>
+ <Patch name="LoFiPerc" hbank="0" lbank="1" prog="47"/>
+ <Patch name="L-R-U-D" hbank="0" lbank="1" prog="48"/>
+ <Patch name="MAD-Perc" hbank="0" lbank="1" prog="49"/>
+ <Patch name="MahaMono" hbank="0" lbank="1" prog="50"/>
+ <Patch name="Maharish" hbank="0" lbank="1" prog="51"/>
+ <Patch name="Mega-Pec" hbank="0" lbank="1" prog="52"/>
+ <Patch name="Mfc" hbank="0" lbank="1" prog="53"/>
+ <Patch name="MindBurn" hbank="0" lbank="1" prog="54"/>
+ <Patch name="Minn Set" hbank="0" lbank="1" prog="55"/>
+ <Patch name="Modul" hbank="0" lbank="1" prog="56"/>
+ <Patch name="MoreFun!" hbank="0" lbank="1" prog="57"/>
+ <Patch name="Muffelig" hbank="0" lbank="1" prog="58"/>
+ <Patch name="Newkits" hbank="0" lbank="1" prog="59"/>
+ <Patch name="Percus1" hbank="0" lbank="1" prog="60"/>
+ <Patch name="Perfect" hbank="0" lbank="1" prog="61"/>
+ <Patch name="Pitched" hbank="0" lbank="1" prog="62"/>
+ <Patch name="Pitching" hbank="0" lbank="1" prog="63"/>
+ <Patch name="Plucked" hbank="0" lbank="1" prog="64"/>
+ <Patch name="Poona" hbank="0" lbank="1" prog="65"/>
+ <Patch name="Power" hbank="0" lbank="1" prog="66"/>
+ <Patch name="PowerTom" hbank="0" lbank="1" prog="67"/>
+ <Patch name="Quasar" hbank="0" lbank="1" prog="68"/>
+ <Patch name="ResPerc" hbank="0" lbank="1" prog="69"/>
+ <Patch name="Reverse" hbank="0" lbank="1" prog="70"/>
+ <Patch name="SatePerc" hbank="0" lbank="1" prog="71"/>
+ <Patch name="Shatter" hbank="0" lbank="1" prog="72"/>
+ <Patch name="Short808" hbank="0" lbank="1" prog="73"/>
+ <Patch name="Short909" hbank="0" lbank="1" prog="74"/>
+ <Patch name="Short HP" hbank="0" lbank="1" prog="75"/>
+ <Patch name="ShortSet" hbank="0" lbank="1" prog="76"/>
+ <Patch name="Sir^ius" hbank="0" lbank="1" prog="77"/>
+ <Patch name="SomeFunk" hbank="0" lbank="1" prog="78"/>
+ <Patch name="Sritshi" hbank="0" lbank="1" prog="79"/>
+ <Patch name="Standard" hbank="0" lbank="1" prog="80"/>
+ <Patch name="Strange" hbank="0" lbank="1" prog="81"/>
+ <Patch name="SuperFX1" hbank="0" lbank="1" prog="82"/>
+ <Patch name="SuperFX2" hbank="0" lbank="1" prog="83"/>
+ <Patch name="SuperFX3" hbank="0" lbank="1" prog="84"/>
+ <Patch name="Swishi" hbank="0" lbank="1" prog="85"/>
+ <Patch name="Tablatoi" hbank="0" lbank="1" prog="86"/>
+ <Patch name="Tanz-Set" hbank="0" lbank="1" prog="87"/>
+ <Patch name="TotalCon" hbank="0" lbank="1" prog="88"/>
+ <Patch name="Vari FX1" hbank="0" lbank="1" prog="89"/>
+ <Patch name="Vari FX2" hbank="0" lbank="1" prog="90"/>
+ <Patch name="Waves" hbank="0" lbank="1" prog="91"/>
+ <Patch name="WestBam" hbank="0" lbank="1" prog="92"/>
+ <Patch name="WierdPec" hbank="0" lbank="1" prog="93"/>
+ <Patch name="X_Trans" hbank="0" lbank="1" prog="94"/>
+ <Patch name="Y_Transf" hbank="0" lbank="1" prog="95"/>
+ <Patch name="ZipZap" hbank="0" lbank="1" prog="96"/>
+ </PatchGroup>
+<PatchGroup name="Bass">
+ <Patch name="202 Bass" hbank="0" lbank="3" prog="14"/>
+ <Patch name="Acid Mod" hbank="0" lbank="3" prog="3"/>
+ <Patch name="*Atom*" hbank="0" lbank="1" prog="10"/>
+ <Patch name="CoolBass" hbank="0" lbank="1" prog="3"/>
+ <Patch name="DA Hool" hbank="0" lbank="2" prog="10"/>
+ <Patch name="D+BASS" hbank="0" lbank="3" prog="4"/>
+ <Patch name="DeepBass" hbank="0" lbank="1" prog="16"/>
+ <Patch name="DeepHaus" hbank="0" lbank="3" prog="7"/>
+ <Patch name="DiscoBas" hbank="0" lbank="1" prog="9"/>
+ <Patch name="DiscoBas2" hbank="0" lbank="2" prog="9"/>
+ <Patch name="FatBoy" hbank="0" lbank="1" prog="6"/>
+ <Patch name="FatBoy2" hbank="0" lbank="2" prog="6"/>
+ <Patch name="Filter!" hbank="0" lbank="1" prog="14"/>
+ <Patch name="Filter!2" hbank="0" lbank="2" prog="14"/>
+ <Patch name="Frogger" hbank="0" lbank="3" prog="9"/>
+ <Patch name="Funk-Man" hbank="0" lbank="3" prog="8"/>
+ <Patch name="Funky HK" hbank="0" lbank="3" prog="13"/>
+ <Patch name="Glider" hbank="0" lbank="3" prog="2"/>
+ <Patch name="Junky CP" hbank="0" lbank="3" prog="1"/>
+ <Patch name="MKS-50Bs" hbank="0" lbank="3" prog="11"/>
+ <Patch name="Mod2bass" hbank="0" lbank="1" prog="5"/>
+ <Patch name="Mod&amp;apos Bass" hbank="0" lbank="3" prog="16"/>
+ <Patch name="Mod Bass" hbank="0" lbank="2" prog="5"/>
+ <Patch name="ModuloBX" hbank="0" lbank="1" prog="4"/>
+ <Patch name="ModuloBX2" hbank="0" lbank="2" prog="4"/>
+ <Patch name="OffBeat" hbank="0" lbank="3" prog="6"/>
+ <Patch name="PercBass" hbank="0" lbank="2" prog="8"/>
+ <Patch name="PercSine" hbank="0" lbank="1" prog="11"/>
+ <Patch name="PhaseBas" hbank="0" lbank="3" prog="10"/>
+ <Patch name="PizzaBss" hbank="0" lbank="3" prog="5"/>
+ <Patch name="ResoBass" hbank="0" lbank="1" prog="12"/>
+ <Patch name="SineBass" hbank="0" lbank="1" prog="2"/>
+ <Patch name="SineBass2" hbank="0" lbank="2" prog="11"/>
+ <Patch name="SlfoBass" hbank="0" lbank="3" prog="15"/>
+ <Patch name="Stopped" hbank="0" lbank="2" prog="16"/>
+ <Patch name="TranceBS" hbank="0" lbank="1" prog="13"/>
+ <Patch name="TranceBS2" hbank="0" lbank="2" prog="13"/>
+ <Patch name="Trancer" hbank="0" lbank="2" prog="2"/>
+ <Patch name="UmtraBas" hbank="0" lbank="3" prog="12"/>
+ <Patch name="WaveBass" hbank="0" lbank="1" prog="15"/>
+ <Patch name="WaveBass2" hbank="0" lbank="2" prog="15"/>
+ <Patch name="Wet&amp;amp Bass" hbank="0" lbank="1" prog="8"/>
+ <Patch name="Wetbass" hbank="0" lbank="2" prog="1"/>
+ <Patch name="WetBass2" hbank="0" lbank="1" prog="1"/>
+ <Patch name="WetFiltr" hbank="0" lbank="2" prog="3"/>
+ <Patch name="Wetlong" hbank="0" lbank="1" prog="7"/>
+ <Patch name="WetLong2" hbank="0" lbank="2" prog="7"/>
+ <Patch name="XenoBass" hbank="0" lbank="2" prog="12"/>
+</PatchGroup>
+<PatchGroup name="Dirty bass">
+ <Patch name="303like" hbank="0" lbank="3" prog="26"/>
+ <Patch name="303Velo" hbank="0" lbank="1" prog="21"/>
+ <Patch name="303Velo2" hbank="0" lbank="2" prog="21"/>
+ <Patch name="309 Bass" hbank="0" lbank="3" prog="32"/>
+ <Patch name="80s Bass" hbank="0" lbank="3" prog="22"/>
+ <Patch name="80s Lead" hbank="0" lbank="3" prog="19"/>
+ <Patch name="Bass ???" hbank="0" lbank="3" prog="30"/>
+ <Patch name="Bassline" hbank="0" lbank="3" prog="31"/>
+ <Patch name="Bi-Bass" hbank="0" lbank="3" prog="24"/>
+ <Patch name="Bitterfd" hbank="0" lbank="2" prog="27"/>
+ <Patch name="Board" hbank="0" lbank="3" prog="20"/>
+ <Patch name="Classic!" hbank="0" lbank="2" prog="31"/>
+ <Patch name="Classic2" hbank="0" lbank="2" prog="32"/>
+ <Patch name="Detune!" hbank="0" lbank="2" prog="22"/>
+ <Patch name="DirSynt" hbank="0" lbank="1" prog="17"/>
+ <Patch name="Dirt309" hbank="0" lbank="1" prog="18"/>
+ <Patch name="DownSwep" hbank="0" lbank="2" prog="17"/>
+ <Patch name="Eraser" hbank="0" lbank="2" prog="28"/>
+ <Patch name="FatDirty" hbank="0" lbank="1" prog="27"/>
+ <Patch name="Forte" hbank="0" lbank="2" prog="18"/>
+ <Patch name="GuitarBs" hbank="0" lbank="1" prog="25"/>
+ <Patch name="Instable" hbank="0" lbank="3" prog="29"/>
+ <Patch name="IntroBas" hbank="0" lbank="2" prog="30"/>
+ <Patch name="JenY?" hbank="0" lbank="2" prog="26"/>
+ <Patch name="LuckyBas" hbank="0" lbank="1" prog="19"/>
+ <Patch name="LuckyBas2" hbank="0" lbank="2" prog="19"/>
+ <Patch name="Masse X" hbank="0" lbank="3" prog="25"/>
+ <Patch name="MixBass" hbank="0" lbank="2" prog="23"/>
+ <Patch name="MixOct" hbank="0" lbank="1" prog="23"/>
+ <Patch name="NovaBass" hbank="0" lbank="3" prog="18"/>
+ <Patch name="Pad-Bass" hbank="0" lbank="3" prog="23"/>
+ <Patch name="PPG-Bass" hbank="0" lbank="1" prog="30"/>
+ <Patch name="REBIRTH" hbank="0" lbank="3" prog="27"/>
+ <Patch name="REBIRTH2" hbank="0" lbank="3" prog="21"/>
+ <Patch name="SaverSex" hbank="0" lbank="1" prog="20"/>
+ <Patch name="SaverSex2" hbank="0" lbank="2" prog="20"/>
+ <Patch name="SawBass" hbank="0" lbank="1" prog="29"/>
+ <Patch name="S-Faster" hbank="0" lbank="1" prog="26"/>
+ <Patch name="ShortBas" hbank="0" lbank="1" prog="24"/>
+ <Patch name="ShortBas2" hbank="0" lbank="2" prog="24"/>
+ <Patch name="SH-X" hbank="0" lbank="3" prog="17"/>
+ <Patch name="StringBS" hbank="0" lbank="1" prog="32"/>
+ <Patch name="Synced!" hbank="0" lbank="2" prog="25"/>
+ <Patch name="VeryDirt" hbank="0" lbank="1" prog="22"/>
+ <Patch name="VoiceBas" hbank="0" lbank="2" prog="29"/>
+ <Patch name="WeichBas" hbank="0" lbank="3" prog="28"/>
+ <Patch name="WetMoog!" hbank="0" lbank="1" prog="31"/>
+ <Patch name="ZapBass" hbank="0" lbank="1" prog="28"/>
+</PatchGroup>
+<PatchGroup name="Pad">
+ <Patch name="AntiSwep" hbank="0" lbank="2" prog="37"/>
+ <Patch name="Big Pad" hbank="0" lbank="1" prog="48"/>
+ <Patch name="BigWsep" hbank="0" lbank="2" prog="39"/>
+ <Patch name="BrightPd" hbank="0" lbank="1" prog="35"/>
+ <Patch name="Chor" hbank="0" lbank="1" prog="37"/>
+ <Patch name="Deep Pad" hbank="0" lbank="1" prog="46"/>
+ <Patch name="Deep Pad2" hbank="0" lbank="3" prog="39"/>
+ <Patch name="D.I.Auge" hbank="0" lbank="3" prog="38"/>
+ <Patch name="Digichor" hbank="0" lbank="3" prog="48"/>
+ <Patch name="Digistrx" hbank="0" lbank="3" prog="47"/>
+ <Patch name="DunePad1" hbank="0" lbank="3" prog="42"/>
+ <Patch name="Enfrhmki" hbank="0" lbank="3" prog="36"/>
+ <Patch name="FastStrg" hbank="0" lbank="2" prog="44"/>
+ <Patch name="Fat Pad" hbank="0" lbank="2" prog="34"/>
+ <Patch name="Feel It!" hbank="0" lbank="3" prog="43"/>
+ <Patch name="GateSynt" hbank="0" lbank="1" prog="43"/>
+ <Patch name="HighSwep" hbank="0" lbank="2" prog="38"/>
+ <Patch name="HighSynth" hbank="0" lbank="2" prog="45"/>
+ <Patch name="Histring" hbank="0" lbank="3" prog="45"/>
+ <Patch name="Hohner" hbank="0" lbank="2" prog="36"/>
+ <Patch name="Jet Pad1" hbank="0" lbank="1" prog="47"/>
+ <Patch name="Juno-Org" hbank="0" lbank="3" prog="44"/>
+ <Patch name="Koyaa" hbank="0" lbank="3" prog="34"/>
+ <Patch name="Long Pad" hbank="0" lbank="2" prog="46"/>
+ <Patch name="LushSpec" hbank="0" lbank="2" prog="35"/>
+ <Patch name="Mellotrn" hbank="0" lbank="1" prog="38"/>
+ <Patch name="Mod Pad1" hbank="0" lbank="2" prog="47"/>
+ <Patch name="Orchestr" hbank="0" lbank="1" prog="45"/>
+ <Patch name="PolySynt" hbank="0" lbank="2" prog="43"/>
+ <Patch name="Portella" hbank="0" lbank="3" prog="46"/>
+ <Patch name="Rel-Pad1" hbank="0" lbank="3" prog="37"/>
+ <Patch name="Rising" hbank="0" lbank="2" prog="48"/>
+ <Patch name="Sentinel" hbank="0" lbank="1" prog="39"/>
+ <Patch name="SeqPad" hbank="0" lbank="2" prog="41"/>
+ <Patch name="Shimmer" hbank="0" lbank="1" prog="36"/>
+ <Patch name="Shine On" hbank="0" lbank="1" prog="33"/>
+ <Patch name="Spectral" hbank="0" lbank="1" prog="42"/>
+ <Patch name="Stoffich" hbank="0" lbank="3" prog="40"/>
+ <Patch name="StrangeP" hbank="0" lbank="3" prog="35"/>
+ <Patch name="Strings" hbank="0" lbank="2" prog="40"/>
+ <Patch name="Swallow" hbank="0" lbank="1" prog="44"/>
+ <Patch name="Tangram" hbank="0" lbank="2" prog="42"/>
+ <Patch name="TecPad" hbank="0" lbank="1" prog="41"/>
+ <Patch name="TubularP" hbank="0" lbank="1" prog="40"/>
+ <Patch name="VS Chor" hbank="0" lbank="1" prog="34"/>
+ <Patch name="VS Spect" hbank="0" lbank="2" prog="33"/>
+ <Patch name="WunderPD" hbank="0" lbank="3" prog="41"/>
+ <Patch name="X-Voice" hbank="0" lbank="3" prog="33"/>
+</PatchGroup>
+<PatchGroup name="Plucked">
+ <Patch name="AmbienT" hbank="0" lbank="1" prog="62"/>
+ <Patch name="Ancient" hbank="0" lbank="2" prog="64"/>
+ <Patch name="Banjojo" hbank="0" lbank="3" prog="62"/>
+ <Patch name="Bells" hbank="0" lbank="2" prog="51"/>
+ <Patch name="Block C" hbank="0" lbank="1" prog="55"/>
+ <Patch name="Bottom" hbank="0" lbank="1" prog="59"/>
+ <Patch name="ChorSeq!" hbank="0" lbank="1" prog="63"/>
+ <Patch name="Clavinet" hbank="0" lbank="2" prog="50"/>
+ <Patch name="Clavity" hbank="0" lbank="3" prog="64"/>
+ <Patch name="Clavonit" hbank="0" lbank="1" prog="50"/>
+ <Patch name="DigiDrm" hbank="0" lbank="3" prog="55"/>
+ <Patch name="Edgard F" hbank="0" lbank="2" prog="49"/>
+ <Patch name="Floating" hbank="0" lbank="1" prog="51"/>
+ <Patch name="HouseOg1" hbank="0" lbank="3" prog="53"/>
+ <Patch name="HouseOg2" hbank="0" lbank="3" prog="54"/>
+ <Patch name="InMotio2" hbank="0" lbank="2" prog="62"/>
+ <Patch name="InMotion" hbank="0" lbank="2" prog="61"/>
+ <Patch name="Into Spa" hbank="0" lbank="1" prog="61"/>
+ <Patch name="Kraftwer" hbank="0" lbank="2" prog="59"/>
+ <Patch name="MadSeq" hbank="0" lbank="3" prog="52"/>
+ <Patch name="Mellows" hbank="0" lbank="3" prog="51"/>
+ <Patch name="ModPluck" hbank="0" lbank="2" prog="54"/>
+ <Patch name="ModSequa" hbank="0" lbank="1" prog="54"/>
+ <Patch name="OrbitPno" hbank="0" lbank="3" prog="57"/>
+ <Patch name="|P|C|B|" hbank="0" lbank="2" prog="55"/>
+ <Patch name="PercoChd" hbank="0" lbank="2" prog="56"/>
+ <Patch name="Perco" hbank="0" lbank="1" prog="56"/>
+ <Patch name="Percular" hbank="0" lbank="1" prog="58"/>
+ <Patch name="Percuter" hbank="0" lbank="2" prog="58"/>
+ <Patch name="Picant" hbank="0" lbank="1" prog="49"/>
+ <Patch name="PKS-50Bs" hbank="0" lbank="3" prog="60"/>
+ <Patch name="Psycorg2" hbank="0" lbank="3" prog="49"/>
+ <Patch name="Psycorg" hbank="0" lbank="3" prog="63"/>
+ <Patch name="Quintchd" hbank="0" lbank="1" prog="52"/>
+ <Patch name="SequBell" hbank="0" lbank="3" prog="61"/>
+ <Patch name="Sequent" hbank="0" lbank="2" prog="52"/>
+ <Patch name="Sequenz" hbank="0" lbank="2" prog="60"/>
+ <Patch name="Sequenz2" hbank="0" lbank="2" prog="63"/>
+ <Patch name="SequenzC" hbank="0" lbank="1" prog="60"/>
+ <Patch name="Shibuya" hbank="0" lbank="3" prog="56"/>
+ <Patch name="ShortSeq" hbank="0" lbank="1" prog="53"/>
+ <Patch name="SoftSeq1" hbank="0" lbank="2" prog="53"/>
+ <Patch name="Spectacu" hbank="0" lbank="1" prog="57"/>
+ <Patch name="Spectral" hbank="0" lbank="2" prog="57"/>
+ <Patch name="&lt;SynthiY" hbank="0" lbank="1" prog="64"/>
+ <Patch name="Tadavoc" hbank="0" lbank="3" prog="50"/>
+ <Patch name="Trancer" hbank="0" lbank="3" prog="58"/>
+ <Patch name="WaterSyn" hbank="0" lbank="3" prog="59"/>
+</PatchGroup>
+<PatchGroup name="Solo">
+ <Patch name="AngelVox" hbank="0" lbank="3" prog="71"/>
+ <Patch name="Arpeggi2" hbank="0" lbank="1" prog="68"/>
+ <Patch name="Arpeggio" hbank="0" lbank="1" prog="65"/>
+ <Patch name="Bigsolo" hbank="0" lbank="3" prog="66"/>
+ <Patch name="Cosmic B" hbank="0" lbank="3" prog="69"/>
+ <Patch name="DA Cool" hbank="0" lbank="2" prog="73"/>
+ <Patch name="DirtySol" hbank="0" lbank="2" prog="80"/>
+ <Patch name="Eastbam" hbank="0" lbank="2" prog="70"/>
+ <Patch name="Eastbam2" hbank="0" lbank="2" prog="71"/>
+ <Patch name="Eastbam3" hbank="0" lbank="2" prog="72"/>
+ <Patch name="FatSolo" hbank="0" lbank="2" prog="78"/>
+ <Patch name="FilterS1" hbank="0" lbank="1" prog="74"/>
+ <Patch name="Filt Sol" hbank="0" lbank="2" prog="66"/>
+ <Patch name="Flange" hbank="0" lbank="3" prog="78"/>
+ <Patch name="FluteSol" hbank="0" lbank="2" prog="67"/>
+ <Patch name="FSOLseq" hbank="0" lbank="3" prog="76"/>
+ <Patch name="Goa!" hbank="0" lbank="1" prog="67"/>
+ <Patch name="HardSeq!" hbank="0" lbank="1" prog="70"/>
+ <Patch name="HighSeq1" hbank="0" lbank="2" prog="74"/>
+ <Patch name="HighSeq2" hbank="0" lbank="1" prog="75"/>
+ <Patch name="Hot Fat" hbank="0" lbank="3" prog="67"/>
+ <Patch name="LuckySol" hbank="0" lbank="2" prog="65"/>
+ <Patch name="MindSolo" hbank="0" lbank="3" prog="74"/>
+ <Patch name="OrbiBell" hbank="0" lbank="3" prog="73"/>
+ <Patch name="OrcSolo" hbank="0" lbank="1" prog="79"/>
+ <Patch name="OrcSolo2" hbank="0" lbank="2" prog="79"/>
+ <Patch name="Orgelton" hbank="0" lbank="1" prog="78"/>
+ <Patch name="PulsSolo" hbank="0" lbank="1" prog="80"/>
+ <Patch name="Quintor" hbank="0" lbank="3" prog="77"/>
+ <Patch name="ResoLead" hbank="0" lbank="3" prog="79"/>
+ <Patch name="SequenzA" hbank="0" lbank="1" prog="72"/>
+ <Patch name="SinSequ" hbank="0" lbank="2" prog="68"/>
+ <Patch name="Solojam" hbank="0" lbank="3" prog="65"/>
+ <Patch name="Syncer" hbank="0" lbank="1" prog="77"/>
+ <Patch name="Syncer2" hbank="0" lbank="2" prog="77"/>
+ <Patch name="Syncline" hbank="0" lbank="3" prog="80"/>
+ <Patch name="SyncSynt" hbank="0" lbank="1" prog="71"/>
+ <Patch name="SynSequ" hbank="0" lbank="2" prog="75"/>
+ <Patch name="Techno!" hbank="0" lbank="1" prog="73"/>
+ <Patch name="TechSeq" hbank="0" lbank="3" prog="72"/>
+ <Patch name="TecnoSyn" hbank="0" lbank="3" prog="70"/>
+ <Patch name="Trancer 3" hbank="0" lbank="1" prog="69"/>
+ <Patch name="Trancer" hbank="0" lbank="1" prog="66"/>
+ <Patch name="UpperCls" hbank="0" lbank="1" prog="76"/>
+ <Patch name="UpSync" hbank="0" lbank="2" prog="76"/>
+ <Patch name="VCASolo" hbank="0" lbank="3" prog="75"/>
+ <Patch name="Westwoop" hbank="0" lbank="2" prog="69"/>
+ <Patch name="Wheel it" hbank="0" lbank="3" prog="68"/>
+</PatchGroup>
+<PatchGroup name="Effect">
+ <Patch name="Atmo" hbank="0" lbank="1" prog="90"/>
+ <Patch name="Atmo2" hbank="0" lbank="2" prog="90"/>
+ <Patch name="AtomOrc" hbank="0" lbank="1" prog="92"/>
+ <Patch name="AtomOrc2" hbank="0" lbank="2" prog="92"/>
+ <Patch name="Crazykor" hbank="0" lbank="3" prog="84"/>
+ <Patch name="Cult" hbank="0" lbank="1" prog="96"/>
+ <Patch name="Dreams" hbank="0" lbank="1" prog="91"/>
+ <Patch name="Dreams2" hbank="0" lbank="2" prog="91"/>
+ <Patch name="Effector" hbank="0" lbank="2" prog="81"/>
+ <Patch name="Fat-Guit" hbank="0" lbank="3" prog="91"/>
+ <Patch name="FilterEG" hbank="0" lbank="3" prog="81"/>
+ <Patch name="Filter^!" hbank="0" lbank="1" prog="82"/>
+ <Patch name="Filter^!2" hbank="0" lbank="2" prog="82"/>
+ <Patch name="ForceMa" hbank="0" lbank="2" prog="93"/>
+ <Patch name="FSOLbell" hbank="0" lbank="3" prog="87"/>
+ <Patch name="Funky FX" hbank="0" lbank="3" prog="94"/>
+ <Patch name="FuturSir" hbank="0" lbank="2" prog="96"/>
+ <Patch name="FXPad" hbank="0" lbank="1" prog="86"/>
+ <Patch name="FXPad2" hbank="0" lbank="2" prog="86"/>
+ <Patch name="Galactic" hbank="0" lbank="3" prog="82"/>
+ <Patch name="GoaFix" hbank="0" lbank="3" prog="96"/>
+ <Patch name="GuitarBs" hbank="0" lbank="2" prog="87"/>
+ <Patch name="Kotzrobb" hbank="0" lbank="3" prog="83"/>
+ <Patch name="LFOitsch" hbank="0" lbank="3" prog="95"/>
+ <Patch name="LFO Noiz" hbank="0" lbank="3" prog="93"/>
+ <Patch name="LFO-Pad" hbank="0" lbank="3" prog="86"/>
+ <Patch name="LophoLFO" hbank="0" lbank="3" prog="89"/>
+ <Patch name="LushPad" hbank="0" lbank="1" prog="88"/>
+ <Patch name="LushPad2" hbank="0" lbank="2" prog="88"/>
+ <Patch name="Mello up" hbank="0" lbank="1" prog="95"/>
+ <Patch name="Mello up2" hbank="0" lbank="2" prog="95"/>
+ <Patch name="Organ 1" hbank="0" lbank="2" prog="84"/>
+ <Patch name="Pre Nat" hbank="0" lbank="1" prog="94"/>
+ <Patch name="Pre Nat2" hbank="0" lbank="2" prog="94"/>
+ <Patch name="Psychoa" hbank="0" lbank="1" prog="93"/>
+ <Patch name="Psychos*" hbank="0" lbank="1" prog="87"/>
+ <Patch name="RhythmFX" hbank="0" lbank="1" prog="89"/>
+ <Patch name="RythmFX" hbank="0" lbank="2" prog="89"/>
+ <Patch name="SpaceAmb" hbank="0" lbank="3" prog="90"/>
+ <Patch name="SpaceChr" hbank="0" lbank="3" prog="85"/>
+ <Patch name="Swallow" hbank="0" lbank="1" prog="85"/>
+ <Patch name="Swallow2" hbank="0" lbank="2" prog="85"/>
+ <Patch name="TinyDirt" hbank="0" lbank="1" prog="84"/>
+ <Patch name="UFO-Fly" hbank="0" lbank="3" prog="88"/>
+ <Patch name="UFOworld" hbank="0" lbank="3" prog="92"/>
+ <Patch name="VocoderC" hbank="0" lbank="1" prog="81"/>
+ <Patch name="Zipper" hbank="0" lbank="1" prog="83"/>
+ <Patch name="Zipper2" hbank="0" lbank="2" prog="83"/>
+</PatchGroup>
+ <!-- Controllers -->
+ <Controller name="1 Modulation wheel" type="Control" min="0" max="127" l="1"/>
+ <Controller name="2 Glide" type="Control" min="0" max="127" l="5"/>
+ <Controller name="3 Volume" type="Control" min="0" max="127" l="7"/>
+ <Controller name="4 Pan" type="Control" min="0" max="127" l="10"/>
+ <Controller name="5 VCA Level" type="Control" min="0" max="127" l="11"/>
+ <Controller name="6 Wave Macro" type="Control" min="0" max="127" l="12"/>
+ <Controller name="7 Octave Transpose" type="Control" min="0" max="127" l="13"/>
+ <Controller name="8 Detune" type="Control" min="0" max="24" l="14"/>
+ <Controller name="9 Input Overdrive" type="Control" min="0" max="127" l="15"/>
+ <Controller name="10 Filter Cutt Off" type="Control" min="0" max="127" l="16"/>
+ <Controller name="15 EG1 release" type="Control" min="0" max="127" l="21"/>
+ <Controller name="29 EG2 Release" type="Control" min="0" max="127" l="36"/>
+ <Controller name="11 Reso (QFactor)" type="Control" min="0" max="127" l="17"/>
+ <Controller name="12 EG1 Attack (VCA)" type="Control" min="0" max="127" l="18"/>
+ <Controller name="13 EG1 decay" type="Control" min="0" max="127" l="19"/>
+ <Controller name="14 EG1 Sustain" type="Control" min="0" max="127" l="20"/>
+ <Controller name="16 Keyboard Tracking" type="Control" min="0" max="127" l="22"/>
+ <Controller name="17 EG FC amount (env. mod)" type="Control" min="0" max="127" l="23"/>
+ <Controller name="18 Dyn FC Amount" type="Control" min="0" max="127" l="24"/>
+ <Controller name="19 Dyn VCA On/Off" type="Control" min="0" max="127" l="25"/>
+ <Controller name="20 LFO Depth" type="Control" min="0" max="127" l="26"/>
+ <Controller name="21 LFO Wave" type="Control" min="0" max="127" l="27"/>
+ <Controller name="22 LFO Rate" type="Control" min="0" max="10" l="28"/>
+ <Controller name="23 LFO Pitch" type="Control" min="0" max="127" l="29"/>
+ <Controller name="24 LFO VCF" type="Control" min="0" max="127" l="30"/>
+ <Controller name="25 LFO VCA" type="Control" min="0" max="127" l="31"/>
+ <Controller name="26 EG2 - attack (VCF)" type="Control" min="0" max="127" l="33"/>
+ <Controller name="27 EG2 Decay" type="Control" min="0" max="127" l="34"/>
+ <Controller name="28 EG2 sustain" type="Control" min="0" max="127" l="35"/>
+ <Controller name="30 EG3 attack (pitch)" type="Control" min="0" max="127" l="37"/>
+ <Controller name="31 EG3 Decay" type="Control" min="0" max="127" l="38"/>
+ <Controller name="32 EG3 pitch" type="Control" min="0" max="127" l="39"/>
+ <Controller name="33 pitchbend sensitivity" type="Control" min="0" max="127" l="40"/>
+ <Controller name="34 filtre (24db,12db...)" type="Control" min="0" max="2" l="41"/>
+ <Controller name="35 Hold Pedal" type="Control" min="0" max="127" l="64"/>
+ <Controller name="36 FX1 - reverb" type="Control" min="0" max="127" l="91"/>
+ <Controller name="37 FX2 delay" type="Control" min="0" max="127" l="93"/>
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/Roland-E28.idf b/muse/share/instruments/Roland-E28.idf
new file mode 100644
index 00000000..da93682f
--- /dev/null
+++ b/muse/share/instruments/Roland-E28.idf
@@ -0,0 +1,320 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Roland E-28">
+ <Init>
+ </Init>
+ <PatchGroup name="Piano">
+ <Patch name="Piano 1" hbank="0" lbank="0" prog="0"/>
+ <Patch name="Piano 1w" hbank="8" lbank="0" prog="0"/>
+ <Patch name="Piano 1d" hbank="16" lbank="0" prog="0"/>
+ <Patch name="Piano 2" hbank="0" lbank="0" prog="1"/>
+ <Patch name="Piano 2w" hbank="8" lbank="0" prog="1"/>
+ <Patch name="Piano 3" hbank="0" lbank="0" prog="2"/>
+ <Patch name="Piano 3w" hbank="8" lbank="0" prog="2"/>
+ <Patch name="Honky-tonk" hbank="0" lbank="0" prog="3"/>
+ <Patch name="Honky-tonk w" hbank="8" lbank="0" prog="3"/>
+ <Patch name="E.Piano 1" hbank="0" lbank="0" prog="4"/>
+ <Patch name="Detuned EP 1" hbank="8" lbank="0" prog="4"/>
+ <Patch name="E.Piano 1v" hbank="16" lbank="0" prog="4"/>
+ <Patch name="60's E.Piano" hbank="24" lbank="0" prog="4"/>
+ <Patch name="E.Piano 2" hbank="0" lbank="0" prog="5"/>
+ <Patch name="Detuned EP 2" hbank="8" lbank="0" prog="5"/>
+ <Patch name="E.Piano 2v" hbank="16" lbank="0" prog="5"/>
+ <Patch name="Harpsichord" hbank="0" lbank="0" prog="6"/>
+ <Patch name="Coupled Hps." hbank="8" lbank="0" prog="6"/>
+ <Patch name="Harpsi. w" hbank="16" lbank="0" prog="6"/>
+ <Patch name="Harpsi. o" hbank="24" lbank="0" prog="6"/>
+ <Patch name="Clav." hbank="0" lbank="0" prog="7"/>
+ </PatchGroup>
+ <PatchGroup name="Chromatic Perc">
+ <Patch name="Celesta" hbank="0" lbank="0" prog="8"/>
+ <Patch name="Glockenspiel" hbank="0" lbank="0" prog="9"/>
+ <Patch name="Music Box" hbank="0" lbank="0" prog="10"/>
+ <Patch name="Vibraphone" hbank="0" lbank="0" prog="11"/>
+ <Patch name="Vibraphone w" hbank="8" lbank="0" prog="11"/>
+ <Patch name="Marimba" hbank="0" lbank="0" prog="12"/>
+ <Patch name="Marimba w" hbank="8" lbank="0" prog="12"/>
+ <Patch name="Xylophone" hbank="0" lbank="0" prog="13"/>
+ <Patch name="Tubular Bells" hbank="0" lbank="0" prog="14"/>
+ <Patch name="Church Bell" hbank="8" lbank="0" prog="14"/>
+ <Patch name="Carillon" hbank="9" lbank="0" prog="14"/>
+ <Patch name="Dulcimer" hbank="0" lbank="0" prog="15"/>
+ </PatchGroup>
+ <PatchGroup name="Organ">
+ <Patch name="Organ 1" hbank="0" lbank="0" prog="16"/>
+ <Patch name="Detuned organ 1" hbank="8" lbank="0" prog="16"/>
+ <Patch name="60's organ 1" hbank="16" lbank="0" prog="16"/>
+ <Patch name="Organ 4" hbank="32" lbank="0" prog="16"/>
+ <Patch name="Organ 2" hbank="0" lbank="0" prog="17"/>
+ <Patch name="Detuned organ 2" hbank="8" lbank="0" prog="17"/>
+ <Patch name="Organ 5" hbank="32" lbank="0" prog="17"/>
+ <Patch name="Organ 3" hbank="0" lbank="0" prog="18"/>
+ <Patch name="Church Organ 1" hbank="0" lbank="0" prog="19"/>
+ <Patch name="Church Organ 2" hbank="8" lbank="0" prog="19"/>
+ <Patch name="Church Organ 3" hbank="16" lbank="0" prog="19"/>
+ <Patch name="Reed Organ" hbank="0" lbank="0" prog="20"/>
+ <Patch name="Accordion Fr" hbank="0" lbank="0" prog="21"/>
+ <Patch name="Accordian It" hbank="8" lbank="0" prog="21"/>
+ <Patch name="Harmonica" hbank="0" lbank="0" prog="22"/>
+ <Patch name="Bandoneon" hbank="0" lbank="0" prog="23"/>
+ </PatchGroup>
+ <PatchGroup name="Guitar">
+ <Patch name="Nylon-str Gtr" hbank="0" lbank="0" prog="24"/>
+ <Patch name="Ukulele" hbank="8" lbank="0" prog="24"/>
+ <Patch name="Nylon Gtr o" hbank="16" lbank="0" prog="24"/>
+ <Patch name="Nylon Gtr 2" hbank="32" lbank="0" prog="24"/>
+ <Patch name="Steel-str Gtr" hbank="0" lbank="0" prog="25"/>
+ <Patch name="12-string Gtr" hbank="8" lbank="0" prog="25"/>
+ <Patch name="Mandolin" hbank="16" lbank="0" prog="25"/>
+ <Patch name="Jazz Guitar" hbank="0" lbank="0" prog="26"/>
+ <Patch name="Hawaiian Gtr" hbank="8" lbank="0" prog="26"/>
+ <Patch name="Clean Guitar" hbank="0" lbank="0" prog="27"/>
+ <Patch name="Chorus Guitar" hbank="8" lbank="0" prog="27"/>
+ <Patch name="Muted Guitar" hbank="0" lbank="0" prog="28"/>
+ <Patch name="Funk Guitar" hbank="8" lbank="0" prog="28"/>
+ <Patch name="Funk Guitar 2" hbank="16" lbank="0" prog="28"/>
+ <Patch name="Overdrive Gtr" hbank="0" lbank="0" prog="29"/>
+ <Patch name="Distortion Gtr" hbank="0" lbank="0" prog="30"/>
+ <Patch name="Feedback Gtr" hbank="8" lbank="0" prog="30"/>
+ <Patch name="Gtr. Harmonics" hbank="0" lbank="0" prog="31"/>
+ <Patch name="Gtr. Feedback" hbank="8" lbank="0" prog="31"/>
+ </PatchGroup>
+ <PatchGroup name="Bass">
+ <Patch name="Acoustic Bass" hbank="0" lbank="0" prog="32"/>
+ <Patch name="Fingered Bass" hbank="0" lbank="0" prog="33"/>
+ <Patch name="Picked Bass" hbank="0" lbank="0" prog="34"/>
+ <Patch name="Fretless Bass" hbank="0" lbank="0" prog="35"/>
+ <Patch name="Slap Bass 1" hbank="0" lbank="0" prog="36"/>
+ <Patch name="Slap Bass 2" hbank="0" lbank="0" prog="37"/>
+ <Patch name="Synth Bass 1" hbank="0" lbank="0" prog="38"/>
+ <Patch name="Synth Bass 101" hbank="1" lbank="0" prog="38"/>
+ <Patch name="Synth Bass 3" hbank="8" lbank="0" prog="38"/>
+ <Patch name="Synth Bass 2" hbank="0" lbank="0" prog="39"/>
+ <Patch name="Synth Bass 4" hbank="8" lbank="0" prog="39"/>
+ <Patch name="Rubber Bass" hbank="16" lbank="0" prog="39"/>
+ </PatchGroup>
+ <PatchGroup name="Strings/Orch">
+ <Patch name="Violin" hbank="0" lbank="0" prog="40"/>
+ <Patch name="Slow violin" hbank="8" lbank="0" prog="40"/>
+ <Patch name="Viola" hbank="0" lbank="0" prog="41"/>
+ <Patch name="Cello" hbank="0" lbank="0" prog="42"/>
+ <Patch name="Contrabass" hbank="0" lbank="0" prog="43"/>
+ <Patch name="Tremolo Str." hbank="0" lbank="0" prog="44"/>
+ <Patch name="Pizzicato Str." hbank="0" lbank="0" prog="45"/>
+ <Patch name="Harp" hbank="0" lbank="0" prog="46"/>
+ <Patch name="Timpani" hbank="0" lbank="0" prog="47"/>
+ </PatchGroup>
+ <PatchGroup name="Ensemble">
+ <Patch name="Strings 1" hbank="0" lbank="0" prog="48"/>
+ <Patch name="Orchestra" hbank="8" lbank="0" prog="48"/>
+ <Patch name="Slow strings" hbank="0" lbank="0" prog="49"/>
+ <Patch name="Syn. Strings 1" hbank="0" lbank="0" prog="50"/>
+ <Patch name="Syn. Strings 3" hbank="8" lbank="0" prog="50"/>
+ <Patch name="Syn. Strings 2" hbank="0" lbank="0" prog="51"/>
+ <Patch name="Choir Aahs" hbank="0" lbank="0" prog="52"/>
+ <Patch name="Choir Aahs 2" hbank="32" lbank="0" prog="52"/>
+ <Patch name="Voice Oohs" hbank="0" lbank="0" prog="53"/>
+ <Patch name="Synth Voice" hbank="0" lbank="0" prog="54"/>
+ <Patch name="Orchestra Hit" hbank="0" lbank="0" prog="55"/>
+ </PatchGroup>
+ <PatchGroup name="Brass">
+ <Patch name="Trumpet" hbank="0" lbank="0" prog="56"/>
+ <Patch name="Trombone" hbank="0" lbank="0" prog="57"/>
+ <Patch name="Trombone 2" hbank="1" lbank="0" prog="57"/>
+ <Patch name="Tuba" hbank="0" lbank="0" prog="58"/>
+ <Patch name="Muted Trumpet" hbank="0" lbank="0" prog="59"/>
+ <Patch name="French Horn" hbank="0" lbank="0" prog="60"/>
+ <Patch name="French Horn 2" hbank="1" lbank="0" prog="60"/>
+ <Patch name="Brass Section 1" hbank="0" lbank="0" prog="61"/>
+ <Patch name="Brass Section 2" hbank="8" lbank="0" prog="61"/>
+ <Patch name="Synth Brass 1" hbank="0" lbank="0" prog="62"/>
+ <Patch name="Synth Brass 3" hbank="8" lbank="0" prog="62"/>
+ <Patch name="Analog Brass 1" hbank="16" lbank="0" prog="62"/>
+ <Patch name="Synth Brass 2" hbank="0" lbank="0" prog="63"/>
+ <Patch name="Synth Brass 4" hbank="8" lbank="0" prog="63"/>
+ <Patch name="Analog Brass 2" hbank="16" lbank="0" prog="63"/>
+ </PatchGroup>
+ <PatchGroup name="Reed">
+ <Patch name="Soprano Sax" hbank="0" lbank="0" prog="64"/>
+ <Patch name="Alto Sax" hbank="0" lbank="0" prog="65"/>
+ <Patch name="Tenor Sax" hbank="0" lbank="0" prog="66"/>
+ <Patch name="Baritone Sax" hbank="0" lbank="0" prog="67"/>
+ <Patch name="Oboe" hbank="0" lbank="0" prog="68"/>
+ <Patch name="English Horn" hbank="0" lbank="0" prog="69"/>
+ <Patch name="Bassoon" hbank="0" lbank="0" prog="70"/>
+ <Patch name="Clarinet" hbank="0" lbank="0" prog="71"/>
+ </PatchGroup>
+ <PatchGroup name="Pipe">
+ <Patch name="Piccolo" hbank="0" lbank="0" prog="72"/>
+ <Patch name="Flute" hbank="0" lbank="0" prog="73"/>
+ <Patch name="Recorder" hbank="0" lbank="0" prog="74"/>
+ <Patch name="Pan Flute" hbank="0" lbank="0" prog="75"/>
+ <Patch name="Blown Bottle" hbank="0" lbank="0" prog="76"/>
+ <Patch name="Shakuhachi" hbank="0" lbank="0" prog="77"/>
+ <Patch name="Whistle" hbank="0" lbank="0" prog="78"/>
+ <Patch name="Ocarina" hbank="0" lbank="0" prog="79"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Lead">
+ <Patch name="Square Wave" hbank="0" lbank="0" prog="80"/>
+ <Patch name="Square" hbank="1" lbank="0" prog="80"/>
+ <Patch name="Sine wave" hbank="8" lbank="0" prog="80"/>
+ <Patch name="Saw Wave" hbank="0" lbank="0" prog="81"/>
+ <Patch name="Saw" hbank="1" lbank="0" prog="81"/>
+ <Patch name="Doctor Solo" hbank="8" lbank="0" prog="81"/>
+ <Patch name="Synth Calliope" hbank="0" lbank="0" prog="82"/>
+ <Patch name="Chiffer Lead" hbank="0" lbank="0" prog="83"/>
+ <Patch name="Charang" hbank="0" lbank="0" prog="84"/>
+ <Patch name="Solo Vox" hbank="0" lbank="0" prog="85"/>
+ <Patch name="Fifth Saw Wave" hbank="0" lbank="0" prog="86"/>
+ <Patch name="Bass and Lead" hbank="0" lbank="0" prog="87"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Pad">
+ <Patch name="Fantasia" hbank="0" lbank="0" prog="88"/>
+ <Patch name="Warm Pad" hbank="0" lbank="0" prog="89"/>
+ <Patch name="Polysynth Pad" hbank="0" lbank="0" prog="90"/>
+ <Patch name="Space voice" hbank="0" lbank="0" prog="91"/>
+ <Patch name="Bowed Pad" hbank="0" lbank="0" prog="92"/>
+ <Patch name="Metallic Pad" hbank="0" lbank="0" prog="93"/>
+ <Patch name="Halo Pad" hbank="0" lbank="0" prog="94"/>
+ <Patch name="Sweep Pad" hbank="0" lbank="0" prog="95"/>
+ </PatchGroup>
+ <PatchGroup name="Synth FX">
+ <Patch name="Ice Rain" hbank="0" lbank="0" prog="96"/>
+ <Patch name="Soundtrack" hbank="0" lbank="0" prog="97"/>
+ <Patch name="Crystal" hbank="0" lbank="0" prog="98"/>
+ <Patch name="Synth Mallet" hbank="1" lbank="0" prog="98"/>
+ <Patch name="Atmosphere" hbank="0" lbank="0" prog="99"/>
+ <Patch name="Brightness" hbank="0" lbank="0" prog="100"/>
+ <Patch name="Goblins" hbank="0" lbank="0" prog="101"/>
+ <Patch name="Echo drops" hbank="0" lbank="0" prog="102"/>
+ <Patch name="Echo bell" hbank="1" lbank="0" prog="102"/>
+ <Patch name="Echo pan" hbank="2" lbank="0" prog="102"/>
+ <Patch name="Star Theme" hbank="0" lbank="0" prog="103"/>
+ </PatchGroup>
+ <PatchGroup name="Ethnic">
+ <Patch name="Sitar" hbank="0" lbank="0" prog="104"/>
+ <Patch name="Sitar 2" hbank="1" lbank="0" prog="104"/>
+ <Patch name="Banjo" hbank="0" lbank="0" prog="105"/>
+ <Patch name="Shamisen" hbank="0" lbank="0" prog="106"/>
+ <Patch name="Koto" hbank="0" lbank="0" prog="107"/>
+ <Patch name="Taisho Koto" hbank="8" lbank="0" prog="107"/>
+ <Patch name="Kalimba" hbank="0" lbank="0" prog="108"/>
+ <Patch name="Bagpipe" hbank="0" lbank="0" prog="109"/>
+ <Patch name="Fiddle" hbank="0" lbank="0" prog="110"/>
+ <Patch name="Shanai" hbank="0" lbank="0" prog="111"/>
+ </PatchGroup>
+ <PatchGroup name="Percussive">
+ <Patch name="Tinkle Bell" hbank="0" lbank="0" prog="112"/>
+ <Patch name="Agogo" hbank="0" lbank="0" prog="113"/>
+ <Patch name="Steel Drums" hbank="0" lbank="0" prog="114"/>
+ <Patch name="Woodblock" hbank="0" lbank="0" prog="115"/>
+ <Patch name="Castanets" hbank="8" lbank="0" prog="115"/>
+ <Patch name="Taiko Drum" hbank="0" lbank="0" prog="116"/>
+ <Patch name="Concert BD" hbank="8" lbank="0" prog="116"/>
+ <Patch name="Melodic Drum 1" hbank="0" lbank="0" prog="117"/>
+ <Patch name="Melodic Drum 2" hbank="8" lbank="0" prog="117"/>
+ <Patch name="Synth Drum" hbank="0" lbank="0" prog="118"/>
+ <Patch name="808 Tom" hbank="8" lbank="0" prog="118"/>
+ <Patch name="Elec Perc" hbank="9" lbank="0" prog="119"/>
+ <Patch name="Rev. Cymbal" hbank="0" lbank="0" prog="119"/>
+ </PatchGroup>
+ <PatchGroup name="Special FX">
+ <Patch name="Gtr Fret Noise" hbank="0" lbank="0" prog="120"/>
+ <Patch name="Gtr Cut Noise" hbank="1" lbank="0" prog="120"/>
+ <Patch name="String slap" hbank="2" lbank="0" prog="120"/>
+ <Patch name="Breath Noise" hbank="0" lbank="0" prog="121"/>
+ <Patch name="Flute key click" hbank="1" lbank="0" prog="121"/>
+ <Patch name="Seashore" hbank="0" lbank="0" prog="122"/>
+ <Patch name="Rain" hbank="1" lbank="0" prog="122"/>
+ <Patch name="Thunder" hbank="2" lbank="0" prog="122"/>
+ <Patch name="Wind" hbank="3" lbank="0" prog="122"/>
+ <Patch name="Stream" hbank="4" lbank="0" prog="122"/>
+ <Patch name="Bubble" hbank="5" lbank="0" prog="122"/>
+ <Patch name="Bird" hbank="0" lbank="0" prog="123"/>
+ <Patch name="Dog" hbank="1" lbank="0" prog="123"/>
+ <Patch name="Horse-Gallop" hbank="2" lbank="0" prog="123"/>
+ <Patch name="Bird 2" hbank="3" lbank="0" prog="123"/>
+ <Patch name="Telephone 1" hbank="0" lbank="0" prog="124"/>
+ <Patch name="Telephone 2" hbank="1" lbank="0" prog="124"/>
+ <Patch name="Door creaking" hbank="2" lbank="0" prog="124"/>
+ <Patch name="Door" hbank="3" lbank="0" prog="124"/>
+ <Patch name="Scratch" hbank="4" lbank="0" prog="124"/>
+ <Patch name="Helicopter" hbank="0" lbank="0" prog="125"/>
+ <Patch name="Car engine" hbank="1" lbank="0" prog="125"/>
+ <Patch name="Car stopping" hbank="2" lbank="0" prog="125"/>
+ <Patch name="Car pass" hbank="3" lbank="0" prog="125"/>
+ <Patch name="Car crash" hbank="4" lbank="0" prog="125"/>
+ <Patch name="Siren" hbank="5" lbank="0" prog="125"/>
+ <Patch name="Train" hbank="6" lbank="0" prog="125"/>
+ <Patch name="Jet plane" hbank="7" lbank="0" prog="125"/>
+ <Patch name="Starship" hbank="8" lbank="0" prog="125"/>
+ <Patch name="Burst noise" hbank="9" lbank="0" prog="125"/>
+ <Patch name="Applause" hbank="0" lbank="0" prog="126"/>
+ <Patch name="Screaming" hbank="2" lbank="0" prog="126"/>
+ <Patch name="Punch" hbank="3" lbank="0" prog="126"/>
+ <Patch name="Heart beat" hbank="4" lbank="0" prog="126"/>
+ <Patch name="Footsteps" hbank="5" lbank="0" prog="126"/>
+ <Patch name="Gunshot" hbank="0" lbank="0" prog="127"/>
+ <Patch name="Machine gun" hbank="1" lbank="0" prog="127"/>
+ <Patch name="Laser gun" hbank="2" lbank="0" prog="127"/>
+ <Patch name="Explosion" hbank="3" lbank="0" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="Drums">
+ <Patch name="Standard" hbank="0" lbank="0" prog="0"/>
+ <Patch name="Room" hbank="0" lbank="0" prog="8"/>
+ <Patch name="Power" hbank="0" lbank="0" prog="16"/>
+ <Patch name="Electric" hbank="0" lbank="0" prog="24"/>
+ <Patch name="808" hbank="0" lbank="0" prog="25"/>
+ <Patch name="Jazz" hbank="0" lbank="0" prog="32"/>
+ <Patch name="Brush" hbank="0" lbank="0" prog="40"/>
+ <Patch name="Orchestra" hbank="0" lbank="0" prog="48"/>
+ <Patch name="SFX" hbank="0" lbank="0" prog="56"/>
+ </PatchGroup>
+
+ <!-- Controller -->
+ <Controller name="Pitch" type="Pitch" />
+ <Controller name="Program" type="Program" />
+
+ <Controller name="Modulation" type="Control" l="0x01" />
+ <Controller name="PortamentoTime" type="Control" l="0x05" />
+ <Controller name="MainVolume" type="Control" l="0x07" />
+ <Controller name="Pan" type="Control" l="0x0a" />
+ <Controller name="Expression" type="Control" l="0x0b" />
+ <Controller name="Sustain" type="Control" l="0x40" />
+ <Controller name="Portamento" type="Control" l="0x41" />
+ <Controller name="Sostenuto" type="Control" l="0x42" />
+ <Controller name="SoftPedal" type="Control" l="0x43" />
+ <Controller name="PortamentoControl" type="Control" l="0x54" />
+ <Controller name="Effect1Depth" type="Control" l="0x5b" />
+ <Controller name="Effect3Depth" type="Control" l="0x5d" />
+ <Controller name="AllSoundsOff" type="Control" l="0x78" min="0" max="0"/>
+ <Controller name="ResetAllController" type="Control" l="0x79" min="0" max="0"/>
+ <Controller name="AllNotesOff" type="Control" l="0x7b" min="0" max="0"/>
+ <Controller name="Omni off" type="Control" l="0x7c" min="0" max="0"/>
+ <Controller name="Mono" type="Control" l="0x7e" min="0" max="0"/>
+ <Controller name="Poly" type="Control" l="0x7f" min="0" max="0"/>
+
+ <!-- RPN's -->
+ <Controller name="PitchBendSensitivity" type="RPN" l="0" min="0" max="0x18" init="2" />
+ <Controller name="FineTuning" type="RPN" l="1" min="-64" max="64" init="2" />
+ <Controller name="CourseTuning" type="RPN" l="2" min="-24" max="24" />
+ <Controller name="RPN null" type="RPN" h="0x7f" l="0x7f" min="0" max="0" />
+
+ <!-- NPN's -->
+ <Controller name="VibratoRate" type="NRPN" h="0x01" l="0x08" />
+ <Controller name="VibratoDepth" type="NRPN" h="0x01" l="0x09" />
+ <Controller name="VibratoDelay" type="NRPN" h="0x01" l="0x0a" />
+ <Controller name="FilterCutoffFreq" type="NRPN" h="0x01" l="0x20" />
+ <Controller name="FilterResonance" type="NRPN" h="0x01" l="0x21" />
+ <Controller name="AttackRate" type="NRPN" h="0x01" l="0x63" />
+ <Controller name="DecayRate" type="NRPN" h="0x01" l="0x64" />
+ <Controller name="ReleaseRate" type="NRPN" h="0x01" l="0x66" />
+ <Controller name="DrumPitchCoarseTune" type="NRPN" h="0x18" l="pitch" />
+ <Controller name="DrumLevel" type="NRPN" h="0x1a" l="pitch" />
+ <Controller name="DrumPanpot" type="NRPN" h="0x1c" l="pitch" />
+ <Controller name="DrumReverbSend" type="NRPN" h="0x1d" l="pitch" />
+ <Controller name="DrumChorusSend" type="NRPN" h="0x1e" l="pitch" />
+
+ </MidiInstrument>
+ </muse>
+
diff --git a/muse/share/instruments/Roland-SCD70.idf b/muse/share/instruments/Roland-SCD70.idf
new file mode 100644
index 00000000..5a7334d8
--- /dev/null
+++ b/muse/share/instruments/Roland-SCD70.idf
@@ -0,0 +1,1513 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Roland SC-D70">
+ <Init>
+ </Init>
+ <PatchGroup name="GM">
+ <Patch name="Acoustic Grand Piano" hbank="0" lbank="0" prog="0"/>
+ <Patch name="Bright Acoustic Piano" hbank="0" lbank="0" prog="1"/>
+ <Patch name="Electric Grand Piano" hbank="0" lbank="0" prog="2"/>
+ <Patch name="Honky-tonk Piano" hbank="0" lbank="0" prog="3"/>
+ <Patch name="Electric Piano 1" hbank="0" lbank="0" prog="4"/>
+ <Patch name="Electric Piano 2" hbank="0" lbank="0" prog="5"/>
+ <Patch name="Harpsichord" hbank="0" lbank="0" prog="6"/>
+ <Patch name="Clavi" hbank="0" lbank="0" prog="7"/>
+ <Patch name="Celesta" hbank="0" lbank="0" prog="8"/>
+ <Patch name="Glockenspiel" hbank="0" lbank="0" prog="9"/>
+ <Patch name="Music Box" hbank="0" lbank="0" prog="10"/>
+ <Patch name="Vibraphone" hbank="0" lbank="0" prog="11"/>
+ <Patch name="Marimba" hbank="0" lbank="0" prog="12"/>
+ <Patch name="Xylophone" hbank="0" lbank="0" prog="13"/>
+ <Patch name="Tubular Bells" hbank="0" lbank="0" prog="14"/>
+ <Patch name="Dulcimer" hbank="0" lbank="0" prog="15"/>
+ <Patch name="Drawbar Organ" hbank="0" lbank="0" prog="16"/>
+ <Patch name="Percussive Organ" hbank="0" lbank="0" prog="17"/>
+ <Patch name="Rock Organ" hbank="0" lbank="0" prog="18"/>
+ <Patch name="Church Organ" hbank="0" lbank="0" prog="19"/>
+ <Patch name="Reed Organ" hbank="0" lbank="0" prog="20"/>
+ <Patch name="Accordion" hbank="0" lbank="0" prog="21"/>
+ <Patch name="Harmonica" hbank="0" lbank="0" prog="22"/>
+ <Patch name="Tango Accordion" hbank="0" lbank="0" prog="23"/>
+ <Patch name="Acoustic Guitar (nylon)" hbank="0" lbank="0" prog="24"/>
+ <Patch name="Acoustic Guitar (steel)" hbank="0" lbank="0" prog="25"/>
+ <Patch name="Electric Guitar (jazz)" hbank="0" lbank="0" prog="26"/>
+ <Patch name="Electric Guitar (clean)" hbank="0" lbank="0" prog="27"/>
+ <Patch name="Electric Guitar (muted)" hbank="0" lbank="0" prog="28"/>
+ <Patch name="Overdriven Guitar" hbank="0" lbank="0" prog="29"/>
+ <Patch name="Distortion Guitar" hbank="0" lbank="0" prog="30"/>
+ <Patch name="Guitar Harmonics" hbank="0" lbank="0" prog="31"/>
+ <Patch name="Acoustic Bass" hbank="0" lbank="0" prog="32"/>
+ <Patch name="Electric Bass (finger)" hbank="0" lbank="0" prog="33"/>
+ <Patch name="Electric Bass (pick)" hbank="0" lbank="0" prog="34"/>
+ <Patch name="Fretless Bass" hbank="0" lbank="0" prog="35"/>
+ <Patch name="Slap Bass 1" hbank="0" lbank="0" prog="36"/>
+ <Patch name="Slap Bass 2" hbank="0" lbank="0" prog="37"/>
+ <Patch name="Synth Bass 1" hbank="0" lbank="0" prog="38"/>
+ <Patch name="Synth Bass 2" hbank="0" lbank="0" prog="39"/>
+ <Patch name="Violin" hbank="0" lbank="0" prog="40"/>
+ <Patch name="Viola" hbank="0" lbank="0" prog="41"/>
+ <Patch name="Cello" hbank="0" lbank="0" prog="42"/>
+ <Patch name="Contrabass" hbank="0" lbank="0" prog="43"/>
+ <Patch name="Tremolo Strings" hbank="0" lbank="0" prog="44"/>
+ <Patch name="Pizzicato Strings" hbank="0" lbank="0" prog="45"/>
+ <Patch name="Orchestral Harp" hbank="0" lbank="0" prog="46"/>
+ <Patch name="Timpani" hbank="0" lbank="0" prog="47"/>
+ <Patch name="String Ensemble 1" hbank="0" lbank="0" prog="48"/>
+ <Patch name="String Ensemble 2" hbank="0" lbank="0" prog="49"/>
+ <Patch name="Synth Strings 1" hbank="0" lbank="0" prog="50"/>
+ <Patch name="Synth Strings 2" hbank="0" lbank="0" prog="51"/>
+ <Patch name="Choir Aahs" hbank="0" lbank="0" prog="52"/>
+ <Patch name="Voice Oohs" hbank="0" lbank="0" prog="53"/>
+ <Patch name="Synth Voice" hbank="0" lbank="0" prog="54"/>
+ <Patch name="Orchestra Hit" hbank="0" lbank="0" prog="55"/>
+ <Patch name="Trumpet" hbank="0" lbank="0" prog="56"/>
+ <Patch name="Trombone" hbank="0" lbank="0" prog="57"/>
+ <Patch name="Tuba" hbank="0" lbank="0" prog="58"/>
+ <Patch name="Muted Trumpet" hbank="0" lbank="0" prog="59"/>
+ <Patch name="French Horn" hbank="0" lbank="0" prog="60"/>
+ <Patch name="Brass Section" hbank="0" lbank="0" prog="61"/>
+ <Patch name="SynthBrass 1" hbank="0" lbank="0" prog="62"/>
+ <Patch name="SynthBrass 2" hbank="0" lbank="0" prog="63"/>
+ <Patch name="Soprano Sax" hbank="0" lbank="0" prog="64"/>
+ <Patch name="Alto Sax" hbank="0" lbank="0" prog="65"/>
+ <Patch name="Tenor Sax" hbank="0" lbank="0" prog="66"/>
+ <Patch name="Baritone Sax" hbank="0" lbank="0" prog="67"/>
+ <Patch name="Oboe" hbank="0" lbank="0" prog="68"/>
+ <Patch name="English Horn" hbank="0" lbank="0" prog="69"/>
+ <Patch name="Bassoon" hbank="0" lbank="0" prog="70"/>
+ <Patch name="Clarinet" hbank="0" lbank="0" prog="71"/>
+ <Patch name="Piccolo" hbank="0" lbank="0" prog="72"/>
+ <Patch name="Flute" hbank="0" lbank="0" prog="73"/>
+ <Patch name="Recorder" hbank="0" lbank="0" prog="74"/>
+ <Patch name="Pan Flute" hbank="0" lbank="0" prog="75"/>
+ <Patch name="Blown Bottle" hbank="0" lbank="0" prog="76"/>
+ <Patch name="Shakuhachi" hbank="0" lbank="0" prog="77"/>
+ <Patch name="Whistle" hbank="0" lbank="0" prog="78"/>
+ <Patch name="Ocarina" hbank="0" lbank="0" prog="79"/>
+ <Patch name="Lead 1 (square)" hbank="0" lbank="0" prog="80"/>
+ <Patch name="Lead 2 (sawtooth)" hbank="0" lbank="0" prog="81"/>
+ <Patch name="Lead 3 (calliope)" hbank="0" lbank="0" prog="82"/>
+ <Patch name="Lead 4 (chiff)" hbank="0" lbank="0" prog="83"/>
+ <Patch name="Lead 5 (charang)" hbank="0" lbank="0" prog="84"/>
+ <Patch name="Lead 6 (voice)" hbank="0" lbank="0" prog="85"/>
+ <Patch name="Lead 7 (fifths)" hbank="0" lbank="0" prog="86"/>
+ <Patch name="Lead 8 (bass + lead)" hbank="0" lbank="0" prog="87"/>
+ <Patch name="Pad 1 (new age)" hbank="0" lbank="0" prog="88"/>
+ <Patch name="Pad 2 (warm)" hbank="0" lbank="0" prog="89"/>
+ <Patch name="Pad 3 (polysynth)" hbank="0" lbank="0" prog="90"/>
+ <Patch name="Pad 4 (choir)" hbank="0" lbank="0" prog="91"/>
+ <Patch name="Pad 5 (bowed)" hbank="0" lbank="0" prog="92"/>
+ <Patch name="Pad 6 (metallic)" hbank="0" lbank="0" prog="93"/>
+ <Patch name="Pad 7 (halo)" hbank="0" lbank="0" prog="94"/>
+ <Patch name="Pad 8 (sweep)" hbank="0" lbank="0" prog="95"/>
+ <Patch name="FX 1 (rain)" hbank="0" lbank="0" prog="96"/>
+ <Patch name="FX 2 (Soundtrack)" hbank="0" lbank="0" prog="97"/>
+ <Patch name="FX 3 (crystal)" hbank="0" lbank="0" prog="98"/>
+ <Patch name="FX 4 (atmosphere)" hbank="0" lbank="0" prog="99"/>
+ <Patch name="FX 5 (brightness)" hbank="0" lbank="0" prog="100"/>
+ <Patch name="FX 6 (goblins)" hbank="0" lbank="0" prog="101"/>
+ <Patch name="FX 7 (echoes)" hbank="0" lbank="0" prog="102"/>
+ <Patch name="FX 8 (sci-fi)" hbank="0" lbank="0" prog="103"/>
+ <Patch name="Sitar" hbank="0" lbank="0" prog="104"/>
+ <Patch name="Banjo" hbank="0" lbank="0" prog="105"/>
+ <Patch name="Shamisen" hbank="0" lbank="0" prog="106"/>
+ <Patch name="Koto" hbank="0" lbank="0" prog="107"/>
+ <Patch name="Kalimba" hbank="0" lbank="0" prog="108"/>
+ <Patch name="Bag pipe" hbank="0" lbank="0" prog="109"/>
+ <Patch name="Fiddle" hbank="0" lbank="0" prog="110"/>
+ <Patch name="Shanai" hbank="0" lbank="0" prog="111"/>
+ <Patch name="Tinkle Bell" hbank="0" lbank="0" prog="112"/>
+ <Patch name="Agogo" hbank="0" lbank="0" prog="113"/>
+ <Patch name="Steel Drums" hbank="0" lbank="0" prog="114"/>
+ <Patch name="Woodblock" hbank="0" lbank="0" prog="115"/>
+ <Patch name="Taiko Drum" hbank="0" lbank="0" prog="116"/>
+ <Patch name="Melodic Tom" hbank="0" lbank="0" prog="117"/>
+ <Patch name="Synth Drum" hbank="0" lbank="0" prog="118"/>
+ <Patch name="Reverse Cymbal" hbank="0" lbank="0" prog="119"/>
+ <Patch name="Guitar Fret Noise" hbank="0" lbank="0" prog="120"/>
+ <Patch name="Breath Noise" hbank="0" lbank="0" prog="121"/>
+ <Patch name="Seashore" hbank="0" lbank="0" prog="122"/>
+ <Patch name="Bird Tweet" hbank="0" lbank="0" prog="123"/>
+ <Patch name="Telephone Ring" hbank="0" lbank="0" prog="124"/>
+ <Patch name="Helicopter" hbank="0" lbank="0" prog="125"/>
+ <Patch name="Applause" hbank="0" lbank="0" prog="126"/>
+ <Patch name="Gunshot" hbank="0" lbank="0" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="Piano">
+
+ <Patch name="Upright Piano" hbank="1" lbank="0" prog="0"/>
+ <Patch name="Mild Piano" hbank="2" lbank="0" prog="0"/>
+ <Patch name="Upright P w" hbank="8" lbank="0" prog="0"/>
+ <Patch name="Mild Piano w" hbank="9" lbank="0" prog="0"/>
+ <Patch name="European Pf" hbank="16" lbank="0" prog="0"/>
+ <Patch name="Piano + Str" hbank="24" lbank="0" prog="0"/>
+ <Patch name="Piano +Str2" hbank="25" lbank="0" prog="0"/>
+ <Patch name="Piano +Choir1" hbank="26" lbank="0" prog="0"/>
+ <Patch name="Piano +Choir2" hbank="27" lbank="0" prog="0"/>
+
+ <Patch name="Pop Piano" hbank="1" lbank="0" prog="1"/>
+ <Patch name="Rock Piano" hbank="2" lbank="0" prog="1"/>
+ <Patch name="Pop Piano w" hbank="8" lbank="0" prog="1"/>
+ <Patch name="Rock piano w" hbank="9" lbank="0" prog="1"/>
+ <Patch name="Dance Piano" hbank="16" lbank="0" prog="1"/>
+
+ <Patch name="EG + Rhodes 1" hbank="1" lbank="0" prog="2"/>
+ <Patch name="EG + Rhodes 2" hbank="2" lbank="0" prog="2"/>
+ <Patch name="Piano 3w" hbank="8" lbank="0" prog="2"/>
+
+ <Patch name="Honkey Tonk 2" hbank="8" lbank="0" prog="3"/>
+
+ <Patch name="St. Soft EP" hbank="8" lbank="0" prog="4"/>
+ <Patch name="Cho. E. Piano" hbank="9" lbank="0" prog="4"/>
+ <Patch name="SilentRhodes" hbank="10" lbank="0" prog="4"/>
+ <Patch name="FM+SA EP" hbank="16" lbank="0" prog="4"/>
+ <Patch name="Dist E. Piano" hbank="17" lbank="0" prog="4"/>
+ <Patch name="Wurly" hbank="24" lbank="0" prog="4"/>
+ <Patch name="Hard Rhodes" hbank="25" lbank="0" prog="4"/>
+ <Patch name="Mellow Rhodes" hbank="26" lbank="0" prog="4"/>
+
+ <Patch name="E. Piano 3" hbank="1" lbank="0" prog="5"/>
+ <Patch name="Detuned EP 2" hbank="8" lbank="0" prog="5"/>
+ <Patch name="Detuned EP 3" hbank="9" lbank="0" prog="5"/>
+ <Patch name="EP Legend" hbank="10" lbank="0" prog="5"/>
+ <Patch name="St. FM EP" hbank="16" lbank="0" prog="5"/>
+ <Patch name="Hard FM EP" hbank="24" lbank="0" prog="5"/>
+ <Patch name="EP phase" hbank="32" lbank="0" prog="5"/>
+
+ <Patch name="Harpsicord2" hbank="1" lbank="0" prog="6"/>
+ <Patch name="Harpsicord3" hbank="2" lbank="0" prog="6"/>
+ <Patch name="Coupled Hps." hbank="8" lbank="0" prog="6"/>
+ <Patch name="Harpsi.w" hbank="16" lbank="0" prog="6"/>
+ <Patch name="Harpsi.o" hbank="24" lbank="0" prog="6"/>
+ <Patch name="Synth Harpsi" hbank="32" lbank="0" prog="6"/>
+
+ <Patch name="Clav. 2" hbank="1" lbank="0" prog="7"/>
+ <Patch name="Atk. Clav. 1" hbank="2" lbank="0" prog="7"/>
+ <Patch name="Atk. Clav. 2" hbank="3" lbank="0" prog="7"/>
+ <Patch name="Comp Clav." hbank="8" lbank="0" prog="7"/>
+ <Patch name="Reso Clav" hbank="16" lbank="0" prog="7"/>
+ <Patch name="Phase Clav" hbank="17" lbank="0" prog="7"/>
+ <Patch name="Clav.o" hbank="24" lbank="0" prog="7"/>
+ <Patch name="Analog Clav." hbank="32" lbank="0" prog="7"/>
+ <Patch name="JP8 Clav. 1" hbank="33" lbank="0" prog="7"/>
+ <Patch name="JP8 Clav. 2" hbank="35" lbank="0" prog="7"/>
+ <Patch name="SynRingClav" hbank="36" lbank="0" prog="7"/>
+ <Patch name="SynDistClav" hbank="37" lbank="0" prog="7"/>
+ <Patch name="JP8000 Clav." hbank="38" lbank="0" prog="7"/>
+ <Patch name="Pulse Clav." hbank="39" lbank="0" prog="7"/>
+
+ </PatchGroup>
+
+
+ <PatchGroup name="Chromatic Percussion">
+
+ <Patch name="Pop Celesta" hbank="1" lbank="0" prog="8"/>
+
+ <Patch name="Music Box 2" hbank="1" lbank="0" prog="10"/>
+ <Patch name="St. Music Box" hbank="8" lbank="0" prog="10"/>
+
+ <Patch name="Pop Vibe" hbank="1" lbank="0" prog="11"/>
+ <Patch name="Vibraphone w" hbank="8" lbank="0" prog="11"/>
+ <Patch name="Vibraphones" hbank="9" lbank="0" prog="11"/>
+
+ <Patch name="Marimba w" hbank="8" lbank="0" prog="12"/>
+ <Patch name="Barafon" hbank="16" lbank="0" prog="12"/>
+ <Patch name="Barafon 2" hbank="17" lbank="0" prog="12"/>
+ <Patch name="Log Drum" hbank="24" lbank="0" prog="12"/>
+
+ <Patch name="Xylophone w" hbank="8" lbank="0" prog="13"/>
+
+ <Patch name="Church Bell" hbank="8" lbank="0" prog="14"/>
+ <Patch name="Carillon" hbank="9" lbank="0" prog="14"/>
+ <Patch name="Church Bell 2" hbank="10" lbank="0" prog="14"/>
+ <Patch name="Tubular Bell w" hbank="16" lbank="0" prog="14"/>
+
+
+ <Patch name="Santur 2" hbank="1" lbank="0" prog="15"/>
+ <Patch name="Santur 3" hbank="2" lbank="0" prog="15"/>
+ <Patch name="Cimbalom" hbank="8" lbank="0" prog="15"/>
+ <Patch name="Zither 1" hbank="16" lbank="0" prog="15"/>
+ <Patch name="Zither 2" hbank="17" lbank="0" prog="15"/>
+ <Patch name="Dulcimer" hbank="24" lbank="0" prog="15"/>
+ </PatchGroup>
+
+
+
+ <PatchGroup name="Organ">
+ <Patch name="Organ 101" hbank="1" lbank="0" prog="16"/>
+ <Patch name="Full Organ1" hbank="2" lbank="0" prog="16"/>
+ <Patch name="Full Organ 2" hbank="3" lbank="0" prog="16"/>
+ <Patch name="Full Organ 3" hbank="4" lbank="0" prog="16"/>
+ <Patch name="Full Organ 4" hbank="5" lbank="0" prog="16"/>
+ <Patch name="Full Organ 5" hbank="6" lbank="0" prog="16"/>
+ <Patch name="Full Organ 6" hbank="7" lbank="0" prog="16"/>
+ <Patch name="Trem. Organ" hbank="8" lbank="0" prog="16"/>
+ <Patch name="Organ o" hbank="9" lbank="0" prog="16"/>
+ <Patch name="Full Organ 7" hbank="10" lbank="0" prog="16"/>
+ <Patch name="Full Organ 8" hbank="11" lbank="0" prog="16"/>
+ <Patch name="Full Organ 9" hbank="12" lbank="0" prog="16"/>
+ <Patch name="60's Organ 1" hbank="16" lbank="0" prog="16"/>
+ <Patch name="60's Organ 2" hbank="17" lbank="0" prog="16"/>
+ <Patch name="60's Organ 3" hbank="18" lbank="0" prog="16"/>
+ <Patch name="Fart Organ" hbank="19" lbank="0" prog="16"/>
+ <Patch name="Cheese Organ" hbank="24" lbank="0" prog="16"/>
+ <Patch name="D-50 Organ" hbank="25" lbank="0" prog="16"/>
+ <Patch name="JUNO Organ" hbank="26" lbank="0" prog="16"/>
+ <Patch name="Hybrid Organ" hbank="27" lbank="0" prog="16"/>
+ <Patch name="VS Organ" hbank="28" lbank="0" prog="16"/>
+ <Patch name="Digi Church" hbank="29" lbank="0" prog="16"/>
+ <Patch name="JX-8P Organ" hbank="30" lbank="0" prog="16"/>
+ <Patch name="FM Organ" hbank="31" lbank="0" prog="16"/>
+ <Patch name="70's Organ" hbank="32" lbank="0" prog="16"/>
+ <Patch name="Even Bar" hbank="33" lbank="0" prog="16"/>
+ <Patch name="Organ Bass 1" hbank="40" lbank="0" prog="16"/>
+ <Patch name="5th Organ" hbank="48" lbank="0" prog="16"/>
+
+ <Patch name="Jazz Organ" hbank="1" lbank="0" prog="17"/>
+ <Patch name="E. Organ 16+2" hbank="2" lbank="0" prog="17"/>
+ <Patch name="Jazz Organ 2" hbank="3" lbank="0" prog="17"/>
+ <Patch name="Jazz Organ 3" hbank="4" lbank="0" prog="17"/>
+ <Patch name="Jazz Organ 4" hbank="5" lbank="0" prog="17"/>
+ <Patch name="Jazz Organ 5" hbank="6" lbank="0" prog="17"/>
+ <Patch name="Jazz Organ 6" hbank="7" lbank="0" prog="17"/>
+ <Patch name="Chorus Or. 2" hbank="8" lbank="0" prog="17"/>
+ <Patch name="Octave Organ" hbank="9" lbank="0" prog="17"/>
+ <Patch name="Perc. Organ" hbank="32" lbank="0" prog="17"/>
+ <Patch name="Perc. Organ 2" hbank="33" lbank="0" prog="17"/>
+ <Patch name="Perc. Organ 3" hbank="34" lbank="0" prog="17"/>
+ <Patch name="Perc. Organ 4" hbank="35" lbank="0" prog="17"/>
+
+ <Patch name="Rotary Org." hbank="8" lbank="0" prog="18"/>
+ <Patch name="Rotary Org.S" hbank="16" lbank="0" prog="18"/>
+ <Patch name="Rock Organ 1" hbank="17" lbank="0" prog="18"/>
+ <Patch name="Rock Organ 2" hbank="18" lbank="0" prog="18"/>
+ <Patch name="Rotary Org.F" hbank="24" lbank="0" prog="18"/>
+
+ <Patch name="Church Organ 2" hbank="8" lbank="0" prog="19"/>
+ <Patch name="Church Organ 3" hbank="16" lbank="0" prog="19"/>
+ <Patch name="Organ Flute" hbank="24" lbank="0" prog="19"/>
+ <Patch name="Trem. Flute" hbank="32" lbank="0" prog="19"/>
+ <Patch name="Theater Org." hbank="33" lbank="0" prog="19"/>
+
+ <Patch name="Wind Organ" hbank="8" lbank="0" prog="20"/>
+ <Patch name="Puff Organ" hbank="16" lbank="0" prog="20"/>
+
+ <Patch name="Accordion It" hbank="8" lbank="0" prog="21"/>
+ <Patch name="Dist Accordion" hbank="9" lbank="0" prog="21"/>
+ <Patch name="Cho. Accordion" hbank="16" lbank="0" prog="21"/>
+ <Patch name="Hard Accord" hbank="24" lbank="0" prog="21"/>
+ <Patch name="Soft Accord" hbank="25" lbank="0" prog="21"/>
+
+ <Patch name="Harmonica 2" hbank="1" lbank="0" prog="22"/>
+ <Patch name="B.Basic Harp" hbank="8" lbank="0" prog="22"/>
+ <Patch name="B.Harp Suppl" hbank="9" lbank="0" prog="22"/>
+
+ <Patch name="Bandoneon 2" hbank="8" lbank="0" prog="23"/>
+ <Patch name="Bandoneon 3" hbank="16" lbank="0" prog="23"/>
+ </PatchGroup>
+
+ <PatchGroup name="Guitar">
+
+ <Patch name="Ukulele" hbank="8" lbank="0" prog="24"/>
+ <Patch name="Nylon Gt.o" hbank="16" lbank="0" prog="24"/>
+ <Patch name="Velo Harmnix" hbank="24" lbank="0" prog="24"/>
+ <Patch name="Nylon Gt.2 " hbank="32" lbank="0" prog="24"/>
+ <Patch name="Lequint Gt." hbank="40" lbank="0" prog="24"/>
+
+ <Patch name="12-str.Gt" hbank="8" lbank="0" prog="25"/>
+ <Patch name="Nylon+Steel" hbank="9" lbank="0" prog="25"/>
+ <Patch name="Atk Steel Gt" hbank="10" lbank="0" prog="25"/>
+ <Patch name="Mandolin" hbank="16" lbank="0" prog="25"/>
+ <Patch name="Mandolin 2" hbank="17" lbank="0" prog="25"/>
+ <Patch name="MandolinTrem" hbank="18" lbank="0" prog="25"/>
+ <Patch name="Steel Gt.2" hbank="32" lbank="0" prog="25"/>
+ <Patch name="Steel + Body" hbank="33" lbank="0" prog="25"/>
+
+ <Patch name="Mellow Gt." hbank="1" lbank="0" prog="26"/>
+ <Patch name="Pedal Steel" hbank="8" lbank="0" prog="26"/>
+
+ <Patch name="Clean Half" hbank="1" lbank="0" prog="27"/>
+ <Patch name="Open Hard 1" hbank="2" lbank="0" prog="27"/>
+ <Patch name="Open Hard 2" hbank="3" lbank="0" prog="27"/>
+ <Patch name="JC Clean Gt." hbank="4" lbank="0" prog="27"/>
+ <Patch name="Atk CleanGt." hbank="5" lbank="0" prog="27"/>
+ <Patch name="Chorus Gt." hbank="8" lbank="0" prog="27"/>
+ <Patch name="JC Chorus Gt" hbank="9" lbank="0" prog="27"/>
+ <Patch name="TC FrontPick" hbank="16" lbank="0" prog="27"/>
+ <Patch name="TC Rear Pick" hbank="17" lbank="0" prog="27"/>
+ <Patch name="TC Clean ff" hbank="18" lbank="0" prog="27"/>
+ <Patch name="TC Clean 2" hbank="19" lbank="0" prog="27"/>
+ <Patch name="LP Rear Pick" hbank="20" lbank="0" prog="27"/>
+ <Patch name="LP Rear 2" hbank="21" lbank="0" prog="27"/>
+ <Patch name="LP RearAtack" hbank="22" lbank="0" prog="27"/>
+ <Patch name="Mid Tone GTR" hbank="23" lbank="0" prog="27"/>
+ <Patch name="Chung Ruan" hbank="24" lbank="0" prog="27"/>
+ <Patch name="Chung Ruan 2" hbank="25" lbank="0" prog="27"/>
+
+ <Patch name="Muted Dis.Gt" hbank="1" lbank="0" prog="28"/>
+ <Patch name="TC Muted Gt." hbank="2" lbank="0" prog="28"/>
+ <Patch name="Funk Pop" hbank="8" lbank="0" prog="28"/>
+ <Patch name="Funk Gt.2" hbank="16" lbank="0" prog="28"/>
+ <Patch name="Jazz Man" hbank="24" lbank="0" prog="28"/>
+
+ <Patch name="Overdrive 2" hbank="1" lbank="0" prog="29"/>
+ <Patch name="Overdrive 3" hbank="2" lbank="0" prog="29"/>
+ <Patch name="More Drive" hbank="3" lbank="0" prog="29"/>
+ <Patch name="Guitar Pinch" hbank="4" lbank="0" prog="29"/>
+ <Patch name="Attack Drive" hbank="5" lbank="0" prog="29"/>
+ <Patch name="LP OverDrvGt" hbank="8" lbank="0" prog="29"/>
+ <Patch name="LP OverDrv" hbank="9" lbank="0" prog="29"/>
+ <Patch name="LP Half Drv" hbank="10" lbank="0" prog="29"/>
+ <Patch name="LP Half Drv2" hbank="11" lbank="0" prog="29"/>
+ <Patch name="LP Chorus" hbank="12" lbank="0" prog="29"/>
+
+ <Patch name="Dist. Gt2" hbank="1" lbank="0" prog="30"/>
+ <Patch name="Dazed Guitar" hbank="2" lbank="0" prog="30"/>
+ <Patch name="Distortion" hbank="3" lbank="0" prog="30"/>
+ <Patch name="Dist. Fast" hbank="4" lbank="0" prog="30"/>
+ <Patch name="Attack Dist" hbank="5" lbank="0" prog="30"/>
+ <Patch name="Feedback Gt." hbank="8" lbank="0" prog="30"/>
+ <Patch name="Feedback Gt2" hbank="9" lbank="0" prog="30"/>
+ <Patch name="Power Guitar" hbank="16" lbank="0" prog="30"/>
+ <Patch name="Power Gt.2" hbank="17" lbank="0" prog="30"/>
+ <Patch name="5th Dist." hbank="18" lbank="0" prog="30"/>
+ <Patch name="Rock Rhythm" hbank="24" lbank="0" prog="30"/>
+ <Patch name="Rock Rhythm2" hbank="25" lbank="0" prog="30"/>
+ <Patch name="Dist Rtm GTR" hbank="26" lbank="0" prog="30"/>
+
+ <Patch name="Gt. Feedback" hbank="8" lbank="0" prog="31"/>
+ <Patch name="Gt.Feedback2" hbank="9" lbank="0" prog="31"/>
+ <Patch name="Ac.Gt.Harmnx" hbank="16" lbank="0" prog="31"/>
+ <Patch name="E.Bass Harm." hbank="24" lbank="0" prog="31"/>
+
+ </PatchGroup>
+
+
+
+ <PatchGroup name="Bass">
+ <Patch name="Rockabillyi" hbank="1" lbank="0" prog="32"/>
+ <Patch name="Wild A.Bass" hbank="8" lbank="0" prog="32"/>
+ <Patch name="Atk A.Bass" hbank="9" lbank="0" prog="32"/>
+ <Patch name="Bass + OHH" hbank="16" lbank="0" prog="32"/>
+
+ <Patch name="Fingered Bs2" hbank="1" lbank="0" prog="33"/>
+ <Patch name="Jazz Bass" hbank="2" lbank="0" prog="33"/>
+ <Patch name="Jazz Bass 2" hbank="3" lbank="0" prog="33"/>
+ <Patch name="Rock Bass" hbank="4" lbank="0" prog="33"/>
+ <Patch name="Heart Bass" hbank="5" lbank="0" prog="33"/>
+ <Patch name="AttackFinger" hbank="6" lbank="0" prog="33"/>
+ <Patch name="Finger Slap" hbank="7" lbank="0" prog="33"/>
+ <Patch name="ChorusJazzBs" hbank="8" lbank="0" prog="33"/>
+ <Patch name="F.Bass/Harm." hbank="16" lbank="0" prog="33"/>
+
+ <Patch name="Picked Bass2" hbank="1" lbank="0" prog="34"/>
+ <Patch name="Picked Bass3" hbank="2" lbank="0" prog="34"/>
+ <Patch name="Picked Bass4" hbank="3" lbank="0" prog="34"/>
+ <Patch name="Double Pick" hbank="4" lbank="0" prog="34"/>
+ <Patch name="Muted PickBs" hbank="8" lbank="0" prog="34"/>
+ <Patch name="P.Bass/Harm." hbank="16" lbank="0" prog="34"/>
+
+ <Patch name="Fretless Bs2" hbank="1" lbank="0" prog="35"/>
+ <Patch name="Fretless Bs3" hbank="2" lbank="0" prog="35"/>
+ <Patch name="Fretless Bs4" hbank="3" lbank="0" prog="35"/>
+ <Patch name="Syn Fretless" hbank="4" lbank="0" prog="35"/>
+ <Patch name="Mr.Smooth" hbank="5" lbank="0" prog="35"/>
+ <Patch name="Wood+FlessBs" hbank="8" lbank="0" prog="35"/>
+
+ <Patch name="Slap Pop" hbank="1" lbank="0" prog="36"/>
+ <Patch name="Reso Slap" hbank="8" lbank="0" prog="36"/>
+ <Patch name="Unison Slap" hbank="9" lbank="0" prog="36"/>
+
+ <Patch name="Slap Bass 3" hbank="1" lbank="0" prog="37"/>
+ <Patch name="FM Slap" hbank="8" lbank="0" prog="37"/>
+
+ <Patch name="SynthBass101" hbank="1" lbank="0" prog="38"/>
+ <Patch name="CS Bass" hbank="2" lbank="0" prog="38"/>
+ <Patch name="JP-4 Bass" hbank="3" lbank="0" prog="38"/>
+ <Patch name="JP-8 Bass" hbank="4" lbank="0" prog="38"/>
+ <Patch name="P5 Bass" hbank="5" lbank="0" prog="38"/>
+ <Patch name="JPMG Bass" hbank="6" lbank="0" prog="38"/>
+ <Patch name="Acid Bass" hbank="8" lbank="0" prog="38"/>
+ <Patch name="TB303 Bass" hbank="9" lbank="0" prog="38"/>
+ <Patch name="Tekno Bass" hbank="10" lbank="0" prog="38"/>
+ <Patch name="TB303 Bass 2" hbank="11" lbank="0" prog="38"/>
+ <Patch name="Kicked TB303" hbank="12" lbank="0" prog="38"/>
+ <Patch name="TB303 Saw Bs" hbank="13" lbank="0" prog="38"/>
+ <Patch name="Rubber303 Bs" hbank="14" lbank="0" prog="38"/>
+ <Patch name="Reso 303 Bs" hbank="15" lbank="0" prog="38"/>
+ <Patch name="Reso SH Bass" hbank="16" lbank="0" prog="38"/>
+ <Patch name="TB303 Sqr Bs" hbank="17" lbank="0" prog="38"/>
+ <Patch name="TB303 DistBs" hbank="18" lbank="0" prog="38"/>
+ <Patch name="Clavi Bass" hbank="19" lbank="0" prog="38"/>
+ <Patch name="Hammer" hbank="20" lbank="0" prog="38"/>
+ <Patch name="Jungle Bass" hbank="21" lbank="0" prog="38"/>
+ <Patch name="Square Bass" hbank="22" lbank="0" prog="38"/>
+ <Patch name="Square Bass2" hbank="23" lbank="0" prog="38"/>
+ <Patch name="Arpeggio Bs" hbank="24" lbank="0" prog="38"/>
+ <Patch name="Hit+Saw Bass" hbank="32" lbank="0" prog="38"/>
+ <Patch name="Ring Bass" hbank="33" lbank="0" prog="38"/>
+ <Patch name="AtkSineBass" hbank="34" lbank="0" prog="38"/>
+ <Patch name="OB sine Bass" hbank="35" lbank="0" prog="38"/>
+ <Patch name="Auxiliary Bs" hbank="36" lbank="0" prog="38"/>
+ <Patch name="303SqDistBs" hbank="40" lbank="0" prog="38"/>
+ <Patch name="303SqDistBs2" hbank="41" lbank="0" prog="38"/>
+ <Patch name="303SqDistBs3" hbank="42" lbank="0" prog="38"/>
+ <Patch name="303Sqr.Rev" hbank="43" lbank="0" prog="38"/>
+ <Patch name="TeeBee" hbank="44" lbank="0" prog="38"/>
+
+ <Patch name="SynthBass201" hbank="1" lbank="0" prog="39"/>
+ <Patch name="Modular Bass" hbank="2" lbank="0" prog="39"/>
+ <Patch name="Seq Bass" hbank="3" lbank="0" prog="39"/>
+ <Patch name="MG Bass" hbank="4" lbank="0" prog="39"/>
+ <Patch name="Mg Oct Bass1" hbank="5" lbank="0" prog="39"/>
+ <Patch name="MG Oct Bass2" hbank="6" lbank="0" prog="39"/>
+ <Patch name="MG Blip Bs" hbank="7" lbank="0" prog="39"/>
+ <Patch name="Beef FM Bass" hbank="8" lbank="0" prog="39"/>
+ <Patch name="Dly Bass" hbank="9" lbank="0" prog="39"/>
+ <Patch name="X Wire Bass" hbank="10" lbank="0" prog="39"/>
+ <Patch name="WireStr Bass" hbank="11" lbank="0" prog="39"/>
+ <Patch name="Blip Bass" hbank="12" lbank="0" prog="39"/>
+ <Patch name="RubberBass 1" hbank="13" lbank="0" prog="39"/>
+ <Patch name="Syn Bell Bs" hbank="14" lbank="0" prog="39"/>
+ <Patch name="Odd Bass" hbank="15" lbank="0" prog="39"/>
+ <Patch name="RubberBass 2" hbank="16" lbank="0" prog="39"/>
+ <Patch name="SH101 Bass 1" hbank="17" lbank="0" prog="39"/>
+ <Patch name="SH101 Bass 2" hbank="18" lbank="0" prog="39"/>
+ <Patch name="Smooth Bass" hbank="19" lbank="0" prog="39"/>
+ <Patch name="SH101 Bass 3" hbank="20" lbank="0" prog="39"/>
+ <Patch name="Spike Bass" hbank="21" lbank="0" prog="39"/>
+ <Patch name="House Bass" hbank="22" lbank="0" prog="39"/>
+ <Patch name="KG Bass" hbank="23" lbank="0" prog="39"/>
+ <Patch name="Sync Bass" hbank="24" lbank="0" prog="39"/>
+ <Patch name="MG 5th Bass" hbank="25" lbank="0" prog="39"/>
+ <Patch name="RND Bass" hbank="26" lbank="0" prog="39"/>
+ <Patch name="WowMG Bass" hbank="27" lbank="0" prog="39"/>
+ <Patch name="Bubble Bass" hbank="28" lbank="0" prog="39"/>
+ <Patch name="Attack Pulse" hbank="29" lbank="0" prog="39"/>
+ <Patch name="Sync Bass 2" hbank="30" lbank="0" prog="39"/>
+ <Patch name="Pulse Mix Bs" hbank="31" lbank="0" prog="39"/>
+ <Patch name="MG Dist Bass" hbank="32" lbank="0" prog="39"/>
+ <Patch name="Seq Bass 2" hbank="33" lbank="0" prog="39"/>
+ <Patch name="3rd Bass" hbank="34" lbank="0" prog="39"/>
+ <Patch name="MG Oct Bass" hbank="35" lbank="0" prog="39"/>
+ <Patch name="SlowEnvBass" hbank="36" lbank="0" prog="39"/>
+ <Patch name="Mild Bass" hbank="37" lbank="0" prog="39"/>
+ <Patch name="DistEnvBass" hbank="38" lbank="0" prog="39"/>
+ <Patch name="MG LightBass" hbank="39" lbank="0" prog="39"/>
+ <Patch name="DistSynBass" hbank="40" lbank="0" prog="39"/>
+ <Patch name="Rise Bass" hbank="41" lbank="0" prog="39"/>
+ <Patch name="Cyber Bass" hbank="42" lbank="0" prog="39"/>
+
+ </PatchGroup>
+
+ <PatchGroup name="Strings/Orchestra">
+ <Patch name="Violin Atk" hbank="1" lbank="0" prog="40"/>
+ <Patch name="Slow Violin" hbank="8" lbank="0" prog="40"/>
+
+ <Patch name="Viola Atk." hbank="1" lbank="0" prog="41"/>
+
+ <Patch name="Cello Atk." hbank="1" lbank="0" prog="42"/>
+
+ <Patch name="Trem Str.St." hbank="2" lbank="0" prog="44"/>
+ <Patch name="Slow Tremolo" hbank="8" lbank="0" prog="44"/>
+ <Patch name="Suspense Str" hbank="9" lbank="0" prog="44"/>
+ <Patch name="SuspenseStr2" hbank="10" lbank="0" prog="44"/>
+
+ <Patch name="Vcs+Cbs Pizz" hbank="1" lbank="0" prog="45"/>
+ <Patch name="Chamber Pizz" hbank="2" lbank="0" prog="45"/>
+ <Patch name="St.Pizzicato" hbank="3" lbank="0" prog="45"/>
+ <Patch name="Solo Pizz." hbank="8" lbank="0" prog="45"/>
+ <Patch name="Solo Spic." hbank="16" lbank="0" prog="45"/>
+ <Patch name="StringsSpic." hbank="17" lbank="0" prog="45"/>
+
+ <Patch name="Harp+Strings" hbank="1" lbank="0" prog="46"/>
+ <Patch name="Harp St." hbank="2" lbank="0" prog="46"/>
+ <Patch name="Uillean Harp" hbank="8" lbank="0" prog="46"/>
+ <Patch name="Synth Harp" hbank="16" lbank="0" prog="46"/>
+ <Patch name="Yang Qin" hbank="24" lbank="0" prog="46"/>
+ <Patch name="Yang Qin 2" hbank="25" lbank="0" prog="46"/>
+ <Patch name="SynthYangQin" hbank="26" lbank="0" prog="46"/>
+ </PatchGroup>
+
+ <PatchGroup name="Ensemble">
+ <Patch name="Bright Str" hbank="1" lbank="0" prog="48"/>
+ <Patch name="ChamberStr" hbank="2" lbank="0" prog="48"/>
+ <Patch name="Cello sect." hbank="3" lbank="0" prog="48"/>
+ <Patch name="Bright Str.2" hbank="4" lbank="0" prog="48"/>
+ <Patch name="Bright Str.3" hbank="5" lbank="0" prog="48"/>
+ <Patch name="Quad Strings" hbank="6" lbank="0" prog="48"/>
+ <Patch name="Mild Strings" hbank="7" lbank="0" prog="48"/>
+ <Patch name="Orchestra" hbank="8" lbank="0" prog="48"/>
+ <Patch name="Orchestra 2" hbank="9" lbank="0" prog="48"/>
+ <Patch name="Tremolo Orch" hbank="10" lbank="0" prog="48"/>
+ <Patch name="Choir Str." hbank="11" lbank="0" prog="48"/>
+ <Patch name="Strings+Horn" hbank="12" lbank="0" prog="48"/>
+ <Patch name="Str.+Flute" hbank="13" lbank="0" prog="48"/>
+ <Patch name="Choir Str.2" hbank="14" lbank="0" prog="48"/>
+ <Patch name="Choir Str.3" hbank="15" lbank="0" prog="48"/>
+ <Patch name="St. Strings" hbank="16" lbank="0" prog="48"/>
+ <Patch name="St.Strings 2" hbank="17" lbank="0" prog="48"/>
+ <Patch name="St.Strings 3" hbank="18" lbank="0" prog="48"/>
+ <Patch name="Orchestra 3" hbank="19" lbank="0" prog="48"/>
+ <Patch name="Orchestra 4" hbank="20" lbank="0" prog="48"/>
+ <Patch name="Velo Strings" hbank="24" lbank="0" prog="48"/>
+ <Patch name="Oct Strings1" hbank="32" lbank="0" prog="48"/>
+ <Patch name="Oct Strings2" hbank="33" lbank="0" prog="48"/>
+ <Patch name="ContraBsSect" hbank="34" lbank="0" prog="48"/>
+ <Patch name="60s Strings" hbank="40" lbank="0" prog="48"/>
+
+ <Patch name="SlowStrings2" hbank="1" lbank="0" prog="49"/>
+ <Patch name="SlowStrings3" hbank="2" lbank="0" prog="49"/>
+ <Patch name="Legato Str." hbank="8" lbank="0" prog="49"/>
+ <Patch name="Warm Strings" hbank="9" lbank="0" prog="49"/>
+ <Patch name="St.Slow Str." hbank="10" lbank="0" prog="49"/>
+ <Patch name="St.Slow Str2" hbank="11" lbank="0" prog="49"/>
+ <Patch name="S.Str+Choir" hbank="12" lbank="0" prog="49"/>
+ <Patch name="S.Str+Choir2" hbank="13" lbank="0" prog="49"/>
+
+ <Patch name="OB Strings" hbank="1" lbank="0" prog="50"/>
+ <Patch name="StackStrings" hbank="2" lbank="0" prog="50"/>
+ <Patch name="JP Strings" hbank="3" lbank="0" prog="50"/>
+ <Patch name="Chorus Str." hbank="4" lbank="0" prog="50"/>
+ <Patch name="Syn.Strings3" hbank="8" lbank="0" prog="50"/>
+ <Patch name="Syn.Strings4" hbank="9" lbank="0" prog="50"/>
+ <Patch name="Syn.Strings6" hbank="10" lbank="0" prog="50"/>
+ <Patch name="Syn.Strings7" hbank="11" lbank="0" prog="50"/>
+ <Patch name="LoFi Strings" hbank="12" lbank="0" prog="50"/>
+ <Patch name="High Strings" hbank="16" lbank="0" prog="50"/>
+ <Patch name="Hybrid Str." hbank="17" lbank="0" prog="50"/>
+ <Patch name="Tron Strings" hbank="24" lbank="0" prog="50"/>
+ <Patch name="Noiz Strings" hbank="25" lbank="0" prog="50"/>
+
+ <Patch name="Syn.Strings5" hbank="1" lbank="0" prog="51"/>
+ <Patch name="JUNO Strings" hbank="2" lbank="0" prog="51"/>
+ <Patch name="FilteredOrch" hbank="3" lbank="0" prog="51"/>
+ <Patch name="JP Saw Str." hbank="4" lbank="0" prog="51"/>
+ <Patch name="Hybrid Str.2" hbank="5" lbank="0" prog="51"/>
+ <Patch name="DistStrings" hbank="6" lbank="0" prog="51"/>
+ <Patch name="JUNOFullStr." hbank="7" lbank="0" prog="51"/>
+ <Patch name="Air Strings" hbank="8" lbank="0" prog="51"/>
+ <Patch name="Atk Syn Str." hbank="9" lbank="0" prog="51"/>
+ <Patch name="StraightStr." hbank="10" lbank="0" prog="51"/>
+
+ <Patch name="St.ChoirAahs" hbank="8" lbank="0" prog="52"/>
+ <Patch name="Melted Choir" hbank="9" lbank="0" prog="52"/>
+ <Patch name="Church Choir" hbank="10" lbank="0" prog="52"/>
+ <Patch name="Boys Choir 1" hbank="11" lbank="0" prog="52"/>
+ <Patch name="Boys Choir 2" hbank="12" lbank="0" prog="52"/>
+ <Patch name="St.BoysChoir" hbank="13" lbank="0" prog="52"/>
+ <Patch name="Rich Choir" hbank="14" lbank="0" prog="52"/>
+ <Patch name="Choir Hahs" hbank="16" lbank="0" prog="52"/>
+ <Patch name="Chorus Lahs" hbank="24" lbank="0" prog="52"/>
+ <Patch name="Chorus Aahs" hbank="32" lbank="0" prog="52"/>
+ <Patch name="Male Aah+Str" hbank="33" lbank="0" prog="52"/>
+
+ <Patch name="Chorus Oohs" hbank="1" lbank="0" prog="53"/>
+ <Patch name="Voice Oohs 2" hbank="2" lbank="0" prog="53"/>
+ <Patch name="Chorus Oohs2" hbank="3" lbank="0" prog="53"/>
+ <Patch name="OohsCodeMaj7" hbank="4" lbank="0" prog="53"/>
+ <Patch name="OohsCodeSus4" hbank="5" lbank="0" prog="53"/>
+ <Patch name="Jazz Scat" hbank="6" lbank="0" prog="53"/>
+ <Patch name="Voice Dahs" hbank="8" lbank="0" prog="53"/>
+ <Patch name="JzVoice Dat" hbank="9" lbank="0" prog="53"/>
+ <Patch name="JzVoice Bap" hbank="10" lbank="0" prog="53"/>
+ <Patch name="JzVoice Dow" hbank="11" lbank="0" prog="53"/>
+ <Patch name="JzVoice Thum" hbank="12" lbank="0" prog="53"/>
+ <Patch name="VoiceLah Fem" hbank="16" lbank="0" prog="53"/>
+ <Patch name="ChorusLahFem" hbank="17" lbank="0" prog="53"/>
+ <Patch name="VoiceLuh Fem" hbank="18" lbank="0" prog="53"/>
+ <Patch name="ChorusLuhFem" hbank="19" lbank="0" prog="53"/>
+ <Patch name="VoiceLan Fem" hbank="20" lbank="0" prog="53"/>
+ <Patch name="ChorusLanFem" hbank="21" lbank="0" prog="53"/>
+ <Patch name="VoiceAah Fem" hbank="22" lbank="0" prog="53"/>
+ <Patch name="VoiceUuh Fem" hbank="23" lbank="0" prog="53"/>
+ <Patch name="Fem LahLan" hbank="24" lbank="0" prog="53"/>
+ <Patch name="VoiceWah Mal" hbank="32" lbank="0" prog="53"/>
+ <Patch name="ChorusWahMal" hbank="33" lbank="0" prog="53"/>
+ <Patch name="VoiceWoh Mal" hbank="34" lbank="0" prog="53"/>
+ <Patch name="ChorusWohMal" hbank="35" lbank="0" prog="53"/>
+ <Patch name="VoiceAah Mal" hbank="36" lbank="0" prog="53"/>
+ <Patch name="VoiceOoh Mal" hbank="37" lbank="0" prog="53"/>
+ <Patch name="Humming" hbank="40" lbank="0" prog="53"/>
+
+ <Patch name="SynVox 2" hbank="1" lbank="0" prog="54"/>
+ <Patch name="SynVox 3" hbank="2" lbank="0" prog="54"/>
+ <Patch name="Syn.Voice" hbank="8" lbank="0" prog="54"/>
+ <Patch name="Silent Night" hbank="9" lbank="0" prog="54"/>
+ <Patch name="Syn.Voice 2" hbank="10" lbank="0" prog="54"/>
+ <Patch name="VP330 Choir" hbank="16" lbank="0" prog="54"/>
+ <Patch name="Vinyl Choir" hbank="17" lbank="0" prog="54"/>
+ <Patch name="JX8P Vox" hbank="18" lbank="0" prog="54"/>
+ <Patch name="Analog Voice" hbank="19" lbank="0" prog="54"/>
+
+ <Patch name="Bass Hit" hbank="1" lbank="0" prog="55"/>
+ <Patch name="6th Hit" hbank="2" lbank="0" prog="55"/>
+ <Patch name="Euro Hit" hbank="3" lbank="0" prog="55"/>
+ <Patch name="Impact Hit" hbank="8" lbank="0" prog="55"/>
+ <Patch name="Philly Hit" hbank="9" lbank="0" prog="55"/>
+ <Patch name="Double Hit" hbank="10" lbank="0" prog="55"/>
+ <Patch name="Perc. Hit" hbank="11" lbank="0" prog="55"/>
+ <Patch name="Shock Wave" hbank="12" lbank="0" prog="55"/>
+ <Patch name="Bounce Hit" hbank="13" lbank="0" prog="55"/>
+ <Patch name="Drill Hit" hbank="14" lbank="0" prog="55"/>
+ <Patch name="Thrill Hit" hbank="15" lbank="0" prog="55"/>
+ <Patch name="Lo Fi Rave" hbank="16" lbank="0" prog="55"/>
+ <Patch name="Techno Hit" hbank="17" lbank="0" prog="55"/>
+ <Patch name="Dist. Hit" hbank="18" lbank="0" prog="55"/>
+ <Patch name="Bam Hit" hbank="19" lbank="0" prog="55"/>
+ <Patch name="Bit Hit" hbank="20" lbank="0" prog="55"/>
+ <Patch name="Bim Hit" hbank="21" lbank="0" prog="55"/>
+ <Patch name="Technorg Hit" hbank="22" lbank="0" prog="55"/>
+ <Patch name="Rave Hit" hbank="23" lbank="0" prog="55"/>
+ <Patch name="Strings Hit" hbank="24" lbank="0" prog="55"/>
+ <Patch name="Stack Hit" hbank="25" lbank="0" prog="55"/>
+ <Patch name="Industry Hit" hbank="26" lbank="0" prog="55"/>
+ <Patch name="Clap Hit" hbank="27" lbank="0" prog="55"/>
+
+ </PatchGroup>
+ <PatchGroup name="Brass">
+
+ <Patch name="Trumpet 2" hbank="1" lbank="0" prog="56"/>
+ <Patch name="Trumpet:" hbank="2" lbank="0" prog="56"/>
+ <Patch name="Dark Trumpet" hbank="3" lbank="0" prog="56"/>
+ <Patch name="Trumpet + Nz" hbank="4" lbank="0" prog="56"/>
+ <Patch name="Flugel Horn" hbank="8" lbank="0" prog="56"/>
+ <Patch name="4th Trumpets" hbank="16" lbank="0" prog="56"/>
+ <Patch name="Bright Tp." hbank="24" lbank="0" prog="56"/>
+ <Patch name="Warm Tp." hbank="25" lbank="0" prog="56"/>
+ <Patch name="Warm Tp.2" hbank="26" lbank="0" prog="56"/>
+ <Patch name="Twin Tp." hbank="27" lbank="0" prog="56"/>
+ <Patch name="Syn. Trumpet" hbank="32" lbank="0" prog="56"/>
+
+ <Patch name="Trombone 2" hbank="1" lbank="0" prog="57"/>
+ <Patch name="Twin bones" hbank="2" lbank="0" prog="57"/>
+ <Patch name="Bones + Tuba" hbank="3" lbank="0" prog="57"/>
+ <Patch name="Bright Tb" hbank="4" lbank="0" prog="57"/>
+ <Patch name="Bs. Trombone" hbank="8" lbank="0" prog="57"/>
+ <Patch name="Euphonium" hbank="16" lbank="0" prog="57"/>
+
+ <Patch name="Tuba 2" hbank="1" lbank="0" prog="58"/>
+ <Patch name="Tuba + Horn" hbank="8" lbank="0" prog="58"/>
+
+ <Patch name="Cup Mute Tp" hbank="1" lbank="0" prog="59"/>
+ <Patch name="MuteTrumpet2" hbank="2" lbank="0" prog="59"/>
+ <Patch name="MuteTrumpet3" hbank="3" lbank="0" prog="59"/>
+ <Patch name="Muted Horns" hbank="8" lbank="0" prog="59"/>
+
+ <Patch name="Fr.Horn 2" hbank="1" lbank="0" prog="60"/>
+ <Patch name="Horn + Orche" hbank="2" lbank="0" prog="60"/>
+ <Patch name="Wide FreHrns" hbank="3" lbank="0" prog="60"/>
+ <Patch name="F.Hrn Slow:" hbank="8" lbank="0" prog="60"/>
+ <Patch name="Dual Horns" hbank="9" lbank="0" prog="60"/>
+ <Patch name="Synth Horn" hbank="16" lbank="0" prog="60"/>
+ <Patch name="F.Horn Rip" hbank="24" lbank="0" prog="60"/>
+
+ <Patch name="Brass ff" hbank="1" lbank="0" prog="61"/>
+ <Patch name="Bones Sect." hbank="2" lbank="0" prog="61"/>
+ <Patch name="St. Brass ff" hbank="3" lbank="0" prog="61"/>
+ <Patch name="Quad Brass1" hbank="4" lbank="0" prog="61"/>
+ <Patch name="Quad Brass2" hbank="5" lbank="0" prog="61"/>
+ <Patch name="Brass 2" hbank="8" lbank="0" prog="61"/>
+ <Patch name="Brass 3" hbank="9" lbank="0" prog="61"/>
+ <Patch name="Brass sfz" hbank="10" lbank="0" prog="61"/>
+ <Patch name="Brass sfz 2" hbank="12" lbank="0" prog="61"/>
+ <Patch name="FatPop Brass" hbank="14" lbank="0" prog="61"/>
+ <Patch name="Brass Fall" hbank="16" lbank="0" prog="61"/>
+ <Patch name="Trumpet Fall" hbank="17" lbank="0" prog="61"/>
+ <Patch name="Octave Brass" hbank="24" lbank="0" prog="61"/>
+ <Patch name="Brass + Reed" hbank="25" lbank="0" prog="61"/>
+ <Patch name="Fat + Reed" hbank="26" lbank="0" prog="61"/>
+ <Patch name="Orch Brass" hbank="32" lbank="0" prog="61"/>
+ <Patch name="Orch Brass 2" hbank="33" lbank="0" prog="61"/>
+ <Patch name="St.FatPopBrs" hbank="35" lbank="0" prog="61"/>
+ <Patch name="St.Orch Brs" hbank="36" lbank="0" prog="61"/>
+ <Patch name="St.Orch Brs2" hbank="37" lbank="0" prog="61"/>
+ <Patch name="St.Orch Brs3" hbank="38" lbank="0" prog="61"/>
+
+ <Patch name="JUNO Brass" hbank="1" lbank="0" prog="62"/>
+ <Patch name="Stack Brass" hbank="2" lbank="0" prog="62"/>
+ <Patch name="SH-5 Brass" hbank="3" lbank="0" prog="62"/>
+ <Patch name="MKS Brass" hbank="4" lbank="0" prog="62"/>
+ <Patch name="Jump Brass" hbank="5" lbank="0" prog="62"/>
+ <Patch name="Pro Brass" hbank="8" lbank="0" prog="62"/>
+ <Patch name="P5 Brass" hbank="9" lbank="0" prog="62"/>
+ <Patch name="OrchSynBrass" hbank="10" lbank="0" prog="62"/>
+ <Patch name="Oct SynBrass" hbank="16" lbank="0" prog="62"/>
+ <Patch name="Hybrid Brass" hbank="17" lbank="0" prog="62"/>
+ <Patch name="OctSynBrass2" hbank="18" lbank="0" prog="62"/>
+ <Patch name="BPF Brass" hbank="19" lbank="0" prog="62"/>
+
+ <Patch name="Soft Brass" hbank="1" lbank="0" prog="63"/>
+ <Patch name="Warm Brass" hbank="2" lbank="0" prog="63"/>
+ <Patch name="Synth Brass3" hbank="3" lbank="0" prog="63"/>
+ <Patch name="Sync Brass" hbank="4" lbank="0" prog="63"/>
+ <Patch name="Fat SynBrass" hbank="5" lbank="0" prog="63"/>
+ <Patch name="DeepSynBrass" hbank="6" lbank="0" prog="63"/>
+ <Patch name="SynBrass sfz" hbank="8" lbank="0" prog="63"/>
+ <Patch name="OB Brass " hbank="9" lbank="0" prog="63"/>
+ <Patch name="Reso Brass" hbank="10" lbank="0" prog="63"/>
+ <Patch name="DistSqrBrass" hbank="11" lbank="0" prog="63"/>
+ <Patch name="JP8000SawBrs" hbank="12" lbank="0" prog="63"/>
+ <Patch name="Velo Brass 1" hbank="16" lbank="0" prog="63"/>
+ <Patch name="Transbrass" hbank="17" lbank="0" prog="63"/>
+ </PatchGroup>
+ <PatchGroup name="Reed">
+ <Patch name="Soprano Exp." hbank="8" lbank="0" prog="64"/>
+
+ <Patch name="AltoSax Exp." hbank="8" lbank="0" prog="65"/>
+ <Patch name="Grow Sax" hbank="9" lbank="0" prog="65"/>
+ <Patch name="AltoSax + Tp" hbank="16" lbank="0" prog="65"/>
+ <Patch name="Sax Section" hbank="17" lbank="0" prog="65"/>
+
+ <Patch name="Tenor Sax :" hbank="1" lbank="0" prog="66"/>
+ <Patch name="BreathyTn.:" hbank="8" lbank="0" prog="66"/>
+ <Patch name="St.Tenor Sax" hbank="9" lbank="0" prog="66"/>
+
+ <Patch name="Bari. Sax :" hbank="1" lbank="0" prog="67"/>
+ <Patch name="Bari + Tenor" hbank="8" lbank="0" prog="67"/>
+
+ <Patch name="Oboe Exp." hbank="8" lbank="0" prog="68"/>
+ <Patch name="Multi Reed" hbank="16" lbank="0" prog="68"/>
+
+ <Patch name="Bs Clarinet" hbank="8" lbank="0" prog="71"/>
+ <Patch name="Multi Wind" hbank="16" lbank="0" prog="71"/>
+ <Patch name="Quad Wind" hbank="17" lbank="0" prog="71"/>
+
+ </PatchGroup>
+ <PatchGroup name="Pipe">
+ <Patch name="Piccolo :" hbank="1" lbank="0" prog="72"/>
+ <Patch name="Nay" hbank="8" lbank="0" prog="72"/>
+ <Patch name="Nay Tremolo" hbank="9" lbank="0" prog="72"/>
+ <Patch name="Di" hbank="16" lbank="0" prog="72"/>
+
+ <Patch name="Flute 2 " hbank="1" lbank="0" prog="73"/>":
+ <Patch name="Flute Exp." hbank="2" lbank="0" prog="73"/>
+ <Patch name="Flt Travelso" hbank="3" lbank="0" prog="73"/>
+ <Patch name="Flute + Vln" hbank="8" lbank="0" prog="73"/>
+ <Patch name="Pipe + Reed" hbank="9" lbank="0" prog="73"/>
+ <Patch name="Tron Flute" hbank="16" lbank="0" prog="73"/>
+ <Patch name="Indian Flute" hbank="17" lbank="0" prog="73"/>
+
+ <Patch name="Kawala" hbank="8" lbank="0" prog="75"/>
+ <Patch name="Zampona" hbank="16" lbank="0" prog="75"/>
+ <Patch name="Zampona Atk" hbank="17" lbank="0" prog="75"/>
+ <Patch name="Tin Whistle" hbank="24" lbank="0" prog="75"/>
+ <Patch name="TinWhtsle Nm" hbank="25" lbank="0" prog="75"/>
+ <Patch name="TinWhtsle Or" hbank="26" lbank="0" prog="75"/>
+
+ <Patch name="Shakuhachi:" hbank="1" lbank="0" prog="77"/>
+
+ <Patch name="Whistle 2" hbank="1" lbank="0" prog="78"/>
+
+ </PatchGroup>
+ <PatchGroup name="Synth Lead">
+ <Patch name="MG Square" hbank="1" lbank="0" prog="80"/>
+ <Patch name="Hollow Mini" hbank="2" lbank="0" prog="80"/>
+ <Patch name="Mellow FM" hbank="3" lbank="0" prog="80"/>
+ <Patch name="CC Solo" hbank="4" lbank="0" prog="80"/>
+ <Patch name="Shmoog" hbank="5" lbank="0" prog="80"/>
+ <Patch name="LM Square" hbank="6" lbank="0" prog="80"/>
+ <Patch name="JP8000 TWM" hbank="7" lbank="0" prog="80"/>
+ <Patch name="2600 Sine" hbank="8" lbank="0" prog="80"/>
+ <Patch name="Sine Lead" hbank="9" lbank="0" prog="80"/>
+ <Patch name="KG Lead" hbank="10" lbank="0" prog="80"/>
+ <Patch name="Twin Sine" hbank="11" lbank="0" prog="80"/>
+ <Patch name="P5 Square" hbank="16" lbank="0" prog="80"/>
+ <Patch name="OB Square" hbank="17" lbank="0" prog="80"/>
+ <Patch name="JP-8 Square" hbank="18" lbank="0" prog="80"/>
+ <Patch name="Dist Square" hbank="19" lbank="0" prog="80"/>
+ <Patch name="303SquarDst1" hbank="20" lbank="0" prog="80"/>
+ <Patch name="303SquarDst2" hbank="21" lbank="0" prog="80"/>
+ <Patch name="303 Mix Sqr" hbank="22" lbank="0" prog="80"/>
+ <Patch name="Dual Sqr+Saw" hbank="23" lbank="0" prog="80"/>
+ <Patch name="Pulse Lead" hbank="24" lbank="0" prog="80"/>
+ <Patch name="JP8 PulseLd1" hbank="25" lbank="0" prog="80"/>
+ <Patch name="JP8 PulseLd2" hbank="26" lbank="0" prog="80"/>
+ <Patch name="MG Reso. Pls" hbank="27" lbank="0" prog="80"/>
+ <Patch name="JP8 PulseLd3" hbank="28" lbank="0" prog="80"/>
+ <Patch name="260RingLead" hbank="29" lbank="0" prog="80"/>
+ <Patch name="303DistLead" hbank="30" lbank="0" prog="80"/>
+ <Patch name="JP8000DistLd" hbank="31" lbank="0" prog="80"/>
+ <Patch name="HipHop SinLd" hbank="32" lbank="0" prog="80"/>
+ <Patch name="HipHop SqrLd" hbank="33" lbank="0" prog="80"/>
+ <Patch name="HipHop PlsLd" hbank="34" lbank="0" prog="80"/>
+ <Patch name="Flux Pulse" hbank="35" lbank="0" prog="80"/>
+
+ <Patch name="OB2 Saw" hbank="1" lbank="0" prog="81"/>
+ <Patch name="Pulse Saw" hbank="2" lbank="0" prog="81"/>
+ <Patch name="Feline GR" hbank="3" lbank="0" prog="81"/>
+ <Patch name="Big Lead" hbank="4" lbank="0" prog="81"/>
+ <Patch name="Velo Lead" hbank="5" lbank="0" prog="81"/>
+ <Patch name="GR-300" hbank="6" lbank="0" prog="81"/>
+ <Patch name="LA Saw" hbank="7" lbank="0" prog="81"/>
+ <Patch name="Doctor Solo" hbank="8" lbank="0" prog="81"/>
+ <Patch name="Fat Saw Lead" hbank="9" lbank="0" prog="81"/>
+ <Patch name="JP8000 Saw" hbank="10" lbank="0" prog="81"/>
+ <Patch name="D-50 Fat Saw" hbank="11" lbank="0" prog="81"/>
+ <Patch name="OB DoubleSaw" hbank="12" lbank="0" prog="81"/>
+ <Patch name="JP DoubleSaw" hbank="13" lbank="0" prog="81"/>
+ <Patch name="FatSawLead 2" hbank="14" lbank="0" prog="81"/>
+ <Patch name="JP SuperSaw" hbank="15" lbank="0" prog="81"/>
+ <Patch name="Waspy Synth" hbank="16" lbank="0" prog="81"/>
+ <Patch name="PM Lead" hbank="17" lbank="0" prog="81"/>
+ <Patch name="CS Saw Lead" hbank="18" lbank="0" prog="81"/>
+ <Patch name="MG Saw 1" hbank="24" lbank="0" prog="81"/>
+ <Patch name="MG Saw 2" hbank="25" lbank="0" prog="81"/>
+ <Patch name="OB Saw 1" hbank="26" lbank="0" prog="81"/>
+ <Patch name="OB Saw 2" hbank="27" lbank="0" prog="81"/>
+ <Patch name="D-50 Saw" hbank="28" lbank="0" prog="81"/>
+ <Patch name="SH-101 Saw" hbank="29" lbank="0" prog="81"/>
+ <Patch name="CS Saw" hbank="30" lbank="0" prog="81"/>
+ <Patch name="MG Saw Lead" hbank="31" lbank="0" prog="81"/>
+ <Patch name="OB Saw Lead" hbank="32" lbank="0" prog="81"/>
+ <Patch name="P5 Saw Lead" hbank="33" lbank="0" prog="81"/>
+ <Patch name="MG unison" hbank="34" lbank="0" prog="81"/>
+ <Patch name="Oct Saw Lead" hbank="35" lbank="0" prog="81"/>
+ <Patch name="Natural Lead" hbank="36" lbank="0" prog="81"/>
+ <Patch name="SequenceSaw1" hbank="40" lbank="0" prog="81"/>
+ <Patch name="SequenceSaw2" hbank="41" lbank="0" prog="81"/>
+ <Patch name="Reso Saw" hbank="42" lbank="0" prog="81"/>
+ <Patch name="Cheese Saw 1" hbank="43" lbank="0" prog="81"/>
+ <Patch name="Cheese Saw 2" hbank="44" lbank="0" prog="81"/>
+ <Patch name="Rhythmic Saw" hbank="45" lbank="0" prog="81"/>
+ <Patch name="SequencedSaw" hbank="46" lbank="0" prog="81"/>
+ <Patch name="Techno Saw" hbank="47" lbank="0" prog="81"/>
+
+ <Patch name="Vent Synth" hbank="1" lbank="0" prog="82"/>
+ <Patch name="Pure PanLead" hbank="2" lbank="0" prog="82"/>
+ <Patch name="LM Pure Lead" hbank="8" lbank="0" prog="82"/>
+ <Patch name="LM Blow Lead" hbank="9" lbank="0" prog="82"/>
+
+ <Patch name="TB Lead" hbank="1" lbank="0" prog="83"/>
+ <Patch name="Hybrid Lead" hbank="2" lbank="0" prog="83"/>
+ <Patch name="Unison SqrLd" hbank="3" lbank="0" prog="83"/>
+ <Patch name="FatSolo Lead" hbank="4" lbank="0" prog="83"/>
+ <Patch name="ForcefulLead" hbank="5" lbank="0" prog="83"/>
+ <Patch name="Oct.UnisonLd" hbank="6" lbank="0" prog="83"/>
+ <Patch name="Unison SawLd" hbank="7" lbank="0" prog="83"/>
+ <Patch name="Mad Lead" hbank="8" lbank="0" prog="83"/>
+ <Patch name="CrowdingLead" hbank="9" lbank="0" prog="83"/>
+ <Patch name="Double Sqr." hbank="10" lbank="0" prog="83"/>
+
+ <Patch name="Wire Lead" hbank="1" lbank="0" prog="84"/>
+ <Patch name="FB.Charang" hbank="2" lbank="0" prog="84"/>
+ <Patch name="Fat GR Lead" hbank="3" lbank="0" prog="84"/>
+ <Patch name="Windy GR Ld" hbank="4" lbank="0" prog="84"/>
+ <Patch name="Mellow GR Ld" hbank="5" lbank="0" prog="84"/>
+ <Patch name="GR + Pulse" hbank="6" lbank="0" prog="84"/>
+ <Patch name="Dist.Lead" hbank="8" lbank="0" prog="84"/>
+ <Patch name="Acid Guitar1" hbank="9" lbank="0" prog="84"/>
+ <Patch name="Acid Guitar2" hbank="10" lbank="0" prog="84"/>
+ <Patch name="Dance Dst.Gt" hbank="11" lbank="0" prog="84"/>
+ <Patch name="DanceDst.Gt2" hbank="12" lbank="0" prog="84"/>
+ <Patch name="P5 Sync Lead" hbank="16" lbank="0" prog="84"/>
+ <Patch name="Fat SyncLead" hbank="17" lbank="0" prog="84"/>
+ <Patch name="Rock Lead" hbank="18" lbank="0" prog="84"/>
+ <Patch name="5th DecaSync" hbank="19" lbank="0" prog="84"/>
+ <Patch name="Dirty Sync" hbank="20" lbank="0" prog="84"/>
+ <Patch name="DualSyncLead" hbank="21" lbank="0" prog="84"/>
+ <Patch name="LA Brass Ld" hbank="22" lbank="0" prog="84"/>
+ <Patch name="JUNO Sub Osc" hbank="24" lbank="0" prog="84"/>
+ <Patch name="2600 Sub Osc" hbank="25" lbank="0" prog="84"/>
+ <Patch name="JP8000Fd Osc" hbank="26" lbank="0" prog="84"/>
+
+ <Patch name="Solo Vox 2" hbank="1" lbank="0" prog="85"/>
+ <Patch name="Vox Lead" hbank="8" lbank="0" prog="85"/>
+ <Patch name="LFO Vox" hbank="9" lbank="0" prog="85"/>
+ <Patch name="Vox Lead 2" hbank="10" lbank="0" prog="85"/>
+
+ <Patch name="Big Fives" hbank="1" lbank="0" prog="86"/>
+ <Patch name="5th Lead" hbank="2" lbank="0" prog="86"/>
+ <Patch name="5th Ana.Clav" hbank="3" lbank="0" prog="86"/>
+ <Patch name="5th Pulse JP" hbank="4" lbank="0" prog="86"/>
+ <Patch name="5th Saw" hbank="5" lbank="0" prog="86"/>
+ <Patch name="JP8000 5thFB" hbank="6" lbank="0" prog="86"/>
+ <Patch name="4th Lead" hbank="8" lbank="0" prog="86"/>
+
+ <Patch name="Big + Raw" hbank="1" lbank="0" prog="87"/>
+ <Patch name="Fat + Perky" hbank="2" lbank="0" prog="87"/>
+ <Patch name="JUNO Rave" hbank="3" lbank="0" prog="87"/>
+ <Patch name="JP8 BsLead 1" hbank="4" lbank="0" prog="87"/>
+ <Patch name="JP8 BsLead 2" hbank="5" lbank="0" prog="87"/>
+ <Patch name="SH-5 Bs.Lead" hbank="6" lbank="0" prog="87"/>
+ <Patch name="Delayed Lead" hbank="7" lbank="0" prog="87"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Pad, etc">
+
+ <Patch name="Fantasia 2" hbank="1" lbank="0" prog="88"/>
+ <Patch name="New Age Pad" hbank="2" lbank="0" prog="88"/>
+ <Patch name="Bell Heaven" hbank="3" lbank="0" prog="88"/>
+ <Patch name="Fantasia 3" hbank="4" lbank="0" prog="88"/>
+ <Patch name="Fantasia 4" hbank="5" lbank="0" prog="88"/>
+ <Patch name="After D !" hbank="6" lbank="0" prog="88"/>
+ <Patch name="260HarmPad" hbank="7" lbank="0" prog="88"/>
+
+ <Patch name="Thick Matrix" hbank="1" lbank="0" prog="89"/>
+ <Patch name="Horn Pad" hbank="2" lbank="0" prog="89"/>
+ <Patch name="Rotary Strng" hbank="3" lbank="0" prog="89"/>
+ <Patch name="OB Soft Pad" hbank="4" lbank="0" prog="89"/>
+ <Patch name="Sine Pad" hbank="5" lbank="0" prog="89"/>
+ <Patch name="OB Soft Pad2" hbank="6" lbank="0" prog="89"/>
+ <Patch name="Octave Pad" hbank="8" lbank="0" prog="89"/>
+ <Patch name="Stack Pad" hbank="9" lbank="0" prog="89"/>
+ <Patch name="Human Pad" hbank="10" lbank="0" prog="89"/>
+ <Patch name="Sync Brs.Pad" hbank="11" lbank="0" prog="89"/>
+ <Patch name="Oct.PWM Pad" hbank="12" lbank="0" prog="89"/>
+ <Patch name="JP Soft Pad" hbank="13" lbank="0" prog="89"/>
+
+ <Patch name="80's PolySyn" hbank="1" lbank="0" prog="90"/>
+ <Patch name="Polysynth 2" hbank="2" lbank="0" prog="90"/>
+ <Patch name="Poly King" hbank="3" lbank="0" prog="90"/>
+ <Patch name="Super Poly" hbank="4" lbank="0" prog="90"/>
+ <Patch name="Power Stack" hbank="8" lbank="0" prog="90"/>
+ <Patch name="Octave Stack" hbank="9" lbank="0" prog="90"/>
+ <Patch name="Reso Stack" hbank="10" lbank="0" prog="90"/>
+ <Patch name="Techno Stack" hbank="11" lbank="0" prog="90"/>
+ <Patch name="Pulse Stack" hbank="12" lbank="0" prog="90"/>
+ <Patch name="TwinOct.Rave" hbank="13" lbank="0" prog="90"/>
+ <Patch name="Oct.Rave" hbank="14" lbank="0" prog="90"/>
+ <Patch name="Happy Synth" hbank="15" lbank="0" prog="90"/>
+ <Patch name="ForwardSweep" hbank="16" lbank="0" prog="90"/>
+ <Patch name="ReverseSweep" hbank="17" lbank="0" prog="90"/>
+ <Patch name="Minor Rave" hbank="24" lbank="0" prog="90"/>
+
+ <Patch name="Heaven II" hbank="1" lbank="0" prog="91"/>
+ <Patch name="SC Heaven" hbank="2" lbank="0" prog="91"/>
+ <Patch name="Itopia" hbank="3" lbank="0" prog="91"/>
+ <Patch name="Water Space" hbank="4" lbank="0" prog="91"/>
+ <Patch name="Cold Space" hbank="5" lbank="0" prog="91"/>
+ <Patch name="Noise Peaker" hbank="6" lbank="0" prog="91"/>
+ <Patch name="Bamboo Hit" hbank="7" lbank="0" prog="91"/>
+ <Patch name="Cosmic Voice" hbank="8" lbank="0" prog="91"/>
+ <Patch name="Auh Vox" hbank="9" lbank="0" prog="91"/>
+ <Patch name="AuhAuh" hbank="10" lbank="0" prog="91"/>
+ <Patch name="Vocorderman" hbank="11" lbank="0" prog="91"/>
+ <Patch name="Holy Voices" hbank="12" lbank="0" prog="91"/>
+
+ <Patch name="SoftBellPad" hbank="1" lbank="0" prog="92"/>
+ <Patch name="JP8 Sqr Pad" hbank="2" lbank="0" prog="92"/>
+ <Patch name="7thBelPad" hbank="3" lbank="0" prog="92"/>
+ <Patch name="Steel Glass" hbank="4" lbank="0" prog="92"/>
+ <Patch name="Bottle Stack" hbank="5" lbank="0" prog="92"/>
+
+ <Patch name="Tine Pad" hbank="1" lbank="0" prog="93"/>
+ <Patch name="Panner Pad" hbank="2" lbank="0" prog="93"/>
+ <Patch name="Steel Pad" hbank="3" lbank="0" prog="93"/>
+ <Patch name="Special Rave" hbank="4" lbank="0" prog="93"/>
+ <Patch name="Metal Pad 2" hbank="5" lbank="0" prog="93"/>
+
+ <Patch name="Vox Pad" hbank="1" lbank="0" prog="94"/>
+ <Patch name="Vox Sweep" hbank="2" lbank="0" prog="94"/>
+ <Patch name="Horror Pad" hbank="8" lbank="0" prog="94"/>
+ <Patch name="SynVox Pad" hbank="9" lbank="0" prog="94"/>
+ <Patch name="SynVox Pad 2" hbank="10" lbank="0" prog="94"/>
+ <Patch name="Breath+Rise" hbank="11" lbank="0" prog="94"/>
+ <Patch name="Tears Voices" hbank="12" lbank="0" prog="94"/>
+
+ <Patch name="Polar Pad" hbank="1" lbank="0" prog="95"/>
+ <Patch name="Ambient BPF" hbank="2" lbank="0" prog="95"/>
+ <Patch name="Sync Pad" hbank="3" lbank="0" prog="95"/>
+ <Patch name="Warriors" hbank="4" lbank="0" prog="95"/>
+ <Patch name="Converge" hbank="8" lbank="0" prog="95"/>
+ <Patch name="Shwimmer" hbank="9" lbank="0" prog="95"/>
+ <Patch name="Celestial Pd" hbank="10" lbank="0" prog="95"/>
+ <Patch name="Bag Sweep" hbank="11" lbank="0" prog="95"/>
+ <Patch name="Sweep Pipe" hbank="12" lbank="0" prog="95"/>
+ <Patch name="Sweep Stack" hbank="13" lbank="0" prog="95"/>
+ <Patch name="Deep Sweep" hbank="14" lbank="0" prog="95"/>
+ <Patch name="Stray Pad" hbank="15" lbank="0" prog="95"/>
+
+ </PatchGroup>
+ <PatchGroup name="Synth SFX">
+ <Patch name="Harmo Rain" hbank="1" lbank="0" prog="96"/>
+ <Patch name="African wood" hbank="2" lbank="0" prog="96"/>
+ <Patch name="Anklung Pad" hbank="3" lbank="0" prog="96"/>
+ <Patch name="Rattle Pad" hbank="4" lbank="0" prog="96"/>
+ <Patch name="Saw Impulse" hbank="5" lbank="0" prog="96"/>
+ <Patch name="Strange Str." hbank="6" lbank="0" prog="96"/>
+ <Patch name="FastFWD Pad" hbank="7" lbank="0" prog="96"/>
+ <Patch name="Clavi Pad" hbank="8" lbank="0" prog="96"/>
+ <Patch name="EP Pad" hbank="9" lbank="0" prog="96"/>
+ <Patch name="Tambra Pad" hbank="10" lbank="0" prog="96"/>
+ <Patch name="CP Pad" hbank="11" lbank="0" prog="96"/>
+
+ <Patch name="Ancestral" hbank="1" lbank="0" prog="97"/>
+ <Patch name="Prologue" hbank="2" lbank="0" prog="97"/>
+ <Patch name="Prologue 2" hbank="3" lbank="0" prog="97"/>
+ <Patch name="Hols Strings" hbank="4" lbank="0" prog="97"/>
+ <Patch name="HistoryWave" hbank="5" lbank="0" prog="97"/>
+ <Patch name="Rave" hbank="8" lbank="0" prog="97"/>
+
+ <Patch name="Syn Mallet" hbank="1" lbank="0" prog="98"/>
+ <Patch name="Soft Crystal" hbank="2" lbank="0" prog="98"/>
+ <Patch name="Round Glock" hbank="3" lbank="0" prog="98"/>
+ <Patch name="Loud Glock" hbank="4" lbank="0" prog="98"/>
+ <Patch name="GlockenChime" hbank="5" lbank="0" prog="98"/>
+ <Patch name="Clear Bells" hbank="6" lbank="0" prog="98"/>
+ <Patch name="ChristmasBel" hbank="7" lbank="0" prog="98"/>
+ <Patch name="Vibra Bells" hbank="8" lbank="0" prog="98"/>
+ <Patch name="Digi Bells" hbank="9" lbank="0" prog="98"/>
+ <Patch name="Music Bell" hbank="10" lbank="0" prog="98"/>
+ <Patch name="Analog Bell" hbank="11" lbank="0" prog="98"/>
+ <Patch name="Blow Bell" hbank="12" lbank="0" prog="98"/>
+ <Patch name="Hyper Bell" hbank="13" lbank="0" prog="98"/>
+ <Patch name="Choral Bells" hbank="16" lbank="0" prog="98"/>
+ <Patch name="Air Bells" hbank="17" lbank="0" prog="98"/>
+ <Patch name="Bell Harp" hbank="18" lbank="0" prog="98"/>
+ <Patch name="Gamelimba" hbank="19" lbank="0" prog="98"/>
+ <Patch name="JUNO Bell" hbank="20" lbank="0" prog="98"/>
+ <Patch name="JP Bell" hbank="21" lbank="0" prog="98"/>
+ <Patch name="Pizz Bell" hbank="22" lbank="0" prog="98"/>
+ <Patch name="Bottom Bell" hbank="23" lbank="0" prog="98"/>
+
+ <Patch name="Warm Atmos" hbank="1" lbank="0" prog="99"/>
+ <Patch name="Nylon Harp" hbank="2" lbank="0" prog="99"/>
+ <Patch name="Harpvox" hbank="3" lbank="0" prog="99"/>
+ <Patch name="HollowReleas" hbank="4" lbank="0" prog="99"/>
+ <Patch name="Nylon+Rhodes" hbank="5" lbank="0" prog="99"/>
+ <Patch name="Ambient Pad" hbank="6" lbank="0" prog="99"/>
+ <Patch name="Invisible" hbank="7" lbank="0" prog="99"/>
+ <Patch name="Pulsey Key" hbank="8" lbank="0" prog="99"/>
+ <Patch name="Noise Piano" hbank="9" lbank="0" prog="99"/>
+ <Patch name="Heaven Atmos" hbank="10" lbank="0" prog="99"/>
+ <Patch name="Tambra Atmos" hbank="11" lbank="0" prog="99"/>
+
+ <Patch name="Shining Star" hbank="1" lbank="0" prog="100"/>
+ <Patch name="OB Stab" hbank="2" lbank="0" prog="100"/>
+ <Patch name="Brass Star" hbank="3" lbank="0" prog="100"/>
+ <Patch name="Choir Stab" hbank="4" lbank="0" prog="100"/>
+ <Patch name="D-50 Retour" hbank="5" lbank="0" prog="100"/>
+ <Patch name="SouthernWind" hbank="6" lbank="0" prog="100"/>
+ <Patch name="SymbolicBell" hbank="7" lbank="0" prog="100"/>
+ <Patch name="Org Bell" hbank="8" lbank="0" prog="100"/>
+
+ <Patch name="Goblinson" hbank="1" lbank="0" prog="101"/>
+ <Patch name="50's Sci-Fi" hbank="2" lbank="0" prog="101"/>
+ <Patch name="Abduction" hbank="3" lbank="0" prog="101"/>
+ <Patch name="Auhbient" hbank="4" lbank="0" prog="101"/>
+ <Patch name="LFO Pad" hbank="5" lbank="0" prog="101"/>
+ <Patch name="Random Str" hbank="6" lbank="0" prog="101"/>
+ <Patch name="Random Pad" hbank="7" lbank="0" prog="101"/>
+ <Patch name="LowBirds Pad" hbank="8" lbank="0" prog="101"/>
+ <Patch name="Falling Down" hbank="9" lbank="0" prog="101"/>
+ <Patch name="LFO RAVE" hbank="10" lbank="0" prog="101"/>
+ <Patch name="LFO Horror" hbank="11" lbank="0" prog="101"/>
+ <Patch name="LFO Techno" hbank="12" lbank="0" prog="101"/>
+ <Patch name="Alternative" hbank="13" lbank="0" prog="101"/>
+ <Patch name="UFO FX" hbank="14" lbank="0" prog="101"/>
+ <Patch name="Gargle Man" hbank="15" lbank="0" prog="101"/>
+ <Patch name="Sweep FX" hbank="16" lbank="0" prog="101"/>
+ <Patch name="LM Has Come" hbank="17" lbank="0" prog="101"/>
+ <Patch name="FallinInsect" hbank="18" lbank="0" prog="101"/>
+ <Patch name="LFO Oct.Rave" hbank="19" lbank="0" prog="101"/>
+ <Patch name="Just Before" hbank="20" lbank="0" prog="101"/>
+ <Patch name="RND Fl.Chord" hbank="21" lbank="0" prog="101"/>
+ <Patch name="RandomEnding" hbank="22" lbank="0" prog="101"/>
+ <Patch name="Random Sine" hbank="23" lbank="0" prog="101"/>
+ <Patch name="EatingFilter" hbank="24" lbank="0" prog="101"/>
+ <Patch name="Noise+SawHit" hbank="25" lbank="0" prog="101"/>
+ <Patch name="Pour Magic" hbank="26" lbank="0" prog="101"/>
+ <Patch name="DancingDrill" hbank="27" lbank="0" prog="101"/>
+ <Patch name="Dirty Stack" hbank="28" lbank="0" prog="101"/>
+ <Patch name="Big Blue" hbank="29" lbank="0" prog="101"/>
+ <Patch name="Static Hit" hbank="30" lbank="0" prog="101"/>
+ <Patch name="Atl.Mod.FX" hbank="31" lbank="0" prog="101"/>
+ <Patch name="Acid Copter" hbank="32" lbank="0" prog="101"/>
+
+ <Patch name="Echo Bell" hbank="1" lbank="0" prog="102"/>
+ <Patch name="Echo Pan" hbank="2" lbank="0" prog="102"/>
+ <Patch name="Echo Pan 2" hbank="3" lbank="0" prog="102"/>
+ <Patch name="Big Panner" hbank="4" lbank="0" prog="102"/>
+ <Patch name="Reso Panner" hbank="5" lbank="0" prog="102"/>
+ <Patch name="Water Piano" hbank="6" lbank="0" prog="102"/>
+ <Patch name="Echo SynBass" hbank="7" lbank="0" prog="102"/>
+ <Patch name="Pan Sequence" hbank="8" lbank="0" prog="102"/>
+ <Patch name="Aqua " hbank="9" lbank="0" prog="102"/>
+ <Patch name="Panning Lead" hbank="10" lbank="0" prog="102"/>
+ <Patch name="PanningBrass" hbank="11" lbank="0" prog="102"/>
+
+ <Patch name="Star Theme 2" hbank="1" lbank="0" prog="103"/>
+ <Patch name="Star Mind" hbank="2" lbank="0" prog="103"/>
+ <Patch name="Star Dust" hbank="3" lbank="0" prog="103"/>
+ <Patch name="Rep.Trance" hbank="4" lbank="0" prog="103"/>
+ <Patch name="Etherality" hbank="5" lbank="0" prog="103"/>
+ <Patch name="Mystic Pad" hbank="6" lbank="0" prog="103"/>
+ <Patch name="Dream Pad" hbank="8" lbank="0" prog="103"/>
+ <Patch name="Silky Pad" hbank="9" lbank="0" prog="103"/>
+ <Patch name="Dream Pad 2" hbank="10" lbank="0" prog="103"/>
+ <Patch name="Silky Pad 2" hbank="11" lbank="0" prog="103"/>
+ <Patch name="New Century" hbank="16" lbank="0" prog="103"/>
+ <Patch name="7th Atmos." hbank="17" lbank="0" prog="103"/>
+ <Patch name="Galaxy Way" hbank="18" lbank="0" prog="103"/>
+ <Patch name="Rising OSC." hbank="19" lbank="0" prog="103"/>
+ </PatchGroup>
+
+ <PatchGroup name="Ethnic">
+ <Patch name="Sitar 2" hbank="1" lbank="0" prog="104"/>
+ <Patch name="Detune Sitar" hbank="2" lbank="0" prog="104"/>
+ <Patch name="Sitar 3" hbank="3" lbank="0" prog="104"/>
+ <Patch name="Sitar/Drone" hbank="4" lbank="0" prog="104"/>
+ <Patch name="Sitar 4" hbank="5" lbank="0" prog="104"/>
+ <Patch name="Tambra" hbank="8" lbank="0" prog="104"/>
+ <Patch name="Tamboura" hbank="16" lbank="0" prog="104"/>
+
+ <Patch name="Muted Banjo" hbank="1" lbank="0" prog="105"/>
+ <Patch name="Rabab" hbank="8" lbank="0" prog="105"/>
+ <Patch name="San Xian" hbank="9" lbank="0" prog="105"/>
+ <Patch name="Gopichant" hbank="16" lbank="0" prog="105"/>
+ <Patch name="Oud" hbank="24" lbank="0" prog="105"/>
+ <Patch name="Oud+Strings" hbank="28" lbank="0" prog="105"/>
+ <Patch name="Pi Pa" hbank="32" lbank="0" prog="105"/>
+
+ <Patch name="Tsugaru" hbank="1" lbank="0" prog="106"/>
+ <Patch name="Syn Shamisen" hbank="8" lbank="0" prog="106"/>
+
+ <Patch name="Gu Zheng" hbank="1" lbank="0" prog="107"/>
+ <Patch name="Taisho Koto" hbank="8" lbank="0" prog="107"/>
+ <Patch name="Kanoon" hbank="16" lbank="0" prog="107"/>
+ <Patch name="Kanoon+Choir" hbank="19" lbank="0" prog="107"/>
+ <Patch name="Oct Harp" hbank="24" lbank="0" prog="107"/>
+
+ <Patch name="Sanza" hbank="8" lbank="0" prog="108"/>
+ <Patch name="Bodhran" hbank="9" lbank="0" prog="108"/>
+ <Patch name="Bodhran Mute" hbank="10" lbank="0" prog="108"/>
+
+ <Patch name="Didgeridoo" hbank="8" lbank="0" prog="109"/>
+ <Patch name="Uillean Pipe" hbank="9" lbank="0" prog="109"/>
+ <Patch name="UillnPipe Nm" hbank="10" lbank="0" prog="109"/>
+ <Patch name="UillnPipe Or" hbank="11" lbank="0" prog="109"/>
+
+ <Patch name="Er Hu" hbank="8" lbank="0" prog="110"/>
+ <Patch name="Gao Hu" hbank="9" lbank="0" prog="110"/>
+
+ <Patch name="Shanai 2" hbank="1" lbank="0" prog="111"/>
+ <Patch name="Pungi" hbank="8" lbank="0" prog="111"/>
+ <Patch name="Hichiriki" hbank="16" lbank="0" prog="111"/>
+ <Patch name="Mizmar" hbank="24" lbank="0" prog="111"/>
+ <Patch name="Suona 1" hbank="32" lbank="0" prog="111"/>
+ <Patch name="Suona 2" hbank="33" lbank="0" prog="111"/>
+
+ </PatchGroup>
+ <PatchGroup name="Percussive">
+ <Patch name="Bonang" hbank="8" lbank="0" prog="112"/>
+ <Patch name="Gender" hbank="9" lbank="0" prog="112"/>
+ <Patch name="Gamelan Gong" hbank="10" lbank="0" prog="112"/>
+ <Patch name="St.Gamelan" hbank="11" lbank="0" prog="112"/>
+ <Patch name="Jang Gu" hbank="12" lbank="0" prog="112"/>
+ <Patch name="Jegogan" hbank="13" lbank="0" prog="112"/>
+ <Patch name="Jublag" hbank="14" lbank="0" prog="112"/>
+ <Patch name="Pemade" hbank="15" lbank="0" prog="112"/>
+ <Patch name="RAMA Cymbal" hbank="16" lbank="0" prog="112"/>
+ <Patch name="Kajar" hbank="17" lbank="0" prog="112"/>
+ <Patch name="Kelontuk" hbank="18" lbank="0" prog="112"/>
+ <Patch name="Kelontuk Mt" hbank="19" lbank="0" prog="112"/>
+ <Patch name="Kelontuk Sid" hbank="20" lbank="0" prog="112"/>
+ <Patch name="Kopyak Op" hbank="21" lbank="0" prog="112"/>
+ <Patch name="Kopyak Mt" hbank="22" lbank="0" prog="112"/>
+ <Patch name="Ceng Ceng" hbank="23" lbank="0" prog="112"/>
+ <Patch name="Reyoung" hbank="24" lbank="0" prog="112"/>
+ <Patch name="Kempur" hbank="25" lbank="0" prog="112"/>
+ <Patch name="Jngl Crash" hbank="32" lbank="0" prog="112"/>
+ <Patch name="Crash Menu" hbank="40" lbank="0" prog="112"/>
+ <Patch name="RideCym Menu" hbank="41" lbank="0" prog="112"/>
+ <Patch name="RideBellMenu" hbank="42" lbank="0" prog="112"/>
+
+ <Patch name="Atarigane" hbank="8" lbank="0" prog="113"/>
+ <Patch name="Tambourine" hbank="16" lbank="0" prog="113"/>
+
+ <Patch name="Island Mlt" hbank="1" lbank="0" prog="114"/>
+
+ <Patch name="Castanets" hbank="8" lbank="0" prog="115"/>
+ <Patch name="Angklung" hbank="16" lbank="0" prog="115"/>
+ <Patch name="Angkl Rhythm" hbank="17" lbank="0" prog="115"/>
+ <Patch name="Finger Snaps" hbank="24" lbank="0" prog="115"/>
+ <Patch name="909 HandClap" hbank="32" lbank="0" prog="115"/>
+ <Patch name="HandClapMenu" hbank="40" lbank="0" prog="115"/>
+
+ <Patch name="Small Taiko" hbank="1" lbank="0" prog="116"/>
+ <Patch name="Concert BD" hbank="8" lbank="0" prog="116"/>
+ <Patch name="ConcertBD Mt" hbank="9" lbank="0" prog="116"/>
+ <Patch name="Jungle BD" hbank="16" lbank="0" prog="116"/>
+ <Patch name="Techno BD" hbank="17" lbank="0" prog="116"/>
+ <Patch name="Bounce" hbank="18" lbank="0" prog="116"/>
+ <Patch name="KendangWadon" hbank="24" lbank="0" prog="116"/>
+ <Patch name="Bebarongan" hbank="25" lbank="0" prog="116"/>
+ <Patch name="Pelegongan" hbank="26" lbank="0" prog="116"/>
+ <Patch name="Dholak 1" hbank="27" lbank="0" prog="116"/>
+ <Patch name="Dholak 2" hbank="28" lbank="0" prog="116"/>
+ <Patch name="Jngl BD Roll" hbank="32" lbank="0" prog="116"/>
+ <Patch name="Kick Menu 1" hbank="40" lbank="0" prog="116"/>
+ <Patch name="Kick Menu 2" hbank="41" lbank="0" prog="116"/>
+ <Patch name="Kick Menu 3" hbank="42" lbank="0" prog="116"/>
+ <Patch name="Kick Menu 4" hbank="43" lbank="0" prog="116"/>
+
+ <Patch name="Real Tom" hbank="1" lbank="0" prog="117"/>
+ <Patch name="Real Tom 2" hbank="2" lbank="0" prog="117"/>
+ <Patch name="Jazz Tom" hbank="3" lbank="0" prog="117"/>
+ <Patch name="Brush Tom" hbank="4" lbank="0" prog="117"/>
+ <Patch name="Melo. Tom 2" hbank="8" lbank="0" prog="117"/>
+ <Patch name="Rock Tom" hbank="9" lbank="0" prog="117"/>
+ <Patch name="Rash SD" hbank="16" lbank="0" prog="117"/>
+ <Patch name="House SD" hbank="17" lbank="0" prog="117"/>
+ <Patch name="Jungle SD" hbank="18" lbank="0" prog="117"/>
+ <Patch name="909 SD" hbank="19" lbank="0" prog="117"/>
+ <Patch name="Jngl SD Roll" hbank="24" lbank="0" prog="117"/>
+ <Patch name="SD Menu 1" hbank="40" lbank="0" prog="117"/>
+ <Patch name="SD Menu 2" hbank="41" lbank="0" prog="117"/>
+ <Patch name="SD Menu 3" hbank="42" lbank="0" prog="117"/>
+ <Patch name="SD Menu 4" hbank="43" lbank="0" prog="117"/>
+ <Patch name="SD Menu 5" hbank="44" lbank="0" prog="117"/>
+
+ <Patch name="808 Tom" hbank="8" lbank="0" prog="118"/>
+ <Patch name="Elec Perc" hbank="9" lbank="0" prog="118"/>
+ <Patch name="Sine Perc." hbank="10" lbank="0" prog="118"/>
+ <Patch name="606 Tom" hbank="11" lbank="0" prog="118"/>
+ <Patch name="909 Tom" hbank="12" lbank="0" prog="118"/>
+ <Patch name="606 Dist.Tom" hbank="13" lbank="0" prog="118"/>
+
+ <Patch name="Reverse Cym2" hbank="1" lbank="0" prog="119"/>
+ <Patch name="Reverse Cym3" hbank="2" lbank="0" prog="119"/>
+ <Patch name="Reverse Cym4" hbank="3" lbank="0" prog="119"/>
+ <Patch name="Rev.Snare 1" hbank="8" lbank="0" prog="119"/>
+ <Patch name="Rev.Snare 2" hbank="9" lbank="0" prog="119"/>
+ <Patch name="Rev.Kick 1" hbank="16" lbank="0" prog="119"/>
+ <Patch name="Rev.ConBD" hbank="17" lbank="0" prog="119"/>
+ <Patch name="Rev.Tom 1" hbank="24" lbank="0" prog="119"/>
+ <Patch name="Rev.Tom 2" hbank="25" lbank="0" prog="119"/>
+ <Patch name="Rev.Tom 3" hbank="26" lbank="0" prog="119"/>
+
+ Patch name="Rev.Tom 4" hbank="27" lbank="0" prog="119"/>
+ <Patch name="Rev.SD Menu1" hbank="40" lbank="0" prog="119"/>
+ <Patch name="Rev.SD Menu2" hbank="41" lbank="0" prog="119"/>
+ <Patch name="Rev.SD Menu3" hbank="42" lbank="0" prog="119"/>
+ <Patch name="Rev.BD Menu1" hbank="43" lbank="0" prog="119"/>
+ <Patch name="Rev.BD Menu2" hbank="44" lbank="0" prog="119"/>
+ <Patch name="Rev.BD Menu3" hbank="45" lbank="0" prog="119"/>
+ <Patch name="Rev.ClapMenu" hbank="46" lbank="0" prog="119"/>
+ </PatchGroup>
+ <PatchGroup name="SFX">
+ <Patch name="Gt.Cut Noise" hbank="1" lbank="0" prog="120"/>
+ <Patch name="String Slap" hbank="2" lbank="0" prog="120"/>
+ <Patch name="Gt.CutNoise2" hbank="3" lbank="0" prog="120"/>
+ <Patch name="Dist.CutNoiz" hbank="4" lbank="0" prog="120"/>
+ <Patch name="Bass Slide" hbank="5" lbank="0" prog="120"/>
+ <Patch name="Pick Scrape" hbank="6" lbank="0" prog="120"/>
+ <Patch name="Gt. FX Menu" hbank="8" lbank="0" prog="120"/>
+ <Patch name="Bartok Pizz." hbank="9" lbank="0" prog="120"/>
+ <Patch name="Guitar Slap" hbank="10" lbank="0" prog="120"/>
+ <Patch name="Chord Stroke" hbank="11" lbank="0" prog="120"/>
+ <Patch name="Biwa Stroke" hbank="12" lbank="0" prog="120"/>
+ <Patch name="Biwa Tremolo" hbank="13" lbank="0" prog="120"/>
+ <Patch name="A.Bs.Nz Menu" hbank="16" lbank="0" prog="120"/>
+ <Patch name="D.Gt.Nz Menu" hbank="17" lbank="0" prog="120"/>
+ <Patch name="E.Gt.NzMenu1" hbank="18" lbank="0" prog="120"/>
+ <Patch name="E.Gt.NzMenu2" hbank="19" lbank="0" prog="120"/>
+ <Patch name="G.StrokeMenu" hbank="20" lbank="0" prog="120"/>
+ <Patch name="Gt.SlideMenu" hbank="21" lbank="0" prog="120"/>
+ <Patch name="A.Bs.Mute Nz" hbank="22" lbank="0" prog="120"/>
+ <Patch name="A.Bs.TouchNz" hbank="23" lbank="0" prog="120"/>
+ <Patch name="A.Bs.AtackNz" hbank="24" lbank="0" prog="120"/>
+ <Patch name="TC Up Nz" hbank="25" lbank="0" prog="120"/>
+ <Patch name="TC DownMt.Nz" hbank="26" lbank="0" prog="120"/>
+ <Patch name="TC UpMt.Nz" hbank="27" lbank="0" prog="120"/>
+ <Patch name="TC Down Nz" hbank="28" lbank="0" prog="120"/>
+ <Patch name="DstGT.Up Nz" hbank="29" lbank="0" prog="120"/>
+ <Patch name="DstGT.DwnNz1" hbank="30" lbank="0" prog="120"/>
+ <Patch name="DstGT.DwnNz2" hbank="31" lbank="0" prog="120"/>
+ <Patch name="DstGT.MuteNz" hbank="32" lbank="0" prog="120"/>
+ <Patch name="Gt.StrokeNz5" hbank="34" lbank="0" prog="120"/>
+ <Patch name="StlGt.SldNz1" hbank="35" lbank="0" prog="120"/>
+ <Patch name="StlGt.SldNz2" hbank="36" lbank="0" prog="120"/>
+ <Patch name="StlGt.SldNz3" hbank="37" lbank="0" prog="120"/>
+ <Patch name="StlGt.SldNz4" hbank="38" lbank="0" prog="120"/>
+ <Patch name="Gt.StrokeNz1" hbank="39" lbank="0" prog="120"/>
+ <Patch name="Gt.StrokeNz2" hbank="40" lbank="0" prog="120"/>
+ <Patch name="Gt.StrokeNz3" hbank="41" lbank="0" prog="120"/>
+ <Patch name="Gt.StrokeNz4" hbank="42" lbank="0" prog="120"/>
+
+ <Patch name="Fl.Key Click" hbank="1" lbank="0" prog="121"/>
+ <Patch name="Brth Nz Menu" hbank="2" lbank="0" prog="121"/>
+ <Patch name="Fl.Breath 1" hbank="3" lbank="0" prog="121"/>
+ <Patch name="Fl.Breath 2" hbank="4" lbank="0" prog="121"/>
+ <Patch name="Fl.Breath 3" hbank="5" lbank="0" prog="121"/>
+ <Patch name="Vox Breath 1" hbank="6" lbank="0" prog="121"/>
+ <Patch name="Vox Breath 2" hbank="7" lbank="0" prog="121"/>
+ <Patch name="Trombone Nz" hbank="8" lbank="0" prog="121"/>
+ <Patch name="Trumpet Nz" hbank="9" lbank="0" prog="121"/>
+
+ <Patch name="Rain" hbank="1" lbank="0" prog="122"/>
+ <Patch name="Thunder" hbank="2" lbank="0" prog="122"/>
+ <Patch name="Wind" hbank="3" lbank="0" prog="122"/>
+ <Patch name="Stream" hbank="4" lbank="0" prog="122"/>
+ <Patch name="Bubble" hbank="5" lbank="0" prog="122"/>
+ <Patch name="Wind 2" hbank="6" lbank="0" prog="122"/>
+ <Patch name="Cricket" hbank="7" lbank="0" prog="122"/>
+ <Patch name="Pink Noise" hbank="16" lbank="0" prog="122"/>
+ <Patch name="White Noise" hbank="17" lbank="0" prog="122"/>
+
+ <Patch name="Dog" hbank="1" lbank="0" prog="123"/>
+ <Patch name="Horse-Gallop" hbank="2" lbank="0" prog="123"/>
+ <Patch name="Bird 2" hbank="3" lbank="0" prog="123"/>
+ <Patch name="Kitty" hbank="4" lbank="0" prog="123"/>
+ <Patch name="Growl" hbank="5" lbank="0" prog="123"/>
+ <Patch name="Growl 2" hbank="6" lbank="0" prog="123"/>
+ <Patch name="Fancy Animal" hbank="7" lbank="0" prog="123"/>
+ <Patch name="Seal" hbank="8" lbank="0" prog="123"/>
+
+ <Patch name="Telephone 2" hbank="1" lbank="0" prog="124"/>
+ <Patch name="DoorCreaking" hbank="2" lbank="0" prog="124"/>
+ <Patch name="Door" hbank="3" lbank="0" prog="124"/>
+ <Patch name="Scratch" hbank="4" lbank="0" prog="124"/>
+ <Patch name="Wind Chimes" hbank="5" lbank="0" prog="124"/>
+ <Patch name="Scratch 2" hbank="7" lbank="0" prog="124"/>
+ <Patch name="ScratchKey" hbank="8" lbank="0" prog="124"/>
+ <Patch name="TapeRewind" hbank="9" lbank="0" prog="124"/>
+ <Patch name="Phono Noise" hbank="10" lbank="0" prog="124"/>
+ <Patch name="MC-500 Beep" hbank="11" lbank="0" prog="124"/>
+ <Patch name="Scratch 3" hbank="12" lbank="0" prog="124"/>
+ <Patch name="Scratch 4" hbank="13" lbank="0" prog="124"/>
+ <Patch name="Scratch 5" hbank="14" lbank="0" prog="124"/>
+ <Patch name="Scratch 6" hbank="15" lbank="0" prog="124"/>
+ <Patch name="Scratch 7" hbank="16" lbank="0" prog="124"/>
+
+ <Patch name="Car-Engine" hbank="1" lbank="0" prog="125"/>
+ <Patch name="Car-Stop" hbank="2" lbank="0" prog="125"/>
+ <Patch name="Car-Pass" hbank="3" lbank="0" prog="125"/>
+ <Patch name="Car-Crash" hbank="4" lbank="0" prog="125"/>
+ <Patch name="Siren" hbank="5" lbank="0" prog="125"/>
+ <Patch name="Train" hbank="6" lbank="0" prog="125"/>
+ <Patch name="Jetplane" hbank="7" lbank="0" prog="125"/>
+ <Patch name="Starship" hbank="8" lbank="0" prog="125"/>
+ <Patch name="Burst Noise" hbank="9" lbank="0" prog="125"/>
+ <Patch name="Calculating" hbank="10" lbank="0" prog="125"/>
+ <Patch name="Perc. Bang" hbank="11" lbank="0" prog="125"/>
+ <Patch name="Burner" hbank="12" lbank="0" prog="125"/>
+ <Patch name="Glass + Glam" hbank="13" lbank="0" prog="125"/>
+ <Patch name="Ice Ring" hbank="14" lbank="0" prog="125"/>
+ <Patch name="Over Blow" hbank="15" lbank="0" prog="125"/>
+ <Patch name="Crack Bottle" hbank="16" lbank="0" prog="125"/>
+ <Patch name="Pour Bottle" hbank="17" lbank="0" prog="125"/>
+ <Patch name="Soda" hbank="18" lbank="0" prog="125"/>
+ <Patch name="Open CD Tray" hbank="19" lbank="0" prog="125"/>
+ <Patch name="Audio Switch" hbank="20" lbank="0" prog="125"/>
+ <Patch name="Key Typing" hbank="21" lbank="0" prog="125"/>
+ <Patch name="SL 1" hbank="22" lbank="0" prog="125"/>
+ <Patch name="SL 2" hbank="23" lbank="0" prog="125"/>
+ <Patch name="Car Engine 2" hbank="24" lbank="0" prog="125"/>
+ <Patch name="Car Horn" hbank="25" lbank="0" prog="125"/>
+ <Patch name="Boeeeen" hbank="26" lbank="0" prog="125"/>
+ <Patch name="R.Crossing" hbank="27" lbank="0" prog="125"/>
+ <Patch name="Compresser" hbank="28" lbank="0" prog="125"/>
+ <Patch name="Sword Boom!" hbank="29" lbank="0" prog="125"/>
+ <Patch name="Sword Cross" hbank="30" lbank="0" prog="125"/>
+ <Patch name="Stab! 1" hbank="31" lbank="0" prog="125"/>
+ <Patch name="Stab! 2" hbank="32" lbank="0" prog="125"/>
+
+ <Patch name="Laughing" hbank="1" lbank="0" prog="126"/>
+ <Patch name="Screaming" hbank="2" lbank="0" prog="126"/>
+ <Patch name="Punch" hbank="3" lbank="0" prog="126"/>
+ <Patch name="Heart Beat" hbank="4" lbank="0" prog="126"/>
+ <Patch name="Footsteps" hbank="5" lbank="0" prog="126"/>
+ <Patch name="Applause 2" hbank="6" lbank="0" prog="126"/>
+ <Patch name="Small Club" hbank="7" lbank="0" prog="126"/>
+ <Patch name="ApplauseWave" hbank="8" lbank="0" prog="126"/>
+ <Patch name="BabyLaughing" hbank="9" lbank="0" prog="126"/>
+ <Patch name="Voice One" hbank="16" lbank="0" prog="126"/>
+ <Patch name="Voice Two" hbank="17" lbank="0" prog="126"/>
+ <Patch name="Voice Three" hbank="18" lbank="0" prog="126"/>
+ <Patch name="Voice Tah" hbank="19" lbank="0" prog="126"/>
+ <Patch name="Voice Whey" hbank="20" lbank="0" prog="126"/>
+ <Patch name="Voice Kikit" hbank="22" lbank="0" prog="126"/>
+ <Patch name="Voice ComeOn" hbank="23" lbank="0" prog="126"/>
+ <Patch name="Voice Aou" hbank="24" lbank="0" prog="126"/>
+ <Patch name="Voice Oou" hbank="25" lbank="0" prog="126"/>
+ <Patch name="Voice Hie" hbank="26" lbank="0" prog="126"/>
+
+ <Patch name="Machine Gun" hbank="1" lbank="0" prog="127"/>
+ <Patch name="Lasergun" hbank="2" lbank="0" prog="127"/>
+ <Patch name="Explosion" hbank="3" lbank="0" prog="127"/>
+ <Patch name="Eruption" hbank="4" lbank="0" prog="127"/>
+ <Patch name="Big Shot" hbank="5" lbank="0" prog="127"/>
+ <Patch name="Explosion 2" hbank="6" lbank="0" prog="127"/>
+
+ </PatchGroup>
+ <PatchGroup name="Drums">
+ <Patch name="Standard 1" hbank="1" lbank="0" prog="0"/>
+ <Patch name="Standard 2" hbank="1" lbank="0" prog="1"/>
+ <Patch name="Standard L/R" hbank="1" lbank="0" prog="2"/>
+ <Patch name="Room" hbank="1" lbank="0" prog="8"/>
+ <Patch name="Hip Hop" hbank="1" lbank="0" prog="9"/>
+ <Patch name="Jungle" hbank="1" lbank="0" prog="10"/>
+ <Patch name="Techno" hbank="1" lbank="0" prog="11"/>
+ <Patch name="Room L/R" hbank="1" lbank="0" prog="12"/>
+ <Patch name="House" hbank="1" lbank="0" prog="12"/>
+ <Patch name="Power" hbank="1" lbank="0" prog="16"/>
+ <Patch name="Electronic" hbank="1" lbank="0" prog="24"/>
+ <Patch name="TR 808" hbank="1" lbank="0" prog="25"/>
+ <Patch name="Dance" hbank="1" lbank="0" prog="26"/>
+ <Patch name="CR-78" hbank="1" lbank="0" prog="27"/>
+ <Patch name="TR 606" hbank="1" lbank="0" prog="28"/>
+ <Patch name="TR 707" hbank="1" lbank="0" prog="29"/>
+ <Patch name="TR 909" hbank="1" lbank="0" prog="30"/>
+ <Patch name="Jazz" hbank="1" lbank="0" prog="32"/>
+ <Patch name="Jazz L/R" hbank="1" lbank="0" prog="33"/>
+ <Patch name="Brush" hbank="1" lbank="0" prog="40"/>
+ <Patch name="Brush 2" hbank="1" lbank="0" prog="41"/>
+ <Patch name="Brush 2 L/R" hbank="1" lbank="0" prog="42"/>
+ <Patch name="Orchestra" hbank="1" lbank="0" prog="48"/>
+ <Patch name="Ethnic" hbank="1" lbank="0" prog="49"/>
+ <Patch name="Kick + Snare" hbank="1" lbank="0" prog="50"/>
+ <Patch name="Kick + Snare 2" hbank="1" lbank="0" prog="51"/>
+ <Patch name="Asia" hbank="1" lbank="0" prog="52"/>
+ <Patch name="Cymbals + Claps" hbank="1" lbank="0" prog="53"/>
+ <Patch name="Gamelan 1" hbank="1" lbank="0" prog="54"/>
+ <Patch name="Gamelan 2" hbank="1" lbank="0" prog="55"/>
+ <Patch name="SFX" hbank="1" lbank="0" prog="56"/>
+ <Patch name="Rhythm FX" hbank="1" lbank="0" prog="57"/>
+ <Patch name="Rhythm FX 2" hbank="1" lbank="0" prog="58"/>
+ <Patch name="Rhythm FX 3" hbank="1" lbank="0" prog="59"/>
+ <Patch name="SFX 2" hbank="1" lbank="0" prog="60"/>
+ <Patch name="Voice" hbank="1" lbank="0" prog="61"/>
+ <Patch name="Cym+Claps 2" hbank="1" lbank="0" prog="62"/>
+ </PatchGroup>
+
+ <!-- Controller -->
+ <Controller name="Pitch" type="Pitch" />
+ <Controller name="Program" type="Program" />
+
+ <Controller name="Modulation" type="Control" l="1" />
+ <Controller name="PortamentoTime" type="Control" l="5" />
+ <Controller name="MainVolume" type="Control" l="7" />
+ <Controller name="Pan" type="Control" l="10" />
+ <Controller name="Expression" type="Control" l="11" />
+ <Controller name="GenPurpose1" type="Control" l="16" />
+ <Controller name="GenPurpose2" type="Control" l="17" />
+ <Controller name="GenPurpose3" type="Control" l="18" />
+ <Controller name="GenPurpose4" type="Control" l="19" />
+ <Controller name="Sustain" type="Control" l="64" />
+ <Controller name="Portamento" type="Control" l="65" />
+ <Controller name="Sostenuto" type="Control" l="66" />
+ <Controller name="SoftPedal" type="Control" l="67" />
+ <Controller name="Resonance" type="Control" l="71" />
+ <Controller name="ReleaseTime" type="Control" l="72" />
+ <Controller name="AttackTime" type="Control" l="73" />
+ <Controller name="Cutoff" type="Control" l="74" />
+ <Controller name="DecayTime" type="Control" l="75" />
+ <Controller name="VibratoRate" type="Control" l="76" />
+ <Controller name="VibratoDepth" type="Control" l="77" />
+ <Controller name="VibratoDelay" type="Control" l="78" />
+ <Controller name="PortamentoControl" type="Control" l="84" />
+ <Controller name="ReverbSend" type="Control" l="91" />
+ <Controller name="ChorusSend" type="Control" l="93" />
+ <Controller name="DelaySend" type="Control" l="94" />
+ <Controller name="AllSoundsOff" type="Control" l="120" />
+ <Controller name="ResetAllController" type="Control" l="121" />
+ <Controller name="AllNotesOff" type="Control" l="123" />
+
+ <!-- RPN's -->
+ <Controller name="PitchBendSensitivity" type="RPN" l="0" min="0" max="0x18" init="2" />
+ <Controller name="FineTuning" type="RPN" l="1" min="-64" max="64" init="2" />
+
+ <!-- NPN's -->
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/Roland-XP30.idf b/muse/share/instruments/Roland-XP30.idf
new file mode 100644
index 00000000..0b5969ab
--- /dev/null
+++ b/muse/share/instruments/Roland-XP30.idf
@@ -0,0 +1,1592 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Roland XP-30">
+ <Init>
+ </Init>
+ <PatchGroup name="GM">
+ <Patch name="Acoustic Grand Piano" hbank="81" lbank="3" prog="0"/>
+ <Patch name="Bright Acoustic Piano" hbank="81" lbank="3" prog="1"/>
+ <Patch name="Electric Grand Piano" hbank="81" lbank="3" prog="2"/>
+ <Patch name="Honky-tonk Piano" hbank="81" lbank="3" prog="3"/>
+ <Patch name="Electric Piano 1" hbank="81" lbank="3" prog="4"/>
+ <Patch name="Electric Piano 2" hbank="81" lbank="3" prog="5"/>
+ <Patch name="Harpsichord" hbank="81" lbank="3" prog="6"/>
+ <Patch name="Clavi" hbank="81" lbank="3" prog="7"/>
+ <Patch name="Celesta" hbank="81" lbank="3" prog="8"/>
+ <Patch name="Glockenspiel" hbank="81" lbank="3" prog="9"/>
+ <Patch name="Music Box" hbank="81" lbank="3" prog="10"/>
+ <Patch name="Vibraphone" hbank="81" lbank="3" prog="11"/>
+ <Patch name="Marimba" hbank="81" lbank="3" prog="12"/>
+ <Patch name="Xylophone" hbank="81" lbank="3" prog="13"/>
+ <Patch name="Tubular Bells" hbank="81" lbank="3" prog="14"/>
+ <Patch name="Dulcimer" hbank="81" lbank="3" prog="15"/>
+ <Patch name="Drawbar Organ" hbank="81" lbank="3" prog="16"/>
+ <Patch name="Percussive Organ" hbank="81" lbank="3" prog="17"/>
+ <Patch name="Rock Organ" hbank="81" lbank="3" prog="18"/>
+ <Patch name="Church Organ" hbank="81" lbank="3" prog="19"/>
+ <Patch name="Reed Organ" hbank="81" lbank="3" prog="20"/>
+ <Patch name="Accordion" hbank="81" lbank="3" prog="21"/>
+ <Patch name="Harmonica" hbank="81" lbank="3" prog="22"/>
+ <Patch name="Tango Accordion" hbank="81" lbank="3" prog="23"/>
+ <Patch name="Acoustic Guitar (nylon)" hbank="81" lbank="3" prog="24"/>
+ <Patch name="Acoustic Guitar (steel)" hbank="81" lbank="3" prog="25"/>
+ <Patch name="Electric Guitar (jazz)" hbank="81" lbank="3" prog="26"/>
+ <Patch name="Electric Guitar (clean)" hbank="81" lbank="3" prog="27"/>
+ <Patch name="Electric Guitar (muted)" hbank="81" lbank="3" prog="28"/>
+ <Patch name="Overdriven Guitar" hbank="81" lbank="3" prog="29"/>
+ <Patch name="Distortion Guitar" hbank="81" lbank="3" prog="30"/>
+ <Patch name="Guitar Harmonics" hbank="81" lbank="3" prog="31"/>
+ <Patch name="Acoustic Bass" hbank="81" lbank="3" prog="32"/>
+ <Patch name="Electric Bass (finger)" hbank="81" lbank="3" prog="33"/>
+ <Patch name="Electric Bass (pick)" hbank="81" lbank="3" prog="34"/>
+ <Patch name="Fretless Bass" hbank="81" lbank="3" prog="35"/>
+ <Patch name="Slap Bass 1" hbank="81" lbank="3" prog="36"/>
+ <Patch name="Slap Bass 2" hbank="81" lbank="3" prog="37"/>
+ <Patch name="Synth Bass 1" hbank="81" lbank="3" prog="38"/>
+ <Patch name="Synth Bass 2" hbank="81" lbank="3" prog="39"/>
+ <Patch name="Violin" hbank="81" lbank="3" prog="40"/>
+ <Patch name="Viola" hbank="81" lbank="3" prog="41"/>
+ <Patch name="Cello" hbank="81" lbank="3" prog="42"/>
+ <Patch name="Contrabass" hbank="81" lbank="3" prog="43"/>
+ <Patch name="Tremolo Strings" hbank="81" lbank="3" prog="44"/>
+ <Patch name="Pizzicato Strings" hbank="81" lbank="3" prog="45"/>
+ <Patch name="Orchestral Harp" hbank="81" lbank="3" prog="46"/>
+ <Patch name="Timpani" hbank="81" lbank="3" prog="47"/>
+ <Patch name="String Ensemble 1" hbank="81" lbank="3" prog="48"/>
+ <Patch name="String Ensemble 2" hbank="81" lbank="3" prog="49"/>
+ <Patch name="Synth Strings 1" hbank="81" lbank="3" prog="50"/>
+ <Patch name="Synth Strings 2" hbank="81" lbank="3" prog="51"/>
+ <Patch name="Choir Aahs" hbank="81" lbank="3" prog="52"/>
+ <Patch name="Voice Oohs" hbank="81" lbank="3" prog="53"/>
+ <Patch name="Synth Voice" hbank="81" lbank="3" prog="54"/>
+ <Patch name="Orchestra Hit" hbank="81" lbank="3" prog="55"/>
+ <Patch name="Trumpet" hbank="81" lbank="3" prog="56"/>
+ <Patch name="Trombone" hbank="81" lbank="3" prog="57"/>
+ <Patch name="Tuba" hbank="81" lbank="3" prog="58"/>
+ <Patch name="Muted Trumpet" hbank="81" lbank="3" prog="59"/>
+ <Patch name="French Horn" hbank="81" lbank="3" prog="60"/>
+ <Patch name="Brass Section" hbank="81" lbank="3" prog="61"/>
+ <Patch name="SynthBrass 1" hbank="81" lbank="3" prog="62"/>
+ <Patch name="SynthBrass 2" hbank="81" lbank="3" prog="63"/>
+ <Patch name="Soprano Sax" hbank="81" lbank="3" prog="64"/>
+ <Patch name="Alto Sax" hbank="81" lbank="3" prog="65"/>
+ <Patch name="Tenor Sax" hbank="81" lbank="3" prog="66"/>
+ <Patch name="Baritone Sax" hbank="81" lbank="3" prog="67"/>
+ <Patch name="Oboe" hbank="81" lbank="3" prog="68"/>
+ <Patch name="English Horn" hbank="81" lbank="3" prog="69"/>
+ <Patch name="Bassoon" hbank="81" lbank="3" prog="70"/>
+ <Patch name="Clarinet" hbank="81" lbank="3" prog="71"/>
+ <Patch name="Piccolo" hbank="81" lbank="3" prog="72"/>
+ <Patch name="Flute" hbank="81" lbank="3" prog="73"/>
+ <Patch name="Recorder" hbank="81" lbank="3" prog="74"/>
+ <Patch name="Pan Flute" hbank="81" lbank="3" prog="75"/>
+ <Patch name="Blown Bottle" hbank="81" lbank="3" prog="76"/>
+ <Patch name="Shakuhachi" hbank="81" lbank="3" prog="77"/>
+ <Patch name="Whistle" hbank="81" lbank="3" prog="78"/>
+ <Patch name="Ocarina" hbank="81" lbank="3" prog="79"/>
+ <Patch name="Lead 1 (square)" hbank="81" lbank="3" prog="80"/>
+ <Patch name="Lead 2 (sawtooth)" hbank="81" lbank="3" prog="81"/>
+ <Patch name="Lead 3 (calliope)" hbank="81" lbank="3" prog="82"/>
+ <Patch name="Lead 4 (chiff)" hbank="81" lbank="3" prog="83"/>
+ <Patch name="Lead 5 (charang)" hbank="81" lbank="3" prog="84"/>
+ <Patch name="Lead 6 (voice)" hbank="81" lbank="3" prog="85"/>
+ <Patch name="Lead 7 (fifths)" hbank="81" lbank="3" prog="86"/>
+ <Patch name="Lead 8 (bass + lead)" hbank="81" lbank="3" prog="87"/>
+ <Patch name="Pad 1 (new age)" hbank="81" lbank="3" prog="88"/>
+ <Patch name="Pad 2 (warm)" hbank="81" lbank="3" prog="89"/>
+ <Patch name="Pad 3 (polysynth)" hbank="81" lbank="3" prog="90"/>
+ <Patch name="Pad 4 (choir)" hbank="81" lbank="3" prog="91"/>
+ <Patch name="Pad 5 (bowed)" hbank="81" lbank="3" prog="92"/>
+ <Patch name="Pad 6 (metallic)" hbank="81" lbank="3" prog="93"/>
+ <Patch name="Pad 7 (halo)" hbank="81" lbank="3" prog="94"/>
+ <Patch name="Pad 8 (sweep)" hbank="81" lbank="3" prog="95"/>
+ <Patch name="FX 1 (rain)" hbank="81" lbank="3" prog="96"/>
+ <Patch name="FX 2 (Soundtrack)" hbank="81" lbank="3" prog="97"/>
+ <Patch name="FX 3 (crystal)" hbank="81" lbank="3" prog="98"/>
+ <Patch name="FX 4 (atmosphere)" hbank="81" lbank="3" prog="99"/>
+ <Patch name="FX 5 (brightness)" hbank="81" lbank="3" prog="100"/>
+ <Patch name="FX 6 (goblins)" hbank="81" lbank="3" prog="101"/>
+ <Patch name="FX 7 (echoes)" hbank="81" lbank="3" prog="102"/>
+ <Patch name="FX 8 (sci-fi)" hbank="81" lbank="3" prog="103"/>
+ <Patch name="Sitar" hbank="81" lbank="3" prog="104"/>
+ <Patch name="Banjo" hbank="81" lbank="3" prog="105"/>
+ <Patch name="Shamisen" hbank="81" lbank="3" prog="106"/>
+ <Patch name="Koto" hbank="81" lbank="3" prog="107"/>
+ <Patch name="Kalimba" hbank="81" lbank="3" prog="108"/>
+ <Patch name="Bag pipe" hbank="81" lbank="3" prog="109"/>
+ <Patch name="Fiddle" hbank="81" lbank="3" prog="110"/>
+ <Patch name="Shanai" hbank="81" lbank="3" prog="111"/>
+ <Patch name="Tinkle Bell" hbank="81" lbank="3" prog="112"/>
+ <Patch name="Agogo" hbank="81" lbank="3" prog="113"/>
+ <Patch name="Steel Drums" hbank="81" lbank="3" prog="114"/>
+ <Patch name="Woodblock" hbank="81" lbank="3" prog="115"/>
+ <Patch name="Taiko Drum" hbank="81" lbank="3" prog="116"/>
+ <Patch name="Melodic Tom" hbank="81" lbank="3" prog="117"/>
+ <Patch name="Synth Drum" hbank="81" lbank="3" prog="118"/>
+ <Patch name="Reverse Cymbal" hbank="81" lbank="3" prog="119"/>
+ <Patch name="Guitar Fret Noise" hbank="81" lbank="3" prog="120"/>
+ <Patch name="Breath Noise" hbank="81" lbank="3" prog="121"/>
+ <Patch name="Seashore" hbank="81" lbank="3" prog="122"/>
+ <Patch name="Bird Tweet" hbank="81" lbank="3" prog="123"/>
+ <Patch name="Telephone Ring" hbank="81" lbank="3" prog="124"/>
+ <Patch name="Helicopter" hbank="81" lbank="3" prog="125"/>
+ <Patch name="Applause" hbank="81" lbank="3" prog="126"/>
+ <Patch name="Gunshot" hbank="81" lbank="3" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="User">
+ <Patch name="Temple of XP" hbank="80" lbank="0" prog="0"/>
+ <Patch name="Power Split" hbank="80" lbank="0" prog="1"/>
+ <Patch name="Symphonique 2" hbank="80" lbank="0" prog="2"/>
+ <Patch name="Robot Voice" hbank="80" lbank="0" prog="3"/>
+ <Patch name="St. Concert" hbank="80" lbank="0" prog="4"/>
+ <Patch name="ViennaStrgs 2" hbank="80" lbank="0" prog="5"/>
+ <Patch name="R&amp;R Brass" hbank="80" lbank="0" prog="6"/>
+ <Patch name="Disto Stack" hbank="80" lbank="0" prog="7"/>
+ <Patch name="Tone Wh. Solo" hbank="80" lbank="0" prog="8"/>
+ <Patch name="Combing Slow" hbank="80" lbank="0" prog="9"/>
+ <Patch name="SessionNyln 2" hbank="80" lbank="0" prog="10"/>
+ <Patch name="Celestial 2" hbank="80" lbank="0" prog="11"/>
+ <Patch name="Poly Brs" hbank="80" lbank="0" prog="12"/>
+ <Patch name="DanceStack 1" hbank="80" lbank="0" prog="13"/>
+ <Patch name="303 Ow Bass" hbank="80" lbank="0" prog="14"/>
+ <Patch name="Flying Waltz" hbank="80" lbank="0" prog="15"/>
+ <Patch name="Silky Way" hbank="80" lbank="0" prog="16"/>
+ <Patch name="Simply June" hbank="80" lbank="0" prog="17"/>
+ <Patch name="Solo Vln 1 /" hbank="80" lbank="0" prog="18"/>
+ <Patch name="Super Tenor" hbank="80" lbank="0" prog="19"/>
+ <Patch name="Metal Solo" hbank="80" lbank="0" prog="20"/>
+ <Patch name="Creator" hbank="80" lbank="0" prog="21"/>
+ <Patch name="Amsterdamer" hbank="80" lbank="0" prog="22"/>
+ <Patch name="echno Pizz" hbank="80" lbank="0" prog="23"/>
+ <Patch name="SA Rhodes 3" hbank="80" lbank="0" prog="24"/>
+ <Patch name="Dim Hit 1" hbank="80" lbank="0" prog="25"/>
+ <Patch name="Pan Pipes" hbank="80" lbank="0" prog="26"/>
+ <Patch name="JP-8 Str 1" hbank="80" lbank="0" prog="27"/>
+ <Patch name="Pretty Bells" hbank="80" lbank="0" prog="28"/>
+ <Patch name="Aurora" hbank="80" lbank="0" prog="29"/>
+ <Patch name="Breathy Humz" hbank="80" lbank="0" prog="30"/>
+ <Patch name="Full Orch. 2" hbank="80" lbank="0" prog="31"/>
+ <Patch name="Clean Tele" hbank="80" lbank="0" prog="32"/>
+ <Patch name="Dunes" hbank="80" lbank="0" prog="33"/>
+ <Patch name="Cyber-Trance" hbank="80" lbank="0" prog="34"/>
+ <Patch name="RiversOfTime" hbank="80" lbank="0" prog="35"/>
+ <Patch name="F. Hrn Sect 5/" hbank="80" lbank="0" prog="36"/>
+ <Patch name="DearmVoices 2" hbank="80" lbank="0" prog="37"/>
+ <Patch name="HeavenlyPad" hbank="80" lbank="0" prog="38"/>
+ <Patch name="Sop. Sax mf" hbank="80" lbank="0" prog="39"/>
+ <Patch name="Sweep Clav 2" hbank="80" lbank="0" prog="40"/>
+ <Patch name="Cold JX" hbank="80" lbank="0" prog="41"/>
+ <Patch name="Solo Vc 1 /" hbank="80" lbank="0" prog="42"/>
+ <Patch name="RichStrings 2" hbank="80" lbank="0" prog="43"/>
+ <Patch name="Techno Dream" hbank="80" lbank="0" prog="44"/>
+ <Patch name="StateXLChord" hbank="80" lbank="0" prog="45"/>
+ <Patch name="Delicate EP" hbank="80" lbank="0" prog="46"/>
+ <Patch name="Bassic Needs" hbank="80" lbank="0" prog="47"/>
+ <Patch name="Perky B" hbank="80" lbank="0" prog="48"/>
+ <Patch name="SquareLead 2" hbank="80" lbank="0" prog="49"/>
+ <Patch name="Earth Blow" hbank="80" lbank="0" prog="50"/>
+ <Patch name="BassMarimba 1" hbank="80" lbank="0" prog="51"/>
+ <Patch name="Morning Lite" hbank="80" lbank="0" prog="52"/>
+ <Patch name="Raggatronic" hbank="80" lbank="0" prog="53"/>
+ <Patch name="Brass ff 1" hbank="80" lbank="0" prog="54"/>
+ <Patch name="Acc. de Paris" hbank="80" lbank="0" prog="55"/>
+ <Patch name="Oboe 1" hbank="80" lbank="0" prog="56"/>
+ <Patch name="Velo Power" hbank="80" lbank="0" prog="57"/>
+ <Patch name="Vintage Call" hbank="80" lbank="0" prog="58"/>
+ <Patch name="Steel Away" hbank="80" lbank="0" prog="59"/>
+ <Patch name="Spectrum Mod" hbank="80" lbank="0" prog="60"/>
+ <Patch name="Raverborg" hbank="80" lbank="0" prog="61"/>
+ <Patch name="Poly Saws" hbank="80" lbank="0" prog="62"/>
+ <Patch name="Adrenaline" hbank="80" lbank="0" prog="63"/>
+ <Patch name="Heirborne" hbank="80" lbank="0" prog="64"/>
+ <Patch name="Trumpet" hbank="80" lbank="0" prog="65"/>
+ <Patch name="Glistening" hbank="80" lbank="0" prog="66"/>
+ <Patch name="Banded Jupe" hbank="80" lbank="0" prog="67"/>
+ <Patch name="Singing' Mini" hbank="80" lbank="0" prog="68"/>
+ <Patch name="Chamber Ens 2" hbank="80" lbank="0" prog="69"/>
+ <Patch name="DanceStack 5" hbank="80" lbank="0" prog="70"/>
+ <Patch name="SA Rhodes 4" hbank="80" lbank="0" prog="71"/>
+ <Patch name="Breathy Brs" hbank="80" lbank="0" prog="72"/>
+ <Patch name="Atmos Harp" hbank="80" lbank="0" prog="73"/>
+ <Patch name="303 Brass" hbank="80" lbank="0" prog="74"/>
+ <Patch name="Flute" hbank="80" lbank="0" prog="75"/>
+ <Patch name="Perc Hit 2 /" hbank="80" lbank="0" prog="76"/>
+ <Patch name="Oldies Organ" hbank="80" lbank="0" prog="77"/>
+ <Patch name="Dulcimer" hbank="80" lbank="0" prog="78"/>
+ <Patch name="Warmer Pad 2" hbank="80" lbank="0" prog="79"/>
+ <Patch name="ARPsychea" hbank="80" lbank="0" prog="80"/>
+ <Patch name="Choir 1" hbank="80" lbank="0" prog="81"/>
+ <Patch name="Agitato Str 2" hbank="80" lbank="0" prog="82"/>
+ <Patch name="Pure Tibet" hbank="80" lbank="0" prog="83"/>
+ <Patch name="Flugelhorn 1" hbank="80" lbank="0" prog="84"/>
+ <Patch name="D-50 Stack" hbank="80" lbank="0" prog="85"/>
+ <Patch name="Noiz Mania" hbank="80" lbank="0" prog="86"/>
+ <Patch name="Slap Bass 2" hbank="80" lbank="0" prog="87"/>
+ <Patch name="Amazing Echo" hbank="80" lbank="0" prog="88"/>
+ <Patch name="Moving Glass" hbank="80" lbank="0" prog="89"/>
+ <Patch name="BluesHarp" hbank="80" lbank="0" prog="90"/>
+ <Patch name="Tria Bells" hbank="80" lbank="0" prog="91"/>
+ <Patch name="Dirty Organ 2" hbank="80" lbank="0" prog="92"/>
+ <Patch name="Dawn 2 Dusk" hbank="80" lbank="0" prog="93"/>
+ <Patch name="Just Lovely" hbank="80" lbank="0" prog="94"/>
+ <Patch name="SquareKeys 2" hbank="80" lbank="0" prog="95"/>
+ <Patch name="Natural Vlns" hbank="80" lbank="0" prog="96"/>
+ <Patch name="Arasian Morn" hbank="80" lbank="0" prog="97"/>
+ <Patch name="Euro-Dance 2" hbank="80" lbank="0" prog="98"/>
+ <Patch name="5th Pad" hbank="80" lbank="0" prog="99"/>
+ <Patch name="Liquid Sky" hbank="80" lbank="0" prog="100"/>
+ <Patch name="Sci-Fi Bells" hbank="80" lbank="0" prog="101"/>
+ <Patch name="Nomad Perc" hbank="80" lbank="0" prog="102"/>
+ <Patch name="Orn. Recorder" hbank="80" lbank="0" prog="103"/>
+ <Patch name="FXM Saw Lead" hbank="80" lbank="0" prog="104"/>
+ <Patch name="Atlantis 2" hbank="80" lbank="0" prog="105"/>
+ <Patch name="Taj Mahal" hbank="80" lbank="0" prog="106"/>
+ <Patch name="X-Hale" hbank="80" lbank="0" prog="107"/>
+ <Patch name="Stacc. Heaven" hbank="80" lbank="0" prog="108"/>
+ <Patch name="Altamira" hbank="80" lbank="0" prog="109"/>
+ <Patch name="Hit House" hbank="80" lbank="0" prog="110"/>
+ <Patch name="Solo F. Horn 1" hbank="80" lbank="0" prog="111"/>
+ <Patch name="Celesta 1" hbank="80" lbank="0" prog="112"/>
+ <Patch name="ORBit Pad" hbank="80" lbank="0" prog="113"/>
+ <Patch name="SessionBrass" hbank="80" lbank="0" prog="114"/>
+ <Patch name="Sugar Bell" hbank="80" lbank="0" prog="115"/>
+ <Patch name="ChristmasFlt" hbank="80" lbank="0" prog="116"/>
+ <Patch name="Strobe Mode" hbank="80" lbank="0" prog="117"/>
+ <Patch name="Cave" hbank="80" lbank="0" prog="118"/>
+ <Patch name="TenorExprss 2" hbank="80" lbank="0" prog="119"/>
+ <Patch name="Impact" hbank="80" lbank="0" prog="120"/>
+ <Patch name="X-Tronic Jam" hbank="80" lbank="0" prog="121"/>
+ <Patch name="WarmViolins 2" hbank="80" lbank="0" prog="122"/>
+ <Patch name="Rain Forest" hbank="80" lbank="0" prog="123"/>
+ <Patch name="Brass Ens 4" hbank="80" lbank="0" prog="124"/>
+ <Patch name="Perelandra" hbank="80" lbank="0" prog="125"/>
+ <Patch name="Teknoperator" hbank="80" lbank="0" prog="126"/>
+ <Patch name="Crowds" hbank="80" lbank="0" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="PR-A">
+ <Patch name="64 Voice Piano" hbank="81" lbank="0" prog="0"/>
+ <Patch name="Bright Piano" hbank="81" lbank="0" prog="1"/>
+ <Patch name="Classique" hbank="81" lbank="0" prog="2"/>
+ <Patch name="Nice Piano" hbank="81" lbank="0" prog="3"/>
+ <Patch name="Piano Thang" hbank="81" lbank="0" prog="4"/>
+ <Patch name="Power Grand" hbank="81" lbank="0" prog="5"/>
+ <Patch name="House Piano" hbank="81" lbank="0" prog="6"/>
+ <Patch name="Electric Grand" hbank="81" lbank="0" prog="7"/>
+ <Patch name="MIDIed Grand" hbank="81" lbank="0" prog="8"/>
+ <Patch name="Piano Blend" hbank="81" lbank="0" prog="9"/>
+ <Patch name="West Coast" hbank="81" lbank="0" prog="10"/>
+ <Patch name="Piano Strings" hbank="81" lbank="0" prog="11"/>
+ <Patch name="BS/Pno+Brs" hbank="81" lbank="0" prog="12"/>
+ <Patch name="Waterhodes" hbank="81" lbank="0" prog="13"/>
+ <Patch name="S.A.E.P." hbank="81" lbank="0" prog="14"/>
+ <Patch name="SA Rhodes 1" hbank="81" lbank="0" prog="15"/>
+ <Patch name="SA Rhodes 2" hbank="81" lbank="0" prog="16"/>
+ <Patch name="Stiky Rhodes" hbank="81" lbank="0" prog="17"/>
+ <Patch name="Dig Rhodes" hbank="81" lbank="0" prog="18"/>
+ <Patch name="Nylon EPiano" hbank="81" lbank="0" prog="19"/>
+ <Patch name="Nylon Rhodes" hbank="81" lbank="0" prog="20"/>
+ <Patch name="Rhodes Mix" hbank="81" lbank="0" prog="21"/>
+ <Patch name="PsychoRhodes" hbank="81" lbank="0" prog="22"/>
+ <Patch name="Tremo Rhodes" hbank="81" lbank="0" prog="23"/>
+ <Patch name="MK-80 Rhodes" hbank="81" lbank="0" prog="24"/>
+ <Patch name="MK-80 Phaser" hbank="81" lbank="0" prog="25"/>
+ <Patch name="Delicate EP" hbank="81" lbank="0" prog="26"/>
+ <Patch name="Octa Rhodes 1" hbank="81" lbank="0" prog="27"/>
+ <Patch name="Octa Rhodes 2" hbank="81" lbank="0" prog="28"/>
+ <Patch name="JV Rhodes+" hbank="81" lbank="0" prog="29"/>
+ <Patch name="EP+Med Pad" hbank="81" lbank="0" prog="30"/>
+ <Patch name="Mr. Mellow" hbank="81" lbank="0" prog="31"/>
+ <Patch name="Comp Clav" hbank="81" lbank="0" prog="32"/>
+ <Patch name="Klavinet" hbank="81" lbank="0" prog="33"/>
+ <Patch name="Winger Clav" hbank="81" lbank="0" prog="34"/>
+ <Patch name="Phaze Clav 1" hbank="81" lbank="0" prog="35"/>
+ <Patch name="Phaze Clav 2" hbank="81" lbank="0" prog="36"/>
+ <Patch name="Phuzz Clav" hbank="81" lbank="0" prog="37"/>
+ <Patch name="Chorus Clav" hbank="81" lbank="0" prog="38"/>
+ <Patch name="Claviduck" hbank="81" lbank="0" prog="39"/>
+ <Patch name="Velo-Rez Clv" hbank="81" lbank="0" prog="40"/>
+ <Patch name="Clavicembalo" hbank="81" lbank="0" prog="41"/>
+ <Patch name="Analogue 1" hbank="81" lbank="0" prog="42"/>
+ <Patch name="Analogue 2" hbank="81" lbank="0" prog="43"/>
+ <Patch name="Metal Clav" hbank="81" lbank="0" prog="44"/>
+ <Patch name="Full Stops" hbank="81" lbank="0" prog="45"/>
+ <Patch name="Ballad B" hbank="81" lbank="0" prog="46"/>
+ <Patch name="Mellow Bars" hbank="81" lbank="0" prog="47"/>
+ <Patch name="AugerMentive" hbank="81" lbank="0" prog="48"/>
+ <Patch name="Perky B" hbank="81" lbank="0" prog="49"/>
+ <Patch name="The Big Spin" hbank="81" lbank="0" prog="50"/>
+ <Patch name="Gospel Spin" hbank="81" lbank="0" prog="51"/>
+ <Patch name="Roller Spin" hbank="81" lbank="0" prog="52"/>
+ <Patch name="Rocker Spin" hbank="81" lbank="0" prog="53"/>
+ <Patch name="Tone Wh.Solo" hbank="81" lbank="0" prog="54"/>
+ <Patch name="Purple Spin" hbank="81" lbank="0" prog="55"/>
+ <Patch name="60's Lead organ" hbank="81" lbank="0" prog="56"/>
+ <Patch name="Assalt Organ" hbank="81" lbank="0" prog="57"/>
+ <Patch name="D-50 Organ" hbank="81" lbank="0" prog="58"/>
+ <Patch name="Cathedral" hbank="81" lbank="0" prog="59"/>
+ <Patch name="Church Pipes" hbank="81" lbank="0" prog="60"/>
+ <Patch name="Poly Keys" hbank="81" lbank="0" prog="61"/>
+ <Patch name="Poly Saws" hbank="81" lbank="0" prog="62"/>
+ <Patch name="Poly Pulse" hbank="81" lbank="0" prog="63"/>
+ <Patch name="Dual Profs" hbank="81" lbank="0" prog="64"/>
+ <Patch name="Saw Mass" hbank="81" lbank="0" prog="65"/>
+ <Patch name="Poly Split" hbank="81" lbank="0" prog="66"/>
+ <Patch name="Poly Brass" hbank="81" lbank="0" prog="67"/>
+ <Patch name="Stackoid" hbank="81" lbank="0" prog="68"/>
+ <Patch name="Poly Rock" hbank="81" lbank="0" prog="69"/>
+ <Patch name="D-50 Stack" hbank="81" lbank="0" prog="70"/>
+ <Patch name="Fantasia JV" hbank="81" lbank="0" prog="71"/>
+ <Patch name="Jimmee Dee" hbank="81" lbank="0" prog="72"/>
+ <Patch name="Heavenals" hbank="81" lbank="0" prog="73"/>
+ <Patch name="Mallet Pad" hbank="81" lbank="0" prog="74"/>
+ <Patch name="Huff n Stuff" hbank="81" lbank="0" prog="75"/>
+ <Patch name="Puff 1080" hbank="81" lbank="0" prog="76"/>
+ <Patch name="BellVox 1080" hbank="81" lbank="0" prog="77"/>
+ <Patch name="Fantasy Vox" hbank="81" lbank="0" prog="78"/>
+ <Patch name="Square Keys" hbank="81" lbank="0" prog="79"/>
+ <Patch name="Childlike" hbank="81" lbank="0" prog="80"/>
+ <Patch name="Music Box" hbank="81" lbank="0" prog="81"/>
+ <Patch name="Toy Box" hbank="81" lbank="0" prog="82"/>
+ <Patch name="Wave Bells" hbank="81" lbank="0" prog="83"/>
+ <Patch name="Tria Bells" hbank="81" lbank="0" prog="84"/>
+ <Patch name="Beauty Bells" hbank="81" lbank="0" prog="85"/>
+ <Patch name="Music Bells" hbank="81" lbank="0" prog="86"/>
+ <Patch name="Pretty Bells" hbank="81" lbank="0" prog="87"/>
+ <Patch name="Pulse key" hbank="81" lbank="0" prog="88"/>
+ <Patch name="Wide Tubular" hbank="81" lbank="0" prog="89"/>
+ <Patch name="AmbianeVIBE" hbank="81" lbank="0" prog="90"/>
+ <Patch name="Warm Vibes" hbank="81" lbank="0" prog="91"/>
+ <Patch name="Dyna Marimba" hbank="81" lbank="0" prog="92"/>
+ <Patch name="Nomad Perc" hbank="81" lbank="0" prog="94"/>
+ <Patch name="Ethno Metals" hbank="81" lbank="0" prog="95"/>
+ <Patch name="Islands Mlt" hbank="81" lbank="0" prog="96"/>
+ <Patch name="Steelin Keys" hbank="81" lbank="0" prog="97"/>
+ <Patch name="Steel Drums" hbank="81" lbank="0" prog="98"/>
+ <Patch name="Voicey Pizz" hbank="81" lbank="0" prog="99"/>
+ <Patch name="Sitar" hbank="81" lbank="0" prog="100"/>
+ <Patch name="Drone Split" hbank="81" lbank="0" prog="101"/>
+ <Patch name="Ethnopluck" hbank="81" lbank="0" prog="102"/>
+ <Patch name="Jamison" hbank="81" lbank="0" prog="103"/>
+ <Patch name="Dulcimer" hbank="81" lbank="0" prog="104"/>
+ <Patch name="East Melody" hbank="81" lbank="0" prog="105"/>
+ <Patch name="Mandolin Trem" hbank="81" lbank="0" prog="106"/>
+ <Patch name="Nylon Guitar" hbank="81" lbank="0" prog="107"/>
+ <Patch name="Gtr Strings" hbank="81" lbank="0" prog="108"/>
+ <Patch name="Steel Away" hbank="81" lbank="0" prog="109"/>
+ <Patch name="Heavenly Gtr" hbank="81" lbank="0" prog="110"/>
+ <Patch name="12str Gtr 1" hbank="81" lbank="0" prog="111"/>
+ <Patch name="12str Gtr 2" hbank="81" lbank="0" prog="112"/>
+ <Patch name="Jz Gtr Hall" hbank="81" lbank="0" prog="113"/>
+ <Patch name="LetterFrmPat" hbank="81" lbank="0" prog="114"/>
+ <Patch name="Jazz Scat" hbank="81" lbank="0" prog="115"/>
+ <Patch name="Lounge Gig" hbank="81" lbank="0" prog="116"/>
+ <Patch name="JC Strat" hbank="81" lbank="0" prog="117"/>
+ <Patch name="Twin STrats" hbank="81" lbank="0" prog="118"/>
+ <Patch name="JV Strat" hbank="81" lbank="0" prog="119"/>
+ <Patch name="Syn STrat" hbank="81" lbank="0" prog="120"/>
+ <Patch name="Rotary Gtr" hbank="81" lbank="0" prog="121"/>
+ <Patch name="Muted Gtr" hbank="81" lbank="0" prog="122"/>
+ <Patch name="SwitchOnMute" hbank="81" lbank="0" prog="123"/>
+ <Patch name="Power Trip" hbank="81" lbank="0" prog="124"/>
+ <Patch name="Crunch Split" hbank="81" lbank="0" prog="125"/>
+ <Patch name="Rezodrive" hbank="81" lbank="0" prog="126"/>
+ <Patch name="RockYurSocks" hbank="81" lbank="0" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="PR-B">
+ <Patch name="Dist Gtr 1" hbank="81" lbank="1" prog="0"/>
+ <Patch name="Dist Gtr 2" hbank="81" lbank="1" prog="1"/>
+ <Patch name="R&amp;R Chunk" hbank="81" lbank="1" prog="2"/>
+ <Patch name="Phripphuzz" hbank="81" lbank="1" prog="3"/>
+ <Patch name="Grungeroni" hbank="81" lbank="1" prog="4"/>
+ <Patch name="Black Widow" hbank="81" lbank="1" prog="5"/>
+ <Patch name="Velo-Wah Gtr" hbank="81" lbank="1" prog="6"/>
+ <Patch name="Mod-Wah Gtr" hbank="81" lbank="1" prog="7"/>
+ <Patch name="Pick Bass" hbank="81" lbank="1" prog="8"/>
+ <Patch name="Hip Bass" hbank="81" lbank="1" prog="9"/>
+ <Patch name="Perc.bass" hbank="81" lbank="1" prog="10"/>
+ <Patch name="Homey Bass" hbank="81" lbank="1" prog="11"/>
+ <Patch name="Finger bass" hbank="81" lbank="1" prog="12"/>
+ <Patch name="Nylon Bass" hbank="81" lbank="1" prog="13"/>
+ <Patch name="Ac. Upright" hbank="81" lbank="1" prog="14"/>
+ <Patch name="Wet Fretls" hbank="81" lbank="1" prog="15"/>
+ <Patch name="Fretls Dry" hbank="81" lbank="1" prog="16"/>
+ <Patch name="Slap Bass 1" hbank="81" lbank="1" prog="17"/>
+ <Patch name="Slap Bass 2" hbank="81" lbank="1" prog="18"/>
+ <Patch name="Slap Bass 3" hbank="81" lbank="1" prog="19"/>
+ <Patch name="Slap Bass 4" hbank="81" lbank="1" prog="20"/>
+ <Patch name="4 Pole Bass" hbank="81" lbank="1" prog="21"/>
+ <Patch name="Tick bass" hbank="81" lbank="1" prog="22"/>
+ <Patch name="House Bass" hbank="81" lbank="1" prog="23"/>
+ <Patch name="Mondo Bass" hbank="81" lbank="1" prog="24"/>
+ <Patch name="Clk AnalogBs" hbank="81" lbank="1" prog="25"/>
+ <Patch name="bass In Face" hbank="81" lbank="1" prog="26"/>
+ <Patch name="101 Bass" hbank="81" lbank="1" prog="27"/>
+ <Patch name="Noiz Bass" hbank="81" lbank="1" prog="28"/>
+ <Patch name="Super Jup Bass" hbank="81" lbank="1" prog="29"/>
+ <Patch name="Occitan Bass" hbank="81" lbank="1" prog="30"/>
+ <Patch name="Hugo Bass" hbank="81" lbank="1" prog="31"/>
+ <Patch name="Multi bass" hbank="81" lbank="1" prog="32"/>
+ <Patch name="Moist Bass" hbank="81" lbank="1" prog="33"/>
+ <Patch name="Britelow Bass" hbank="81" lbank="1" prog="34"/>
+ <Patch name="Untamed Bass" hbank="81" lbank="1" prog="35"/>
+ <Patch name="Rubber Bass" hbank="81" lbank="1" prog="36"/>
+ <Patch name="Stereoww Bs" hbank="81" lbank="1" prog="37"/>
+ <Patch name="Wonder Bass" hbank="81" lbank="1" prog="38"/>
+ <Patch name="Deep Bass" hbank="81" lbank="1" prog="39"/>
+ <Patch name="Super JX Bs" hbank="81" lbank="1" prog="40"/>
+ <Patch name="W&lt;RED&gt;-bass" hbank="81" lbank="1" prog="41"/>
+ <Patch name="HI-Ring Bass" hbank="81" lbank="1" prog="42"/>
+ <Patch name="Euro bass" hbank="81" lbank="1" prog="43"/>
+ <Patch name="Sinusoidrave" hbank="81" lbank="1" prog="44"/>
+ <Patch name="Alternative" hbank="81" lbank="1" prog="45"/>
+ <Patch name="Acid Line" hbank="81" lbank="1" prog="46"/>
+ <Patch name="Auto TB-303" hbank="81" lbank="1" prog="47"/>
+ <Patch name="Hihat Tekno" hbank="81" lbank="1" prog="48"/>
+ <Patch name="Velo Tekno 1" hbank="81" lbank="1" prog="49"/>
+ <Patch name="Raggatronic" hbank="81" lbank="1" prog="50"/>
+ <Patch name="Blade Racer" hbank="81" lbank="1" prog="51"/>
+ <Patch name="S&amp;H Pad" hbank="81" lbank="1" prog="52"/>
+ <Patch name="Syncrosonix" hbank="81" lbank="1" prog="53"/>
+ <Patch name="Fool Again" hbank="81" lbank="1" prog="54"/>
+ <Patch name="Alive" hbank="81" lbank="1" prog="55"/>
+ <Patch name="Velo Teckno 2" hbank="81" lbank="1" prog="56"/>
+ <Patch name="Rezoid" hbank="81" lbank="1" prog="57"/>
+ <Patch name="RaverBorg" hbank="81" lbank="1" prog="58"/>
+ <Patch name="Blow Hit" hbank="81" lbank="1" prog="59"/>
+ <Patch name="Hammer Bell" hbank="81" lbank="1" prog="60"/>
+ <Patch name="Seq Mallet" hbank="81" lbank="1" prog="61"/>
+ <Patch name="Intentions" hbank="81" lbank="1" prog="62"/>
+ <Patch name="Pick It" hbank="81" lbank="1" prog="63"/>
+ <Patch name="Analog Seq" hbank="81" lbank="1" prog="64"/>
+ <Patch name="Impact Vox" hbank="81" lbank="1" prog="65"/>
+ <Patch name="TecknoSoloVox" hbank="81" lbank="1" prog="66"/>
+ <Patch name="X-Mod Man" hbank="81" lbank="1" prog="67"/>
+ <Patch name="Paz &lt;==&gt; Zap" hbank="81" lbank="1" prog="68"/>
+ <Patch name="4 Hits 4 You" hbank="81" lbank="1" prog="69"/>
+ <Patch name="Impact" hbank="81" lbank="1" prog="70"/>
+ <Patch name="Phase Hit" hbank="81" lbank="1" prog="71"/>
+ <Patch name="Tekno Hit 1" hbank="81" lbank="1" prog="72"/>
+ <Patch name="Tekno Hit 2" hbank="81" lbank="1" prog="73"/>
+ <Patch name="Tekno Hit 3" hbank="81" lbank="1" prog="74"/>
+ <Patch name="Reverse Hit" hbank="81" lbank="1" prog="75"/>
+ <Patch name="Square Lead 1" hbank="81" lbank="1" prog="76"/>
+ <Patch name="Square Lead 2" hbank="81" lbank="1" prog="77"/>
+ <Patch name="You and Luck" hbank="81" lbank="1" prog="78"/>
+ <Patch name="Belly Lead" hbank="81" lbank="1" prog="79"/>
+ <Patch name="WhistleinAtom" hbank="81" lbank="1" prog="80"/>
+ <Patch name="Edye Boost" hbank="81" lbank="1" prog="81"/>
+ <Patch name="MG Solo" hbank="81" lbank="1" prog="82"/>
+ <Patch name="FXM Saw Lead" hbank="81" lbank="1" prog="83"/>
+ <Patch name="Sawteeth" hbank="81" lbank="1" prog="84"/>
+ <Patch name="Smoothe" hbank="81" lbank="1" prog="85"/>
+ <Patch name="MG Lead" hbank="81" lbank="1" prog="86"/>
+ <Patch name="MG Interval" hbank="81" lbank="1" prog="87"/>
+ <Patch name="Pulse Lead 1" hbank="81" lbank="1" prog="88"/>
+ <Patch name="Pulse Lead 2" hbank="81" lbank="1" prog="89"/>
+ <Patch name="Little Devil" hbank="81" lbank="1" prog="90"/>
+ <Patch name="Load SynLead" hbank="81" lbank="1" prog="91"/>
+ <Patch name="Analog Lead" hbank="81" lbank="1" prog="92"/>
+ <Patch name="5th Lead" hbank="81" lbank="1" prog="93"/>
+ <Patch name="Flute" hbank="81" lbank="1" prog="94"/>
+ <Patch name="Piccolo" hbank="81" lbank="1" prog="95"/>
+ <Patch name="VOX Flute" hbank="81" lbank="1" prog="96"/>
+ <Patch name="Air Lead" hbank="81" lbank="1" prog="97"/>
+ <Patch name="Pan Pipes" hbank="81" lbank="1" prog="98"/>
+ <Patch name="Airplaaane" hbank="81" lbank="1" prog="99"/>
+ <Patch name="Taj Mahal" hbank="81" lbank="1" prog="100"/>
+ <Patch name="Raya Shaku" hbank="81" lbank="1" prog="101"/>
+ <Patch name="Oboe mf" hbank="81" lbank="1" prog="102"/>
+ <Patch name="Oboe Express" hbank="81" lbank="1" prog="103"/>
+ <Patch name="Clarinet mp" hbank="81" lbank="1" prog="104"/>
+ <Patch name="ClariExpress" hbank="81" lbank="1" prog="105"/>
+ <Patch name="Mitzva Split" hbank="81" lbank="1" prog="106"/>
+ <Patch name="ChamberWinds" hbank="81" lbank="1" prog="107"/>
+ <Patch name="Chamber Woods" hbank="81" lbank="1" prog="108"/>
+ <Patch name="Film Orch" hbank="81" lbank="1" prog="109"/>
+ <Patch name="Sop.Sax mf" hbank="81" lbank="1" prog="110"/>
+ <Patch name="Alto Sax" hbank="81" lbank="1" prog="111"/>
+ <Patch name="AltoLead Sax" hbank="81" lbank="1" prog="112"/>
+ <Patch name="Tenor Sax" hbank="81" lbank="1" prog="113"/>
+ <Patch name="Baritone Sax" hbank="81" lbank="1" prog="114"/>
+ <Patch name="Take a Tenor" hbank="81" lbank="1" prog="115"/>
+ <Patch name="Sax Section" hbank="81" lbank="1" prog="116"/>
+ <Patch name="Bigband Sax" hbank="81" lbank="1" prog="117"/>
+ <Patch name="Harmonica" hbank="81" lbank="1" prog="118"/>
+ <Patch name="Harmo Blues" hbank="81" lbank="1" prog="119"/>
+ <Patch name="BluesHarp" hbank="81" lbank="1" prog="120"/>
+ <Patch name="French Bags" hbank="81" lbank="1" prog="122"/>
+ <Patch name="Majestic Tpt" hbank="81" lbank="1" prog="123"/>
+ <Patch name="Voluntare" hbank="81" lbank="1" prog="124"/>
+ <Patch name="2Trumpets" hbank="81" lbank="1" prog="125"/>
+ <Patch name="Tpt Sect" hbank="81" lbank="1" prog="126"/>
+ <Patch name="Mute TP mod" hbank="81" lbank="1" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="PR-C">
+ <Patch name="Harmon Mute" hbank="81" lbank="2" prog="0"/>
+ <Patch name="Tp&amp;Sax Section" hbank="81" lbank="2" prog="1"/>
+ <Patch name="Sax+Tp+Tb" hbank="81" lbank="2" prog="2"/>
+ <Patch name="Brass Sect" hbank="81" lbank="2" prog="3"/>
+ <Patch name="Trombone" hbank="81" lbank="2" prog="4"/>
+ <Patch name="Hybrid Bones" hbank="81" lbank="2" prog="5"/>
+ <Patch name="Noble Horns" hbank="81" lbank="2" prog="6"/>
+ <Patch name="Massed Horns" hbank="81" lbank="2" prog="7"/>
+ <Patch name="Horn Swell" hbank="81" lbank="2" prog="8"/>
+ <Patch name="Brass it!" hbank="81" lbank="2" prog="9"/>
+ <Patch name="Brass Attack" hbank="81" lbank="2" prog="10"/>
+ <Patch name="Archimede" hbank="81" lbank="2" prog="11"/>
+ <Patch name="Rugby Horn" hbank="81" lbank="2" prog="12"/>
+ <Patch name="MKS-80 Brass" hbank="81" lbank="2" prog="13"/>
+ <Patch name="True ANALOGE" hbank="81" lbank="2" prog="14"/>
+ <Patch name="Dark Vox" hbank="81" lbank="2" prog="15"/>
+ <Patch name="Random Vowels" hbank="81" lbank="2" prog="16"/>
+ <Patch name="Angels Sing" hbank="81" lbank="2" prog="17"/>
+ <Patch name="Pvox Oooze" hbank="81" lbank="2" prog="18"/>
+ <Patch name="Longing" hbank="81" lbank="2" prog="19"/>
+ <Patch name="Arasian Morn" hbank="81" lbank="2" prog="20"/>
+ <Patch name="Beauty Vox" hbank="81" lbank="2" prog="21"/>
+ <Patch name="Mary-AnneVox" hbank="81" lbank="2" prog="22"/>
+ <Patch name="Beltree Vox" hbank="81" lbank="2" prog="23"/>
+ <Patch name="Vox Planner" hbank="81" lbank="2" prog="24"/>
+ <Patch name="Spaced Voxx" hbank="81" lbank="2" prog="25"/>
+ <Patch name="Glass Voices" hbank="81" lbank="2" prog="26"/>
+ <Patch name="Tubular Vox" hbank="81" lbank="2" prog="27"/>
+ <Patch name="Velo Vox" hbank="81" lbank="2" prog="28"/>
+ <Patch name="Wavox" hbank="81" lbank="2" prog="29"/>
+ <Patch name="Doos" hbank="81" lbank="2" prog="30"/>
+ <Patch name="Synvox Comps" hbank="81" lbank="2" prog="31"/>
+ <Patch name="Vocal Oohz" hbank="81" lbank="2" prog="32"/>
+ <Patch name="LFO Vox" hbank="81" lbank="2" prog="33"/>
+ <Patch name="St. Strings" hbank="81" lbank="2" prog="34"/>
+ <Patch name="Warm Strings" hbank="81" lbank="2" prog="35"/>
+ <Patch name="Somber Strings" hbank="81" lbank="2" prog="36"/>
+ <Patch name="Marcato" hbank="81" lbank="2" prog="37"/>
+ <Patch name="Bright Strings" hbank="81" lbank="2" prog="38"/>
+ <Patch name="String Ens" hbank="81" lbank="2" prog="39"/>
+ <Patch name="TremoloStrng" hbank="81" lbank="2" prog="40"/>
+ <Patch name="Chambers" hbank="81" lbank="2" prog="41"/>
+ <Patch name="Violin Cello" hbank="81" lbank="2" prog="42"/>
+ <Patch name="Symphonique" hbank="81" lbank="2" prog="43"/>
+ <Patch name="Film Octaves" hbank="81" lbank="2" prog="44"/>
+ <Patch name="Film Layers" hbank="81" lbank="2" prog="45"/>
+ <Patch name="Bass Pizz" hbank="81" lbank="2" prog="46"/>
+ <Patch name="Real Pizz" hbank="81" lbank="2" prog="47"/>
+ <Patch name="Harp on it" hbank="81" lbank="2" prog="48"/>
+ <Patch name="Harp" hbank="81" lbank="2" prog="49"/>
+ <Patch name="JP-8 Str 1" hbank="81" lbank="2" prog="50"/>
+ <Patch name="JP-8 Str 2" hbank="81" lbank="2" prog="51"/>
+ <Patch name="E-Motion pad" hbank="81" lbank="2" prog="52"/>
+ <Patch name="JP-8 Str 3" hbank="81" lbank="2" prog="53"/>
+ <Patch name="Vintage Orch" hbank="81" lbank="2" prog="54"/>
+ <Patch name="JUNO Strings" hbank="81" lbank="2" prog="55"/>
+ <Patch name="Gigantalog" hbank="81" lbank="2" prog="56"/>
+ <Patch name="PWN Strings" hbank="81" lbank="2" prog="57"/>
+ <Patch name="Warmth" hbank="81" lbank="2" prog="58"/>
+ <Patch name="ORBit Pad" hbank="81" lbank="2" prog="59"/>
+ <Patch name="Deep Strings" hbank="81" lbank="2" prog="60"/>
+ <Patch name="Pulsify" hbank="81" lbank="2" prog="61"/>
+ <Patch name="Pulse Pad" hbank="81" lbank="2" prog="62"/>
+ <Patch name="Greek Power" hbank="81" lbank="2" prog="63"/>
+ <Patch name="Harmonicum" hbank="81" lbank="2" prog="64"/>
+ <Patch name="D-50 Heaven" hbank="81" lbank="2" prog="65"/>
+ <Patch name="Afro Horns" hbank="81" lbank="2" prog="66"/>
+ <Patch name="Pop Pad" hbank="81" lbank="2" prog="67"/>
+ <Patch name="Dreamesque" hbank="81" lbank="2" prog="68"/>
+ <Patch name="Square Pad" hbank="81" lbank="2" prog="69"/>
+ <Patch name="JP-8 Hollow" hbank="81" lbank="2" prog="70"/>
+ <Patch name="JP-8 Haunting" hbank="81" lbank="2" prog="72"/>
+ <Patch name="Hush Pad" hbank="81" lbank="2" prog="73"/>
+ <Patch name="Jet Pad 1" hbank="81" lbank="2" prog="74"/>
+ <Patch name="Jet Pad 2" hbank="81" lbank="2" prog="75"/>
+ <Patch name="Phaze Pad" hbank="81" lbank="2" prog="76"/>
+ <Patch name="Phaze Str" hbank="81" lbank="2" prog="77"/>
+ <Patch name="Jet Str Ens" hbank="81" lbank="2" prog="78"/>
+ <Patch name="Pivotal Pad" hbank="81" lbank="2" prog="79"/>
+ <Patch name="3D Flanged" hbank="81" lbank="2" prog="80"/>
+ <Patch name="Fantawine" hbank="81" lbank="2" prog="81"/>
+ <Patch name="Glossy Pad" hbank="81" lbank="2" prog="82"/>
+ <Patch name="Moving Glass" hbank="81" lbank="2" prog="83"/>
+ <Patch name="Glasswaves" hbank="81" lbank="2" prog="84"/>
+ <Patch name="Shiny pad" hbank="81" lbank="2" prog="85"/>
+ <Patch name="ShiftedGlass" hbank="81" lbank="2" prog="86"/>
+ <Patch name="Chime Pad" hbank="81" lbank="2" prog="87"/>
+ <Patch name="Spin pad" hbank="81" lbank="2" prog="88"/>
+ <Patch name="Rotary Pad" hbank="81" lbank="2" prog="89"/>
+ <Patch name="Dawn 2 Dusk" hbank="81" lbank="2" prog="90"/>
+ <Patch name="Aurora" hbank="81" lbank="2" prog="91"/>
+ <Patch name="Strobe Mode" hbank="81" lbank="2" prog="92"/>
+ <Patch name="Albion" hbank="81" lbank="2" prog="93"/>
+ <Patch name="Running pad" hbank="81" lbank="2" prog="94"/>
+ <Patch name="Stepped Pad" hbank="81" lbank="2" prog="95"/>
+ <Patch name="Random Pad" hbank="81" lbank="2" prog="96"/>
+ <Patch name="SoundtrkDANC" hbank="81" lbank="2" prog="97"/>
+ <Patch name="Flying Waltz" hbank="81" lbank="2" prog="98"/>
+ <Patch name="Vanishing" hbank="81" lbank="2" prog="99"/>
+ <Patch name="5th Sweep" hbank="81" lbank="2" prog="100"/>
+ <Patch name="Phazweep" hbank="81" lbank="2" prog="101"/>
+ <Patch name="Big BPF" hbank="81" lbank="2" prog="102"/>
+ <Patch name="MG Sweep" hbank="81" lbank="2" prog="103"/>
+ <Patch name="CeremonyTimp" hbank="81" lbank="2" prog="104"/>
+ <Patch name="Dyno Toms" hbank="81" lbank="2" prog="105"/>
+ <Patch name="Sands of TIme" hbank="81" lbank="2" prog="106"/>
+ <Patch name="Inertia" hbank="81" lbank="2" prog="107"/>
+ <Patch name="Vektogram" hbank="81" lbank="2" prog="108"/>
+ <Patch name="Crash Pad" hbank="81" lbank="2" prog="109"/>
+ <Patch name="Feedback Vox" hbank="81" lbank="2" prog="110"/>
+ <Patch name="Cascade" hbank="81" lbank="2" prog="111"/>
+ <Patch name="Shattered" hbank="81" lbank="2" prog="112"/>
+ <Patch name="Next Frontier" hbank="81" lbank="2" prog="113"/>
+ <Patch name="Pure Tibet" hbank="81" lbank="2" prog="114"/>
+ <Patch name="Chime Wash" hbank="81" lbank="2" prog="115"/>
+ <Patch name="Night Shade" hbank="81" lbank="2" prog="116"/>
+ <Patch name="Tortured" hbank="81" lbank="2" prog="117"/>
+ <Patch name="Dissimilate" hbank="81" lbank="2" prog="118"/>
+ <Patch name="Dunes" hbank="81" lbank="2" prog="119"/>
+ <Patch name="Ocean Floor" hbank="81" lbank="2" prog="120"/>
+ <Patch name="Cyber Space" hbank="81" lbank="2" prog="121"/>
+ <Patch name="Biospheare" hbank="81" lbank="2" prog="122"/>
+ <Patch name="Variable Run" hbank="81" lbank="2" prog="123"/>
+ <Patch name="Ice Hall" hbank="81" lbank="2" prog="124"/>
+ <Patch name="Computer Room" hbank="81" lbank="2" prog="125"/>
+ <Patch name="Inverted" hbank="81" lbank="2" prog="126"/>
+ <Patch name="terminate" hbank="81" lbank="2" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="PR-E">
+ <Patch name="Echo Piano" hbank="81" lbank="4" prog="0"/>
+ <Patch name="Upright Piano" hbank="81" lbank="4" prog="1"/>
+ <Patch name="RD-1000" hbank="81" lbank="4" prog="2"/>
+ <Patch name="Player's EP" hbank="81" lbank="4" prog="3"/>
+ <Patch name="D-50 Rhodes" hbank="81" lbank="4" prog="4"/>
+ <Patch name="Innocent EP" hbank="81" lbank="4" prog="5"/>
+ <Patch name="Echo Rhodes" hbank="81" lbank="4" prog="6"/>
+ <Patch name="See-Thru EP" hbank="81" lbank="4" prog="7"/>
+ <Patch name="FM BellPiano" hbank="81" lbank="4" prog="8"/>
+ <Patch name="Ring E.Piano" hbank="81" lbank="4" prog="9"/>
+ <Patch name="Soap Opera" hbank="81" lbank="4" prog="10"/>
+ <Patch name="Dirty Organ" hbank="81" lbank="4" prog="11"/>
+ <Patch name="Surf's Up!" hbank="81" lbank="4" prog="12"/>
+ <Patch name="Organesque" hbank="81" lbank="4" prog="13"/>
+ <Patch name="pp Harmonium" hbank="81" lbank="4" prog="14"/>
+ <Patch name="PieceOfCheez" hbank="81" lbank="4" prog="15"/>
+ <Patch name="Harpsy Clav" hbank="81" lbank="4" prog="16"/>
+ <Patch name="Exotic Velo" hbank="81" lbank="4" prog="17"/>
+ <Patch name="HolidayCheer" hbank="81" lbank="4" prog="18"/>
+ <Patch name="Moring Lite" hbank="81" lbank="4" prog="19"/>
+ <Patch name="Prefab Chime" hbank="81" lbank="4" prog="20"/>
+ <Patch name="Belfry Chime" hbank="81" lbank="4" prog="21"/>
+ <Patch name="Stacc.Heaven" hbank="81" lbank="4" prog="22"/>
+ <Patch name="2.2 Bell Pad" hbank="81" lbank="4" prog="23"/>
+ <Patch name="Far East" hbank="81" lbank="4" prog="24"/>
+ <Patch name="Wire Pad" hbank="81" lbank="4" prog="25"/>
+ <Patch name="PhaseBlipper" hbank="81" lbank="4" prog="26"/>
+ <Patch name="Sweep Clav" hbank="81" lbank="4" prog="27"/>
+ <Patch name="Glider" hbank="81" lbank="4" prog="28"/>
+ <Patch name="Solo Steel" hbank="81" lbank="4" prog="29"/>
+ <Patch name="DesertCrystl" hbank="81" lbank="4" prog="30"/>
+ <Patch name="Clear Guitar" hbank="81" lbank="4" prog="31"/>
+ <Patch name="Solo Strat" hbank="81" lbank="4" prog="32"/>
+ <Patch name="Feed Me!" hbank="81" lbank="4" prog="33"/>
+ <Patch name="Tube Smoke" hbank="81" lbank="4" prog="34"/>
+ <Patch name="Creamy" hbank="81" lbank="4" prog="35"/>
+ <Patch name="Bluesy OD" hbank="81" lbank="4" prog="36"/>
+ <Patch name="Grindstone" hbank="81" lbank="4" prog="37"/>
+ <Patch name="OD 5ths" hbank="81" lbank="4" prog="38"/>
+ <Patch name="East Europe" hbank="81" lbank="4" prog="39"/>
+ <Patch name="Dulcitar" hbank="81" lbank="4" prog="40"/>
+ <Patch name="Atmos Harp" hbank="81" lbank="4" prog="41"/>
+ <Patch name="Pilgrimage" hbank="81" lbank="4" prog="42"/>
+ <Patch name="202 Rude Bs" hbank="81" lbank="4" prog="43"/>
+ <Patch name="2pole Bass" hbank="81" lbank="4" prog="44"/>
+ <Patch name="4pole Bass" hbank="81" lbank="4" prog="45"/>
+ <Patch name="Phaser MC" hbank="81" lbank="4" prog="46"/>
+ <Patch name="Miniphaser" hbank="81" lbank="4" prog="47"/>
+ <Patch name="Acid TB" hbank="81" lbank="4" prog="48"/>
+ <Patch name="Full Orchest" hbank="81" lbank="4" prog="49"/>
+ <Patch name="Str + Winds" hbank="81" lbank="4" prog="50"/>
+ <Patch name="Flute 2080" hbank="81" lbank="4" prog="51"/>
+ <Patch name="Scat Flute" hbank="81" lbank="4" prog="52"/>
+ <Patch name="Sax Choir" hbank="81" lbank="4" prog="53"/>
+ <Patch name="Ballad Trump" hbank="81" lbank="4" prog="54"/>
+ <Patch name="Sm.Brass Grp" hbank="81" lbank="4" prog="55"/>
+ <Patch name="Royale" hbank="81" lbank="4" prog="56"/>
+ <Patch name="Brass Mutes" hbank="81" lbank="4" prog="57"/>
+ <Patch name="Breathy Brs" hbank="81" lbank="4" prog="58"/>
+ <Patch name="3 Osc Brass" hbank="81" lbank="4" prog="59"/>
+ <Patch name="P5 Polymod" hbank="81" lbank="4" prog="60"/>
+ <Patch name="Triumph Brs" hbank="81" lbank="4" prog="61"/>
+ <Patch name="Techno Dream" hbank="81" lbank="4" prog="62"/>
+ <Patch name="Organizer" hbank="81" lbank="4" prog="63"/>
+ <Patch name="Civilization" hbank="81" lbank="4" prog="64"/>
+ <Patch name="Mental Chord" hbank="81" lbank="4" prog="65"/>
+ <Patch name="House Chord" hbank="81" lbank="4" prog="66"/>
+ <Patch name="Sequalog" hbank="81" lbank="4" prog="67"/>
+ <Patch name="Booster Bips" hbank="81" lbank="4" prog="68"/>
+ <Patch name="VintagePlunk" hbank="81" lbank="4" prog="69"/>
+ <Patch name="Plik-Plok" hbank="81" lbank="4" prog="70"/>
+ <Patch name="RingSequence" hbank="81" lbank="4" prog="71"/>
+ <Patch name="Cyber Swing" hbank="81" lbank="4" prog="72"/>
+ <Patch name="Keep :-)" hbank="81" lbank="4" prog="73"/>
+ <Patch name="Resojuice" hbank="81" lbank="4" prog="74"/>
+ <Patch name="B'on d'moov!" hbank="81" lbank="4" prog="75"/>
+ <Patch name="Dist TB-303" hbank="81" lbank="4" prog="76"/>
+ <Patch name="Temple of JV" hbank="81" lbank="4" prog="77"/>
+ <Patch name="Planet Asia" hbank="81" lbank="4" prog="78"/>
+ <Patch name="Afterlife" hbank="81" lbank="4" prog="79"/>
+ <Patch name="Trancing Pad" hbank="81" lbank="4" prog="80"/>
+ <Patch name="Pulsatronic" hbank="81" lbank="4" prog="81"/>
+ <Patch name="Cyber Dreams" hbank="81" lbank="4" prog="82"/>
+ <Patch name="Warm Pipe" hbank="81" lbank="4" prog="83"/>
+ <Patch name="Pure Pipe" hbank="81" lbank="4" prog="84"/>
+ <Patch name="SH-2000" hbank="81" lbank="4" prog="85"/>
+ <Patch name="X..? Whistle" hbank="81" lbank="4" prog="86"/>
+ <Patch name="Jay Vee Solo" hbank="81" lbank="4" prog="87"/>
+ <Patch name="Progresso Ld" hbank="81" lbank="4" prog="88"/>
+ <Patch name="Adrenaline" hbank="81" lbank="4" prog="89"/>
+ <Patch name="Enlighten" hbank="81" lbank="4" prog="90"/>
+ <Patch name="Glass Blower" hbank="81" lbank="4" prog="91"/>
+ <Patch name="Earth Blow" hbank="81" lbank="4" prog="92"/>
+ <Patch name="JX SqrCarpet" hbank="81" lbank="4" prog="93"/>
+ <Patch name="Dimensional" hbank="81" lbank="4" prog="94"/>
+ <Patch name="Jupiterings" hbank="81" lbank="4" prog="95"/>
+ <Patch name="Analog Drama" hbank="81" lbank="4" prog="96"/>
+ <Patch name="Rich Dynapad" hbank="81" lbank="4" prog="97"/>
+ <Patch name="Silky Way" hbank="81" lbank="4" prog="98"/>
+ <Patch name="Gluey Pad" hbank="81" lbank="4" prog="99"/>
+ <Patch name="BandPass Mod" hbank="81" lbank="4" prog="100"/>
+ <Patch name="Soundtraque" hbank="81" lbank="4" prog="101"/>
+ <Patch name="Translucence" hbank="81" lbank="4" prog="102"/>
+ <Patch name="Darkshine" hbank="81" lbank="4" prog="103"/>
+ <Patch name="D'light" hbank="81" lbank="4" prog="104"/>
+ <Patch name="December Sky" hbank="81" lbank="4" prog="105"/>
+ <Patch name="Octapad" hbank="81" lbank="4" prog="106"/>
+ <Patch name="JUNO Power!" hbank="81" lbank="4" prog="107"/>
+ <Patch name="Spectrum Mod" hbank="81" lbank="4" prog="108"/>
+ <Patch name="Stringsheen" hbank="81" lbank="4" prog="109"/>
+ <Patch name="GR500 TmpDly" hbank="81" lbank="4" prog="110"/>
+ <Patch name="Mod DirtyWav" hbank="81" lbank="4" prog="111"/>
+ <Patch name="Silicon Str" hbank="81" lbank="4" prog="112"/>
+ <Patch name="D50FantaPerc" hbank="81" lbank="4" prog="113"/>
+ <Patch name="Rotodreams" hbank="81" lbank="4" prog="114"/>
+ <Patch name="Blue Notes" hbank="81" lbank="4" prog="115"/>
+ <Patch name="RiversOfTime" hbank="81" lbank="4" prog="116"/>
+ <Patch name="Phobos" hbank="81" lbank="4" prog="117"/>
+ <Patch name="2 0 8 0" hbank="81" lbank="4" prog="118"/>
+ <Patch name="Unearthly" hbank="81" lbank="4" prog="119"/>
+ <Patch name="Glistening" hbank="81" lbank="4" prog="120"/>
+ <Patch name="Sci-Fi Str" hbank="81" lbank="4" prog="121"/>
+ <Patch name="Shadows" hbank="81" lbank="4" prog="122"/>
+ <Patch name="Helium Queen" hbank="81" lbank="4" prog="123"/>
+ <Patch name="Sci-Fi FX x4" hbank="81" lbank="4" prog="124"/>
+ <Patch name="Perky Noize" hbank="81" lbank="4" prog="125"/>
+ <Patch name="Droplet" hbank="81" lbank="4" prog="126"/>
+ <Patch name="Rain Forest" hbank="81" lbank="4" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="XP-A, part 1">
+ <Patch name="St. Concert" hbank="84" lbank="0" prog="0"/>
+ <Patch name="9ft. Grand 1" hbank="84" lbank="0" prog="1"/>
+ <Patch name="9ft. Grand 2" hbank="84" lbank="0" prog="2"/>
+ <Patch name="Euro Classic" hbank="84" lbank="0" prog="3"/>
+ <Patch name="St. Piano &amp; Str" hbank="84" lbank="0" prog="4"/>
+ <Patch name="Compress Pno" hbank="84" lbank="0" prog="5"/>
+ <Patch name="LA Session" hbank="84" lbank="0" prog="6"/>
+ <Patch name="Water Piano" hbank="84" lbank="0" prog="7"/>
+ <Patch name="Vibra Rhodes" hbank="84" lbank="0" prog="8"/>
+ <Patch name="Stack Rhodes" hbank="84" lbank="0" prog="9"/>
+ <Patch name="ArcoEnsemble" hbank="84" lbank="0" prog="10"/>
+ <Patch name="Vienna Strgs" hbank="84" lbank="0" prog="11"/>
+ <Patch name="Str Adagio" hbank="84" lbank="0" prog="12"/>
+ <Patch name="Oct Strings" hbank="84" lbank="0" prog="13"/>
+ <Patch name="Silky Filter" hbank="84" lbank="0" prog="14"/>
+ <Patch name="Soft Strings" hbank="84" lbank="0" prog="15"/>
+ <Patch name="SlowStr. Sect" hbank="84" lbank="0" prog="16"/>
+ <Patch name="GiantStrings" hbank="84" lbank="0" prog="17"/>
+ <Patch name="Str+Choir 1" hbank="84" lbank="0" prog="18"/>
+ <Patch name="Str+Choir 2" hbank="84" lbank="0" prog="19"/>
+ <Patch name="Str+Choir 3" hbank="84" lbank="0" prog="20"/>
+ <Patch name="Breathy Humz" hbank="84" lbank="0" prog="21"/>
+ <Patch name="Dream Voices" hbank="84" lbank="0" prog="22"/>
+ <Patch name="Mmmms" hbank="84" lbank="0" prog="23"/>
+ <Patch name="Chorale" hbank="84" lbank="0" prog="24"/>
+ <Patch name="Space Men" hbank="84" lbank="0" prog="25"/>
+ <Patch name="Choir Mm+Aah" hbank="84" lbank="0" prog="26"/>
+ <Patch name="Ivory Mist" hbank="84" lbank="0" prog="27"/>
+ <Patch name="PercussiVox" hbank="84" lbank="0" prog="28"/>
+ <Patch name="Mysteriouso" hbank="84" lbank="0" prog="29"/>
+ <Patch name="Phase Mmhs" hbank="84" lbank="0" prog="30"/>
+ <Patch name="AmbientStory" hbank="84" lbank="0" prog="31"/>
+ <Patch name="Venus" hbank="84" lbank="0" prog="32"/>
+ <Patch name="SessionBrass" hbank="84" lbank="0" prog="33"/>
+ <Patch name="Port.Tpts" hbank="84" lbank="0" prog="34"/>
+ <Patch name="R&amp;R Brass" hbank="84" lbank="0" prog="35"/>
+ <Patch name="Echo Brass" hbank="84" lbank="0" prog="36"/>
+ <Patch name="E.Coast Brs" hbank="84" lbank="0" prog="37"/>
+ <Patch name="Bop soli" hbank="84" lbank="0" prog="38"/>
+ <Patch name="Soft Saxes" hbank="84" lbank="0" prog="39"/>
+ <Patch name="Orchestral" hbank="84" lbank="0" prog="40"/>
+ <Patch name="Octalog Horn" hbank="84" lbank="0" prog="41"/>
+ <Patch name="Tpt Soloist" hbank="84" lbank="0" prog="42"/>
+ <Patch name="Legato Trumpet" hbank="84" lbank="0" prog="43"/>
+ <Patch name="Dyno Trumpet" hbank="84" lbank="0" prog="44"/>
+ <Patch name="Ethno-Trumps" hbank="84" lbank="0" prog="45"/>
+ <Patch name="Super Tenor" hbank="84" lbank="0" prog="46"/>
+ <Patch name="TenorExpress" hbank="84" lbank="0" prog="47"/>
+ <Patch name="T.Sax f" hbank="84" lbank="0" prog="48"/>
+ <Patch name="Legato Flute" hbank="84" lbank="0" prog="49"/>
+ <Patch name="Touch Flute" hbank="84" lbank="0" prog="50"/>
+ <Patch name="NewAge Flute" hbank="84" lbank="0" prog="51"/>
+ <Patch name="Flute InMist" hbank="84" lbank="0" prog="52"/>
+ <Patch name="Hybrid Flute" hbank="84" lbank="0" prog="53"/>
+ <Patch name="Flute &amp; Cla" hbank="84" lbank="0" prog="54"/>
+ <Patch name="ChristmasFlt" hbank="84" lbank="0" prog="55"/>
+ <Patch name="Fifth Flute" hbank="84" lbank="0" prog="56"/>
+ <Patch name="Cosmic Flute" hbank="84" lbank="0" prog="57"/>
+ <Patch name="Acc. De Paris" hbank="84" lbank="0" prog="58"/>
+ <Patch name="Paris 50's" hbank="84" lbank="0" prog="59"/>
+ <Patch name="Musette Ens" hbank="84" lbank="0" prog="60"/>
+ <Patch name="Montmartre" hbank="84" lbank="0" prog="61"/>
+ <Patch name="Sad Akordion" hbank="84" lbank="0" prog="62"/>
+ <Patch name="Fr. Accordion" hbank="84" lbank="0" prog="63"/>
+ <Patch name="FR. Accordion 2" hbank="84" lbank="0" prog="64"/>
+ <Patch name="Troubadour" hbank="84" lbank="0" prog="65"/>
+ <Patch name="SessionNylon" hbank="84" lbank="0" prog="66"/>
+ <Patch name="Solo Nylon 1" hbank="84" lbank="0" prog="67"/>
+ <Patch name="Solo Nylon 2" hbank="84" lbank="0" prog="68"/>
+ <Patch name="Nylon + Str" hbank="84" lbank="0" prog="69"/>
+ <Patch name="Nylon + Flt" hbank="84" lbank="0" prog="70"/>
+ <Patch name="Nylon Chord" hbank="84" lbank="0" prog="71"/>
+ <Patch name="Stratar" hbank="84" lbank="0" prog="72"/>
+ <Patch name="Clean Tele" hbank="84" lbank="0" prog="73"/>
+ <Patch name="Nashville" hbank="84" lbank="0" prog="74"/>
+ <Patch name="Super Trem" hbank="84" lbank="0" prog="75"/>
+ <Patch name="SpaghettiGtr" hbank="84" lbank="0" prog="76"/>
+ <Patch name="Duanne'sTone" hbank="84" lbank="0" prog="77"/>
+ <Patch name="Big Hair Ld" hbank="84" lbank="0" prog="78"/>
+ <Patch name="Metal Solo" hbank="84" lbank="0" prog="79"/>
+ <Patch name="Crunch Tone" hbank="84" lbank="0" prog="80"/>
+ <Patch name="Overdriven" hbank="84" lbank="0" prog="81"/>
+ <Patch name="Blues Tele" hbank="84" lbank="0" prog="82"/>
+ <Patch name="Tube Double" hbank="84" lbank="0" prog="83"/>
+ <Patch name="Neil's Rust" hbank="84" lbank="0" prog="84"/>
+ <Patch name="Short Crunch" hbank="84" lbank="0" prog="85"/>
+ <Patch name="X-Fade Metal" hbank="84" lbank="0" prog="86"/>
+ <Patch name="Velo Power" hbank="84" lbank="0" prog="87"/>
+ <Patch name="Phazy Chunk" hbank="84" lbank="0" prog="88"/>
+ <Patch name="Reso Tele" hbank="84" lbank="0" prog="89"/>
+ <Patch name="Wah Wah BPM" hbank="84" lbank="0" prog="90"/>
+ <Patch name="Rock P. Bass 1" hbank="84" lbank="0" prog="91"/>
+ <Patch name="Rock P. Bass 2" hbank="84" lbank="0" prog="92"/>
+ <Patch name="Rock P. Bass 3" hbank="84" lbank="0" prog="93"/>
+ <Patch name="Big Jazz Bs" hbank="84" lbank="0" prog="94"/>
+ <Patch name="BriteJazz Bs" hbank="84" lbank="0" prog="95"/>
+ <Patch name="Ch. Jazz Bs" hbank="84" lbank="0" prog="96"/>
+ <Patch name="Mellow Jz Bs" hbank="84" lbank="0" prog="97"/>
+ <Patch name="Mute E. Bs" hbank="84" lbank="0" prog="98"/>
+ <Patch name="Octabahn Bs" hbank="84" lbank="0" prog="99"/>
+ <Patch name="Slobbery Bs" hbank="84" lbank="0" prog="100"/>
+ <Patch name="Phase Worm" hbank="84" lbank="0" prog="101"/>
+ <Patch name="Euro Rave Bs" hbank="84" lbank="0" prog="102"/>
+ <Patch name="Pumpin' Bs" hbank="84" lbank="0" prog="103"/>
+ <Patch name="Tech NoBase" hbank="84" lbank="0" prog="104"/>
+ <Patch name="Bad Acid Bs" hbank="84" lbank="0" prog="105"/>
+ <Patch name="CheepEcho Bs" hbank="84" lbank="0" prog="106"/>
+ <Patch name="Manic Bs" hbank="84" lbank="0" prog="107"/>
+ <Patch name="JP6 Sqr Key" hbank="84" lbank="0" prog="108"/>
+ <Patch name="Square Drops" hbank="84" lbank="0" prog="109"/>
+ <Patch name="Celestial" hbank="84" lbank="0" prog="110"/>
+ <Patch name="Heavenly Eko" hbank="84" lbank="0" prog="111"/>
+ <Patch name="JD-800 Nomad" hbank="84" lbank="0" prog="112"/>
+ <Patch name="Vibrolater" hbank="84" lbank="0" prog="113"/>
+ <Patch name="MartianChime" hbank="84" lbank="0" prog="114"/>
+ <Patch name="Big Wet Blip" hbank="84" lbank="0" prog="115"/>
+ <Patch name="Amazing Echo" hbank="84" lbank="0" prog="116"/>
+ <Patch name="DelaySession" hbank="84" lbank="0" prog="117"/>
+ <Patch name="Deletex" hbank="84" lbank="0" prog="118"/>
+ <Patch name="Tarlia" hbank="84" lbank="0" prog="119"/>
+ <Patch name="Mahoroba" hbank="84" lbank="0" prog="120"/>
+ <Patch name="Eurotek Clav" hbank="84" lbank="0" prog="121"/>
+ <Patch name="Dope Resoclv" hbank="84" lbank="0" prog="122"/>
+ <Patch name="Tekno Juno" hbank="84" lbank="0" prog="123"/>
+ <Patch name="Buzzzzzzzzzz" hbank="84" lbank="0" prog="124"/>
+ <Patch name="Slop-a-rama" hbank="84" lbank="0" prog="125"/>
+ <Patch name="Isn't Pretty" hbank="84" lbank="0" prog="126"/>
+ <Patch name="Polywasp" hbank="84" lbank="0" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="XP-A, part 2">
+ <Patch name="Quixelate" hbank="84" lbank="1" prog="0"/>
+ <Patch name="Trangoa Wave" hbank="84" lbank="1" prog="1"/>
+ <Patch name="Spiked Cheez" hbank="84" lbank="1" prog="2"/>
+ <Patch name="Glassy Cheez" hbank="84" lbank="1" prog="3"/>
+ <Patch name="Super 808Cow" hbank="84" lbank="1" prog="4"/>
+ <Patch name="Arpeggiatoid" hbank="84" lbank="1" prog="5"/>
+ <Patch name="Euro Hit 1" hbank="84" lbank="1" prog="6"/>
+ <Patch name="Euro Hit 2" hbank="84" lbank="1" prog="7"/>
+ <Patch name="Rave Slice" hbank="84" lbank="1" prog="8"/>
+ <Patch name="Str Torture" hbank="84" lbank="1" prog="9"/>
+ <Patch name="Juno Harpsi" hbank="84" lbank="1" prog="10"/>
+ <Patch name="Big Mess Pad" hbank="84" lbank="1" prog="11"/>
+ <Patch name="Harpsichoir" hbank="84" lbank="1" prog="12"/>
+ <Patch name="Echo Juno" hbank="84" lbank="1" prog="13"/>
+ <Patch name="PhazeRave" hbank="84" lbank="1" prog="14"/>
+ <Patch name="DanceStack 1" hbank="84" lbank="1" prog="15"/>
+ <Patch name="DanceStack 2" hbank="84" lbank="1" prog="16"/>
+ <Patch name="DanceStack 3" hbank="84" lbank="1" prog="17"/>
+ <Patch name="DanceStack 4" hbank="84" lbank="1" prog="18"/>
+ <Patch name="DanceStack 5" hbank="84" lbank="1" prog="19"/>
+ <Patch name="DanceStack 6" hbank="84" lbank="1" prog="20"/>
+ <Patch name="DanceStack 7" hbank="84" lbank="1" prog="21"/>
+ <Patch name="DanceStack 8" hbank="84" lbank="1" prog="22"/>
+ <Patch name="Eurotek Brs" hbank="84" lbank="1" prog="23"/>
+ <Patch name="Synergy Brs" hbank="84" lbank="1" prog="24"/>
+ <Patch name="PortaSynthex" hbank="84" lbank="1" prog="25"/>
+ <Patch name="Razor VCOs" hbank="84" lbank="1" prog="26"/>
+ <Patch name="Big PWM" hbank="84" lbank="1" prog="27"/>
+ <Patch name="Flutey Stack" hbank="84" lbank="1" prog="28"/>
+ <Patch name="Wobbly 5th" hbank="84" lbank="1" prog="29"/>
+ <Patch name="Tekno Square" hbank="84" lbank="1" prog="30"/>
+ <Patch name="Trance VoXxX" hbank="84" lbank="1" prog="31"/>
+ <Patch name="Random Rave" hbank="84" lbank="1" prog="32"/>
+ <Patch name="Raver Circus" hbank="84" lbank="1" prog="33"/>
+ <Patch name="Resorave" hbank="84" lbank="1" prog="34"/>
+ <Patch name="Flangomatic" hbank="84" lbank="1" prog="35"/>
+ <Patch name="O-Zu-Nu" hbank="84" lbank="1" prog="36"/>
+ <Patch name="Sub Divided" hbank="84" lbank="1" prog="37"/>
+ <Patch name="Ancient Sqr" hbank="84" lbank="1" prog="38"/>
+ <Patch name="Fat Flange" hbank="84" lbank="1" prog="39"/>
+ <Patch name="Phaze NRG" hbank="84" lbank="1" prog="40"/>
+ <Patch name="Phase Vox" hbank="84" lbank="1" prog="41"/>
+ <Patch name="Systekno" hbank="84" lbank="1" prog="42"/>
+ <Patch name="On The Move!" hbank="84" lbank="1" prog="43"/>
+ <Patch name="XP'ration" hbank="84" lbank="1" prog="44"/>
+ <Patch name="Big Ensemble" hbank="84" lbank="1" prog="45"/>
+ <Patch name="Lazerette" hbank="84" lbank="1" prog="46"/>
+ <Patch name="Fazed String" hbank="84" lbank="1" prog="47"/>
+ <Patch name="Combing Slow" hbank="84" lbank="1" prog="48"/>
+ <Patch name="Jet Stack" hbank="84" lbank="1" prog="49"/>
+ <Patch name="Phazeslopad" hbank="84" lbank="1" prog="50"/>
+ <Patch name="Rize Mass" hbank="84" lbank="1" prog="51"/>
+ <Patch name="Portent" hbank="84" lbank="1" prog="52"/>
+ <Patch name="DCO Sweeper" hbank="84" lbank="1" prog="53"/>
+ <Patch name="Sweep Rain" hbank="84" lbank="1" prog="54"/>
+ <Patch name="Sweep Stack" hbank="84" lbank="1" prog="55"/>
+ <Patch name="Big Vectors" hbank="84" lbank="1" prog="56"/>
+ <Patch name="Poly Swell" hbank="84" lbank="1" prog="57"/>
+ <Patch name="Alchemy" hbank="84" lbank="1" prog="58"/>
+ <Patch name="Soli-na" hbank="84" lbank="1" prog="59"/>
+ <Patch name="90s Str mach" hbank="84" lbank="1" prog="60"/>
+ <Patch name="Ultra Cheez" hbank="84" lbank="1" prog="61"/>
+ <Patch name="Juno-60 Pad" hbank="84" lbank="1" prog="62"/>
+ <Patch name="Progressive" hbank="84" lbank="1" prog="63"/>
+ <Patch name="Build-up Syn" hbank="84" lbank="1" prog="64"/>
+ <Patch name="Atlantis 2" hbank="84" lbank="1" prog="65"/>
+ <Patch name="Perelandra" hbank="84" lbank="1" prog="66"/>
+ <Patch name="Plutonium" hbank="84" lbank="1" prog="67"/>
+ <Patch name="Nautilus" hbank="84" lbank="1" prog="68"/>
+ <Patch name="Metal Dreams" hbank="84" lbank="1" prog="69"/>
+ <Patch name="Glass Clouds" hbank="84" lbank="1" prog="70"/>
+ <Patch name="Harmonicloud" hbank="84" lbank="1" prog="71"/>
+ <Patch name="Shining Veil" hbank="84" lbank="1" prog="72"/>
+ <Patch name="Ethereal JX" hbank="84" lbank="1" prog="73"/>
+ <Patch name="Striking 5th" hbank="84" lbank="1" prog="74"/>
+ <Patch name="Meow 5ths" hbank="84" lbank="1" prog="75"/>
+ <Patch name="Stepflanger" hbank="84" lbank="1" prog="76"/>
+ <Patch name="Happy LFOs" hbank="84" lbank="1" prog="77"/>
+ <Patch name="Aero Insect" hbank="84" lbank="1" prog="78"/>
+ <Patch name="Beat Sweeper" hbank="84" lbank="1" prog="79"/>
+ <Patch name="Wormy Lead" hbank="84" lbank="1" prog="80"/>
+ <Patch name="Atmo Lead" hbank="84" lbank="1" prog="81"/>
+ <Patch name="Caliolead" hbank="84" lbank="1" prog="82"/>
+ <Patch name="Tweedles" hbank="84" lbank="1" prog="83"/>
+ <Patch name="Raw PWM" hbank="84" lbank="1" prog="84"/>
+ <Patch name="Voc Solo 5th" hbank="84" lbank="1" prog="85"/>
+ <Patch name="Dirty Lead" hbank="84" lbank="1" prog="86"/>
+ <Patch name="Boostweeper1" hbank="84" lbank="1" prog="87"/>
+ <Patch name="Boostweeper2" hbank="84" lbank="1" prog="88"/>
+ <Patch name="B3 Filth" hbank="84" lbank="1" prog="89"/>
+ <Patch name="Phazed Organ" hbank="84" lbank="1" prog="90"/>
+ <Patch name="VSw Vibrafon" hbank="84" lbank="1" prog="91"/>
+ <Patch name="SA Vibe" hbank="84" lbank="1" prog="92"/>
+ <Patch name="Rich Vibes" hbank="84" lbank="1" prog="93"/>
+ <Patch name="SpaceGamelan" hbank="84" lbank="1" prog="94"/>
+ <Patch name="Toy Vibe" hbank="84" lbank="1" prog="95"/>
+ <Patch name="Analog Bomb" hbank="84" lbank="1" prog="96"/>
+ <Patch name="Seashore 2" hbank="84" lbank="1" prog="97"/>
+ <Patch name="Creation" hbank="84" lbank="1" prog="98"/>
+ <Patch name="Cyberjunkie" hbank="84" lbank="1" prog="99"/>
+ <Patch name="Sci-Fi Bells" hbank="84" lbank="1" prog="100"/>
+ <Patch name="Shine on" hbank="84" lbank="1" prog="101"/>
+ <Patch name="DEMO Piano1" hbank="84" lbank="1" prog="102"/>
+ <Patch name="DEMO Piano2" hbank="84" lbank="1" prog="103"/>
+ <Patch name="DEMO Pnovox" hbank="84" lbank="1" prog="104"/>
+ <Patch name="DEMO Str 1" hbank="84" lbank="1" prog="105"/>
+ <Patch name="DEMO Str 2" hbank="84" lbank="1" prog="106"/>
+ <Patch name="DEMO Str 3" hbank="84" lbank="1" prog="107"/>
+ <Patch name="DEMO Synpuls" hbank="84" lbank="1" prog="108"/>
+ <Patch name="DEMO 5thPad" hbank="84" lbank="1" prog="109"/>
+ <Patch name="DEMO Choir" hbank="84" lbank="1" prog="110"/>
+ <Patch name="DEMO Brass" hbank="84" lbank="1" prog="111"/>
+ <Patch name="DEMO Tenor" hbank="84" lbank="1" prog="112"/>
+ <Patch name="DEMO Tpt" hbank="84" lbank="1" prog="113"/>
+ <Patch name="DEMO Flute" hbank="84" lbank="1" prog="114"/>
+ <Patch name="DEMO Nylon" hbank="84" lbank="1" prog="115"/>
+ <Patch name="DEMO PhaseGt" hbank="84" lbank="1" prog="116"/>
+ <Patch name="DEMO DistGt1" hbank="84" lbank="1" prog="117"/>
+ <Patch name="DEMO DistGt2" hbank="84" lbank="1" prog="118"/>
+ <Patch name="DEMO Strat" hbank="84" lbank="1" prog="119"/>
+ <Patch name="DEMO SlapBs" hbank="84" lbank="1" prog="120"/>
+ <Patch name="DEMO P. Bass" hbank="84" lbank="1" prog="121"/>
+ <Patch name="DEMO SynBs" hbank="84" lbank="1" prog="122"/>
+ <Patch name="DEMO SynLead" hbank="84" lbank="1" prog="123"/>
+ <Patch name="DEMO Insect" hbank="84" lbank="1" prog="124"/>
+ <Patch name="DEMO Buzzzz" hbank="84" lbank="1" prog="125"/>
+ <Patch name="DEMO Crowd" hbank="84" lbank="1" prog="126"/>
+ </PatchGroup>
+ <PatchGroup name="XP-B, part 1">
+ <Patch name="Warm Violins" hbank="84" lbank="2" prog="0"/>
+ <Patch name="Slow Vlns 1" hbank="84" lbank="2" prog="1"/>
+ <Patch name="Vlns+Vlas 1" hbank="84" lbank="2" prog="2"/>
+ <Patch name="Vl Sect mono" hbank="84" lbank="2" prog="3"/>
+ <Patch name="Arco Violins" hbank="84" lbank="2" prog="4"/>
+ <Patch name="Marcato Vls1" hbank="84" lbank="2" prog="5"/>
+ <Patch name="Vlns_Vlas 2" hbank="84" lbank="2" prog="6"/>
+ <Patch name="Agitato Vls" hbank="84" lbank="2" prog="7"/>
+ <Patch name="Rosin Pad 1" hbank="84" lbank="2" prog="8"/>
+ <Patch name="Dry Mid - High" hbank="84" lbank="2" prog="9"/>
+ <Patch name="Natural Vlns" hbank="84" lbank="2" prog="10"/>
+ <Patch name="Sad Vln Sect" hbank="84" lbank="2" prog="11"/>
+ <Patch name="Marcato Vas" hbank="84" lbank="2" prog="12"/>
+ <Patch name="Arco Violas" hbank="84" lbank="2" prog="13"/>
+ <Patch name="Thick Violas" hbank="84" lbank="2" prog="14"/>
+ <Patch name="Va Sect f" hbank="84" lbank="2" prog="15"/>
+ <Patch name="Va Small Sec" hbank="84" lbank="2" prog="16"/>
+ <Patch name="Agitato Vas 1" hbank="84" lbank="2" prog="17"/>
+ <Patch name="Sad Violas" hbank="84" lbank="2" prog="18"/>
+ <Patch name="fast Cellos1" hbank="84" lbank="2" prog="19"/>
+ <Patch name="Vcs Legato 1" hbank="84" lbank="2" prog="20"/>
+ <Patch name="Marcato Vcs1" hbank="84" lbank="2" prog="21"/>
+ <Patch name="Small Vc Sec" hbank="84" lbank="2" prog="22"/>
+ <Patch name="Agitato Vcs1" hbank="84" lbank="2" prog="23"/>
+ <Patch name="Small Cellos" hbank="84" lbank="2" prog="24"/>
+ <Patch name="Sad CelloSec" hbank="84" lbank="2" prog="25"/>
+ <Patch name="Cb Sect ff" hbank="84" lbank="2" prog="26"/>
+ <Patch name="Wide Basses" hbank="84" lbank="2" prog="27"/>
+ <Patch name="mf Basses" hbank="84" lbank="2" prog="28"/>
+ <Patch name="Agitato Cbs1" hbank="84" lbank="2" prog="29"/>
+ <Patch name="Vcs+Cbs" hbank="84" lbank="2" prog="30"/>
+ <Patch name="2 Basses" hbank="84" lbank="2" prog="31"/>
+ <Patch name="Euro Strings" hbank="84" lbank="2" prog="32"/>
+ <Patch name="Rich Strings" hbank="84" lbank="2" prog="33"/>
+ <Patch name="Multi Strs 1" hbank="84" lbank="2" prog="34"/>
+ <Patch name="VlsVasVcsCbs" hbank="84" lbank="2" prog="35"/>
+ <Patch name="Bright Strs" hbank="84" lbank="2" prog="36"/>
+ <Patch name="Classic Str" hbank="84" lbank="2" prog="37"/>
+ <Patch name="Full Strings" hbank="84" lbank="2" prog="38"/>
+ <Patch name="Med Str Sec" hbank="84" lbank="2" prog="39"/>
+ <Patch name="Small Strings" hbank="84" lbank="2" prog="40"/>
+ <Patch name="Strings Arco" hbank="84" lbank="2" prog="41"/>
+ <Patch name="Vivace Strs" hbank="84" lbank="2" prog="42"/>
+ <Patch name="Agitato STR1" hbank="84" lbank="2" prog="43"/>
+ <Patch name="LowSTR Attak" hbank="84" lbank="2" prog="44"/>
+ <Patch name="Bad Guy Str" hbank="84" lbank="2" prog="45"/>
+ <Patch name="Ominus" hbank="84" lbank="2" prog="46"/>
+ <Patch name="Lo Express" hbank="84" lbank="2" prog="47"/>
+ <Patch name="DramaStrings" hbank="84" lbank="2" prog="48"/>
+ <Patch name="Solo Vln 1" hbank="84" lbank="2" prog="49"/>
+ <Patch name="Solo Vln 2" hbank="84" lbank="2" prog="50"/>
+ <Patch name="Chorus Vln" hbank="84" lbank="2" prog="51"/>
+ <Patch name="Stereo Vln" hbank="84" lbank="2" prog="52"/>
+ <Patch name="Agitato Vln 1" hbank="84" lbank="2" prog="53"/>
+ <Patch name="Solo Vla 1" hbank="84" lbank="2" prog="54"/>
+ <Patch name="Solo Vla 2" hbank="84" lbank="2" prog="55"/>
+ <Patch name="Chorus Viola" hbank="84" lbank="2" prog="56"/>
+ <Patch name="Stereo Viola" hbank="84" lbank="2" prog="57"/>
+ <Patch name="Agitato Vla" hbank="84" lbank="2" prog="58"/>
+ <Patch name="Solo Vc 1" hbank="84" lbank="2" prog="59"/>
+ <Patch name="Solo Vc 2" hbank="84" lbank="2" prog="60"/>
+ <Patch name="Stereo Cello" hbank="84" lbank="2" prog="61"/>
+ <Patch name="Chorus Cello" hbank="84" lbank="2" prog="62"/>
+ <Patch name="Marcato Vc 1" hbank="84" lbank="2" prog="63"/>
+ <Patch name="Solo Cb 1" hbank="84" lbank="2" prog="64"/>
+ <Patch name="Solo Cb 2" hbank="84" lbank="2" prog="65"/>
+ <Patch name="Marcato Cb 1" hbank="84" lbank="2" prog="66"/>
+ <Patch name="Chamber Ens 1" hbank="84" lbank="2" prog="67"/>
+ <Patch name="Chamber Ens 2" hbank="84" lbank="2" prog="68"/>
+ <Patch name="Vln+Vla Dble" hbank="84" lbank="2" prog="69"/>
+ <Patch name="Vln+Vla Dbl1" hbank="84" lbank="2" prog="70"/>
+ <Patch name="Vla+Vc Dbl2" hbank="84" lbank="2" prog="71"/>
+ <Patch name="Vla+Vc Dble" hbank="84" lbank="2" prog="72"/>
+ <Patch name="Pizzicato 1" hbank="84" lbank="2" prog="73"/>
+ <Patch name="Mono Pizz" hbank="84" lbank="2" prog="74"/>
+ <Patch name="Pizzicato 2" hbank="84" lbank="2" prog="75"/>
+ <Patch name="Room Pizz" hbank="84" lbank="2" prog="76"/>
+ <Patch name="Hall Pizz" hbank="84" lbank="2" prog="77"/>
+ <Patch name="Tight Pizz" hbank="84" lbank="2" prog="78"/>
+ <Patch name="Short Pizz" hbank="84" lbank="2" prog="79"/>
+ <Patch name="Str Marcato1" hbank="84" lbank="2" prog="80"/>
+ <Patch name="Oct Marcarto" hbank="84" lbank="2" prog="81"/>
+ <Patch name="Lower marc!!" hbank="84" lbank="2" prog="82"/>
+ <Patch name="Big Marc!" hbank="84" lbank="2" prog="83"/>
+ <Patch name="STR Spiccato" hbank="84" lbank="2" prog="84"/>
+ <Patch name="fast Attacks" hbank="84" lbank="2" prog="85"/>
+ <Patch name="Flute" hbank="84" lbank="2" prog="86"/>
+ <Patch name="Flute V-Sw" hbank="84" lbank="2" prog="87"/>
+ <Patch name="Piccolo" hbank="84" lbank="2" prog="88"/>
+ <Patch name="Piccolo Flt" hbank="84" lbank="2" prog="89"/>
+ <Patch name="Recorder" hbank="84" lbank="2" prog="90"/>
+ <Patch name="Oboe1" hbank="84" lbank="2" prog="91"/>
+ <Patch name="Oboe2" hbank="84" lbank="2" prog="92"/>
+ <Patch name="Oboe3" hbank="84" lbank="2" prog="93"/>
+ <Patch name="Oboe4" hbank="84" lbank="2" prog="94"/>
+ <Patch name="Oboe5" hbank="84" lbank="2" prog="95"/>
+ <Patch name="English Hrn1" hbank="84" lbank="2" prog="96"/>
+ <Patch name="English Hrn2" hbank="84" lbank="2" prog="97"/>
+ <Patch name="English Hrn3" hbank="84" lbank="2" prog="98"/>
+ <Patch name="Bassoon 1" hbank="84" lbank="2" prog="99"/>
+ <Patch name="Bassoon 2" hbank="84" lbank="2" prog="100"/>
+ <Patch name="Clarinet 1" hbank="84" lbank="2" prog="101"/>
+ <Patch name="Clarinet 2" hbank="84" lbank="2" prog="102"/>
+ <Patch name="Bs Clrinet 1" hbank="84" lbank="2" prog="103"/>
+ <Patch name="Bs Clarinet 2" hbank="84" lbank="2" prog="104"/>
+ <Patch name="Trumpet 1" hbank="84" lbank="2" prog="105"/>
+ <Patch name="Trumpet 2" hbank="84" lbank="2" prog="106"/>
+ <Patch name="Trumpet 3" hbank="84" lbank="2" prog="107"/>
+ <Patch name="Flugel Horn1" hbank="84" lbank="2" prog="108"/>
+ <Patch name="Flugel Horn2" hbank="84" lbank="2" prog="109"/>
+ <Patch name="Cornet 1" hbank="84" lbank="2" prog="110"/>
+ <Patch name="Cornet 2" hbank="84" lbank="2" prog="111"/>
+ <Patch name="Solo Tb 1" hbank="84" lbank="2" prog="112"/>
+ <Patch name="Solo Tb 2" hbank="84" lbank="2" prog="113"/>
+ <Patch name="Solo Tb 3" hbank="84" lbank="2" prog="114"/>
+ <Patch name="Solo Tb 4" hbank="84" lbank="2" prog="115"/>
+ <Patch name="Bs Tb 1" hbank="84" lbank="2" prog="116"/>
+ <Patch name="Bs Tb 2" hbank="84" lbank="2" prog="117"/>
+ <Patch name="Harmon Mute1" hbank="84" lbank="2" prog="118"/>
+ <Patch name="Harmon Mute2" hbank="84" lbank="2" prog="119"/>
+ <Patch name="Tuba 1" hbank="84" lbank="2" prog="120"/>
+ <Patch name="Tuba 2" hbank="84" lbank="2" prog="121"/>
+ <Patch name="Solo F.Horn1" hbank="84" lbank="2" prog="122"/>
+ <Patch name="Solo F.Horn2" hbank="84" lbank="2" prog="123"/>
+ <Patch name="Sml F.Hrn Sc" hbank="84" lbank="2" prog="124"/>
+ <Patch name="Horn Sect 1" hbank="84" lbank="2" prog="125"/>
+ <Patch name="FHorn Sc x 4" hbank="84" lbank="2" prog="126"/>
+ <Patch name="Fr.Horn Sfz" hbank="84" lbank="2" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="XP-B, part 2">
+ <Patch name="F.Hrn Sect2" hbank="84" lbank="3" prog="0"/>
+ <Patch name="F.Hrn Sect3" hbank="84" lbank="3" prog="1"/>
+ <Patch name="F.Hrn Sect4" hbank="84" lbank="3" prog="2"/>
+ <Patch name="F.Hrn Sect5" hbank="84" lbank="3" prog="3"/>
+ <Patch name="F.Hrn Sect6" hbank="84" lbank="3" prog="4"/>
+ <Patch name="F.Hrn Sect7" hbank="84" lbank="3" prog="5"/>
+ <Patch name="F.Hrn Sect8" hbank="84" lbank="3" prog="6"/>
+ <Patch name="Mute Hrn Sect" hbank="84" lbank="3" prog="7"/>
+ <Patch name="Horn + Wood1" hbank="84" lbank="3" prog="8"/>
+ <Patch name="Horn + Wood2" hbank="84" lbank="3" prog="9"/>
+ <Patch name="Horn + Wood3" hbank="84" lbank="3" prog="10"/>
+ <Patch name="Wood Sect1" hbank="84" lbank="3" prog="11"/>
+ <Patch name="Wood Sect2" hbank="84" lbank="3" prog="12"/>
+ <Patch name="Wood Sect3" hbank="84" lbank="3" prog="13"/>
+ <Patch name="Wood Sect4" hbank="84" lbank="3" prog="14"/>
+ <Patch name="2 Oboes" hbank="84" lbank="3" prog="15"/>
+ <Patch name="Oboe + Clar" hbank="84" lbank="3" prog="16"/>
+ <Patch name="Flt + Piccl" hbank="84" lbank="3" prog="17"/>
+ <Patch name="Flute + Cla" hbank="84" lbank="3" prog="18"/>
+ <Patch name="Bassoon + FHrn" hbank="84" lbank="3" prog="19"/>
+ <Patch name="Hi Woodwinds" hbank="84" lbank="3" prog="20"/>
+ <Patch name="WoodwindsSplt" hbank="84" lbank="3" prog="21"/>
+ <Patch name="Multi Reed" hbank="84" lbank="3" prog="22"/>
+ <Patch name="4 Trombones" hbank="84" lbank="3" prog="23"/>
+ <Patch name="Tb Sect 1" hbank="84" lbank="3" prog="24"/>
+ <Patch name="Tb + Tp" hbank="84" lbank="3" prog="25"/>
+ <Patch name="4 trumpets" hbank="84" lbank="3" prog="26"/>
+ <Patch name="3 Trumpets" hbank="84" lbank="3" prog="27"/>
+ <Patch name="Brass ff1" hbank="84" lbank="3" prog="28"/>
+ <Patch name="Brass ff2" hbank="84" lbank="3" prog="29"/>
+ <Patch name="Brass ff3" hbank="84" lbank="3" prog="30"/>
+ <Patch name="McArthur Brs" hbank="84" lbank="3" prog="31"/>
+ <Patch name="Big Bones" hbank="84" lbank="3" prog="32"/>
+ <Patch name="BassBonesSect" hbank="84" lbank="3" prog="33"/>
+ <Patch name="Brass Swell1" hbank="84" lbank="3" prog="34"/>
+ <Patch name="Full Brs 1" hbank="84" lbank="3" prog="35"/>
+ <Patch name="Brass sect 1" hbank="84" lbank="3" prog="36"/>
+ <Patch name="Brass ens1" hbank="84" lbank="3" prog="37"/>
+ <Patch name="Brass ens2" hbank="84" lbank="3" prog="38"/>
+ <Patch name="Brass ens3" hbank="84" lbank="3" prog="39"/>
+ <Patch name="Brass ens4" hbank="84" lbank="3" prog="40"/>
+ <Patch name="Brass ens5" hbank="84" lbank="3" prog="41"/>
+ <Patch name="Brass ens6" hbank="84" lbank="3" prog="42"/>
+ <Patch name="Brass ens7" hbank="84" lbank="3" prog="43"/>
+ <Patch name="Brass ens8" hbank="84" lbank="3" prog="44"/>
+ <Patch name="Horn Strings" hbank="84" lbank="3" prog="45"/>
+ <Patch name="Full Orch1" hbank="84" lbank="3" prog="46"/>
+ <Patch name="Full Orch2" hbank="84" lbank="3" prog="47"/>
+ <Patch name="Full Orch3" hbank="84" lbank="3" prog="48"/>
+ <Patch name="Full Orch4" hbank="84" lbank="3" prog="49"/>
+ <Patch name="Maj Hit 2" hbank="84" lbank="3" prog="50"/>
+ <Patch name="Min Hit 1" hbank="84" lbank="3" prog="51"/>
+ <Patch name="Dim Hit 1" hbank="84" lbank="3" prog="52"/>
+ <Patch name="Major Stab!" hbank="84" lbank="3" prog="53"/>
+ <Patch name="Maj Hit 2" hbank="84" lbank="3" prog="54"/>
+ <Patch name="Min Hit 2" hbank="84" lbank="3" prog="55"/>
+ <Patch name="Classical Gt" hbank="84" lbank="3" prog="56"/>
+ <Patch name="Harp 1" hbank="84" lbank="3" prog="57"/>
+ <Patch name="Harp 2" hbank="84" lbank="3" prog="58"/>
+ <Patch name="Plucked Harp" hbank="84" lbank="3" prog="59"/>
+ <Patch name="Harp Strum MG" hbank="84" lbank="3" prog="60"/>
+ <Patch name="Harp Strum Min" hbank="84" lbank="3" prog="61"/>
+ <Patch name="Water Harp" hbank="84" lbank="3" prog="62"/>
+ <Patch name="ClassicalPno1" hbank="84" lbank="3" prog="63"/>
+ <Patch name="ClassicalPno2" hbank="84" lbank="3" prog="64"/>
+ <Patch name="ClassicalPno3" hbank="84" lbank="3" prog="65"/>
+ <Patch name="ClassicalPno4" hbank="84" lbank="3" prog="66"/>
+ <Patch name="Harpsichord1" hbank="84" lbank="3" prog="67"/>
+ <Patch name="Harpsichord2" hbank="84" lbank="3" prog="68"/>
+ <Patch name="Harpsichord3" hbank="84" lbank="3" prog="69"/>
+ <Patch name="Harpsichord4" hbank="84" lbank="3" prog="70"/>
+ <Patch name="Celesta1" hbank="84" lbank="3" prog="71"/>
+ <Patch name="Celesta2" hbank="84" lbank="3" prog="72"/>
+ <Patch name="Celesta3" hbank="84" lbank="3" prog="73"/>
+ <Patch name="Glockenleste" hbank="84" lbank="3" prog="74"/>
+ <Patch name="Marimba" hbank="84" lbank="3" prog="75"/>
+ <Patch name="Bass Marimba1" hbank="84" lbank="3" prog="76"/>
+ <Patch name="Bass Marimba2" hbank="84" lbank="3" prog="77"/>
+ <Patch name="Vibe" hbank="84" lbank="3" prog="78"/>
+ <Patch name="Xylophone 1" hbank="84" lbank="3" prog="79"/>
+ <Patch name="Xylophone 2" hbank="84" lbank="3" prog="80"/>
+ <Patch name="Xylophone 3" hbank="84" lbank="3" prog="81"/>
+ <Patch name="Glocken 1" hbank="84" lbank="3" prog="82"/>
+ <Patch name="Glocken 2" hbank="84" lbank="3" prog="83"/>
+ <Patch name="Church Bells1" hbank="84" lbank="3" prog="84"/>
+ <Patch name="Church Bells2" hbank="84" lbank="3" prog="85"/>
+ <Patch name="Church Bells3" hbank="84" lbank="3" prog="86"/>
+ <Patch name="Tubular Bells1" hbank="84" lbank="3" prog="87"/>
+ <Patch name="Tubular Bells2" hbank="84" lbank="3" prog="88"/>
+ <Patch name="Big Tubulars" hbank="84" lbank="3" prog="89"/>
+ <Patch name="Dawning!" hbank="84" lbank="3" prog="90"/>
+ <Patch name="MalletStack1" hbank="84" lbank="3" prog="91"/>
+ <Patch name="MalletStack2" hbank="84" lbank="3" prog="92"/>
+ <Patch name="MalletStack3" hbank="84" lbank="3" prog="93"/>
+ <Patch name="MalletStack4" hbank="84" lbank="3" prog="94"/>
+ <Patch name="MalletStack5" hbank="84" lbank="3" prog="95"/>
+ <Patch name="MalletStack6" hbank="84" lbank="3" prog="96"/>
+ <Patch name="MalletStack7" hbank="84" lbank="3" prog="97"/>
+ <Patch name="Choir 1" hbank="84" lbank="3" prog="98"/>
+ <Patch name="Choir 2" hbank="84" lbank="3" prog="99"/>
+ <Patch name="Snare Drum" hbank="84" lbank="3" prog="100"/>
+ <Patch name="Concert Snr1" hbank="84" lbank="3" prog="101"/>
+ <Patch name="Concert Snr2" hbank="84" lbank="3" prog="102"/>
+ <Patch name="Snr Roll" hbank="84" lbank="3" prog="103"/>
+ <Patch name="Concert BD 1" hbank="84" lbank="3" prog="104"/>
+ <Patch name="Concert Bd 2" hbank="84" lbank="3" prog="105"/>
+ <Patch name="Bd Roll" hbank="84" lbank="3" prog="106"/>
+ <Patch name="Timpani 1" hbank="84" lbank="3" prog="107"/>
+ <Patch name="Timpani 2" hbank="84" lbank="3" prog="108"/>
+ <Patch name="Timpani 3" hbank="84" lbank="3" prog="109"/>
+ <Patch name="Timpani 4" hbank="84" lbank="3" prog="110"/>
+ <Patch name="Tam Tam" hbank="84" lbank="3" prog="111"/>
+ <Patch name="Gong" hbank="84" lbank="3" prog="112"/>
+ <Patch name="Piatti!!" hbank="84" lbank="3" prog="113"/>
+ <Patch name="Sleigh Bells" hbank="84" lbank="3" prog="114"/>
+ <Patch name="Slap Stick" hbank="84" lbank="3" prog="115"/>
+ <Patch name="Wind Chimes 1" hbank="84" lbank="3" prog="116"/>
+ <Patch name="Wind Chimes 2" hbank="84" lbank="3" prog="117"/>
+ <Patch name="Tamborine" hbank="84" lbank="3" prog="118"/>
+ <Patch name="Castanets" hbank="84" lbank="3" prog="119"/>
+ <Patch name="RythmSet" hbank="84" lbank="3" prog="120"/>
+ <Patch name="Perc Hit 1" hbank="84" lbank="3" prog="121"/>
+ <Patch name="Perc Hit 2" hbank="84" lbank="3" prog="122"/>
+ <Patch name="Perc Hit 3" hbank="84" lbank="3" prog="123"/>
+ <Patch name="Presenting" hbank="84" lbank="3" prog="124"/>
+ <Patch name="Presto!" hbank="84" lbank="3" prog="125"/>
+ <Patch name="Christmas" hbank="84" lbank="3" prog="126"/>
+ </PatchGroup>
+ <PatchGroup name="XP-C, part 1">
+ <Patch name="Teknoperator (132)" hbank="84" lbank="4" prog="0"/>
+ <Patch name="Transmission (144)" hbank="84" lbank="4" prog="1"/>
+ <Patch name="X-Tronic Jam (120)" hbank="84" lbank="4" prog="2"/>
+ <Patch name="Dirt Jungle (160)" hbank="84" lbank="4" prog="3"/>
+ <Patch name="DJ Spinnin (151)" hbank="84" lbank="4" prog="4"/>
+ <Patch name="Zipper Beat (151)" hbank="84" lbank="4" prog="5"/>
+ <Patch name="Tribal House (151)" hbank="84" lbank="4" prog="6"/>
+ <Patch name="Obsession (144)" hbank="84" lbank="4" prog="7"/>
+ <Patch name="Sonic Empire (144)" hbank="84" lbank="4" prog="8"/>
+ <Patch name="Double Dutch (140)" hbank="84" lbank="4" prog="9"/>
+ <Patch name="E-tronicBoom (116)" hbank="84" lbank="4" prog="10"/>
+ <Patch name="Chillout =-&gt; (116)" hbank="84" lbank="4" prog="11"/>
+ <Patch name="MecaTrip-Hop (90)" hbank="84" lbank="4" prog="12"/>
+ <Patch name="Hero Beat (90)" hbank="84" lbank="4" prog="13"/>
+ <Patch name="Hit House (120)" hbank="84" lbank="4" prog="14"/>
+ <Patch name="Voco Groove (122)" hbank="84" lbank="4" prog="15"/>
+ <Patch name="Hell Fire (151)" hbank="84" lbank="4" prog="16"/>
+ <Patch name="Lo:BD Hi:HH(144)" hbank="84" lbank="4" prog="17"/>
+ <Patch name="Detroit+Perc (132)" hbank="84" lbank="4" prog="18"/>
+ <Patch name="Crossfader (120)" hbank="84" lbank="4" prog="19"/>
+ <Patch name="Soft &amp; Hard (120)" hbank="84" lbank="4" prog="20"/>
+ <Patch name="Space Shake (130)" hbank="84" lbank="4" prog="21"/>
+ <Patch name="Under Ether (85)" hbank="84" lbank="4" prog="22"/>
+ <Patch name="Confusion (147)" hbank="84" lbank="4" prog="23"/>
+ <Patch name="Amsterdamer (184)" hbank="84" lbank="4" prog="24"/>
+ <Patch name="House that? (120)" hbank="84" lbank="4" prog="25"/>
+ <Patch name="Phrase Menu" hbank="84" lbank="4" prog="26"/>
+ <Patch name="Cyber-Trance" hbank="84" lbank="4" prog="27"/>
+ <Patch name="Creator" hbank="84" lbank="4" prog="28"/>
+ <Patch name="Etherality" hbank="84" lbank="4" prog="29"/>
+ <Patch name="Unplugged" hbank="84" lbank="4" prog="30"/>
+ <Patch name="Acid Melt" hbank="84" lbank="4" prog="31"/>
+ <Patch name="Brain Waves" hbank="84" lbank="4" prog="32"/>
+ <Patch name="1Shot groove" hbank="84" lbank="4" prog="33"/>
+ <Patch name="FirstContact" hbank="84" lbank="4" prog="34"/>
+ <Patch name="Ambient S/H" hbank="84" lbank="4" prog="35"/>
+ <Patch name="Deep Machine" hbank="84" lbank="4" prog="36"/>
+ <Patch name="Big Blue" hbank="84" lbank="4" prog="37"/>
+ <Patch name="TeeBee V/Sw" hbank="84" lbank="4" prog="38"/>
+ <Patch name="303 Agressor" hbank="84" lbank="4" prog="39"/>
+ <Patch name="TB or not TB" hbank="84" lbank="4" prog="40"/>
+ <Patch name="HiLo303ModSw" hbank="84" lbank="4" prog="41"/>
+ <Patch name="2Square Bass" hbank="84" lbank="4" prog="42"/>
+ <Patch name="303 HollowBs" hbank="84" lbank="4" prog="43"/>
+ <Patch name="303 Bass" hbank="84" lbank="4" prog="44"/>
+ <Patch name="TB Saw Bass" hbank="84" lbank="4" prog="45"/>
+ <Patch name="303 Ow Bass" hbank="84" lbank="4" prog="46"/>
+ <Patch name="TB Square 1" hbank="84" lbank="4" prog="47"/>
+ <Patch name="TB Square 2" hbank="84" lbank="4" prog="48"/>
+ <Patch name="TB Square 3" hbank="84" lbank="4" prog="49"/>
+ <Patch name="Solid Bass 1" hbank="84" lbank="4" prog="50"/>
+ <Patch name="Solid Bass 2" hbank="84" lbank="4" prog="51"/>
+ <Patch name="FM Tube Bass" hbank="84" lbank="4" prog="52"/>
+ <Patch name="Drum'n'Bass" hbank="84" lbank="4" prog="53"/>
+ <Patch name="Sub Bass" hbank="84" lbank="4" prog="54"/>
+ <Patch name="Dirty Bass" hbank="84" lbank="4" prog="55"/>
+ <Patch name="Gate Me Buzz" hbank="84" lbank="4" prog="56"/>
+ <Patch name="Comprex Bass" hbank="84" lbank="4" prog="57"/>
+ <Patch name="Bass Invader" hbank="84" lbank="4" prog="58"/>
+ <Patch name="Ovdrive Bass" hbank="84" lbank="4" prog="59"/>
+ <Patch name="Housy Bella" hbank="84" lbank="4" prog="60"/>
+ <Patch name="Bassic Needs" hbank="84" lbank="4" prog="61"/>
+ <Patch name="Raver Bass 1" hbank="84" lbank="4" prog="62"/>
+ <Patch name="Raver Bass 2" hbank="84" lbank="4" prog="63"/>
+ <Patch name="Jericho Bass" hbank="84" lbank="4" prog="64"/>
+ <Patch name="Slippy Bass" hbank="84" lbank="4" prog="65"/>
+ <Patch name="Rise Bass" hbank="84" lbank="4" prog="66"/>
+ <Patch name="Cyber Bass" hbank="84" lbank="4" prog="67"/>
+ <Patch name="SH-2000 Bass" hbank="84" lbank="4" prog="68"/>
+ <Patch name="FM Bass" hbank="84" lbank="4" prog="69"/>
+ <Patch name="Razor Bass" hbank="84" lbank="4" prog="70"/>
+ <Patch name="SquelchyBass" hbank="84" lbank="4" prog="71"/>
+ <Patch name="RaversBass" hbank="84" lbank="4" prog="72"/>
+ <Patch name="Compu Bass" hbank="84" lbank="4" prog="73"/>
+ <Patch name="Jump Bass" hbank="84" lbank="4" prog="74"/>
+ <Patch name="VocoBass" hbank="84" lbank="4" prog="75"/>
+ <Patch name="Vocoder Menu" hbank="84" lbank="4" prog="76"/>
+ <Patch name="1.2.3.4. BPM" hbank="84" lbank="4" prog="77"/>
+ <Patch name="Teknmusic" hbank="84" lbank="4" prog="78"/>
+ <Patch name="Retrocoder" hbank="84" lbank="4" prog="79"/>
+ <Patch name="u/i/e/0 V/Sw" hbank="84" lbank="4" prog="80"/>
+ <Patch name="Talk Box 1" hbank="84" lbank="4" prog="81"/>
+ <Patch name="Talk Box 2" hbank="84" lbank="4" prog="82"/>
+ <Patch name="VT Vox" hbank="84" lbank="4" prog="83"/>
+ <Patch name="Artificial" hbank="84" lbank="4" prog="84"/>
+ <Patch name="Barivoise" hbank="84" lbank="4" prog="85"/>
+ <Patch name="After D !" hbank="84" lbank="4" prog="86"/>
+ <Patch name="ARPsychea" hbank="84" lbank="4" prog="87"/>
+ <Patch name="Vintage Call" hbank="84" lbank="4" prog="88"/>
+ <Patch name="HarmoChimer" hbank="84" lbank="4" prog="89"/>
+ <Patch name="Ring Bell" hbank="84" lbank="4" prog="90"/>
+ <Patch name="260 &amp; Juno" hbank="84" lbank="4" prog="91"/>
+ <Patch name="260 Midi" hbank="84" lbank="4" prog="92"/>
+ <Patch name="Squarekeys 2" hbank="84" lbank="4" prog="93"/>
+ <Patch name="Pure Sine" hbank="84" lbank="4" prog="94"/>
+ <Patch name="Ambient ORG" hbank="84" lbank="4" prog="95"/>
+ <Patch name="JX Planet" hbank="84" lbank="4" prog="96"/>
+ <Patch name="Clavi-Club" hbank="84" lbank="4" prog="97"/>
+ <Patch name="Sweep Clav 2" hbank="84" lbank="4" prog="98"/>
+ <Patch name="SquareTek" hbank="84" lbank="4" prog="99"/>
+ <Patch name="Retro Party" hbank="84" lbank="4" prog="100"/>
+ <Patch name="Rave Nature" hbank="84" lbank="4" prog="101"/>
+ <Patch name="Alias Square" hbank="84" lbank="4" prog="102"/>
+ <Patch name="Dirty Stack" hbank="84" lbank="4" prog="103"/>
+ <Patch name="Phenomena" hbank="84" lbank="4" prog="104"/>
+ <Patch name="Music Hi" hbank="84" lbank="4" prog="105"/>
+ <Patch name="Euro-Dance 1" hbank="84" lbank="4" prog="106"/>
+ <Patch name="Euro-Dance 2" hbank="84" lbank="4" prog="107"/>
+ <Patch name="Dance Stack" hbank="84" lbank="4" prog="108"/>
+ <Patch name="Raver Blade" hbank="84" lbank="4" prog="109"/>
+ <Patch name="White Gloves" hbank="84" lbank="4" prog="110"/>
+ <Patch name="Touchdown" hbank="84" lbank="4" prog="111"/>
+ <Patch name="Rave Station" hbank="84" lbank="4" prog="112"/>
+ <Patch name="Time Warp" hbank="84" lbank="4" prog="113"/>
+ <Patch name="Thin Rave" hbank="84" lbank="4" prog="114"/>
+ <Patch name="Igor Circus" hbank="84" lbank="4" prog="115"/>
+ <Patch name="Alpha Zone" hbank="84" lbank="4" prog="116"/>
+ <Patch name="Stars March" hbank="84" lbank="4" prog="117"/>
+ <Patch name="JP Velo-Saw" hbank="84" lbank="4" prog="118"/>
+ <Patch name="Rich Teeth" hbank="84" lbank="4" prog="119"/>
+ <Patch name="After Saw" hbank="84" lbank="4" prog="120"/>
+ <Patch name="Saw Cocktail" hbank="84" lbank="4" prog="121"/>
+ <Patch name="Poly Message" hbank="84" lbank="4" prog="122"/>
+ <Patch name="Xpressive" hbank="84" lbank="4" prog="123"/>
+ <Patch name="Earblower" hbank="84" lbank="4" prog="124"/>
+ <Patch name="Cutting Edge" hbank="84" lbank="4" prog="125"/>
+ <Patch name="Stalactica" hbank="84" lbank="4" prog="126"/>
+ <Patch name="LA Heaven" hbank="84" lbank="4" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="XP-C, part 2">
+ <Patch name="Euforia" hbank="84" lbank="5" prog="0"/>
+ <Patch name="Labo-Feedback" hbank="84" lbank="5" prog="1"/>
+ <Patch name="Banded Jupe" hbank="84" lbank="5" prog="2"/>
+ <Patch name="Killer Pad" hbank="84" lbank="5" prog="3"/>
+ <Patch name="Mystic Pad" hbank="84" lbank="5" prog="4"/>
+ <Patch name="D-Mention" hbank="84" lbank="5" prog="5"/>
+ <Patch name="X-Hale" hbank="84" lbank="5" prog="6"/>
+ <Patch name="Sirena" hbank="84" lbank="5" prog="7"/>
+ <Patch name="After's Pad" hbank="84" lbank="5" prog="8"/>
+ <Patch name="Warmer Pad" hbank="84" lbank="5" prog="9"/>
+ <Patch name="Phatt Pad" hbank="84" lbank="5" prog="10"/>
+ <Patch name="OB Sweep Pad" hbank="84" lbank="5" prog="11"/>
+ <Patch name="Murk Pad" hbank="84" lbank="5" prog="12"/>
+ <Patch name="Dense Floor" hbank="84" lbank="5" prog="13"/>
+ <Patch name="SecretMelody" hbank="84" lbank="5" prog="14"/>
+ <Patch name="Vaporish" hbank="84" lbank="5" prog="15"/>
+ <Patch name="Vintage Revo" hbank="84" lbank="5" prog="16"/>
+ <Patch name="Liquid Sky" hbank="84" lbank="5" prog="17"/>
+ <Patch name="Exploration" hbank="84" lbank="5" prog="18"/>
+ <Patch name="Drama Pad" hbank="84" lbank="5" prog="19"/>
+ <Patch name="Vapor Style" hbank="84" lbank="5" prog="20"/>
+ <Patch name="JP-6 Stack" hbank="84" lbank="5" prog="21"/>
+ <Patch name="Obilator" hbank="84" lbank="5" prog="22"/>
+ <Patch name="Glamour" hbank="84" lbank="5" prog="23"/>
+ <Patch name="Medium Solo" hbank="84" lbank="5" prog="24"/>
+ <Patch name="Singing'Mini" hbank="84" lbank="5" prog="25"/>
+ <Patch name="Analog Flute" hbank="84" lbank="5" prog="26"/>
+ <Patch name="SH-5 Bs/Lead" hbank="84" lbank="5" prog="27"/>
+ <Patch name="Classy Pulse" hbank="84" lbank="5" prog="28"/>
+ <Patch name="Jupiter-6 Ld" hbank="84" lbank="5" prog="29"/>
+ <Patch name="Just Lovely" hbank="84" lbank="5" prog="30"/>
+ <Patch name="DJ Devil" hbank="84" lbank="5" prog="31"/>
+ <Patch name="Simply June" hbank="84" lbank="5" prog="32"/>
+ <Patch name="Mr. Raw SAW" hbank="84" lbank="5" prog="33"/>
+ <Patch name="Crispy Lead" hbank="84" lbank="5" prog="34"/>
+ <Patch name="Dirty Lead 2" hbank="84" lbank="5" prog="35"/>
+ <Patch name="Disto Stack" hbank="84" lbank="5" prog="36"/>
+ <Patch name="Velo Cheez" hbank="84" lbank="5" prog="37"/>
+ <Patch name="Noiz Mania" hbank="84" lbank="5" prog="38"/>
+ <Patch name="Power Mutes" hbank="84" lbank="5" prog="39"/>
+ <Patch name="V-Beep" hbank="84" lbank="5" prog="40"/>
+ <Patch name="Freaky Fry" hbank="84" lbank="5" prog="41"/>
+ <Patch name="SQ Formule" hbank="84" lbank="5" prog="42"/>
+ <Patch name="DirtyOrgan 2" hbank="84" lbank="5" prog="43"/>
+ <Patch name="Oldies Organ" hbank="84" lbank="5" prog="44"/>
+ <Patch name="Edgy Organ" hbank="84" lbank="5" prog="45"/>
+ <Patch name="Juno Organ" hbank="84" lbank="5" prog="46"/>
+ <Patch name="Space Organ X" hbank="84" lbank="5" prog="47"/>
+ <Patch name="Cabin Organ" hbank="84" lbank="5" prog="48"/>
+ <Patch name="Dream Organ" hbank="84" lbank="5" prog="49"/>
+ <Patch name="Club Organ" hbank="84" lbank="5" prog="50"/>
+ <Patch name="Perc. Organ" hbank="84" lbank="5" prog="51"/>
+ <Patch name="Organ Stabs" hbank="84" lbank="5" prog="52"/>
+ <Patch name="Techno Pizz" hbank="84" lbank="5" prog="53"/>
+ <Patch name="Captain Pizz" hbank="84" lbank="5" prog="54"/>
+ <Patch name="Pizzatek" hbank="84" lbank="5" prog="55"/>
+ <Patch name="Sleepless" hbank="84" lbank="5" prog="56"/>
+ <Patch name="Mega 5th 2" hbank="84" lbank="5" prog="57"/>
+ <Patch name="Chord Maj7th" hbank="84" lbank="5" prog="58"/>
+ <Patch name="Chord Min7th" hbank="84" lbank="5" prog="59"/>
+ <Patch name="5thDimension" hbank="84" lbank="5" prog="60"/>
+ <Patch name="StateXLChord" hbank="84" lbank="5" prog="61"/>
+ <Patch name="Sixth Sense" hbank="84" lbank="5" prog="62"/>
+ <Patch name="Garage Chord" hbank="84" lbank="5" prog="63"/>
+ <Patch name="Chordmaj7/5-" hbank="84" lbank="5" prog="64"/>
+ <Patch name="Plane EKNO" hbank="84" lbank="5" prog="65"/>
+ <Patch name="Optimum Rave" hbank="84" lbank="5" prog="66"/>
+ <Patch name="Arpege Me" hbank="84" lbank="5" prog="67"/>
+ <Patch name="VTransformer" hbank="84" lbank="5" prog="68"/>
+ <Patch name="Analog attax" hbank="84" lbank="5" prog="69"/>
+ <Patch name="Maxi fuzzy !" hbank="84" lbank="5" prog="70"/>
+ <Patch name="Only By FXM" hbank="84" lbank="5" prog="71"/>
+ <Patch name="Hit &amp; Run" hbank="84" lbank="5" prog="72"/>
+ <Patch name="Photon Attak" hbank="84" lbank="5" prog="73"/>
+ <Patch name="Predator" hbank="84" lbank="5" prog="74"/>
+ <Patch name="Village Hit" hbank="84" lbank="5" prog="75"/>
+ <Patch name="Hardcore Hit" hbank="84" lbank="5" prog="76"/>
+ <Patch name="Short Chord" hbank="84" lbank="5" prog="77"/>
+ <Patch name="ShortCircuit" hbank="84" lbank="5" prog="78"/>
+ <Patch name="SonofaPitch" hbank="84" lbank="5" prog="79"/>
+ <Patch name="Flutish SQUR" hbank="84" lbank="5" prog="80"/>
+ <Patch name="FazzyCow 808" hbank="84" lbank="5" prog="81"/>
+ <Patch name="Blurpy" hbank="84" lbank="5" prog="82"/>
+ <Patch name="Static Hit" hbank="84" lbank="5" prog="83"/>
+ <Patch name="HiAttack" hbank="84" lbank="5" prog="84"/>
+ <Patch name="TonalTension" hbank="84" lbank="5" prog="85"/>
+ <Patch name="Jungle Stabs" hbank="84" lbank="5" prog="86"/>
+ <Patch name="Buzz Machine" hbank="84" lbank="5" prog="87"/>
+ <Patch name="Zapper" hbank="84" lbank="5" prog="88"/>
+ <Patch name="Blip" hbank="84" lbank="5" prog="89"/>
+ <Patch name="Iron Hit" hbank="84" lbank="5" prog="90"/>
+ <Patch name="Headz Direct" hbank="84" lbank="5" prog="91"/>
+ <Patch name="Scratchy Hit" hbank="84" lbank="5" prog="92"/>
+ <Patch name="Hit&amp;IndsMenu" hbank="84" lbank="5" prog="93"/>
+ <Patch name="GTR FX Menu" hbank="84" lbank="5" prog="94"/>
+ <Patch name="GTR Power 1" hbank="84" lbank="5" prog="95"/>
+ <Patch name="GTR Power 2" hbank="84" lbank="5" prog="96"/>
+ <Patch name="Snr Menu 1" hbank="84" lbank="5" prog="97"/>
+ <Patch name="Snr Menu 2" hbank="84" lbank="5" prog="98"/>
+ <Patch name="Kick Menu" hbank="84" lbank="5" prog="99"/>
+ <Patch name="Hi Hat Menu" hbank="84" lbank="5" prog="100"/>
+ <Patch name="Perc Menu" hbank="84" lbank="5" prog="101"/>
+ <Patch name="Tom&amp;Cym Menu" hbank="84" lbank="5" prog="102"/>
+ <Patch name="Metal Dream" hbank="84" lbank="5" prog="103"/>
+ <Patch name="System D" hbank="84" lbank="5" prog="104"/>
+ <Patch name="Mayday Ring" hbank="84" lbank="5" prog="105"/>
+ <Patch name="Industrial" hbank="84" lbank="5" prog="106"/>
+ <Patch name="Tranceporter" hbank="84" lbank="5" prog="107"/>
+ <Patch name="Acid Copter" hbank="84" lbank="5" prog="108"/>
+ <Patch name="Roll Over" hbank="84" lbank="5" prog="109"/>
+ <Patch name="Gimme aBreak" hbank="84" lbank="5" prog="110"/>
+ <Patch name="RadicalAbuse" hbank="84" lbank="5" prog="111"/>
+ <Patch name="Echodrome" hbank="84" lbank="5" prog="112"/>
+ <Patch name="Trance Chime" hbank="84" lbank="5" prog="113"/>
+ <Patch name="Altamira" hbank="84" lbank="5" prog="114"/>
+ <Patch name="Locko Motif" hbank="84" lbank="5" prog="115"/>
+ <Patch name="SpaceFactory" hbank="84" lbank="5" prog="116"/>
+ <Patch name="Get Busy" hbank="84" lbank="5" prog="117"/>
+ <Patch name="Ayers Rock" hbank="84" lbank="5" prog="118"/>
+ <Patch name="Altern Saw" hbank="84" lbank="5" prog="119"/>
+ <Patch name="JP-6 Sync" hbank="84" lbank="5" prog="120"/>
+ <Patch name="Cold JX" hbank="84" lbank="5" prog="121"/>
+ <Patch name="Fancy Pad" hbank="84" lbank="5" prog="122"/>
+ <Patch name="Tune Breath" hbank="84" lbank="5" prog="123"/>
+ <Patch name="OrchestraGTR" hbank="84" lbank="5" prog="124"/>
+ <Patch name="Gtr Sweep" hbank="84" lbank="5" prog="125"/>
+ <Patch name="Trilly" hbank="84" lbank="5" prog="126"/>
+ <Patch name="Good Bye Spk" hbank="84" lbank="5" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="Rhytm (Ch 10 only)">
+ <Patch name="House Drum Set 1" hbank="80" lbank="0" prog="0"/>
+ <Patch name="Jazz Drum Set 1" hbank="80" lbank="0" prog="1"/>
+ <Patch name="Pop Drum Set 1" hbank="81" lbank="0" prog="0"/>
+ <Patch name="Pop Drum Set 2" hbank="81" lbank="0" prog="1"/>
+ <Patch name="Power Drum Set" hbank="81" lbank="1" prog="0"/>
+ <Patch name="Rave Drum Set" hbank="81" lbank="1" prog="1"/>
+ <Patch name="Jazz Drum Set 2" hbank="81" lbank="2" prog="0"/>
+ <Patch name="Orch Drum Set" hbank="81" lbank="2" prog="1"/>
+ <Patch name="GM Drum Set" hbank="81" lbank="3" prog="0"/>
+ <Patch name="Brush Drum Set" hbank="81" lbank="3" prog="1"/>
+ <Patch name="Power Drum Set 2" hbank="81" lbank="4" prog="0"/>
+ <Patch name="Power Rave Set" hbank="81" lbank="4" prog="1"/>
+ <Patch name="Session Set 1" hbank="84" lbank="0" prog="0"/>
+ <Patch name="Session Set 2" hbank="84" lbank="0" prog="1"/>
+ <Patch name="Session Set 3" hbank="84" lbank="0" prog="2"/>
+ <Patch name="Session Set 4" hbank="84" lbank="0" prog="3"/>
+ <Patch name="Session Set 5" hbank="84" lbank="0" prog="4"/>
+ <Patch name="Session Set 6" hbank="84" lbank="0" prog="5"/>
+ <Patch name="Session Set 7" hbank="84" lbank="0" prog="6"/>
+ <Patch name="Demo Drum" hbank="84" lbank="0" prog="7"/>
+ <Patch name="TR-909 Set" hbank="84" lbank="4" prog="0"/>
+ <Patch name="TR-808 Set" hbank="84" lbank="4" prog="1"/>
+ <Patch name="TR-606 Set" hbank="84" lbank="4" prog="2"/>
+ <Patch name="Techno Set" hbank="84" lbank="4" prog="3"/>
+ <Patch name="House Set" hbank="84" lbank="4" prog="4"/>
+ <Patch name="Jungle Set" hbank="84" lbank="4" prog="5"/>
+ <Patch name="Gabba Set 1" hbank="84" lbank="4" prog="6"/>
+ <Patch name="Industrial Set 1" hbank="84" lbank="4" prog="7"/>
+ </PatchGroup>
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/Roland_FantomXR.idf b/muse/share/instruments/Roland_FantomXR.idf
new file mode 100644
index 00000000..a63af792
--- /dev/null
+++ b/muse/share/instruments/Roland_FantomXR.idf
@@ -0,0 +1,1419 @@
+<?xml version="1.0"?>
+
+<muse version="1.0">
+
+<MidiInstrument name="Roland Fantom XR">
+
+<Init>
+</Init>
+
+ <PatchGroup name="GM2 Drum Kits">
+ <Patch name="GM2 STANDARD" mode="7" drum="1" hbank="120" lbank="0" prog="0"/>
+ <Patch name="GM2 ROOM" mode="7" drum="1" hbank="120" lbank="0" prog="8"/>
+ <Patch name="GM2 POWER" mode="7" drum="1" hbank="120" lbank="0" prog="16"/>
+ <Patch name="GM2 ELECTRIC" mode="7" drum="1" hbank="120" lbank="0" prog="24"/>
+ <Patch name="GM2 ANALOG" mode="7" drum="1" hbank="120" lbank="0" prog="25"/>
+ <Patch name="GM2 JAZZ" mode="7" drum="1" hbank="120" lbank="0" prog="32"/>
+ <Patch name="GM2 BRUSH" mode="7" drum="1" hbank="120" lbank="0" prog="40"/>
+ <Patch name="GM2 ORCHESTRA" mode="7" drum="1" hbank="120" lbank="0" prog="48"/>
+ <Patch name="GM2 SFX" mode="7" drum="1" hbank="120" lbank="0" prog="56"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Acoustic Piano">
+ <Patch name="Piano 1" mode="7" drum="0" hbank="121" lbank="0" prog="0"/>
+ <Patch name="Piano 1w" mode="7" drum="0" hbank="121" lbank="1" prog="0"/>
+ <Patch name="European Pf" mode="7" drum="0" hbank="121" lbank="2" prog="0"/>
+ <Patch name="Piano 2" mode="7" drum="0" hbank="121" lbank="0" prog="1"/>
+ <Patch name="Piano 2w" mode="7" drum="0" hbank="121" lbank="1" prog="1"/>
+ <Patch name="Piano 3" mode="7" drum="0" hbank="121" lbank="0" prog="2"/>
+ <Patch name="Piano 3w" mode="7" drum="0" hbank="121" lbank="1" prog="2"/>
+ <Patch name="Honky-tonk" mode="7" drum="0" hbank="121" lbank="0" prog="3"/>
+ <Patch name="Honky-tonk 2" mode="7" drum="0" hbank="121" lbank="1" prog="3"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Electric Piano">
+ <Patch name="E.Piano 1" mode="7" drum="0" hbank="121" lbank="0" prog="4"/>
+ <Patch name="St.Soft EP" mode="7" drum="0" hbank="121" lbank="1" prog="4"/>
+ <Patch name="FM+SA EP" mode="7" drum="0" hbank="121" lbank="2" prog="4"/>
+ <Patch name="60s Rhodes" mode="7" drum="0" hbank="121" lbank="3" prog="4"/>
+ <Patch name="E.Piano 2" mode="7" drum="0" hbank="121" lbank="0" prog="5"/>
+ <Patch name="Detuned EP 2" mode="7" drum="0" hbank="121" lbank="1" prog="5"/>
+ <Patch name="St.FM EP" mode="7" drum="0" hbank="121" lbank="2" prog="5"/>
+ <Patch name="EP Legend" mode="7" drum="0" hbank="121" lbank="3" prog="5"/>
+ <Patch name="EP Phase" mode="7" drum="0" hbank="121" lbank="4" prog="5"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Keyboards">
+ <Patch name="Harpsichord" mode="7" drum="0" hbank="121" lbank="0" prog="6"/>
+ <Patch name="Coupled Hps." mode="7" drum="0" hbank="121" lbank="1" prog="6"/>
+ <Patch name="Harpsi.w" mode="7" drum="0" hbank="121" lbank="2" prog="6"/>
+ <Patch name="Harpsi.o" mode="7" drum="0" hbank="121" lbank="3" prog="6"/>
+ <Patch name="Clav." mode="7" drum="0" hbank="121" lbank="0" prog="7"/>
+ <Patch name="Pulse Clav" mode="7" drum="0" hbank="121" lbank="1" prog="7"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Mallet">
+ <Patch name="Celesta" mode="7" drum="0" hbank="121" lbank="0" prog="8"/>
+ <Patch name="Glockenspiel" mode="7" drum="0" hbank="121" lbank="0" prog="9"/>
+ <Patch name="Music Box" mode="7" drum="0" hbank="121" lbank="0" prog="10"/>
+ <Patch name="Vibraphone" mode="7" drum="0" hbank="121" lbank="0" prog="11"/>
+ <Patch name="Vibraphone w" mode="7" drum="0" hbank="121" lbank="1" prog="11"/>
+ <Patch name="Marimba" mode="7" drum="0" hbank="121" lbank="0" prog="12"/>
+ <Patch name="Marimba w" mode="7" drum="0" hbank="121" lbank="1" prog="12"/>
+ <Patch name="Xylophone" mode="7" drum="0" hbank="121" lbank="0" prog="13"/>
+ <Patch name="Tubular-bell" mode="7" drum="0" hbank="121" lbank="0" prog="14"/>
+ <Patch name="Church Bell" mode="7" drum="0" hbank="121" lbank="1" prog="14"/>
+ <Patch name="Carillon" mode="7" drum="0" hbank="121" lbank="2" prog="14"/>
+ <Patch name="Santur" mode="7" drum="0" hbank="121" lbank="0" prog="15"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Organ and Reed">
+ <Patch name="Organ 1" mode="7" drum="0" hbank="121" lbank="0" prog="16"/>
+ <Patch name="Trem. Organ" mode="7" drum="0" hbank="121" lbank="1" prog="16"/>
+ <Patch name="60s Organ" mode="7" drum="0" hbank="121" lbank="2" prog="16"/>
+ <Patch name="70s E.Organ" mode="7" drum="0" hbank="121" lbank="3" prog="16"/>
+ <Patch name="Organ 2" mode="7" drum="0" hbank="121" lbank="0" prog="17"/>
+ <Patch name="Chorus Or.2" mode="7" drum="0" hbank="121" lbank="1" prog="17"/>
+ <Patch name="Perc. Organ" mode="7" drum="0" hbank="121" lbank="2" prog="17"/>
+ <Patch name="Organ 3" mode="7" drum="0" hbank="121" lbank="0" prog="18"/>
+ <Patch name="Church Org.1" mode="7" drum="0" hbank="121" lbank="0" prog="19"/>
+ <Patch name="Church Org.3" mode="7" drum="0" hbank="121" lbank="2" prog="19"/>
+ <Patch name="Church Org.2" mode="7" drum="0" hbank="121" lbank="1" prog="19"/>
+ <Patch name="Reed Organ" mode="7" drum="0" hbank="121" lbank="0" prog="20"/>
+ <Patch name="Puff Organ" mode="7" drum="0" hbank="121" lbank="1" prog="20"/>
+ <Patch name="Accordion Fr" mode="7" drum="0" hbank="121" lbank="0" prog="21"/>
+ <Patch name="Accordion It" mode="7" drum="0" hbank="121" lbank="1" prog="21"/>
+ <Patch name="Harmonica" mode="7" drum="0" hbank="121" lbank="0" prog="22"/>
+ <Patch name="Bandoneon" mode="7" drum="0" hbank="121" lbank="0" prog="23"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Guitar">
+ <Patch name="Nylon-str.Gt" mode="7" drum="0" hbank="121" lbank="0" prog="24"/>
+ <Patch name="Ukulele" mode="7" drum="0" hbank="121" lbank="1" prog="24"/>
+ <Patch name="Nylon Gt.o" mode="7" drum="0" hbank="121" lbank="2" prog="24"/>
+ <Patch name="Nylon Gt.2" mode="7" drum="0" hbank="121" lbank="3" prog="24"/>
+ <Patch name="Steel-str.Gt" mode="7" drum="0" hbank="121" lbank="0" prog="25"/>
+ <Patch name="12-str.Gt" mode="7" drum="0" hbank="121" lbank="1" prog="25"/>
+ <Patch name="Mandolin" mode="7" drum="0" hbank="121" lbank="2" prog="25"/>
+ <Patch name="Steel + Body" mode="7" drum="0" hbank="121" lbank="3" prog="25"/>
+ <Patch name="Jazz Gt." mode="7" drum="0" hbank="121" lbank="0" prog="26"/>
+ <Patch name="Pedal Steel" mode="7" drum="0" hbank="121" lbank="1" prog="26"/>
+ <Patch name="Clean Gt." mode="7" drum="0" hbank="121" lbank="0" prog="27"/>
+ <Patch name="Chorus Gt." mode="7" drum="0" hbank="121" lbank="1" prog="27"/>
+ <Patch name="Mid Tone GTR" mode="7" drum="0" hbank="121" lbank="2" prog="27"/>
+ <Patch name="Muted Gt." mode="7" drum="0" hbank="121" lbank="0" prog="28"/>
+ <Patch name="Funk Pop" mode="7" drum="0" hbank="121" lbank="1" prog="28"/>
+ <Patch name="Funk Gt.2" mode="7" drum="0" hbank="121" lbank="2" prog="28"/>
+ <Patch name="Jazz Man" mode="7" drum="0" hbank="121" lbank="3" prog="28"/>
+ <Patch name="Overdrive Gt" mode="7" drum="0" hbank="121" lbank="0" prog="29"/>
+ <Patch name="Guitar Pinch" mode="7" drum="0" hbank="121" lbank="1" prog="29"/>
+ <Patch name="DistortionGT" mode="7" drum="0" hbank="121" lbank="0" prog="30"/>
+ <Patch name="Feedback GT." mode="7" drum="0" hbank="121" lbank="1" prog="30"/>
+ <Patch name="Dist Rtm GTR" mode="7" drum="0" hbank="121" lbank="2" prog="30"/>
+ <Patch name="Gt.Harmonics" mode="7" drum="0" hbank="121" lbank="0" prog="31"/>
+ <Patch name="Gt.Feedback" mode="7" drum="0" hbank="121" lbank="1" prog="31"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Bass">
+ <Patch name="Acoustic Bs." mode="7" drum="0" hbank="121" lbank="0" prog="32"/>
+ <Patch name="Fingered Bs." mode="7" drum="0" hbank="121" lbank="0" prog="33"/>
+ <Patch name="Finger Slap" mode="7" drum="0" hbank="121" lbank="1" prog="33"/>
+ <Patch name="Picked Bass" mode="7" drum="0" hbank="121" lbank="0" prog="34"/>
+ <Patch name="Fretless Bs." mode="7" drum="0" hbank="121" lbank="0" prog="35"/>
+ <Patch name="Slap Bass 1" mode="7" drum="0" hbank="121" lbank="0" prog="36"/>
+ <Patch name="Slap Bass 2" mode="7" drum="0" hbank="121" lbank="0" prog="37"/>
+ <Patch name="Synth Bass 1" mode="7" drum="0" hbank="121" lbank="0" prog="38"/>
+ <Patch name="SynthBass101" mode="7" drum="0" hbank="121" lbank="1" prog="38"/>
+ <Patch name="Acid Bass" mode="7" drum="0" hbank="121" lbank="2" prog="38"/>
+ <Patch name="Clavi Bass" mode="7" drum="0" hbank="121" lbank="3" prog="38"/>
+ <Patch name="Hammer" mode="7" drum="0" hbank="121" lbank="4" prog="38"/>
+ <Patch name="Synth Bass2" mode="7" drum="0" hbank="121" lbank="0" prog="39"/>
+ <Patch name="Beef FM Bass" mode="7" drum="0" hbank="121" lbank="1" prog="39"/>
+ <Patch name="RubberBass2" mode="7" drum="0" hbank="121" lbank="2" prog="39"/>
+ <Patch name="Attack Pulse" mode="7" drum="0" hbank="121" lbank="3" prog="39"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Strings">
+ <Patch name="Violin" mode="7" drum="0" hbank="121" lbank="0" prog="40"/>
+ <Patch name="Slow Violin" mode="7" drum="0" hbank="121" lbank="1" prog="40"/>
+ <Patch name="Viola" mode="7" drum="0" hbank="121" lbank="0" prog="41"/>
+ <Patch name="Cello" mode="7" drum="0" hbank="121" lbank="0" prog="42"/>
+ <Patch name="Contrabass" mode="7" drum="0" hbank="121" lbank="0" prog="43"/>
+ <Patch name="Tremolo Str" mode="7" drum="0" hbank="121" lbank="0" prog="44"/>
+ <Patch name="PizzicatoStr" mode="7" drum="0" hbank="121" lbank="0" prog="45"/>
+ <Patch name="Harp" mode="7" drum="0" hbank="121" lbank="0" prog="46"/>
+ <Patch name="Yang Qin" mode="7" drum="0" hbank="121" lbank="1" prog="46"/>
+ <Patch name="Timpani" mode="7" drum="0" hbank="121" lbank="0" prog="47"/>
+ <Patch name="Orche str" mode="7" drum="0" hbank="121" lbank="0" prog="48"/>
+ <Patch name="Orchestra" mode="7" drum="0" hbank="121" lbank="1" prog="48"/>
+ <Patch name="60s Strings" mode="7" drum="0" hbank="121" lbank="2" prog="48"/>
+ <Patch name="Slow Strings" mode="7" drum="0" hbank="121" lbank="0" prog="49"/>
+ <Patch name="Syn.Strings1" mode="7" drum="0" hbank="121" lbank="0" prog="50"/>
+ <Patch name="Syn.Strings3" mode="7" drum="0" hbank="121" lbank="1" prog="50"/>
+ <Patch name="Syn.Strings2" mode="7" drum="0" hbank="121" lbank="0" prog="51"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Voice">
+ <Patch name="Choir Aahs" mode="7" drum="0" hbank="121" lbank="0" prog="52"/>
+ <Patch name="Chorus Aahs" mode="7" drum="0" hbank="121" lbank="1" prog="52"/>
+ <Patch name="Voice Oohs" mode="7" drum="0" hbank="121" lbank="0" prog="53"/>
+ <Patch name="Humming" mode="7" drum="0" hbank="121" lbank="1" prog="53"/>
+ <Patch name="SynVox" mode="7" drum="0" hbank="121" lbank="0" prog="54"/>
+ <Patch name="Analog Voice" mode="7" drum="0" hbank="121" lbank="1" prog="54"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Hit and Brass">
+ <Patch name="OrchestraHit" mode="7" drum="0" hbank="121" lbank="0" prog="55"/>
+ <Patch name="Euro Hit" mode="7" drum="0" hbank="121" lbank="3" prog="55"/>
+ <Patch name="Bass Hit" mode="7" drum="0" hbank="121" lbank="1" prog="55"/>
+ <Patch name="6th Hit" mode="7" drum="0" hbank="121" lbank="2" prog="55"/>
+ <Patch name="Trumpet" mode="7" drum="0" hbank="121" lbank="0" prog="56"/>
+ <Patch name="Dark Trumpet" mode="7" drum="0" hbank="121" lbank="1" prog="56"/>
+ <Patch name="Trombone" mode="7" drum="0" hbank="121" lbank="0" prog="57"/>
+ <Patch name="Trombone 2" mode="7" drum="0" hbank="121" lbank="1" prog="57"/>
+ <Patch name="Bright Tb" mode="7" drum="0" hbank="121" lbank="2" prog="57"/>
+ <Patch name="Tuba" mode="7" drum="0" hbank="121" lbank="0" prog="58"/>
+ <Patch name="MutedTrumpet" mode="7" drum="0" hbank="121" lbank="0" prog="59"/>
+ <Patch name="MuteTrumpet2" mode="7" drum="0" hbank="121" lbank="1" prog="59"/>
+ <Patch name="French Horns" mode="7" drum="0" hbank="121" lbank="0" prog="60"/>
+ <Patch name="Fr.Horn 2" mode="7" drum="0" hbank="121" lbank="1" prog="60"/>
+ <Patch name="Brass 1" mode="7" drum="0" hbank="121" lbank="0" prog="61"/>
+ <Patch name="Brass 2" mode="7" drum="0" hbank="121" lbank="1" prog="61"/>
+ <Patch name="Synth Brass1" mode="7" drum="0" hbank="121" lbank="0" prog="62"/>
+ <Patch name="Pro Brass" mode="7" drum="0" hbank="121" lbank="1" prog="62"/>
+ <Patch name="Oct SynBrass" mode="7" drum="0" hbank="121" lbank="2" prog="62"/>
+ <Patch name="Jump Brass" mode="7" drum="0" hbank="121" lbank="3" prog="62"/>
+ <Patch name="Synth Brass2" mode="7" drum="0" hbank="121" lbank="0" prog="63"/>
+ <Patch name="SynBrass sfz" mode="7" drum="0" hbank="121" lbank="1" prog="63"/>
+ <Patch name="Velo Brass 1" mode="7" drum="0" hbank="121" lbank="2" prog="63"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Orch. Reeds">
+ <Patch name="Soprano Sax" mode="7" drum="0" hbank="121" lbank="0" prog="64"/>
+ <Patch name="Alto Sax" mode="7" drum="0" hbank="121" lbank="0" prog="65"/>
+ <Patch name="Tenor Sax" mode="7" drum="0" hbank="121" lbank="0" prog="66"/>
+ <Patch name="Baritone Sax" mode="7" drum="0" hbank="121" lbank="0" prog="67"/>
+ <Patch name="Oboe" mode="7" drum="0" hbank="121" lbank="0" prog="68"/>
+ <Patch name="English Horn" mode="7" drum="0" hbank="121" lbank="0" prog="69"/>
+ <Patch name="Bassoon" mode="7" drum="0" hbank="121" lbank="0" prog="70"/>
+ <Patch name="Clarinet" mode="7" drum="0" hbank="121" lbank="0" prog="71"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Flute and Wind">
+ <Patch name="Piccolo" mode="7" drum="0" hbank="121" lbank="0" prog="72"/>
+ <Patch name="Flute" mode="7" drum="0" hbank="121" lbank="0" prog="73"/>
+ <Patch name="Recorder" mode="7" drum="0" hbank="121" lbank="0" prog="74"/>
+ <Patch name="Pan Flute" mode="7" drum="0" hbank="121" lbank="0" prog="75"/>
+ <Patch name="Bottle Blow" mode="7" drum="0" hbank="121" lbank="0" prog="76"/>
+ <Patch name="Shakuhachi" mode="7" drum="0" hbank="121" lbank="0" prog="77"/>
+ <Patch name="Whistle" mode="7" drum="0" hbank="121" lbank="0" prog="78"/>
+ <Patch name="Ocarina" mode="7" drum="0" hbank="121" lbank="0" prog="79"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Synthesizer">
+ <Patch name="Square Wave" mode="7" drum="0" hbank="121" lbank="0" prog="80"/>
+ <Patch name="MG Square" mode="7" drum="0" hbank="121" lbank="1" prog="80"/>
+ <Patch name="2600 Sine" mode="7" drum="0" hbank="121" lbank="2" prog="80"/>
+ <Patch name="Saw Wave" mode="7" drum="0" hbank="121" lbank="0" prog="81"/>
+ <Patch name="OB2 Saw" mode="7" drum="0" hbank="121" lbank="1" prog="81"/>
+ <Patch name="Doctor Solo" mode="7" drum="0" hbank="121" lbank="2" prog="81"/>
+ <Patch name="Natural Lead" mode="7" drum="0" hbank="121" lbank="3" prog="81"/>
+ <Patch name="SequencedSaw" mode="7" drum="0" hbank="121" lbank="4" prog="81"/>
+ <Patch name="Syn.Calliope" mode="7" drum="0" hbank="121" lbank="0" prog="82"/>
+ <Patch name="Chiffer Lead" mode="7" drum="0" hbank="121" lbank="0" prog="83"/>
+ <Patch name="Charang" mode="7" drum="0" hbank="121" lbank="0" prog="84"/>
+ <Patch name="Wire Lead" mode="7" drum="0" hbank="121" lbank="1" prog="84"/>
+ <Patch name="Solo Vox" mode="7" drum="0" hbank="121" lbank="0" prog="85"/>
+ <Patch name="5th Saw Wave" mode="7" drum="0" hbank="121" lbank="0" prog="86"/>
+ <Patch name="Bass and Lead" mode="7" drum="0" hbank="121" lbank="0" prog="87"/>
+ <Patch name="Delayed Lead" mode="7" drum="0" hbank="121" lbank="1" prog="87"/>
+ <Patch name="Fantasia" mode="7" drum="0" hbank="121" lbank="0" prog="88"/>
+ <Patch name="Warm Pad" mode="7" drum="0" hbank="121" lbank="0" prog="89"/>
+ <Patch name="Sine Pad" mode="7" drum="0" hbank="121" lbank="1" prog="89"/>
+ <Patch name="Polysynth" mode="7" drum="0" hbank="121" lbank="0" prog="90"/>
+ <Patch name="Space Voice" mode="7" drum="0" hbank="121" lbank="0" prog="91"/>
+ <Patch name="Itopia" mode="7" drum="0" hbank="121" lbank="1" prog="91"/>
+ <Patch name="Bowed Glass" mode="7" drum="0" hbank="121" lbank="0" prog="92"/>
+ <Patch name="Metal Pad" mode="7" drum="0" hbank="121" lbank="0" prog="93"/>
+ <Patch name="Halo Pad" mode="7" drum="0" hbank="121" lbank="0" prog="94"/>
+ <Patch name="Sweep Pad" mode="7" drum="0" hbank="121" lbank="0" prog="95"/>
+ <Patch name="Ice Rain" mode="7" drum="0" hbank="121" lbank="0" prog="96"/>
+ <Patch name="Soundtrack" mode="7" drum="0" hbank="121" lbank="0" prog="97"/>
+ <Patch name="Crystal" mode="7" drum="0" hbank="121" lbank="0" prog="98"/>
+ <Patch name="Syn Mallet" mode="7" drum="0" hbank="121" lbank="1" prog="98"/>
+ <Patch name="Atmosphere" mode="7" drum="0" hbank="121" lbank="0" prog="99"/>
+ <Patch name="Brightness" mode="7" drum="0" hbank="121" lbank="0" prog="100"/>
+ <Patch name="Goblin" mode="7" drum="0" hbank="121" lbank="0" prog="101"/>
+ <Patch name="Echo Drops" mode="7" drum="0" hbank="121" lbank="0" prog="102"/>
+ <Patch name="Echo Bell" mode="7" drum="0" hbank="121" lbank="1" prog="102"/>
+ <Patch name="Echo Pan" mode="7" drum="0" hbank="121" lbank="2" prog="102"/>
+ <Patch name="Star Theme" mode="7" drum="0" hbank="121" lbank="0" prog="103"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Ethnic">
+ <Patch name="Sitar" mode="7" drum="0" hbank="121" lbank="0" prog="104"/>
+ <Patch name="Sitar 2" mode="7" drum="0" hbank="121" lbank="1" prog="104"/>
+ <Patch name="Banjo" mode="7" drum="0" hbank="121" lbank="0" prog="105"/>
+ <Patch name="Shamisen" mode="7" drum="0" hbank="121" lbank="0" prog="106"/>
+ <Patch name="Koto" mode="7" drum="0" hbank="121" lbank="0" prog="107"/>
+ <Patch name="Taisho Koto" mode="7" drum="0" hbank="121" lbank="1" prog="107"/>
+ <Patch name="Kalimba" mode="7" drum="0" hbank="121" lbank="0" prog="108"/>
+ <Patch name="Bagpipe" mode="7" drum="0" hbank="121" lbank="0" prog="109"/>
+ <Patch name="Fiddle" mode="7" drum="0" hbank="121" lbank="0" prog="110"/>
+ <Patch name="Shanai" mode="7" drum="0" hbank="121" lbank="0" prog="111"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Percussion">
+ <Patch name="Tinkle Bell" mode="7" drum="0" hbank="121" lbank="0" prog="112"/>
+ <Patch name="Agogo" mode="7" drum="0" hbank="121" lbank="0" prog="113"/>
+ <Patch name="Steel Drims" mode="7" drum="0" hbank="121" lbank="0" prog="114"/>
+ <Patch name="Woodblock" mode="7" drum="0" hbank="121" lbank="0" prog="115"/>
+ <Patch name="Castanets" mode="7" drum="0" hbank="121" lbank="1" prog="115"/>
+ <Patch name="Taiko" mode="7" drum="0" hbank="121" lbank="0" prog="116"/>
+ <Patch name="Concert BD" mode="7" drum="0" hbank="121" lbank="1" prog="116"/>
+ <Patch name="Melo. Tom 1" mode="7" drum="0" hbank="121" lbank="0" prog="117"/>
+ <Patch name="Melo. Tom 2" mode="7" drum="0" hbank="121" lbank="1" prog="117"/>
+ <Patch name="Synth Drum" mode="7" drum="0" hbank="121" lbank="0" prog="118"/>
+ <Patch name="808 Tom" mode="7" drum="0" hbank="121" lbank="1" prog="118"/>
+ <Patch name="Elec Perc" mode="7" drum="0" hbank="121" lbank="2" prog="118"/>
+ <Patch name="Reverse Cym." mode="7" drum="0" hbank="121" lbank="0" prog="119"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM2 Sound FX">
+ <Patch name="Gt.FretNoise" mode="7" drum="0" hbank="121" lbank="0" prog="120"/>
+ <Patch name="Gt.Cut Noise" mode="7" drum="0" hbank="121" lbank="1" prog="120"/>
+ <Patch name="String Slap" mode="7" drum="0" hbank="121" lbank="2" prog="120"/>
+ <Patch name="Breath Noise" mode="7" drum="0" hbank="121" lbank="0" prog="121"/>
+ <Patch name="Fl.Key Click" mode="7" drum="0" hbank="121" lbank="1" prog="121"/>
+ <Patch name="Seashore" mode="7" drum="0" hbank="121" lbank="0" prog="122"/>
+ <Patch name="Rain" mode="7" drum="0" hbank="121" lbank="1" prog="122"/>
+ <Patch name="Thunder" mode="7" drum="0" hbank="121" lbank="2" prog="122"/>
+ <Patch name="Wind" mode="7" drum="0" hbank="121" lbank="3" prog="122"/>
+ <Patch name="Stream" mode="7" drum="0" hbank="121" lbank="4" prog="122"/>
+ <Patch name="Bubble" mode="7" drum="0" hbank="121" lbank="5" prog="122"/>
+ <Patch name="Bird" mode="7" drum="0" hbank="121" lbank="0" prog="123"/>
+ <Patch name="Dog" mode="7" drum="0" hbank="121" lbank="1" prog="123"/>
+ <Patch name="Horse-Gallop" mode="7" drum="0" hbank="121" lbank="2" prog="123"/>
+ <Patch name="Bird 2" mode="7" drum="0" hbank="121" lbank="3" prog="123"/>
+ <Patch name="Telephone 1" mode="7" drum="0" hbank="121" lbank="0" prog="124"/>
+ <Patch name="Telephone 2" mode="7" drum="0" hbank="121" lbank="1" prog="124"/>
+ <Patch name="DoorCreaking" mode="7" drum="0" hbank="121" lbank="2" prog="124"/>
+ <Patch name="DoorCreaking" mode="7" drum="0" hbank="121" lbank="3" prog="124"/>
+ <Patch name="Scratch" mode="7" drum="0" hbank="121" lbank="4" prog="124"/>
+ <Patch name="Wind Chimes" mode="7" drum="0" hbank="121" lbank="5" prog="124"/>
+ <Patch name="Helicopter" mode="7" drum="0" hbank="121" lbank="0" prog="125"/>
+ <Patch name="Car-Engine" mode="7" drum="0" hbank="121" lbank="1" prog="125"/>
+ <Patch name="Car-Stop" mode="7" drum="0" hbank="121" lbank="2" prog="125"/>
+ <Patch name="Car-Pass" mode="7" drum="0" hbank="121" lbank="3" prog="125"/>
+ <Patch name="Car-Crash" mode="7" drum="0" hbank="121" lbank="4" prog="125"/>
+ <Patch name="Siren" mode="7" drum="0" hbank="121" lbank="5" prog="125"/>
+ <Patch name="Train" mode="7" drum="0" hbank="121" lbank="6" prog="125"/>
+ <Patch name="Jetplane" mode="7" drum="0" hbank="121" lbank="7" prog="125"/>
+ <Patch name="Starship" mode="7" drum="0" hbank="121" lbank="8" prog="125"/>
+ <Patch name="Burst Noise" mode="7" drum="0" hbank="121" lbank="9" prog="125"/>
+ <Patch name="Applause" mode="7" drum="0" hbank="121" lbank="0" prog="126"/>
+ <Patch name="Laughing" mode="7" drum="0" hbank="121" lbank="1" prog="126"/>
+ <Patch name="Screaming" mode="7" drum="0" hbank="121" lbank="2" prog="126"/>
+ <Patch name="Punch" mode="7" drum="0" hbank="121" lbank="3" prog="126"/>
+ <Patch name="Heart Beat" mode="7" drum="0" hbank="121" lbank="4" prog="126"/>
+ <Patch name="Footsteps" mode="7" drum="0" hbank="121" lbank="5" prog="126"/>
+ <Patch name="Gun Shot" mode="7" drum="0" hbank="121" lbank="0" prog="127"/>
+ <Patch name="Machine Gun" mode="7" drum="0" hbank="121" lbank="1" prog="127"/>
+ <Patch name="Lasergun" mode="7" drum="0" hbank="121" lbank="2" prog="127"/>
+ <Patch name="Explosion" mode="7" drum="0" hbank="121" lbank="3" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset Drums/Percussion">
+ <Patch name="StandardKit1" drum="0" hbank="86" lbank="64" prog="0"/>
+ <Patch name="StandardKit2" drum="0" hbank="86" lbank="64" prog="1"/>
+ <Patch name="StandardKit3" drum="0" hbank="86" lbank="64" prog="2"/>
+ <Patch name="Rock Kit 1" drum="0" hbank="86" lbank="64" prog="3"/>
+ <Patch name="Rock Kit 2" drum="0" hbank="86" lbank="64" prog="4"/>
+ <Patch name="Brush Jz Kit" drum="0" hbank="86" lbank="64" prog="5"/>
+ <Patch name="Orch Kit" drum="0" hbank="86" lbank="64" prog="6"/>
+ <Patch name="909 808 Kit" drum="0" hbank="86" lbank="64" prog="7"/>
+ <Patch name="Limiter Kit" drum="0" hbank="86" lbank="64" prog="8"/>
+ <Patch name="HipHop Kit 1" drum="0" hbank="86" lbank="64" prog="9"/>
+ <Patch name="HipHop Kit 2" drum="0" hbank="86" lbank="64" prog="10"/>
+ <Patch name="HipHop and Latin" drum="0" hbank="86" lbank="64" prog="11"/>
+ <Patch name="Machine and Hip" drum="0" hbank="86" lbank="64" prog="12"/>
+ <Patch name="R and B Kit" drum="0" hbank="86" lbank="64" prog="13"/>
+ <Patch name="HiFi R and B Kit" drum="0" hbank="86" lbank="64" prog="14"/>
+ <Patch name="Machine Kit1" drum="0" hbank="86" lbank="64" prog="15"/>
+ <Patch name="4 Kit MIX" drum="0" hbank="86" lbank="64" prog="16"/>
+ <Patch name="Kit-Euro:POP" drum="0" hbank="86" lbank="64" prog="17"/>
+ <Patch name="House Kit" drum="0" hbank="86" lbank="64" prog="18"/>
+ <Patch name="Nu Technica" drum="0" hbank="86" lbank="64" prog="19"/>
+ <Patch name="Machine Kit2" drum="0" hbank="86" lbank="64" prog="20"/>
+ <Patch name="ArtificalKit" drum="0" hbank="86" lbank="64" prog="21"/>
+ <Patch name="Noise Kit" drum="0" hbank="86" lbank="64" prog="22"/>
+ <Patch name="Kick Menu" drum="0" hbank="86" lbank="64" prog="23"/>
+ <Patch name="Snare Menu 1" drum="0" hbank="86" lbank="64" prog="24"/>
+ <Patch name="Snare Menu 2" drum="0" hbank="86" lbank="64" prog="25"/>
+ <Patch name="HiHat Menu" drum="0" hbank="86" lbank="64" prog="26"/>
+ <Patch name="Rim and Tom Menu" drum="0" hbank="86" lbank="64" prog="27"/>
+ <Patch name="Clp n Cym n Hit" drum="0" hbank="86" lbank="64" prog="28"/>
+ <Patch name="FX/SFX Menu" drum="0" hbank="86" lbank="64" prog="29"/>
+ <Patch name="Percussion" drum="0" hbank="86" lbank="64" prog="30"/>
+ <Patch name="Scrh n Voi n Wld" drum="0" hbank="86" lbank="64" prog="31"/>
+ <Patch name="StudioX Kit1" drum="0" hbank="86" lbank="64" prog="32"/>
+ <Patch name="StudioX Kit2" drum="0" hbank="86" lbank="64" prog="33"/>
+ <Patch name="X Euro Kit" drum="0" hbank="86" lbank="64" prog="34"/>
+ <Patch name="X Hybrid Kit" drum="0" hbank="86" lbank="64" prog="35"/>
+ <Patch name="Neo-Wrld Kit" drum="0" hbank="86" lbank="64" prog="36"/>
+ <Patch name="PassionDrums" drum="0" hbank="86" lbank="64" prog="37"/>
+ <Patch name="Organic Kit" drum="0" hbank="86" lbank="64" prog="38"/>
+ <Patch name="Arpeggiate!" drum="0" hbank="86" lbank="64" prog="39"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset A">
+ <Patch name="So true..." drum="0" hbank="87" lbank="64" prog="0"/>
+ <Patch name="ConcertPiano" drum="0" hbank="87" lbank="64" prog="1"/>
+ <Patch name="Warm Piano" drum="0" hbank="87" lbank="64" prog="2"/>
+ <Patch name="Warm Pad Pno" drum="0" hbank="87" lbank="64" prog="3"/>
+ <Patch name="Warm Str Pno" drum="0" hbank="87" lbank="64" prog="4"/>
+ <Patch name="BealeSt Walk" drum="0" hbank="87" lbank="64" prog="5"/>
+ <Patch name="Rapsody" drum="0" hbank="87" lbank="64" prog="6"/>
+ <Patch name="JD-800 Piano" drum="0" hbank="87" lbank="64" prog="7"/>
+ <Patch name="SA Dance Pno" drum="0" hbank="87" lbank="64" prog="8"/>
+ <Patch name="FS E-Grand" drum="0" hbank="87" lbank="64" prog="9"/>
+ <Patch name="FS Blend Pno" drum="0" hbank="87" lbank="64" prog="10"/>
+ <Patch name="LA Piano" drum="0" hbank="87" lbank="64" prog="11"/>
+ <Patch name="FS Rhodes" drum="0" hbank="87" lbank="64" prog="12"/>
+ <Patch name="StageRhdTrem" drum="0" hbank="87" lbank="64" prog="13"/>
+ <Patch name="Back2the60s" drum="0" hbank="87" lbank="64" prog="14"/>
+ <Patch name="Tine Rhodes" drum="0" hbank="87" lbank="64" prog="15"/>
+ <Patch name="LEO Rhodes" drum="0" hbank="87" lbank="64" prog="16"/>
+ <Patch name="LonesomeRoad" drum="0" hbank="87" lbank="64" prog="17"/>
+ <Patch name="Age-n Tines" drum="0" hbank="87" lbank="64" prog="18"/>
+ <Patch name="Brill TremEP" drum="0" hbank="87" lbank="64" prog="19"/>
+ <Patch name="Crystal Rhd" drum="0" hbank="87" lbank="64" prog="20"/>
+ <Patch name="Celestial EP" drum="0" hbank="87" lbank="64" prog="21"/>
+ <Patch name="Spirit Tines" drum="0" hbank="87" lbank="64" prog="22"/>
+ <Patch name="Psycho EP" drum="0" hbank="87" lbank="64" prog="23"/>
+ <Patch name="Mk2 Stg phsr" drum="0" hbank="87" lbank="64" prog="24"/>
+ <Patch name="SA Stacks" drum="0" hbank="87" lbank="64" prog="25"/>
+ <Patch name="Backing PhEP" drum="0" hbank="87" lbank="64" prog="26"/>
+ <Patch name="Balladeer" drum="0" hbank="87" lbank="64" prog="27"/>
+ <Patch name="Remember" drum="0" hbank="87" lbank="64" prog="28"/>
+ <Patch name="FS Wurly" drum="0" hbank="87" lbank="64" prog="29"/>
+ <Patch name="Wurly Trem" drum="0" hbank="87" lbank="64" prog="30"/>
+ <Patch name="Super Wurly" drum="0" hbank="87" lbank="64" prog="31"/>
+ <Patch name="Pulse EPno" drum="0" hbank="87" lbank="64" prog="32"/>
+ <Patch name="Fonky Fonky" drum="0" hbank="87" lbank="64" prog="33"/>
+ <Patch name="FM Rhodes" drum="0" hbank="87" lbank="64" prog="34"/>
+ <Patch name="FM-777" drum="0" hbank="87" lbank="64" prog="35"/>
+ <Patch name="FM EPad" drum="0" hbank="87" lbank="64" prog="36"/>
+ <Patch name="D6 Clavi" drum="0" hbank="87" lbank="64" prog="37"/>
+ <Patch name="Cutter Clavi" drum="0" hbank="87" lbank="64" prog="38"/>
+ <Patch name="FS Clavi" drum="0" hbank="87" lbank="64" prog="39"/>
+ <Patch name="Funky D" drum="0" hbank="87" lbank="64" prog="40"/>
+ <Patch name="Phase Clavi" drum="0" hbank="87" lbank="64" prog="41"/>
+ <Patch name="BPF Clavi Ph" drum="0" hbank="87" lbank="64" prog="42"/>
+ <Patch name="Pulse Clavi" drum="0" hbank="87" lbank="64" prog="43"/>
+ <Patch name="Analog Clavi" drum="0" hbank="87" lbank="64" prog="44"/>
+ <Patch name="Reso Clavi" drum="0" hbank="87" lbank="64" prog="45"/>
+ <Patch name="Harpsy Clavi" drum="0" hbank="87" lbank="64" prog="46"/>
+ <Patch name="FS Harpsi" drum="0" hbank="87" lbank="64" prog="47"/>
+ <Patch name="Amadeus" drum="0" hbank="87" lbank="64" prog="48"/>
+ <Patch name="FS Celesta" drum="0" hbank="87" lbank="64" prog="49"/>
+ <Patch name="FS Glocken" drum="0" hbank="87" lbank="64" prog="50"/>
+ <Patch name="Music Bells" drum="0" hbank="87" lbank="64" prog="51"/>
+ <Patch name="FS Musicbox" drum="0" hbank="87" lbank="64" prog="52"/>
+ <Patch name="MuBox Pad" drum="0" hbank="87" lbank="64" prog="53"/>
+ <Patch name="Kalimbells" drum="0" hbank="87" lbank="64" prog="54"/>
+ <Patch name="Himalaya Ice" drum="0" hbank="87" lbank="64" prog="55"/>
+ <Patch name="Dreaming Box" drum="0" hbank="87" lbank="64" prog="56"/>
+ <Patch name="Step Ice" drum="0" hbank="87" lbank="64" prog="57"/>
+ <Patch name="FS Bell 1" drum="0" hbank="87" lbank="64" prog="58"/>
+ <Patch name="FS Bell 2" drum="0" hbank="87" lbank="64" prog="59"/>
+ <Patch name="Candy Bell" drum="0" hbank="87" lbank="64" prog="60"/>
+ <Patch name="FS Chime" drum="0" hbank="87" lbank="64" prog="61"/>
+ <Patch name="Bell Ring" drum="0" hbank="87" lbank="64" prog="62"/>
+ <Patch name="Tubular Bell" drum="0" hbank="87" lbank="64" prog="63"/>
+ <Patch name="5th Key" drum="0" hbank="87" lbank="64" prog="64"/>
+ <Patch name="Vibrations" drum="0" hbank="87" lbank="64" prog="65"/>
+ <Patch name="FS Vibe" drum="0" hbank="87" lbank="64" prog="66"/>
+ <Patch name="FS Marimba" drum="0" hbank="87" lbank="64" prog="67"/>
+ <Patch name="FS Xylo" drum="0" hbank="87" lbank="64" prog="68"/>
+ <Patch name="Ethno Keys" drum="0" hbank="87" lbank="64" prog="69"/>
+ <Patch name="Synergy MLT" drum="0" hbank="87" lbank="64" prog="70"/>
+ <Patch name="Steel Drums" drum="0" hbank="87" lbank="64" prog="71"/>
+ <Patch name="Xylosizer" drum="0" hbank="87" lbank="64" prog="72"/>
+ <Patch name="Toy Box" drum="0" hbank="87" lbank="64" prog="73"/>
+ <Patch name="FullDraw Org" drum="0" hbank="87" lbank="64" prog="74"/>
+ <Patch name="StakDraw Org" drum="0" hbank="87" lbank="64" prog="75"/>
+ <Patch name="FullStop Org" drum="0" hbank="87" lbank="64" prog="76"/>
+ <Patch name="FS Perc Org" drum="0" hbank="87" lbank="64" prog="77"/>
+ <Patch name="Euro Organ" drum="0" hbank="87" lbank="64" prog="78"/>
+ <Patch name="Perky Organ" drum="0" hbank="87" lbank="64" prog="79"/>
+ <Patch name="LoFi PercOrg" drum="0" hbank="87" lbank="64" prog="80"/>
+ <Patch name="Rochno Org" drum="0" hbank="87" lbank="64" prog="81"/>
+ <Patch name="RnB Organ 1" drum="0" hbank="87" lbank="64" prog="82"/>
+ <Patch name="RnB Organ 2" drum="0" hbank="87" lbank="64" prog="83"/>
+ <Patch name="Zepix Organ" drum="0" hbank="87" lbank="64" prog="84"/>
+ <Patch name="Peep Durple" drum="0" hbank="87" lbank="64" prog="85"/>
+ <Patch name="FS Dist Bee" drum="0" hbank="87" lbank="64" prog="86"/>
+ <Patch name="60s Org 1" drum="0" hbank="87" lbank="64" prog="87"/>
+ <Patch name="60s Org 2" drum="0" hbank="87" lbank="64" prog="88"/>
+ <Patch name="FS SoapOpera" drum="0" hbank="87" lbank="64" prog="89"/>
+ <Patch name="Chapel Organ" drum="0" hbank="87" lbank="64" prog="90"/>
+ <Patch name="Grand Pipe" drum="0" hbank="87" lbank="64" prog="91"/>
+ <Patch name="Masked Opera" drum="0" hbank="87" lbank="64" prog="92"/>
+ <Patch name="Pipe Org/Mod" drum="0" hbank="87" lbank="64" prog="93"/>
+ <Patch name="Vodkakordion" drum="0" hbank="87" lbank="64" prog="94"/>
+ <Patch name="Squeeze Me!" drum="0" hbank="87" lbank="64" prog="95"/>
+ <Patch name="Guinguette" drum="0" hbank="87" lbank="64" prog="96"/>
+ <Patch name="HarWonderca" drum="0" hbank="87" lbank="64" prog="97"/>
+ <Patch name="BluesHrp V/S" drum="0" hbank="87" lbank="64" prog="98"/>
+ <Patch name="Green Bullet" drum="0" hbank="87" lbank="64" prog="99"/>
+ <Patch name="SoftNyln Gtr" drum="0" hbank="87" lbank="64" prog="100"/>
+ <Patch name="FS Nylon Gt" drum="0" hbank="87" lbank="64" prog="101"/>
+ <Patch name="Wet Nyln Gtr" drum="0" hbank="87" lbank="64" prog="102"/>
+ <Patch name="Pre Mass Hum" drum="0" hbank="87" lbank="64" prog="103"/>
+ <Patch name="Thick Steel" drum="0" hbank="87" lbank="64" prog="104"/>
+ <Patch name="Uncle Martin" drum="0" hbank="87" lbank="64" prog="105"/>
+ <Patch name="Wide Ac Gtr" drum="0" hbank="87" lbank="64" prog="106"/>
+ <Patch name="Comp Stl Gtr" drum="0" hbank="87" lbank="64" prog="107"/>
+ <Patch name="Stl Gtr Duo" drum="0" hbank="87" lbank="64" prog="108"/>
+ <Patch name="FS 12str Gtr" drum="0" hbank="87" lbank="64" prog="109"/>
+ <Patch name="So good!" drum="0" hbank="87" lbank="64" prog="110"/>
+ <Patch name="Muted Gtr Pk" drum="0" hbank="87" lbank="64" prog="111"/>
+ <Patch name="StratSequence" drum="0" hbank="87" lbank="64" prog="112"/>
+ <Patch name="Fixx it" drum="0" hbank="87" lbank="64" prog="113"/>
+ <Patch name="Jazz Guitar" drum="0" hbank="87" lbank="64" prog="114"/>
+ <Patch name="DynoJazz Gtr" drum="0" hbank="87" lbank="64" prog="115"/>
+ <Patch name="Wet TC" drum="0" hbank="87" lbank="64" prog="116"/>
+ <Patch name="Clean Gtr" drum="0" hbank="87" lbank="64" prog="117"/>
+ <Patch name="Crimson Gtr" drum="0" hbank="87" lbank="64" prog="118"/>
+ <Patch name="Touchee Funk" drum="0" hbank="87" lbank="64" prog="119"/>
+ <Patch name="Plug n Gig" drum="0" hbank="87" lbank="64" prog="120"/>
+ <Patch name="Kinda Kurt" drum="0" hbank="87" lbank="64" prog="121"/>
+ <Patch name="Nice Oct Gtr" drum="0" hbank="87" lbank="64" prog="122"/>
+ <Patch name="Strat Gtr" drum="0" hbank="87" lbank="64" prog="123"/>
+ <Patch name="JC Strat Bdy" drum="0" hbank="87" lbank="64" prog="124"/>
+ <Patch name="Twin StratsB" drum="0" hbank="87" lbank="64" prog="125"/>
+ <Patch name="BluNoteStrat" drum="0" hbank="87" lbank="64" prog="126"/>
+ <Patch name="FS Funk Gtr" drum="0" hbank="87" lbank="64" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset B">
+ <Patch name="GK Dubguitar" drum="0" hbank="87" lbank="65" prog="0"/>
+ <Patch name="and Scratchee" drum="0" hbank="87" lbank="65" prog="1"/>
+ <Patch name="Touch Drive" drum="0" hbank="87" lbank="65" prog="2"/>
+ <Patch name="FS Chunk" drum="0" hbank="87" lbank="65" prog="3"/>
+ <Patch name="Trem-o-Vibe" drum="0" hbank="87" lbank="65" prog="4"/>
+ <Patch name="Nice Dist Gt" drum="0" hbank="87" lbank="65" prog="5"/>
+ <Patch name="LP Dist" drum="0" hbank="87" lbank="65" prog="6"/>
+ <Patch name="Hurtling Gtr" drum="0" hbank="87" lbank="65" prog="7"/>
+ <Patch name="Searing COSM" drum="0" hbank="87" lbank="65" prog="8"/>
+ <Patch name="FS Loud Gtr" drum="0" hbank="87" lbank="65" prog="9"/>
+ <Patch name="FS Plugged!!" drum="0" hbank="87" lbank="65" prog="10"/>
+ <Patch name="Punker 1" drum="0" hbank="87" lbank="65" prog="11"/>
+ <Patch name="FS PowerChd" drum="0" hbank="87" lbank="65" prog="12"/>
+ <Patch name="Punker 2" drum="0" hbank="87" lbank="65" prog="13"/>
+ <Patch name="Ulti Ac Bass" drum="0" hbank="87" lbank="65" prog="14"/>
+ <Patch name="Downright BS" drum="0" hbank="87" lbank="65" prog="15"/>
+ <Patch name="Ultimo Bass" drum="0" hbank="87" lbank="65" prog="16"/>
+ <Patch name="Roomy Bass" drum="0" hbank="87" lbank="65" prog="17"/>
+ <Patch name="Comp-ed JBass" drum="0" hbank="87" lbank="65" prog="18"/>
+ <Patch name="FingerMaster" drum="0" hbank="87" lbank="65" prog="19"/>
+ <Patch name="CompressBass" drum="0" hbank="87" lbank="65" prog="20"/>
+ <Patch name="All Round Bs" drum="0" hbank="87" lbank="65" prog="21"/>
+ <Patch name="RnB Bs/Slide" drum="0" hbank="87" lbank="65" prog="22"/>
+ <Patch name="Thumb Up!" drum="0" hbank="87" lbank="65" prog="23"/>
+ <Patch name="Tubby Mute" drum="0" hbank="87" lbank="65" prog="24"/>
+ <Patch name="Chicken Bass" drum="0" hbank="87" lbank="65" prog="25"/>
+ <Patch name="Snug Bass" drum="0" hbank="87" lbank="65" prog="26"/>
+ <Patch name="Return2Base!" drum="0" hbank="87" lbank="65" prog="27"/>
+ <Patch name="A Big Pick" drum="0" hbank="87" lbank="65" prog="28"/>
+ <Patch name="Basement" drum="0" hbank="87" lbank="65" prog="29"/>
+ <Patch name="FS Fretnot 1" drum="0" hbank="87" lbank="65" prog="30"/>
+ <Patch name="FS Fretnot 2" drum="0" hbank="87" lbank="65" prog="31"/>
+ <Patch name="RichFretless" drum="0" hbank="87" lbank="65" prog="32"/>
+ <Patch name="Got Pop?" drum="0" hbank="87" lbank="65" prog="33"/>
+ <Patch name="JBass v/Thmb" drum="0" hbank="87" lbank="65" prog="34"/>
+ <Patch name="FS Slap Bass" drum="0" hbank="87" lbank="65" prog="35"/>
+ <Patch name="LEO Bass" drum="0" hbank="87" lbank="65" prog="36"/>
+ <Patch name="Smooth Bass" drum="0" hbank="87" lbank="65" prog="37"/>
+ <Patch name="MC-404 Bass" drum="0" hbank="87" lbank="65" prog="38"/>
+ <Patch name="SH-101 Bs 1" drum="0" hbank="87" lbank="65" prog="39"/>
+ <Patch name="FS Syn Bass1" drum="0" hbank="87" lbank="65" prog="40"/>
+ <Patch name="Electro Rubb" drum="0" hbank="87" lbank="65" prog="41"/>
+ <Patch name="RnB Bass 1" drum="0" hbank="87" lbank="65" prog="42"/>
+ <Patch name="Enorjizor" drum="0" hbank="87" lbank="65" prog="43"/>
+ <Patch name="LowFat Bass" drum="0" hbank="87" lbank="65" prog="44"/>
+ <Patch name="Doze Bass" drum="0" hbank="87" lbank="65" prog="45"/>
+ <Patch name="FS Flat Bs" drum="0" hbank="87" lbank="65" prog="46"/>
+ <Patch name="Saw n MG Bass" drum="0" hbank="87" lbank="65" prog="47"/>
+ <Patch name="RnB Bass 2" drum="0" hbank="87" lbank="65" prog="48"/>
+ <Patch name="Foundation" drum="0" hbank="87" lbank="65" prog="49"/>
+ <Patch name="RnB Bass 3" drum="0" hbank="87" lbank="65" prog="50"/>
+ <Patch name="HipHop Bs 1" drum="0" hbank="87" lbank="65" prog="51"/>
+ <Patch name="HipHop Bs 2" drum="0" hbank="87" lbank="65" prog="52"/>
+ <Patch name="Solid Goa" drum="0" hbank="87" lbank="65" prog="53"/>
+ <Patch name="ResoSyn Bs 1" drum="0" hbank="87" lbank="65" prog="54"/>
+ <Patch name="SH-1 Bass" drum="0" hbank="87" lbank="65" prog="55"/>
+ <Patch name="SH-101 Bs 2" drum="0" hbank="87" lbank="65" prog="56"/>
+ <Patch name="FS Syn Bass2" drum="0" hbank="87" lbank="65" prog="57"/>
+ <Patch name="Poly Bass" drum="0" hbank="87" lbank="65" prog="58"/>
+ <Patch name="Punch MG 1" drum="0" hbank="87" lbank="65" prog="59"/>
+ <Patch name="Gashed Bass" drum="0" hbank="87" lbank="65" prog="60"/>
+ <Patch name="Q Bass" drum="0" hbank="87" lbank="65" prog="61"/>
+ <Patch name="FS Rubber Bs" drum="0" hbank="87" lbank="65" prog="62"/>
+ <Patch name="ResoSyn Bs 2" drum="0" hbank="87" lbank="65" prog="63"/>
+ <Patch name="Super-G DX" drum="0" hbank="87" lbank="65" prog="64"/>
+ <Patch name="Punch MG 2" drum="0" hbank="87" lbank="65" prog="65"/>
+ <Patch name="Kickin Bass" drum="0" hbank="87" lbank="65" prog="66"/>
+ <Patch name="OilDrum Bass" drum="0" hbank="87" lbank="65" prog="67"/>
+ <Patch name="Glide-iator" drum="0" hbank="87" lbank="65" prog="68"/>
+ <Patch name="MG+SubOsc Bs" drum="0" hbank="87" lbank="65" prog="69"/>
+ <Patch name="FS Unison Bs" drum="0" hbank="87" lbank="65" prog="70"/>
+ <Patch name="TexturedBusy" drum="0" hbank="87" lbank="65" prog="71"/>
+ <Patch name="Detune Bass" drum="0" hbank="87" lbank="65" prog="72"/>
+ <Patch name="Lo Bass" drum="0" hbank="87" lbank="65" prog="73"/>
+ <Patch name="SQ Pan" drum="0" hbank="87" lbank="65" prog="74"/>
+ <Patch name="FS GarageBs1" drum="0" hbank="87" lbank="65" prog="75"/>
+ <Patch name="FS GarageBs2" drum="0" hbank="87" lbank="65" prog="76"/>
+ <Patch name="Sub Sonic" drum="0" hbank="87" lbank="65" prog="77"/>
+ <Patch name="FS Jungle Bs" drum="0" hbank="87" lbank="65" prog="78"/>
+ <Patch name="RnB Bass 4" drum="0" hbank="87" lbank="65" prog="79"/>
+ <Patch name="Beepin Bass" drum="0" hbank="87" lbank="65" prog="80"/>
+ <Patch name="MC-TB Bass" drum="0" hbank="87" lbank="65" prog="81"/>
+ <Patch name="Acdg Bass" drum="0" hbank="87" lbank="65" prog="82"/>
+ <Patch name="Loco Voco" drum="0" hbank="87" lbank="65" prog="83"/>
+ <Patch name="TBasic" drum="0" hbank="87" lbank="65" prog="84"/>
+ <Patch name="Unplug it!" drum="0" hbank="87" lbank="65" prog="85"/>
+ <Patch name="V.Form Bass" drum="0" hbank="87" lbank="65" prog="86"/>
+ <Patch name="SnH Bass" drum="0" hbank="87" lbank="65" prog="87"/>
+ <Patch name="Destroyed Bs" drum="0" hbank="87" lbank="65" prog="88"/>
+ <Patch name="FS Acid Bs" drum="0" hbank="87" lbank="65" prog="89"/>
+ <Patch name="Lo-Fi TB" drum="0" hbank="87" lbank="65" prog="90"/>
+ <Patch name="Violin" drum="0" hbank="87" lbank="65" prog="91"/>
+ <Patch name="Viola" drum="0" hbank="87" lbank="65" prog="92"/>
+ <Patch name="Cello" drum="0" hbank="87" lbank="65" prog="93"/>
+ <Patch name="Contrabass" drum="0" hbank="87" lbank="65" prog="94"/>
+ <Patch name="Dolce Qrt" drum="0" hbank="87" lbank="65" prog="95"/>
+ <Patch name="Chamber Str" drum="0" hbank="87" lbank="65" prog="96"/>
+ <Patch name="Small Str" drum="0" hbank="87" lbank="65" prog="97"/>
+ <Patch name="Studio Sect." drum="0" hbank="87" lbank="65" prog="98"/>
+ <Patch name="Stringz 101" drum="0" hbank="87" lbank="65" prog="99"/>
+ <Patch name="Crossed Bows" drum="0" hbank="87" lbank="65" prog="100"/>
+ <Patch name="FS Strings" drum="0" hbank="87" lbank="65" prog="101"/>
+ <Patch name="2-way Sect." drum="0" hbank="87" lbank="65" prog="102"/>
+ <Patch name="Warm Strings" drum="0" hbank="87" lbank="65" prog="103"/>
+ <Patch name="Stacc mp Str" drum="0" hbank="87" lbank="65" prog="104"/>
+ <Patch name="Magnolia Str" drum="0" hbank="87" lbank="65" prog="105"/>
+ <Patch name="Movie Scene" drum="0" hbank="87" lbank="65" prog="106"/>
+ <Patch name="Gang Strangs" drum="0" hbank="87" lbank="65" prog="107"/>
+ <Patch name="Clustered!?!" drum="0" hbank="87" lbank="65" prog="108"/>
+ <Patch name="DramaSect/sw" drum="0" hbank="87" lbank="65" prog="109"/>
+ <Patch name="DelicatePizz" drum="0" hbank="87" lbank="65" prog="110"/>
+ <Patch name="Vls PizzHall" drum="0" hbank="87" lbank="65" prog="111"/>
+ <Patch name="Orch Pizz" drum="0" hbank="87" lbank="65" prog="112"/>
+ <Patch name="Wind and Str 1" drum="0" hbank="87" lbank="65" prog="113"/>
+ <Patch name="Wind and Str 2" drum="0" hbank="87" lbank="65" prog="114"/>
+ <Patch name="Farewell" drum="0" hbank="87" lbank="65" prog="115"/>
+ <Patch name="Orch and Horns" drum="0" hbank="87" lbank="65" prog="116"/>
+ <Patch name="Soft Orch 1" drum="0" hbank="87" lbank="65" prog="117"/>
+ <Patch name="Soft Orch 2" drum="0" hbank="87" lbank="65" prog="118"/>
+ <Patch name="Henry IX" drum="0" hbank="87" lbank="65" prog="119"/>
+ <Patch name="Ending Scene" drum="0" hbank="87" lbank="65" prog="120"/>
+ <Patch name="Good Old Day" drum="0" hbank="87" lbank="65" prog="121"/>
+ <Patch name="FS WindWood" drum="0" hbank="87" lbank="65" prog="122"/>
+ <Patch name="Clarence.net" drum="0" hbank="87" lbank="65" prog="123"/>
+ <Patch name="FS Oboe" drum="0" hbank="87" lbank="65" prog="124"/>
+ <Patch name="Hall Oboe" drum="0" hbank="87" lbank="65" prog="125"/>
+ <Patch name="English Horn" drum="0" hbank="87" lbank="65" prog="126"/>
+ <Patch name="Bassoon" drum="0" hbank="87" lbank="65" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset C">
+ <Patch name="FS Flute" drum="0" hbank="87" lbank="66" prog="0"/>
+ <Patch name="Atk Flute" drum="0" hbank="87" lbank="66" prog="1"/>
+ <Patch name="Piccolo" drum="0" hbank="87" lbank="66" prog="2"/>
+ <Patch name="Andes Mood" drum="0" hbank="87" lbank="66" prog="3"/>
+ <Patch name="Pan Pipes" drum="0" hbank="87" lbank="66" prog="4"/>
+ <Patch name="Solo Tp" drum="0" hbank="87" lbank="66" prog="5"/>
+ <Patch name="Horn Chops" drum="0" hbank="87" lbank="66" prog="6"/>
+ <Patch name="Flugel Horn" drum="0" hbank="87" lbank="66" prog="7"/>
+ <Patch name="Spit Flugel" drum="0" hbank="87" lbank="66" prog="8"/>
+ <Patch name="Mute Tp/Mod" drum="0" hbank="87" lbank="66" prog="9"/>
+ <Patch name="Harmon Mute" drum="0" hbank="87" lbank="66" prog="10"/>
+ <Patch name="Soft Tb" drum="0" hbank="87" lbank="66" prog="11"/>
+ <Patch name="Solo Tb" drum="0" hbank="87" lbank="66" prog="12"/>
+ <Patch name="Solo Bone" drum="0" hbank="87" lbank="66" prog="13"/>
+ <Patch name="Grande Tuba" drum="0" hbank="87" lbank="66" prog="14"/>
+ <Patch name="FS Tuba" drum="0" hbank="87" lbank="66" prog="15"/>
+ <Patch name="StackTp Sect" drum="0" hbank="87" lbank="66" prog="16"/>
+ <Patch name="Tb Section" drum="0" hbank="87" lbank="66" prog="17"/>
+ <Patch name="TpTb Sect." drum="0" hbank="87" lbank="66" prog="18"/>
+ <Patch name="FS Brass" drum="0" hbank="87" lbank="66" prog="19"/>
+ <Patch name="DynamicBrass" drum="0" hbank="87" lbank="66" prog="20"/>
+ <Patch name="Tpts n Tmbs" drum="0" hbank="87" lbank="66" prog="21"/>
+ <Patch name="Brass n Sax" drum="0" hbank="87" lbank="66" prog="22"/>
+ <Patch name="BrassPartOut" drum="0" hbank="87" lbank="66" prog="23"/>
+ <Patch name="Simple Tutti" drum="0" hbank="87" lbank="66" prog="24"/>
+ <Patch name="Full sForza" drum="0" hbank="87" lbank="66" prog="25"/>
+ <Patch name="F.Horns Sect" drum="0" hbank="87" lbank="66" prog="26"/>
+ <Patch name="Stereo Brass" drum="0" hbank="87" lbank="66" prog="27"/>
+ <Patch name="Brass Fall" drum="0" hbank="87" lbank="66" prog="28"/>
+ <Patch name="FS Saw Brass" drum="0" hbank="87" lbank="66" prog="29"/>
+ <Patch name="Wide SynBrss" drum="0" hbank="87" lbank="66" prog="30"/>
+ <Patch name="DetuneSawBrs" drum="0" hbank="87" lbank="66" prog="31"/>
+ <Patch name="J-Pop Brass" drum="0" hbank="87" lbank="66" prog="32"/>
+ <Patch name="Brash!" drum="0" hbank="87" lbank="66" prog="33"/>
+ <Patch name="Jump For KY" drum="0" hbank="87" lbank="66" prog="34"/>
+ <Patch name="Neo SuperBrs" drum="0" hbank="87" lbank="66" prog="35"/>
+ <Patch name="SoftSynBrass" drum="0" hbank="87" lbank="66" prog="36"/>
+ <Patch name="Silky JP" drum="0" hbank="87" lbank="66" prog="37"/>
+ <Patch name="Silk Brs Pad" drum="0" hbank="87" lbank="66" prog="38"/>
+ <Patch name="FatSynBrass" drum="0" hbank="87" lbank="66" prog="39"/>
+ <Patch name="Soprano Sax" drum="0" hbank="87" lbank="66" prog="40"/>
+ <Patch name="Solo Sop Sax" drum="0" hbank="87" lbank="66" prog="41"/>
+ <Patch name="Alto mp" drum="0" hbank="87" lbank="66" prog="42"/>
+ <Patch name="Alto Sax" drum="0" hbank="87" lbank="66" prog="43"/>
+ <Patch name="Solo AltoSax" drum="0" hbank="87" lbank="66" prog="44"/>
+ <Patch name="AltoLead Sax" drum="0" hbank="87" lbank="66" prog="45"/>
+ <Patch name="Tenor Sax" drum="0" hbank="87" lbank="66" prog="46"/>
+ <Patch name="Fat TenorSax" drum="0" hbank="87" lbank="66" prog="47"/>
+ <Patch name="Baritone Sax" drum="0" hbank="87" lbank="66" prog="48"/>
+ <Patch name="Sax Sect. 1" drum="0" hbank="87" lbank="66" prog="49"/>
+ <Patch name="Sax Sect. 2" drum="0" hbank="87" lbank="66" prog="50"/>
+ <Patch name="Horny Sax" drum="0" hbank="87" lbank="66" prog="51"/>
+ <Patch name="RnB TryLead" drum="0" hbank="87" lbank="66" prog="52"/>
+ <Patch name="PeakArpSine" drum="0" hbank="87" lbank="66" prog="53"/>
+ <Patch name="Theramax" drum="0" hbank="87" lbank="66" prog="54"/>
+ <Patch name="FS Sqr Lead" drum="0" hbank="87" lbank="66" prog="55"/>
+ <Patch name="Dawn of Pan" drum="0" hbank="87" lbank="66" prog="56"/>
+ <Patch name="Sqr Diamond" drum="0" hbank="87" lbank="66" prog="57"/>
+ <Patch name="FS SoftLead" drum="0" hbank="87" lbank="66" prog="58"/>
+ <Patch name="Mid Saw Ld" drum="0" hbank="87" lbank="66" prog="59"/>
+ <Patch name="FS ResoLead" drum="0" hbank="87" lbank="66" prog="60"/>
+ <Patch name="Dig-n-Duke" drum="0" hbank="87" lbank="66" prog="61"/>
+ <Patch name="Modulated Ld" drum="0" hbank="87" lbank="66" prog="62"/>
+ <Patch name="Waspy Lead" drum="0" hbank="87" lbank="66" prog="63"/>
+ <Patch name="Mew Lead" drum="0" hbank="87" lbank="66" prog="64"/>
+ <Patch name="Violin Lead" drum="0" hbank="87" lbank="66" prog="65"/>
+ <Patch name="Oscillo Lead" drum="0" hbank="87" lbank="66" prog="66"/>
+ <Patch name="JP Saw Lead" drum="0" hbank="87" lbank="66" prog="67"/>
+ <Patch name="MG Sqr Lead" drum="0" hbank="87" lbank="66" prog="68"/>
+ <Patch name="Tristar" drum="0" hbank="87" lbank="66" prog="69"/>
+ <Patch name="Mod Lead" drum="0" hbank="87" lbank="66" prog="70"/>
+ <Patch name="Digital Ld 1" drum="0" hbank="87" lbank="66" prog="71"/>
+ <Patch name="Chubby Lead" drum="0" hbank="87" lbank="66" prog="72"/>
+ <Patch name="Sneaky Leady" drum="0" hbank="87" lbank="66" prog="73"/>
+ <Patch name="SoloNzPeaker" drum="0" hbank="87" lbank="66" prog="74"/>
+ <Patch name="Clone Zone" drum="0" hbank="87" lbank="66" prog="75"/>
+ <Patch name="Legato Tkno" drum="0" hbank="87" lbank="66" prog="76"/>
+ <Patch name="DC Triangle" drum="0" hbank="87" lbank="66" prog="77"/>
+ <Patch name="Sqr-Seqence" drum="0" hbank="87" lbank="66" prog="78"/>
+ <Patch name="Griggley" drum="0" hbank="87" lbank="66" prog="79"/>
+ <Patch name="Pure Square" drum="0" hbank="87" lbank="66" prog="80"/>
+ <Patch name="Legato Saw" drum="0" hbank="87" lbank="66" prog="81"/>
+ <Patch name="Lone Prophat" drum="0" hbank="87" lbank="66" prog="82"/>
+ <Patch name="Porta SoloLd" drum="0" hbank="87" lbank="66" prog="83"/>
+ <Patch name="FS Saw Ld 1" drum="0" hbank="87" lbank="66" prog="84"/>
+ <Patch name="FS Saw Ld 2" drum="0" hbank="87" lbank="66" prog="85"/>
+ <Patch name="Wind Syn Ld" drum="0" hbank="87" lbank="66" prog="86"/>
+ <Patch name="Dual Profs" drum="0" hbank="87" lbank="66" prog="87"/>
+ <Patch name="Gwyo Press" drum="0" hbank="87" lbank="66" prog="88"/>
+ <Patch name="Q DualSaws" drum="0" hbank="87" lbank="66" prog="89"/>
+ <Patch name="Mogulator Ld" drum="0" hbank="87" lbank="66" prog="90"/>
+ <Patch name="DirtyVoltage" drum="0" hbank="87" lbank="66" prog="91"/>
+ <Patch name="Clean?" drum="0" hbank="87" lbank="66" prog="92"/>
+ <Patch name="DistortionGT" drum="0" hbank="87" lbank="66" prog="93"/>
+ <Patch name="FS Syn Ld" drum="0" hbank="87" lbank="66" prog="94"/>
+ <Patch name="SynLead 0322" drum="0" hbank="87" lbank="66" prog="95"/>
+ <Patch name="Digital Ld 2" drum="0" hbank="87" lbank="66" prog="96"/>
+ <Patch name="X-Sink Delay" drum="0" hbank="87" lbank="66" prog="97"/>
+ <Patch name="Noized Lead" drum="0" hbank="87" lbank="66" prog="98"/>
+ <Patch name="Space Lead" drum="0" hbank="87" lbank="66" prog="99"/>
+ <Patch name="Destroyed Ld" drum="0" hbank="87" lbank="66" prog="100"/>
+ <Patch name="SyncModulate" drum="0" hbank="87" lbank="66" prog="101"/>
+ <Patch name="Sync Tank" drum="0" hbank="87" lbank="66" prog="102"/>
+ <Patch name="Squareheads" drum="0" hbank="87" lbank="66" prog="103"/>
+ <Patch name="Distorted MG" drum="0" hbank="87" lbank="66" prog="104"/>
+ <Patch name="SonicVampire" drum="0" hbank="87" lbank="66" prog="105"/>
+ <Patch name="Blue Meanie" drum="0" hbank="87" lbank="66" prog="106"/>
+ <Patch name="Defcon" drum="0" hbank="87" lbank="66" prog="107"/>
+ <Patch name="Stimulation" drum="0" hbank="87" lbank="66" prog="108"/>
+ <Patch name="Sub Hit" drum="0" hbank="87" lbank="66" prog="109"/>
+ <Patch name="Blue Ice" drum="0" hbank="87" lbank="66" prog="110"/>
+ <Patch name=".16 Orch" drum="0" hbank="87" lbank="66" prog="111"/>
+ <Patch name="In da Cave" drum="0" hbank="87" lbank="66" prog="112"/>
+ <Patch name="BlastfrmPast" drum="0" hbank="87" lbank="66" prog="113"/>
+ <Patch name="Smear Hit 1" drum="0" hbank="87" lbank="66" prog="114"/>
+ <Patch name="Smear Hit 2" drum="0" hbank="87" lbank="66" prog="115"/>
+ <Patch name="Good Old Hit" drum="0" hbank="87" lbank="66" prog="116"/>
+ <Patch name="Mix Hit 1" drum="0" hbank="87" lbank="66" prog="117"/>
+ <Patch name="Philly Hit" drum="0" hbank="87" lbank="66" prog="118"/>
+ <Patch name="Mojo Man" drum="0" hbank="87" lbank="66" prog="119"/>
+ <Patch name="Cheezy Movie" drum="0" hbank="87" lbank="66" prog="120"/>
+ <Patch name="Mix Hit 2" drum="0" hbank="87" lbank="66" prog="121"/>
+ <Patch name="Lo-Fi Hit" drum="0" hbank="87" lbank="66" prog="122"/>
+ <Patch name="2ble Action" drum="0" hbank="87" lbank="66" prog="123"/>
+ <Patch name="Funk Chank" drum="0" hbank="87" lbank="66" prog="124"/>
+ <Patch name="Venus" drum="0" hbank="87" lbank="66" prog="125"/>
+ <Patch name="AluminmWires" drum="0" hbank="87" lbank="66" prog="126"/>
+ <Patch name="Raven Chord" drum="0" hbank="87" lbank="66" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset D">
+ <Patch name="HPF Sweep" drum="0" hbank="87" lbank="67" prog="0"/>
+ <Patch name="Moon Synth" drum="0" hbank="87" lbank="67" prog="1"/>
+ <Patch name="DelyResoSaws" drum="0" hbank="87" lbank="67" prog="2"/>
+ <Patch name="R-Trance" drum="0" hbank="87" lbank="67" prog="3"/>
+ <Patch name="Alfa Retro" drum="0" hbank="87" lbank="67" prog="4"/>
+ <Patch name="Nu Hoover" drum="0" hbank="87" lbank="67" prog="5"/>
+ <Patch name="Hoovercraft" drum="0" hbank="87" lbank="67" prog="6"/>
+ <Patch name="Braatz" drum="0" hbank="87" lbank="67" prog="7"/>
+ <Patch name="AllinOneRiff" drum="0" hbank="87" lbank="67" prog="8"/>
+ <Patch name="YZ Again" drum="0" hbank="87" lbank="67" prog="9"/>
+ <Patch name="Flazzy Lead" drum="0" hbank="87" lbank="67" prog="10"/>
+ <Patch name="Coffee Bee" drum="0" hbank="87" lbank="67" prog="11"/>
+ <Patch name="Sweet House" drum="0" hbank="87" lbank="67" prog="12"/>
+ <Patch name="Alien Bubble" drum="0" hbank="87" lbank="67" prog="13"/>
+ <Patch name="LowFreqHit" drum="0" hbank="87" lbank="67" prog="14"/>
+ <Patch name="Fred n Barney" drum="0" hbank="87" lbank="67" prog="15"/>
+ <Patch name="Periscope" drum="0" hbank="87" lbank="67" prog="16"/>
+ <Patch name="Electrostars" drum="0" hbank="87" lbank="67" prog="17"/>
+ <Patch name="Going Mad!" drum="0" hbank="87" lbank="67" prog="18"/>
+ <Patch name="LoFiSequence" drum="0" hbank="87" lbank="67" prog="19"/>
+ <Patch name="DreamInColor" drum="0" hbank="87" lbank="67" prog="20"/>
+ <Patch name="MelodicDrums" drum="0" hbank="87" lbank="67" prog="21"/>
+ <Patch name="Techno Snips" drum="0" hbank="87" lbank="67" prog="22"/>
+ <Patch name="TB Wah" drum="0" hbank="87" lbank="67" prog="23"/>
+ <Patch name="Waving TB303" drum="0" hbank="87" lbank="67" prog="24"/>
+ <Patch name="Digi Seq" drum="0" hbank="87" lbank="67" prog="25"/>
+ <Patch name="Seq Saw" drum="0" hbank="87" lbank="67" prog="26"/>
+ <Patch name="Reso Seq Saw" drum="0" hbank="87" lbank="67" prog="27"/>
+ <Patch name="DetuneSeqSaw" drum="0" hbank="87" lbank="67" prog="28"/>
+ <Patch name="Technotribe" drum="0" hbank="87" lbank="67" prog="29"/>
+ <Patch name="MetalVoxBox" drum="0" hbank="87" lbank="67" prog="30"/>
+ <Patch name="Teethy Grit" drum="0" hbank="87" lbank="67" prog="31"/>
+ <Patch name="Repertition" drum="0" hbank="87" lbank="67" prog="32"/>
+ <Patch name="Jucy Saw" drum="0" hbank="87" lbank="67" prog="33"/>
+ <Patch name="Cue Tip" drum="0" hbank="87" lbank="67" prog="34"/>
+ <Patch name="TB-Sequence" drum="0" hbank="87" lbank="67" prog="35"/>
+ <Patch name="Europe Xpres" drum="0" hbank="87" lbank="67" prog="36"/>
+ <Patch name="Squeepy" drum="0" hbank="87" lbank="67" prog="37"/>
+ <Patch name="Atmorave" drum="0" hbank="87" lbank="67" prog="38"/>
+ <Patch name="DOC Stack" drum="0" hbank="87" lbank="67" prog="39"/>
+ <Patch name="Sweep Lead" drum="0" hbank="87" lbank="67" prog="40"/>
+ <Patch name="Digitaless" drum="0" hbank="87" lbank="67" prog="41"/>
+ <Patch name="Flip Pad" drum="0" hbank="87" lbank="67" prog="42"/>
+ <Patch name="Short Detune" drum="0" hbank="87" lbank="67" prog="43"/>
+ <Patch name="forSequence" drum="0" hbank="87" lbank="67" prog="44"/>
+ <Patch name="Memory Pluck" drum="0" hbank="87" lbank="67" prog="45"/>
+ <Patch name="Metalic Bass" drum="0" hbank="87" lbank="67" prog="46"/>
+ <Patch name="Aqua" drum="0" hbank="87" lbank="67" prog="47"/>
+ <Patch name="Big Planet" drum="0" hbank="87" lbank="67" prog="48"/>
+ <Patch name="Wet Atax" drum="0" hbank="87" lbank="67" prog="49"/>
+ <Patch name="Houze Clavi" drum="0" hbank="87" lbank="67" prog="50"/>
+ <Patch name="SuperSawSlow" drum="0" hbank="87" lbank="67" prog="51"/>
+ <Patch name="TranceSaws" drum="0" hbank="87" lbank="67" prog="52"/>
+ <Patch name="Trancy Synth" drum="0" hbank="87" lbank="67" prog="53"/>
+ <Patch name="Saw Stack" drum="0" hbank="87" lbank="67" prog="54"/>
+ <Patch name="Frgile Saws" drum="0" hbank="87" lbank="67" prog="55"/>
+ <Patch name="Steamed Sawz" drum="0" hbank="87" lbank="67" prog="56"/>
+ <Patch name="RAVtune" drum="0" hbank="87" lbank="67" prog="57"/>
+ <Patch name="Bustranza" drum="0" hbank="87" lbank="67" prog="58"/>
+ <Patch name="AftTch Ji-n" drum="0" hbank="87" lbank="67" prog="59"/>
+ <Patch name="JP OctAttack" drum="0" hbank="87" lbank="67" prog="60"/>
+ <Patch name="Oct Unison" drum="0" hbank="87" lbank="67" prog="61"/>
+ <Patch name="Xtatic" drum="0" hbank="87" lbank="67" prog="62"/>
+ <Patch name="Dirty Combo" drum="0" hbank="87" lbank="67" prog="63"/>
+ <Patch name="FM-s Attack" drum="0" hbank="87" lbank="67" prog="64"/>
+ <Patch name="Impression" drum="0" hbank="87" lbank="67" prog="65"/>
+ <Patch name="Digi-vox Syn" drum="0" hbank="87" lbank="67" prog="66"/>
+ <Patch name="Fairy Factor" drum="0" hbank="87" lbank="67" prog="67"/>
+ <Patch name="Tempest" drum="0" hbank="87" lbank="67" prog="68"/>
+ <Patch name="X-Racer" drum="0" hbank="87" lbank="67" prog="69"/>
+ <Patch name="TB Booster" drum="0" hbank="87" lbank="67" prog="70"/>
+ <Patch name="Syn-Orch/Mod" drum="0" hbank="87" lbank="67" prog="71"/>
+ <Patch name="Pressyn" drum="0" hbank="87" lbank="67" prog="72"/>
+ <Patch name="High Five" drum="0" hbank="87" lbank="67" prog="73"/>
+ <Patch name="4DaCommonMan" drum="0" hbank="87" lbank="67" prog="74"/>
+ <Patch name="Orgaenia" drum="0" hbank="87" lbank="67" prog="75"/>
+ <Patch name="Sleeper" drum="0" hbank="87" lbank="67" prog="76"/>
+ <Patch name="Sugar Synth" drum="0" hbank="87" lbank="67" prog="77"/>
+ <Patch name="Ice Palace" drum="0" hbank="87" lbank="67" prog="78"/>
+ <Patch name="Story Harp" drum="0" hbank="87" lbank="67" prog="79"/>
+ <Patch name="LostParabise" drum="0" hbank="87" lbank="67" prog="80"/>
+ <Patch name="Magnetic 5th" drum="0" hbank="87" lbank="67" prog="81"/>
+ <Patch name="Jazz Doos" drum="0" hbank="87" lbank="67" prog="82"/>
+ <Patch name="Beat Vox" drum="0" hbank="87" lbank="67" prog="83"/>
+ <Patch name="Scat Beats" drum="0" hbank="87" lbank="67" prog="84"/>
+ <Patch name="Choir Aahs 1" drum="0" hbank="87" lbank="67" prog="85"/>
+ <Patch name="Choir Aahs 2" drum="0" hbank="87" lbank="67" prog="86"/>
+ <Patch name="ChoirOoh/Aft" drum="0" hbank="87" lbank="67" prog="87"/>
+ <Patch name="Angels Choir" drum="0" hbank="87" lbank="67" prog="88"/>
+ <Patch name="Angelique" drum="0" hbank="87" lbank="67" prog="89"/>
+ <Patch name="Gospel Oohs" drum="0" hbank="87" lbank="67" prog="90"/>
+ <Patch name="Uhmmm" drum="0" hbank="87" lbank="67" prog="91"/>
+ <Patch name="Aah Vox" drum="0" hbank="87" lbank="67" prog="92"/>
+ <Patch name="Morning Star" drum="0" hbank="87" lbank="67" prog="93"/>
+ <Patch name="Syn Opera" drum="0" hbank="87" lbank="67" prog="94"/>
+ <Patch name="BeautifulOne" drum="0" hbank="87" lbank="67" prog="95"/>
+ <Patch name="Ooze" drum="0" hbank="87" lbank="67" prog="96"/>
+ <Patch name="Aerial Choir" drum="0" hbank="87" lbank="67" prog="97"/>
+ <Patch name="3D Vox" drum="0" hbank="87" lbank="67" prog="98"/>
+ <Patch name="FS Sqr Pad" drum="0" hbank="87" lbank="67" prog="99"/>
+ <Patch name="FS Hollow" drum="0" hbank="87" lbank="67" prog="100"/>
+ <Patch name="Silk Pad" drum="0" hbank="87" lbank="67" prog="101"/>
+ <Patch name="WarmReso Pad" drum="0" hbank="87" lbank="67" prog="102"/>
+ <Patch name="FS Soft Pad" drum="0" hbank="87" lbank="67" prog="103"/>
+ <Patch name="Soft Breeze" drum="0" hbank="87" lbank="67" prog="104"/>
+ <Patch name="JP Strings 1" drum="0" hbank="87" lbank="67" prog="105"/>
+ <Patch name="JP Strings 2" drum="0" hbank="87" lbank="67" prog="106"/>
+ <Patch name="FS Syn Str" drum="0" hbank="87" lbank="67" prog="107"/>
+ <Patch name="Syn Strings" drum="0" hbank="87" lbank="67" prog="108"/>
+ <Patch name="OB Slow Str" drum="0" hbank="87" lbank="67" prog="109"/>
+ <Patch name="Super SynStr" drum="0" hbank="87" lbank="67" prog="110"/>
+ <Patch name="Strings Pad" drum="0" hbank="87" lbank="67" prog="111"/>
+ <Patch name="RnB SoftPad" drum="0" hbank="87" lbank="67" prog="112"/>
+ <Patch name="Reso Pad" drum="0" hbank="87" lbank="67" prog="113"/>
+ <Patch name="Phat Pad" drum="0" hbank="87" lbank="67" prog="114"/>
+ <Patch name="FS PhaserPad" drum="0" hbank="87" lbank="67" prog="115"/>
+ <Patch name="Mystic Str" drum="0" hbank="87" lbank="67" prog="116"/>
+ <Patch name="Glass Organ" drum="0" hbank="87" lbank="67" prog="117"/>
+ <Patch name="Wind Pad" drum="0" hbank="87" lbank="67" prog="118"/>
+ <Patch name="Combination" drum="0" hbank="87" lbank="67" prog="119"/>
+ <Patch name="HumanKindnes" drum="0" hbank="87" lbank="67" prog="120"/>
+ <Patch name="Atmospherics" drum="0" hbank="87" lbank="67" prog="121"/>
+ <Patch name="Terra Nostra" drum="0" hbank="87" lbank="67" prog="122"/>
+ <Patch name="OB Aaahs" drum="0" hbank="87" lbank="67" prog="123"/>
+ <Patch name="Vulcano Pad" drum="0" hbank="87" lbank="67" prog="124"/>
+ <Patch name="Cloud" drum="0" hbank="87" lbank="67" prog="125"/>
+ <Patch name="Lostscapes" drum="0" hbank="87" lbank="67" prog="126"/>
+ <Patch name="Organic Pad" drum="0" hbank="87" lbank="67" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset E">
+ <Patch name="Digital Aahs" drum="0" hbank="87" lbank="68" prog="0"/>
+ <Patch name="FreezinNight" drum="0" hbank="87" lbank="68" prog="1"/>
+ <Patch name="FS MovinPad" drum="0" hbank="87" lbank="68" prog="2"/>
+ <Patch name="Seq-Pad 1" drum="0" hbank="87" lbank="68" prog="3"/>
+ <Patch name="Digi-Swell" drum="0" hbank="87" lbank="68" prog="4"/>
+ <Patch name="Stringship" drum="0" hbank="87" lbank="68" prog="5"/>
+ <Patch name="SaturnHolida" drum="0" hbank="87" lbank="68" prog="6"/>
+ <Patch name="India Garden" drum="0" hbank="87" lbank="68" prog="7"/>
+ <Patch name="OB Rezo Pad" drum="0" hbank="87" lbank="68" prog="8"/>
+ <Patch name="Sonic Surfer" drum="0" hbank="87" lbank="68" prog="9"/>
+ <Patch name="2 Point 2" drum="0" hbank="87" lbank="68" prog="10"/>
+ <Patch name="2.2 Pad" drum="0" hbank="87" lbank="68" prog="11"/>
+ <Patch name="New Year Day" drum="0" hbank="87" lbank="68" prog="12"/>
+ <Patch name="Mod Dare" drum="0" hbank="87" lbank="68" prog="13"/>
+ <Patch name="Neuro-Drone" drum="0" hbank="87" lbank="68" prog="14"/>
+ <Patch name="In The Pass" drum="0" hbank="87" lbank="68" prog="15"/>
+ <Patch name="Polar Night" drum="0" hbank="87" lbank="68" prog="16"/>
+ <Patch name="Electric Pad" drum="0" hbank="87" lbank="68" prog="17"/>
+ <Patch name="MistOver5ths" drum="0" hbank="87" lbank="68" prog="18"/>
+ <Patch name="Voyager" drum="0" hbank="87" lbank="68" prog="19"/>
+ <Patch name="Cosmic Rays" drum="0" hbank="87" lbank="68" prog="20"/>
+ <Patch name="Gritty Pad" drum="0" hbank="87" lbank="68" prog="21"/>
+ <Patch name="Distant Sun" drum="0" hbank="87" lbank="68" prog="22"/>
+ <Patch name="Filmscape" drum="0" hbank="87" lbank="68" prog="23"/>
+ <Patch name="BillionStars" drum="0" hbank="87" lbank="68" prog="24"/>
+ <Patch name="Sand Pad" drum="0" hbank="87" lbank="68" prog="25"/>
+ <Patch name="Fat Stacks" drum="0" hbank="87" lbank="68" prog="26"/>
+ <Patch name="ReverseSweep" drum="0" hbank="87" lbank="68" prog="27"/>
+ <Patch name="HugeSoundMod" drum="0" hbank="87" lbank="68" prog="28"/>
+ <Patch name="Metal Swell" drum="0" hbank="87" lbank="68" prog="29"/>
+ <Patch name="ShapeURMusic" drum="0" hbank="87" lbank="68" prog="30"/>
+ <Patch name="Synth Force" drum="0" hbank="87" lbank="68" prog="31"/>
+ <Patch name="Trance Split" drum="0" hbank="87" lbank="68" prog="32"/>
+ <Patch name="Step Tronce" drum="0" hbank="87" lbank="68" prog="33"/>
+ <Patch name="Chop Synth" drum="0" hbank="87" lbank="68" prog="34"/>
+ <Patch name="Euro Teuro" drum="0" hbank="87" lbank="68" prog="35"/>
+ <Patch name="Auto Trance" drum="0" hbank="87" lbank="68" prog="36"/>
+ <Patch name="Eureggae" drum="0" hbank="87" lbank="68" prog="37"/>
+ <Patch name="Sorry4theDLY" drum="0" hbank="87" lbank="68" prog="38"/>
+ <Patch name="Beat Pad" drum="0" hbank="87" lbank="68" prog="39"/>
+ <Patch name="FS ResoStep" drum="0" hbank="87" lbank="68" prog="40"/>
+ <Patch name="TMT Seq Pad" drum="0" hbank="87" lbank="68" prog="41"/>
+ <Patch name="ZipDoggyDoDa" drum="0" hbank="87" lbank="68" prog="42"/>
+ <Patch name="ForYourBreak" drum="0" hbank="87" lbank="68" prog="43"/>
+ <Patch name="HPF Slicer" drum="0" hbank="87" lbank="68" prog="44"/>
+ <Patch name="DarknessSide" drum="0" hbank="87" lbank="68" prog="45"/>
+ <Patch name="Sliced Choir" drum="0" hbank="87" lbank="68" prog="46"/>
+ <Patch name="Digi-Doo" drum="0" hbank="87" lbank="68" prog="47"/>
+ <Patch name="PanningFrmnt" drum="0" hbank="87" lbank="68" prog="48"/>
+ <Patch name="Dirty Beat" drum="0" hbank="87" lbank="68" prog="49"/>
+ <Patch name="Hellrazor" drum="0" hbank="87" lbank="68" prog="50"/>
+ <Patch name="Electrons" drum="0" hbank="87" lbank="68" prog="51"/>
+ <Patch name="Protons" drum="0" hbank="87" lbank="68" prog="52"/>
+ <Patch name="FS Alfa Rave" drum="0" hbank="87" lbank="68" prog="53"/>
+ <Patch name="Brisk Vortex" drum="0" hbank="87" lbank="68" prog="54"/>
+ <Patch name="FS Throbulax" drum="0" hbank="87" lbank="68" prog="55"/>
+ <Patch name="FS Lonizer" drum="0" hbank="87" lbank="68" prog="56"/>
+ <Patch name="FS Strobe" drum="0" hbank="87" lbank="68" prog="57"/>
+ <Patch name="VirtualHuman" drum="0" hbank="87" lbank="68" prog="58"/>
+ <Patch name="FS Line" drum="0" hbank="87" lbank="68" prog="59"/>
+ <Patch name="StepPitShift" drum="0" hbank="87" lbank="68" prog="60"/>
+ <Patch name="Sever" drum="0" hbank="87" lbank="68" prog="61"/>
+ <Patch name="Pad Pulses" drum="0" hbank="87" lbank="68" prog="62"/>
+ <Patch name="Dub Tales" drum="0" hbank="87" lbank="68" prog="63"/>
+ <Patch name="Seq-Pad 2" drum="0" hbank="87" lbank="68" prog="64"/>
+ <Patch name="Nice Kalimba" drum="0" hbank="87" lbank="68" prog="65"/>
+ <Patch name="Quiet River" drum="0" hbank="87" lbank="68" prog="66"/>
+ <Patch name="Teky Drop" drum="0" hbank="87" lbank="68" prog="67"/>
+ <Patch name="Pat is away" drum="0" hbank="87" lbank="68" prog="68"/>
+ <Patch name="FS Sitar 1" drum="0" hbank="87" lbank="68" prog="69"/>
+ <Patch name="FS Sitar 2" drum="0" hbank="87" lbank="68" prog="70"/>
+ <Patch name="Sitar on C" drum="0" hbank="87" lbank="68" prog="71"/>
+ <Patch name="Sitar Baby" drum="0" hbank="87" lbank="68" prog="72"/>
+ <Patch name="EasternDlite" drum="0" hbank="87" lbank="68" prog="73"/>
+ <Patch name="Elec Sitar" drum="0" hbank="87" lbank="68" prog="74"/>
+ <Patch name="Neo Sitar" drum="0" hbank="87" lbank="68" prog="75"/>
+ <Patch name="Bosporus" drum="0" hbank="87" lbank="68" prog="76"/>
+ <Patch name="Santur Stack" drum="0" hbank="87" lbank="68" prog="77"/>
+ <Patch name="Aerial Harp" drum="0" hbank="87" lbank="68" prog="78"/>
+ <Patch name="Harpiness" drum="0" hbank="87" lbank="68" prog="79"/>
+ <Patch name="TroubadorEns" drum="0" hbank="87" lbank="68" prog="80"/>
+ <Patch name="Jamisen" drum="0" hbank="87" lbank="68" prog="81"/>
+ <Patch name="Koto" drum="0" hbank="87" lbank="68" prog="82"/>
+ <Patch name="Monsoon" drum="0" hbank="87" lbank="68" prog="83"/>
+ <Patch name="Bend Koto" drum="0" hbank="87" lbank="68" prog="84"/>
+ <Patch name="LongDistance" drum="0" hbank="87" lbank="68" prog="85"/>
+ <Patch name="Ambi Shaku" drum="0" hbank="87" lbank="68" prog="86"/>
+ <Patch name="FS PipeDream" drum="0" hbank="87" lbank="68" prog="87"/>
+ <Patch name="FS Lochscape" drum="0" hbank="87" lbank="68" prog="88"/>
+ <Patch name="FS Far East" drum="0" hbank="87" lbank="68" prog="89"/>
+ <Patch name="Banjo" drum="0" hbank="87" lbank="68" prog="90"/>
+ <Patch name="Breath Slice" drum="0" hbank="87" lbank="68" prog="91"/>
+ <Patch name="Lazer Points" drum="0" hbank="87" lbank="68" prog="92"/>
+ <Patch name="Chaos 2003" drum="0" hbank="87" lbank="68" prog="93"/>
+ <Patch name="SoundOnSound" drum="0" hbank="87" lbank="68" prog="94"/>
+ <Patch name="Low Beat-S" drum="0" hbank="87" lbank="68" prog="95"/>
+ <Patch name="Control Room" drum="0" hbank="87" lbank="68" prog="96"/>
+ <Patch name="FS Try This!" drum="0" hbank="87" lbank="68" prog="97"/>
+ <Patch name="OutOf sortz" drum="0" hbank="87" lbank="68" prog="98"/>
+ <Patch name="Seq" drum="0" hbank="87" lbank="68" prog="99"/>
+ <Patch name="Scatter" drum="0" hbank="87" lbank="68" prog="100"/>
+ <Patch name="WaitnOutside" drum="0" hbank="87" lbank="68" prog="101"/>
+ <Patch name="Ambience" drum="0" hbank="87" lbank="68" prog="102"/>
+ <Patch name="Fantom Noise" drum="0" hbank="87" lbank="68" prog="103"/>
+ <Patch name="Breath Echo" drum="0" hbank="87" lbank="68" prog="104"/>
+ <Patch name="SoundStrange" drum="0" hbank="87" lbank="68" prog="105"/>
+ <Patch name="Cosmic Pulse" drum="0" hbank="87" lbank="68" prog="106"/>
+ <Patch name="Faked Piano" drum="0" hbank="87" lbank="68" prog="107"/>
+ <Patch name="Tubulence" drum="0" hbank="87" lbank="68" prog="108"/>
+ <Patch name="South Pole" drum="0" hbank="87" lbank="68" prog="109"/>
+ <Patch name="FS Crystal" drum="0" hbank="87" lbank="68" prog="110"/>
+ <Patch name="ResoSweep Dn" drum="0" hbank="87" lbank="68" prog="111"/>
+ <Patch name="Zap B3 n C4" drum="0" hbank="87" lbank="68" prog="112"/>
+ <Patch name="PolySweep Nz" drum="0" hbank="87" lbank="68" prog="113"/>
+ <Patch name="New Planetz" drum="0" hbank="87" lbank="68" prog="114"/>
+ <Patch name="Strange Land" drum="0" hbank="87" lbank="68" prog="115"/>
+ <Patch name="Trancer" drum="0" hbank="87" lbank="68" prog="116"/>
+ <Patch name="S and H Voc" drum="0" hbank="87" lbank="68" prog="117"/>
+ <Patch name="12th Planet" drum="0" hbank="87" lbank="68" prog="118"/>
+ <Patch name="Ambidextrous" drum="0" hbank="87" lbank="68" prog="119"/>
+ <Patch name="En-co-re" drum="0" hbank="87" lbank="68" prog="120"/>
+ <Patch name="Mobile Phone" drum="0" hbank="87" lbank="68" prog="121"/>
+ <Patch name="Beat (C4)" drum="0" hbank="87" lbank="68" prog="122"/>
+ <Patch name="StepLFO Ens" drum="0" hbank="87" lbank="68" prog="123"/>
+ <Patch name="Timpani+Low" drum="0" hbank="87" lbank="68" prog="124"/>
+ <Patch name="Timpani Roll" drum="0" hbank="87" lbank="68" prog="125"/>
+ <Patch name="Bass Drum" drum="0" hbank="87" lbank="68" prog="126"/>
+ <Patch name="Techno Craft" drum="0" hbank="87" lbank="68" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset F">
+ <Patch name="ConcertGrand" drum="0" hbank="87" lbank="69" prog="0"/>
+ <Patch name="Hall Concert" drum="0" hbank="87" lbank="69" prog="1"/>
+ <Patch name="Bright Tune" drum="0" hbank="87" lbank="69" prog="2"/>
+ <Patch name="Mellow Tune" drum="0" hbank="87" lbank="69" prog="3"/>
+ <Patch name="Back E-Grand" drum="0" hbank="87" lbank="69" prog="4"/>
+ <Patch name="Rhodes mkI" drum="0" hbank="87" lbank="69" prog="5"/>
+ <Patch name="Stage Rhodes" drum="0" hbank="87" lbank="69" prog="6"/>
+ <Patch name="MKS20EnsemEP" drum="0" hbank="87" lbank="69" prog="7"/>
+ <Patch name="UltimatGrand" drum="0" hbank="87" lbank="69" prog="8"/>
+ <Patch name="X Pure Grand" drum="0" hbank="87" lbank="69" prog="9"/>
+ <Patch name="Studio Grand" drum="0" hbank="87" lbank="69" prog="10"/>
+ <Patch name="88ConcertPno" drum="0" hbank="87" lbank="69" prog="11"/>
+ <Patch name="DryStudio88" drum="0" hbank="87" lbank="69" prog="12"/>
+ <Patch name="First Choice" drum="0" hbank="87" lbank="69" prog="13"/>
+ <Patch name="Rokkin pF" drum="0" hbank="87" lbank="69" prog="14"/>
+ <Patch name="Dark Grand" drum="0" hbank="87" lbank="69" prog="15"/>
+ <Patch name="Piano Oz" drum="0" hbank="87" lbank="69" prog="16"/>
+ <Patch name="Grand Hall" drum="0" hbank="87" lbank="69" prog="17"/>
+ <Patch name="X Piano +Str" drum="0" hbank="87" lbank="69" prog="18"/>
+ <Patch name="Arie Piano" drum="0" hbank="87" lbank="69" prog="19"/>
+ <Patch name="Cicada Piano" drum="0" hbank="87" lbank="69" prog="20"/>
+ <Patch name="Clare Voyent" drum="0" hbank="87" lbank="69" prog="21"/>
+ <Patch name="X Piano +Pad" drum="0" hbank="87" lbank="69" prog="22"/>
+ <Patch name="X Piano +Vox" drum="0" hbank="87" lbank="69" prog="23"/>
+ <Patch name="FX Piano" drum="0" hbank="87" lbank="69" prog="24"/>
+ <Patch name="AmbientPiano" drum="0" hbank="87" lbank="69" prog="25"/>
+ <Patch name="Tre Rhodes" drum="0" hbank="87" lbank="69" prog="26"/>
+ <Patch name="Stage Phazer" drum="0" hbank="87" lbank="69" prog="27"/>
+ <Patch name="StageCabinet" drum="0" hbank="87" lbank="69" prog="28"/>
+ <Patch name="AMP Rhodes" drum="0" hbank="87" lbank="69" prog="29"/>
+ <Patch name="VelPanWurly" drum="0" hbank="87" lbank="69" prog="30"/>
+ <Patch name="Mr.AXXE" drum="0" hbank="87" lbank="69" prog="31"/>
+ <Patch name="1983 EP" drum="0" hbank="87" lbank="69" prog="32"/>
+ <Patch name="EP Stack" drum="0" hbank="87" lbank="69" prog="33"/>
+ <Patch name="EP Belle" drum="0" hbank="87" lbank="69" prog="34"/>
+ <Patch name="Chocolate EP" drum="0" hbank="87" lbank="69" prog="35"/>
+ <Patch name="Abstract EP" drum="0" hbank="87" lbank="69" prog="36"/>
+ <Patch name="Ringy EP" drum="0" hbank="87" lbank="69" prog="37"/>
+ <Patch name="Hipchord" drum="0" hbank="87" lbank="69" prog="38"/>
+ <Patch name="Snappy Clav" drum="0" hbank="87" lbank="69" prog="39"/>
+ <Patch name="Over-D6" drum="0" hbank="87" lbank="69" prog="40"/>
+ <Patch name="CoupleHarpsi" drum="0" hbank="87" lbank="69" prog="41"/>
+ <Patch name="HimalayaThaw" drum="0" hbank="87" lbank="69" prog="42"/>
+ <Patch name="Ballad Bells" drum="0" hbank="87" lbank="69" prog="43"/>
+ <Patch name="Bell Monitor" drum="0" hbank="87" lbank="69" prog="44"/>
+ <Patch name="SideBandBell" drum="0" hbank="87" lbank="69" prog="45"/>
+ <Patch name="SBF Saw Bell" drum="0" hbank="87" lbank="69" prog="46"/>
+ <Patch name="TubyRuesday" drum="0" hbank="87" lbank="69" prog="47"/>
+ <Patch name="Music Box 2" drum="0" hbank="87" lbank="69" prog="48"/>
+ <Patch name="AirPluck" drum="0" hbank="87" lbank="69" prog="49"/>
+ <Patch name="Airie Vibez" drum="0" hbank="87" lbank="69" prog="50"/>
+ <Patch name="Ringy Vibes" drum="0" hbank="87" lbank="69" prog="51"/>
+ <Patch name="50 SteelDrms" drum="0" hbank="87" lbank="69" prog="52"/>
+ <Patch name="VKHold4Speed" drum="0" hbank="87" lbank="69" prog="53"/>
+ <Patch name="X Perc Organ" drum="0" hbank="87" lbank="69" prog="54"/>
+ <Patch name="Rocky Organ" drum="0" hbank="87" lbank="69" prog="55"/>
+ <Patch name="Purple Organ" drum="0" hbank="87" lbank="69" prog="56"/>
+ <Patch name="Phono Organ" drum="0" hbank="87" lbank="69" prog="57"/>
+ <Patch name="Mid Pipe Org" drum="0" hbank="87" lbank="69" prog="58"/>
+ <Patch name="ParisRomance" drum="0" hbank="87" lbank="69" prog="59"/>
+ <Patch name="La Seine" drum="0" hbank="87" lbank="69" prog="60"/>
+ <Patch name="VntgAccrdion" drum="0" hbank="87" lbank="69" prog="61"/>
+ <Patch name="Oktoberfest" drum="0" hbank="87" lbank="69" prog="62"/>
+ <Patch name="NaturalNylon" drum="0" hbank="87" lbank="69" prog="63"/>
+ <Patch name="Nylon Gtr VS" drum="0" hbank="87" lbank="69" prog="64"/>
+ <Patch name="Double Nylon" drum="0" hbank="87" lbank="69" prog="65"/>
+ <Patch name="Mellow Nylon" drum="0" hbank="87" lbank="69" prog="66"/>
+ <Patch name="FlamencoGt X" drum="0" hbank="87" lbank="69" prog="67"/>
+ <Patch name="El Toro Gtr" drum="0" hbank="87" lbank="69" prog="68"/>
+ <Patch name="Dyna Nylon" drum="0" hbank="87" lbank="69" prog="69"/>
+ <Patch name="NylonGt /HO" drum="0" hbank="87" lbank="69" prog="70"/>
+ <Patch name="Nylon 4way" drum="0" hbank="87" lbank="69" prog="71"/>
+ <Patch name="Nyl-Intro" drum="0" hbank="87" lbank="69" prog="72"/>
+ <Patch name="Nylon Dreams" drum="0" hbank="87" lbank="69" prog="73"/>
+ <Patch name="With Love" drum="0" hbank="87" lbank="69" prog="74"/>
+ <Patch name="Amore Story" drum="0" hbank="87" lbank="69" prog="75"/>
+ <Patch name="Interlude" drum="0" hbank="87" lbank="69" prog="76"/>
+ <Patch name="Sweet Tears" drum="0" hbank="87" lbank="69" prog="77"/>
+ <Patch name="WithALtlHelp" drum="0" hbank="87" lbank="69" prog="78"/>
+ <Patch name="Double Track" drum="0" hbank="87" lbank="69" prog="79"/>
+ <Patch name="Mystic Gtr" drum="0" hbank="87" lbank="69" prog="80"/>
+ <Patch name="Cut Thru Wah" drum="0" hbank="87" lbank="69" prog="81"/>
+ <Patch name="GuitaratiuG" drum="0" hbank="87" lbank="69" prog="82"/>
+ <Patch name="WahGt Riff" drum="0" hbank="87" lbank="69" prog="83"/>
+ <Patch name="Larsen /Aft" drum="0" hbank="87" lbank="69" prog="84"/>
+ <Patch name="Darmstrat X" drum="0" hbank="87" lbank="69" prog="85"/>
+ <Patch name="Rockin Dly" drum="0" hbank="87" lbank="69" prog="86"/>
+ <Patch name="DistGt Mt" drum="0" hbank="87" lbank="69" prog="87"/>
+ <Patch name="GTR Heroes" drum="0" hbank="87" lbank="69" prog="88"/>
+ <Patch name="X Mute Bass" drum="0" hbank="87" lbank="69" prog="89"/>
+ <Patch name="Nu Finger Bs" drum="0" hbank="87" lbank="69" prog="90"/>
+ <Patch name="Soulfinger" drum="0" hbank="87" lbank="69" prog="91"/>
+ <Patch name="X Finger Bs 1" drum="0" hbank="87" lbank="69" prog="92"/>
+ <Patch name="StickyOctave" drum="0" hbank="87" lbank="69" prog="93"/>
+ <Patch name="Bass n Amp" drum="0" hbank="87" lbank="69" prog="94"/>
+ <Patch name="Chorus Bass" drum="0" hbank="87" lbank="69" prog="95"/>
+ <Patch name="X 5String Bs" drum="0" hbank="87" lbank="69" prog="96"/>
+ <Patch name="6-Pack Stick" drum="0" hbank="87" lbank="69" prog="97"/>
+ <Patch name="Nu Pick Bass" drum="0" hbank="87" lbank="69" prog="98"/>
+ <Patch name="Comp Picker" drum="0" hbank="87" lbank="69" prog="99"/>
+ <Patch name="X Finger Bs2" drum="0" hbank="87" lbank="69" prog="100"/>
+ <Patch name="X Picked Bs" drum="0" hbank="87" lbank="69" prog="101"/>
+ <Patch name="Mutation" drum="0" hbank="87" lbank="69" prog="102"/>
+ <Patch name="X Slap Bass" drum="0" hbank="87" lbank="69" prog="103"/>
+ <Patch name="Fuzz Mute" drum="0" hbank="87" lbank="69" prog="104"/>
+ <Patch name="Doubled Bass" drum="0" hbank="87" lbank="69" prog="105"/>
+ <Patch name="NewAge Frtls" drum="0" hbank="87" lbank="69" prog="106"/>
+ <Patch name="Powerline" drum="0" hbank="87" lbank="69" prog="107"/>
+ <Patch name="Reso SynBass" drum="0" hbank="87" lbank="69" prog="108"/>
+ <Patch name="Synth Bassic" drum="0" hbank="87" lbank="69" prog="109"/>
+ <Patch name="Down 4 It" drum="0" hbank="87" lbank="69" prog="110"/>
+ <Patch name="Glider Bass" drum="0" hbank="87" lbank="69" prog="111"/>
+ <Patch name="Fundamental" drum="0" hbank="87" lbank="69" prog="112"/>
+ <Patch name="Artus Bass" drum="0" hbank="87" lbank="69" prog="113"/>
+ <Patch name="Sweet n Low" drum="0" hbank="87" lbank="69" prog="114"/>
+ <Patch name="Change It" drum="0" hbank="87" lbank="69" prog="115"/>
+ <Patch name="the ONE" drum="0" hbank="87" lbank="69" prog="116"/>
+ <Patch name="ChoruSE ONE" drum="0" hbank="87" lbank="69" prog="117"/>
+ <Patch name="Eyes Bass" drum="0" hbank="87" lbank="69" prog="118"/>
+ <Patch name="Secret Bass" drum="0" hbank="87" lbank="69" prog="119"/>
+ <Patch name="Base BoX" drum="0" hbank="87" lbank="69" prog="120"/>
+ <Patch name="Nu RnB Bass" drum="0" hbank="87" lbank="69" prog="121"/>
+ <Patch name="D n Bass" drum="0" hbank="87" lbank="69" prog="122"/>
+ <Patch name="DnB Bass 1" drum="0" hbank="87" lbank="69" prog="123"/>
+ <Patch name="Fat Bottom" drum="0" hbank="87" lbank="69" prog="124"/>
+ <Patch name="Deep S-E" drum="0" hbank="87" lbank="69" prog="125"/>
+ <Patch name="Nu Bace" drum="0" hbank="87" lbank="69" prog="126"/>
+ <Patch name="Mini Like!" drum="0" hbank="87" lbank="69" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset G">
+ <Patch name="Da Chronic" drum="0" hbank="87" lbank="70" prog="0"/>
+ <Patch name="Virtual RnBs" drum="0" hbank="87" lbank="70" prog="1"/>
+ <Patch name="Not a Bass" drum="0" hbank="87" lbank="70" prog="2"/>
+ <Patch name="Nu RnB Saw 1" drum="0" hbank="87" lbank="70" prog="3"/>
+ <Patch name="Nu RnB Saw 2" drum="0" hbank="87" lbank="70" prog="4"/>
+ <Patch name="Buzzy Bs" drum="0" hbank="87" lbank="70" prog="5"/>
+ <Patch name="SBF Saw Bs" drum="0" hbank="87" lbank="70" prog="6"/>
+ <Patch name="Party Bass" drum="0" hbank="87" lbank="70" prog="7"/>
+ <Patch name="Tomrubber" drum="0" hbank="87" lbank="70" prog="8"/>
+ <Patch name="Drop Bass" drum="0" hbank="87" lbank="70" prog="9"/>
+ <Patch name="Filament" drum="0" hbank="87" lbank="70" prog="10"/>
+ <Patch name="Dust Bass" drum="0" hbank="87" lbank="70" prog="11"/>
+ <Patch name="Mr. Nasty" drum="0" hbank="87" lbank="70" prog="12"/>
+ <Patch name="Bass Drive" drum="0" hbank="87" lbank="70" prog="13"/>
+ <Patch name="Underneath" drum="0" hbank="87" lbank="70" prog="14"/>
+ <Patch name="Dirt n Grime" drum="0" hbank="87" lbank="70" prog="15"/>
+ <Patch name="Down n Dirty" drum="0" hbank="87" lbank="70" prog="16"/>
+ <Patch name="SubOscar" drum="0" hbank="87" lbank="70" prog="17"/>
+ <Patch name="Full Strings" drum="0" hbank="87" lbank="70" prog="18"/>
+ <Patch name="X StrSection" drum="0" hbank="87" lbank="70" prog="19"/>
+ <Patch name="Oct Strings" drum="0" hbank="87" lbank="70" prog="20"/>
+ <Patch name="Sahara Str" drum="0" hbank="87" lbank="70" prog="21"/>
+ <Patch name="Random Mood" drum="0" hbank="87" lbank="70" prog="22"/>
+ <Patch name="X Hall Str" drum="0" hbank="87" lbank="70" prog="23"/>
+ <Patch name="Strings Flow" drum="0" hbank="87" lbank="70" prog="24"/>
+ <Patch name="Biggie Bows" drum="0" hbank="87" lbank="70" prog="25"/>
+ <Patch name="Staccato VS" drum="0" hbank="87" lbank="70" prog="26"/>
+ <Patch name="So Staccato" drum="0" hbank="87" lbank="70" prog="27"/>
+ <Patch name="Pizz-Stac VS" drum="0" hbank="87" lbank="70" prog="28"/>
+ <Patch name="Mellow Tron" drum="0" hbank="87" lbank="70" prog="29"/>
+ <Patch name="Moody Tron" drum="0" hbank="87" lbank="70" prog="30"/>
+ <Patch name="Tronic Str" drum="0" hbank="87" lbank="70" prog="31"/>
+ <Patch name="Machine Str" drum="0" hbank="87" lbank="70" prog="32"/>
+ <Patch name="Symphonika" drum="0" hbank="87" lbank="70" prog="33"/>
+ <Patch name="Pop Orch" drum="0" hbank="87" lbank="70" prog="34"/>
+ <Patch name="Contemp Orch" drum="0" hbank="87" lbank="70" prog="35"/>
+ <Patch name="Orange Skin" drum="0" hbank="87" lbank="70" prog="36"/>
+ <Patch name="Tutti" drum="0" hbank="87" lbank="70" prog="37"/>
+ <Patch name="Brass Ditt" drum="0" hbank="87" lbank="70" prog="38"/>
+ <Patch name="Housechord" drum="0" hbank="87" lbank="70" prog="39"/>
+ <Patch name="Mod Chord" drum="0" hbank="87" lbank="70" prog="40"/>
+ <Patch name="Dance Steam" drum="0" hbank="87" lbank="70" prog="41"/>
+ <Patch name="Disto Stab !" drum="0" hbank="87" lbank="70" prog="42"/>
+ <Patch name="Fairy Flute" drum="0" hbank="87" lbank="70" prog="43"/>
+ <Patch name="Chiffed Toot" drum="0" hbank="87" lbank="70" prog="44"/>
+ <Patch name="Hop Flute" drum="0" hbank="87" lbank="70" prog="45"/>
+ <Patch name="HimalayaPipe" drum="0" hbank="87" lbank="70" prog="46"/>
+ <Patch name="X Brs Sect 1" drum="0" hbank="87" lbank="70" prog="47"/>
+ <Patch name="Pop Stak Brs" drum="0" hbank="87" lbank="70" prog="48"/>
+ <Patch name="X Brs Sect 2" drum="0" hbank="87" lbank="70" prog="49"/>
+ <Patch name="Pop Brs wAtk" drum="0" hbank="87" lbank="70" prog="50"/>
+ <Patch name="Hybrid Brass" drum="0" hbank="87" lbank="70" prog="51"/>
+ <Patch name="Nu Stab Brs" drum="0" hbank="87" lbank="70" prog="52"/>
+ <Patch name="Heavy Brs 1" drum="0" hbank="87" lbank="70" prog="53"/>
+ <Patch name="Heavy Brs 2" drum="0" hbank="87" lbank="70" prog="54"/>
+ <Patch name="Wonder Brass" drum="0" hbank="87" lbank="70" prog="55"/>
+ <Patch name="Pop Brs Sfz" drum="0" hbank="87" lbank="70" prog="56"/>
+ <Patch name="Pop Brs Stac" drum="0" hbank="87" lbank="70" prog="57"/>
+ <Patch name="Brass Fall /" drum="0" hbank="87" lbank="70" prog="58"/>
+ <Patch name="X-Saw Brass1" drum="0" hbank="87" lbank="70" prog="59"/>
+ <Patch name="JP8000 Brass" drum="0" hbank="87" lbank="70" prog="60"/>
+ <Patch name="X-Saw Brass2" drum="0" hbank="87" lbank="70" prog="61"/>
+ <Patch name="Bend SynBrs" drum="0" hbank="87" lbank="70" prog="62"/>
+ <Patch name="Sax Heavy" drum="0" hbank="87" lbank="70" prog="63"/>
+ <Patch name="FXM Alto Sax" drum="0" hbank="87" lbank="70" prog="64"/>
+ <Patch name="Simply Nasty" drum="0" hbank="87" lbank="70" prog="65"/>
+ <Patch name="Deep Wine" drum="0" hbank="87" lbank="70" prog="66"/>
+ <Patch name="Bon Voyage" drum="0" hbank="87" lbank="70" prog="67"/>
+ <Patch name="Xpress Lead" drum="0" hbank="87" lbank="70" prog="68"/>
+ <Patch name="Body Electric" drum="0" hbank="87" lbank="70" prog="69"/>
+ <Patch name="Classic Lead" drum="0" hbank="87" lbank="70" prog="70"/>
+ <Patch name="Optik Synth" drum="0" hbank="87" lbank="70" prog="71"/>
+ <Patch name="Feat Lead" drum="0" hbank="87" lbank="70" prog="72"/>
+ <Patch name="X Sync Mod" drum="0" hbank="87" lbank="70" prog="73"/>
+ <Patch name="SBF Lead" drum="0" hbank="87" lbank="70" prog="74"/>
+ <Patch name="Hard Sync" drum="0" hbank="87" lbank="70" prog="75"/>
+ <Patch name="Rezo Sync" drum="0" hbank="87" lbank="70" prog="76"/>
+ <Patch name="Wire Sync" drum="0" hbank="87" lbank="70" prog="77"/>
+ <Patch name="Distro FXM" drum="0" hbank="87" lbank="70" prog="78"/>
+ <Patch name="Epic Lead" drum="0" hbank="87" lbank="70" prog="79"/>
+ <Patch name="Crumble Syn" drum="0" hbank="87" lbank="70" prog="80"/>
+ <Patch name="SlippingSaws" drum="0" hbank="87" lbank="70" prog="81"/>
+ <Patch name="Bag Lead" drum="0" hbank="87" lbank="70" prog="82"/>
+ <Patch name="Dirty Saw" drum="0" hbank="87" lbank="70" prog="83"/>
+ <Patch name="Wezcoast" drum="0" hbank="87" lbank="70" prog="84"/>
+ <Patch name="X-Saw Lead" drum="0" hbank="87" lbank="70" prog="85"/>
+ <Patch name="ActualAnalog" drum="0" hbank="87" lbank="70" prog="86"/>
+ <Patch name="SBF Reso" drum="0" hbank="87" lbank="70" prog="87"/>
+ <Patch name="SliCed Lead" drum="0" hbank="87" lbank="70" prog="88"/>
+ <Patch name="Synthi Fizz" drum="0" hbank="87" lbank="70" prog="89"/>
+ <Patch name="Mini Growl" drum="0" hbank="87" lbank="70" prog="90"/>
+ <Patch name="Jupiter Lead" drum="0" hbank="87" lbank="70" prog="91"/>
+ <Patch name="X-Pulse Lead" drum="0" hbank="87" lbank="70" prog="92"/>
+ <Patch name="Jupi Square" drum="0" hbank="87" lbank="70" prog="93"/>
+ <Patch name="TriStac Lead" drum="0" hbank="87" lbank="70" prog="94"/>
+ <Patch name="Modular Lead" drum="0" hbank="87" lbank="70" prog="95"/>
+ <Patch name="Sinetific" drum="0" hbank="87" lbank="70" prog="96"/>
+ <Patch name="Dirty D/A" drum="0" hbank="87" lbank="70" prog="97"/>
+ <Patch name="EuronalSynth" drum="0" hbank="87" lbank="70" prog="98"/>
+ <Patch name="Xtrem Sine" drum="0" hbank="87" lbank="70" prog="99"/>
+ <Patch name="Killerbeez" drum="0" hbank="87" lbank="70" prog="100"/>
+ <Patch name="Freeze Synth" drum="0" hbank="87" lbank="70" prog="101"/>
+ <Patch name="JamPacked!" drum="0" hbank="87" lbank="70" prog="102"/>
+ <Patch name="SawStacChd" drum="0" hbank="87" lbank="70" prog="103"/>
+ <Patch name="Trancepire" drum="0" hbank="87" lbank="70" prog="104"/>
+ <Patch name="Acid Lead" drum="0" hbank="87" lbank="70" prog="105"/>
+ <Patch name="Tranceformer" drum="0" hbank="87" lbank="70" prog="106"/>
+ <Patch name="Anadroid" drum="0" hbank="87" lbank="70" prog="107"/>
+ <Patch name="Shroomy" drum="0" hbank="87" lbank="70" prog="108"/>
+ <Patch name="SBF Nozer" drum="0" hbank="87" lbank="70" prog="109"/>
+ <Patch name="Voxulizer" drum="0" hbank="87" lbank="70" prog="110"/>
+ <Patch name="Wired Rez" drum="0" hbank="87" lbank="70" prog="111"/>
+ <Patch name="Noize R us" drum="0" hbank="87" lbank="70" prog="112"/>
+ <Patch name="Inner Voices" drum="0" hbank="87" lbank="70" prog="113"/>
+ <Patch name="Beep Melodie" drum="0" hbank="87" lbank="70" prog="114"/>
+ <Patch name="Alpha Hoover" drum="0" hbank="87" lbank="70" prog="115"/>
+ <Patch name="Steel Wire" drum="0" hbank="87" lbank="70" prog="116"/>
+ <Patch name="Rav-i-Toid" drum="0" hbank="87" lbank="70" prog="117"/>
+ <Patch name="Rez Therapy" drum="0" hbank="87" lbank="70" prog="118"/>
+ <Patch name="Ivans" drum="0" hbank="87" lbank="70" prog="119"/>
+ <Patch name="Morpher" drum="0" hbank="87" lbank="70" prog="120"/>
+ <Patch name="StellarTreck" drum="0" hbank="87" lbank="70" prog="121"/>
+ <Patch name="Tekno Tone" drum="0" hbank="87" lbank="70" prog="122"/>
+ <Patch name="Generator" drum="0" hbank="87" lbank="70" prog="123"/>
+ <Patch name="ARP x Race" drum="0" hbank="87" lbank="70" prog="124"/>
+ <Patch name="DSP Chaos" drum="0" hbank="87" lbank="70" prog="125"/>
+ <Patch name="Phraserblade" drum="0" hbank="87" lbank="70" prog="126"/>
+ <Patch name="Dancefloor" drum="0" hbank="87" lbank="70" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="Preset H">
+ <Patch name="Minor Thirds" drum="0" hbank="87" lbank="71" prog="0"/>
+ <Patch name="Strobe X" drum="0" hbank="87" lbank="71" prog="1"/>
+ <Patch name="Orbiting" drum="0" hbank="87" lbank="71" prog="2"/>
+ <Patch name="FX World" drum="0" hbank="87" lbank="71" prog="3"/>
+ <Patch name="Mr. Fourier" drum="0" hbank="87" lbank="71" prog="4"/>
+ <Patch name="Nu Trance X" drum="0" hbank="87" lbank="71" prog="5"/>
+ <Patch name="eXisDance" drum="0" hbank="87" lbank="71" prog="6"/>
+ <Patch name="Are U ready?" drum="0" hbank="87" lbank="71" prog="7"/>
+ <Patch name="Minty Fresh" drum="0" hbank="87" lbank="71" prog="8"/>
+ <Patch name="Spectrums" drum="0" hbank="87" lbank="71" prog="9"/>
+ <Patch name="Shape of X" drum="0" hbank="87" lbank="71" prog="10"/>
+ <Patch name="Auto 5thSaws" drum="0" hbank="87" lbank="71" prog="11"/>
+ <Patch name="Strobot" drum="0" hbank="87" lbank="71" prog="12"/>
+ <Patch name="Dreamswirl" drum="0" hbank="87" lbank="71" prog="13"/>
+ <Patch name="Galaxadin" drum="0" hbank="87" lbank="71" prog="14"/>
+ <Patch name="Welcome2X" drum="0" hbank="87" lbank="71" prog="15"/>
+ <Patch name="Space n Time" drum="0" hbank="87" lbank="71" prog="16"/>
+ <Patch name="Cross Talk" drum="0" hbank="87" lbank="71" prog="17"/>
+ <Patch name="Lava Flows" drum="0" hbank="87" lbank="71" prog="18"/>
+ <Patch name="Steppin Faze" drum="0" hbank="87" lbank="71" prog="19"/>
+ <Patch name="Reanimation" drum="0" hbank="87" lbank="71" prog="20"/>
+ <Patch name="VoX Chopper" drum="0" hbank="87" lbank="71" prog="21"/>
+ <Patch name="SquareSphere" drum="0" hbank="87" lbank="71" prog="22"/>
+ <Patch name="Auto Sync" drum="0" hbank="87" lbank="71" prog="23"/>
+ <Patch name="Vocastic" drum="0" hbank="87" lbank="71" prog="24"/>
+ <Patch name="Bending Logo" drum="0" hbank="87" lbank="71" prog="25"/>
+ <Patch name="SolarPleXus" drum="0" hbank="87" lbank="71" prog="26"/>
+ <Patch name="Scare" drum="0" hbank="87" lbank="71" prog="27"/>
+ <Patch name="Chaoism" drum="0" hbank="87" lbank="71" prog="28"/>
+ <Patch name="Hillside" drum="0" hbank="87" lbank="71" prog="29"/>
+ <Patch name="Alien Voice" drum="0" hbank="87" lbank="71" prog="30"/>
+ <Patch name="What What?" drum="0" hbank="87" lbank="71" prog="31"/>
+ <Patch name="Beyond Here" drum="0" hbank="87" lbank="71" prog="32"/>
+ <Patch name="Mod Scanner" drum="0" hbank="87" lbank="71" prog="33"/>
+ <Patch name="Gasp" drum="0" hbank="87" lbank="71" prog="34"/>
+ <Patch name="Neverville" drum="0" hbank="87" lbank="71" prog="35"/>
+ <Patch name="Landing Pad" drum="0" hbank="87" lbank="71" prog="36"/>
+ <Patch name="Celebrated" drum="0" hbank="87" lbank="71" prog="37"/>
+ <Patch name="ResoSweep Up" drum="0" hbank="87" lbank="71" prog="38"/>
+ <Patch name="The VorteX" drum="0" hbank="87" lbank="71" prog="39"/>
+ <Patch name="Magic Wave" drum="0" hbank="87" lbank="71" prog="40"/>
+ <Patch name="Shangri-La" drum="0" hbank="87" lbank="71" prog="41"/>
+ <Patch name="CerealKiller" drum="0" hbank="87" lbank="71" prog="42"/>
+ <Patch name="DigimaX" drum="0" hbank="87" lbank="71" prog="43"/>
+ <Patch name="Trancy X" drum="0" hbank="87" lbank="71" prog="44"/>
+ <Patch name="X Sweep Saws" drum="0" hbank="87" lbank="71" prog="45"/>
+ <Patch name="X-Trance" drum="0" hbank="87" lbank="71" prog="46"/>
+ <Patch name="JP-8000 Saws" drum="0" hbank="87" lbank="71" prog="47"/>
+ <Patch name="X Super Saws" drum="0" hbank="87" lbank="71" prog="48"/>
+ <Patch name="Exhale" drum="0" hbank="87" lbank="71" prog="49"/>
+ <Patch name="SBF Voices" drum="0" hbank="87" lbank="71" prog="50"/>
+ <Patch name="Stadium SBF" drum="0" hbank="87" lbank="71" prog="51"/>
+ <Patch name="Master X" drum="0" hbank="87" lbank="71" prog="52"/>
+ <Patch name="X-panda" drum="0" hbank="87" lbank="71" prog="53"/>
+ <Patch name="TDreamTouch" drum="0" hbank="87" lbank="71" prog="54"/>
+ <Patch name="Smooth Synth" drum="0" hbank="87" lbank="71" prog="55"/>
+ <Patch name="Stereotype" drum="0" hbank="87" lbank="71" prog="56"/>
+ <Patch name="Saw Keystep" drum="0" hbank="87" lbank="71" prog="57"/>
+ <Patch name="4mant Cycle" drum="0" hbank="87" lbank="71" prog="58"/>
+ <Patch name="Trance Sweep" drum="0" hbank="87" lbank="71" prog="59"/>
+ <Patch name="Modular" drum="0" hbank="87" lbank="71" prog="60"/>
+ <Patch name="Triple X" drum="0" hbank="87" lbank="71" prog="61"/>
+ <Patch name="Angel Pipes" drum="0" hbank="87" lbank="71" prog="62"/>
+ <Patch name="Vint Clavier" drum="0" hbank="87" lbank="71" prog="63"/>
+ <Patch name="Wired Synth" drum="0" hbank="87" lbank="71" prog="64"/>
+ <Patch name="Nu Romance" drum="0" hbank="87" lbank="71" prog="65"/>
+ <Patch name="Survivoz" drum="0" hbank="87" lbank="71" prog="66"/>
+ <Patch name="Ring Worldz" drum="0" hbank="87" lbank="71" prog="67"/>
+ <Patch name="Mashed!? :0)" drum="0" hbank="87" lbank="71" prog="68"/>
+ <Patch name="Saturn Siren" drum="0" hbank="87" lbank="71" prog="69"/>
+ <Patch name="Side Band X" drum="0" hbank="87" lbank="71" prog="70"/>
+ <Patch name="Mashy Scene" drum="0" hbank="87" lbank="71" prog="71"/>
+ <Patch name="Spr SideBand" drum="0" hbank="87" lbank="71" prog="72"/>
+ <Patch name="Digitvox" drum="0" hbank="87" lbank="71" prog="73"/>
+ <Patch name="Oral eXam" drum="0" hbank="87" lbank="71" prog="74"/>
+ <Patch name="Timeline" drum="0" hbank="87" lbank="71" prog="75"/>
+ <Patch name="Whisper Pad" drum="0" hbank="87" lbank="71" prog="76"/>
+ <Patch name="Orchipad" drum="0" hbank="87" lbank="71" prog="77"/>
+ <Patch name="Visionary" drum="0" hbank="87" lbank="71" prog="78"/>
+ <Patch name="Rave Stringy" drum="0" hbank="87" lbank="71" prog="79"/>
+ <Patch name="InfinitePhsr" drum="0" hbank="87" lbank="71" prog="80"/>
+ <Patch name="Jupiter 2004" drum="0" hbank="87" lbank="71" prog="81"/>
+ <Patch name="Light Phaser" drum="0" hbank="87" lbank="71" prog="82"/>
+ <Patch name="Life-on" drum="0" hbank="87" lbank="71" prog="83"/>
+ <Patch name="Polar Morn" drum="0" hbank="87" lbank="71" prog="84"/>
+ <Patch name="Saturn Rings" drum="0" hbank="87" lbank="71" prog="85"/>
+ <Patch name="Ooh La La" drum="0" hbank="87" lbank="71" prog="86"/>
+ <Patch name="Flying X" drum="0" hbank="87" lbank="71" prog="87"/>
+ <Patch name="Motion Pad" drum="0" hbank="87" lbank="71" prog="88"/>
+ <Patch name="Mash Pad" drum="0" hbank="87" lbank="71" prog="89"/>
+ <Patch name="Xtragalactic" drum="0" hbank="87" lbank="71" prog="90"/>
+ <Patch name="Morph Filter" drum="0" hbank="87" lbank="71" prog="91"/>
+ <Patch name="TmsSweepPad" drum="0" hbank="87" lbank="71" prog="92"/>
+ <Patch name="Follow" drum="0" hbank="87" lbank="71" prog="93"/>
+ <Patch name="Jupiter-X" drum="0" hbank="87" lbank="71" prog="94"/>
+ <Patch name="Riven Pad" drum="0" hbank="87" lbank="71" prog="95"/>
+ <Patch name="Consolament" drum="0" hbank="87" lbank="71" prog="96"/>
+ <Patch name="Spacious Pad" drum="0" hbank="87" lbank="71" prog="97"/>
+ <Patch name="JD Pop Pad" drum="0" hbank="87" lbank="71" prog="98"/>
+ <Patch name="Silhouette" drum="0" hbank="87" lbank="71" prog="99"/>
+ <Patch name="JP-8 Phase" drum="0" hbank="87" lbank="71" prog="100"/>
+ <Patch name="Nu Epic Pad" drum="0" hbank="87" lbank="71" prog="101"/>
+ <Patch name="Forever" drum="0" hbank="87" lbank="71" prog="102"/>
+ <Patch name="Flange Dream" drum="0" hbank="87" lbank="71" prog="103"/>
+ <Patch name="Guild Vox" drum="0" hbank="87" lbank="71" prog="104"/>
+ <Patch name="5th Pad X" drum="0" hbank="87" lbank="71" prog="105"/>
+ <Patch name="Evolution X" drum="0" hbank="87" lbank="71" prog="106"/>
+ <Patch name="Chariots" drum="0" hbank="87" lbank="71" prog="107"/>
+ <Patch name="Trevors Pad" drum="0" hbank="87" lbank="71" prog="108"/>
+ <Patch name="Nu Pad" drum="0" hbank="87" lbank="71" prog="109"/>
+ <Patch name="Fantomas Pad" drum="0" hbank="87" lbank="71" prog="110"/>
+ <Patch name="Film Cue" drum="0" hbank="87" lbank="71" prog="111"/>
+ <Patch name="Choral Sweep" drum="0" hbank="87" lbank="71" prog="112"/>
+ <Patch name="Paradise" drum="0" hbank="87" lbank="71" prog="113"/>
+ <Patch name="Sad ceremony" drum="0" hbank="87" lbank="71" prog="114"/>
+ <Patch name="Lost Voices" drum="0" hbank="87" lbank="71" prog="115"/>
+ <Patch name="Talk 2 Me" drum="0" hbank="87" lbank="71" prog="116"/>
+ <Patch name="Pearly Harp" drum="0" hbank="87" lbank="71" prog="117"/>
+ <Patch name="Nylon Harp" drum="0" hbank="87" lbank="71" prog="118"/>
+ <Patch name="Skydiver" drum="0" hbank="87" lbank="71" prog="119"/>
+ <Patch name="Unpluck-d" drum="0" hbank="87" lbank="71" prog="120"/>
+ <Patch name="Ethno Plucks" drum="0" hbank="87" lbank="71" prog="121"/>
+ <Patch name="SaraswatiRvr" drum="0" hbank="87" lbank="71" prog="122"/>
+ <Patch name="Drone X" drum="0" hbank="87" lbank="71" prog="123"/>
+ <Patch name="Lounge Kit" drum="0" hbank="87" lbank="71" prog="124"/>
+ <Patch name="Gospel Trio" drum="0" hbank="87" lbank="71" prog="125"/>
+ <Patch name="xcultural" drum="0" hbank="87" lbank="71" prog="126"/>
+ <Patch name="When Im 64" drum="0" hbank="87" lbank="71" prog="127"/>
+ </PatchGroup>
+
+</MidiInstrument>
+
+</muse>
diff --git a/muse/share/instruments/Roland_SRX-02.idf b/muse/share/instruments/Roland_SRX-02.idf
new file mode 100644
index 00000000..54b0b7e6
--- /dev/null
+++ b/muse/share/instruments/Roland_SRX-02.idf
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+
+<muse version="1.0">
+
+<MidiInstrument name="Roland SRX-02 Concert Piano">
+
+<Init>
+</Init>
+
+
+ <PatchGroup name="SRX02 Concert Piano">
+ <Patch name="PremierGrand" drum="0" hbank="93" lbank="1" prog="0"/>
+ <Patch name="Steady Grand" drum="0" hbank="93" lbank="1" prog="1"/>
+ <Patch name="DynamicGrand" drum="0" hbank="93" lbank="1" prog="2"/>
+ <Patch name="Concert Hall" drum="0" hbank="93" lbank="1" prog="3"/>
+ <Patch name="Bright Grand" drum="0" hbank="93" lbank="1" prog="4"/>
+ <Patch name="Classical" drum="0" hbank="93" lbank="1" prog="5"/>
+ <Patch name="SoftPdlGrand" drum="0" hbank="93" lbank="1" prog="6"/>
+ <Patch name="OnMicPremier" drum="0" hbank="93" lbank="1" prog="7"/>
+ <Patch name="OnMic Bright" drum="0" hbank="93" lbank="1" prog="8"/>
+ <Patch name="OnMicSoftPdl" drum="0" hbank="93" lbank="1" prog="9"/>
+ <Patch name="Premier Mono" drum="0" hbank="93" lbank="1" prog="10"/>
+ <Patch name="Bright Mono" drum="0" hbank="93" lbank="1" prog="11"/>
+ <Patch name="SoftPdl Mono" drum="0" hbank="93" lbank="1" prog="12"/>
+ <Patch name="Mellow Piano" drum="0" hbank="93" lbank="1" prog="13"/>
+ <Patch name="Enhanced Pno" drum="0" hbank="93" lbank="1" prog="14"/>
+ <Patch name="Comp.Piano" drum="0" hbank="93" lbank="1" prog="15"/>
+ <Patch name="HonkytonkPno" drum="0" hbank="93" lbank="1" prog="16"/>
+ <Patch name="NewAgeGrand1" drum="0" hbank="93" lbank="1" prog="17"/>
+ <Patch name="NewAgeGrand2" drum="0" hbank="93" lbank="1" prog="18"/>
+ <Patch name="Requiem" drum="0" hbank="93" lbank="1" prog="19"/>
+ <Patch name="Soundscape" drum="0" hbank="93" lbank="1" prog="20"/>
+ <Patch name="Grand w/Str" drum="0" hbank="93" lbank="1" prog="21"/>
+ <Patch name="Concerto 1" drum="0" hbank="93" lbank="1" prog="22"/>
+ <Patch name="Concerto 2" drum="0" hbank="93" lbank="1" prog="23"/>
+ <Patch name="SoftpadGrand" drum="0" hbank="93" lbank="1" prog="24"/>
+ <Patch name="Synpad Grand" drum="0" hbank="93" lbank="1" prog="25"/>
+ <Patch name="Vox Grand 1" drum="0" hbank="93" lbank="1" prog="26"/>
+ <Patch name="Vox Grand 2" drum="0" hbank="93" lbank="1" prog="27"/>
+ <Patch name="Oohs Piano" drum="0" hbank="93" lbank="1" prog="28"/>
+ <Patch name="Air Grand" drum="0" hbank="93" lbank="1" prog="29"/>
+ <Patch name="GtrPad Grand" drum="0" hbank="93" lbank="1" prog="30"/>
+ <Patch name="PhasePad Pno" drum="0" hbank="93" lbank="1" prog="31"/>
+ <Patch name="HeavenPadPno" drum="0" hbank="93" lbank="1" prog="32"/>
+ <Patch name="Somber Pad" drum="0" hbank="93" lbank="1" prog="33"/>
+ <Patch name="Wet Chorus" drum="0" hbank="93" lbank="1" prog="34"/>
+ <Patch name="Nylon Grand" drum="0" hbank="93" lbank="1" prog="35"/>
+ <Patch name="FM EP Grand" drum="0" hbank="93" lbank="1" prog="36"/>
+ <Patch name="Bell Grand" drum="0" hbank="93" lbank="1" prog="37"/>
+ <Patch name="Bellvox Pno" drum="0" hbank="93" lbank="1" prog="38"/>
+ <Patch name="StackedGrand" drum="0" hbank="93" lbank="1" prog="39"/>
+ <Patch name="Hard Stack 1" drum="0" hbank="93" lbank="1" prog="40"/>
+ <Patch name="Hard Stack 2" drum="0" hbank="93" lbank="1" prog="41"/>
+ <Patch name="PianoBrass" drum="0" hbank="93" lbank="1" prog="42"/>
+ <Patch name="PianoBrs fff" drum="0" hbank="93" lbank="1" prog="43"/>
+ <Patch name="Gig Split 1" drum="0" hbank="93" lbank="1" prog="44"/>
+ <Patch name="Gig Split 2" drum="0" hbank="93" lbank="1" prog="45"/>
+ <Patch name="Gig Split 3" drum="0" hbank="93" lbank="1" prog="46"/>
+ <Patch name="Throb Piano" drum="0" hbank="93" lbank="1" prog="47"/>
+ <Patch name="Feedback Pno" drum="0" hbank="93" lbank="1" prog="48"/>
+ <Patch name="Eastern 5th" drum="0" hbank="93" lbank="1" prog="49"/>
+ </PatchGroup>
+
+</MidiInstrument>
+
+</muse>
diff --git a/muse/share/instruments/Roland_SRX-09.idf b/muse/share/instruments/Roland_SRX-09.idf
new file mode 100644
index 00000000..2e3f5667
--- /dev/null
+++ b/muse/share/instruments/Roland_SRX-09.idf
@@ -0,0 +1,454 @@
+<?xml version="1.0"?>
+
+<muse version="1.0">
+
+<MidiInstrument name="Roland SRX-09 World Collection">
+
+<Init>
+</Init>
+
+
+ <PatchGroup name="SRX09 Percussion Kits">
+ <Patch name="LatinDrmKit" drum="0" hbank="92" lbank="19" prog="0"/>
+ <Patch name="AsiaDrm Kit" drum="0" hbank="92" lbank="19" prog="1"/>
+ <Patch name="IndiaDrmKit" drum="0" hbank="92" lbank="19" prog="2"/>
+ <Patch name="MidEastDrKit" drum="0" hbank="92" lbank="19" prog="3"/>
+ <Patch name="World Phrase" drum="0" hbank="92" lbank="19" prog="4"/>
+ <Patch name="Gtr Phrase" drum="0" hbank="92" lbank="19" prog="5"/>
+ <Patch name="Latin Menu1" drum="0" hbank="92" lbank="19" prog="6"/>
+ <Patch name="Latin Menu2" drum="0" hbank="92" lbank="19" prog="7"/>
+ <Patch name="Latin Menu3" drum="0" hbank="92" lbank="19" prog="8"/>
+ <Patch name="Asia Menu" drum="0" hbank="92" lbank="19" prog="9"/>
+ <Patch name="India Menu" drum="0" hbank="92" lbank="19" prog="10"/>
+ <Patch name="MidEast Menu" drum="0" hbank="92" lbank="19" prog="11"/>
+ </PatchGroup>
+
+ <PatchGroup name="SRX09 World Collection 1">
+ <Patch name="World Sounds" drum="0" hbank="93" lbank="19" prog="0"/>
+ <Patch name="Go2China /C2" drum="0" hbank="93" lbank="19" prog="1"/>
+ <Patch name="Go2India /C2" drum="0" hbank="93" lbank="19" prog="2"/>
+ <Patch name="The Great W" drum="0" hbank="93" lbank="19" prog="3"/>
+ <Patch name="Yuehchin+" drum="0" hbank="93" lbank="19" prog="4"/>
+ <Patch name="Sweet Nylon" drum="0" hbank="93" lbank="19" prog="5"/>
+ <Patch name="Tele R and F" drum="0" hbank="93" lbank="19" prog="6"/>
+ <Patch name="Tubby Baby" drum="0" hbank="93" lbank="19" prog="7"/>
+ <Patch name="HeavenGender" drum="0" hbank="93" lbank="19" prog="8"/>
+ <Patch name="Gamelan Ems" drum="0" hbank="93" lbank="19" prog="9"/>
+ <Patch name="Childwood" drum="0" hbank="93" lbank="19" prog="10"/>
+ <Patch name="La Musette" drum="0" hbank="93" lbank="19" prog="11"/>
+ <Patch name="Essence" drum="0" hbank="93" lbank="19" prog="12"/>
+ <Patch name="Zampona" drum="0" hbank="93" lbank="19" prog="13"/>
+ <Patch name="GipsyTrumpt/" drum="0" hbank="93" lbank="19" prog="14"/>
+ <Patch name="We Dream }{" drum="0" hbank="93" lbank="19" prog="15"/>
+ <Patch name="Fun WithPerc" drum="0" hbank="93" lbank="19" prog="16"/>
+ <Patch name="GuZheng arp" drum="0" hbank="93" lbank="19" prog="17"/>
+ <Patch name="Feets" drum="0" hbank="93" lbank="19" prog="18"/>
+ <Patch name="World Radio" drum="0" hbank="93" lbank="19" prog="19"/>
+ <Patch name="ClanAdvances" drum="0" hbank="93" lbank="19" prog="20"/>
+ <Patch name="Eastern Tour" drum="0" hbank="93" lbank="19" prog="21"/>
+ <Patch name="Enough!STOP!" drum="0" hbank="93" lbank="19" prog="22"/>
+ <Patch name="Banjo Phrs" drum="0" hbank="93" lbank="19" prog="23"/>
+ <Patch name="Guitar Phrs1" drum="0" hbank="93" lbank="19" prog="24"/>
+ <Patch name="Guitar Phrs2" drum="0" hbank="93" lbank="19" prog="25"/>
+ <Patch name="PdlStl Phrs" drum="0" hbank="93" lbank="19" prog="26"/>
+ <Patch name="Asia UFO" drum="0" hbank="93" lbank="19" prog="27"/>
+ <Patch name="UBeenSoBaa" drum="0" hbank="93" lbank="19" prog="28"/>
+ <Patch name="Didgeri /" drum="0" hbank="93" lbank="19" prog="29"/>
+ <Patch name="WorldGroove" drum="0" hbank="93" lbank="19" prog="30"/>
+ <Patch name="LoopPhrase 1" drum="0" hbank="93" lbank="19" prog="31"/>
+ <Patch name="LoopPhrase 2" drum="0" hbank="93" lbank="19" prog="32"/>
+ <Patch name="TABLA groove" drum="0" hbank="93" lbank="19" prog="33"/>
+ <Patch name="JasonGoEast" drum="0" hbank="93" lbank="19" prog="34"/>
+ <Patch name="Flu and AcompSRX" drum="0" hbank="93" lbank="19" prog="35"/>
+ <Patch name="Split Floot" drum="0" hbank="93" lbank="19" prog="36"/>
+ <Patch name="Hot Salsa" drum="0" hbank="93" lbank="19" prog="37"/>
+ <Patch name="TempBassSolo" drum="0" hbank="93" lbank="19" prog="38"/>
+ <Patch name="CherryFlower" drum="0" hbank="93" lbank="19" prog="39"/>
+ <Patch name="SplitThisSRX" drum="0" hbank="93" lbank="19" prog="40"/>
+ <Patch name="Crane Dance" drum="0" hbank="93" lbank="19" prog="41"/>
+ <Patch name="LostInMists" drum="0" hbank="93" lbank="19" prog="42"/>
+ <Patch name="Qu DiEnsembl" drum="0" hbank="93" lbank="19" prog="43"/>
+ <Patch name="NasalBlossom" drum="0" hbank="93" lbank="19" prog="44"/>
+ <Patch name="Meditation 1" drum="0" hbank="93" lbank="19" prog="45"/>
+ <Patch name="Art Of Feng" drum="0" hbank="93" lbank="19" prog="46"/>
+ <Patch name="Orient xPres" drum="0" hbank="93" lbank="19" prog="47"/>
+ <Patch name="Padded Sitar" drum="0" hbank="93" lbank="19" prog="48"/>
+ <Patch name="No Worries" drum="0" hbank="93" lbank="19" prog="49"/>
+ <Patch name="IntarMel SRX" drum="0" hbank="93" lbank="19" prog="50"/>
+ <Patch name="Ode 2 An Oud" drum="0" hbank="93" lbank="19" prog="51"/>
+ <Patch name="Fugi-man" drum="0" hbank="93" lbank="19" prog="52"/>
+ <Patch name="China pluck" drum="0" hbank="93" lbank="19" prog="53"/>
+ <Patch name="Yuehchin SRX" drum="0" hbank="93" lbank="19" prog="54"/>
+ <Patch name="Kayakeum" drum="0" hbank="93" lbank="19" prog="55"/>
+ <Patch name="Asian Pizz" drum="0" hbank="93" lbank="19" prog="56"/>
+ <Patch name="PiPa SRX" drum="0" hbank="93" lbank="19" prog="57"/>
+ <Patch name="Koto SRX" drum="0" hbank="93" lbank="19" prog="58"/>
+ <Patch name="Shamisen SRX" drum="0" hbank="93" lbank="19" prog="59"/>
+ <Patch name="Sanshin SRX" drum="0" hbank="93" lbank="19" prog="60"/>
+ <Patch name="Yang Qin trm" drum="0" hbank="93" lbank="19" prog="61"/>
+ <Patch name="Yang Qin /Mod" drum="0" hbank="93" lbank="19" prog="62"/>
+ <Patch name="SultanPalace" drum="0" hbank="93" lbank="19" prog="63"/>
+ <Patch name="Marco Polo" drum="0" hbank="93" lbank="19" prog="64"/>
+ <Patch name="Bandolim SRX" drum="0" hbank="93" lbank="19" prog="65"/>
+ <Patch name="K.Bandolim" drum="0" hbank="93" lbank="19" prog="66"/>
+ <Patch name="Afro Harp" drum="0" hbank="93" lbank="19" prog="67"/>
+ <Patch name="Ethnhit!" drum="0" hbank="93" lbank="19" prog="68"/>
+ <Patch name="OctaHarp+" drum="0" hbank="93" lbank="19" prog="69"/>
+ <Patch name="St.GuShngSRX" drum="0" hbank="93" lbank="19" prog="70"/>
+ <Patch name="Sheng Sither" drum="0" hbank="93" lbank="19" prog="71"/>
+ <Patch name="Distance" drum="0" hbank="93" lbank="19" prog="72"/>
+ <Patch name="Mandolin/Mod" drum="0" hbank="93" lbank="19" prog="73"/>
+ <Patch name="Mandolin" drum="0" hbank="93" lbank="19" prog="74"/>
+ <Patch name="Mando Club" drum="0" hbank="93" lbank="19" prog="75"/>
+ <Patch name="MdlnTrmStSRX" drum="0" hbank="93" lbank="19" prog="76"/>
+ <Patch name="Drone Sitar" drum="0" hbank="93" lbank="19" prog="77"/>
+ <Patch name="Conch and Sitar" drum="0" hbank="93" lbank="19" prog="78"/>
+ <Patch name="Punjab Rocks" drum="0" hbank="93" lbank="19" prog="79"/>
+ <Patch name="Pas2IndiaSRX" drum="0" hbank="93" lbank="19" prog="80"/>
+ <Patch name="Rain Drone" drum="0" hbank="93" lbank="19" prog="81"/>
+ <Patch name="SitarGlisSRX" drum="0" hbank="93" lbank="19" prog="82"/>
+ <Patch name="Tambura SRX" drum="0" hbank="93" lbank="19" prog="83"/>
+ <Patch name="TambDroneSRX" drum="0" hbank="93" lbank="19" prog="84"/>
+ <Patch name="St.SanturSRX" drum="0" hbank="93" lbank="19" prog="85"/>
+ <Patch name="SanturTrmSRX" drum="0" hbank="93" lbank="19" prog="86"/>
+ <Patch name="Santur /Mod" drum="0" hbank="93" lbank="19" prog="87"/>
+ <Patch name="Canton" drum="0" hbank="93" lbank="19" prog="88"/>
+ <Patch name="HamrDulcimer" drum="0" hbank="93" lbank="19" prog="89"/>
+ <Patch name="3D Dulcimer" drum="0" hbank="93" lbank="19" prog="90"/>
+ <Patch name="Zither" drum="0" hbank="93" lbank="19" prog="91"/>
+ <Patch name="Magic Pluck" drum="0" hbank="93" lbank="19" prog="92"/>
+ <Patch name="Biwa SRX" drum="0" hbank="93" lbank="19" prog="93"/>
+ <Patch name="Biwa Menu" drum="0" hbank="93" lbank="19" prog="94"/>
+ <Patch name="BerimbauMenu" drum="0" hbank="93" lbank="19" prog="95"/>
+ <Patch name="Berimbau" drum="0" hbank="93" lbank="19" prog="96"/>
+ <Patch name="JawHarp Menu" drum="0" hbank="93" lbank="19" prog="97"/>
+ <Patch name="Steel Rhythm" drum="0" hbank="93" lbank="19" prog="98"/>
+ <Patch name="SoloSteelGtr" drum="0" hbank="93" lbank="19" prog="99"/>
+ <Patch name="N-Ville Soft" drum="0" hbank="93" lbank="19" prog="100"/>
+ <Patch name="Spruce Top" drum="0" hbank="93" lbank="19" prog="101"/>
+ <Patch name="Procssd AGtr" drum="0" hbank="93" lbank="19" prog="102"/>
+ <Patch name="High Strung" drum="0" hbank="93" lbank="19" prog="103"/>
+ <Patch name="Compresd D18" drum="0" hbank="93" lbank="19" prog="104"/>
+ <Patch name="12 String" drum="0" hbank="93" lbank="19" prog="105"/>
+ <Patch name="Mixed 12Str1" drum="0" hbank="93" lbank="19" prog="106"/>
+ <Patch name="Mixed 12Str2" drum="0" hbank="93" lbank="19" prog="107"/>
+ <Patch name="Ac Gtr 12stg" drum="0" hbank="93" lbank="19" prog="108"/>
+ <Patch name="No Borders" drum="0" hbank="93" lbank="19" prog="109"/>
+ <Patch name="Loose 12Str" drum="0" hbank="93" lbank="19" prog="110"/>
+ <Patch name="Living R.Gtr" drum="0" hbank="93" lbank="19" prog="111"/>
+ <Patch name="Dobro Modro" drum="0" hbank="93" lbank="19" prog="112"/>
+ <Patch name="ResonatorGtr" drum="0" hbank="93" lbank="19" prog="113"/>
+ <Patch name="Ac.Gtrs SRX" drum="0" hbank="93" lbank="19" prog="114"/>
+ <Patch name="2 Players" drum="0" hbank="93" lbank="19" prog="115"/>
+ <Patch name="Solo RequGtr" drum="0" hbank="93" lbank="19" prog="116"/>
+ <Patch name="Loose Nylon" drum="0" hbank="93" lbank="19" prog="117"/>
+ <Patch name="AcousticBros" drum="0" hbank="93" lbank="19" prog="118"/>
+ <Patch name="So Sad Nylon" drum="0" hbank="93" lbank="19" prog="119"/>
+ <Patch name="Chinese Duo" drum="0" hbank="93" lbank="19" prog="120"/>
+ <Patch name="ChugRunTrSRX" drum="0" hbank="93" lbank="19" prog="121"/>
+ <Patch name="Chung Ruan" drum="0" hbank="93" lbank="19" prog="122"/>
+ <Patch name="ChungRuanSRX" drum="0" hbank="93" lbank="19" prog="123"/>
+ <Patch name="Bottom Ruan" drum="0" hbank="93" lbank="19" prog="124"/>
+ <Patch name="RuangGtr SRX" drum="0" hbank="93" lbank="19" prog="125"/>
+ <Patch name="Oud SRX" drum="0" hbank="93" lbank="19" prog="126"/>
+ <Patch name="BlugrsSldSRX" drum="0" hbank="93" lbank="19" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="SRX09 World Collection 2">
+ <Patch name="Guitaro SRX" drum="0" hbank="93" lbank="20" prog="0"/>
+ <Patch name="Natural Tele" drum="0" hbank="93" lbank="20" prog="1"/>
+ <Patch name="Psyche Tele" drum="0" hbank="93" lbank="20" prog="2"/>
+ <Patch name="Coral" drum="0" hbank="93" lbank="20" prog="3"/>
+ <Patch name="Chorus Twang" drum="0" hbank="93" lbank="20" prog="4"/>
+ <Patch name="Pick Licker" drum="0" hbank="93" lbank="20" prog="5"/>
+ <Patch name="CleanStrtSRX" drum="0" hbank="93" lbank="20" prog="6"/>
+ <Patch name="Velo 335 SRX" drum="0" hbank="93" lbank="20" prog="7"/>
+ <Patch name="Right Funky" drum="0" hbank="93" lbank="20" prog="8"/>
+ <Patch name="Comp Muted" drum="0" hbank="93" lbank="20" prog="9"/>
+ <Patch name="E.GtrMt SRX" drum="0" hbank="93" lbank="20" prog="10"/>
+ <Patch name="335VelMt SRX" drum="0" hbank="93" lbank="20" prog="11"/>
+ <Patch name="Wide Guitar" drum="0" hbank="93" lbank="20" prog="12"/>
+ <Patch name="Dob-Compress" drum="0" hbank="93" lbank="20" prog="13"/>
+ <Patch name="Nice Twelvey" drum="0" hbank="93" lbank="20" prog="14"/>
+ <Patch name="RotaryCrunch" drum="0" hbank="93" lbank="20" prog="15"/>
+ <Patch name="FastRotrySRX" drum="0" hbank="93" lbank="20" prog="16"/>
+ <Patch name="EGDynaPikSRX" drum="0" hbank="93" lbank="20" prog="17"/>
+ <Patch name="BackingEGSRX" drum="0" hbank="93" lbank="20" prog="18"/>
+ <Patch name="Room Slide" drum="0" hbank="93" lbank="20" prog="19"/>
+ <Patch name="Pedal Steel" drum="0" hbank="93" lbank="20" prog="20"/>
+ <Patch name="Phased P.Stl" drum="0" hbank="93" lbank="20" prog="21"/>
+ <Patch name="PureSteelSRX" drum="0" hbank="93" lbank="20" prog="22"/>
+ <Patch name="MutedAmbient" drum="0" hbank="93" lbank="20" prog="23"/>
+ <Patch name="GtrFX Menu" drum="0" hbank="93" lbank="20" prog="24"/>
+ <Patch name="LP Gtr SRX" drum="0" hbank="93" lbank="20" prog="25"/>
+ <Patch name="Tele-Funfken" drum="0" hbank="93" lbank="20" prog="26"/>
+ <Patch name="335 and Cabinet" drum="0" hbank="93" lbank="20" prog="27"/>
+ <Patch name="Tele Licker" drum="0" hbank="93" lbank="20" prog="28"/>
+ <Patch name="Short and Long" drum="0" hbank="93" lbank="20" prog="29"/>
+ <Patch name="NewBeginning" drum="0" hbank="93" lbank="20" prog="30"/>
+ <Patch name="Bouzouki" drum="0" hbank="93" lbank="20" prog="31"/>
+ <Patch name="Bousoukhit!" drum="0" hbank="93" lbank="20" prog="32"/>
+ <Patch name="3ChdStrumSRX" drum="0" hbank="93" lbank="20" prog="33"/>
+ <Patch name="Strum Poetic" drum="0" hbank="93" lbank="20" prog="34"/>
+ <Patch name="Strum Away" drum="0" hbank="93" lbank="20" prog="35"/>
+ <Patch name="Banjo-Mando" drum="0" hbank="93" lbank="20" prog="36"/>
+ <Patch name="5StringBanjo" drum="0" hbank="93" lbank="20" prog="37"/>
+ <Patch name="Banjo SRX 1" drum="0" hbank="93" lbank="20" prog="38"/>
+ <Patch name="Banjo SRX 2" drum="0" hbank="93" lbank="20" prog="39"/>
+ <Patch name="Banjo SRX 3" drum="0" hbank="93" lbank="20" prog="40"/>
+ <Patch name="Fiddle" drum="0" hbank="93" lbank="20" prog="41"/>
+ <Patch name="Fiddle 2002" drum="0" hbank="93" lbank="20" prog="42"/>
+ <Patch name="FiddleSwitch" drum="0" hbank="93" lbank="20" prog="43"/>
+ <Patch name="Fiddle Sect." drum="0" hbank="93" lbank="20" prog="44"/>
+ <Patch name="FiddleStacto" drum="0" hbank="93" lbank="20" prog="45"/>
+ <Patch name="AsianOrcPizz" drum="0" hbank="93" lbank="20" prog="46"/>
+ <Patch name="AJapaneseInn" drum="0" hbank="93" lbank="20" prog="47"/>
+ <Patch name="Deep Blue" drum="0" hbank="93" lbank="20" prog="48"/>
+ <Patch name="Ethnic Ens" drum="0" hbank="93" lbank="20" prog="49"/>
+ <Patch name="ChinesOrcSRX" drum="0" hbank="93" lbank="20" prog="50"/>
+ <Patch name="ErHu / SRX" drum="0" hbank="93" lbank="20" prog="51"/>
+ <Patch name="ErHuSolo SRX" drum="0" hbank="93" lbank="20" prog="52"/>
+ <Patch name="ErHu Ld SRX" drum="0" hbank="93" lbank="20" prog="53"/>
+ <Patch name="FiddleFXmenu" drum="0" hbank="93" lbank="20" prog="54"/>
+ <Patch name="ViolnSoloSRX" drum="0" hbank="93" lbank="20" prog="55"/>
+ <Patch name="Comp BabyBss" drum="0" hbank="93" lbank="20" prog="56"/>
+ <Patch name="Baby Bass" drum="0" hbank="93" lbank="20" prog="57"/>
+ <Patch name="Comp Fingerd" drum="0" hbank="93" lbank="20" prog="58"/>
+ <Patch name="Jazz Fing.BS" drum="0" hbank="93" lbank="20" prog="59"/>
+ <Patch name="Live Bass" drum="0" hbank="93" lbank="20" prog="60"/>
+ <Patch name="Flango Bass" drum="0" hbank="93" lbank="20" prog="61"/>
+ <Patch name="Bass Oddesy" drum="0" hbank="93" lbank="20" prog="62"/>
+ <Patch name="6Str Bs SRX1" drum="0" hbank="93" lbank="20" prog="63"/>
+ <Patch name="Muted Bass" drum="0" hbank="93" lbank="20" prog="64"/>
+ <Patch name="6Str/Mt SRX" drum="0" hbank="93" lbank="20" prog="65"/>
+ <Patch name="PickBsHd SRX" drum="0" hbank="93" lbank="20" prog="66"/>
+ <Patch name="PickedBs SRX" drum="0" hbank="93" lbank="20" prog="67"/>
+ <Patch name="Tub Bass" drum="0" hbank="93" lbank="20" prog="68"/>
+ <Patch name="GuitarnBsSRX" drum="0" hbank="93" lbank="20" prog="69"/>
+ <Patch name="GtrnOct SRX" drum="0" hbank="93" lbank="20" prog="70"/>
+ <Patch name="PacificDream" drum="0" hbank="93" lbank="20" prog="71"/>
+ <Patch name="Meditation 2" drum="0" hbank="93" lbank="20" prog="72"/>
+ <Patch name="HybridKemong" drum="0" hbank="93" lbank="20" prog="73"/>
+ <Patch name="Purify" drum="0" hbank="93" lbank="20" prog="74"/>
+ <Patch name="Asia Bells" drum="0" hbank="93" lbank="20" prog="75"/>
+ <Patch name="Rama Cym SRX" drum="0" hbank="93" lbank="20" prog="76"/>
+ <Patch name="Bell Orchest" drum="0" hbank="93" lbank="20" prog="77"/>
+ <Patch name="Sacred Bells" drum="0" hbank="93" lbank="20" prog="78"/>
+ <Patch name="Spokes" drum="0" hbank="93" lbank="20" prog="79"/>
+ <Patch name="Winter Bells" drum="0" hbank="93" lbank="20" prog="80"/>
+ <Patch name="Wind Bells" drum="0" hbank="93" lbank="20" prog="81"/>
+ <Patch name="BelAngk SRX" drum="0" hbank="93" lbank="20" prog="82"/>
+ <Patch name="Tcheekolyna" drum="0" hbank="93" lbank="20" prog="83"/>
+ <Patch name="Wood EPiano" drum="0" hbank="93" lbank="20" prog="84"/>
+ <Patch name="Kalimba" drum="0" hbank="93" lbank="20" prog="85"/>
+ <Patch name="Kalimbatch" drum="0" hbank="93" lbank="20" prog="86"/>
+ <Patch name="VelAfro SRX1" drum="0" hbank="93" lbank="20" prog="87"/>
+ <Patch name="BSKalimbaSRX" drum="0" hbank="93" lbank="20" prog="88"/>
+ <Patch name="LogDetunrSRX" drum="0" hbank="93" lbank="20" prog="89"/>
+ <Patch name="Baateri SRX" drum="0" hbank="93" lbank="20" prog="90"/>
+ <Patch name="Balafon SRX" drum="0" hbank="93" lbank="20" prog="91"/>
+ <Patch name="Asian Wood" drum="0" hbank="93" lbank="20" prog="92"/>
+ <Patch name="Mellow tone" drum="0" hbank="93" lbank="20" prog="93"/>
+ <Patch name="Glas Mlt SRX" drum="0" hbank="93" lbank="20" prog="94"/>
+ <Patch name="SteelDr SRX1" drum="0" hbank="93" lbank="20" prog="95"/>
+ <Patch name="SteelDr SRX2" drum="0" hbank="93" lbank="20" prog="96"/>
+ <Patch name="Gendrous SRX" drum="0" hbank="93" lbank="20" prog="97"/>
+ <Patch name="BonangGamSRX" drum="0" hbank="93" lbank="20" prog="98"/>
+ <Patch name="VelAfro SRX2" drum="0" hbank="93" lbank="20" prog="99"/>
+ <Patch name="TemleMetlSRX" drum="0" hbank="93" lbank="20" prog="100"/>
+ <Patch name="Kemong / SRX" drum="0" hbank="93" lbank="20" prog="101"/>
+ <Patch name="Kane / SRX" drum="0" hbank="93" lbank="20" prog="102"/>
+ <Patch name="JeGong / SRX" drum="0" hbank="93" lbank="20" prog="103"/>
+ <Patch name="Jegogn / SRX" drum="0" hbank="93" lbank="20" prog="104"/>
+ <Patch name="Jublag / SRX" drum="0" hbank="93" lbank="20" prog="105"/>
+ <Patch name="Reyong / SRX" drum="0" hbank="93" lbank="20" prog="106"/>
+ <Patch name="Pemade / SRX" drum="0" hbank="93" lbank="20" prog="107"/>
+ <Patch name="Cajun" drum="0" hbank="93" lbank="20" prog="108"/>
+ <Patch name="D.Accordion" drum="0" hbank="93" lbank="20" prog="109"/>
+ <Patch name="SquezeBoxSRX" drum="0" hbank="93" lbank="20" prog="110"/>
+ <Patch name="Squeeze Box" drum="0" hbank="93" lbank="20" prog="111"/>
+ <Patch name="St.AcdOp SRX" drum="0" hbank="93" lbank="20" prog="112"/>
+ <Patch name="AcdionOp SRX" drum="0" hbank="93" lbank="20" prog="113"/>
+ <Patch name="Acd ffOp SRX" drum="0" hbank="93" lbank="20" prog="114"/>
+ <Patch name="STt.AcdCl SRX" drum="0" hbank="93" lbank="20" prog="115"/>
+ <Patch name="Bluesy" drum="0" hbank="93" lbank="20" prog="116"/>
+ <Patch name="HarmonicaSRX" drum="0" hbank="93" lbank="20" prog="117"/>
+ <Patch name="CuntryHrpSRX" drum="0" hbank="93" lbank="20" prog="118"/>
+ <Patch name="Sessn HrpSRX" drum="0" hbank="93" lbank="20" prog="119"/>
+ <Patch name="Esraj and Mizmar" drum="0" hbank="93" lbank="20" prog="120"/>
+ <Patch name="Before Time" drum="0" hbank="93" lbank="20" prog="121"/>
+ <Patch name="Gagaku Ems" drum="0" hbank="93" lbank="20" prog="122"/>
+ <Patch name="Mizmar solo" drum="0" hbank="93" lbank="20" prog="123"/>
+ <Patch name="PiriSolo SRX" drum="0" hbank="93" lbank="20" prog="124"/>
+ <Patch name="Shahnai SRX" drum="0" hbank="93" lbank="20" prog="125"/>
+ <Patch name="HichirikSRX" drum="0" hbank="93" lbank="20" prog="126"/>
+ <Patch name="Bagpipes SRX" drum="0" hbank="93" lbank="20" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="SRX09 World Collection 3">
+ <Patch name="Sheng / SRX" drum="0" hbank="93" lbank="21" prog="0"/>
+ <Patch name="Suona / SRX" drum="0" hbank="93" lbank="21" prog="1"/>
+ <Patch name="VillageDance" drum="0" hbank="93" lbank="21" prog="2"/>
+ <Patch name="Indian Ens" drum="0" hbank="93" lbank="21" prog="3"/>
+ <Patch name="Nature Loves" drum="0" hbank="93" lbank="21" prog="4"/>
+ <Patch name="PanPipes SRX" drum="0" hbank="93" lbank="21" prog="5"/>
+ <Patch name="Sad Pipe" drum="0" hbank="93" lbank="21" prog="6"/>
+ <Patch name="Shell blow" drum="0" hbank="93" lbank="21" prog="7"/>
+ <Patch name="Desert Flute" drum="0" hbank="93" lbank="21" prog="8"/>
+ <Patch name="Zampona" drum="0" hbank="93" lbank="21" prog="9"/>
+ <Patch name="Isolation" drum="0" hbank="93" lbank="21" prog="10"/>
+ <Patch name="Ocarina" drum="0" hbank="93" lbank="21" prog="11"/>
+ <Patch name="New IndFlute" drum="0" hbank="93" lbank="21" prog="12"/>
+ <Patch name="Qu Di Vib" drum="0" hbank="93" lbank="21" prog="13"/>
+ <Patch name="Bang Di Vib" drum="0" hbank="93" lbank="21" prog="14"/>
+ <Patch name="New Kawala" drum="0" hbank="93" lbank="21" prog="15"/>
+ <Patch name="BreathyIndia" drum="0" hbank="93" lbank="21" prog="16"/>
+ <Patch name="New Shaku" drum="0" hbank="93" lbank="21" prog="17"/>
+ <Patch name="Shakuhachi" drum="0" hbank="93" lbank="21" prog="18"/>
+ <Patch name="DreamInColor" drum="0" hbank="93" lbank="21" prog="19"/>
+ <Patch name="TwinHillyLd" drum="0" hbank="93" lbank="21" prog="20"/>
+ <Patch name="Snake Eyes" drum="0" hbank="93" lbank="21" prog="21"/>
+ <Patch name="Latin Trumpt" drum="0" hbank="93" lbank="21" prog="22"/>
+ <Patch name="MariachiTpts" drum="0" hbank="93" lbank="21" prog="23"/>
+ <Patch name="Trumpets" drum="0" hbank="93" lbank="21" prog="24"/>
+ <Patch name="GrowlWah/Mod" drum="0" hbank="93" lbank="21" prog="25"/>
+ <Patch name="Muted-Grw /" drum="0" hbank="93" lbank="21" prog="26"/>
+ <Patch name="SoloTuba SRX" drum="0" hbank="93" lbank="21" prog="27"/>
+ <Patch name="LatinTubaSRX" drum="0" hbank="93" lbank="21" prog="28"/>
+ <Patch name="World Orch" drum="0" hbank="93" lbank="21" prog="29"/>
+ <Patch name="Stab and Hold" drum="0" hbank="93" lbank="21" prog="30"/>
+ <Patch name="Indian Radio" drum="0" hbank="93" lbank="21" prog="31"/>
+ <Patch name="Wide Brass" drum="0" hbank="93" lbank="21" prog="32"/>
+ <Patch name="Trombones" drum="0" hbank="93" lbank="21" prog="33"/>
+ <Patch name="Brass Snapz" drum="0" hbank="93" lbank="21" prog="34"/>
+ <Patch name="Brass sfzzZZ" drum="0" hbank="93" lbank="21" prog="35"/>
+ <Patch name="2Tp+Tbn SRX" drum="0" hbank="93" lbank="21" prog="36"/>
+ <Patch name="MemphisHORNS" drum="0" hbank="93" lbank="21" prog="37"/>
+ <Patch name="SectStactSRX" drum="0" hbank="93" lbank="21" prog="38"/>
+ <Patch name="LatinBrasses" drum="0" hbank="93" lbank="21" prog="39"/>
+ <Patch name="Hit and Fall" drum="0" hbank="93" lbank="21" prog="40"/>
+ <Patch name="BrsChd13 SRX" drum="0" hbank="93" lbank="21" prog="41"/>
+ <Patch name="BrsChdMi9SRX" drum="0" hbank="93" lbank="21" prog="42"/>
+ <Patch name="BrsChdMj9SRX" drum="0" hbank="93" lbank="21" prog="43"/>
+ <Patch name="Blow Pad" drum="0" hbank="93" lbank="21" prog="44"/>
+ <Patch name="Ceremony" drum="0" hbank="93" lbank="21" prog="45"/>
+ <Patch name="Glasses" drum="0" hbank="93" lbank="21" prog="46"/>
+ <Patch name="Ambiccordian" drum="0" hbank="93" lbank="21" prog="47"/>
+ <Patch name="DroneFlanger" drum="0" hbank="93" lbank="21" prog="48"/>
+ <Patch name="Rock Gods" drum="0" hbank="93" lbank="21" prog="49"/>
+ <Patch name="ScotlandLass" drum="0" hbank="93" lbank="21" prog="50"/>
+ <Patch name="Dry Fishes" drum="0" hbank="93" lbank="21" prog="51"/>
+ <Patch name="SteroidBrass" drum="0" hbank="93" lbank="21" prog="52"/>
+ <Patch name="Soul revived" drum="0" hbank="93" lbank="21" prog="53"/>
+ <Patch name="Rain Pad" drum="0" hbank="93" lbank="21" prog="54"/>
+ <Patch name="Rising Sun" drum="0" hbank="93" lbank="21" prog="55"/>
+ <Patch name="Ethnopad" drum="0" hbank="93" lbank="21" prog="56"/>
+ <Patch name="Ethno Strngs" drum="0" hbank="93" lbank="21" prog="57"/>
+ <Patch name="and 40 Thieves" drum="0" hbank="93" lbank="21" prog="58"/>
+ <Patch name="TromboSynthy" drum="0" hbank="93" lbank="21" prog="59"/>
+ <Patch name="GrandExaltd1" drum="0" hbank="93" lbank="21" prog="60"/>
+ <Patch name="Sun Dog" drum="0" hbank="93" lbank="21" prog="61"/>
+ <Patch name="TechnoSpirit" drum="0" hbank="93" lbank="21" prog="62"/>
+ <Patch name="Play Softly" drum="0" hbank="93" lbank="21" prog="63"/>
+ <Patch name="WorkerBeetle" drum="0" hbank="93" lbank="21" prog="64"/>
+ <Patch name="Glass Cut" drum="0" hbank="93" lbank="21" prog="65"/>
+ <Patch name="GuruTronics" drum="0" hbank="93" lbank="21" prog="66"/>
+ <Patch name="DubJazz Trip" drum="0" hbank="93" lbank="21" prog="67"/>
+ <Patch name="Meditation 2" drum="0" hbank="93" lbank="21" prog="68"/>
+ <Patch name="Political" drum="0" hbank="93" lbank="21" prog="69"/>
+ <Patch name="G-day Mate" drum="0" hbank="93" lbank="21" prog="70"/>
+ <Patch name="Mission" drum="0" hbank="93" lbank="21" prog="71"/>
+ <Patch name="Jegorgan" drum="0" hbank="93" lbank="21" prog="72"/>
+ <Patch name="Dyno Conga 1" drum="0" hbank="93" lbank="21" prog="73"/>
+ <Patch name="Dyno Conga 2" drum="0" hbank="93" lbank="21" prog="74"/>
+ <Patch name="Congas+Bongo" drum="0" hbank="93" lbank="21" prog="75"/>
+ <Patch name="DynTimbale 1" drum="0" hbank="93" lbank="21" prog="76"/>
+ <Patch name="DynTimbale 2" drum="0" hbank="93" lbank="21" prog="77"/>
+ <Patch name="TimbaleCuica" drum="0" hbank="93" lbank="21" prog="78"/>
+ <Patch name="Dyno Surdo" drum="0" hbank="93" lbank="21" prog="79"/>
+ <Patch name="Rhythm Sect" drum="0" hbank="93" lbank="21" prog="80"/>
+ <Patch name="Rainstick" drum="0" hbank="93" lbank="21" prog="81"/>
+ <Patch name="Clap and Snap" drum="0" hbank="93" lbank="21" prog="82"/>
+ <Patch name="CowbellRandm" drum="0" hbank="93" lbank="21" prog="83"/>
+ <Patch name="Karachi-Man" drum="0" hbank="93" lbank="21" prog="84"/>
+ <Patch name="That Was Zen" drum="0" hbank="93" lbank="21" prog="85"/>
+ <Patch name="StreetParade" drum="0" hbank="93" lbank="21" prog="86"/>
+ <Patch name="BUK" drum="0" hbank="93" lbank="21" prog="87"/>
+ <Patch name="Gongs" drum="0" hbank="93" lbank="21" prog="88"/>
+ <Patch name="Chenchen /" drum="0" hbank="93" lbank="21" prog="89"/>
+ <Patch name="WisdomWithin" drum="0" hbank="93" lbank="21" prog="90"/>
+ <Patch name="Tabla+" drum="0" hbank="93" lbank="21" prog="91"/>
+ <Patch name="DrumsScene" drum="0" hbank="93" lbank="21" prog="92"/>
+ <Patch name="Doholla Fun" drum="0" hbank="93" lbank="21" prog="93"/>
+ <Patch name="AfricanRhtms" drum="0" hbank="93" lbank="21" prog="94"/>
+ <Patch name="Big Logs SRX" drum="0" hbank="93" lbank="21" prog="95"/>
+ <Patch name="WarDrums SRX" drum="0" hbank="93" lbank="21" prog="96"/>
+ <Patch name="Samba Menu" drum="0" hbank="93" lbank="21" prog="97"/>
+ <Patch name="Shaker Menu" drum="0" hbank="93" lbank="21" prog="98"/>
+ <Patch name="Caixa Menu" drum="0" hbank="93" lbank="21" prog="99"/>
+ <Patch name="Cowbell Menu" drum="0" hbank="93" lbank="21" prog="100"/>
+ <Patch name="JapanPrcMenu" drum="0" hbank="93" lbank="21" prog="101"/>
+ <Patch name="Kabuki Menu" drum="0" hbank="93" lbank="21" prog="102"/>
+ <Patch name="KwangawariSRX" drum="0" hbank="93" lbank="21" prog="103"/>
+ <Patch name="Tuzumi / SRX" drum="0" hbank="93" lbank="21" prog="104"/>
+ <Patch name="KoreaPrcMenu" drum="0" hbank="93" lbank="21" prog="105"/>
+ <Patch name="ChinaPrcMenu" drum="0" hbank="93" lbank="21" prog="106"/>
+ <Patch name="China Menu" drum="0" hbank="93" lbank="21" prog="107"/>
+ <Patch name="ChinaGongSRX" drum="0" hbank="93" lbank="21" prog="108"/>
+ <Patch name="Sanba / SRX" drum="0" hbank="93" lbank="21" prog="109"/>
+ <Patch name="St.ShouBoSRX" drum="0" hbank="93" lbank="21" prog="110"/>
+ <Patch name="AsiaCym Menu" drum="0" hbank="93" lbank="21" prog="111"/>
+ <Patch name="Gong Menu" drum="0" hbank="93" lbank="21" prog="112"/>
+ <Patch name="Gamelan Menu" drum="0" hbank="93" lbank="21" prog="113"/>
+ <Patch name="GamlnPrcMenu" drum="0" hbank="93" lbank="21" prog="114"/>
+ <Patch name="BigBazar SRX" drum="0" hbank="93" lbank="21" prog="115"/>
+ <Patch name="Udu Pot Menu" drum="0" hbank="93" lbank="21" prog="116"/>
+ <Patch name="TablaBy Menu" drum="0" hbank="93" lbank="21" prog="117"/>
+ <Patch name="Rek Menu" drum="0" hbank="93" lbank="21" prog="118"/>
+ <Patch name="Dholak Menu1" drum="0" hbank="93" lbank="21" prog="119"/>
+ <Patch name="Dholak Menu2" drum="0" hbank="93" lbank="21" prog="120"/>
+ <Patch name="Dhol Menu" drum="0" hbank="93" lbank="21" prog="121"/>
+ <Patch name="Egypt Tablah" drum="0" hbank="93" lbank="21" prog="122"/>
+ <Patch name="Madal Menu" drum="0" hbank="93" lbank="21" prog="123"/>
+ <Patch name="AfropercMenu" drum="0" hbank="93" lbank="21" prog="124"/>
+ <Patch name="CommSatelite" drum="0" hbank="93" lbank="21" prog="125"/>
+ <Patch name="Amazone" drum="0" hbank="93" lbank="21" prog="126"/>
+ <Patch name="Tasman Sea" drum="0" hbank="93" lbank="21" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="SRX09 World Collection 4">
+ <Patch name="Ethnic FX 1" drum="0" hbank="93" lbank="22" prog="0"/>
+ <Patch name="Ethnic FX 2" drum="0" hbank="93" lbank="22" prog="1"/>
+ <Patch name="SpacetualBoy" drum="0" hbank="93" lbank="22" prog="2"/>
+ <Patch name="Crystal" drum="0" hbank="93" lbank="22" prog="3"/>
+ <Patch name="SpaceLuvSick" drum="0" hbank="93" lbank="22" prog="4"/>
+ <Patch name="HitAscension" drum="0" hbank="93" lbank="22" prog="5"/>
+ <Patch name="Nervous Man" drum="0" hbank="93" lbank="22" prog="6"/>
+ <Patch name="Silk Stream" drum="0" hbank="93" lbank="22" prog="7"/>
+ <Patch name="DerangedMind" drum="0" hbank="93" lbank="22" prog="8"/>
+ <Patch name="PolyDrone" drum="0" hbank="93" lbank="22" prog="9"/>
+ <Patch name="TequillaWorm" drum="0" hbank="93" lbank="22" prog="10"/>
+ <Patch name="GlistenToYou" drum="0" hbank="93" lbank="22" prog="11"/>
+ <Patch name="Dream Harp" drum="0" hbank="93" lbank="22" prog="12"/>
+ <Patch name="Waterfall" drum="0" hbank="93" lbank="22" prog="13"/>
+ <Patch name="Gender 3D" drum="0" hbank="93" lbank="22" prog="14"/>
+ <Patch name="Doom Drum" drum="0" hbank="93" lbank="22" prog="15"/>
+ <Patch name="Stalker" drum="0" hbank="93" lbank="22" prog="16"/>
+ <Patch name="PlasticBones" drum="0" hbank="93" lbank="22" prog="17"/>
+ <Patch name="PakistanVibe" drum="0" hbank="93" lbank="22" prog="18"/>
+ <Patch name="ThusSpokeZtr" drum="0" hbank="93" lbank="22" prog="19"/>
+ <Patch name="Kalissando" drum="0" hbank="93" lbank="22" prog="20"/>
+ <Patch name="Rain Forest" drum="0" hbank="93" lbank="22" prog="21"/>
+ <Patch name="AfropunchSRX" drum="0" hbank="93" lbank="22" prog="22"/>
+ <Patch name="Dance Tape" drum="0" hbank="93" lbank="22" prog="23"/>
+ <Patch name="Zaghruta SRX" drum="0" hbank="93" lbank="22" prog="24"/>
+ <Patch name="1,2,3,4! SRX" drum="0" hbank="93" lbank="22" prog="25"/>
+ <Patch name="Voices SRX" drum="0" hbank="93" lbank="22" prog="26"/>
+ <Patch name="Voice Menu 1" drum="0" hbank="93" lbank="22" prog="27"/>
+ <Patch name="Voice Menu 2" drum="0" hbank="93" lbank="22" prog="28"/>
+ <Patch name="Voice Menu3" drum="0" hbank="93" lbank="22" prog="29"/>
+ </PatchGroup>
+
+</MidiInstrument>
+
+</muse>
diff --git a/muse/share/instruments/Waldorf_Microwave-I.idf b/muse/share/instruments/Waldorf_Microwave-I.idf
new file mode 100644
index 00000000..9975d04a
--- /dev/null
+++ b/muse/share/instruments/Waldorf_Microwave-I.idf
@@ -0,0 +1,141 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Waldorf Microwave I">
+ <PatchGroup name="Internal Bank A">
+ <Patch name="A 01" prog="000" hbank="0" lbank="0"/>
+ <Patch name="A 02" prog="001" hbank="0" lbank="0"/>
+ <Patch name="A 03" prog="002" hbank="0" lbank="0"/>
+ <Patch name="A 04" prog="003" hbank="0" lbank="0"/>
+ <Patch name="A 05" prog="004" hbank="0" lbank="0"/>
+ <Patch name="A 06" prog="005" hbank="0" lbank="0"/>
+ <Patch name="A 07" prog="006" hbank="0" lbank="0"/>
+ <Patch name="A 08" prog="007" hbank="0" lbank="0"/>
+ <Patch name="A 09" prog="008" hbank="0" lbank="0"/>
+ <Patch name="A 10" prog="009" hbank="0" lbank="0"/>
+ <Patch name="A 11" prog="010" hbank="0" lbank="0"/>
+ <Patch name="A 12" prog="011" hbank="0" lbank="0"/>
+ <Patch name="A 13" prog="012" hbank="0" lbank="0"/>
+ <Patch name="A 14" prog="013" hbank="0" lbank="0"/>
+ <Patch name="A 15" prog="014" hbank="0" lbank="0"/>
+ <Patch name="A 16" prog="015" hbank="0" lbank="0"/>
+ <Patch name="A 17" prog="016" hbank="0" lbank="0"/>
+ <Patch name="A 18" prog="017" hbank="0" lbank="0"/>
+ <Patch name="A 19" prog="018" hbank="0" lbank="0"/>
+ <Patch name="A 20" prog="019" hbank="0" lbank="0"/>
+ <Patch name="A 21" prog="020" hbank="0" lbank="0"/>
+ <Patch name="A 22" prog="021" hbank="0" lbank="0"/>
+ <Patch name="A 23" prog="022" hbank="0" lbank="0"/>
+ <Patch name="A 24" prog="023" hbank="0" lbank="0"/>
+ <Patch name="A 25" prog="024" hbank="0" lbank="0"/>
+ <Patch name="A 26" prog="025" hbank="0" lbank="0"/>
+ <Patch name="A 27" prog="026" hbank="0" lbank="0"/>
+ <Patch name="A 28" prog="027" hbank="0" lbank="0"/>
+ <Patch name="A 29" prog="028" hbank="0" lbank="0"/>
+ <Patch name="A 30" prog="029" hbank="0" lbank="0"/>
+ <Patch name="A 31" prog="030" hbank="0" lbank="0"/>
+ <Patch name="A 32" prog="031" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Internal Bank B">
+ <Patch name="B 01" prog="032" hbank="0" lbank="0"/>
+ <Patch name="B 02" prog="033" hbank="0" lbank="0"/>
+ <Patch name="B 03" prog="034" hbank="0" lbank="0"/>
+ <Patch name="B 04" prog="035" hbank="0" lbank="0"/>
+ <Patch name="B 05" prog="036" hbank="0" lbank="0"/>
+ <Patch name="B 06" prog="037" hbank="0" lbank="0"/>
+ <Patch name="B 07" prog="038" hbank="0" lbank="0"/>
+ <Patch name="B 08" prog="039" hbank="0" lbank="0"/>
+ <Patch name="B 09" prog="040" hbank="0" lbank="0"/>
+ <Patch name="B 10" prog="041" hbank="0" lbank="0"/>
+ <Patch name="B 11" prog="042" hbank="0" lbank="0"/>
+ <Patch name="B 12" prog="043" hbank="0" lbank="0"/>
+ <Patch name="B 13" prog="044" hbank="0" lbank="0"/>
+ <Patch name="B 14" prog="045" hbank="0" lbank="0"/>
+ <Patch name="B 15" prog="046" hbank="0" lbank="0"/>
+ <Patch name="B 16" prog="047" hbank="0" lbank="0"/>
+ <Patch name="B 17" prog="048" hbank="0" lbank="0"/>
+ <Patch name="B 18" prog="049" hbank="0" lbank="0"/>
+ <Patch name="B 19" prog="050" hbank="0" lbank="0"/>
+ <Patch name="B 20" prog="051" hbank="0" lbank="0"/>
+ <Patch name="B 21" prog="052" hbank="0" lbank="0"/>
+ <Patch name="B 22" prog="053" hbank="0" lbank="0"/>
+ <Patch name="B 23" prog="054" hbank="0" lbank="0"/>
+ <Patch name="B 24" prog="055" hbank="0" lbank="0"/>
+ <Patch name="B 25" prog="056" hbank="0" lbank="0"/>
+ <Patch name="B 26" prog="057" hbank="0" lbank="0"/>
+ <Patch name="B 27" prog="058" hbank="0" lbank="0"/>
+ <Patch name="B 28" prog="059" hbank="0" lbank="0"/>
+ <Patch name="B 29" prog="060" hbank="0" lbank="0"/>
+ <Patch name="B 30" prog="061" hbank="0" lbank="0"/>
+ <Patch name="B 31" prog="062" hbank="0" lbank="0"/>
+ <Patch name="B 32" prog="063" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Card Bank C">
+ <Patch name="C 01" prog="064" hbank="0" lbank="0"/>
+ <Patch name="C 02" prog="065" hbank="0" lbank="0"/>
+ <Patch name="C 03" prog="066" hbank="0" lbank="0"/>
+ <Patch name="C 04" prog="067" hbank="0" lbank="0"/>
+ <Patch name="C 05" prog="068" hbank="0" lbank="0"/>
+ <Patch name="C 06" prog="069" hbank="0" lbank="0"/>
+ <Patch name="C 07" prog="070" hbank="0" lbank="0"/>
+ <Patch name="C 08" prog="071" hbank="0" lbank="0"/>
+ <Patch name="C 09" prog="072" hbank="0" lbank="0"/>
+ <Patch name="C 10" prog="073" hbank="0" lbank="0"/>
+ <Patch name="C 11" prog="074" hbank="0" lbank="0"/>
+ <Patch name="C 12" prog="075" hbank="0" lbank="0"/>
+ <Patch name="C 13" prog="076" hbank="0" lbank="0"/>
+ <Patch name="C 14" prog="077" hbank="0" lbank="0"/>
+ <Patch name="C 15" prog="078" hbank="0" lbank="0"/>
+ <Patch name="C 16" prog="079" hbank="0" lbank="0"/>
+ <Patch name="C 17" prog="080" hbank="0" lbank="0"/>
+ <Patch name="C 18" prog="081" hbank="0" lbank="0"/>
+ <Patch name="C 19" prog="082" hbank="0" lbank="0"/>
+ <Patch name="C 20" prog="083" hbank="0" lbank="0"/>
+ <Patch name="C 21" prog="084" hbank="0" lbank="0"/>
+ <Patch name="C 22" prog="085" hbank="0" lbank="0"/>
+ <Patch name="C 23" prog="086" hbank="0" lbank="0"/>
+ <Patch name="C 24" prog="087" hbank="0" lbank="0"/>
+ <Patch name="C 25" prog="088" hbank="0" lbank="0"/>
+ <Patch name="C 26" prog="089" hbank="0" lbank="0"/>
+ <Patch name="C 27" prog="090" hbank="0" lbank="0"/>
+ <Patch name="C 28" prog="091" hbank="0" lbank="0"/>
+ <Patch name="C 29" prog="092" hbank="0" lbank="0"/>
+ <Patch name="C 30" prog="093" hbank="0" lbank="0"/>
+ <Patch name="C 31" prog="094" hbank="0" lbank="0"/>
+ <Patch name="C 32" prog="095" hbank="0" lbank="0"/>
+ </PatchGroup>
+ <PatchGroup name="Card Bank D">
+ <Patch name="D 01" prog="096" hbank="0" lbank="0"/>
+ <Patch name="D 02" prog="097" hbank="0" lbank="0"/>
+ <Patch name="D 03" prog="098" hbank="0" lbank="0"/>
+ <Patch name="D 04" prog="099" hbank="0" lbank="0"/>
+ <Patch name="D 05" prog="100" hbank="0" lbank="0"/>
+ <Patch name="D 06" prog="101" hbank="0" lbank="0"/>
+ <Patch name="D 07" prog="102" hbank="0" lbank="0"/>
+ <Patch name="D 08" prog="103" hbank="0" lbank="0"/>
+ <Patch name="D 09" prog="104" hbank="0" lbank="0"/>
+ <Patch name="D 10" prog="105" hbank="0" lbank="0"/>
+ <Patch name="D 11" prog="106" hbank="0" lbank="0"/>
+ <Patch name="D 12" prog="107" hbank="0" lbank="0"/>
+ <Patch name="D 13" prog="108" hbank="0" lbank="0"/>
+ <Patch name="D 14" prog="109" hbank="0" lbank="0"/>
+ <Patch name="D 15" prog="110" hbank="0" lbank="0"/>
+ <Patch name="D 16" prog="111" hbank="0" lbank="0"/>
+ <Patch name="D 17" prog="112" hbank="0" lbank="0"/>
+ <Patch name="D 18" prog="113" hbank="0" lbank="0"/>
+ <Patch name="D 19" prog="114" hbank="0" lbank="0"/>
+ <Patch name="D 20" prog="115" hbank="0" lbank="0"/>
+ <Patch name="D 21" prog="116" hbank="0" lbank="0"/>
+ <Patch name="D 22" prog="117" hbank="0" lbank="0"/>
+ <Patch name="D 23" prog="118" hbank="0" lbank="0"/>
+ <Patch name="D 24" prog="119" hbank="0" lbank="0"/>
+ <Patch name="D 25" prog="120" hbank="0" lbank="0"/>
+ <Patch name="D 26" prog="121" hbank="0" lbank="0"/>
+ <Patch name="D 27" prog="122" hbank="0" lbank="0"/>
+ <Patch name="D 28" prog="123" hbank="0" lbank="0"/>
+ <Patch name="D 29" prog="124" hbank="0" lbank="0"/>
+ <Patch name="D 30" prog="125" hbank="0" lbank="0"/>
+ <Patch name="D 31" prog="126" hbank="0" lbank="0"/>
+ <Patch name="D 32" prog="127" hbank="0" lbank="0"/>
+ </PatchGroup>
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/Yamaha-P50m.idf b/muse/share/instruments/Yamaha-P50m.idf
new file mode 100644
index 00000000..876aed52
--- /dev/null
+++ b/muse/share/instruments/Yamaha-P50m.idf
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+
+<!--
+ MusE Instrument Definition File for
+ Yamaha P50-m
+ Piano Tone Generator
+-->
+
+<muse version="1.0">
+ <MidiInstrument name="Yamaha-P50m">
+ <Patch name="bright piano s+s" prog="0"/>
+ <Patch name="bright piano s" prog="1"/>
+ <Patch name="bright piano m+s" prog="2"/>
+ <Patch name="bright piano m" prog="3"/>
+ <Patch name="dark piano" prog="4"/>
+ <Patch name="grand piano s+s" prog="5"/>
+ <Patch name="grand piano s" prog="6"/>
+ <Patch name="grand piano m+s" prog="7"/>
+ <Patch name="grand piano m" prog="8"/>
+ <Patch name="dance" prog="9"/>
+ <Patch name="honkytonk" prog="10"/>
+ <Patch name="hybrid piano" prog="11"/>
+ <Patch name="cp80, mono" prog="12"/>
+ <Patch name="cp80, mono s" prog="13"/>
+ <Patch name="cp80+chorus" prog="14"/>
+ <Patch name="dx ep" prog="15"/>
+ <Patch name="dx pad" prog="16"/>
+ <Patch name="dx ep+chorus" prog="17"/>
+ <Patch name="roads" prog="18"/>
+ <Patch name="roads+chorus" prog="19"/>
+ <Patch name="soft roads" prog="20"/>
+ <Patch name="hard roads" prog="21"/>
+ <Patch name="dyno" prog="22"/>
+ <Patch name="resonant dyno" prog="23"/>
+ <Patch name="dyno+chorus" prog="24"/>
+ <Patch name="wurli" prog="25"/>
+ <Patch name="clavi" prog="26"/>
+ <Patch name="clavi+wah" prog="27"/>
+ <Patch name="no sound" prog="28"/>
+
+ <!-- Controller -->
+ <Controller name="Modulation" type="Control" l="1"/>
+ <Controller name="PortamentoTime" type="Control" l="5"/>
+ <Controller name="MainVolume" type="Control" l="7"/>
+ <Controller name="Pan" type="Control" l="10"/>
+ <Controller name="Expression" type="Control" l="11"/>
+ <Controller name="Sustain" type="Control" l="64"/>
+ <Controller name="Portamento" type="Control" l="65"/>
+ <Controller name="Sostenuto" type="Control" l="66"/>
+ <Controller name="SoftPedal" type="Control" l="67"/>
+ <Controller name="HarmonicContent" type="Control" l="71"/>
+ <Controller name="ReleaseTime" type="Control" l="72"/>
+ <Controller name="AttackTime" type="Control" l="73"/>
+ <Controller name="Brightness" type="Control" l="74"/>
+ <Controller name="PortamentoControl" type="Control" l="84"/>
+ <Controller name="Effect1Depth" type="Control" l="91"/>
+ <Controller name="Effect3Depth" type="Control" l="93"/>
+
+ <!-- NRPN's -->
+ <Controller name="VibratoRate" type="NRPN" h="0x01" l="0x08" min="-64" max="64"/>
+ <Controller name="VibratoDepth" type="NRPN" h="0x01" l="0x09" min="-64" max="64"/>
+ <Controller name="VibratoDelay" type="NRPN" h="0x01" l="0x0a" min="-64" max="64"/>
+ <Controller name="FilterCutoffFrequency" type="NRPN" h="0x01" l="0x20" min="-64" max="64"/>
+ <Controller name="FilterResonance" type="NRPN" h="0x01" l="0x21" min="-64" max="64"/>
+ <Controller name="EgAttackTime" type="NRPN" h="0x01" l="0x63" min="-64" max="64"/>
+ <Controller name="EgDecayTime" type="NRPN" h="0x01" l="0x64" min="-64" max="64"/>
+ <Controller name="EgReleaseTime" type="NRPN" h="0x01" l="0x66" min="-64" max="64"/>
+
+ <!-- RPN's -->
+ <Controller name="PitchBendSensitivity" type="RPN" l="0" min="0" max="0x18" init="2" />
+ <Controller name="FineTuning" type="RPN" l="1" min="-64" max="64" init="2" />
+
+ </MidiInstrument>
+ </muse>
+
diff --git a/muse/share/instruments/Yamaha-P80.idf b/muse/share/instruments/Yamaha-P80.idf
new file mode 100644
index 00000000..735c463d
--- /dev/null
+++ b/muse/share/instruments/Yamaha-P80.idf
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+
+<!--
+ MusE Instrument Definition File for
+ Yamaha P80
+ Electronic Piano
+-->
+
+<muse version="1.0">
+ <MidiInstrument name="Yamaha-P80">
+ <Patch name="Grand Piano" lbank="112" prog="0"/>
+ <Patch name="Classical Piano" lbank="114" prog="0"/>
+ <Patch name="Jazz Piano" lbank="112" prog="1"/>
+ <Patch name="Rock Piano" lbank="114" prog="1"/>
+ <Patch name="E.Piano 1" lbank="112" prog="5"/>
+ <Patch name="E.Piano 2" lbank="112" prog="4"/>
+ <Patch name="Harpsichord" lbank="112" prog="6"/>
+ <Patch name="Strings" lbank="112" prog="48"/>
+ <Patch name="Pipe Organ" lbank="112" prog="19"/>
+ <Patch name="Church Organ" lbank="115" prog="19"/>
+ <Patch name="Jazz Organ" lbank="112" prog="16"/>
+ <Patch name="Bass" lbank="112" prog="32"/>
+
+ <Patch name="V-Grand Piano" lbank="113" prog="0"/>
+ <Patch name="V-Classical Piano" lbank="115" prog="0"/>
+ <Patch name="V-Jazz Piano" lbank="113" prog="1"/>
+ <Patch name="V-Rock Piano" lbank="115" prog="1"/>
+ <Patch name="V-E.Piano 1" lbank="112" prog="88"/>
+ <Patch name="V-E.Piano 2" lbank="118" prog="4"/>
+ <Patch name="V-Harpsichord" lbank="115" prog="6"/>
+ <Patch name="V-Strings" lbank="113" prog="49"/>
+ <Patch name="V-Pipe Organ" lbank="113" prog="19"/>
+ <Patch name="V-Church Organ" lbank="114" prog="19"/>
+ <Patch name="V-Jazz Organ" lbank="113" prog="16"/>
+ <Patch name="V-Bass" lbank="114" prog="32"/>
+
+ <!-- Controller -->
+ <Controller name="Modulation" type="Control" l="1" />
+ <Controller name="PortamentoTime" type="Control" l="5" />
+ <Controller name="MainVolume" type="Control" l="7" />
+ <Controller name="Pan" type="Control" l="10" />
+ <Controller name="Expression" type="Control" l="11" />
+ <Controller name="Sustain" type="Control" l="64" />
+ <Controller name="Portamento" type="Control" l="65" />
+ <Controller name="Sostenuto" type="Control" l="66" />
+ <Controller name="SoftPedal" type="Control" l="67" />
+ <Controller name="HarmonicContent" type="Control" l="71" />
+ <Controller name="ReleaseTime" type="Control" l="72" />
+ <Controller name="AttackTime" type="Control" l="73" />
+ <Controller name="Brightness" type="Control" l="74" />
+ <Controller name="PortamentoControl" type="Control" l="84" />
+ <Controller name="Effect1Depth" type="Control" l="91" />
+ <Controller name="Effect3Depth" type="Control" l="93" />
+
+ <!-- NRPN's -->
+ <Controller name="VibratoRate" type="NRPN" h="0x01" l="0x08" min="-64" max="64"/>
+ <Controller name="VibratoDepth" type="NRPN" h="0x01" l="0x09" min="-64" max="64"/>
+ <Controller name="VibratoDelay" type="NRPN" h="0x01" l="0x0a" min="-64" max="64"/>
+ <Controller name="FilterCutoffFrequency" type="NRPN" h="0x01" l="0x20" min="-64" max="64"/>
+ <Controller name="FilterResonance" type="NRPN" h="0x01" l="0x21" min="-64" max="64"/>
+ <Controller name="EgAttackTime" type="NRPN" h="0x01" l="0x63" min="-64" max="64"/>
+ <Controller name="EgDecayTime" type="NRPN" h="0x01" l="0x64" min="-64" max="64"/>
+ <Controller name="EgReleaseTime" type="NRPN" h="0x01" l="0x66" min="-64" max="64"/>
+
+ <!-- RPN's -->
+ <Controller name="PitchBendSensitivity" type="RPN" l="0" min="0" max="0x18" init="2" />
+ <Controller name="FineTuning" type="RPN" l="1" min="-64" max="64" init="2" />
+
+ </MidiInstrument>
+ </muse>
+
diff --git a/muse/share/instruments/Yamaha-PSR275.idf b/muse/share/instruments/Yamaha-PSR275.idf
new file mode 100644
index 00000000..ea3bcfa7
--- /dev/null
+++ b/muse/share/instruments/Yamaha-PSR275.idf
@@ -0,0 +1,585 @@
+<?xml version="1.0" ?>
+<muse version="1.0">
+ <MidiInstrument name="Yamaha PSR-275">
+ <Init>
+ </Init>
+ <PatchGroup name="Piano (panel)">
+ <Patch name="Grand Piano" hbank="0" lbank="112" prog="0" />
+ <Patch name="Bright Piano" hbank="0" lbank="112" prog="1" />
+ <Patch name="MIDI Grand Piano" hbank="0" lbank="112" prog="2" />
+ <Patch name="CP 80" hbank="0" lbank="113" prog="2" />
+ <Patch name="Honky-tonk Piano" hbank="0" lbank="112" prog="3" />
+ <Patch name="Harpsichord" hbank="0" lbank="112" prog="6" />
+ </PatchGroup>
+ <PatchGroup name="E.Piano (panel)">
+ <Patch name="Funky Electric Piano" hbank="0" lbank="112" prog="4" />
+ <Patch name="Galaxy EP" hbank="0" lbank="114" prog="4" />
+ <Patch name="DX Modern Elec. Piano" hbank="0" lbank="112" prog="5" />
+ <Patch name="Hyper Tines" hbank="0" lbank="113" prog="5" />
+ <Patch name="Venus Electric Piano" hbank="0" lbank="114" prog="5" />
+ <Patch name="Clavi" hbank="0" lbank="112" prog="7" />
+ </PatchGroup>
+ <PatchGroup name="Piano (XG)">
+ <Patch name="Grand Piano" hbank="0" lbank="0" prog="0" mode="5" />
+ <Patch name="Grand Piano KSP" hbank="0" lbank="1" prog="0" mode="4" />
+ <Patch name="Piano Strings" hbank="0" lbank="40" prog="0" mode="4" />
+ <Patch name="Dream" hbank="0" lbank="41" prog="0" mode="4" />
+ <Patch name="Bright Piano" hbank="0" lbank="0" prog="1" mode="5" />
+ <Patch name="Bright Piano KSP" hbank="0" lbank="1" prog="1" mode="4" />
+ <Patch name="Electric Grand Piano" hbank="0" lbank="0" prog="2" mode="5" />
+ <Patch name="Electric Grand Piano KSP" hbank="0" lbank="1" prog="2" mode="4" />
+ <Patch name="Detuned CP80" hbank="0" lbank="32" prog="2" mode="4" />
+ <Patch name="Honky-tonk Piano" hbank="0" lbank="0" prog="3" mode="5" />
+ <Patch name="Honky-tonk Piano KSP" hbank="0" lbank="1" prog="3" mode="4" />
+ <Patch name="Electric Piano 1" hbank="0" lbank="0" prog="4" mode="5" />
+ <Patch name="Electric Piano 1 KSP" hbank="0" lbank="1" prog="4" mode="4" />
+ <Patch name="Chorus Electric Piano 1" hbank="0" lbank="32" prog="4" mode="4" />
+ <Patch name="Electric Piano 2" hbank="0" lbank="0" prog="5" mode="5" />
+ <Patch name="Electric Piano 2 KSP" hbank="0" lbank="1" prog="5" mode="4" />
+ <Patch name="Chorus Electric Piano 2" hbank="0" lbank="32" prog="5" mode="4" />
+ <Patch name="DX + Analog Electric Piano" hbank="0" lbank="41" prog="5" mode="4" />
+ <Patch name="Harpsichord" hbank="0" lbank="0" prog="6" mode="5" />
+ <Patch name="Harpsichord KSP" hbank="0" lbank="1" prog="6" mode="4" />
+ <Patch name="Harpsichord 3" hbank="0" lbank="35" prog="6" mode="4" />
+ <Patch name="Clavi" hbank="0" lbank="0" prog="7" mode="5" />
+ <Patch name="Clavi KSP" hbank="0" lbank="1" prog="7" mode="4" />
+ </PatchGroup>
+ <PatchGroup name="Organ (panel)">
+ <Patch name="Jazz Organ 1" hbank="0" lbank="112" prog="16" />
+ <Patch name="Jazz Organ 2" hbank="0" lbank="113" prog="16" />
+ <Patch name="Theater Organ" hbank="0" lbank="114" prog="16" />
+ <Patch name="Bright Organ" hbank="0" lbank="116" prog="16" />
+ <Patch name="16'+2' Organ" hbank="0" lbank="118" prog="16" />
+ <Patch name="16'+4' Organ" hbank="0" lbank="119" prog="16" />
+ <Patch name="Click Organ" hbank="0" lbank="112" prog="17" />
+ <Patch name="Rock Organ" hbank="0" lbank="112" prog="18" />
+ <Patch name="Purple Organ" hbank="0" lbank="114" prog="18" />
+ <Patch name="Church Organ" hbank="0" lbank="112" prog="19" />
+ <Patch name="Chapel Organ" hbank="0" lbank="113" prog="19" />
+ <Patch name="Reed Organ" hbank="0" lbank="112" prog="20" />
+ </PatchGroup>
+ <PatchGroup name="Accordion (panel)">
+ <Patch name="Musette Accordion" hbank="0" lbank="112" prog="21" />
+ <Patch name="Traditional Accordion" hbank="0" lbank="113" prog="21" />
+ <Patch name="Harmonica" hbank="0" lbank="112" prog="22" />
+ <Patch name="Bandoneon" hbank="0" lbank="113" prog="23" />
+ </PatchGroup>
+ <PatchGroup name="Organ (XG)">
+ <Patch name="DrawOrg" hbank="0" lbank="0" prog="16" mode="5" />
+ <Patch name="Detuned DrawOrg" hbank="0" lbank="32" prog="16" mode="4" />
+ <Patch name="60's DrawOrg 1" hbank="0" lbank="33" prog="16" mode="4" />
+ <Patch name="60's DrawOrg 2" hbank="0" lbank="34" prog="16" mode="4" />
+ <Patch name="70's DrawOrg 1" hbank="0" lbank="35" prog="16" mode="4" />
+ <Patch name="60's DrawOrg 3" hbank="0" lbank="37" prog="16" mode="4" />
+ <Patch name="16+2&quot;2/3" hbank="0" lbank="40" prog="16" mode="4" />
+ <Patch name="Organ Bass" hbank="0" lbank="64" prog="16" mode="4" />
+ <Patch name="70's DrawOrg 2" hbank="0" lbank="65" prog="16" mode="4" />
+ <Patch name="Cheezy Organ" hbank="0" lbank="66" prog="16" mode="4" />
+ <Patch name="DrawOrg 3" hbank="0" lbank="67" prog="16" mode="4" />
+ <Patch name="Percussive Organ" hbank="0" lbank="0" prog="17" mode="5" />
+ <Patch name="70's Percussive Organ" hbank="0" lbank="24" prog="17" mode="4" />
+ <Patch name="Detuned Percussive Organ" hbank="0" lbank="32" prog="17" mode="4" />
+ <Patch name="Light Organ" hbank="0" lbank="33" prog="17" mode="4" />
+ <Patch name="Percussive Organ 2" hbank="0" lbank="37" prog="17" mode="4" />
+ <Patch name="Rock Organ" hbank="0" lbank="0" prog="18" mode="5" />
+ <Patch name="Rotary Organ" hbank="0" lbank="64" prog="18" mode="4" />
+ <Patch name="Slow Rotary" hbank="0" lbank="65" prog="18" mode="4" />
+ <Patch name="Fast Rotary" hbank="0" lbank="66" prog="18" mode="4" />
+ <Patch name="Church Organ" hbank="0" lbank="0" prog="19" mode="5" />
+ <Patch name="Church Organ 3" hbank="0" lbank="32" prog="19" mode="4" />
+ <Patch name="Church Organ 2" hbank="0" lbank="35" prog="19" mode="4" />
+ <Patch name="Notre Dame" hbank="0" lbank="40" prog="19" mode="4" />
+ <Patch name="Organ Flute" hbank="0" lbank="64" prog="19" mode="4" />
+ <Patch name="Tremolo Organ Flute" hbank="0" lbank="65" prog="19" mode="4" />
+ <Patch name="Reed Organ" hbank="0" lbank="0" prog="20" mode="5" />
+ <Patch name="Puff Organ" hbank="0" lbank="40" prog="20" mode="4" />
+ <Patch name="Accordion" hbank="0" lbank="0" prog="21" mode="5" />
+ <Patch name="Harmonica" hbank="0" lbank="0" prog="22" mode="5" />
+ <Patch name="Harmonica 2" hbank="0" lbank="32" prog="22" mode="4" />
+ <Patch name="Tango Accordion" hbank="0" lbank="0" prog="23" mode="5" />
+ <Patch name="Tango Accordion 2" hbank="0" lbank="64" prog="23" mode="4" />
+ </PatchGroup>
+ <PatchGroup name="Guitar (panel)">
+ <Patch name="Classical Guitar" hbank="0" lbank="112" prog="24" />
+ <Patch name="Folk Guitar" hbank="0" lbank="112" prog="25" />
+ <Patch name="12Strings Guitar" hbank="0" lbank="113" prog="25" />
+ <Patch name="Jazz Guitar" hbank="0" lbank="112" prog="26" />
+ <Patch name="Octave Guitar" hbank="0" lbank="113" prog="26" />
+ <Patch name="Clean Guitar" hbank="0" lbank="112" prog="27" />
+ <Patch name="60's Clean Guitar" hbank="0" lbank="117" prog="27" />
+ <Patch name="Muted Guitar" hbank="0" lbank="112" prog="28" />
+ <Patch name="Overdriven Guitar" hbank="0" lbank="112" prog="29" />
+ <Patch name="Distortion Guitar" hbank="0" lbank="112" prog="30" />
+ </PatchGroup>
+ <PatchGroup name="Guitar (XG)">
+ <Patch name="Nylon Guitar" hbank="0" lbank="0" prog="24" mode="5" />
+ <Patch name="Ukulele" hbank="0" lbank="96" prog="24" mode="4" />
+ <Patch name="Steel Guitar" hbank="0" lbank="0" prog="25" mode="5" />
+ <Patch name="12-string Guitar" hbank="0" lbank="35" prog="25" mode="4" />
+ <Patch name="Nylon &amp; Steel Guitar" hbank="0" lbank="40" prog="25" mode="4" />
+ <Patch name="Steel Guitar with Body Sound" hbank="0" lbank="41" prog="25" mode="4" />
+ <Patch name="Mandolin" hbank="0" lbank="96" prog="25" mode="4" />
+ <Patch name="Jazz Guitar" hbank="0" lbank="0" prog="26" mode="5" />
+ <Patch name="Jazz Amp" hbank="0" lbank="32" prog="26" mode="4" />
+ <Patch name="Clean Guitar" hbank="0" lbank="0" prog="27" mode="5" />
+ <Patch name="Chorus Guitar" hbank="0" lbank="32" prog="27" mode="4" />
+ <Patch name="Muted Guitar" hbank="0" lbank="0" prog="28" mode="5" />
+ <Patch name="Funk Guitar 1" hbank="0" lbank="40" prog="28" mode="4" />
+ <Patch name="Muted Steel Guitar" hbank="0" lbank="41" prog="28" mode="4" />
+ <Patch name="Jazz Man" hbank="0" lbank="45" prog="28" mode="4" />
+ <Patch name="Overdriven Guitar" hbank="0" lbank="0" prog="29" mode="5" />
+ <Patch name="Guitar Pinch" hbank="0" lbank="43" prog="29" mode="4" />
+ <Patch name="Distortion Guitar" hbank="0" lbank="0" prog="30" mode="5" />
+ <Patch name="Feedback Guitar" hbank="0" lbank="40" prog="30" mode="4" />
+ <Patch name="Feedback Guitar 2" hbank="0" lbank="41" prog="30" mode="4" />
+ <Patch name="Guitar Harmonics" hbank="0" lbank="0" prog="31" mode="5" />
+ <Patch name="Guitar Feedback" hbank="0" lbank="65" prog="31" mode="4" />
+ <Patch name="Guitar Harmonics 2" hbank="0" lbank="66" prog="31" mode="4" />
+ </PatchGroup>
+ <PatchGroup name="Bass (panel)">
+ <Patch name="Acoustic Bass" hbank="0" lbank="112" prog="32" />
+ <Patch name="Finger Bass" hbank="0" lbank="112" prog="33" />
+ <Patch name="Pick Bass" hbank="0" lbank="112" prog="34" />
+ <Patch name="Fretless Bass" hbank="0" lbank="112" prog="35" />
+ <Patch name="Slap Bass" hbank="0" lbank="112" prog="36" />
+ <Patch name="Synth Bass" hbank="0" lbank="112" prog="38" />
+ <Patch name="Hi-Q Bass" hbank="0" lbank="113" prog="38" />
+ <Patch name="Dance Bass" hbank="0" lbank="113" prog="39" />
+ </PatchGroup>
+ <PatchGroup name="Bass (XG)">
+ <Patch name="Acoustic Bass" hbank="0" lbank="0" prog="32" mode="5" />
+ <Patch name="Jazz Rhythm" hbank="0" lbank="40" prog="32" mode="4" />
+ <Patch name="Velocity Crossfade Upright Bass" hbank="0" lbank="45" prog="32" mode="4" />
+ <Patch name="Finger Bass" hbank="0" lbank="0" prog="33" mode="5" />
+ <Patch name="Finger Dark" hbank="0" lbank="18" prog="33" mode="4" />
+ <Patch name="Bass &amp; Distorted Electric Guitar" hbank="0" lbank="40" prog="33" mode="4" />
+ <Patch name="Finger Slap Bass" hbank="0" lbank="43" prog="33" mode="4" />
+ <Patch name="Finger Bass 2" hbank="0" lbank="45" prog="33" mode="4" />
+ <Patch name="Modulated Bass" hbank="0" lbank="65" prog="33" mode="4" />
+ <Patch name="Pick Bass" hbank="0" lbank="0" prog="34" mode="5" />
+ <Patch name="Muted Pick Bass" hbank="0" lbank="28" prog="34" mode="4" />
+ <Patch name="Fretless Bass" hbank="0" lbank="0" prog="35" mode="5" />
+ <Patch name="Fretless Bass 2" hbank="0" lbank="32" prog="35" mode="4" />
+ <Patch name="Fretless Bass 3" hbank="0" lbank="33" prog="35" mode="4" />
+ <Patch name="Fretless Bass 4" hbank="0" lbank="34" prog="35" mode="4" />
+ <Patch name="Slap Bass 1" hbank="0" lbank="0" prog="36" mode="5" />
+ <Patch name="Punch Thumb Bass" hbank="0" lbank="32" prog="36" mode="4" />
+ <Patch name="Slap Bass 2" hbank="0" lbank="0" prog="37" mode="5" />
+ <Patch name="Velocity Switch Slap" hbank="0" lbank="43" prog="37" mode="4" />
+ <Patch name="Synth Bass 1" hbank="0" lbank="0" prog="38" mode="5" />
+ <Patch name="Techno Synth Bass" hbank="0" lbank="40" prog="38" mode="4" />
+ <Patch name="Synth Bass 2" hbank="0" lbank="0" prog="39" mode="5" />
+ <Patch name="Mellow Synth Bass" hbank="0" lbank="6" prog="39" mode="4" />
+ <Patch name="Sequenced Bass" hbank="0" lbank="12" prog="39" mode="4" />
+ <Patch name="Click Synth Bass" hbank="0" lbank="18" prog="39" mode="4" />
+ <Patch name="Synth Bass 2 Dark" hbank="0" lbank="19" prog="39" mode="4" />
+ <Patch name="Modular Synth Bass" hbank="0" lbank="40" prog="39" mode="4" />
+ <Patch name="DX Bass" hbank="0" lbank="41" prog="39" mode="4" />
+ </PatchGroup>
+ <PatchGroup name="Strings (panel)">
+ <Patch name="Violin" hbank="0" lbank="112" prog="40" />
+ <Patch name="Cello" hbank="0" lbank="112" prog="42" />
+ <Patch name="Contrabass" hbank="0" lbank="112" prog="43" />
+ <Patch name="Tremolo Strings" hbank="0" lbank="112" prog="44" />
+ <Patch name="Pizzicato Strings" hbank="0" lbank="112" prog="45" />
+ <Patch name="Harp" hbank="0" lbank="112" prog="46" />
+ <Patch name="String Ensemble" hbank="0" lbank="112" prog="48" />
+ <Patch name="Chamber Strings" hbank="0" lbank="112" prog="49" />
+ <Patch name="Slow Strings" hbank="0" lbank="113" prog="49" />
+ <Patch name="Synth Strings" hbank="0" lbank="112" prog="50" />
+ <Patch name="Orchestra Hit" hbank="0" lbank="112" prog="55" />
+ <Patch name="Banjo" hbank="0" lbank="112" prog="105" />
+ </PatchGroup>
+ <PatchGroup name="Choir (panel)">
+ <Patch name="Choir" hbank="0" lbank="112" prog="52" />
+ <Patch name="Vocal Ensemble" hbank="0" lbank="113" prog="52" />
+ <Patch name="Vox Humana" hbank="0" lbank="112" prog="53" />
+ <Patch name="Air Choir" hbank="0" lbank="112" prog="54" />
+ </PatchGroup>
+ <PatchGroup name="String (XG)">
+ <Patch name="Violin" hbank="0" lbank="0" prog="40" mode="5" />
+ <Patch name="Slow Violin" hbank="0" lbank="8" prog="40" mode="4" />
+ <Patch name="Viola" hbank="0" lbank="0" prog="41" mode="5" />
+ <Patch name="Cello" hbank="0" lbank="0" prog="42" mode="5" />
+ <Patch name="Contrabass" hbank="0" lbank="0" prog="43" mode="5" />
+ <Patch name="Tremolo Strings" hbank="0" lbank="0" prog="44" mode="5" />
+ <Patch name="Slow Tremolo Strings" hbank="0" lbank="8" prog="44" mode="4" />
+ <Patch name="Suspense Strings" hbank="0" lbank="40" prog="44" mode="4" />
+ <Patch name="Pizzicato Strings" hbank="0" lbank="0" prog="45" mode="5" />
+ <Patch name="Orchestral Harp" hbank="0" lbank="0" prog="46" mode="5" />
+ <Patch name="Yang Chin" hbank="0" lbank="40" prog="46" mode="4" />
+ <Patch name="Timpani" hbank="0" lbank="0" prog="47" mode="5" />
+ </PatchGroup>
+ <PatchGroup name="Ensemble (XG)">
+ <Patch name="Strings 1" hbank="0" lbank="0" prog="48" mode="5" />
+ <Patch name="Stereo Strings" hbank="0" lbank="3" prog="48" mode="4" />
+ <Patch name="Slow Strings" hbank="0" lbank="8" prog="48" mode="4" />
+ <Patch name="60's Strings" hbank="0" lbank="35" prog="48" mode="4" />
+ <Patch name="Orchestra" hbank="0" lbank="40" prog="48" mode="4" />
+ <Patch name="Orchestra 2" hbank="0" lbank="41" prog="48" mode="4" />
+ <Patch name="Tremolo Orchestra" hbank="0" lbank="42" prog="48" mode="4" />
+ <Patch name="Velocity Strings" hbank="0" lbank="45" prog="48" mode="4" />
+ <Patch name="Strings 2" hbank="0" lbank="0" prog="49" mode="5" />
+ <Patch name="Slow Stereo Strings" hbank="0" lbank="3" prog="49" mode="4" />
+ <Patch name="Legato Strings" hbank="0" lbank="8" prog="49" mode="4" />
+ <Patch name="Warm Strings" hbank="0" lbank="40" prog="49" mode="4" />
+ <Patch name="Kingdom" hbank="0" lbank="41" prog="49" mode="4" />
+ <Patch name="Synth Strings 1" hbank="0" lbank="0" prog="50" mode="5" />
+ <Patch name="Synth Strings 2" hbank="0" lbank="0" prog="51" mode="5" />
+ <Patch name="Choir Aahs" hbank="0" lbank="0" prog="52" mode="5" />
+ <Patch name="Stereo Choir" hbank="0" lbank="3" prog="52" mode="4" />
+ <Patch name="Mellow Choir" hbank="0" lbank="32" prog="52" mode="4" />
+ <Patch name="Choir Strings" hbank="0" lbank="40" prog="52" mode="4" />
+ <Patch name="Voice Oohs" hbank="0" lbank="0" prog="53" mode="5" />
+ <Patch name="Synth Voice" hbank="0" lbank="0" prog="54" mode="5" />
+ <Patch name="Synth Voice 2" hbank="0" lbank="40" prog="54" mode="4" />
+ <Patch name="Choral" hbank="0" lbank="41" prog="54" mode="4" />
+ <Patch name="Analog Voice" hbank="0" lbank="64" prog="54" mode="4" />
+ <Patch name="Orchestra Hit" hbank="0" lbank="0" prog="55" mode="5" />
+ <Patch name="Orchestra Hit 2" hbank="0" lbank="35" prog="55" mode="4" />
+ <Patch name="Impact" hbank="0" lbank="64" prog="55" mode="4" />
+ </PatchGroup>
+ <PatchGroup name="Saxophone (panel)">
+ <Patch name="Soprano Sax" hbank="0" lbank="112" prog="64" />
+ <Patch name="Alto Sax" hbank="0" lbank="112" prog="65" />
+ <Patch name="Tenor Sax" hbank="0" lbank="112" prog="66" />
+ <Patch name="Breathy Tenor" hbank="0" lbank="114" prog="66" />
+ <Patch name="Baritone Sax" hbank="0" lbank="112" prog="67" />
+ <Patch name="Oboe" hbank="0" lbank="112" prog="68" />
+ <Patch name="English Horn" hbank="0" lbank="112" prog="69" />
+ <Patch name="Bassoon" hbank="0" lbank="112" prog="70" />
+ <Patch name="Clarinet" hbank="0" lbank="112" prog="71" />
+ </PatchGroup>
+ <PatchGroup name="Trumpet (panel)">
+ <Patch name="Trumpet" hbank="0" lbank="112" prog="56" />
+ <Patch name="Trombone" hbank="0" lbank="112" prog="57" />
+ <Patch name="Trombone Section" hbank="0" lbank="113" prog="57" />
+ <Patch name="Tuba" hbank="0" lbank="112" prog="58" />
+ <Patch name="Muted Trumpet" hbank="0" lbank="112" prog="59" />
+ <Patch name="French Horn" hbank="0" lbank="112" prog="60" />
+ </PatchGroup>
+ <PatchGroup name="Brass (panel)">
+ <Patch name="Brass Section" hbank="0" lbank="112" prog="61" />
+ <Patch name="Big Band Brass" hbank="0" lbank="113" prog="61" />
+ <Patch name="Mellow Horns" hbank="0" lbank="119" prog="61" />
+ <Patch name="Synth Brass" hbank="0" lbank="112" prog="62" />
+ <Patch name="Jump Brass" hbank="0" lbank="113" prog="62" />
+ <Patch name="Techno Brass" hbank="0" lbank="114" prog="62" />
+ </PatchGroup>
+ <PatchGroup name="Brass (XG)">
+ <Patch name="Trumpet" hbank="0" lbank="0" prog="56" mode="5" />
+ <Patch name="Warm Trumpet" hbank="0" lbank="32" prog="56" mode="4" />
+ <Patch name="Trombone" hbank="0" lbank="0" prog="57" mode="5" />
+ <Patch name="Trombone 2" hbank="0" lbank="18" prog="57" mode="4" />
+ <Patch name="Tuba" hbank="0" lbank="0" prog="58" mode="5" />
+ <Patch name="Muted Trumpet" hbank="0" lbank="0" prog="59" mode="5" />
+ <Patch name="French Horn" hbank="0" lbank="0" prog="60" mode="5" />
+ <Patch name="French Horn Solo" hbank="0" lbank="6" prog="60" mode="4" />
+ <Patch name="French Horn 2" hbank="0" lbank="32" prog="60" mode="4" />
+ <Patch name="Horn Orchestra" hbank="0" lbank="37" prog="60" mode="4" />
+ <Patch name="Brass Section" hbank="0" lbank="0" prog="61" mode="5" />
+ <Patch name="Trumpet &amp; Trombone Section" hbank="0" lbank="35" prog="61" mode="4" />
+ <Patch name="Synth Brass 1" hbank="0" lbank="0" prog="62" mode="5" />
+ <Patch name="Resonant Synth Brass" hbank="0" lbank="20" prog="62" mode="4" />
+ <Patch name="Synth Brass 2" hbank="0" lbank="0" prog="63" mode="5" />
+ <Patch name="Soft Brass" hbank="0" lbank="18" prog="63" mode="4" />
+ <Patch name="Choir Brass" hbank="0" lbank="41" prog="63" mode="4" />
+ </PatchGroup>
+ <PatchGroup name="Reed (XG)">
+ <Patch name="Soprano Sax" hbank="0" lbank="0" prog="64" mode="5" />
+ <Patch name="Alto Sax" hbank="0" lbank="0" prog="65" mode="5" />
+ <Patch name="Sax Section" hbank="0" lbank="40" prog="65" mode="4" />
+ <Patch name="Tenor Sax" hbank="0" lbank="0" prog="66" mode="5" />
+ <Patch name="Breathy Tenor Sax" hbank="0" lbank="40" prog="66" mode="4" />
+ <Patch name="Baritone Sax" hbank="0" lbank="0" prog="67" mode="5" />
+ <Patch name="Oboe" hbank="0" lbank="0" prog="68" mode="5" />
+ <Patch name="English Horn" hbank="0" lbank="0" prog="69" mode="5" />
+ <Patch name="Bassoon" hbank="0" lbank="0" prog="70" mode="5" />
+ <Patch name="Clarinet" hbank="0" lbank="0" prog="71" mode="5" />
+ </PatchGroup>
+ <PatchGroup name="Flute (panel)">
+ <Patch name="Piccolo" hbank="0" lbank="112" prog="72" />
+ <Patch name="Flute" hbank="0" lbank="112" prog="73" />
+ <Patch name="Recorder" hbank="0" lbank="112" prog="74" />
+ <Patch name="Pan Flute" hbank="0" lbank="112" prog="75" />
+ <Patch name="Ocarina" hbank="0" lbank="112" prog="79" />
+ </PatchGroup>
+ <PatchGroup name="Pipe (XG)">
+ <Patch name="Piccolo" hbank="0" lbank="0" prog="72" mode="5" />
+ <Patch name="Flute" hbank="0" lbank="0" prog="73" mode="5" />
+ <Patch name="Recorder" hbank="0" lbank="0" prog="74" mode="5" />
+ <Patch name="Pan Flute" hbank="0" lbank="0" prog="75" mode="5" />
+ <Patch name="Blown Bottle" hbank="0" lbank="0" prog="76" mode="5" />
+ <Patch name="Shakuhachi" hbank="0" lbank="0" prog="77" mode="5" />
+ <Patch name="Whistle" hbank="0" lbank="0" prog="78" mode="5" />
+ <Patch name="Ocarina" hbank="0" lbank="0" prog="79" mode="5" />
+ </PatchGroup>
+ <PatchGroup name="Synth Lead (panel)">
+ <Patch name="Square Lead" hbank="0" lbank="112" prog="80" />
+ <Patch name="Sawtooth Lead" hbank="0" lbank="112" prog="81" />
+ <Patch name="Analogon" hbank="0" lbank="115" prog="81" />
+ <Patch name="Fargo" hbank="0" lbank="119" prog="81" />
+ <Patch name="Voice Lead" hbank="0" lbank="112" prog="85" />
+ <Patch name="Star Dust" hbank="0" lbank="112" prog="98" />
+ <Patch name="Brightness" hbank="0" lbank="112" prog="100" />
+ </PatchGroup>
+ <PatchGroup name="Synth Lead (XG)">
+ <Patch name="Square Lead" hbank="0" lbank="0" prog="80" mode="5" />
+ <Patch name="Square Lead 2" hbank="0" lbank="6" prog="80" mode="4" />
+ <Patch name="LM Square" hbank="0" lbank="8" prog="80" mode="4" />
+ <Patch name="Hollow" hbank="0" lbank="18" prog="80" mode="4" />
+ <Patch name="Shroud" hbank="0" lbank="19" prog="80" mode="4" />
+ <Patch name="Mellow" hbank="0" lbank="64" prog="80" mode="4" />
+ <Patch name="Solo Sine" hbank="0" lbank="65" prog="80" mode="4" />
+ <Patch name="Sine Lead" hbank="0" lbank="66" prog="80" mode="4" />
+ <Patch name="Sawtooth Lead" hbank="0" lbank="0" prog="81" mode="5" />
+ <Patch name="Sawtooth Lead 2" hbank="0" lbank="6" prog="81" mode="4" />
+ <Patch name="Thick Sawtooth" hbank="0" lbank="8" prog="81" mode="4" />
+ <Patch name="Dynamic Sawtooth" hbank="0" lbank="18" prog="81" mode="4" />
+ <Patch name="Digital Sawtooth" hbank="0" lbank="19" prog="81" mode="4" />
+ <Patch name="Big Lead" hbank="0" lbank="20" prog="81" mode="4" />
+ <Patch name="Sequenced Analog" hbank="0" lbank="96" prog="81" mode="4" />
+ <Patch name="Calliope Lead" hbank="0" lbank="0" prog="82" mode="5" />
+ <Patch name="Pure Lead" hbank="0" lbank="65" prog="82" mode="4" />
+ <Patch name="Chiff Lead" hbank="0" lbank="0" prog="83" mode="5" />
+ <Patch name="Charang Lead" hbank="0" lbank="0" prog="84" mode="5" />
+ <Patch name="Distorted Lead" hbank="0" lbank="64" prog="84" mode="4" />
+ <Patch name="Voice Lead" hbank="0" lbank="0" prog="85" mode="5" />
+ <Patch name="Fifths Lead" hbank="0" lbank="0" prog="86" mode="5" />
+ <Patch name="Big Five" hbank="0" lbank="35" prog="86" mode="4" />
+ <Patch name="Bass &amp; Lead" hbank="0" lbank="0" prog="87" mode="5" />
+ <Patch name="Big &amp; Low" hbank="0" lbank="16" prog="87" mode="4" />
+ <Patch name="Fat &amp; Perky" hbank="0" lbank="64" prog="87" mode="4" />
+ <Patch name="Soft Whirl" hbank="0" lbank="65" prog="87" mode="4" />
+ </PatchGroup>
+ <PatchGroup name="Synth Pad (panel)">
+ <Patch name="Fantasia" hbank="0" lbank="112" prog="88" />
+ <Patch name="Dark Moon" hbank="0" lbank="113" prog="89" />
+ <Patch name="Xenon Pad" hbank="0" lbank="112" prog="91" />
+ <Patch name="Equinox" hbank="0" lbank="112" prog="94" />
+ <Patch name="Bell Pad" hbank="0" lbank="113" prog="100" />
+ </PatchGroup>
+ <PatchGroup name="Synth Pad (XG)">
+ <Patch name="New Age Pad" hbank="0" lbank="0" prog="88" mode="5" />
+ <Patch name="Fantasy" hbank="0" lbank="64" prog="88" mode="4" />
+ <Patch name="Warm Pad" hbank="0" lbank="0" prog="89" mode="5" />
+ <Patch name="Poly Synth Pad" hbank="0" lbank="0" prog="90" mode="5" />
+ <Patch name="Choir Pad" hbank="0" lbank="0" prog="91" mode="5" />
+ <Patch name="Itopia" hbank="0" lbank="66" prog="91" mode="4" />
+ <Patch name="Bowed Pad" hbank="0" lbank="0" prog="92" mode="5" />
+ <Patch name="Metallic Pad" hbank="0" lbank="0" prog="93" mode="5" />
+ <Patch name="Halo Pad" hbank="0" lbank="0" prog="94" mode="5" />
+ <Patch name="Sweep Pad" hbank="0" lbank="0" prog="95" mode="5" />
+ </PatchGroup>
+ <PatchGroup name="Synth Effects (XG)">
+ <Patch name="Rain" hbank="0" lbank="0" prog="96" mode="5" />
+ <Patch name="African Wind" hbank="0" lbank="65" prog="96" mode="4" />
+ <Patch name="Carib" hbank="0" lbank="66" prog="96" mode="4" />
+ <Patch name="Sound Track" hbank="0" lbank="0" prog="97" mode="5" />
+ <Patch name="Prologue" hbank="0" lbank="27" prog="97" mode="4" />
+ <Patch name="Crystal" hbank="0" lbank="0" prog="98" mode="5" />
+ <Patch name="Synth Drum Comp" hbank="0" lbank="12" prog="98" mode="4" />
+ <Patch name="Popcorn" hbank="0" lbank="14" prog="98" mode="4" />
+ <Patch name="Tiny Bells" hbank="0" lbank="18" prog="98" mode="4" />
+ <Patch name="Round Glockenspiel" hbank="0" lbank="35" prog="98" mode="4" />
+ <Patch name="Glockenspiel Chimes" hbank="0" lbank="40" prog="98" mode="4" />
+ <Patch name="Clear Bells" hbank="0" lbank="41" prog="98" mode="4" />
+ <Patch name="Chorus Bells" hbank="0" lbank="42" prog="98" mode="4" />
+ <Patch name="Soft Crystal" hbank="0" lbank="65" prog="98" mode="4" />
+ <Patch name="Air Bells" hbank="0" lbank="70" prog="98" mode="4" />
+ <Patch name="Bell Harp" hbank="0" lbank="71" prog="98" mode="4" />
+ <Patch name="Gamelimba" hbank="0" lbank="72" prog="98" mode="4" />
+ <Patch name="Atmosphere" hbank="0" lbank="0" prog="99" mode="5" />
+ <Patch name="Warm Atmosphere" hbank="0" lbank="18" prog="99" mode="4" />
+ <Patch name="Hollow Release" hbank="0" lbank="19" prog="99" mode="4" />
+ <Patch name="Nylon Electric Piano" hbank="0" lbank="40" prog="99" mode="4" />
+ <Patch name="Nylon Harp" hbank="0" lbank="64" prog="99" mode="4" />
+ <Patch name="Harp Vox" hbank="0" lbank="65" prog="99" mode="4" />
+ <Patch name="Atmosphere Pad" hbank="0" lbank="66" prog="99" mode="4" />
+ <Patch name="Brightness" hbank="0" lbank="0" prog="100" mode="5" />
+ <Patch name="Goblins" hbank="0" lbank="0" prog="101" mode="5" />
+ <Patch name="Goblins Synth" hbank="0" lbank="64" prog="101" mode="4" />
+ <Patch name="Creeper" hbank="0" lbank="65" prog="101" mode="4" />
+ <Patch name="Ritual" hbank="0" lbank="67" prog="101" mode="4" />
+ <Patch name="To Heaven" hbank="0" lbank="68" prog="101" mode="4" />
+ <Patch name="Night" hbank="0" lbank="70" prog="101" mode="4" />
+ <Patch name="Glisten" hbank="0" lbank="71" prog="101" mode="4" />
+ <Patch name="Bell Choir" hbank="0" lbank="96" prog="101" mode="4" />
+ <Patch name="Echoes" hbank="0" lbank="0" prog="102" mode="5" />
+ <Patch name="Sci-Fi" hbank="0" lbank="0" prog="103" mode="5" />
+ </PatchGroup>
+ <PatchGroup name="World (XG)">
+ <Patch name="Sitar" hbank="0" lbank="0" prog="104" mode="5" />
+ <Patch name="Detuned Sitar" hbank="0" lbank="32" prog="104" mode="4" />
+ <Patch name="Sitar 2" hbank="0" lbank="35" prog="104" mode="4" />
+ <Patch name="Tamboura" hbank="0" lbank="97" prog="104" mode="4" />
+ <Patch name="Banjo" hbank="0" lbank="0" prog="105" mode="5" />
+ <Patch name="Muted Banjo" hbank="0" lbank="28" prog="105" mode="4" />
+ <Patch name="Rabab" hbank="0" lbank="96" prog="105" mode="4" />
+ <Patch name="Gopichant" hbank="0" lbank="97" prog="105" mode="4" />
+ <Patch name="Oud" hbank="0" lbank="98" prog="105" mode="4" />
+ <Patch name="Shamisen" hbank="0" lbank="0" prog="106" mode="5" />
+ <Patch name="Koto" hbank="0" lbank="0" prog="107" mode="5" />
+ <Patch name="Taisho-kin" hbank="0" lbank="96" prog="107" mode="4" />
+ <Patch name="Kanoon" hbank="0" lbank="97" prog="107" mode="4" />
+ <Patch name="Kalimba" hbank="0" lbank="0" prog="108" mode="5" />
+ <Patch name="Bagpipe" hbank="0" lbank="0" prog="109" mode="5" />
+ <Patch name="Fiddle" hbank="0" lbank="0" prog="110" mode="5" />
+ <Patch name="Shanai" hbank="0" lbank="0" prog="111" mode="5" />
+ </PatchGroup>
+ <PatchGroup name="Percussion (panel)">
+ <Patch name="Celesta" hbank="0" lbank="112" prog="8" />
+ <Patch name="Music Box" hbank="0" lbank="112" prog="10" />
+ <Patch name="Vibraphone" hbank="0" lbank="112" prog="11" />
+ <Patch name="Marimba" hbank="0" lbank="112" prog="12" />
+ <Patch name="Xylophone" hbank="0" lbank="112" prog="13" />
+ <Patch name="Tubular Bells" hbank="0" lbank="112" prog="14" />
+ <Patch name="Timpani" hbank="0" lbank="112" prog="47" />
+ <Patch name="Steel Drums" hbank="0" lbank="112" prog="114" />
+ </PatchGroup>
+ <PatchGroup name="Chromatic (XG)">
+ <Patch name="Celesta" hbank="0" lbank="0" prog="8" mode="5" />
+ <Patch name="Glockenspiel" hbank="0" lbank="0" prog="9" mode="5" />
+ <Patch name="Music Box" hbank="0" lbank="0" prog="10" mode="5" />
+ <Patch name="Orgel" hbank="0" lbank="64" prog="10" mode="4" />
+ <Patch name="Vibraphone" hbank="0" lbank="0" prog="11" mode="5" />
+ <Patch name="Vibraphone KSP" hbank="0" lbank="1" prog="11" mode="4" />
+ <Patch name="Marimba" hbank="0" lbank="0" prog="12" mode="5" />
+ <Patch name="Marimba KSP" hbank="0" lbank="1" prog="12" mode="4" />
+ <Patch name="Sine Marimba" hbank="0" lbank="64" prog="12" mode="4" />
+ <Patch name="Balimba" hbank="0" lbank="97" prog="12" mode="4" />
+ <Patch name="Log Drums" hbank="0" lbank="98" prog="12" mode="4" />
+ <Patch name="Xylophone" hbank="0" lbank="0" prog="13" mode="5" />
+ <Patch name="Tubular Bells" hbank="0" lbank="0" prog="14" mode="5" />
+ <Patch name="Church Bells" hbank="0" lbank="96" prog="14" mode="4" />
+ <Patch name="Carillon" hbank="0" lbank="97" prog="14" mode="4" />
+ <Patch name="Dulcimer" hbank="0" lbank="0" prog="15" mode="5" />
+ <Patch name="Dulcimer 2" hbank="0" lbank="35" prog="15" mode="4" />
+ <Patch name="Cimbalom" hbank="0" lbank="96" prog="15" mode="4" />
+ <Patch name="Santur" hbank="0" lbank="97" prog="15" mode="4" />
+ </PatchGroup>
+ <PatchGroup name="Percussive (XG)">
+ <Patch name="Tinkle Bell" hbank="0" lbank="0" prog="112" mode="5" />
+ <Patch name="Bonang" hbank="0" lbank="96" prog="112" mode="4" />
+ <Patch name="Altair" hbank="0" lbank="97" prog="112" mode="4" />
+ <Patch name="Gamelan Gongs" hbank="0" lbank="98" prog="112" mode="4" />
+ <Patch name="Stereo Gamelan Gongs" hbank="0" lbank="99" prog="112" mode="4" />
+ <Patch name="Rama Cymbal" hbank="0" lbank="100" prog="112" mode="4" />
+ <Patch name="Agogo" hbank="0" lbank="0" prog="113" mode="5" />
+ <Patch name="Steel Drums" hbank="0" lbank="0" prog="114" mode="5" />
+ <Patch name="Glass Percussion" hbank="0" lbank="97" prog="114" mode="4" />
+ <Patch name="Thai Bells" hbank="0" lbank="98" prog="114" mode="4" />
+ <Patch name="Woodblock" hbank="0" lbank="0" prog="115" mode="5" />
+ <Patch name="Castanets" hbank="0" lbank="96" prog="115" mode="4" />
+ <Patch name="Taiko Drum" hbank="0" lbank="0" prog="116" mode="5" />
+ <Patch name="Gran Cassa" hbank="0" lbank="96" prog="116" mode="4" />
+ <Patch name="Melodic Tom" hbank="0" lbank="0" prog="117" mode="5" />
+ <Patch name="Melodic Tom 2" hbank="0" lbank="64" prog="117" mode="4" />
+ <Patch name="Real Tom" hbank="0" lbank="65" prog="117" mode="4" />
+ <Patch name="Rock Tom" hbank="0" lbank="66" prog="117" mode="4" />
+ <Patch name="Synth Drum" hbank="0" lbank="0" prog="118" mode="5" />
+ <Patch name="Analog Tom" hbank="0" lbank="64" prog="118" mode="4" />
+ <Patch name="Electronic Percussion" hbank="0" lbank="65" prog="118" mode="4" />
+ <Patch name="Reverse Cymbal" hbank="0" lbank="0" prog="119" mode="5" />
+ </PatchGroup>
+ <PatchGroup name="Sound Effects (XG)">
+ <Patch name="Fret Noise" hbank="0" lbank="0" prog="120" mode="5" />
+ <Patch name="Breath Noise" hbank="0" lbank="0" prog="121" mode="5" />
+ <Patch name="Seashore" hbank="0" lbank="0" prog="122" mode="5" />
+ <Patch name="Bird Tweet" hbank="0" lbank="0" prog="123" mode="5" />
+ <Patch name="Telephone Ring" hbank="0" lbank="0" prog="124" mode="5" />
+ <Patch name="Helicopter" hbank="0" lbank="0" prog="125" mode="5" />
+ <Patch name="Applause" hbank="0" lbank="0" prog="126" mode="5" />
+ <Patch name="Gunshot" hbank="0" lbank="0" prog="127" mode="5" />
+ <Patch name="Cutting Noise" hbank="64" lbank="0" prog="0" mode="4" />
+ <Patch name="Cutting Noise 2" hbank="64" lbank="0" prog="1" mode="4" />
+ <Patch name="String Slap" hbank="64" lbank="0" prog="3" mode="4" />
+ <Patch name="Flute Key Click" hbank="64" lbank="0" prog="16" mode="4" />
+ <Patch name="Shower" hbank="64" lbank="0" prog="32" mode="4" />
+ <Patch name="Thunder" hbank="64" lbank="0" prog="33" mode="4" />
+ <Patch name="Wind" hbank="64" lbank="0" prog="34" mode="4" />
+ <Patch name="Steam" hbank="64" lbank="0" prog="35" mode="4" />
+ <Patch name="Bubble" hbank="64" lbank="0" prog="36" mode="4" />
+ <Patch name="Feed" hbank="64" lbank="0" prog="37" mode="4" />
+ <Patch name="Dog" hbank="64" lbank="0" prog="48" mode="4" />
+ <Patch name="Horse" hbank="64" lbank="0" prog="49" mode="4" />
+ <Patch name="Bird Tweet 2" hbank="64" lbank="0" prog="50" mode="4" />
+ <Patch name="Maou" hbank="64" lbank="0" prog="55" mode="4" />
+ <Patch name="Phone Call" hbank="64" lbank="0" prog="64" mode="4" />
+ <Patch name="Door Squeak" hbank="64" lbank="0" prog="65" mode="4" />
+ <Patch name="Door Slam" hbank="64" lbank="0" prog="66" mode="4" />
+ <Patch name="Scratch Cut" hbank="64" lbank="0" prog="67" mode="4" />
+ <Patch name="Scratch Split" hbank="64" lbank="0" prog="68" mode="4" />
+ <Patch name="Wind Chime" hbank="64" lbank="0" prog="69" mode="4" />
+ <Patch name="Telephone Ring 2" hbank="64" lbank="0" prog="70" mode="4" />
+ <Patch name="Car Engine Ignition" hbank="64" lbank="0" prog="80" mode="4" />
+ <Patch name="Car Tires Squeak" hbank="64" lbank="0" prog="81" mode="4" />
+ <Patch name="Car Passing" hbank="64" lbank="0" prog="82" mode="4" />
+ <Patch name="Car Crash" hbank="64" lbank="0" prog="83" mode="4" />
+ <Patch name="Siren" hbank="64" lbank="0" prog="84" mode="4" />
+ <Patch name="Train" hbank="64" lbank="0" prog="85" mode="4" />
+ <Patch name="Jet Plane" hbank="64" lbank="0" prog="86" mode="4" />
+ <Patch name="Starship" hbank="64" lbank="0" prog="87" mode="4" />
+ <Patch name="Burst" hbank="64" lbank="0" prog="88" mode="4" />
+ <Patch name="Roller Coaster" hbank="64" lbank="0" prog="89" mode="4" />
+ <Patch name="Submarine" hbank="64" lbank="0" prog="90" mode="4" />
+ <Patch name="Laugh" hbank="64" lbank="0" prog="96" mode="4" />
+ <Patch name="Scream" hbank="64" lbank="0" prog="97" mode="4" />
+ <Patch name="Punch" hbank="64" lbank="0" prog="98" mode="4" />
+ <Patch name="Heartbeat" hbank="64" lbank="0" prog="99" mode="4" />
+ <Patch name="Footsteps" hbank="64" lbank="0" prog="100" mode="4" />
+ <Patch name="Machine Gun" hbank="64" lbank="0" prog="112" mode="4" />
+ <Patch name="Laser Gun" hbank="64" lbank="0" prog="113" mode="4" />
+ <Patch name="Explosion" hbank="64" lbank="0" prog="114" mode="4" />
+ <Patch name="Firework" hbank="64" lbank="0" prog="115" mode="4" />
+ </PatchGroup>
+ <PatchGroup name="Drums">
+ <Patch name="Standard Kit 1" hbank="127" lbank="0" prog="0" mode="5"
+ drums="1" />
+ <Patch name="Standard Kit 2" hbank="127" lbank="0" prog="1" mode="4"
+ drums="1" />
+ <Patch name="Room Kit" hbank="127" lbank="0" prog="8" mode="4"
+ drums="1" />
+ <Patch name="Rock Kit" hbank="127" lbank="0" prog="16" mode="4"
+ drums="1" />
+ <Patch name="Electronic Kit" hbank="127" lbank="0" prog="24" mode="4"
+ drums="1" />
+ <Patch name="Analog Kit" hbank="127" lbank="0" prog="25" mode="4"
+ drums="1" />
+ <Patch name="Dance Kit" hbank="127" lbank="0" prog="27" mode="4"
+ drums="1" />
+ <Patch name="Jazz Kit" hbank="127" lbank="0" prog="32" mode="4"
+ drums="1" />
+ <Patch name="Brush Kit" hbank="127" lbank="0" prog="40" mode="4"
+ drums="1" />
+ <Patch name="Symphony Kit" hbank="127" lbank="0" prog="48" mode="4"
+ drums="1" />
+ </PatchGroup>
+ <PatchGroup name="SFX">
+ <Patch name="SFX Kit 1" hbank="126" lbank="0" prog="0" mode="4"
+ drums="1" />
+ <Patch name="SFX Kit 2" hbank="126" lbank="0" prog="1" mode="4"
+ drums="1" />
+ </PatchGroup>
+
+ <Controller name="Pitch" type="Pitch" />
+ <Controller name="Program" type="Program" />
+
+ <Controller name="Modulation" type="Control" l="1" />
+ <Controller name="MainVolume" type="Control" l="7" init="100" />
+ <Controller name="Pan" type="Control" l="10" init="64" />
+ <Controller name="Expression" type="Control" l="11" init="100" />
+ <Controller name="Sustain" type="Control" l="64" />
+ <Controller name="ReleaseTime" type="Control" l="72" init="64"/>
+ <Controller name="AttackTime" type="Control" l="73" init="64"/>
+ <Controller name="Brightness" type="Control" l="74" init="64"/>
+ <Controller name="PortamentoControl" type="Control" l="84" />
+ <Controller name="ReverbSendLevel" type="Control" l="91" init="0" />
+ <Controller name="ChorusSendLevel" type="Control" l="93" init="0" />
+
+ <Controller name="AllSoundsOff" type="Control" l="120" />
+ <Controller name="ResetAllController" type="Control" l="121" />
+ <Controller name="AllNotesOff" type="Control" l="123" />
+
+ </MidiInstrument>
+</muse>
diff --git a/muse/share/instruments/Yamaha-PSR530.idf b/muse/share/instruments/Yamaha-PSR530.idf
new file mode 100644
index 00000000..b413a143
--- /dev/null
+++ b/muse/share/instruments/Yamaha-PSR530.idf
@@ -0,0 +1,759 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Yamaha PSR 530">
+ <Init>
+ </Init>
+ <PatchGroup name="Piano(1-18)">
+ <Patch name="1: Grand Piano" hbank="0" lbank="112" prog="0"/>
+ <Patch name="2: BrightPiano" hbank="0" lbank="112" prog="1"/>
+ <Patch name="3: Honky Tonk" hbank="0" lbank="112" prog="3"/>
+ <Patch name="4: Midi Grand" hbank="0" lbank="112" prog="2"/>
+ <Patch name="5: CP 80" hbank="0" lbank="113" prog="2"/>
+ <Patch name="6: Galaxy EP" hbank="0" lbank="114" prog="4"/>
+ <Patch name="7: DX Modern" hbank="0" lbank="112" prog="5"/>
+ <Patch name="8: Funk EP" hbank="0" lbank="112" prog="4"/>
+ <Patch name="9: Modern EP" hbank="0" lbank="115" prog="5"/>
+ <Patch name="10: Hyper Tines" hbank="0" lbank="113" prog="5"/>
+ <Patch name="11: New Tines" hbank="0" lbank="116" prog="5"/>
+ <Patch name="12: Venus EP" hbank="0" lbank="114" prog="5"/>
+ <Patch name="13: Tremolo EP" hbank="0" lbank="113" prog="4"/>
+ <Patch name="14: Rock Piano" hbank="0" lbank="114" prog="2"/>
+ <Patch name="15: Clavi" hbank="0" lbank="112" prog="7"/>
+ <Patch name="16: Wah Clavi" hbank="0" lbank="113" prog="7"/>
+ <Patch name="17: Harpsichord" hbank="0" lbank="112" prog="6"/>
+ <Patch name="18: GrandHarpsi" hbank="0" lbank="113" prog="6"/>
+ </PatchGroup>
+ <PatchGroup name="Chromatic Percussion(19-30)">
+ <Patch name="19: Vibraphone" hbank="0" lbank="112" prog="11"/>
+ <Patch name="20: Jazz Vibes" hbank="0" lbank="113" prog="11"/>
+ <Patch name="21: Marimba" hbank="0" lbank="112" prog="12"/>
+ <Patch name="22: Xylophone" hbank="0" lbank="112" prog="13"/>
+ <Patch name="23: Steel Drums" hbank="0" lbank="112" prog="114"/>
+ <Patch name="24: Celesta" hbank="0" lbank="112" prog="8"/>
+ <Patch name="25: Glocken" hbank="0" lbank="112" prog="9"/>
+ <Patch name="26: Music Box" hbank="0" lbank="112" prog="10"/>
+ <Patch name="27: TubularBells" hbank="0" lbank="112" prog="14"/>
+ <Patch name="28: Kalimba" hbank="0" lbank="112" prog="108"/>
+ <Patch name="29: Timpani" hbank="0" lbank="112" prog="47"/>
+ <Patch name="30: Dulcimer" hbank="0" lbank="112" prog="15"/>
+ </PatchGroup>
+ <PatchGroup name="Organ(31-57)">
+ <Patch name="31: Jazz Organ1" hbank="0" lbank="112" prog="16"/>
+ <Patch name="32: Jazz Organ2" hbank="0" lbank="113" prog="16"/>
+ <Patch name="33: Click Organ" hbank="0" lbank="112" prog="17"/>
+ <Patch name="34: Dance Organ" hbank="0" lbank="113" prog="17"/>
+ <Patch name="35: Drawbar Org" hbank="0" lbank="115" prog="16"/>
+ <Patch name="36: Mellow Draw" hbank="0" lbank="115" prog="17"/>
+ <Patch name="37: Bright Draw" hbank="0" lbank="116" prog="16"/>
+ <Patch name="38: Rock Organ1" hbank="0" lbank="112" prog="18"/>
+ <Patch name="39: Rock Organ2" hbank="0" lbank="113" prog="18"/>
+ <Patch name="40: Purple Org" hbank="0" lbank="114" prog="18"/>
+ <Patch name="41: 60rs Organ" hbank="0" lbank="116" prog="17"/>
+ <Patch name="42: Blues Organ" hbank="0" lbank="117" prog="17"/>
+ <Patch name="43: 16+1 Organ" hbank="0" lbank="117" prog="16"/>
+ <Patch name="44: 16+2 Organ" hbank="0" lbank="118" prog="16"/>
+ <Patch name="45: 16+4 Organ" hbank="0" lbank="119" prog="16"/>
+ <Patch name="46: Elec.Organ" hbank="0" lbank="118" prog="17"/>
+ <Patch name="48: TheatreOrg2" hbank="0" lbank="114" prog="17"/>
+ <Patch name="49: Pipe Organ" hbank="0" lbank="112" prog="19"/>
+ <Patch name="50: ChapelOrgan" hbank="0" lbank="113" prog="19"/>
+ <Patch name="51: Reed Organ" hbank="0" lbank="112" prog="20"/>
+ <Patch name="52: Trad. Accrd" hbank="0" lbank="113" prog="21"/>
+ <Patch name="53: Musette" hbank="0" lbank="112" prog="21"/>
+ <Patch name="54: Tango Accrd" hbank="0" lbank="112" prog="23"/>
+ <Patch name="55: Bandoneon" hbank="0" lbank="113" prog="23"/>
+ <Patch name="56: Soft Accrd" hbank="0" lbank="114" prog="21"/>
+ <Patch name="57: Harmonica" hbank="0" lbank="112" prog="22"/>
+ </PatchGroup>
+ <PatchGroup name="Guitar(58-73)">
+ <Patch name="58: Classic Gtr" hbank="0" lbank="112" prog="24"/>
+ <Patch name="59: Spanish Gtr" hbank="0" lbank="113" prog="24"/>
+ <Patch name="60: Folk Guitar" hbank="0" lbank="112" prog="25"/>
+ <Patch name="61: 12StrGuitar" hbank="0" lbank="113" prog="25"/>
+ <Patch name="62: Jazz Guitar" hbank="0" lbank="112" prog="26"/>
+ <Patch name="63: Octave Gtr" hbank="0" lbank="113" prog="26"/>
+ <Patch name="64: HawaiianGtr" hbank="0" lbank="114" prog="26"/>
+ <Patch name="65: CleanGuitar" hbank="0" lbank="112" prog="27"/>
+ <Patch name="66: Tremolo Gtr" hbank="0" lbank="113" prog="27"/>
+ <Patch name="67: Slap Guitar" hbank="0" lbank="114" prog="27"/>
+ <Patch name="68: Funk Guitar" hbank="0" lbank="113" prog="28"/>
+ <Patch name="69: MutedGuitar" hbank="0" lbank="112" prog="28"/>
+ <Patch name="70: FeedbackGtr" hbank="0" lbank="113" prog="29"/>
+ <Patch name="71: Overdrive" hbank="0" lbank="112" prog="29"/>
+ <Patch name="72: Distortion" hbank="0" lbank="112" prog="30"/>
+ <Patch name="73: PedalSteel" hbank="0" lbank="115" prog="27"/>
+ </PatchGroup>
+ <PatchGroup name="Bass(74-88)">
+ <Patch name="74: Aco.Bass" hbank="0" lbank="112" prog="32"/>
+ <Patch name="75: Bass&amp;Cymbal" hbank="0" lbank="114" prog="32"/>
+ <Patch name="76: FingerBass" hbank="0" lbank="112" prog="33"/>
+ <Patch name="77: Pick Bass" hbank="0" lbank="112" prog="34"/>
+ <Patch name="78: Fretless" hbank="0" lbank="112" prog="35"/>
+ <Patch name="79: Jaco Bass" hbank="0" lbank="113" prog="35"/>
+ <Patch name="80: Organ Bass" hbank="0" lbank="119" prog="17"/>
+ <Patch name="81: Slap Bass" hbank="0" lbank="112" prog="36"/>
+ <Patch name="82: Funk Bass" hbank="0" lbank="112" prog="37"/>
+ <Patch name="83: Fusion Bass" hbank="0" lbank="113" prog="36"/>
+ <Patch name="84: Synth Bass" hbank="0" lbank="112" prog="38"/>
+ <Patch name="85: Analog Bass" hbank="0" lbank="112" prog="39"/>
+ <Patch name="86: Dance Bass" hbank="0" lbank="113" prog="39"/>
+ <Patch name="87: Hi Q Bass" hbank="0" lbank="113" prog="38"/>
+ <Patch name="88: Rave Bass" hbank="0" lbank="114" prog="38"/>
+ </PatchGroup>
+ <PatchGroup name="Solo Strings(89-100)">
+ <Patch name="89: Solo Violin" hbank="0" lbank="112" prog="40"/>
+ <Patch name="90: Soft Violin" hbank="0" lbank="113" prog="40"/>
+ <Patch name="91: Fiddle" hbank="0" lbank="112" prog="110"/>
+ <Patch name="92: Viola" hbank="0" lbank="112" prog="41"/>
+ <Patch name="93: Cello" hbank="0" lbank="112" prog="42"/>
+ <Patch name="94: Contrabass" hbank="0" lbank="112" prog="43"/>
+ <Patch name="95: Harp" hbank="0" lbank="112" prog="46"/>
+ <Patch name="96: Hackbrett" hbank="0" lbank="113" prog="46"/>
+ <Patch name="97: Shamisen" hbank="0" lbank="112" prog="106"/>
+ <Patch name="98: Koto" hbank="0" lbank="112" prog="107"/>
+ <Patch name="99: Sitar" hbank="0" lbank="112" prog="104"/>
+ <Patch name="100: Banjo" hbank="0" lbank="112" prog="105"/>
+ </PatchGroup>
+ <PatchGroup name="Ensemble(101-118)">
+ <Patch name="101: Strings" hbank="0" lbank="112" prog="48"/>
+ <Patch name="102: OrchStrings" hbank="0" lbank="113" prog="48"/>
+ <Patch name="103: Symphon. Str" hbank="0" lbank="114" prog="48"/>
+ <Patch name="104: SlowStrings" hbank="0" lbank="113" prog="49"/>
+ <Patch name="105: Str.Quartet" hbank="0" lbank="114" prog="49"/>
+ <Patch name="106: ConcertoStr" hbank="0" lbank="115" prog="48"/>
+ <Patch name="107: MarcatoStrs" hbank="0" lbank="115" prog="49"/>
+ <Patch name="108: ChamberStrs" hbank="0" lbank="112" prog="49"/>
+ <Patch name="109: TremoloStrs" hbank="0" lbank="112" prog="44"/>
+ <Patch name="110: PizzStrings" hbank="0" lbank="112" prog="45"/>
+ <Patch name="111: Syn Strings" hbank="0" lbank="112" prog="50"/>
+ <Patch name="112: Analog Strs" hbank="0" lbank="112" prog="51"/>
+ <Patch name="113: Choir" hbank="0" lbank="112" prog="52"/>
+ <Patch name="114: Air Choir" hbank="0" lbank="112" prog="54"/>
+ <Patch name="115: Vocal Ensbl" hbank="0" lbank="113" prog="52"/>
+ <Patch name="116: Vox Humana" hbank="0" lbank="112" prog="53"/>
+ <Patch name="117: Gothic Vox" hbank="0" lbank="113" prog="53"/>
+ <Patch name="118: Orch.Hit" hbank="0" lbank="112" prog="55"/>
+ </PatchGroup>
+ <PatchGroup name="Solo Brass(119-126)">
+ <Patch name="119: SoloTrumpet" hbank="0" lbank="112" prog="56"/>
+ <Patch name="120: SoftTrumpet" hbank="0" lbank="114" prog="56"/>
+ <Patch name="121: Flugel Horn" hbank="0" lbank="113" prog="56"/>
+ <Patch name="122: Muted Trp" hbank="0" lbank="112" prog="59"/>
+ <Patch name="123: Trombone" hbank="0" lbank="112" prog="57"/>
+ <Patch name="124: MelTrombone" hbank="0" lbank="114" prog="57"/>
+ <Patch name="125: French Horn" hbank="0" lbank="112" prog="60"/>
+ <Patch name="126: Tuba" hbank="0" lbank="112" prog="58"/>
+ </PatchGroup>
+ <PatchGroup name="Brass Ensemble(127-140)">
+ <Patch name="127: BigBandBrs" hbank="0" lbank="113" prog="61"/>
+ <Patch name="128: BrasSection" hbank="0" lbank="112" prog="61"/>
+ <Patch name="129: MellowBrass" hbank="0" lbank="116" prog="61"/>
+ <Patch name="130: Small Brass" hbank="0" lbank="117" prog="61"/>
+ <Patch name="131: Pop Brass" hbank="0" lbank="118" prog="61"/>
+ <Patch name="132: MellowHorns" hbank="0" lbank="119" prog="61"/>
+ <Patch name="133: BallroomBrs" hbank="0" lbank="113" prog="59"/>
+ <Patch name="134: Full Horns" hbank="0" lbank="114" prog="61"/>
+ <Patch name="135: High Brass" hbank="0" lbank="115" prog="61"/>
+ <Patch name="136: Trb.Section" hbank="0" lbank="113" prog="57"/>
+ <Patch name="137: Synth Brass" hbank="0" lbank="112" prog="62"/>
+ <Patch name="138: Analog Brs" hbank="0" lbank="112" prog="63"/>
+ <Patch name="139: Jump Brass" hbank="0" lbank="113" prog="62"/>
+ <Patch name="140: TechnoBrass" hbank="0" lbank="114" prog="62"/>
+ </PatchGroup>
+ <PatchGroup name="Reed(141-155)">
+ <Patch name="141: Soprano Sax" hbank="0" lbank="112" prog="64"/>
+ <Patch name="142: Alto Sax" hbank="0" lbank="112" prog="65"/>
+ <Patch name="143: BreathyAlto" hbank="0" lbank="113" prog="65"/>
+ <Patch name="144: Tenor Sax" hbank="0" lbank="112" prog="66"/>
+ <Patch name="145: BreathTenor" hbank="0" lbank="114" prog="66"/>
+ <Patch name="146: BaritoneSax" hbank="0" lbank="112" prog="67"/>
+ <Patch name="147: Sax Section" hbank="0" lbank="116" prog="66"/>
+ <Patch name="148: Clarinet" hbank="0" lbank="112" prog="71"/>
+ <Patch name="149: MelClarinet" hbank="0" lbank="113" prog="71"/>
+ <Patch name="150: WoodwindEns" hbank="0" lbank="113" prog="66"/>
+ <Patch name="151: Brass Combo" hbank="0" lbank="115" prog="66"/>
+ <Patch name="152: Oboe" hbank="0" lbank="112" prog="68"/>
+ <Patch name="153: EnglishHorn" hbank="0" lbank="112" prog="69"/>
+ <Patch name="154: Bassoon" hbank="0" lbank="112" prog="70"/>
+ <Patch name="155: Bagpipe" hbank="0" lbank="112" prog="109"/>
+ </PatchGroup>
+ <PatchGroup name="Pipe(156-163)">
+ <Patch name="156: Flute" hbank="0" lbank="112" prog="73"/>
+ <Patch name="157: Pan Flute" hbank="0" lbank="112" prog="75"/>
+ <Patch name="158: Piccolo" hbank="0" lbank="112" prog="72"/>
+ <Patch name="159: EthnicFlute" hbank="0" lbank="113" prog="73"/>
+ <Patch name="160: Shakuhachi" hbank="0" lbank="112" prog="77"/>
+ <Patch name="161: Whistle" hbank="0" lbank="112" prog="78"/>
+ <Patch name="162: Recorder" hbank="0" lbank="112" prog="74"/>
+ <Patch name="163: Ocarina" hbank="0" lbank="112" prog="79"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Lead(164-181)">
+ <Patch name="164: Square Lead" hbank="0" lbank="112" prog="80"/>
+ <Patch name="165: Saw.Lead" hbank="0" lbank="112" prog="81"/>
+ <Patch name="166: Big Lead" hbank="0" lbank="113" prog="81"/>
+ <Patch name="167: Stardust" hbank="0" lbank="112" prog="98"/>
+ <Patch name="168: Blaster" hbank="0" lbank="114" prog="81"/>
+ <Patch name="169: Analogon" hbank="0" lbank="115" prog="81"/>
+ <Patch name="170: Vintage Ld" hbank="0" lbank="113" prog="80"/>
+ <Patch name="171: Sun Bell" hbank="0" lbank="113" prog="98"/>
+ <Patch name="172: Aero Lead" hbank="0" lbank="112" prog="83"/>
+ <Patch name="173: Fire Wire" hbank="0" lbank="116" prog="81"/>
+ <Patch name="174: Mini Lead" hbank="0" lbank="114" prog="80"/>
+ <Patch name="175: Vinylead" hbank="0" lbank="115" prog="80"/>
+ <Patch name="176: Warp" hbank="0" lbank="117" prog="81"/>
+ <Patch name="177: Hi Bias" hbank="0" lbank="116" prog="80"/>
+ <Patch name="178: Meta Wood" hbank="0" lbank="117" prog="80"/>
+ <Patch name="179: Tiny Lead" hbank="0" lbank="118" prog="80"/>
+ <Patch name="180: Sub Aqua" hbank="0" lbank="118" prog="81"/>
+ <Patch name="181: Fargo" hbank="0" lbank="119" prog="81"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Pad(182-200)">
+ <Patch name="182: Insomnia" hbank="0" lbank="113" prog="94"/>
+ <Patch name="183: Krypton" hbank="0" lbank="112" prog="90"/>
+ <Patch name="184: Cyber Pad" hbank="0" lbank="113" prog="99"/>
+ <Patch name="185: Wave 2001" hbank="0" lbank="112" prog="95"/>
+ <Patch name="186: Equinox" hbank="0" lbank="112" prog="94"/>
+ <Patch name="187: Stargate" hbank="0" lbank="114" prog="88"/>
+ <Patch name="188: DX Pad" hbank="0" lbank="112" prog="92"/>
+ <Patch name="189: Loch Ness" hbank="0" lbank="112" prog="93"/>
+ <Patch name="190: Fantasia" hbank="0" lbank="112" prog="88"/>
+ <Patch name="191: Golden Age" hbank="0" lbank="115" prog="88"/>
+ <Patch name="192: Xenon Pad" hbank="0" lbank="112" prog="91"/>
+ <Patch name="193: Area 51" hbank="0" lbank="112" prog="89"/>
+ <Patch name="194: Atmosphere" hbank="0" lbank="112" prog="99"/>
+ <Patch name="195: Dark Moon" hbank="0" lbank="113" prog="89"/>
+ <Patch name="196: Ionosphere" hbank="0" lbank="115" prog="94"/>
+ <Patch name="197: Phase IV" hbank="0" lbank="113" prog="93"/>
+ <Patch name="198: Symbiont" hbank="0" lbank="113" prog="88"/>
+ <Patch name="199: Solaris" hbank="0" lbank="114" prog="94"/>
+ <Patch name="200: Transform" hbank="0" lbank="113" prog="95"/>
+ </PatchGroup>
+ <PatchGroup name="Drum Kits(201-212)">
+ <Patch name="201: Std.Kit1" hbank="127" lbank="0" prog="0"/>
+ <Patch name="202: Std.Kit2" hbank="127" lbank="0" prog="1"/>
+ <Patch name="203: Room Kit" hbank="127" lbank="0" prog="8"/>
+ <Patch name="204: Rock Kit" hbank="127" lbank="0" prog="16"/>
+ <Patch name="205: Electro Kit" hbank="127" lbank="0" prog="24"/>
+ <Patch name="206: Analog Kit" hbank="127" lbank="0" prog="25"/>
+ <Patch name="207: Dance Kit" hbank="127" lbank="0" prog="27"/>
+ <Patch name="208: Jazz Kit" hbank="127" lbank="0" prog="32"/>
+ <Patch name="209: Brush Kit" hbank="127" lbank="0" prog="40"/>
+ <Patch name="210: Classic Kit" hbank="127" lbank="0" prog="48"/>
+ <Patch name="211: SFX Kit1" hbank="126" lbank="0" prog="0"/>
+ <Patch name="212: SFX Kit2" hbank="126" lbank="0" prog="1"/>
+ </PatchGroup>
+ <PatchGroup name="XG Pianos(213-251)">
+ <Patch name="213: GrandPno" hbank="0" lbank="0" prog="0"/>
+ <Patch name="214: GrndPnoK" hbank="0" lbank="1" prog="0"/>
+ <Patch name="215: MelloGrP" hbank="0" lbank="18" prog="0"/>
+ <Patch name="216: PianoStr" hbank="0" lbank="40" prog="0"/>
+ <Patch name="217: Dream" hbank="0" lbank="41" prog="0"/>
+ <Patch name="218: BritePno" hbank="0" lbank="0" prog="1"/>
+ <Patch name="219: BritPnoK" hbank="0" lbank="1" prog="1"/>
+ <Patch name="220: E.Grand" hbank="0" lbank="0" prog="2"/>
+ <Patch name="221: ElGrPnoK" hbank="0" lbank="1" prog="2"/>
+ <Patch name="222: Det.CP80" hbank="0" lbank="32" prog="2"/>
+ <Patch name="223: ElGrPno1" hbank="0" lbank="40" prog="2"/>
+ <Patch name="224: ElGrPno2" hbank="0" lbank="41" prog="2"/>
+ <Patch name="225: HnkyTonk" hbank="0" lbank="0" prog="3"/>
+ <Patch name="226: HnkyTnkK" hbank="0" lbank="1" prog="3"/>
+ <Patch name="227: E.Piano1" hbank="0" lbank="0" prog="4"/>
+ <Patch name="228: El.Pno1K" hbank="0" lbank="1" prog="4"/>
+ <Patch name="229: MelloEP1" hbank="0" lbank="18" prog="4"/>
+ <Patch name="230: Chor.EP1" hbank="0" lbank="32" prog="4"/>
+ <Patch name="231: HardEl.P" hbank="0" lbank="40" prog="4"/>
+ <Patch name="232: VX El.P1" hbank="0" lbank="45" prog="4"/>
+ <Patch name="233: 60sEl.P" hbank="0" lbank="64" prog="4"/>
+ <Patch name="234: E.Piano2" hbank="0" lbank="0" prog="5"/>
+ <Patch name="235: El.Pno2K" hbank="0" lbank="1" prog="5"/>
+ <Patch name="236: Chor.EP2" hbank="0" lbank="32" prog="5"/>
+ <Patch name="237: DX Hard" hbank="0" lbank="33" prog="5"/>
+ <Patch name="238: DXLegend" hbank="0" lbank="34" prog="5"/>
+ <Patch name="239: DX Phase" hbank="0" lbank="40" prog="5"/>
+ <Patch name="240: DX+Analg" hbank="0" lbank="41" prog="5"/>
+ <Patch name="241: DXKotoEP" hbank="0" lbank="42" prog="5"/>
+ <Patch name="242: VX El.P2" hbank="0" lbank="45" prog="5"/>
+ <Patch name="243: Harpsi." hbank="0" lbank="0" prog="6"/>
+ <Patch name="244: Harpsi.K" hbank="0" lbank="1" prog="6"/>
+ <Patch name="245: Harpsi.2" hbank="0" lbank="25" prog="6"/>
+ <Patch name="246: Harpsi.3" hbank="0" lbank="35" prog="6"/>
+ <Patch name="247: Clavi." hbank="0" lbank="0" prog="7"/>
+ <Patch name="248: Clavi. K" hbank="0" lbank="1" prog="7"/>
+ <Patch name="249: ClaviWah" hbank="0" lbank="27" prog="7"/>
+ <Patch name="250: PulseClv" hbank="0" lbank="64" prog="7"/>
+ <Patch name="251: PierceCl" hbank="0" lbank="65" prog="7"/>
+ </PatchGroup>
+ <PatchGroup name="Chromatic Percussion(252-271)">
+ <Patch name="252: Celesta" hbank="0" lbank="0" prog="8"/>
+ <Patch name="253: Glocken" hbank="0" lbank="0" prog="9"/>
+ <Patch name="254: MusicBox" hbank="0" lbank="0" prog="10"/>
+ <Patch name="255: Orgel" hbank="0" lbank="64" prog="10"/>
+ <Patch name="256: Vibes" hbank="0" lbank="0" prog="11"/>
+ <Patch name="257: VibesK" hbank="0" lbank="1" prog="11"/>
+ <Patch name="258: HardVibe" hbank="0" lbank="45" prog="11"/>
+ <Patch name="259: Marimba" hbank="0" lbank="0" prog="12"/>
+ <Patch name="260: MarimbaK" hbank="0" lbank="1" prog="12"/>
+ <Patch name="261: SineMrmb" hbank="0" lbank="64" prog="12"/>
+ <Patch name="262: Balafon2" hbank="0" lbank="97" prog="12"/>
+ <Patch name="263: Log Drum" hbank="0" lbank="98" prog="12"/>
+ <Patch name="264: Xylophon" hbank="0" lbank="0" prog="13"/>
+ <Patch name="265: TubulBel" hbank="0" lbank="0" prog="14"/>
+ <Patch name="266: ChrchBel" hbank="0" lbank="96" prog="14"/>
+ <Patch name="267: Carillon" hbank="0" lbank="97" prog="14"/>
+ <Patch name="268: Dulcimer" hbank="0" lbank="0" prog="15"/>
+ <Patch name="269: Dulcimr2" hbank="0" lbank="35" prog="15"/>
+ <Patch name="270: Cimbalom" hbank="0" lbank="96" prog="15"/>
+ <Patch name="271: Santur" hbank="0" lbank="97" prog="15"/>
+ </PatchGroup>
+ <PatchGroup name="Organ(272-307)">
+ <Patch name="272: DrawOrgn" hbank="0" lbank="0" prog="16"/>
+ <Patch name="274: 60sDrOr1" hbank="0" lbank="33" prog="16"/>
+ <Patch name="275: 60sDrOr2" hbank="0" lbank="34" prog="16"/>
+ <Patch name="276: 70sDrOr1" hbank="0" lbank="35" prog="16"/>
+ <Patch name="277: DrawOrg2" hbank="0" lbank="36" prog="16"/>
+ <Patch name="278: 60sDrOr3" hbank="0" lbank="37" prog="16"/>
+ <Patch name="279: EvenBar" hbank="0" lbank="38" prog="16"/>
+ <Patch name="280: 16+2B2/3" hbank="0" lbank="40" prog="16"/>
+ <Patch name="281: Organ Ba" hbank="0" lbank="64" prog="16"/>
+ <Patch name="282: 70sDrOr2" hbank="0" lbank="65" prog="16"/>
+ <Patch name="283: CheezOrg" hbank="0" lbank="66" prog="16"/>
+ <Patch name="284: DrawOrg3" hbank="0" lbank="67" prog="16"/>
+ <Patch name="285: PercOrgn" hbank="0" lbank="0" prog="17"/>
+ <Patch name="286: 70sPcOr1" hbank="0" lbank="24" prog="17"/>
+ <Patch name="287: DetPrcOr" hbank="0" lbank="32" prog="17"/>
+ <Patch name="288: LiteOrg" hbank="0" lbank="33" prog="17"/>
+ <Patch name="289: PercOrg2" hbank="0" lbank="37" prog="17"/>
+ <Patch name="290: RockOrgn" hbank="0" lbank="0" prog="18"/>
+ <Patch name="291: RotaryOr" hbank="0" lbank="64" prog="18"/>
+ <Patch name="292: SloRotar" hbank="0" lbank="65" prog="18"/>
+ <Patch name="293: FstRotar" hbank="0" lbank="66" prog="18"/>
+ <Patch name="294: ChrchOrg" hbank="0" lbank="0" prog="19"/>
+ <Patch name="295: ChurOrg3" hbank="0" lbank="32" prog="19"/>
+ <Patch name="296: ChurOrg2" hbank="0" lbank="35" prog="19"/>
+ <Patch name="297: NotreDam" hbank="0" lbank="40" prog="19"/>
+ <Patch name="298: OrgFlute" hbank="0" lbank="64" prog="19"/>
+ <Patch name="299: TrmOrgFl" hbank="0" lbank="65" prog="19"/>
+ <Patch name="300: ReedOrgn" hbank="0" lbank="0" prog="20"/>
+ <Patch name="301: Puff Org" hbank="0" lbank="40" prog="20"/>
+ <Patch name="302: Acordion" hbank="0" lbank="0" prog="21"/>
+ <Patch name="303: AccordIt" hbank="0" lbank="32" prog="21"/>
+ <Patch name="304: Harmnica" hbank="0" lbank="0" prog="22"/>
+ <Patch name="305: Harmo 2" hbank="0" lbank="32" prog="22"/>
+ <Patch name="306: TangoAcd" hbank="0" lbank="0" prog="23"/>
+ <Patch name="307: TngoAcd2" hbank="0" lbank="64" prog="23"/>
+ </PatchGroup>
+ <PatchGroup name="Guitar(308-336)">
+ <Patch name="308: NylonGtr" hbank="0" lbank="0" prog="24"/>
+ <Patch name="309: NylonGt2" hbank="0" lbank="16" prog="24"/>
+ <Patch name="310: NylonGt3" hbank="0" lbank="25" prog="24"/>
+ <Patch name="311: VelGtHrm" hbank="0" lbank="43" prog="24"/>
+ <Patch name="312: Ukulele" hbank="0" lbank="96" prog="24"/>
+ <Patch name="313: SteelGtr" hbank="0" lbank="0" prog="25"/>
+ <Patch name="314: SteelGt2" hbank="0" lbank="16" prog="25"/>
+ <Patch name="315: 12StrGtr" hbank="0" lbank="35" prog="25"/>
+ <Patch name="316: Nyln&amp;Stl" hbank="0" lbank="40" prog="25"/>
+ <Patch name="317: Stl&amp;Body" hbank="0" lbank="41" prog="25"/>
+ <Patch name="318: Mandolin" hbank="0" lbank="96" prog="25"/>
+ <Patch name="319: Jazz Gtr" hbank="0" lbank="0" prog="26"/>
+ <Patch name="320: MelloGtr" hbank="0" lbank="18" prog="26"/>
+ <Patch name="321: JazzAmp" hbank="0" lbank="32" prog="26"/>
+ <Patch name="322: CleanGtr" hbank="0" lbank="0" prog="27"/>
+ <Patch name="323: ChorusGt" hbank="0" lbank="32" prog="27"/>
+ <Patch name="324: Mute.Gtr" hbank="0" lbank="0" prog="28"/>
+ <Patch name="325: FunkGtr1" hbank="0" lbank="40" prog="28"/>
+ <Patch name="326: MuteStlG" hbank="0" lbank="41" prog="28"/>
+ <Patch name="327: FunkGtr2" hbank="0" lbank="43" prog="28"/>
+ <Patch name="328: Jazz Man" hbank="0" lbank="45" prog="28"/>
+ <Patch name="329: Ovrdrive" hbank="0" lbank="0" prog="29"/>
+ <Patch name="330: Gt.Pinch" hbank="0" lbank="43" prog="29"/>
+ <Patch name="331: Dist.Gtr" hbank="0" lbank="0" prog="30"/>
+ <Patch name="332: FeedbkGt" hbank="0" lbank="40" prog="30"/>
+ <Patch name="333: FeedbGt2" hbank="0" lbank="41" prog="30"/>
+ <Patch name="334: GtrHarmo" hbank="0" lbank="0" prog="31"/>
+ <Patch name="336: GtrHrmo2" hbank="0" lbank="66" prog="31"/>
+ </PatchGroup>
+ <PatchGroup name="Bass(337-378)">
+ <Patch name="337: Aco.Bass" hbank="0" lbank="0" prog="32"/>
+ <Patch name="338: JazzRthm" hbank="0" lbank="40" prog="32"/>
+ <Patch name="339: VXUprght" hbank="0" lbank="45" prog="32"/>
+ <Patch name="340: FngrBass" hbank="0" lbank="0" prog="33"/>
+ <Patch name="341: FingrDrk" hbank="0" lbank="18" prog="33"/>
+ <Patch name="342: FlangeBa" hbank="0" lbank="27" prog="33"/>
+ <Patch name="343: Ba&amp;DstEG" hbank="0" lbank="40" prog="33"/>
+ <Patch name="344: FngrSlap" hbank="0" lbank="43" prog="33"/>
+ <Patch name="345: FngBass2" hbank="0" lbank="45" prog="33"/>
+ <Patch name="346: ModAlem" hbank="0" lbank="65" prog="33"/>
+ <Patch name="347: PickBass" hbank="0" lbank="0" prog="34"/>
+ <Patch name="348: MutePkBa" hbank="0" lbank="28" prog="34"/>
+ <Patch name="349: Fretless" hbank="0" lbank="0" prog="35"/>
+ <Patch name="350: Fretles2" hbank="0" lbank="32" prog="35"/>
+ <Patch name="351: Fretles3" hbank="0" lbank="33" prog="35"/>
+ <Patch name="352: Fretles4" hbank="0" lbank="34" prog="35"/>
+ <Patch name="353: SynFretl" hbank="0" lbank="96" prog="35"/>
+ <Patch name="354: Smooth" hbank="0" lbank="97" prog="35"/>
+ <Patch name="355: SlapBas1" hbank="0" lbank="0" prog="36"/>
+ <Patch name="356: ResoSlap" hbank="0" lbank="27" prog="36"/>
+ <Patch name="357: PunchThm" hbank="0" lbank="32" prog="36"/>
+ <Patch name="358: SlapBas2" hbank="0" lbank="0" prog="37"/>
+ <Patch name="359: VeloSlap" hbank="0" lbank="43" prog="37"/>
+ <Patch name="360: SynBass1" hbank="0" lbank="0" prog="38"/>
+ <Patch name="361: SynBa1Dk" hbank="0" lbank="18" prog="38"/>
+ <Patch name="362: FastResB" hbank="0" lbank="20" prog="38"/>
+ <Patch name="363: AcidBass" hbank="0" lbank="24" prog="38"/>
+ <Patch name="364: Clv Bass" hbank="0" lbank="35" prog="38"/>
+ <Patch name="365: TeknoBa" hbank="0" lbank="40" prog="38"/>
+ <Patch name="366: Oscar" hbank="0" lbank="64" prog="38"/>
+ <Patch name="367: SqrBass" hbank="0" lbank="65" prog="38"/>
+ <Patch name="368: RubberBa" hbank="0" lbank="66" prog="38"/>
+ <Patch name="369: Hammer" hbank="0" lbank="96" prog="38"/>
+ <Patch name="370: SynBass2" hbank="0" lbank="0" prog="39"/>
+ <Patch name="371: MelloSB1" hbank="0" lbank="6" prog="39"/>
+ <Patch name="372: Seq Bass" hbank="0" lbank="12" prog="39"/>
+ <Patch name="373: ClkSynBa" hbank="0" lbank="18" prog="39"/>
+ <Patch name="374: SynBa2Dk" hbank="0" lbank="19" prog="39"/>
+ <Patch name="375: SmthBa 2" hbank="0" lbank="32" prog="39"/>
+ <Patch name="376: ModulrBa" hbank="0" lbank="40" prog="39"/>
+ <Patch name="377: DX Bass" hbank="0" lbank="41" prog="39"/>
+ <Patch name="378: X WireBa" hbank="0" lbank="64" prog="39"/>
+ </PatchGroup>
+ <PatchGroup name="Strings(379-390)">
+ <Patch name="379: Violin" hbank="0" lbank="0" prog="40"/>
+ <Patch name="380: SlowVln" hbank="0" lbank="8" prog="40"/>
+ <Patch name="381: Viola" hbank="0" lbank="0" prog="41"/>
+ <Patch name="382: Cello" hbank="0" lbank="0" prog="42"/>
+ <Patch name="383: Contrabs" hbank="0" lbank="0" prog="43"/>
+ <Patch name="384: Trem.Str" hbank="0" lbank="0" prog="44"/>
+ <Patch name="385: SlowTrStr" hbank="0" lbank="8" prog="44"/>
+ <Patch name="386: Susp Str" hbank="0" lbank="40" prog="44"/>
+ <Patch name="387: Pizz.Str" hbank="0" lbank="0" prog="45"/>
+ <Patch name="388: Harp" hbank="0" lbank="0" prog="46"/>
+ <Patch name="389: YangChin" hbank="0" lbank="40" prog="46"/>
+ <Patch name="390: Timpani" hbank="0" lbank="0" prog="47"/>
+ </PatchGroup>
+ <PatchGroup name="Ensemble(391-424)">
+ <Patch name="391: Strings1" hbank="0" lbank="0" prog="48"/>
+ <Patch name="392: S.Strngs" hbank="0" lbank="3" prog="48"/>
+ <Patch name="393: SlowStr" hbank="0" lbank="8" prog="48"/>
+ <Patch name="394: ArcoStr" hbank="0" lbank="24" prog="48"/>
+ <Patch name="395: 60sStrng" hbank="0" lbank="35" prog="48"/>
+ <Patch name="396: Orchestr" hbank="0" lbank="40" prog="48"/>
+ <Patch name="397: Orchstr2" hbank="0" lbank="41" prog="48"/>
+ <Patch name="398: TremOrch" hbank="0" lbank="42" prog="48"/>
+ <Patch name="399: VeloStr" hbank="0" lbank="45" prog="48"/>
+ <Patch name="400: Strings2" hbank="0" lbank="0" prog="49"/>
+ <Patch name="401: S.SlwStr" hbank="0" lbank="3" prog="49"/>
+ <Patch name="402: LegatoSt" hbank="0" lbank="8" prog="49"/>
+ <Patch name="403: Warm Str" hbank="0" lbank="40" prog="49"/>
+ <Patch name="404: Kingdom" hbank="0" lbank="41" prog="49"/>
+ <Patch name="405: 70s Str" hbank="0" lbank="64" prog="49"/>
+ <Patch name="406: Str Ens3" hbank="0" lbank="65" prog="49"/>
+ <Patch name="407: Syn.Str1" hbank="0" lbank="0" prog="50"/>
+ <Patch name="408: ResoStr" hbank="0" lbank="27" prog="50"/>
+ <Patch name="409: Syn Str4" hbank="0" lbank="64" prog="50"/>
+ <Patch name="410: SS Str" hbank="0" lbank="65" prog="50"/>
+ <Patch name="411: Syn.Str2" hbank="0" lbank="0" prog="51"/>
+ <Patch name="412: ChoirAah" hbank="0" lbank="0" prog="52"/>
+ <Patch name="413: S.Choir" hbank="0" lbank="3" prog="52"/>
+ <Patch name="414: Ch.Aahs2" hbank="0" lbank="16" prog="52"/>
+ <Patch name="415: MelChoir" hbank="0" lbank="32" prog="52"/>
+ <Patch name="416: ChoirStr" hbank="0" lbank="40" prog="52"/>
+ <Patch name="417: VoiceOoh" hbank="0" lbank="0" prog="53"/>
+ <Patch name="418: SynVoice" hbank="0" lbank="0" prog="54"/>
+ <Patch name="419: SynVox2" hbank="0" lbank="40" prog="54"/>
+ <Patch name="420: Choral" hbank="0" lbank="41" prog="54"/>
+ <Patch name="421: AnaVoice" hbank="0" lbank="64" prog="54"/>
+ <Patch name="422: Orch.Hit" hbank="0" lbank="0" prog="55"/>
+ <Patch name="423: OrchHit2" hbank="0" lbank="35" prog="55"/>
+ <Patch name="424: Impact" hbank="0" lbank="64" prog="55"/>
+ </PatchGroup>
+ <PatchGroup name="Brass(425-469)">
+ <Patch name="425: Trumpet" hbank="0" lbank="0" prog="56"/>
+ <Patch name="426: Trumpet2" hbank="0" lbank="16" prog="56"/>
+ <Patch name="427: BriteTrp" hbank="0" lbank="17" prog="56"/>
+ <Patch name="428: WarmTrp" hbank="0" lbank="32" prog="56"/>
+ <Patch name="429: Trombone" hbank="0" lbank="0" prog="57"/>
+ <Patch name="430: Trmbone2" hbank="0" lbank="18" prog="57"/>
+ <Patch name="431: Tuba" hbank="0" lbank="0" prog="58"/>
+ <Patch name="432: Tuba 2" hbank="0" lbank="16" prog="58"/>
+ <Patch name="433: Mute.Trp" hbank="0" lbank="0" prog="59"/>
+ <Patch name="434: Fr.Horn" hbank="0" lbank="0" prog="60"/>
+ <Patch name="435: FrHrSolo" hbank="0" lbank="6" prog="60"/>
+ <Patch name="436: FrHorn2" hbank="0" lbank="32" prog="60"/>
+ <Patch name="437: HornOrch" hbank="0" lbank="37" prog="60"/>
+ <Patch name="438: BrasSect" hbank="0" lbank="0" prog="61"/>
+ <Patch name="439: Tp&amp;TbSec" hbank="0" lbank="35" prog="61"/>
+ <Patch name="440: BrssSec2" hbank="0" lbank="40" prog="61"/>
+ <Patch name="441: HiBrass" hbank="0" lbank="41" prog="61"/>
+ <Patch name="442: MelloBrs" hbank="0" lbank="42" prog="61"/>
+ <Patch name="443: SynBras1" hbank="0" lbank="0" prog="62"/>
+ <Patch name="444: QuackBr" hbank="0" lbank="12" prog="62"/>
+ <Patch name="445: RezSynBr" hbank="0" lbank="20" prog="62"/>
+ <Patch name="446: PolyBrss" hbank="0" lbank="24" prog="62"/>
+ <Patch name="447: SynBras3" hbank="0" lbank="27" prog="62"/>
+ <Patch name="448: JumpBrss" hbank="0" lbank="32" prog="62"/>
+ <Patch name="449: AnaVelBr" hbank="0" lbank="45" prog="62"/>
+ <Patch name="450: AnaBrss1" hbank="0" lbank="64" prog="62"/>
+ <Patch name="451: SynBras2" hbank="0" lbank="0" prog="63"/>
+ <Patch name="452: Soft Brs" hbank="0" lbank="18" prog="63"/>
+ <Patch name="453: SynBrss4" hbank="0" lbank="40" prog="63"/>
+ <Patch name="454: ChoirBrs" hbank="0" lbank="41" prog="63"/>
+ <Patch name="455: VelBrss2" hbank="0" lbank="45" prog="63"/>
+ <Patch name="456: AnaBrss2" hbank="0" lbank="64" prog="63"/>
+ </PatchGroup>
+ <PatchGroup name="Reed(457-469)">
+ <Patch name="457: SprnoSax" hbank="0" lbank="0" prog="64"/>
+ <Patch name="458: Alto Sax" hbank="0" lbank="0" prog="65"/>
+ <Patch name="459: Sax Sect" hbank="0" lbank="40" prog="65"/>
+ <Patch name="460: HyprAlto" hbank="0" lbank="43" prog="65"/>
+ <Patch name="461: TenorSax" hbank="0" lbank="0" prog="66"/>
+ <Patch name="462: BrthTnSx" hbank="0" lbank="40" prog="66"/>
+ <Patch name="463: SoftTenr" hbank="0" lbank="41" prog="66"/>
+ <Patch name="464: TnrSax 2" hbank="0" lbank="64" prog="66"/>
+ <Patch name="465: Bari.Sax" hbank="0" lbank="0" prog="67"/>
+ <Patch name="466: Oboe" hbank="0" lbank="0" prog="68"/>
+ <Patch name="467: Eng.Horn" hbank="0" lbank="0" prog="69"/>
+ <Patch name="468: Bassoon" hbank="0" lbank="0" prog="70"/>
+ <Patch name="469: Clarinet" hbank="0" lbank="0" prog="71"/>
+ </PatchGroup>
+ <PatchGroup name="Pipe(470-477)">
+ <Patch name="470: Piccolo" hbank="0" lbank="0" prog="72"/>
+ <Patch name="471: Flute" hbank="0" lbank="0" prog="73"/>
+ <Patch name="472: Recorder" hbank="0" lbank="0" prog="74"/>
+ <Patch name="473: PanFlute" hbank="0" lbank="0" prog="75"/>
+ <Patch name="474: Bottle" hbank="0" lbank="0" prog="76"/>
+ <Patch name="475: Shakhchi" hbank="0" lbank="0" prog="77"/>
+ <Patch name="476: Whistle" hbank="0" lbank="0" prog="78"/>
+ <Patch name="477: Ocarina" hbank="0" lbank="0" prog="79"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Lead(478-513)">
+ <Patch name="478: SquareLd" hbank="0" lbank="0" prog="80"/>
+ <Patch name="479: Square 2" hbank="0" lbank="6" prog="80"/>
+ <Patch name="480: LMSquare" hbank="0" lbank="8" prog="80"/>
+ <Patch name="481: Hollow" hbank="0" lbank="18" prog="80"/>
+ <Patch name="482: Shmoog" hbank="0" lbank="19" prog="80"/>
+ <Patch name="483: Mellow" hbank="0" lbank="64" prog="80"/>
+ <Patch name="484: SoloSine" hbank="0" lbank="65" prog="80"/>
+ <Patch name="485: SineLead" hbank="0" lbank="66" prog="80"/>
+ <Patch name="486: Saw.Lead" hbank="0" lbank="0" prog="81"/>
+ <Patch name="487: Saw 2" hbank="0" lbank="6" prog="81"/>
+ <Patch name="488: ThickSaw" hbank="0" lbank="8" prog="81"/>
+ <Patch name="489: DynaSaw" hbank="0" lbank="18" prog="81"/>
+ <Patch name="490: DigiSaw" hbank="0" lbank="19" prog="81"/>
+ <Patch name="491: Big Lead" hbank="0" lbank="20" prog="81"/>
+ <Patch name="492: HeavySyn" hbank="0" lbank="24" prog="81"/>
+ <Patch name="493: WaspySyn" hbank="0" lbank="25" prog="81"/>
+ <Patch name="494: PulseSaw" hbank="0" lbank="40" prog="81"/>
+ <Patch name="495: Dr. Lead" hbank="0" lbank="41" prog="81"/>
+ <Patch name="496: VeloLead" hbank="0" lbank="45" prog="81"/>
+ <Patch name="497: Seq Ana" hbank="0" lbank="96" prog="81"/>
+ <Patch name="498: CaliopLd" hbank="0" lbank="0" prog="82"/>
+ <Patch name="499: Pure Pad" hbank="0" lbank="65" prog="82"/>
+ <Patch name="500: Chiff Ld" hbank="0" lbank="0" prog="83"/>
+ <Patch name="501: Rubby" hbank="0" lbank="64" prog="83"/>
+ <Patch name="502: CharanLd" hbank="0" lbank="0" prog="84"/>
+ <Patch name="503: DistLead" hbank="0" lbank="64" prog="84"/>
+ <Patch name="504: WireLead" hbank="0" lbank="65" prog="84"/>
+ <Patch name="505: Voice Ld" hbank="0" lbank="0" prog="85"/>
+ <Patch name="506: SynthAah" hbank="0" lbank="24" prog="85"/>
+ <Patch name="507: VoxLead" hbank="0" lbank="64" prog="85"/>
+ <Patch name="508: Fifth Ld" hbank="0" lbank="0" prog="86"/>
+ <Patch name="509: Big Five" hbank="0" lbank="35" prog="86"/>
+ <Patch name="510: Bass &amp;Ld" hbank="0" lbank="0" prog="87"/>
+ <Patch name="511: Big&amp;Low" hbank="0" lbank="16" prog="87"/>
+ <Patch name="512: Fat&amp;Prky" hbank="0" lbank="64" prog="87"/>
+ <Patch name="513: SoftWurl" hbank="0" lbank="65" prog="87"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Pad(514-542)">
+ <Patch name="514: NewAgePd" hbank="0" lbank="0" prog="88"/>
+ <Patch name="515: Fantasy2" hbank="0" lbank="64" prog="88"/>
+ <Patch name="516: Warm Pad" hbank="0" lbank="0" prog="89"/>
+ <Patch name="517: ThickPad" hbank="0" lbank="16" prog="89"/>
+ <Patch name="518: Soft Pad" hbank="0" lbank="17" prog="89"/>
+ <Patch name="519: SinePad" hbank="0" lbank="18" prog="89"/>
+ <Patch name="520: Horn Pad" hbank="0" lbank="64" prog="89"/>
+ <Patch name="521: RotarStr" hbank="0" lbank="65" prog="89"/>
+ <Patch name="522: PolySyPd" hbank="0" lbank="0" prog="90"/>
+ <Patch name="523: PolyPd80" hbank="0" lbank="64" prog="90"/>
+ <Patch name="524: ClickPad" hbank="0" lbank="65" prog="90"/>
+ <Patch name="525: Ana Pad" hbank="0" lbank="66" prog="90"/>
+ <Patch name="526: SquarPad" hbank="0" lbank="67" prog="90"/>
+ <Patch name="527: ChoirPad" hbank="0" lbank="0" prog="91"/>
+ <Patch name="528: Heaven2" hbank="0" lbank="64" prog="91"/>
+ <Patch name="529: Itopia" hbank="0" lbank="66" prog="91"/>
+ <Patch name="530: CC Pad" hbank="0" lbank="67" prog="91"/>
+ <Patch name="531: BowedPad" hbank="0" lbank="0" prog="92"/>
+ <Patch name="532: Glacier" hbank="0" lbank="64" prog="92"/>
+ <Patch name="533: GlassPad" hbank="0" lbank="65" prog="92"/>
+ <Patch name="534: MetalPad" hbank="0" lbank="0" prog="93"/>
+ <Patch name="535: Tine Pad" hbank="0" lbank="64" prog="93"/>
+ <Patch name="536: Pan Pad" hbank="0" lbank="65" prog="93"/>
+ <Patch name="537: Halo Pad" hbank="0" lbank="0" prog="94"/>
+ <Patch name="538: SweepPad" hbank="0" lbank="0" prog="95"/>
+ <Patch name="539: Shwimmer" hbank="0" lbank="20" prog="95"/>
+ <Patch name="540: Converge" hbank="0" lbank="27" prog="95"/>
+ <Patch name="541: PolarPad" hbank="0" lbank="64" prog="95"/>
+ <Patch name="542: Celstial" hbank="0" lbank="66" prog="95"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Effects(543-598)">
+ <Patch name="543: Rain" hbank="0" lbank="0" prog="96"/>
+ <Patch name="544: ClaviPad" hbank="0" lbank="45" prog="96"/>
+ <Patch name="545: HrmoRain" hbank="0" lbank="64" prog="96"/>
+ <Patch name="546: AfrcnWnd" hbank="0" lbank="65" prog="96"/>
+ <Patch name="547: Caribean" hbank="0" lbank="66" prog="96"/>
+ <Patch name="548: SoundTrk" hbank="0" lbank="0" prog="97"/>
+ <Patch name="549: Prologue" hbank="0" lbank="27" prog="97"/>
+ <Patch name="550: Ancestrl" hbank="0" lbank="64" prog="97"/>
+ <Patch name="551: Crystal" hbank="0" lbank="0" prog="98"/>
+ <Patch name="552: SynDrCmp" hbank="0" lbank="12" prog="98"/>
+ <Patch name="553: Popcorn" hbank="0" lbank="14" prog="98"/>
+ <Patch name="554: TinyBell" hbank="0" lbank="18" prog="98"/>
+ <Patch name="555: RndGlock" hbank="0" lbank="35" prog="98"/>
+ <Patch name="556: GlockChi" hbank="0" lbank="40" prog="98"/>
+ <Patch name="557: ClearBel" hbank="0" lbank="41" prog="98"/>
+ <Patch name="558: ChorBell" hbank="0" lbank="42" prog="98"/>
+ <Patch name="559: SynMalet" hbank="0" lbank="64" prog="98"/>
+ <Patch name="560: SftCryst" hbank="0" lbank="65" prog="98"/>
+ <Patch name="561: LoudGlok" hbank="0" lbank="66" prog="98"/>
+ <Patch name="562: XmasBell" hbank="0" lbank="67" prog="98"/>
+ <Patch name="563: VibeBell" hbank="0" lbank="68" prog="98"/>
+ <Patch name="564: DigiBell" hbank="0" lbank="69" prog="98"/>
+ <Patch name="565: AirBells" hbank="0" lbank="70" prog="98"/>
+ <Patch name="566: BellHarp" hbank="0" lbank="71" prog="98"/>
+ <Patch name="567: Gamelmba" hbank="0" lbank="72" prog="98"/>
+ <Patch name="568: Atmosphr" hbank="0" lbank="0" prog="99"/>
+ <Patch name="569: WarmAtms" hbank="0" lbank="18" prog="99"/>
+ <Patch name="570: HollwRls" hbank="0" lbank="19" prog="99"/>
+ <Patch name="571: NylonEP" hbank="0" lbank="40" prog="99"/>
+ <Patch name="572: NylnHarp" hbank="0" lbank="64" prog="99"/>
+ <Patch name="573: Harp Vox" hbank="0" lbank="65" prog="99"/>
+ <Patch name="574: AtmosPad" hbank="0" lbank="66" prog="99"/>
+ <Patch name="575: Planet" hbank="0" lbank="67" prog="99"/>
+ <Patch name="576: Bright" hbank="0" lbank="0" prog="100"/>
+ <Patch name="577: FantaBel" hbank="0" lbank="64" prog="100"/>
+ <Patch name="578: Smokey" hbank="0" lbank="96" prog="100"/>
+ <Patch name="579: Goblins" hbank="0" lbank="0" prog="101"/>
+ <Patch name="580: GobSyn" hbank="0" lbank="64" prog="101"/>
+ <Patch name="581: 50sSciFi" hbank="0" lbank="65" prog="101"/>
+ <Patch name="582: Ring Pad" hbank="0" lbank="66" prog="101"/>
+ <Patch name="583: Ritual" hbank="0" lbank="67" prog="101"/>
+ <Patch name="584: ToHeaven" hbank="0" lbank="68" prog="101"/>
+ <Patch name="585: Night" hbank="0" lbank="70" prog="101"/>
+ <Patch name="586: Glisten" hbank="0" lbank="71" prog="101"/>
+ <Patch name="587: BelChoir" hbank="0" lbank="96" prog="101"/>
+ <Patch name="588: Echoes" hbank="0" lbank="0" prog="102"/>
+ <Patch name="589: EchoPad2" hbank="0" lbank="8" prog="102"/>
+ <Patch name="590: Echo Pan" hbank="0" lbank="14" prog="102"/>
+ <Patch name="591: EchoBell" hbank="0" lbank="64" prog="102"/>
+ <Patch name="592: Big Pan" hbank="0" lbank="65" prog="102"/>
+ <Patch name="593: SynPiano" hbank="0" lbank="66" prog="102"/>
+ <Patch name="594: Creation" hbank="0" lbank="67" prog="102"/>
+ <Patch name="595: Stardust" hbank="0" lbank="68" prog="102"/>
+ <Patch name="596: Reso Pan" hbank="0" lbank="69" prog="102"/>
+ <Patch name="597: Sci-Fi" hbank="0" lbank="0" prog="103"/>
+ <Patch name="598: Starz" hbank="0" lbank="64" prog="103"/>
+ </PatchGroup>
+ <PatchGroup name="Ethnic(599-619)">
+ <Patch name="599: Sitar" hbank="0" lbank="0" prog="104"/>
+ <Patch name="600: DetSitar" hbank="0" lbank="32" prog="104"/>
+ <Patch name="601: Sitar 2" hbank="0" lbank="35" prog="104"/>
+ <Patch name="602: Tambra" hbank="0" lbank="96" prog="104"/>
+ <Patch name="603: Tamboura" hbank="0" lbank="97" prog="104"/>
+ <Patch name="604: Banjo" hbank="0" lbank="0" prog="105"/>
+ <Patch name="605: MuteBnjo" hbank="0" lbank="28" prog="105"/>
+ <Patch name="606: Rabab" hbank="0" lbank="96" prog="105"/>
+ <Patch name="607: Gopichnt" hbank="0" lbank="97" prog="105"/>
+ <Patch name="608: Oud" hbank="0" lbank="98" prog="105"/>
+ <Patch name="609: Shamisen" hbank="0" lbank="0" prog="106"/>
+ <Patch name="610: Koto" hbank="0" lbank="0" prog="107"/>
+ <Patch name="611: T. Koto" hbank="0" lbank="96" prog="107"/>
+ <Patch name="612: Kanoon" hbank="0" lbank="97" prog="107"/>
+ <Patch name="613: Kalimba" hbank="0" lbank="0" prog="108"/>
+ <Patch name="614: Bagpipe" hbank="0" lbank="0" prog="109"/>
+ <Patch name="615: Fiddle" hbank="0" lbank="0" prog="110"/>
+ <Patch name="616: Shanai" hbank="0" lbank="0" prog="111"/>
+ <Patch name="617: Shanai2" hbank="0" lbank="64" prog="111"/>
+ <Patch name="618: Pungi" hbank="0" lbank="96" prog="111"/>
+ <Patch name="619: Hichriki" hbank="0" lbank="97" prog="111"/>
+ </PatchGroup>
+ <PatchGroup name="Percussive(620-642)">
+ <Patch name="620: TnklBell" hbank="0" lbank="0" prog="112"/>
+ <Patch name="621: Bonang" hbank="0" lbank="96" prog="112"/>
+ <Patch name="622: Gender" hbank="0" lbank="97" prog="112"/>
+ <Patch name="623: Gamelan" hbank="0" lbank="98" prog="112"/>
+ <Patch name="624: S.Gamlan" hbank="0" lbank="99" prog="112"/>
+ <Patch name="625: Rama Cym" hbank="0" lbank="100" prog="112"/>
+ <Patch name="626: AsianBel" hbank="0" lbank="101" prog="112"/>
+ <Patch name="627: Agogo" hbank="0" lbank="0" prog="113"/>
+ <Patch name="628: SteelDrm" hbank="0" lbank="0" prog="114"/>
+ <Patch name="629: GlasPerc" hbank="0" lbank="97" prog="114"/>
+ <Patch name="630: ThaiBell" hbank="0" lbank="98" prog="114"/>
+ <Patch name="631: WoodBlok" hbank="0" lbank="0" prog="115"/>
+ <Patch name="632: Castanet" hbank="0" lbank="96" prog="115"/>
+ <Patch name="633: TaikoDrm" hbank="0" lbank="0" prog="116"/>
+ <Patch name="634: Gr.Cassa" hbank="0" lbank="96" prog="116"/>
+ <Patch name="635: MelodTom" hbank="0" lbank="0" prog="117"/>
+ <Patch name="636: Mel Tom2" hbank="0" lbank="64" prog="117"/>
+ <Patch name="637: Real Tom" hbank="0" lbank="65" prog="117"/>
+ <Patch name="638: Rock Tom" hbank="0" lbank="66" prog="117"/>
+ <Patch name="639: Syn.Drum" hbank="0" lbank="0" prog="118"/>
+ <Patch name="640: Ana Tom" hbank="0" lbank="64" prog="118"/>
+ <Patch name="641: ElecPerc" hbank="0" lbank="65" prog="118"/>
+ <Patch name="642: RevCymbl" hbank="0" lbank="0" prog="119"/>
+ </PatchGroup>
+ <PatchGroup name="Sound Effects(643-650)">
+ <Patch name="643: FretNoiz" hbank="0" lbank="0" prog="120"/>
+ <Patch name="644: BrthNoiz" hbank="0" lbank="0" prog="121"/>
+ <Patch name="645: Seashore" hbank="0" lbank="0" prog="122"/>
+ <Patch name="646: Tweet" hbank="0" lbank="0" prog="123"/>
+ <Patch name="647: Telphone" hbank="0" lbank="0" prog="124"/>
+ <Patch name="648: Helicptr" hbank="0" lbank="0" prog="125"/>
+ <Patch name="649: Applause" hbank="0" lbank="0" prog="126"/>
+ <Patch name="650: Gunshot" hbank="0" lbank="0" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="SFX(651-692)">
+ <Patch name="651: CuttngNz" hbank="64" lbank="0" prog="0"/>
+ <Patch name="652: CttngNz2" hbank="64" lbank="0" prog="1"/>
+ <Patch name="653: Str Slap" hbank="64" lbank="0" prog="3"/>
+ <Patch name="654: Fl.KClik" hbank="64" lbank="0" prog="16"/>
+ <Patch name="655: Rain" hbank="64" lbank="0" prog="32"/>
+ <Patch name="656: Thunder" hbank="64" lbank="0" prog="33"/>
+ <Patch name="657: Wind" hbank="64" lbank="0" prog="34"/>
+ <Patch name="658: Stream" hbank="64" lbank="0" prog="35"/>
+ <Patch name="659: Bubble" hbank="64" lbank="0" prog="36"/>
+ <Patch name="660: Feed" hbank="64" lbank="0" prog="37"/>
+ <Patch name="661: Dog" hbank="64" lbank="0" prog="48"/>
+ <Patch name="662: Horse" hbank="64" lbank="0" prog="49"/>
+ <Patch name="663: Bird 2" hbank="64" lbank="0" prog="50"/>
+ <Patch name="664: Ghost" hbank="64" lbank="0" prog="54"/>
+ <Patch name="665: Maou" hbank="64" lbank="0" prog="55"/>
+ <Patch name="666: Tel.Dial" hbank="64" lbank="0" prog="64"/>
+ <Patch name="667: DoorSqek" hbank="64" lbank="0" prog="65"/>
+ <Patch name="668: Door Slam" hbank="64" lbank="0" prog="66"/>
+ <Patch name="669: Scratch" hbank="64" lbank="0" prog="67"/>
+ <Patch name="670: Scratch 2" hbank="64" lbank="0" prog="68"/>
+ <Patch name="671: WindChm" hbank="64" lbank="0" prog="69"/>
+ <Patch name="672: Telphon2" hbank="64" lbank="0" prog="70"/>
+ <Patch name="673: CarEngin" hbank="64" lbank="0" prog="80"/>
+ <Patch name="674: Car Stop" hbank="64" lbank="0" prog="81"/>
+ <Patch name="675: Car Pass" hbank="64" lbank="0" prog="82"/>
+ <Patch name="676: CarCrash" hbank="64" lbank="0" prog="83"/>
+ <Patch name="677: Siren" hbank="64" lbank="0" prog="84"/>
+ <Patch name="678: Train" hbank="64" lbank="0" prog="85"/>
+ <Patch name="679: Jetplane" hbank="64" lbank="0" prog="86"/>
+ <Patch name="680: Starship" hbank="64" lbank="0" prog="87"/>
+ <Patch name="681: Burst" hbank="64" lbank="0" prog="88"/>
+ <Patch name="682: Coaster" hbank="64" lbank="0" prog="89"/>
+ <Patch name="683: SbMarine" hbank="64" lbank="0" prog="90"/>
+ <Patch name="684: Laughing" hbank="64" lbank="0" prog="96"/>
+ <Patch name="685: Scream" hbank="64" lbank="0" prog="97"/>
+ <Patch name="686: Punch" hbank="64" lbank="0" prog="98"/>
+ <Patch name="687: Heart" hbank="64" lbank="0" prog="99"/>
+ <Patch name="688: FootStep" hbank="64" lbank="0" prog="100"/>
+ <Patch name="689: MchinGun" hbank="64" lbank="0" prog="112"/>
+ <Patch name="690: LaserGun" hbank="64" lbank="0" prog="113"/>
+ <Patch name="691: Xplosion" hbank="64" lbank="0" prog="114"/>
+ <Patch name="692: FireWork" hbank="64" lbank="0" prog="115"/>
+ </PatchGroup>
+ </MidiInstrument>
+ </muse>
+
diff --git a/muse/share/instruments/Yamaha-S90.idf b/muse/share/instruments/Yamaha-S90.idf
new file mode 100644
index 00000000..3d5f3685
--- /dev/null
+++ b/muse/share/instruments/Yamaha-S90.idf
@@ -0,0 +1,4304 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ MusE Instrument Definition File for
+ Yamaha S90
+ Synthesizer & Stage Piano
+-->
+
+<muse version="1.0">
+ <MidiInstrument name="Yamaha-S90">
+ <Init>
+ <!-- Master number 0 select -->
+ <event tick="0" type="2" datalen="7">
+ 0x43 0x10 0x6b 0xa 0x0 0x0 0x0
+ </event>
+ <!-- Switch to SeqPlay Mode -->
+ <event tick="386" type="2" datalen="7">
+ 0x43 0x10 0x6b 0xa 0x0 0x1 0x3
+ </event>
+ <!-- Local Off -->
+ <event tick="386" type="2" datalen="7">
+ 0x43 0x10 0x6b 0x0 0x0 0x9 0x0
+ </event>
+ </Init>
+ <Category name="Ap"></Category>
+ <Category name="Kb"></Category>
+ <Category name="Cp"></Category>
+ <Category name="Or"></Category>
+
+ <PatchGroup name="PRE1">
+ <Patch name="3LayerS700" cat="Ap" hbank="63" lbank="0" prog="0"/>
+ <Patch name="Soft Touch" cat="Ap" hbank="63" lbank="0" prog="1"/>
+ <Patch name="PowerGrand" cat="Ap" hbank="63" lbank="0" prog="2"/>
+ <Patch name="BriteRock" cat="Ap" hbank="63" lbank="0" prog="3"/>
+ <Patch name="Jazz Grand" cat="Ap" hbank="63" lbank="0" prog="4"/>
+ <Patch name="CP 80" cat="Ap" hbank="63" lbank="0" prog="5"/>
+ <Patch name="BalladKeys" cat="Ap" hbank="63" lbank="0" prog="6"/>
+ <Patch name="80's Layer" cat="Ap" hbank="63" lbank="0" prog="7"/>
+ <Patch name="S700&amp;Strg" cat="Ap" hbank="63" lbank="0" prog="8"/>
+ <Patch name="S700&amp;Ooh" cat="Ap" hbank="63" lbank="0" prog="9"/>
+ <Patch name="PianoBakup" cat="Ap" hbank="63" lbank="0" prog="10"/>
+
+ <Patch name="Max Tine" cat="Kb" hbank="63" lbank="0" prog="11"/>
+ <Patch name="Early Fusn" cat="Kb" hbank="63" lbank="0" prog="12"/>
+ <Patch name="Vintage'74" cat="Kb" hbank="63" lbank="0" prog="13"/>
+ <Patch name="Sweetness" cat="Kb" hbank="63" lbank="0" prog="14"/>
+ <Patch name="DynoStrait" cat="Kb" hbank="63" lbank="0" prog="15"/>
+ <Patch name="ChorusHard" cat="Kb" hbank="63" lbank="0" prog="16"/>
+ <Patch name="VintagCase" cat="Kb" hbank="63" lbank="0" prog="17"/>
+ <Patch name="ChorusDyno" cat="Kb" hbank="63" lbank="0" prog="18"/>
+ <Patch name="80th Boost" cat="Kb" hbank="63" lbank="0" prog="19"/>
+ <Patch name="Contempo" cat="Kb" hbank="63" lbank="0" prog="20"/>
+ <Patch name="Early 70's" cat="Kb" hbank="63" lbank="0" prog="21"/>
+ <Patch name="Tonight" cat="Kb" hbank="63" lbank="0" prog="22"/>
+ <Patch name="E.PianoPad" cat="Kb" hbank="63" lbank="0" prog="23"/>
+ <Patch name="TX802" cat="Kb" hbank="63" lbank="0" prog="24"/>
+ <Patch name="ChorusBel" cat="Kb" hbank="63" lbank="0" prog="25"/>
+ <Patch name="BellDX" cat="Kb" hbank="63" lbank="0" prog="26"/>
+ <Patch name="Dark DX" cat="Kb" hbank="63" lbank="0" prog="27"/>
+ <Patch name="GS Tines" cat="Kb" hbank="63" lbank="0" prog="28"/>
+ <Patch name="Rich FM" cat="Kb" hbank="63" lbank="0" prog="29"/>
+ <Patch name="FilteredDX" cat="Kb" hbank="63" lbank="0" prog="30"/>
+ <Patch name="Ice Piano" cat="Kb" hbank="63" lbank="0" prog="31"/>
+ <Patch name="WurliTrem" cat="Kb" hbank="63" lbank="0" prog="32"/>
+ <Patch name="WurliAmped" cat="Kb" hbank="63" lbank="0" prog="33"/>
+ <Patch name="TouchClavi" cat="Kb" hbank="63" lbank="0" prog="34"/>
+ <Patch name="SuperClavi" cat="Kb" hbank="63" lbank="0" prog="35"/>
+ <Patch name="StereoClav" cat="Kb" hbank="63" lbank="0" prog="36"/>
+ <Patch name="HollowClav" cat="Kb" hbank="63" lbank="0" prog="37"/>
+ <Patch name="Nu Phasing" cat="Kb" hbank="63" lbank="0" prog="38"/>
+ <Patch name="Digi Clavi" cat="Kb" hbank="63" lbank="0" prog="39"/>
+ <Patch name="PulseClavi" cat="Kb" hbank="63" lbank="0" prog="40"/>
+
+ <Patch name="Twinkle" cat="Cp" hbank="63" lbank="0" prog="41"/>
+ <Patch name="Stick Bell" cat="Cp" hbank="63" lbank="0" prog="42"/>
+ <Patch name="Bell Chiff" cat="Cp" hbank="63" lbank="0" prog="43"/>
+ <Patch name="FngrCymbl" cat="Cp" hbank="63" lbank="0" prog="44"/>
+ <Patch name="ChorusBell" cat="Cp" hbank="63" lbank="0" prog="45"/>
+ <Patch name="Tibetan" cat="Cp" hbank="63" lbank="0" prog="46"/>
+ <Patch name="EastBell" cat="Cp" hbank="63" lbank="0" prog="47"/>
+ <Patch name="Gamelan" cat="Cp" hbank="63" lbank="0" prog="48"/>
+ <Patch name="IceBells" cat="Cp" hbank="63" lbank="0" prog="49"/>
+ <Patch name="Digi Bell" cat="Cp" hbank="63" lbank="0" prog="50"/>
+ <Patch name="Marimbell" cat="Cp" hbank="63" lbank="0" prog="51"/>
+
+ <Patch name="16+8+5&amp;1/3" cat="Or" hbank="63" lbank="0" prog="52"/>
+ <Patch name="Petit" cat="Or" hbank="63" lbank="0" prog="53"/>
+ <Patch name="Glassy" cat="Or" hbank="63" lbank="0" prog="54"/>
+ <Patch name="Jazzy" cat="Or" hbank="63" lbank="0" prog="55"/>
+ <Patch name="Slow Jam" cat="Or" hbank="63" lbank="0" prog="56"/>
+ <Patch name="Greasy" cat="Or" hbank="63" lbank="0" prog="57"/>
+ <Patch name="Swishie" cat="Or" hbank="63" lbank="0" prog="58"/>
+ <Patch name="Clean" cat="Or" hbank="63" lbank="0" prog="59"/>
+ <Patch name="Full/CVib" cat="Or" hbank="63" lbank="0" prog="60"/>
+ <Patch name="Mellow" cat="Or" hbank="63" lbank="0" prog="61"/>
+ <Patch name="Nu Shade" cat="Or" hbank="63" lbank="0" prog="62"/>
+ <Patch name="Cool Cat" cat="Or" hbank="63" lbank="0" prog="63"/>
+ <Patch name="Flutey" cat="Or" hbank="63" lbank="0" prog="64"/>
+ <Patch name="LeftManual" cat="Or" hbank="63" lbank="0" prog="65"/>
+ <Patch name="DrawContrl" cat="Or" hbank="63" lbank="0" prog="66"/>
+ <Patch name="Rocky" cat="Or" hbank="63" lbank="0" prog="67"/>
+ <Patch name="Expensive" cat="Or" hbank="63" lbank="0" prog="68"/>
+ <Patch name="Progressy" cat="Or" hbank="63" lbank="0" prog="69"/>
+ <Patch name="Crunchy" cat="Or" hbank="63" lbank="0" prog="70"/>
+ <Patch name="Early Bird" cat="Or" hbank="63" lbank="0" prog="71"/>
+ <Patch name="Jazz Split" cat="Or" hbank="63" lbank="0" prog="72"/>
+ <Patch name="GosplSplit" cat="Or" hbank="63" lbank="0" prog="73"/>
+ <Patch name="Tradi" cat="Or" hbank="63" lbank="0" prog="74"/>
+ <Patch name="Sunday" cat="Or" hbank="63" lbank="0" prog="75"/>
+ <Patch name="BreathPipe" cat="Or" hbank="63" lbank="0" prog="76"/>
+ <Patch name="Fluty Pipe" cat="Or" hbank="63" lbank="0" prog="77"/>
+ <Patch name="Reedy Pipe" cat="Or" hbank="63" lbank="0" prog="78"/>
+
+ <Patch name="OohPipes" cat="Ap" hbank="63" lbank="0" prog="79"/>
+ <Patch name="Flamenco" cat="Ap" hbank="63" lbank="0" prog="80"/>
+ <Patch name="Nylon Jam" cat="Ap" hbank="63" lbank="0" prog="81"/>
+ <Patch name="BriteSteel" cat="Ap" hbank="63" lbank="0" prog="82"/>
+ <Patch name="Strums" cat="Ap" hbank="63" lbank="0" prog="83"/>
+ <Patch name="Big Steel" cat="Ap" hbank="63" lbank="0" prog="84"/>
+ <Patch name="Folk Steel" cat="Ap" hbank="63" lbank="0" prog="85"/>
+ <Patch name="18 String" cat="Ap" hbank="63" lbank="0" prog="86"/>
+ <Patch name="HarpsiGtr" cat="Ap" hbank="63" lbank="0" prog="87"/>
+ <Patch name="HybridGtr" cat="Ap" hbank="63" lbank="0" prog="88"/>
+ <Patch name="JazzGTmelo" cat="Ap" hbank="63" lbank="0" prog="89"/>
+ <Patch name="Velo Jazz" cat="Ap" hbank="63" lbank="0" prog="90"/>
+ <Patch name="FM Jazz" cat="Ap" hbank="63" lbank="0" prog="91"/>
+ <Patch name="For Funk" cat="Ap" hbank="63" lbank="0" prog="92"/>
+ <Patch name="Spanky" cat="Ap" hbank="63" lbank="0" prog="93"/>
+ <Patch name="Funkiest" cat="Ap" hbank="63" lbank="0" prog="94"/>
+ <Patch name="Vin Strum" cat="Ap" hbank="63" lbank="0" prog="95"/>
+ <Patch name="1CoilChors" cat="Ap" hbank="63" lbank="0" prog="96"/>
+ <Patch name="CleanChors" cat="Ap" hbank="63" lbank="0" prog="97"/>
+ <Patch name="ChorusPlus" cat="Ap" hbank="63" lbank="0" prog="98"/>
+ <Patch name="SmoothChor" cat="Ap" hbank="63" lbank="0" prog="99"/>
+ <Patch name="TexBoogie" cat="Ap" hbank="63" lbank="0" prog="100"/>
+ <Patch name="Rockabilly" cat="Ap" hbank="63" lbank="0" prog="101"/>
+ <Patch name="65 Combo" cat="Ap" hbank="63" lbank="0" prog="102"/>
+ <Patch name="VinTremolo" cat="Ap" hbank="63" lbank="0" prog="103"/>
+ <Patch name="Crunchoid" cat="Ap" hbank="63" lbank="0" prog="104"/>
+ <Patch name="DynamicAmp" cat="Ap" hbank="63" lbank="0" prog="105"/>
+ <Patch name="Feedback" cat="Ap" hbank="63" lbank="0" prog="106"/>
+ <Patch name="VOODOOMAN" cat="Ap" hbank="63" lbank="0" prog="107"/>
+ <Patch name="BlueLead" cat="Ap" hbank="63" lbank="0" prog="108"/>
+ <Patch name="MeloRckLd" cat="Ap" hbank="63" lbank="0" prog="109"/>
+ <Patch name="MetalMute" cat="Ap" hbank="63" lbank="0" prog="110"/>
+ <Patch name="OverTheTop" cat="Ap" hbank="63" lbank="0" prog="111"/>
+ <Patch name="RoundWound" cat="Ap" hbank="63" lbank="0" prog="112"/>
+ <Patch name="FingerMan" cat="Ap" hbank="63" lbank="0" prog="113"/>
+ <Patch name="PrecRW" cat="Ap" hbank="63" lbank="0" prog="114"/>
+ <Patch name="PrecFW" cat="Ap" hbank="63" lbank="0" prog="115"/>
+ <Patch name="HybridBass" cat="Ap" hbank="63" lbank="0" prog="116"/>
+ <Patch name="Stand Up" cat="Ap" hbank="63" lbank="0" prog="117"/>
+ <Patch name="Fretless" cat="Ap" hbank="63" lbank="0" prog="118"/>
+ <Patch name="Slap&amp;Fx" cat="Ap" hbank="63" lbank="0" prog="119"/>
+ <Patch name="BriteSlap" cat="Ap" hbank="63" lbank="0" prog="120"/>
+ <Patch name="Velo Bass" cat="Ap" hbank="63" lbank="0" prog="121"/>
+ <Patch name="Bs+Cym+Vb" cat="Ap" hbank="63" lbank="0" prog="122"/>
+ <Patch name="Boogie on" cat="Ap" hbank="63" lbank="0" prog="123"/>
+ <Patch name="MiniDetune" cat="Ap" hbank="63" lbank="0" prog="124"/>
+ <Patch name="Long Spit" cat="Ap" hbank="63" lbank="0" prog="125"/>
+ <Patch name="Tack Bass" cat="Ap" hbank="63" lbank="0" prog="126"/>
+ <Patch name="Fat Octave" cat="Ap" hbank="63" lbank="0" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="PRE2">
+ <Patch name="Violin" cat="Ap" hbank="63" lbank="1" prog="0"/>
+ <Patch name="Viola" cat="Ap" hbank="63" lbank="1" prog="1"/>
+ <Patch name="Cello" cat="Ap" hbank="63" lbank="1" prog="2"/>
+ <Patch name="SoloSpicat" cat="Ap" hbank="63" lbank="1" prog="3"/>
+ <Patch name="2 Solos" cat="Ap" hbank="63" lbank="1" prog="4"/>
+ <Patch name="Cello Duet" cat="Ap" hbank="63" lbank="1" prog="5"/>
+ <Patch name="Trio" cat="Ap" hbank="63" lbank="1" prog="6"/>
+ <Patch name="Chamber" cat="Ap" hbank="63" lbank="1" prog="7"/>
+ <Patch name="Small Ens" cat="Ap" hbank="63" lbank="1" prog="8"/>
+ <Patch name="Medium Ens" cat="Ap" hbank="63" lbank="1" prog="9"/>
+ <Patch name="Ens Mix" cat="Ap" hbank="63" lbank="1" prog="10"/>
+ <Patch name="Ensemble" cat="Ap" hbank="63" lbank="1" prog="11"/>
+ <Patch name="Hard Ens" cat="Ap" hbank="63" lbank="1" prog="12"/>
+ <Patch name="Background" cat="Ap" hbank="63" lbank="1" prog="13"/>
+ <Patch name="BigSymphny" cat="Ap" hbank="63" lbank="1" prog="14"/>
+ <Patch name="Str/Horns" cat="Ap" hbank="63" lbank="1" prog="15"/>
+ <Patch name="Stringy" cat="Ap" hbank="63" lbank="1" prog="16"/>
+ <Patch name="Polystring" cat="Ap" hbank="63" lbank="1" prog="17"/>
+ <Patch name="JP Strings" cat="Ap" hbank="63" lbank="1" prog="18"/>
+ <Patch name="MournStrgs" cat="Ap" hbank="63" lbank="1" prog="19"/>
+ <Patch name="The Pizz" cat="Ap" hbank="63" lbank="1" prog="20"/>
+ <Patch name="Fanfare" cat="Ap" hbank="63" lbank="1" prog="21"/>
+ <Patch name="Hi Brass" cat="Ap" hbank="63" lbank="1" prog="22"/>
+ <Patch name="Fat Sect" cat="Ap" hbank="63" lbank="1" prog="23"/>
+ <Patch name="Sforzando" cat="Ap" hbank="63" lbank="1" prog="24"/>
+ <Patch name="Symphony" cat="Ap" hbank="63" lbank="1" prog="25"/>
+ <Patch name="Big Band" cat="Ap" hbank="63" lbank="1" prog="26"/>
+ <Patch name="Big Band 2" cat="Ap" hbank="63" lbank="1" prog="27"/>
+ <Patch name="SaxBigBand" cat="Ap" hbank="63" lbank="1" prog="28"/>
+ <Patch name="MedmBrass" cat="Ap" hbank="63" lbank="1" prog="29"/>
+ <Patch name="Soft Brass" cat="Ap" hbank="63" lbank="1" prog="30"/>
+ <Patch name="SoftVeloBr" cat="Ap" hbank="63" lbank="1" prog="31"/>
+ <Patch name="TrpRomantc" cat="Ap" hbank="63" lbank="1" prog="32"/>
+ <Patch name="Phase Mute" cat="Ap" hbank="63" lbank="1" prog="33"/>
+ <Patch name="Legend" cat="Ap" hbank="63" lbank="1" prog="34"/>
+ <Patch name="Trombone" cat="Ap" hbank="63" lbank="1" prog="35"/>
+ <Patch name="Flugelleaz" cat="Ap" hbank="63" lbank="1" prog="36"/>
+ <Patch name="F.Horn Ens" cat="Ap" hbank="63" lbank="1" prog="37"/>
+ <Patch name="SlowAttack" cat="Ap" hbank="63" lbank="1" prog="38"/>
+ <Patch name="Strng/Bras" cat="Ap" hbank="63" lbank="1" prog="39"/>
+ <Patch name="Movie Ens " cat="Ap" hbank="63" lbank="1" prog="40"/>
+ <Patch name="Powered" cat="Ap" hbank="63" lbank="1" prog="41"/>
+ <Patch name="ObStuff" cat="Ap" hbank="63" lbank="1" prog="42"/>
+ <Patch name="Prophy" cat="Ap" hbank="63" lbank="1" prog="43"/>
+ <Patch name="AnalogBras" cat="Ap" hbank="63" lbank="1" prog="44"/>
+ <Patch name="After 1984" cat="Ap" hbank="63" lbank="1" prog="45"/>
+ <Patch name="Soprano" cat="Ap" hbank="63" lbank="1" prog="46"/>
+ <Patch name="Alto Vib" cat="Ap" hbank="63" lbank="1" prog="47"/>
+ <Patch name="SaxEnsembl" cat="Ap" hbank="63" lbank="1" prog="48"/>
+ <Patch name="Tenor Sax" cat="Ap" hbank="63" lbank="1" prog="49"/>
+ <Patch name="Tenor Soft" cat="Ap" hbank="63" lbank="1" prog="50"/>
+ <Patch name="The Winds" cat="Ap" hbank="63" lbank="1" prog="51"/>
+ <Patch name="WindOrch" cat="Ap" hbank="63" lbank="1" prog="52"/>
+ <Patch name="SweetFlute" cat="Ap" hbank="63" lbank="1" prog="53"/>
+ <Patch name="PanBottle" cat="Ap" hbank="63" lbank="1" prog="54"/>
+ <Patch name="AmpHarpMW" cat="Ap" hbank="63" lbank="1" prog="55"/>
+ <Patch name="SmoothSaw" cat="Ap" hbank="63" lbank="1" prog="56"/>
+ <Patch name="Lucky" cat="Ap" hbank="63" lbank="1" prog="57"/>
+ <Patch name="Tri Solo" cat="Ap" hbank="63" lbank="1" prog="58"/>
+ <Patch name="Syntrump" cat="Ap" hbank="63" lbank="1" prog="59"/>
+ <Patch name="PWM Lead" cat="Ap" hbank="63" lbank="1" prog="60"/>
+ <Patch name="Clicky Saw" cat="Ap" hbank="63" lbank="1" prog="61"/>
+ <Patch name="Mini Pulse" cat="Ap" hbank="63" lbank="1" prog="62"/>
+ <Patch name="Sync Lead" cat="Ap" hbank="63" lbank="1" prog="63"/>
+ <Patch name="Altair" cat="Ap" hbank="63" lbank="1" prog="64"/>
+ <Patch name="Analog" cat="Ap" hbank="63" lbank="1" prog="65"/>
+ <Patch name="Sweetland" cat="Ap" hbank="63" lbank="1" prog="66"/>
+ <Patch name="WarmSweepy" cat="Ap" hbank="63" lbank="1" prog="67"/>
+ <Patch name="SinePad" cat="Ap" hbank="63" lbank="1" prog="68"/>
+ <Patch name="Square" cat="Ap" hbank="63" lbank="1" prog="69"/>
+ <Patch name="VoxPad" cat="Ap" hbank="63" lbank="1" prog="70"/>
+ <Patch name="Pure Syn" cat="Ap" hbank="63" lbank="1" prog="71"/>
+ <Patch name="MovingPad" cat="Ap" hbank="63" lbank="1" prog="72"/>
+ <Patch name="SimpleSaws" cat="Ap" hbank="63" lbank="1" prog="73"/>
+ <Patch name="X-Shower" cat="Ap" hbank="63" lbank="1" prog="74"/>
+ <Patch name="PWM Pad" cat="Ap" hbank="63" lbank="1" prog="75"/>
+ <Patch name="Bell Choir" cat="Ap" hbank="63" lbank="1" prog="76"/>
+ <Patch name="ObSoft" cat="Ap" hbank="63" lbank="1" prog="77"/>
+ <Patch name="MellowAnlg" cat="Ap" hbank="63" lbank="1" prog="78"/>
+ <Patch name="Glasschoir" cat="Ap" hbank="63" lbank="1" prog="79"/>
+ <Patch name="PeaceVox" cat="Ap" hbank="63" lbank="1" prog="80"/>
+ <Patch name="StackChoir" cat="Ap" hbank="63" lbank="1" prog="81"/>
+ <Patch name="Bronx" cat="Ap" hbank="63" lbank="1" prog="82"/>
+ <Patch name="IceChoir" cat="Ap" hbank="63" lbank="1" prog="83"/>
+ <Patch name="Fast Oohs" cat="Ap" hbank="63" lbank="1" prog="84"/>
+ <Patch name="Ooze &amp; OZ" cat="Ap" hbank="63" lbank="1" prog="85"/>
+ <Patch name="NeoCrystal" cat="Ap" hbank="63" lbank="1" prog="86"/>
+ <Patch name="Pop Synth" cat="Ap" hbank="63" lbank="1" prog="87"/>
+ <Patch name="Fantasy" cat="Ap" hbank="63" lbank="1" prog="88"/>
+ <Patch name="Heavenly" cat="Ap" hbank="63" lbank="1" prog="89"/>
+ <Patch name="Retro" cat="Ap" hbank="63" lbank="1" prog="90"/>
+ <Patch name="Airy" cat="Ap" hbank="63" lbank="1" prog="91"/>
+ <Patch name="Nylon" cat="Ap" hbank="63" lbank="1" prog="92"/>
+ <Patch name="Antares" cat="Ap" hbank="63" lbank="1" prog="93"/>
+ <Patch name="Pan Sphere" cat="Ap" hbank="63" lbank="1" prog="94"/>
+ <Patch name="Tamburax" cat="Ap" hbank="63" lbank="1" prog="95"/>
+ <Patch name="IndianFlai" cat="Ap" hbank="63" lbank="1" prog="96"/>
+ <Patch name="SAKURA" cat="Ap" hbank="63" lbank="1" prog="97"/>
+ <Patch name="RisingHigh" cat="Ap" hbank="63" lbank="1" prog="98"/>
+ <Patch name="Champ" cat="Ap" hbank="63" lbank="1" prog="99"/>
+ <Patch name="Gladiator" cat="Ap" hbank="63" lbank="1" prog="100"/>
+ <Patch name="Hades" cat="Ap" hbank="63" lbank="1" prog="101"/>
+ <Patch name="Glacy" cat="Ap" hbank="63" lbank="1" prog="102"/>
+ <Patch name="Forest" cat="Ap" hbank="63" lbank="1" prog="103"/>
+ <Patch name="MirrorRing" cat="Ap" hbank="63" lbank="1" prog="104"/>
+ <Patch name="Poly" cat="Ap" hbank="63" lbank="1" prog="105"/>
+ <Patch name="AnaTonk" cat="Ap" hbank="63" lbank="1" prog="106"/>
+ <Patch name="Jaipur" cat="Ap" hbank="63" lbank="1" prog="107"/>
+ <Patch name="Dulcitar" cat="Ap" hbank="63" lbank="1" prog="108"/>
+ <Patch name="Cimbalon" cat="Ap" hbank="63" lbank="1" prog="109"/>
+ <Patch name="EthncFlute" cat="Ap" hbank="63" lbank="1" prog="110"/>
+ <Patch name="Hichiriki" cat="Ap" hbank="63" lbank="1" prog="111"/>
+ <Patch name="Ryuteki" cat="Ap" hbank="63" lbank="1" prog="112"/>
+ <Patch name="Gagaku" cat="Ap" hbank="63" lbank="1" prog="113"/>
+ <Patch name="Kokyu" cat="Ap" hbank="63" lbank="1" prog="114"/>
+ <Patch name="Digidoo" cat="Ap" hbank="63" lbank="1" prog="115"/>
+ <Patch name="Bali" cat="Ap" hbank="63" lbank="1" prog="116"/>
+ <Patch name="Indo Trip" cat="Ap" hbank="63" lbank="1" prog="117"/>
+ <Patch name="East Tabla" cat="Ap" hbank="63" lbank="1" prog="118"/>
+ <Patch name="Djembe" cat="Ap" hbank="63" lbank="1" prog="119"/>
+ <Patch name="Djerimbe" cat="Ap" hbank="63" lbank="1" prog="120"/>
+ <Patch name="Udu" cat="Ap" hbank="63" lbank="1" prog="121"/>
+ <Patch name="Tribal" cat="Ap" hbank="63" lbank="1" prog="122"/>
+ <Patch name="Log&amp;Drum" cat="Ap" hbank="63" lbank="1" prog="123"/>
+ <Patch name="Afro" cat="Ap" hbank="63" lbank="1" prog="124"/>
+ <Patch name="Japanesque" cat="Ap" hbank="63" lbank="1" prog="125"/>
+ <Patch name="EthnoShock" cat="Ap" hbank="63" lbank="1" prog="126"/>
+ <Patch name="Ethnology" cat="Ap" hbank="63" lbank="1" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="PRE3">
+ <Patch name="Wide Comp" cat="Ap" hbank="63" lbank="2" prog="0"/>
+ <Patch name="78rpmPiano" cat="Ap" hbank="63" lbank="2" prog="1"/>
+ <Patch name="1968 45rpm" cat="Ap" hbank="63" lbank="2" prog="2"/>
+ <Patch name="1971 33rpm" cat="Ap" hbank="63" lbank="2" prog="3"/>
+ <Patch name="DigiGrand1" cat="Ap" hbank="63" lbank="2" prog="4"/>
+ <Patch name="Harp&amp;Piano" cat="Ap" hbank="63" lbank="2" prog="5"/>
+ <Patch name="Glass EP" cat="Ap" hbank="63" lbank="2" prog="6"/>
+ <Patch name="VintSwitch" cat="Ap" hbank="63" lbank="2" prog="7"/>
+ <Patch name="Early Case" cat="Ap" hbank="63" lbank="2" prog="8"/>
+ <Patch name="RdsScape" cat="Ap" hbank="63" lbank="2" prog="9"/>
+ <Patch name="Feathers" cat="Ap" hbank="63" lbank="2" prog="10"/>
+ <Patch name="StringyPno" cat="Ap" hbank="63" lbank="2" prog="11"/>
+ <Patch name="Champagne" cat="Ap" hbank="63" lbank="2" prog="12"/>
+ <Patch name="Moet" cat="Ap" hbank="63" lbank="2" prog="13"/>
+ <Patch name="Compact" cat="Ap" hbank="63" lbank="2" prog="14"/>
+ <Patch name="1967 Keys" cat="Ap" hbank="63" lbank="2" prog="15"/>
+ <Patch name="YD-45C" cat="Ap" hbank="63" lbank="2" prog="16"/>
+ <Patch name="Gnarly" cat="Ap" hbank="63" lbank="2" prog="17"/>
+ <Patch name="Modular" cat="Ap" hbank="63" lbank="2" prog="18"/>
+ <Patch name="Dark Jack" cat="Ap" hbank="63" lbank="2" prog="19"/>
+ <Patch name="OneVoice" cat="Ap" hbank="63" lbank="2" prog="20"/>
+ <Patch name="Dry Syn" cat="Ap" hbank="63" lbank="2" prog="21"/>
+ <Patch name="PlasticBas" cat="Ap" hbank="63" lbank="2" prog="22"/>
+ <Patch name="Bassline" cat="Ap" hbank="63" lbank="2" prog="23"/>
+ <Patch name="RubbaRap" cat="Ap" hbank="63" lbank="2" prog="24"/>
+ <Patch name="Juicy" cat="Ap" hbank="63" lbank="2" prog="25"/>
+ <Patch name="Dark" cat="Ap" hbank="63" lbank="2" prog="26"/>
+ <Patch name="UniBass" cat="Ap" hbank="63" lbank="2" prog="27"/>
+ <Patch name="Flyer" cat="Ap" hbank="63" lbank="2" prog="28"/>
+ <Patch name="QuackBass" cat="Ap" hbank="63" lbank="2" prog="29"/>
+ <Patch name="Moonbass" cat="Ap" hbank="63" lbank="2" prog="30"/>
+ <Patch name="ClassicSub" cat="Ap" hbank="63" lbank="2" prog="31"/>
+ <Patch name="DX100" cat="Ap" hbank="63" lbank="2" prog="32"/>
+ <Patch name="Lately" cat="Ap" hbank="63" lbank="2" prog="33"/>
+ <Patch name="FMBass" cat="Ap" hbank="63" lbank="2" prog="34"/>
+ <Patch name="Oct String" cat="Ap" hbank="63" lbank="2" prog="35"/>
+ <Patch name="3 Octave" cat="Ap" hbank="63" lbank="2" prog="36"/>
+ <Patch name="TapeStrngs" cat="Ap" hbank="63" lbank="2" prog="37"/>
+ <Patch name="VP Strings" cat="Ap" hbank="63" lbank="2" prog="38"/>
+ <Patch name="BriteTeeth" cat="Ap" hbank="63" lbank="2" prog="39"/>
+ <Patch name="XDance" cat="Ap" hbank="63" lbank="2" prog="40"/>
+ <Patch name="Timeless" cat="Ap" hbank="63" lbank="2" prog="41"/>
+ <Patch name="FatSynth" cat="Ap" hbank="63" lbank="2" prog="42"/>
+ <Patch name="Big Syn" cat="Ap" hbank="63" lbank="2" prog="43"/>
+ <Patch name="Bluesharp" cat="Ap" hbank="63" lbank="2" prog="44"/>
+ <Patch name="Sync Atk" cat="Ap" hbank="63" lbank="2" prog="45"/>
+ <Patch name="Reso" cat="Ap" hbank="63" lbank="2" prog="46"/>
+ <Patch name="Singleline" cat="Ap" hbank="63" lbank="2" prog="47"/>
+ <Patch name="Free LFO" cat="Ap" hbank="63" lbank="2" prog="48"/>
+ <Patch name="Soft Lead" cat="Ap" hbank="63" lbank="2" prog="49"/>
+ <Patch name="PulseWound" cat="Ap" hbank="63" lbank="2" prog="50"/>
+ <Patch name="Big Drone" cat="Ap" hbank="63" lbank="2" prog="51"/>
+ <Patch name="Big Tune" cat="Ap" hbank="63" lbank="2" prog="52"/>
+ <Patch name="PowerWheel" cat="Ap" hbank="63" lbank="2" prog="53"/>
+ <Patch name="Flangefilt" cat="Ap" hbank="63" lbank="2" prog="54"/>
+ <Patch name="G-Funk" cat="Ap" hbank="63" lbank="2" prog="55"/>
+ <Patch name="Maria AT" cat="Ap" hbank="63" lbank="2" prog="56"/>
+ <Patch name="InThePast" cat="Ap" hbank="63" lbank="2" prog="57"/>
+ <Patch name="FatSawPad" cat="Ap" hbank="63" lbank="2" prog="58"/>
+ <Patch name="Wide Sweep" cat="Ap" hbank="63" lbank="2" prog="59"/>
+ <Patch name="Sunbeams" cat="Ap" hbank="63" lbank="2" prog="60"/>
+ <Patch name="BPFx" cat="Ap" hbank="63" lbank="2" prog="61"/>
+ <Patch name="FrozenPad" cat="Ap" hbank="63" lbank="2" prog="62"/>
+ <Patch name="MICHINOKU" cat="Ap" hbank="63" lbank="2" prog="63"/>
+ <Patch name="Esmeralda" cat="Ap" hbank="63" lbank="2" prog="64"/>
+ <Patch name="Romance" cat="Ap" hbank="63" lbank="2" prog="65"/>
+ <Patch name="Circle" cat="Ap" hbank="63" lbank="2" prog="66"/>
+ <Patch name="Dreamspher" cat="Ap" hbank="63" lbank="2" prog="67"/>
+ <Patch name="Silverlake" cat="Ap" hbank="63" lbank="2" prog="68"/>
+ <Patch name="Shadow" cat="Ap" hbank="63" lbank="2" prog="69"/>
+ <Patch name="Platinum" cat="Ap" hbank="63" lbank="2" prog="70"/>
+ <Patch name="Gently" cat="Ap" hbank="63" lbank="2" prog="71"/>
+ <Patch name="Warming" cat="Ap" hbank="63" lbank="2" prog="72"/>
+ <Patch name="PW-EMMY" cat="Ap" hbank="63" lbank="2" prog="73"/>
+ <Patch name="X-fade" cat="Ap" hbank="63" lbank="2" prog="74"/>
+ <Patch name="Pad Zosma" cat="Ap" hbank="63" lbank="2" prog="75"/>
+ <Patch name="NoizRezz" cat="Ap" hbank="63" lbank="2" prog="76"/>
+ <Patch name="Mira" cat="Ap" hbank="63" lbank="2" prog="77"/>
+ <Patch name="MultiPulse" cat="Ap" hbank="63" lbank="2" prog="78"/>
+ <Patch name="VoxWaves" cat="Ap" hbank="63" lbank="2" prog="79"/>
+ <Patch name="LazySweep" cat="Ap" hbank="63" lbank="2" prog="80"/>
+ <Patch name="Doomed" cat="Ap" hbank="63" lbank="2" prog="81"/>
+ <Patch name="PerkaVox" cat="Ap" hbank="63" lbank="2" prog="82"/>
+ <Patch name="Punchy" cat="Ap" hbank="63" lbank="2" prog="83"/>
+ <Patch name="Eyeliner" cat="Ap" hbank="63" lbank="2" prog="84"/>
+ <Patch name="Quieck" cat="Ap" hbank="63" lbank="2" prog="85"/>
+ <Patch name="Aladdin" cat="Ap" hbank="63" lbank="2" prog="86"/>
+ <Patch name="QuadSwell" cat="Ap" hbank="63" lbank="2" prog="87"/>
+ <Patch name="Lilley" cat="Ap" hbank="63" lbank="2" prog="88"/>
+ <Patch name="Pad Didje" cat="Ap" hbank="63" lbank="2" prog="89"/>
+ <Patch name="Baz" cat="Ap" hbank="63" lbank="2" prog="90"/>
+ <Patch name="RING PAD" cat="Ap" hbank="63" lbank="2" prog="91"/>
+ <Patch name="Chaser 1" cat="Ap" hbank="63" lbank="2" prog="92"/>
+ <Patch name="Chaser 2" cat="Ap" hbank="63" lbank="2" prog="93"/>
+ <Patch name="Spacebreat" cat="Ap" hbank="63" lbank="2" prog="94"/>
+ <Patch name="Long HiPa" cat="Ap" hbank="63" lbank="2" prog="95"/>
+ <Patch name="Action Y" cat="Ap" hbank="63" lbank="2" prog="96"/>
+ <Patch name="Trancelan" cat="Ap" hbank="63" lbank="2" prog="97"/>
+ <Patch name="Eternal" cat="Ap" hbank="63" lbank="2" prog="98"/>
+ <Patch name="VirtualSyn" cat="Ap" hbank="63" lbank="2" prog="99"/>
+ <Patch name="Interlude" cat="Ap" hbank="63" lbank="2" prog="100"/>
+ <Patch name="Flying" cat="Ap" hbank="63" lbank="2" prog="101"/>
+ <Patch name="TheSlayer" cat="Ap" hbank="63" lbank="2" prog="102"/>
+ <Patch name="White Rabb" cat="Ap" hbank="63" lbank="2" prog="103"/>
+ <Patch name="Siam Ududu" cat="Ap" hbank="63" lbank="2" prog="104"/>
+ <Patch name="Particle" cat="Ap" hbank="63" lbank="2" prog="105"/>
+ <Patch name="Shaper" cat="Ap" hbank="63" lbank="2" prog="106"/>
+ <Patch name="VintageArp" cat="Ap" hbank="63" lbank="2" prog="107"/>
+ <Patch name="Aah Dance" cat="Ap" hbank="63" lbank="2" prog="108"/>
+ <Patch name="Joker" cat="Ap" hbank="63" lbank="2" prog="109"/>
+ <Patch name="Holiday" cat="Ap" hbank="63" lbank="2" prog="110"/>
+ <Patch name="Android" cat="Ap" hbank="63" lbank="2" prog="111"/>
+ <Patch name="Spacious" cat="Ap" hbank="63" lbank="2" prog="112"/>
+ <Patch name="VoiceCuica" cat="Ap" hbank="63" lbank="2" prog="113"/>
+ <Patch name="Pop Arp" cat="Ap" hbank="63" lbank="2" prog="114"/>
+ <Patch name="Ping Pong" cat="Ap" hbank="63" lbank="2" prog="115"/>
+ <Patch name="Amoeba" cat="Ap" hbank="63" lbank="2" prog="116"/>
+ <Patch name="Landing" cat="Ap" hbank="63" lbank="2" prog="117"/>
+ <Patch name="I was born" cat="Ap" hbank="63" lbank="2" prog="118"/>
+ <Patch name="PsychoGtr" cat="Ap" hbank="63" lbank="2" prog="119"/>
+ <Patch name="NoGravity" cat="Ap" hbank="63" lbank="2" prog="120"/>
+ <Patch name="Pulser" cat="Ap" hbank="63" lbank="2" prog="121"/>
+ <Patch name="Racer" cat="Ap" hbank="63" lbank="2" prog="122"/>
+ <Patch name="Storm" cat="Ap" hbank="63" lbank="2" prog="123"/>
+ <Patch name="Oscillatin" cat="Ap" hbank="63" lbank="2" prog="124"/>
+ <Patch name="FamlyFeud " cat="Ap" hbank="63" lbank="2" prog="125"/>
+ <Patch name="WatrForest" cat="Ap" hbank="63" lbank="2" prog="126"/>
+ <Patch name="Spacecraft" cat="Ap" hbank="63" lbank="2" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="USER">
+ <Patch name="BriteS700" cat="Ap" hbank="63" lbank="8" prog="0"/>
+ <Patch name="Old Blues" cat="Ap" hbank="63" lbank="8" prog="1"/>
+ <Patch name="S700&amp;OldEp" cat="Ap" hbank="63" lbank="8" prog="2"/>
+ <Patch name="S700&amp;DX" cat="Ap" hbank="63" lbank="8" prog="3"/>
+ <Patch name="Bell Piano" cat="Ap" hbank="63" lbank="8" prog="4"/>
+ <Patch name="Dream" cat="Ap" hbank="63" lbank="8" prog="5"/>
+ <Patch name="Tomorrow" cat="Ap" hbank="63" lbank="8" prog="6"/>
+ <Patch name="Piano&amp;Pad" cat="Ap" hbank="63" lbank="8" prog="7"/>
+ <Patch name="CP80&amp;EP" cat="Ap" hbank="63" lbank="8" prog="8"/>
+ <Patch name="Yama EP's" cat="Ap" hbank="63" lbank="8" prog="9"/>
+ <Patch name="Mr. Klank" cat="Ap" hbank="63" lbank="8" prog="10"/>
+ <Patch name="Electro" cat="Ap" hbank="63" lbank="8" prog="11"/>
+ <Patch name="Satellite" cat="Ap" hbank="63" lbank="8" prog="12"/>
+ <Patch name="Partita" cat="Ap" hbank="63" lbank="8" prog="13"/>
+ <Patch name="Reed" cat="Ap" hbank="63" lbank="8" prog="14"/>
+ <Patch name="Org&amp;Voice" cat="Ap" hbank="63" lbank="8" prog="15"/>
+ <Patch name="Stingfingr" cat="Ap" hbank="63" lbank="8" prog="16"/>
+ <Patch name="Fat Low" cat="Ap" hbank="63" lbank="8" prog="17"/>
+ <Patch name="OB Saw" cat="Ap" hbank="63" lbank="8" prog="18"/>
+ <Patch name="Ana Decay" cat="Ap" hbank="63" lbank="8" prog="19"/>
+ <Patch name="MiniAnalog" cat="Ap" hbank="63" lbank="8" prog="20"/>
+ <Patch name="SimpleReso" cat="Ap" hbank="63" lbank="8" prog="21"/>
+ <Patch name="SyzStrng" cat="Ap" hbank="63" lbank="8" prog="22"/>
+ <Patch name="Real Harp" cat="Ap" hbank="63" lbank="8" prog="23"/>
+ <Patch name="Real Flute" cat="Ap" hbank="63" lbank="8" prog="24"/>
+ <Patch name="Twilight" cat="Ap" hbank="63" lbank="8" prog="25"/>
+ <Patch name="HighSine" cat="Ap" hbank="63" lbank="8" prog="26"/>
+ <Patch name="Hi Q Pad" cat="Ap" hbank="63" lbank="8" prog="27"/>
+ <Patch name="Snow Storm" cat="Ap" hbank="63" lbank="8" prog="28"/>
+ <Patch name="Classic" cat="Ap" hbank="63" lbank="8" prog="29"/>
+ <Patch name="Step Down" cat="Ap" hbank="63" lbank="8" prog="30"/>
+ <Patch name="Ens+Flute" cat="Ap" hbank="63" lbank="8" prog="31"/>
+ <Patch name="Polygroove" cat="Ap" hbank="63" lbank="8" prog="32"/>
+ <Patch name="ANbasicARP" cat="Ap" hbank="63" lbank="8" prog="33"/>
+ <Patch name="Pop Split" cat="Ap" hbank="63" lbank="8" prog="34"/>
+ <Patch name="Pianosyn" cat="Ap" hbank="63" lbank="8" prog="35"/>
+ <Patch name="Wake Up" cat="Ap" hbank="63" lbank="8" prog="36"/>
+ <Patch name="BackPad MW" cat="Ap" hbank="63" lbank="8" prog="37"/>
+ <Patch name="Poly Comp" cat="Ap" hbank="63" lbank="8" prog="38"/>
+ <Patch name="Surface" cat="Ap" hbank="63" lbank="8" prog="39"/>
+ <Patch name="HPF+LPFpad" cat="Ap" hbank="63" lbank="8" prog="40"/>
+ <Patch name="Hip Chordz" cat="Ap" hbank="63" lbank="8" prog="41"/>
+ <Patch name="CrushPadMW" cat="Ap" hbank="63" lbank="8" prog="42"/>
+ <Patch name="Warmest" cat="Ap" hbank="63" lbank="8" prog="43"/>
+ <Patch name="Sadness" cat="Ap" hbank="63" lbank="8" prog="44"/>
+ <Patch name="Bright Aah" cat="Ap" hbank="63" lbank="8" prog="45"/>
+ <Patch name="FatSwell" cat="Ap" hbank="63" lbank="8" prog="46"/>
+ <Patch name="Pearls" cat="Ap" hbank="63" lbank="8" prog="47"/>
+ <Patch name="Sonar Pad" cat="Ap" hbank="63" lbank="8" prog="48"/>
+ <Patch name="Alaska" cat="Ap" hbank="63" lbank="8" prog="49"/>
+ <Patch name="Happy Boy" cat="Ap" hbank="63" lbank="8" prog="50"/>
+ <Patch name="Whisperer" cat="Ap" hbank="63" lbank="8" prog="51"/>
+ <Patch name="Pad Bells" cat="Ap" hbank="63" lbank="8" prog="52"/>
+ <Patch name="Funky Mood" cat="Ap" hbank="63" lbank="8" prog="53"/>
+ <Patch name="For you!" cat="Ap" hbank="63" lbank="8" prog="54"/>
+ <Patch name="Gruvmaster" cat="Ap" hbank="63" lbank="8" prog="55"/>
+ <Patch name="PlucknGruv" cat="Ap" hbank="63" lbank="8" prog="56"/>
+ <Patch name="AllYouNeed" cat="Ap" hbank="63" lbank="8" prog="57"/>
+ <Patch name="Atlantis" cat="Ap" hbank="63" lbank="8" prog="58"/>
+ <Patch name="Pad&amp;Syn" cat="Ap" hbank="63" lbank="8" prog="59"/>
+ <Patch name="Warm AN" cat="Ap" hbank="63" lbank="8" prog="60"/>
+ <Patch name="BigOctave" cat="Ap" hbank="63" lbank="8" prog="61"/>
+ <Patch name="OldStrings" cat="Ap" hbank="63" lbank="8" prog="62"/>
+ <Patch name="Pro Lead" cat="Ap" hbank="63" lbank="8" prog="63"/>
+ <Patch name="Shine on" cat="Ap" hbank="63" lbank="8" prog="64"/>
+ <Patch name="Pianospher" cat="Ap" hbank="63" lbank="8" prog="65"/>
+ <Patch name="SuperStrgs" cat="Ap" hbank="63" lbank="8" prog="66"/>
+ <Patch name="Guitar&amp;Pad" cat="Ap" hbank="63" lbank="8" prog="67"/>
+ <Patch name="PluckPno" cat="Ap" hbank="63" lbank="8" prog="68"/>
+ <Patch name="Softstars" cat="Ap" hbank="63" lbank="8" prog="69"/>
+ <Patch name="Soft Tar" cat="Ap" hbank="63" lbank="8" prog="70"/>
+ <Patch name="Sorted" cat="Ap" hbank="63" lbank="8" prog="71"/>
+ <Patch name="Trendy" cat="Ap" hbank="63" lbank="8" prog="72"/>
+ <Patch name="Wah Feed" cat="Ap" hbank="63" lbank="8" prog="73"/>
+ <Patch name="S&amp;H Didge" cat="Ap" hbank="63" lbank="8" prog="74"/>
+ <Patch name="Old House" cat="Ap" hbank="63" lbank="8" prog="75"/>
+ <Patch name="HPF Dance" cat="Ap" hbank="63" lbank="8" prog="76"/>
+ <Patch name="Exodus" cat="Ap" hbank="63" lbank="8" prog="77"/>
+ <Patch name="S/H Gruv" cat="Ap" hbank="63" lbank="8" prog="78"/>
+ <Patch name="Dark Light" cat="Ap" hbank="63" lbank="8" prog="79"/>
+ <Patch name="Boom Bass" cat="Ap" hbank="63" lbank="8" prog="80"/>
+ <Patch name="Shandala" cat="Ap" hbank="63" lbank="8" prog="81"/>
+ <Patch name="Titan" cat="Ap" hbank="63" lbank="8" prog="82"/>
+ <Patch name="Puls Step" cat="Ap" hbank="63" lbank="8" prog="83"/>
+ <Patch name="Big Lead " cat="Ap" hbank="63" lbank="8" prog="84"/>
+ <Patch name="Squeaky" cat="Ap" hbank="63" lbank="8" prog="85"/>
+ <Patch name="Auto Wah" cat="Ap" hbank="63" lbank="8" prog="86"/>
+ <Patch name="MetalPiano" cat="Ap" hbank="63" lbank="8" prog="87"/>
+ <Patch name="BrokenStar" cat="Ap" hbank="63" lbank="8" prog="88"/>
+ <Patch name="Smooth" cat="Ap" hbank="63" lbank="8" prog="89"/>
+ <Patch name="Fuzzline" cat="Ap" hbank="63" lbank="8" prog="90"/>
+ <Patch name="Brief" cat="Ap" hbank="63" lbank="8" prog="91"/>
+ <Patch name="Dist-MW" cat="Ap" hbank="63" lbank="8" prog="92"/>
+ <Patch name="Hit&amp;Down" cat="Ap" hbank="63" lbank="8" prog="93"/>
+ <Patch name="Sand" cat="Ap" hbank="63" lbank="8" prog="94"/>
+ <Patch name="R&amp;B Steel" cat="Ap" hbank="63" lbank="8" prog="95"/>
+ <Patch name="LoSnake" cat="Ap" hbank="63" lbank="8" prog="96"/>
+ <Patch name="Additive" cat="Ap" hbank="63" lbank="8" prog="97"/>
+ <Patch name="Rap Lead 1" cat="Ap" hbank="63" lbank="8" prog="98"/>
+ <Patch name="Orch Hits" cat="Ap" hbank="63" lbank="8" prog="99"/>
+ <Patch name="Melo Trmlo" cat="Ap" hbank="63" lbank="8" prog="100"/>
+ <Patch name="DigiGrand2" cat="Ap" hbank="63" lbank="8" prog="101"/>
+ <Patch name="CheapEP" cat="Ap" hbank="63" lbank="8" prog="102"/>
+ <Patch name="AnaMarcato" cat="Ap" hbank="63" lbank="8" prog="103"/>
+ <Patch name="Evolve" cat="Ap" hbank="63" lbank="8" prog="104"/>
+ <Patch name="Wazzo" cat="Ap" hbank="63" lbank="8" prog="105"/>
+ <Patch name="Rap Lead 2" cat="Ap" hbank="63" lbank="8" prog="106"/>
+ <Patch name="Early Lead" cat="Ap" hbank="63" lbank="8" prog="107"/>
+ <Patch name="BDScrtch" cat="Ap" hbank="63" lbank="8" prog="108"/>
+ <Patch name="Mayday MW" cat="Ap" hbank="63" lbank="8" prog="109"/>
+ <Patch name="CoolWAH" cat="Ap" hbank="63" lbank="8" prog="110"/>
+ <Patch name="HipWahEP" cat="Ap" hbank="63" lbank="8" prog="111"/>
+ <Patch name="Rap Lead 3" cat="Ap" hbank="63" lbank="8" prog="112"/>
+ <Patch name="DarkBass" cat="Ap" hbank="63" lbank="8" prog="113"/>
+ <Patch name="HiPaWheel" cat="Ap" hbank="63" lbank="8" prog="114"/>
+ <Patch name="Pierced" cat="Ap" hbank="63" lbank="8" prog="115"/>
+ <Patch name="PortaBass" cat="Ap" hbank="63" lbank="8" prog="116"/>
+ <Patch name="Sine Lead" cat="Ap" hbank="63" lbank="8" prog="117"/>
+ <Patch name="UK Oam" cat="Ap" hbank="63" lbank="8" prog="118"/>
+ <Patch name="Rap" cat="Ap" hbank="63" lbank="8" prog="119"/>
+ <Patch name="Toyz" cat="Ap" hbank="63" lbank="8" prog="120"/>
+ <Patch name="Future Z" cat="Ap" hbank="63" lbank="8" prog="121"/>
+ <Patch name="Dead?Alive" cat="Ap" hbank="63" lbank="8" prog="122"/>
+ <Patch name="SlowSuckr" cat="Ap" hbank="63" lbank="8" prog="123"/>
+ <Patch name="Munchkins" cat="Ap" hbank="63" lbank="8" prog="124"/>
+ <Patch name="Snoop Bass" cat="Ap" hbank="63" lbank="8" prog="125"/>
+ <Patch name="BabeMagnet" cat="Ap" hbank="63" lbank="8" prog="126"/>
+ <Patch name="Rabino Hip" cat="Ap" hbank="63" lbank="8" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="GM">
+ <Patch name="NaturlGrnd" cat="Ap" hbank="0" lbank="0" prog="0"/>
+ <Patch name="Rock Brite" cat="Ap" hbank="0" lbank="0" prog="1"/>
+ <Patch name="CP 2001" cat="Ap" hbank="0" lbank="0" prog="2"/>
+ <Patch name="Honkytonk" cat="Ap" hbank="0" lbank="0" prog="3"/>
+ <Patch name="E.Piano 1" cat="Ap" hbank="0" lbank="0" prog="4"/>
+ <Patch name="E.Piano 2" cat="Ap" hbank="0" lbank="0" prog="5"/>
+ <Patch name="Harpsicord" cat="Ap" hbank="0" lbank="0" prog="6"/>
+ <Patch name="Brite" cat="Ap" hbank="0" lbank="0" prog="7"/>
+ <Patch name="Clav" cat="Ap" hbank="0" lbank="0" prog="8"/>
+ <Patch name="Celeste" cat="Ap" hbank="0" lbank="0" prog="9"/>
+ <Patch name="Glocken" cat="Ap" hbank="0" lbank="0" prog="10"/>
+ <Patch name="Music Box" cat="Ap" hbank="0" lbank="0" prog="11"/>
+ <Patch name="Vibes" cat="Ap" hbank="0" lbank="0" prog="12"/>
+ <Patch name="Marimba" cat="Ap" hbank="0" lbank="0" prog="13"/>
+ <Patch name="Xylophone" cat="Ap" hbank="0" lbank="0" prog="14"/>
+ <Patch name="TublarBell" cat="Ap" hbank="0" lbank="0" prog="15"/>
+ <Patch name="Dulcimar" cat="Ap" hbank="0" lbank="0" prog="16"/>
+ <Patch name="Draw Organ" cat="Ap" hbank="0" lbank="0" prog="17"/>
+ <Patch name="Perc Organ" cat="Ap" hbank="0" lbank="0" prog="18"/>
+ <Patch name="Rock Organ" cat="Ap" hbank="0" lbank="0" prog="19"/>
+ <Patch name="ChurchOrgn" cat="Ap" hbank="0" lbank="0" prog="20"/>
+ <Patch name="Reed Organ" cat="Ap" hbank="0" lbank="0" prog="21"/>
+ <Patch name="Accordion" cat="Ap" hbank="0" lbank="0" prog="22"/>
+ <Patch name="Harmonica" cat="Ap" hbank="0" lbank="0" prog="23"/>
+ <Patch name="TangoAccrd" cat="Ap" hbank="0" lbank="0" prog="24"/>
+ <Patch name="Nylon" cat="Ap" hbank="0" lbank="0" prog="25"/>
+ <Patch name="Steel" cat="Ap" hbank="0" lbank="0" prog="26"/>
+ <Patch name="ModernJazz" cat="Ap" hbank="0" lbank="0" prog="27"/>
+ <Patch name="Clean" cat="Ap" hbank="0" lbank="0" prog="28"/>
+ <Patch name="Mute" cat="Ap" hbank="0" lbank="0" prog="29"/>
+ <Patch name="Overdrive" cat="Ap" hbank="0" lbank="0" prog="30"/>
+ <Patch name="Distortion" cat="Ap" hbank="0" lbank="0" prog="31"/>
+ <Patch name="Harmonics" cat="Ap" hbank="0" lbank="0" prog="32"/>
+ <Patch name="Accoustic" cat="Ap" hbank="0" lbank="0" prog="33"/>
+ <Patch name="FingerBass" cat="Ap" hbank="0" lbank="0" prog="34"/>
+ <Patch name="Pick Bass" cat="Ap" hbank="0" lbank="0" prog="35"/>
+ <Patch name="Fretless 2" cat="Ap" hbank="0" lbank="0" prog="36"/>
+ <Patch name="SimpleSlap" cat="Ap" hbank="0" lbank="0" prog="37"/>
+ <Patch name="Velo Slap" cat="Ap" hbank="0" lbank="0" prog="38"/>
+ <Patch name="SynthBass1" cat="Ap" hbank="0" lbank="0" prog="39"/>
+ <Patch name="SynthBass2" cat="Ap" hbank="0" lbank="0" prog="40"/>
+ <Patch name="Violin 2" cat="Ap" hbank="0" lbank="0" prog="41"/>
+ <Patch name="Viola 2" cat="Ap" hbank="0" lbank="0" prog="42"/>
+ <Patch name="Cello 2" cat="Ap" hbank="0" lbank="0" prog="43"/>
+ <Patch name="Contrabass" cat="Ap" hbank="0" lbank="0" prog="44"/>
+ <Patch name="TremoloStr" cat="Ap" hbank="0" lbank="0" prog="45"/>
+ <Patch name="Pizz Harp" cat="Ap" hbank="0" lbank="0" prog="46"/>
+ <Patch name="Timpni+Cym" cat="Ap" hbank="0" lbank="0" prog="47"/>
+ <Patch name="StereoSt1" cat="Ap" hbank="0" lbank="0" prog="48"/>
+ <Patch name="StereoSt2" cat="Ap" hbank="0" lbank="0" prog="49"/>
+ <Patch name="Grand Saw" cat="Ap" hbank="0" lbank="0" prog="50"/>
+ <Patch name="SynStrings" cat="Ap" hbank="0" lbank="0" prog="51"/>
+ <Patch name="Aah Choir" cat="Ap" hbank="0" lbank="0" prog="52"/>
+ <Patch name="Ooh Choir" cat="Ap" hbank="0" lbank="0" prog="53"/>
+ <Patch name="Syn Voice" cat="Ap" hbank="0" lbank="0" prog="54"/>
+ <Patch name="Orch.Hit" cat="Ap" hbank="0" lbank="0" prog="55"/>
+ <Patch name="Trumpet" cat="Ap" hbank="0" lbank="0" prog="56"/>
+ <Patch name="Trombone 2" cat="Ap" hbank="0" lbank="0" prog="57"/>
+ <Patch name="Tuba" cat="Ap" hbank="0" lbank="0" prog="58"/>
+ <Patch name="MuteTrpt 2" cat="Ap" hbank="0" lbank="0" prog="59"/>
+ <Patch name="F.Horns" cat="Ap" hbank="0" lbank="0" prog="60"/>
+ <Patch name="Brass Sect" cat="Ap" hbank="0" lbank="0" prog="61"/>
+ <Patch name="SynthBrass" cat="Ap" hbank="0" lbank="0" prog="62"/>
+ <Patch name="Soft Brass" cat="Ap" hbank="0" lbank="0" prog="63"/>
+ <Patch name="Soprano 2" cat="Ap" hbank="0" lbank="0" prog="64"/>
+ <Patch name="Alto Sax" cat="Ap" hbank="0" lbank="0" prog="65"/>
+ <Patch name="TenorSax 2" cat="Ap" hbank="0" lbank="0" prog="66"/>
+ <Patch name="Bari Sax" cat="Ap" hbank="0" lbank="0" prog="67"/>
+ <Patch name="Oboe" cat="Ap" hbank="0" lbank="0" prog="68"/>
+ <Patch name="Eng.Horn" cat="Ap" hbank="0" lbank="0" prog="69"/>
+ <Patch name="Bassoon" cat="Ap" hbank="0" lbank="0" prog="70"/>
+ <Patch name="Clarinet" cat="Ap" hbank="0" lbank="0" prog="71"/>
+ <Patch name="Piccolo" cat="Ap" hbank="0" lbank="0" prog="72"/>
+ <Patch name="Flute" cat="Ap" hbank="0" lbank="0" prog="73"/>
+ <Patch name="Recorder" cat="Ap" hbank="0" lbank="0" prog="74"/>
+ <Patch name="Panflute" cat="Ap" hbank="0" lbank="0" prog="75"/>
+ <Patch name="Bottle" cat="Ap" hbank="0" lbank="0" prog="76"/>
+ <Patch name="Shakuhachi" cat="Ap" hbank="0" lbank="0" prog="77"/>
+ <Patch name="Whistle" cat="Ap" hbank="0" lbank="0" prog="78"/>
+ <Patch name="Ocarina" cat="Ap" hbank="0" lbank="0" prog="79"/>
+ <Patch name="Square Ld" cat="Ap" hbank="0" lbank="0" prog="80"/>
+ <Patch name="Saw Ld" cat="Ap" hbank="0" lbank="0" prog="81"/>
+ <Patch name="Caliop Ld" cat="Ap" hbank="0" lbank="0" prog="82"/>
+ <Patch name="Chiff Ld" cat="Ap" hbank="0" lbank="0" prog="83"/>
+ <Patch name="Charan Ld" cat="Ap" hbank="0" lbank="0" prog="84"/>
+ <Patch name="Voice Ld" cat="Ap" hbank="0" lbank="0" prog="85"/>
+ <Patch name="Fifth Ld" cat="Ap" hbank="0" lbank="0" prog="86"/>
+ <Patch name="Bass&amp;Ld" cat="Ap" hbank="0" lbank="0" prog="87"/>
+ <Patch name="New Age" cat="Ap" hbank="0" lbank="0" prog="88"/>
+ <Patch name="Warm Pad" cat="Ap" hbank="0" lbank="0" prog="89"/>
+ <Patch name="Poly Synth" cat="Ap" hbank="0" lbank="0" prog="90"/>
+ <Patch name="Choir Pad" cat="Ap" hbank="0" lbank="0" prog="91"/>
+ <Patch name="BowedPad" cat="Ap" hbank="0" lbank="0" prog="92"/>
+ <Patch name="Metal Pad" cat="Ap" hbank="0" lbank="0" prog="93"/>
+ <Patch name="Halo Pad" cat="Ap" hbank="0" lbank="0" prog="94"/>
+ <Patch name="Sweep Pad" cat="Ap" hbank="0" lbank="0" prog="95"/>
+ <Patch name="Rain Pad" cat="Ap" hbank="0" lbank="0" prog="96"/>
+ <Patch name="SoundTrack" cat="Ap" hbank="0" lbank="0" prog="97"/>
+ <Patch name="Crystal" cat="Ap" hbank="0" lbank="0" prog="98"/>
+ <Patch name="Atmosphere" cat="Ap" hbank="0" lbank="0" prog="99"/>
+ <Patch name="Brightness" cat="Ap" hbank="0" lbank="0" prog="100"/>
+ <Patch name="Goblin" cat="Ap" hbank="0" lbank="0" prog="101"/>
+ <Patch name="Echoes" cat="Ap" hbank="0" lbank="0" prog="102"/>
+ <Patch name="Sci-Fi" cat="Ap" hbank="0" lbank="0" prog="103"/>
+ <Patch name="Sitar" cat="Ap" hbank="0" lbank="0" prog="104"/>
+ <Patch name="Banjo" cat="Ap" hbank="0" lbank="0" prog="105"/>
+ <Patch name="Shamisen" cat="Ap" hbank="0" lbank="0" prog="106"/>
+ <Patch name="Koto" cat="Ap" hbank="0" lbank="0" prog="107"/>
+ <Patch name="Kalimba" cat="Ap" hbank="0" lbank="0" prog="108"/>
+ <Patch name="Bagpipe" cat="Ap" hbank="0" lbank="0" prog="109"/>
+ <Patch name="Fiddle" cat="Ap" hbank="0" lbank="0" prog="110"/>
+ <Patch name="Shanai" cat="Ap" hbank="0" lbank="0" prog="111"/>
+ <Patch name="Tinkerbel" cat="Ap" hbank="0" lbank="0" prog="112"/>
+ <Patch name="Agogo" cat="Ap" hbank="0" lbank="0" prog="113"/>
+ <Patch name="Steeldrum" cat="Ap" hbank="0" lbank="0" prog="114"/>
+ <Patch name="Woodblock" cat="Ap" hbank="0" lbank="0" prog="115"/>
+ <Patch name="TaikoDrum" cat="Ap" hbank="0" lbank="0" prog="116"/>
+ <Patch name="MelodicTom" cat="Ap" hbank="0" lbank="0" prog="117"/>
+ <Patch name="Synth Drum" cat="Ap" hbank="0" lbank="0" prog="118"/>
+ <Patch name="Rev Cymbal" cat="Ap" hbank="0" lbank="0" prog="119"/>
+ <Patch name="Fret Noise" cat="Ap" hbank="0" lbank="0" prog="120"/>
+ <Patch name="BreathNoiz" cat="Ap" hbank="0" lbank="0" prog="121"/>
+ <Patch name="Seashore" cat="Ap" hbank="0" lbank="0" prog="122"/>
+ <Patch name="Tweet" cat="Ap" hbank="0" lbank="0" prog="123"/>
+ <Patch name="Telephone" cat="Ap" hbank="0" lbank="0" prog="124"/>
+ <Patch name="Helicopter" cat="Ap" hbank="0" lbank="0" prog="125"/>
+ <Patch name="Applause" cat="Ap" hbank="0" lbank="0" prog="126"/>
+ <Patch name="Gunshot" cat="Ap" hbank="63" lbank="1" prog="127"/>
+ </PatchGroup>
+
+ <PatchGroup name="Drum Kits">
+ <drummap name="PoweredStd" hbank="63" lbank="32" prog="0">
+ <entry><name>Clave</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdBrMtSt</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdBrSwrSt</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdBrMt2St</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Castanet</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdNm1St</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>Stick</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdFkSonSt</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdBsSt1-3</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdLoSt</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdHSonSt</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdClRmSt</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdSonSt1-4</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdLdwSt1-4</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomFlSt</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClFtSt</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomLoSt</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHHlf2St</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomLoSt</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOp2St</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomMdSt</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomMdSt</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSt</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomHiSt</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaSt</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupSt</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnSw</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashSt</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbell2</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashRL</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideRL</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaOp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>TumbaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdBlL1-3</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdLdwSt1-4</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdBhR1-3</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdHipSt1-2</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdLoSt</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdLdwHMono</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdR&amp;B1</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdHeavy</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdRoom1</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdAmb</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdFkSonSt</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdRoom2</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="DryStandrd" hbank="63" lbank="32" prog="1">
+ <entry><name>Clave</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdBrMtSt</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdBrSwrSt</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdBrMt2St</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Castanet</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdNm1St</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>Stick</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdFkSt1-2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdBsSt2-3</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdHiSt</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdNmSt1-2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdClRmSt</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdNmSt1-4</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdBsSt1-2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomFlSt</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClSt1-4</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomLoSt</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdlSt</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomLoSt</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpSt</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomMdSt</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomMdSt</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSt</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomHiSt</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaSt</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupSt</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnSw</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashSt</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbell2</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashRL</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideRL</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaOp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>TumbaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdBlL1-3</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdLdwSt1-4</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdBhR1-3</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdHipSt1-2</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdLoSt</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdLdwHMono</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdR&amp;B1</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdHeavy</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdRoom1</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdAmb</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdFkSonSt</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdRoom2</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="RockSt1" hbank="63" lbank="32" prog="2">
+ <entry><name>AnaClick</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdBrMtSt</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdBrSwrSt</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdBrMt2St</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRkRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Castanet</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdRkOp1St</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>Stick</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdNmSt1-2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdRkRim1St</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdHiSt</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdRk1St</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdRkStk1St</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdRkOp1St</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapSt</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdRkMte1St</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomRkLoSt</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClRkStSw</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomRkLoSt</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdRkStSw</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomRkMdSt</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpRkStSw</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomRkMdSt</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomRkHiSt</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSt</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomRkHiSt</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaSt</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupSt</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashSt</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdRkFlmSt</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdRkRim2St</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdRkMte2St</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdFk1St</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdRkRolDSt</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdHSonSt</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdLdwSt1-4</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdFkSonSt</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdSon3St</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdFkR1-2</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdHSonSt</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="RockSt2" hbank="63" lbank="32" prog="3">
+ <entry><name>AnaClick</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdBrMtSt</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdBrSwrSt</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdBrMt2St</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRkRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Castanet</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>Stick</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdLoSt</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdRkRim2St</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdNm2St</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdRk2St</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdRkStk2St</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapSt</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdRkMte2St</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomRkLoSt</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClRk2St</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomRkLoSt</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHHfOpRkSt</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomRkMdSt</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpRkSt</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomRkMdSt</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomRkHiSt</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSt</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomRkHiSt</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaSt</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupSt</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashSt</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdRkFlmSt</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdRkOp1St</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdRkRim1St</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdRkMte1St</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdRk1St</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdRkRolDSt</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdFk2St</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdLdwSt1-4</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdHiSt</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdSon4St</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdLSonSt</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdRk1St</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="RockMono1" hbank="63" lbank="32" prog="4">
+ <entry><name>AnaClick</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdBrMtL</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdBrSwrL</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdBrMt2L</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdBrSwrAtL</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolL</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Castanet</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdLdwL1-4</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>Stick</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdDry1</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdBh3R</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdNm2R</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdRoom3</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdClRim2</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdSon3L</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapL</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdSon4R</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomFlL</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClRk2R</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomLoL</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdlRkR</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomMdL</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpRkR</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomMdL</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomHiR</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashL</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomHiR</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideMono</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaSt</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono2</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnSw</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashR</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashL</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideMono</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdClRmR</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdHeavy</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdRkRim1R</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdLdwHMono</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdRk2L</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdHipR1-2</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdBreakHrd</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdLdw4R</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdHiL</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdBhR1-3</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdFkHL</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdFkSonL</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Hip Hop1" hbank="63" lbank="32" prog="5">
+ <entry><name>SdHpStk2</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>VoxHitRev</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>TurnTable</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HitBrass</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>ScratchSdR</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolR</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>ClaveT8</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdHip2R</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdHpStk6R</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdHipDp</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdDodgL</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT8-3</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT8-2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdHpStk2</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdClpAna</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapR</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdR&amp;B2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT8</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT8-1</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT8</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT8</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT8</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT8</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>Crash2</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideR</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CrashT8</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>RideT9</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashR</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>MamboBdy</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideT9</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoHi</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>ShakerHip1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MarcsT8</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>ClaveT8</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdHipStk8</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdJngl3</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>HandClapR</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdHipRm5</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>Scratch H</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>Scratch L</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>ScratchHiR</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>ScratchBdF</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>ScratchCmb</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>ScratchVoR</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdBreak2</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Hip Hop2" hbank="63" lbank="32" prog="6">
+ <entry><name>BdT8-3</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdHip1</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>ClapT9</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdSyn</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolR</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdHpStk4</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>DjembeEd</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdHpStk6St</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT8-1</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdR&amp;B1Rm</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdBreakHvy</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdHipDp</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT8-4</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdHip3</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapSt</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdLofi</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomFlR</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClLoFi</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomLoL</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHClBreak</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomLoL</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpLoFi</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomLoL</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomHiL</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>Crash</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomHiL</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>China</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>CowBelRX11</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashR</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideT9</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>RadioNz</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>RadioNz</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MarcsT8</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FxGun2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>FxGun1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>ScratchSpn</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchStp</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>ClaveT8</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>DoorSqk</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HiQ2</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>ScratchBdF</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>ScratchBdR</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>TambrnHit</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdHuman2</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdBreakRol</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>StabHard</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdJngl1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdRk1St</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>Wataiko</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>HH Hit</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>StabOrgan2</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>Sonar1</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>TurnTable</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>Police</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="HipStick1" hbank="63" lbank="32" prog="7">
+ <entry><name>SdHipRm4</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>HiQ1</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>TurnTable</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HitOrch1</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>ScratchBdR</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolR</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>AnaClick</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdHipRm3</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdAnCRRim</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdHipDp</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdAnSmRim</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT8-3</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT8-2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdHpStk1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapR</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdHpStk2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT8</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT8-1</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT8</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT8</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT8</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT8</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>Crash2</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideR</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CrashT8</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>RideT9</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashR</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>MamboBdy</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideT9</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>ShakerHip1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdAnSm</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdClRim3</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>AnaClick</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdClRim2</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>Scratch H</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>Scratch L</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>ScratchHiR</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>ScratchBdF</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>ScratchCmb</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>ScratchVoR</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdJngl2</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="T9HipKit1" hbank="63" lbank="32" prog="8">
+ <entry><name>ClaveT8</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdT9-5</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>TurnTable</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>Quiek</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>ScratchCb3</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolL</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>AnaClick</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdT9Gate</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdRimSE</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT9-3</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdT9-3</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT9-2</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT9-1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT9Rim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdT9-5</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdT9-4</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT9</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT9</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT9</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT9</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CrashT9</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>RideT9</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>CrashT9</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>CowBelAnCR</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideT9</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdT9Rim</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdT9Gate</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>HandClapSt</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdT9-5</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>Scratch H</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>Scratch L</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>ScratchHiF</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>ScratchHiR</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>ScratchLoF</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>ScratchLoR</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdT9Hd1</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="R&amp;B Kit1" hbank="63" lbank="32" prog="9">
+ <entry><name>BdT9Hd3</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdAnCR</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdAnSmRim</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdClpAna</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdT9Gate</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRollMono</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdTimber</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdFMRim</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdJnglFx</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdVar1</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdHipRm1</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT8-2</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdZapMid</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdHipRm2</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapSt</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdAnCR</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>BdT8-3</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT8-2</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>BdT8-3</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHClAnCR</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>BdT8-3</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT8-2</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>BdT8-3</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>BdT8-3</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>Crash</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>BdT8-3</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>China</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>HiQ1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>HiQ1</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>AnaShaker</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>VoxDrum</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>VoxDrum</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>HiQ1</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>HiQ2</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>ClaveT8</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HiQ1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>ScratchSpn</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>ScratchHiR</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>ScratchHiF</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>TambrnHit</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdBreakRol</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Mother</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>VoxBell</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdR&amp;B1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>VoxAlk</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>Udo Hi</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>TranCho</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>Swarm</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdPop</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdR&amp;B1Rm</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdR&amp;B2</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>Crash</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="R&amp;B Kit2" hbank="63" lbank="32" prog="1o">
+ <entry><name>BdRoom1</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>AnaClick</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdHpStk4</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>QuintTip</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>PickNoise1</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdT9Rim</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdNmSt1-4</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdR&amp;B1Rm</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdNmSt1-2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdFk3R</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT8-3</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdR&amp;B1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdClRim3</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdPcRim</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapSt</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdR&amp;B1Rm</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>BdT8-3</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT8-2</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>BdT8-3</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHClT8-1</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>BdT8-3</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT8-2</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>BdT8-3</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT8</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSt</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaSt</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupSt</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnSw</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>HiQ1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>HiQ1</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AnaShaker</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>AnaShaker</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>VoxDrum</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>VoxDrum</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>HiQ1</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>HiQ2</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>ClaveT8</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HiQ1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>ScratchSpn</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>ScratchHiR</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>ScratchHiF</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>TambrnHit</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdLofi</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdRkStk2St</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdPicol</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdR&amp;B2</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdR&amp;B2</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdFM</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdHipDp</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdHammer</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdSlimy</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>HHHit</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdT8-3</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>TurnTable</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="AnalogT9" hbank="63" lbank="32" prog="11">
+ <entry><name>BdT9-2</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdAnCR</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdT9-5</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>ClapAnSm</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdT9Gate</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRkRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdT9-3</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdT9-4</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdT9Gate</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT9-4</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdT9-5</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT9-1</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT9-3</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT9Rim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdT9-1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdT9-2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT9</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT9</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT9</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT9</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>China</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>Crash2</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideR</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>CongaT8</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>CongaT8</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AnaClick</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>CongaT8</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FxGun2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>FxGun1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>ScratchH</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>HiQ1</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HiQ1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HiQ2</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>ScratchL</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>ScratchL</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdPicol</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdT8-5</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdRkRolDSt</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdBrMt2St</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdBlpHd</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdJngl1</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdSus</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdD&amp;B1</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdBreak2</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdDist</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdTekPower</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdDistRM</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="AnalogT8" hbank="63" lbank="32" prog="12">
+ <entry><name>BdT8-1</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdAnCR</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdT8-4</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdClpAna</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdT8-3</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>TomT8</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdT8-5</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>BdT8-3</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdT8-4</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT8-2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdT8-3</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>T8KickBass</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT8-1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdT8-2</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdT8-1</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT8</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT8-2</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT8</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT8</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT8</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT8</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT8</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>China</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashR</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>CowBelT8</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>Crash2</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideR</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>CongaT8</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>CongaT8</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaT8</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaT8</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaT8</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TimbaleLo1</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>Glass</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>Glass</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MarcsT8</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FxGun2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>FxGun1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>AnaShaker</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>AnaShaker</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>ClaveT8</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HiQ1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HiQ2</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch L</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Scratch L</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdHip1</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdHip2</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdHipGate</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdBreak1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdBlip</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdFx1</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdFxHmr</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdHammer</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdZapHrd</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdDodgL</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdTekPower</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdSlimy</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Tekno Kit" hbank="63" lbank="32" prog="13">
+ <entry><name>BdSlimy</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdT9Rim</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdT8-5</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>ClapT9</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdT9-3</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdHuman1</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdHip3</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdT9-4</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdHip2</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdThkSkn</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdT9-2</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdDist4</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdZapMid</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdT8-5</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdSyn</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT8</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClLoFi</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT8</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpLoFi</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT8</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpLoFi</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT8</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT8</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT8</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>Crash</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnAnCR</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>CrashL</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>CowBelT8</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>CrashSyn</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>CongaT8</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>CongaT8</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaT8</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaT8</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaT8</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>Glass</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>Glass</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MarcsT8</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FxGun2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>FxGun1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>Scratch H</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>HiQ1</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HiQ1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HiQ2</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch L</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Scratch L</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>DjembeEd</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Wataiko</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>StabHard</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>HitOrch1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>StabOrgan2</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdRk1St</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>HH Hit</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>Wataiko</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>Sonar1</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>TurnTable</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>Police</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="House Kit1" hbank="63" lbank="32" prog="14">
+ <entry><name>BdT9-4</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdT8-5</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HandClapSt</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdDodgL</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdT9-3</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdT8-1</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdT9-5</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT9-1</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdT9Gate</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT9-2</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT9-3</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT9Rim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdT9-1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdT9-2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT8-1</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT9</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT9</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT9</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>Crash</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>VoxDrum</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>VoxDrum</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdBreakRol</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Mother</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>VoxBell</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdR&amp;B1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>VoxAlk</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>Udo Hi</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>TranCho</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>Swarm</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdPop</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdR&amp;B1Rm</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdR&amp;B2</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>Crash</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="House Kit2" hbank="63" lbank="32" prog="15">
+ <entry><name>BdT9-2</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>ClapT9</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdT9-2</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdT9Gate</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdHuman2</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdFx1</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdLofi</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT9Hd2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdT9Rim</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT9-3</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT9Hd1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT9Rim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdWood</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>NzBurst</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>Zap2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>SdSyn</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT9</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>SdSyn</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT9</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>SdSyn</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT9</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>SdSyn</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>SdSyn</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT9</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>SdSyn</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CrashSyn</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>CrashT8</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>Crash</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaHeel</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TomSyn1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TomSyn1</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AnaClick</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>SdRimSE</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>VoxDrum</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>VoxDrum</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>TambrnAnCR</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>AnaShaker</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>ClaveT8</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>CowBelRX11</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>AnaShaker</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>ScratchHiF</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>TabraBya</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>TabraNah</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>TablaMut</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>VoxBell</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdPop</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>Udo Hi</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdFXGate</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>Mother</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdT9-1</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdBreakRol</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>Crash</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>TurnTable</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Big Kit" hbank="63" lbank="32" prog="16">
+ <entry><name>BdFXGate</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>BongoLo2</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdGM</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HandClapSt</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdGate2</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRkRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdRkRim1St</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdPicol</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdRkFlmSt</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdRoom2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdRkStk1St</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdRoom3</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdGate</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdMdRim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdGate1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapAnSm</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdAmb</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomAmbLo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClD&amp;B</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomAmbLo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdlD&amp;B</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomAmbLo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpD&amp;B</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomAmbHi</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomAmbHi</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSt</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomAmbHi</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaSt</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>Bd+HH</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>Bd+HH</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FxGun2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>FxGun1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>Scratch H</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch L</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Scratch L</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdDist</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdFM</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdFMRim</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdClappy</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdRoom3</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdTimber</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdRk1St</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdRimSE</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdRk2St</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdBreakRol</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdD&amp;B1</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdRoom2</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Break Kit" hbank="63" lbank="32" prog="17">
+ <entry><name>BdBrkDp</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdHip1St</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdLofi</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdClappy</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdLdwHMono</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRkRolDSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdGate1</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdMid</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdBrRim</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdBreakHvy</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdHipRm4</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdBreak2</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdBreak1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdHipRm1</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdBreak3</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>SdBreak1</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdBreak2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomLoSt</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClRkSR</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomLoSt</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdlRkR</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomLoSt</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHHlfOpRkR</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomHiSt</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomHiSt</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashL</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomHiSt</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideL</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaL</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashR</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelRX11</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideMono</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>CongaOp</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>TimbaleLo1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>Scratch H</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch L</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Scratch L</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>TurnTable</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdBreakRol</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Mother</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>Mind Bell</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdFx1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdRk2St</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>LfoSeq</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>Ripper</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>NzBurst</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>Police</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>Fairwave</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>Swarm</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>RadioNz</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Drum'nBass" hbank="63" lbank="32" prog="18">
+ <entry><name>BdHipDp</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>BongoLo2</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdR&amp;B2</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdTimber</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdD&amp;B3</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdHammer</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Glass</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>BdD&amp;B2</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>HHPdlSt</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdHipDp</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>HHOp2St</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdD&amp;B1</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdD&amp;B2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdMdRim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdD&amp;B1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>NzBurst</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdD&amp;B2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomAmbLo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClD&amp;B</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomAmbLo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdlD&amp;B</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomAmbLo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpD&amp;B</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomAmbHi</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomAmbHi</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashL</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomAmbHi</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>China</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>SdD&amp;B4</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>HHRvD&amp;B</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FxGun2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>FxGun1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>Sine</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>Sine</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>P50-1</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>PlyFxSl17S</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TurnTable</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdDist</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdFM</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdFMRim</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdClappy</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdD&amp;B1</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdTimber</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdDist5</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdRimSE</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdDist4</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdHip3</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdSlimy</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>Bd+HH</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Acid Kit" hbank="63" lbank="32" prog="19">
+ <entry><name>BdATite</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdJngl3</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HandClapSt</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdT8-1</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdBhL1-3</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdBh3R</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdSonSt1-3</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdFkSt1-2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdBsSt1-3</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdNm1R</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdFkHL</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdRkStk2R</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdLdwR1-4</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdLdwL1-4</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClRkSR</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHClRk2R</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHHlfOpRkR</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashL</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideR</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>Crash</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupL</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashL</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideMono</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FxGun2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>FxGun1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>Scratch H</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>HiQ1</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HiQ1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HiQ2</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch L</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Scratch L</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdT9-5</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdT9-5</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdT9-5</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdT9-5</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdFkSt1-2</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdD&amp;B1</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdHSonSt</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdHipGate</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdFXGate</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdBreak1</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdJngl1</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdBreakHvy</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Jungle Kit" hbank="63" lbank="32" prog="20">
+ <entry><name>BdJngl2</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdMdRim</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdJngl3</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdJngl3</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdPcRim</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRollMono</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdWood</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdR&amp;B2</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdD&amp;B2</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdJngl2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdJnglFx</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdJngl3</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdJngl1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdHipRm4</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdJngl2</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>SdJnglFx</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdJngl1</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomFlL</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClRkRSw</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomLoL</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdlRkRSw</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomMdR</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpRkRSw</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomMdR</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomHiR</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashL</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomHiR</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideR</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>China</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TabraNah</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TabraBya</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>TimbaleLo1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>HHRvD&amp;B</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>RainLoop</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>Scratch H</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>Scratch L</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdBlpHd</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdSyn</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>IndusTom</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>PandieroOp</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>Ripper</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>TelRing</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>ScratchLoR</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>TapeRewnd</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Electric" hbank="63" lbank="32" prog="21">
+ <entry><name>BdAnCR</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>BdBlip</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdT8-5</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>ClapAnSm</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdHipRm2</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRollMono</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdT8-1</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdAnCR</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdT8-2</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT8-1</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdT8-4</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdBlip</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT8-2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdT8-3</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>ClapAnSm</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomSyn2</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT8-2</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomSyn2</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomSyn2</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT8-2</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomSyn2</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomSyn2</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT9</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomSyn2</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>Crash</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CrashSyn</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>CrashT8</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>SdRimSE</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>CrashSyn</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>TomT8</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>TomT8</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>TomT8</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>TomT8</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>TomT8</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>Applause</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>Telephone</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>Heartbeat</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>Bomb</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>HHOpLoFi</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Zap2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Zap1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>Scratch H</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>HiQ1</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HiQ1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HiQ2</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch L</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>HitOrch2</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>HHClFx</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>HHOpFx</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>AnaShaker</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>TurnTable</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdBreakRol</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Mother</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>Mind Bell</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdFx1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdRk2St</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>LfoSeq</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>Ripper</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>NzBurst</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>Police</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>Fairwave</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>Swarm</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>RadioNz</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Human Kit" hbank="63" lbank="32" prog="22">
+ <entry><name>BdHuman1</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>ScratchVoF</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>Hit Uhh</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>ScratchVoR</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdJnglFx</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRkRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdBreak1</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdAnCR</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdT9-1</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdSus</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdHpStk1</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdHuman1</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdHuman2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdWood</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdHuman1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>SdDodgH</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdHuman2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>BdHuman1</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHOpHuman</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>BdHuman1</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpHuman</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>BdHuman1</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpHuman</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>BdHuman1</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>BdHuman1</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>NzBurst</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>BdHuman1</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>CrashT8</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>China</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>ScratchSdR</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashSt</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>VoxDrum</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>Crash2</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>StabAah</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FxGun2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>FxGun1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>Scratch H</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>ScratchLoF</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>ScratchLoR</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HiQ2</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch L</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Scratch L</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>TurnTable</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdRkRim1R</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Helicopter</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>StabHard</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdGate1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdRk1St</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdAnSm</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>Sonar1</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>Wataiko</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>Wataiko</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>HH Hit</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>StabOrgan2</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Hard Kit" hbank="63" lbank="32" prog="23">
+ <entry><name>BdDist3</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdWood</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdGate1</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HandClapSt</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdGate2</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRollMono</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdClpAna</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdHip3</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>Ripper</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdDistRM</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdDist2</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdDist1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdMdRim</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdDist</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>NzBurst</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdFx2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomDistLo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT9</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomDistLo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT9</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomDistLo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT9</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomDistHi</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomDistHi</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT9</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomDistHi</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>China</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnAnCR</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>CowBelT8</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>SdTimber</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>SdTimber</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>Bd+HH</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>Bd+HH</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>Glass</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>Glass</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FxGun2</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>FxGun1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>Scratch H</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>HiQ1</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HiQ1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HiQ2</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch L</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Scratch L</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdDist</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdFM</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdFMRim</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdClappy</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdFxHmr</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>IndusTom</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdD&amp;B1</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>IndusTom</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdRoom3</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>IndusTom</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdT9-4</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>SdHammer</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="DistrtdKit" hbank="63" lbank="32" prog="24">
+ <entry><name>AnaClick</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdBrMtSt</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdBrSwrSt</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdBrMt2St</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Castanet</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdNm1St</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>Stick</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdRk2R</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdLdw1St</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdBreak1</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdRk2R</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdRkStk2R</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdSon1L</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapL</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdPcRim</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomAmbLo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClRk2R</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomAmbLo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdlRkR</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomAmbLo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpRkR</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomAmbHi</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomAmbHi</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashL</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomAmbHi</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideR</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaL</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupR</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnSw</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashR</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>MamboBel</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashL</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>ScratchCb2</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>ScratchHiR</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdPicol</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdHeavy</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdClpAna</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdPcRim</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdRoom2</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdMid</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdRoom3</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdMdRim</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdGate</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdGate1</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdFXGate</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdD&amp;B1</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="AmbientKit" hbank="63" lbank="32" prog="25">
+ <entry><name>BdBlip</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>HiQ2</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdPcRim2</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HiQ1</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdAnCR</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>TomSyn1</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>HHClSyn</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>TomSyn1</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>HHClFx</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>TomSyn2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>HHOpSyn</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdAnCR</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT9-1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdHpStk3</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdJngl1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdJngl1</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT8</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT8-2</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT8</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT8</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT8-2</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT8</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT8</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSyn</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>Crash</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupMono</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Crash</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>CowBelT8</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>Glass</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>Glass</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MarcsT8</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Bird</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Stream</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>Thunder</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>Gunshot</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>ClaveT8</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>TambrnAnCR</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CowBelAnCR</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>AnaShaker</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdT8-5</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Sonar1</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdT8-5</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>Resonator</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>Bubble</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdT8-5</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>Bubble</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdT8-5</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>Eery</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdT8-5</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>WindChime</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>WindChime</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Jazz Kit" hbank="63" lbank="32" prog="26">
+ <entry><name>BdRoom2</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdBrMtR</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdBrMt2St</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Castanet</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdHip1St</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>Stick</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdFkML</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdRkStk2St</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdFkSonSt</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdFkSt1-2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdClRmSt</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdLdw1St</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapSt</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdBhSt1-3</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomFlSt</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClFtSt</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomFlSt</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdlSt</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomLoSt</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOp2St</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomMdSt</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomMdSt</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSt</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomHiSt</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaSt</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupSt</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashSt</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Cabasa1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>SdBrSwrSt</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>SdBrSwrSt</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdBlL1-3</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdFkAySt</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdBhR1-3</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdBlSt1-2</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdLoL</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdLdwHMono</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdDry2</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdSlimy</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdRollMono</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdNm2R</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>Crash</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Hip Hop3" hbank="63" lbank="32" prog="27">
+ <entry><name>SdT8Rim</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>VoxHitRev</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>TurnTable</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>StabHard</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>ScratchVoR</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRollMono</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>ClaveT8</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdHip1R</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdHpStk4</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdAnCR</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdHipRm3</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT9-3</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdHipDp</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdHpStk5</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdHipGate</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapR</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdLofi</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT8</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClHip</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT8</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdlHip</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT8</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpHip</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT8</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT8</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>Crash2</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideR</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CrashT8</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>RideT9</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashR</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>MamboBdy</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideT9</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>ShakerHip1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdHpStk1</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdJngl1</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>HandClapR</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdBreakHvy</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>Scratch L</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>ScratchHiF</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>ScratchLoF</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>ScratchLoR</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>ScratchBdF</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>ScratchBdR</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdBreakHvy</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Hip Hop4" hbank="63" lbank="32" prog="28">
+ <entry><name>SdHpStk2</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>HiQ2</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>TurnTable</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HitOrch1</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>ScratchSpn</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdRkRolR</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>ClaveT8</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdBreak3</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdHpStk7</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdR&amp;B2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdR&amp;B1Rm</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT9-4</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT9-2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdHpStk3</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdHipRm3</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapR</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdHipRm4</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>BdT8-3</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT9</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>BdT8-3</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT9</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>BdT8-3</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT9</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>BdT8-3</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>BdT8-3</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>Crash2</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>BdT8-3</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideR</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CrashT8</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>RideT9</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashR</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>MamboBdy</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideT9</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>ShakerHip1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdClRmSt</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdJnglFx</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>HandClapR</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdBreakRol</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>ScratchHiR</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>ScratchLoF</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>ScratchLoR</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>ScratchBdF</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>ScratchBdR</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>ScratchSdF</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>ScratchSdR</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdBreakHrd</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="HipStick2" hbank="63" lbank="32" prog="29">
+ <entry><name>SdHipRm4</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>NzBurst</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>TurnTable</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>Hit Uhh</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>ScratchBdR</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SnLvRolR</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>ClaveT8</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdAnSmRim</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdHipGate</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT9-3</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT8-2</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT9-1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdHipRm3</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdHpStk3</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapR</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdHpStk4</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT9</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT9</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT9</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>Crash2</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideR</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CrashT8</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>RideT9</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashR</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>MamboBdy</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideT9</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>ShakerHip1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Whistle</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>Whistle</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CuicaHi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CuicaLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdAnSmRim</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdClRmR</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdHipRm4</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdClRim3</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>Scratch L</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>ScratchHiF</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>ScratchLoF</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>ScratchBdR</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>ScratchCb2</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>ScratchStp</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdBlpHd</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Garage" hbank="63" lbank="32" prog="30">
+ <entry><name>BdHardLong</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>BdT9-1</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>BdSlimy</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>BdAnHard</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>BdDist4</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>BdR&amp;B2</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>BdHipDp</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>BdFxHmr</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>BdT9Hd1</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT8-3</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>BdSus</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdZapMid</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT8-2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>BdSlimy</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdT8-1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdClappy</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>SdBl3St</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHOpSt</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>HHClT8-2</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpSt</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>HHOpT8-2</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpSt</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>HHOpT8-2</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>ClapAnSm</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSt</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>CrashT9</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>RideT9</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>AnaClick</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>ClaveT8</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>ClapAnSm</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>ClapT9</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>AnaShaker</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CongaT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>CongaT8</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>SdAnCR</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>SdRkRolSt</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>AgogoHi</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>ChinaRL</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>HiQ2</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>HiQ1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>Zap2</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>Zap1</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>Zap2</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>DoorSqk</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>ScratchCb3</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>FretNoise</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>PlayFxGt5</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>ScratchHiF</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>Wurli+</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Wurli+</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>Wurli+</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>ResoXFade</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Sonar1</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>VoxDrum</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>VoxDrum</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>VoxDrum</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>HHOpSyn</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>HHClSyn</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>TriWv</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>TriWv</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>TriWv</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>TriWv</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>TriWv</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>TriWv</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>TriWv</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>TriWv</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>TriWv</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>TriWv</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>TriWv</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>TriWv</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>TriWv</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="ALL-ROUND" hbank="63" lbank="32" prog="31">
+ <entry><name>BdHardLong</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>BdTekPower</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>BdDist5</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>BdDist3</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>BdDist1</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>BdD&amp;B1</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>BdBlip</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>BdAnSm</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>BdT8-2</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT8-1</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>BdT9Hd3</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT9-2</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT9-3</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>BdSus</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdT9-1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>SdT9Rim</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdT9-4</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT9</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpT9</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT9</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>ClapT9</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>ClapAnSm</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT9</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>CongaT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideT9</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CongaT8</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>AnaClick</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>ClaveT8</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>MarcsT8</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>TambrnAnCR</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>AnaShaker</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelT8</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>CowBelAnCR</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>SdT8-1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>SdT8-2</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>SdT8-3</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>SdAnCR</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>SdJngl1</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>SdD&amp;B1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>SdD&amp;B4</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>SdR&amp;B1</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>SdR&amp;B2</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>SdHip1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>SdWood</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>SdTimber</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>HHClT8-1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>HHClT8-2</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>HHOpT8-2</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HHPdlSt</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HHOpSt</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>HHOpSt</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>HHClLoFi</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>HHOpLoFi</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>HHClSyn</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>HHOpSyn</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>AnaShaker</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>TambrnSw</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Cowbell2</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>BongoHi1</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>WoodBlock</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>BdHardLong</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>TumbaOp</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>QuintOp</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>FxGun2</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>Bomb</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdZapHrd</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>ScratchHp2</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Rock Multi" hbank="63" lbank="32" prog="32">
+ <entry><name>BdNmSt1-2</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdRkStk1St</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdRkRolSt</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdRkOp1St</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>TomLoSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>HHClFtSt</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>TomLoSt</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>HHPdlSt</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>TomMdSt</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>HHOpSt</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>TomHiSt</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdRk2St</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdRkStk1St</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapSt</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdRkMte2St</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomRkLoSt</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClRkStSw</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomRkLoSt</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHPdRkStSw</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomRkMdSt</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpRkStSw</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomRkMdSt</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomRkHiSt</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashSt</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomRkHiSt</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>RideSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ChinaSt</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupSt</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnSw</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashSt</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Shaker1-2</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideSt</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BdRk1St</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>SdRkStk2St</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>SdRkOp1St</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>ClapT9</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>SdRkMte1St</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TomRkLoSt</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>HHClRkStSw</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>TomRkLoSt</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>HHPdlRkSt</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>TomRkMdSt</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>HHHfOpRkSt</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>TomRkMdSt</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>TomRkHiSt</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>CrashSt</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>TomRkHiSt</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>RideL</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>ChinaSt</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>CupSt</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>TambrnHit</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>SplashSt</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>MamboBel</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>CrashSt</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>ShekereDw</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>RideR</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BdFkSt1-2</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdRkStk1St</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdRkRim1St</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdRkFlmSt</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdRkRim2St</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>TomFlSt</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>HHCl4St</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>TomLoSt</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>HHPdlSt</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>TomMdSt</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>HHOp2St</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>TomMdSt</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>TomHiSt</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Hip Multi" hbank="63" lbank="32" prog="33">
+ <entry><name>BdT8-3</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdT8Rim</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdDodgL</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>ClapT9</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdHip3</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>BdT8-3</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>HHClTek</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>BdT8-3</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>HHOpTek</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT8-3</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>HHOpTek</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdT8-3</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdHipDp</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdHpStk4</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdHipRm1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapR</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdHip2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomT8</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClT8-2</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomT8</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpAnCR</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomT8</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomT8</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomT8</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>CrashT9</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>TomT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>CrashSyn</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CrashSyn</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CrashT8</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnRX5</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SplashR</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>CowBelT8</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashT9</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>CowBelAnCR</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideT9</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BdHipDp</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>SdHpStk5</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>SdHipRm2</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>HandClapL</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>SdHip1</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>HHClRX5</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>HHClAnCR</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>HHOpT8-2</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>TomT9Lo</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>CrashR</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>CrashT8</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>CrashSyn</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>CrashT8</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>TambrnHit</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>ChinaR</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>CowBelRX11</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>CrashL</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Cowbel1</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>RideR</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BdHipDp</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdHipStk8</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdHipGate</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdHip2</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdHipRm5</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>TomDistLo</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>HHClHip</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>TomDistLo</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>HHPdlHip</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>TomDistHi</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>HHOpHip</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>TomDistHi</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>TomAnSm</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Percussion" hbank="63" lbank="32" prog="34">
+ <entry><name>Wataiko</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>Udo Hi</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>DjembeOp</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>QuintTip</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>Udo Low</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>UdoFinger</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Udo Hi</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>TabraBya</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>TmbourimOp</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>TablaMut</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>TabraNah</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>TablaMut</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>Timpani</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>Hit Uhh</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>PickNoise1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ClapT9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>TriangleMt</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TriangleOp</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>Castanet</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>Castanet</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>Castanet</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>GuiroLong</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>GuiroShort</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>GuiroSwp</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>Vibraslap</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>Clave</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>ClaveT8</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>CuicaLo</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CuicaHi</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>WoodBlock</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>TimbaleLo2</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>WoodBlock</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>ChaCha</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>TimbaleHi2</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>TmblPailaL</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>TmblPailaL</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>TmblPailaH</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>MamboBel</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>BongoLo3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>Cowbel1</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>Cowbell2</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>BongoHHeel</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>AgogoLo</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>AgogoHi</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>TumbaHeel</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>TumbaTip</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>TumbaSlp</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>TumbaOp</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>CongaHeel</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>CongaTip</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>CongaSlp</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>Shaker1</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>CongaOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Cabasa1</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>Cabasa1-2</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>QuintHeel</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>QuintTip</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>QuintSlp</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>Shaker2</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>QuintOp</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>Caxixi1</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>TambrnShk</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>TambrnHit</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>TambrnSw</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>TambrnHit</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SleighBel</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>Whistle</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>Whistle</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Latin Perc" hbank="63" lbank="32" prog="35">
+ <entry><name>BdLSonSt</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdRkStk2St</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdFkSt1/3</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>CrashSt</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SplashSt</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>TomLoSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>HHClSt1-4</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>TomLoSt</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>HHPdlSt</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>TomMdSt</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>HHOpSt</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>TomHiSt</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>TumbaTip</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>TumbaHeel</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>TumbaSlp</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>Clave</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>TumbaOp</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>CongaTip</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>CongaHeel</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>CongaSlp</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>ChaCha</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>CongaOp</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>MamboBdy</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>MamboBel</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>QuintTip</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>QuintHeel</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>QuintSlp</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>ChaCha</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>QuintOp</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>BongoLo1</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>BongoHHeel</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>BongoHi1</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>TimbaleLo1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>TmblPailaL</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>TimbaleHi1</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>TmblPailaH</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>WoodBlock</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>WoodBlock</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>ShekereDw</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>ShekereUp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>ShekereSap</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>MaracasSlr</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>MaracasStc</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>GuiroLong</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>GuiroShort</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>GuiroSwp</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>SurdoMt</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>SurdoOp</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>PandierTip</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>PandroHeel</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>PandierThm</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>PandieroOp</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>TmbourmFng</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>TmbourimMt</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>TmbourimOp</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>AgogoLoTap</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>AgogoLo</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>AgogoHi</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>TriangleOp</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>TriangleMt</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>GanzaAc</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>GanzaBk</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>GanzaFw</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>Cabasa1</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>Cabasa2</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>Caxixi1</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>Caxixi2</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>CuicaLo</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>CuicaHi</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>Whistle</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>Whistle</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>Vibraslap</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BellTree</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Gtr/Bs Fx" hbank="63" lbank="32" prog="36">
+ <entry><name>PlayFxABa8</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>PlayFxGt4</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>PwrChdMono</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>PwrChdMono</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>PlayFxABa9</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>PickNoise2</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>PlayFxABa6</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>PickNoise2</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>PlayFxABa6</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>PlayFxGt7</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>PlyFxSlp1H</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>PlyFxSl12S</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>PlayFxGt3</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>PlayFxABa9</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>PlayFxGt5</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>PlyFxSlp2S</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>PickNoise2</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>PlyFxSlp2S</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>PickNoise2</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>PlyFxSlp2S</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>FretNoise</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>PlyFxSlp2S</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>PlyFxSlp2S</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>PlyFxSl19S</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>PlyFxSlp2S</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>PickNoise2</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>PlyFxSl19S</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>PickNoise2</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>PlyFxSlp2H</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>PlyFxSl19S</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>PlayFxGt12</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>PlyFxSl19S</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>PlyFxSl18S</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>PickNoise2</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>PlayFxABa2</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>PlayFxABa3</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>PlayFxABa1</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>PlayFxGt6</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>PlayFxGt4</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>PlayFxGt13</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>PlayFxGt12</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>PlayFxABa5</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>PlayFxABa6</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>PickNoise1</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>PickNoise1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>PickNoise3</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>PlayFxGt7</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>PlayFxGt8</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>PickNoise2</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>PickNoise2</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>PlayFxGt3</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>PlyFxSl18S</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>PlayFxGt9</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>PlayFxGt10</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>PlayFxGt11</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>PlayFxGt1</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>PlayFxGt2</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>PlayFxGt3</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>PlayFxGt4</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>PlyFxSl17S</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>PlyFxSlp7H</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>PlyFxSlp7S</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>PlyFxSl18H</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>PlyFxSl19S</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>PlyFxSl20S</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Wacko Kit" hbank="63" lbank="32" prog="37">
+ <entry><name>PlyFxSlp5H</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>PickNoise1</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>HHPdlD&amp;B</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HandClapL</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>ScratchVoF</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>IndusTom</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdWood</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>IndusTom</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdClpAna</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>IndusTom</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdFMRim</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdFXGate</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdFxHmr</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdFM</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapL</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdTimber</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>TomSyn2</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHClSyn</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>TomSyn2</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHOpSyn</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>TomSyn2</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpSyn</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>TomSyn2</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>TomSyn2</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>HHOpMono</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>Sonar1</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>HHOpMono</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupL</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>SleighBel</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>HHOpT8-2</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>ResoXFade</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>CrashL</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>RainLoop</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>CupR</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>AirHoseL</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>AirHoseL</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>Udo Hi</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>MgBass2</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>MgBass3</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoLo</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>HHOpHuman</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>VoxHitRev</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>HiQ1</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>HiQ1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>LfoSeq</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>LfoSeq</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>BellAir</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>HH Hit</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>HH Hit</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>OohFB</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>OohFB</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>Mind Bell</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>Glass</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>Swarm</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>FxGun2</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>Lektronica</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>PlayFxGt12</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Gunshot</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>Police</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>Ripper</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>PlayFxGt7</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>TapeRewnd</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>FxGun1</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>Bomb</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>Zap2</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>NzBurst</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>StabGiant</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>StabOrch</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Wood Bits" hbank="63" lbank="32" prog="38">
+ <entry><name>ClaveT8</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdHpStk6L</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>GuiroLong</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdHpStk6R</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>GuiroLong</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>PlayFxABa9</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>Castanet</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>Stick</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>PlayFxABa7</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>TomT9Hi</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>PickNoise3</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdClRim3</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>Stick2</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>GuiroLong</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>Stick2</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>SdAnSmRim</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>ClapAnSm</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>Vibraslap</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>Seashore</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>SdRkStk2St</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>Applause</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>SdRkStk1L</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnShk</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>Seashore</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>WoodBlock</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>Applause</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Helicopter</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>SdRkStk2R</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>PlayFxABa3</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>PlayFxABa3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>Castanet</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>Castanet</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>WoodBlock</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmblPailaL</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmblPailaL</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>Stick</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>Stick2</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>Caxixi1-2</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>Caxixi2</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>DoorSqk</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>DoorSqk</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroShort</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>Clave</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>WoodBlock</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>WoodBlock</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>DoorSqk</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>DoorSqk</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>WoodBlock</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>Clave</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>DoorSqk</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>HandClapL</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>ChaCha</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>BdJngl3</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>QuintSlp</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>BdRoom2</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdHSonSt</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdHeavy</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdRkStk1St</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdSlimy</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdGate1</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdFkSonSt</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdGate</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Metal Bits" hbank="63" lbank="32" prog="39">
+ <entry><name>CowBelT8</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>HHCl4R</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>CupR</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>HHOpSyn</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>CupL</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>CupSt</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>FMMetal2</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>RideSt</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>RideSt</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>Cowbell2</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>HHCl1St</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>ChaCha</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>Cowbell2</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>HHClSyn</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>HHOpTek</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HHClT8-2</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>HHClRX5</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>Cowbell2</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>HHOpT8-1</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>Cowbell2</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>HHClSyn</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>Cowbell2</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>HHOpSyn</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>Cowbell2</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>Cowbell2</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>HHOpFx</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>Cowbell2</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>CupSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>HHOpAnCR</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupSt</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnSw</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>HHOpFx</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>MamboBel</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>HHOpFx</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>SleighBel</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideMono</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>Vibraphone</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>Vibraphone</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>Tubular</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>Bell</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>BrBell</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmblPailaH</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmblPailaL</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>Bell</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>Bell</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>HHCl1St</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>HHOpAnCR</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>BellAir</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>WindChime</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>HHOpRkL</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>Lektronica</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>AgogoLo</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>Cowbel1</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>Cowbell2</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>HiLo</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>HiLo</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>TriangleMt</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>TriangleOp</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>WindChime</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SmBell</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SmBell</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>BrBell</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>Hibasi</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>Harpsicord</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdLdwHMono</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>Vibraphone</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdBrRim</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>Gamelan2</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>UdoFinger</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>FingerCym</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>Bell</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Hands Kit" hbank="63" lbank="32" prog="40">
+ <entry><name>TablaMut</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdBrMtSt</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdBrSwrSt</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdBrMt2St</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>PlyFxSl19S</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>PandierThm</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>TablaMut</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>PlyFxSl14H</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>TabraCmb</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>Wataiko</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>QuintTip</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdBrMt2St</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>HandClapSt</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdFkAySt</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>Udo Low</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>TablaMut</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>Udo Low</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>TabraBya</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>Udo Hi</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>TabraNah</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>Udo Hi</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>UdoFinger</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>RideR</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>UdoFinger</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>CupSt</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>CupMono2</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>CupSt</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>TambrnHit</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>CupSt</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>Cowbel1</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>RideMono</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Vibraslap</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>RideL</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BongoHi1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BongoLo1-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>CongaTip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>CongaSlp</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>CongaOp</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>TmbaleH1-3</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>TmbaleL1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>AgogoHi</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>AgogoLo</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>TmbourmFng</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>TmbourmFng</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>HandClapL</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>HandClapL</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>GuiroLong</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>GuiroLong</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>UdoFinger</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>TabraBya</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>CongaTip</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Udo Hi</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Udo Hi</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>UdoFinger</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>FingerCym</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>TablaMut</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SleighBel</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BellTree</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>PlayFxABa4</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>PlayFxABa3</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>PlayFxABa3</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>PlayFxABa2</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>PlayFxABa3</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>TumbaOp</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>PlayFxABa1</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>PlayFxABa7</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>Udo Low</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>DjembeCmb</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>TumbaSlp</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Scratches" hbank="63" lbank="32" prog="41">
+ <entry><name>Scratch</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>Scratch</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>ScratchD</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>ScratchH</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>ScratchH</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>ScratchL</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>ScratchL</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>ScratchB</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>ScratchB</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>ScratchS</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>ScratchS</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>ScratchV</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>Scratch</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>Scratch</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>ScratchD</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>ScratchH</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>ScratchH</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>ScratchL</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>ScratchL</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>ScratchB</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>ScratchB</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>ScratchS</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>ScratchS</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>ScratchV</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>ScratchV</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>ScratchS</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>ScratchS</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>ScrathcH</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>ScratchH</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>ScratchC</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>ScratchC</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>ScratchC</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>ScratchC</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>Scratch</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>Scratch</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>ScratchD</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>ScratchH</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>ScratchH</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>ScratchL</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>ScratchL</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>ScratchB</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>ScratchB</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>ScratchS</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>ScratchS</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>ScratchV</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>ScratchV</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>ScratchS</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>ScratchS</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>ScrathcH</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>ScratchH</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>ScratchC</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>ScratchC</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>ScratchC</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>ScratchC</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Scratch</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>ScratchD</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>ScratchH</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>ScratchH</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>ScratchL</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>ScratchL</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>ScratchB</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>ScratchB</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>ScratchS</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>ScratchS</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>ScratchV</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>ScratchV</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>ScratchS</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>ScratchS</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>ScrathcH</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>ScratchH</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>ScratchC</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>ScratchC</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="AcstSnares" hbank="63" lbank="32" prog="42">
+ <entry><name>SdNm1St</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdNm2St</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdNm3St</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdNm4St</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdFk1St</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdFk2St</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdFk3St</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdFkAySt</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdBs1St</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>SdBs2St</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdBs3St</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>SdSon1St</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>SdSon2St</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdSon3St</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdSon4St</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>SdBl1St</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdBl2St</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>SdBl3St</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>SdBh1St</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>SdBh2St</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>SdBh3St</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>SdLdw1St</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>SdLdw2St</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>SdLdw3St</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>SdLdw4St</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>SdHip1St</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>SdHip2St</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>SdRkOp1St</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>SdRkMte1St</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>SdRkRim1St</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SdRkMte2St</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>SdRkRim2St</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>SdRkFlmSt</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>SdRkOp1St</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>SdRkMte1St</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>SdRkRim1St</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>SdRkMte2St</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>SdRkRim2St</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>SdRkFlmSt</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>SdNm3St</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>SdFkAySt</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>SdBs3St</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>SdSon3St</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>SdBh3St</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>SdLdw3St</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>SdLdw3R</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>SdPicol</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>SdPcRim</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>SdPcRim2</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>SdMid</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>SdMdRim</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>SdAmb</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>SdGate1</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>SdLdwHMono</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>SdBrRim</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>SdDry</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>SdHeavy</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SdGM</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>SdRkStk1St</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdRkStk2St</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdClRmSt</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdClRim2</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdClRim3</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>SdRkRolSt</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>SnLvRolSt</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdSon2St</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>SdRollMono</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdLdw3St</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>SdBrMtSt</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>SdBSwrAtSt</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="StSnares" hbank="63" lbank="32" prog="43">
+ <entry><name>SdNmSt1-4</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdNmSt1-3</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdNmSt2-4</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdNmSt1-2</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdNmSt2-3</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdNmSt3-4</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdNm1St</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdNm2St</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdNm3St</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>SdNm4St</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdFkSt1-3</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>SdFkSt1-2</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>SdFkSt2-3</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdFkSt1/3</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdFk1St</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>SdFk2St</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdFk3St</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>SdFkAySt</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>SdBsSt1-3</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>SdBsSt1-2</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>SdBsSt2-3</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>SdBsSt1/3</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>SdBs1St</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>SdBs2St</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>SdBs3St</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>SdSonSt1-4</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>SdSonSt1-3</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>SdSonSt2-4</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>SdSonSt1-2</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>SdSonSt2-3</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>SdSonSt3-4</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SdSon1St</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>SdSon2St</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>SdSon3St</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>SdSon4St</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>SdBlSt1-3</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>SdBlSt1-2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>SdBlSt2-3</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>SdBlSt1/3</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>SdBl1St</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>SdBl2St</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>SdBl3St</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>SdBhSt1-3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>SdBhSt1-2</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>SdBhSt2-3</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>SdBhSt1/3</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>SdBh1St</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>SdBh2St</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>SdBh3St</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>SdLdwSt1-4</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>SdLdwSt1-3</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>SdLdwSt2-4</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>SdLdwSt1-2</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>SdLdwSt2-3</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>SdLdwSt3-4</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>SdLdw1St</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>SdLdw2St</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>SdLdw3St</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>SdLdw4St</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>SdHip1St</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>SdRkOp1St</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>SdRkMte1St</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>SdRkRim1St</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>SdRkMte2St</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>SdRkRim2St</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>SdRkFlmSt</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>SdRkRolSt</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>SdRkOp1St</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>SdRkRolDSt</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>SdRkOp2St</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>SnLvRolSt</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>SdNm3St</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="AllKicks" hbank="63" lbank="32" prog="44">
+ <entry><name>BdNmSt1-2</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>BdNm1St</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>BdNm2St</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>BdNmL1-2</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>BdFkSt1-2</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>BdFk1St</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>BdFk2St</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>BdHiSt</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>BdLoSt</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdHSonSt</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>BdLSonSt</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdFkSonSt</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdRk1St</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>BdRk2St</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>BdDry1</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>BdDry2</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>BdPop</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>BdVar1</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>BdVar2</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>BdRoom1</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>BdRoom2</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>BdRoom3</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>BdGate</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>BdFXGate</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>BdT9-1</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>BdT9-2</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>BdT9-3</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>BdT9-4</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>BdT9Hd1</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>BdT9Hd2</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>BdT9Hd3</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>BdT8-1</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>BdT8-2</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>BdT8-3</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>BdAnSm</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>BdAnCR</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BdHuman1</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BdHuman2</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>BdBlip</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>BdBlpHd</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>BdJngl1</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>BdJngl2</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>BdJngl3</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>BdD&amp;B1</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>BdD&amp;B2</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>BdR&amp;B1</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>BdR&amp;B2</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>BdHipDp</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>BdBrkDp</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>BdBreak1</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>BdBreak2</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>BdBreakHvy</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>BdBreakHrd</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>BdDist1</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>BdDist2</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>BdDist3</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>BdDist4</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>BdDist5</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>BdDistRM</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>Bd+HH</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BdFxHmr</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>BdZapHrd</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>BdZapMid</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>BdSus</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>BdTekPower</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdHardLong</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>BdATite</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdAnHard</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>BdLofi</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdThkSkn</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>BdSlimy</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdSlimy</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdSlimy</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="DanceKicks" hbank="63" lbank="32" prog="45">
+ <entry><name>BdT9-1</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>BdT9-1</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>BdT9-2</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>BdT9-3</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>BdT9-3</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>BdT9-4</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>BdT9Hd1</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>BdT9Hd2</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>BdT9Hd3</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>BdT9Hd3</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>BdHardLong</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>BdAnCR</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>BdT9-1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>BdT9-2</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>BdT9-3</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>BdT9-4</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>BdT9Hd1</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>BdT9Hd2</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>BdT9Hd3</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>BdT8-1</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>BdT8-2</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>BdT8-3</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>BdAnSm</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>BdAnCR</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>BdHuman1</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>BdHuman2</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>BdBlip</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>BdBlpHd</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>BdJngl1</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>BdJngl2</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>BdJngl3</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>BdD&amp;B1</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>BdD&amp;B2</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>BdR&amp;B1</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>BdR&amp;B2</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>BdHipDp</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>BdBrkDp</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>BdBreak1</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>BdBreak2</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>BdBreakHvy</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>BdBreakHrd</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>BdDist1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>BdDist2</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>BdDist3</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>BdDist4</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>BdDist5</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>BdDistRM</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>Bd+HH</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>BdFxHmr</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>BdZapHrd</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>BdZapMid</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>BdSus</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>BdTekPower</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>BdHardLong</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>BdATite</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>BdAnHard</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>BdLofi</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>BdThkSkn</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>BdSlimy</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>BdGate</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>BdFXGate</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>BdT9-1</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>BdT9-2</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>BdT9-3</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>BdT9-4</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>BdT9Hd1</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>BdT9Hd2</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>BdT9Hd3</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>BdBlpHd</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>BdR&amp;B2</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>BdZapMid</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>BdHardLong</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>BdATite</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+
+ <drummap name="Snare &amp; Fx" hbank="63" lbank="32" prog="46">
+ <entry><name>SdFx1</name> <enote>24</enote><anote>24</anote></entry>
+ <entry><name>SdFx2</name> <enote>25</enote><anote>25</anote></entry>
+ <entry><name>SdFx3</name> <enote>26</enote><anote>26</anote></entry>
+ <entry><name>SdFx4</name> <enote>27</enote><anote>27</anote></entry>
+ <entry><name>SdDist</name> <enote>28</enote><anote>28</anote></entry>
+ <entry><name>SdCut</name> <enote>29</enote><anote>29</anote></entry>
+ <entry><name>SdDodgH</name> <enote>30</enote><anote>30</anote></entry>
+ <entry><name>SdDodgL</name> <enote>31</enote><anote>31</anote></entry>
+ <entry><name>SdFM</name> <enote>32</enote><anote>32</anote></entry>
+ <entry><name>SdSyn</name> <enote>33</enote><anote>33</anote></entry>
+ <entry><name>SdHammer</name> <enote>34</enote><anote>34</anote></entry>
+ <entry><name>SdLofi</name> <enote>35</enote><anote>35</anote></entry>
+ <entry><name>SdT9-1</name> <enote>36</enote><anote>36</anote></entry>
+ <entry><name>SdT9-2</name> <enote>37</enote><anote>37</anote></entry>
+ <entry><name>SdT9-3</name> <enote>38</enote><anote>38</anote></entry>
+ <entry><name>SdT9-4</name> <enote>39</enote><anote>39</anote></entry>
+ <entry><name>SdT9-5</name> <enote>40</enote><anote>40</anote></entry>
+ <entry><name>SdT9Gate</name> <enote>41</enote><anote>41</anote></entry>
+ <entry><name>SdT8-1</name> <enote>42</enote><anote>42</anote></entry>
+ <entry><name>SdT8-2</name> <enote>43</enote><anote>43</anote></entry>
+ <entry><name>SdT8-3</name> <enote>44</enote><anote>44</anote></entry>
+ <entry><name>SdT8-4</name> <enote>45</enote><anote>45</anote></entry>
+ <entry><name>SdT8-5</name> <enote>46</enote><anote>46</anote></entry>
+ <entry><name>SdAnSm</name> <enote>47</enote><anote>47</anote></entry>
+ <entry><name>SdAnCR</name> <enote>48</enote><anote>48</anote></entry>
+ <entry><name>SdHuman1</name> <enote>49</enote><anote>49</anote></entry>
+ <entry><name>SdJngl1</name> <enote>50</enote><anote>50</anote></entry>
+ <entry><name>SdJngl2</name> <enote>51</enote><anote>51</anote></entry>
+ <entry><name>SdJngl3</name> <enote>52</enote><anote>52</anote></entry>
+ <entry><name>SdJnglFx</name> <enote>53</enote><anote>53</anote></entry>
+ <entry><name>SdD&amp;B1</name> <enote>54</enote><anote>54</anote></entry>
+ <entry><name>SdD&amp;B2</name> <enote>55</enote><anote>55</anote></entry>
+ <entry><name>SdD&amp;B3</name> <enote>56</enote><anote>56</anote></entry>
+ <entry><name>SdD&amp;B4</name> <enote>57</enote><anote>57</anote></entry>
+ <entry><name>SdR&amp;B1</name> <enote>58</enote><anote>58</anote></entry>
+ <entry><name>SdR&amp;B1Rm</name> <enote>59</enote><anote>59</anote></entry>
+ <entry><name>SdR&amp;B2</name> <enote>60</enote><anote>60</anote></entry>
+ <entry><name>SdHip1</name> <enote>61</enote><anote>61</anote></entry>
+ <entry><name>SdHip2</name> <enote>62</enote><anote>62</anote></entry>
+ <entry><name>SdHip3</name> <enote>63</enote><anote>63</anote></entry>
+ <entry><name>SdHipGate</name> <enote>64</enote><anote>64</anote></entry>
+ <entry><name>SdHipRm1</name> <enote>65</enote><anote>65</anote></entry>
+ <entry><name>SdHipRm2</name> <enote>66</enote><anote>66</anote></entry>
+ <entry><name>SdHipRm3</name> <enote>67</enote><anote>67</anote></entry>
+ <entry><name>SdHipRm4</name> <enote>68</enote><anote>68</anote></entry>
+ <entry><name>SdHipRm5</name> <enote>69</enote><anote>69</anote></entry>
+ <entry><name>SdBreak2</name> <enote>70</enote><anote>70</anote></entry>
+ <entry><name>SdBreakHvy</name> <enote>71</enote><anote>71</anote></entry>
+ <entry><name>PlayFxGt1</name> <enote>72</enote><anote>72</anote></entry>
+ <entry><name>PlayFxGt5</name> <enote>73</enote><anote>73</anote></entry>
+ <entry><name>PlayFxGt12</name> <enote>74</enote><anote>74</anote></entry>
+ <entry><name>PlayFxABa1</name> <enote>75</enote><anote>75</anote></entry>
+ <entry><name>PlayFxABa8</name> <enote>76</enote><anote>76</anote></entry>
+ <entry><name>PickNoise3</name> <enote>77</enote><anote>77</anote></entry>
+ <entry><name>Scratch H</name> <enote>78</enote><anote>78</anote></entry>
+ <entry><name>Scratch L</name> <enote>79</enote><anote>79</anote></entry>
+ <entry><name>ScratchDwn</name> <enote>80</enote><anote>80</anote></entry>
+ <entry><name>ScratchHiF</name> <enote>81</enote><anote>81</anote></entry>
+ <entry><name>ScratchStp</name> <enote>82</enote><anote>82</anote></entry>
+ <entry><name>ScratchSpn</name> <enote>83</enote><anote>83</anote></entry>
+ <entry><name>Ripper</name> <enote>84</enote><anote>84</anote></entry>
+ <entry><name>NzBurst</name> <enote>85</enote><anote>85</anote></entry>
+ <entry><name>Zap1</name> <enote>86</enote><anote>86</anote></entry>
+ <entry><name>Zap2</name> <enote>87</enote><anote>87</anote></entry>
+ <entry><name>HiQ1</name> <enote>88</enote><anote>88</anote></entry>
+ <entry><name>HiQ2</name> <enote>89</enote><anote>89</anote></entry>
+ <entry><name>Bomb</name> <enote>90</enote><anote>90</anote></entry>
+ <entry><name>FxGun1</name> <enote>91</enote><anote>91</anote></entry>
+ <entry><name>Electer</name> <enote>92</enote><anote>92</anote></entry>
+ <entry><name>HH Hit</name> <enote>93</enote><anote>93</anote></entry>
+ <entry><name>Mother</name> <enote>94</enote><anote>94</anote></entry>
+ <entry><name>HitOrch2</name> <enote>95</enote><anote>95</anote></entry>
+ <entry><name>StabGiant</name> <enote>96</enote><anote>96</anote></entry>
+ </drummap>
+ </PatchGroup>
+
+ <PatchGroup name="GM Drum Kits">
+ <Patch name="GM Drum" hbank="127" lbank="0" prog="0"/>
+ <Patch name="RockMono2" hbank="63" lbank="40" prog="0"/>
+ <Patch name="RockMono3" hbank="63" lbank="40" prog="1"/>
+ <Patch name="HipHop5" hbank="63" lbank="40" prog="2"/>
+ </PatchGroup>
+
+ <!-- Controller -->
+ <Controller name="Pitch" type="Pitch" />
+ <Controller name="Program" type="Program" />
+
+ <Controller name="Modulation" type="Control" l="1" />
+ <Controller name="PortamentoTime" type="Control" l="5" />
+ <Controller name="MainVolume" type="Control" l="7" init="100" />
+ <Controller name="Pan" type="Control" l="10" init="64" />
+ <Controller name="Expression" type="Control" l="11" init="127" />
+ <Controller name="Sustain" type="Control" l="64" />
+ <Controller name="Portamento" type="Control" l="65" />
+ <Controller name="Sostenuto" type="Control" l="66" />
+ <Controller name="SoftPedal" type="Control" l="67" />
+ <Controller name="FilterResonance" type="Control" l="71" init="64"/>
+ <Controller name="ReleaseTime" type="Control" l="72" init="64"/>
+ <Controller name="AttackTime" type="Control" l="73" init="64"/>
+ <Controller name="Brightness" type="Control" l="74" init="64"/>
+ <Controller name="DecayTime" type="Control" l="75" init="64"/>
+ <Controller name="VibrateRate" type="Control" l="76" init="64"/>
+ <Controller name="VibrateDepth" type="Control" l="77" init="64"/>
+ <Controller name="VibrateDelay" type="Control" l="78" init="64"/>
+ <Controller name="PortamentoControl" type="Control" l="84" />
+ <Controller name="ReverbSendLevel" type="Control" l="91" init="40" />
+ <Controller name="ChorusSendLevel" type="Control" l="93" init="0" />
+ <Controller name="VariationSend" type="Control" l="94" init="0" />
+
+ <Controller name="AllSoundsOff" type="Control" l="120" />
+ <Controller name="ResetAllController" type="Control" l="121" />
+ <Controller name="AllNotesOff" type="Control" l="123" />
+
+ <!-- RPN's -->
+ <Controller name="PitchBendSensitivity" type="RPN" l="0" min="0" max="0x18" init="2" />
+ <Controller name="FineTuning" type="RPN14" l="1" min="-8192" max="8191" init="0" />
+
+ </MidiInstrument>
+ </muse>
diff --git a/muse/share/instruments/ZynAdd-1_4.idf b/muse/share/instruments/ZynAdd-1_4.idf
new file mode 100644
index 00000000..1534b53d
--- /dev/null
+++ b/muse/share/instruments/ZynAdd-1_4.idf
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="ZynAddSubFX-1.4">
+ <Controller name="Pitch" type="Pitch" />
+ <Controller name="Modulation" type="Control" l="1" />
+ <Controller name="MainVolume" type="Control" l="7" init="100" />
+ <Controller name="Pan" type="Control" l="10" init="64" />
+ <Controller name="Expression" type="Control" l="11" init="127" />
+ <Controller name="Sustain" type="Control" l="64" />
+ <Controller name="Portamento" type="Control" l="65" />
+ <Controller name="FilterQ" type="Control" l="71" init="64"/>
+ <Controller name="FilterCutoff" type="Control" l="74" init="64"/>
+ <Controller name="Bandwidth" type="Control" l="75" init="64"/>
+ <Controller name="ModulationAmp" type="Control" l="76" init="127"/>
+ <Controller name="ResonanceCenter" type="Control" l="77" init="64"/>
+ <Controller name="ResonanceBandwidth" type="Control" l="78" init="64"/>
+ <Controller name="AllSoundsOff" type="Control" l="120" />
+ <Controller name="ResetAllController" type="Control" l="121" />
+ <Controller name="AllNotesOff" type="Control" l="123" />
+ </MidiInstrument>
+</muse>
+
diff --git a/muse/share/instruments/emuproteus2000.idf b/muse/share/instruments/emuproteus2000.idf
new file mode 100644
index 00000000..d55fb28e
--- /dev/null
+++ b/muse/share/instruments/emuproteus2000.idf
@@ -0,0 +1,1088 @@
+<?xml version="1.0"?>
+
+<muse version="1.0">
+ <MidiInstrument name="Emu Proteus 2000">
+<Init>
+</Init>
+<PatchGroup name="bpm">
+<Patch name="Build Up" hbank="4" lbank="2" prog="22"/>
+<Patch name="Jumping" hbank="4" lbank="4" prog="16"/>
+<Patch name="Move Clock !" hbank="4" lbank="2" prog="30"/>
+<Patch name="Something" hbank="4" lbank="2" prog="31"/>
+<Patch name="Electronica" hbank="4" lbank="2" prog="26"/>
+<Patch name="Waver" hbank="4" lbank="2" prog="33"/>
+<Patch name="DXBeat" hbank="4" lbank="2" prog="25"/>
+<Patch name="Free Love" hbank="4" lbank="2" prog="27"/>
+<Patch name="Choice 1" hbank="4" lbank="2" prog="23"/>
+<Patch name="Freeze" hbank="4" lbank="2" prog="28"/>
+<Patch name="Industry Vox" hbank="4" lbank="2" prog="29"/>
+<Patch name="The Man" hbank="4" lbank="2" prog="32"/>
+<Patch name="Deep Blue" hbank="4" lbank="2" prog="24"/>
+</PatchGroup>
+<PatchGroup name="brs">
+<Patch name="Horny" hbank="4" lbank="7" prog="115"/>
+<Patch name="Bone" hbank="4" lbank="7" prog="104"/>
+<Patch name="BreathyTBone" hbank="4" lbank="4" prog="21"/>
+<Patch name="Tromboned" hbank="4" lbank="0" prog="7"/>
+<Patch name="TrumpetMute2" hbank="4" lbank="0" prog="19"/>
+<Patch name="Profit 5" hbank="4" lbank="7" prog="120"/>
+<Patch name="Breathy Mute" hbank="4" lbank="7" prog="108"/>
+<Patch name="SforzadoEnsb" hbank="4" lbank="7" prog="126"/>
+<Patch name="ClassicBrass" hbank="4" lbank="7" prog="109"/>
+<Patch name="Synth Brass" hbank="4" lbank="0" prog="3"/>
+<Patch name="Bigga" hbank="4" lbank="7" prog="103"/>
+<Patch name="Dizzy" hbank="4" lbank="7" prog="111"/>
+<Patch name="Smiles" hbank="4" lbank="7" prog="123"/>
+<Patch name="Trumpet FX 4" hbank="4" lbank="0" prog="13"/>
+<Patch name="Section" hbank="4" lbank="7" prog="125"/>
+<Patch name="Ensemble" hbank="4" lbank="7" prog="113"/>
+<Patch name="Brass&amp;Bari" hbank="4" lbank="7" prog="105"/>
+<Patch name="Trmpt+Sect" hbank="4" lbank="0" prog="6"/>
+<Patch name="TrumpetMute1" hbank="4" lbank="0" prog="18"/>
+<Patch name="Brassy" hbank="4" lbank="7" prog="107"/>
+<Patch name="Trumpet FX 6" hbank="4" lbank="0" prog="15"/>
+<Patch name="Trumpet FX 7" hbank="4" lbank="0" prog="16"/>
+<Patch name="Miles" hbank="4" lbank="7" prog="119"/>
+<Patch name="SforzadoSect" hbank="4" lbank="0" prog="0"/>
+<Patch name="The Ensemble" hbank="4" lbank="0" prog="4"/>
+<Patch name="Barry Bones" hbank="4" lbank="7" prog="102"/>
+<Patch name="Reed &amp; Brass" hbank="4" lbank="7" prog="122"/>
+<Patch name="Trumpet FX 2" hbank="4" lbank="0" prog="11"/>
+<Patch name="Da Brasses" hbank="4" lbank="7" prog="110"/>
+<Patch name="Hans E4s" hbank="4" lbank="7" prog="114"/>
+<Patch name="B4PCM Brass" hbank="4" lbank="7" prog="101"/>
+<Patch name="RadioHorns" hbank="4" lbank="7" prog="121"/>
+<Patch name="Trumpet FX 5" hbank="4" lbank="0" prog="14"/>
+<Patch name="MellowDTrmp" hbank="4" lbank="7" prog="118"/>
+<Patch name="Trumpet FX 3" hbank="4" lbank="0" prog="12"/>
+<Patch name="Trumpet Hard" hbank="4" lbank="0" prog="17"/>
+<Patch name="5th Wave" hbank="4" lbank="7" prog="99"/>
+<Patch name="Trombrass" hbank="4" lbank="0" prog="8"/>
+<Patch name="Schwyn 1" hbank="4" lbank="7" prog="124"/>
+<Patch name="Airy Trumpet" hbank="4" lbank="7" prog="100"/>
+<Patch name="Movie Brass" hbank="4" lbank="4" prog="14"/>
+<Patch name="Louis" hbank="4" lbank="7" prog="117"/>
+<Patch name="DonsTrumpet" hbank="4" lbank="7" prog="112"/>
+<Patch name="Trump FX etc" hbank="4" lbank="0" prog="9"/>
+<Patch name="Huge Brass" hbank="4" lbank="7" prog="116"/>
+<Patch name="BrassControl" hbank="4" lbank="7" prog="106"/>
+<Patch name="Trumpet FX 1" hbank="4" lbank="0" prog="10"/>
+<Patch name="Soft Trumpet" hbank="4" lbank="0" prog="1"/>
+<Patch name="Too Bahhd" hbank="4" lbank="0" prog="5"/>
+<Patch name="Solo Bone" hbank="4" lbank="0" prog="2"/>
+</PatchGroup>
+<PatchGroup name="bs1">
+<Patch name="DynoStandUp" hbank="4" lbank="5" prog="40"/>
+<Patch name="Upright Days" hbank="4" lbank="5" prog="44"/>
+<Patch name="A Ku Stq" hbank="4" lbank="4" prog="4"/>
+<Patch name="Upright 2" hbank="4" lbank="5" prog="43"/>
+<Patch name="WalkinUprite" hbank="4" lbank="5" prog="45"/>
+<Patch name="Upright 1" hbank="4" lbank="5" prog="42"/>
+<Patch name="Acoustic" hbank="4" lbank="5" prog="39"/>
+<Patch name="Up ~" hbank="4" lbank="5" prog="41"/>
+</PatchGroup>
+<PatchGroup name="bs2">
+<Patch name="Fingered In" hbank="4" lbank="5" prog="57"/>
+<Patch name="Big Basic" hbank="4" lbank="5" prog="47"/>
+<Patch name="Slap 1" hbank="4" lbank="5" prog="77"/>
+<Patch name="EP 2" hbank="4" lbank="5" prog="49"/>
+<Patch name="Fretlessd" hbank="4" lbank="5" prog="63"/>
+<Patch name="Sloppiest" hbank="4" lbank="5" prog="86"/>
+<Patch name="Signfeld Pop" hbank="4" lbank="5" prog="76"/>
+<Patch name="Pop Slide 1" hbank="4" lbank="5" prog="72"/>
+<Patch name="Fretless 4" hbank="4" lbank="5" prog="61"/>
+<Patch name="Finger Harmz" hbank="4" lbank="5" prog="54"/>
+<Patch name="EP Bass" hbank="4" lbank="5" prog="51"/>
+<Patch name="SlapBack" hbank="4" lbank="5" prog="83"/>
+<Patch name="Slappity" hbank="4" lbank="5" prog="84"/>
+<Patch name="BADtube" hbank="4" lbank="5" prog="46"/>
+<Patch name="EP 3" hbank="4" lbank="5" prog="50"/>
+<Patch name="Finger1" hbank="4" lbank="5" prog="55"/>
+<Patch name="EP 1" hbank="4" lbank="5" prog="48"/>
+<Patch name="Harmonics" hbank="4" lbank="5" prog="67"/>
+<Patch name="MelloRounder" hbank="4" lbank="5" prog="68"/>
+<Patch name="Full Finger" hbank="4" lbank="5" prog="65"/>
+<Patch name="VeloFretless" hbank="4" lbank="5" prog="89"/>
+<Patch name="Pop Slide 3" hbank="4" lbank="5" prog="74"/>
+<Patch name="Finger2" hbank="4" lbank="5" prog="56"/>
+<Patch name="Slap 4" hbank="4" lbank="5" prog="80"/>
+<Patch name="Fretless 5" hbank="4" lbank="5" prog="62"/>
+<Patch name="Fing&amp;Harms 2" hbank="4" lbank="4" prog="35"/>
+<Patch name="FretterNot" hbank="4" lbank="5" prog="64"/>
+<Patch name="Fretless 2" hbank="4" lbank="5" prog="59"/>
+<Patch name="Pop" hbank="4" lbank="5" prog="71"/>
+<Patch name="Slop Bass" hbank="4" lbank="5" prog="85"/>
+<Patch name="Slap 5" hbank="4" lbank="5" prog="81"/>
+<Patch name="Pop Slide 2" hbank="4" lbank="5" prog="73"/>
+<Patch name="Picked" hbank="4" lbank="5" prog="69"/>
+<Patch name="Gruzzy Pop" hbank="4" lbank="5" prog="66"/>
+<Patch name="Finger Out" hbank="4" lbank="5" prog="53"/>
+<Patch name="Slap Me!" hbank="4" lbank="5" prog="82"/>
+<Patch name="Fing&amp;Harms 1" hbank="4" lbank="5" prog="52"/>
+<Patch name="Slap 2" hbank="4" lbank="5" prog="78"/>
+<Patch name="Slap 3" hbank="4" lbank="5" prog="79"/>
+<Patch name="ThickFretles" hbank="4" lbank="5" prog="88"/>
+<Patch name="Fretless 1" hbank="4" lbank="5" prog="58"/>
+<Patch name="Fretless 3" hbank="4" lbank="5" prog="60"/>
+<Patch name="Picked Off" hbank="4" lbank="5" prog="70"/>
+<Patch name="Pop Slide 4" hbank="4" lbank="5" prog="75"/>
+<Patch name="Spankin" hbank="4" lbank="5" prog="87"/>
+</PatchGroup>
+<PatchGroup name="bs3">
+<Patch name="Analow" hbank="4" lbank="5" prog="91"/>
+<Patch name="Lowness" hbank="4" lbank="5" prog="109"/>
+<Patch name="Ice" hbank="4" lbank="5" prog="106"/>
+<Patch name="Way Low Down" hbank="4" lbank="6" prog="6"/>
+<Patch name="Plex" hbank="4" lbank="5" prog="114"/>
+<Patch name="Super Sub" hbank="4" lbank="6" prog="2"/>
+<Patch name="Poly Style" hbank="4" lbank="5" prog="115"/>
+<Patch name="ZuB CoMpLeX" hbank="4" lbank="6" prog="8"/>
+<Patch name="Homeboy E" hbank="4" lbank="5" prog="105"/>
+<Patch name="Sub Core" hbank="4" lbank="5" prog="123"/>
+<Patch name="Below Sub" hbank="4" lbank="5" prog="97"/>
+<Patch name="Planet Bass" hbank="4" lbank="5" prog="113"/>
+<Patch name="Spanker" hbank="4" lbank="5" prog="121"/>
+<Patch name="Subtle Bass" hbank="4" lbank="6" prog="1"/>
+<Patch name="RoundabouT" hbank="4" lbank="5" prog="117"/>
+<Patch name="DB Sub" hbank="4" lbank="5" prog="99"/>
+<Patch name="Sub Drop" hbank="4" lbank="5" prog="124"/>
+<Patch name="HipPocket" hbank="4" lbank="5" prog="104"/>
+<Patch name="MassiveMini" hbank="4" lbank="5" prog="110"/>
+<Patch name="Real Low" hbank="4" lbank="5" prog="116"/>
+<Patch name="Easy" hbank="4" lbank="5" prog="100"/>
+<Patch name="JP-Moog 4" hbank="4" lbank="5" prog="107"/>
+<Patch name="Wide Chorus" hbank="4" lbank="6" prog="7"/>
+<Patch name="Sub Plunk" hbank="4" lbank="5" prog="125"/>
+<Patch name="Thip Kong" hbank="4" lbank="6" prog="5"/>
+<Patch name="ATC 3" hbank="4" lbank="5" prog="94"/>
+<Patch name="ATC 1" hbank="4" lbank="5" prog="92"/>
+<Patch name="SE Sub 1" hbank="4" lbank="5" prog="119"/>
+<Patch name="Big Basic" hbank="4" lbank="5" prog="98"/>
+<Patch name="Moogy Mudd" hbank="4" lbank="5" prog="112"/>
+<Patch name="Sub Pummeled" hbank="4" lbank="5" prog="127"/>
+<Patch name="Four U" hbank="4" lbank="5" prog="103"/>
+<Patch name="Line" hbank="4" lbank="5" prog="108"/>
+<Patch name="Thickley Dub" hbank="4" lbank="6" prog="4"/>
+<Patch name="SE Sub 2" hbank="4" lbank="5" prog="120"/>
+<Patch name="MooG DropS" hbank="4" lbank="5" prog="111"/>
+<Patch name="ATC 4" hbank="4" lbank="5" prog="95"/>
+<Patch name="Fat Sunbass" hbank="4" lbank="5" prog="102"/>
+<Patch name="Sub Poke" hbank="4" lbank="5" prog="126"/>
+<Patch name="SE Micro" hbank="4" lbank="5" prog="118"/>
+<Patch name="26" hbank="4" lbank="5" prog="90"/>
+<Patch name="The Tunnel" hbank="4" lbank="6" prog="3"/>
+<Patch name="Beauty" hbank="4" lbank="5" prog="96"/>
+<Patch name="ATC 2" hbank="4" lbank="5" prog="93"/>
+<Patch name="Sub-Basement" hbank="4" lbank="6" prog="0"/>
+<Patch name="Spkr Damage" hbank="4" lbank="5" prog="122"/>
+<Patch name="Face Bass" hbank="4" lbank="5" prog="101"/>
+</PatchGroup>
+<PatchGroup name="bs4">
+<Patch name="Reverend JB" hbank="4" lbank="6" prog="66"/>
+<Patch name="Synth 4" hbank="4" lbank="6" prog="81"/>
+<Patch name="Synth 2" hbank="4" lbank="6" prog="79"/>
+<Patch name="Lukes Best" hbank="4" lbank="6" prog="38"/>
+<Patch name="Power Q" hbank="4" lbank="6" prog="58"/>
+<Patch name="TB 1" hbank="4" lbank="6" prog="88"/>
+<Patch name="Q Attack" hbank="4" lbank="6" prog="60"/>
+<Patch name="TB 2" hbank="4" lbank="6" prog="89"/>
+<Patch name="Moog Tri" hbank="4" lbank="6" prog="49"/>
+<Patch name="Analogic" hbank="4" lbank="6" prog="12"/>
+<Patch name="Bondomatic" hbank="4" lbank="6" prog="18"/>
+<Patch name="Q Snap" hbank="4" lbank="6" prog="65"/>
+<Patch name="Sync Echo" hbank="4" lbank="6" prog="77"/>
+<Patch name="Sobered Up" hbank="4" lbank="6" prog="75"/>
+<Patch name="FP Powerbass" hbank="4" lbank="6" prog="33"/>
+<Patch name="Mini More" hbank="4" lbank="6" prog="45"/>
+<Patch name="Q Bass 1" hbank="4" lbank="6" prog="61"/>
+<Patch name="Synth 8" hbank="4" lbank="6" prog="85"/>
+<Patch name="Mini 2" hbank="4" lbank="6" prog="42"/>
+<Patch name="Walky Talk" hbank="4" lbank="4" prog="24"/>
+<Patch name="DB" hbank="4" lbank="6" prog="24"/>
+<Patch name="Acid 4 Ever" hbank="4" lbank="6" prog="11"/>
+<Patch name="Moog 1" hbank="4" lbank="6" prog="47"/>
+<Patch name="Mod da Wheel" hbank="4" lbank="6" prog="46"/>
+<Patch name="Memory Moog" hbank="4" lbank="6" prog="39"/>
+<Patch name="PuLs Ating" hbank="4" lbank="6" prog="59"/>
+<Patch name="Q Bass 2" hbank="4" lbank="6" prog="62"/>
+<Patch name="AnalogPlanet" hbank="4" lbank="4" prog="8"/>
+<Patch name="FM Sonic" hbank="4" lbank="6" prog="32"/>
+<Patch name="DB9 1" hbank="4" lbank="6" prog="25"/>
+<Patch name="FM" hbank="4" lbank="6" prog="31"/>
+<Patch name="Synth 6" hbank="4" lbank="6" prog="83"/>
+<Patch name="Deep Pocket" hbank="4" lbank="6" prog="27"/>
+<Patch name="Bass Hit" hbank="4" lbank="6" prog="14"/>
+<Patch name="Moog 2" hbank="4" lbank="6" prog="48"/>
+<Patch name="Brolins 1st" hbank="4" lbank="6" prog="20"/>
+<Patch name="Examination" hbank="4" lbank="6" prog="30"/>
+<Patch name="Q Bass 3" hbank="4" lbank="6" prog="63"/>
+<Patch name="Distorto-TB" hbank="4" lbank="6" prog="29"/>
+<Patch name="Q Bass 4" hbank="4" lbank="6" prog="64"/>
+<Patch name="Synth 7" hbank="4" lbank="6" prog="84"/>
+<Patch name="Synth" hbank="4" lbank="6" prog="87"/>
+<Patch name="Tres o Tres" hbank="4" lbank="6" prog="94"/>
+<Patch name="SE 2" hbank="4" lbank="6" prog="71"/>
+<Patch name="Mini 3" hbank="4" lbank="6" prog="43"/>
+<Patch name="Octave" hbank="4" lbank="6" prog="53"/>
+<Patch name="TB 3" hbank="4" lbank="6" prog="90"/>
+<Patch name="Tight Mo MW" hbank="4" lbank="6" prog="93"/>
+<Patch name="Synth 5" hbank="4" lbank="6" prog="82"/>
+<Patch name="DB9 2" hbank="4" lbank="6" prog="26"/>
+<Patch name="Bass ic" hbank="4" lbank="6" prog="15"/>
+<Patch name="Bernie Funk" hbank="4" lbank="6" prog="16"/>
+<Patch name="Acid" hbank="4" lbank="6" prog="10"/>
+<Patch name="Brite Beauty" hbank="4" lbank="6" prog="19"/>
+<Patch name="JP4 Bass" hbank="4" lbank="6" prog="36"/>
+<Patch name="Crystal Meth" hbank="4" lbank="6" prog="22"/>
+<Patch name="HaLLoW !" hbank="4" lbank="6" prog="34"/>
+<Patch name="Ripped3" hbank="4" lbank="6" prog="67"/>
+<Patch name="Simple 3" hbank="4" lbank="6" prog="74"/>
+<Patch name="Sugar Freak" hbank="4" lbank="4" prog="18"/>
+<Patch name="Big Sync" hbank="4" lbank="6" prog="17"/>
+<Patch name="SE 1" hbank="4" lbank="6" prog="70"/>
+<Patch name="Mini 1" hbank="4" lbank="6" prog="41"/>
+<Patch name="Not So Mini" hbank="4" lbank="6" prog="51"/>
+<Patch name="Thunk" hbank="4" lbank="6" prog="92"/>
+<Patch name="Mini 4" hbank="4" lbank="6" prog="44"/>
+<Patch name="Osc-Kars" hbank="4" lbank="6" prog="55"/>
+<Patch name="Digi-Punch" hbank="4" lbank="6" prog="28"/>
+<Patch name="Walky Talk2" hbank="4" lbank="6" prog="95"/>
+<Patch name="Synth 9" hbank="4" lbank="6" prog="86"/>
+<Patch name="In the Money" hbank="4" lbank="6" prog="35"/>
+<Patch name="Occitan Root" hbank="4" lbank="6" prog="52"/>
+<Patch name="Plexy" hbank="4" lbank="6" prog="57"/>
+<Patch name="Micro" hbank="4" lbank="6" prog="40"/>
+<Patch name="Org Gruz" hbank="4" lbank="6" prog="54"/>
+<Patch name="Saw Sync" hbank="4" lbank="6" prog="68"/>
+<Patch name="Shift" hbank="4" lbank="6" prog="73"/>
+<Patch name="Synth 1" hbank="4" lbank="6" prog="78"/>
+<Patch name="Asidic Bass" hbank="4" lbank="6" prog="13"/>
+<Patch name="01.10.2005" hbank="4" lbank="6" prog="23"/>
+<Patch name="3 O WorM" hbank="4" lbank="6" prog="9"/>
+<Patch name="StraytUPjunO" hbank="4" lbank="6" prog="76"/>
+<Patch name="TB 4" hbank="4" lbank="6" prog="91"/>
+<Patch name="SE One" hbank="4" lbank="6" prog="72"/>
+<Patch name="Sawz" hbank="4" lbank="6" prog="69"/>
+<Patch name="Mr. Clean" hbank="4" lbank="6" prog="50"/>
+<Patch name="Juno" hbank="4" lbank="6" prog="37"/>
+<Patch name="PercoOrgana" hbank="4" lbank="6" prog="56"/>
+<Patch name="Synth 3" hbank="4" lbank="6" prog="80"/>
+<Patch name="Buzza" hbank="4" lbank="6" prog="21"/>
+</PatchGroup>
+<PatchGroup name="bs5">
+<Patch name="Organ Bass 1" hbank="4" lbank="6" prog="110"/>
+<Patch name="WetMonica" hbank="4" lbank="7" prog="4"/>
+<Patch name="Street" hbank="4" lbank="6" prog="124"/>
+<Patch name="Buzzed" hbank="4" lbank="6" prog="97"/>
+<Patch name="Ultimate 3" hbank="4" lbank="7" prog="1"/>
+<Patch name="Mozambique" hbank="4" lbank="6" prog="107"/>
+<Patch name="Thickener" hbank="4" lbank="6" prog="126"/>
+<Patch name="Organ Bass 2" hbank="4" lbank="6" prog="111"/>
+<Patch name="Ultimate 2" hbank="4" lbank="7" prog="0"/>
+<Patch name="DX 2" hbank="4" lbank="6" prog="99"/>
+<Patch name="Funkalicous" hbank="4" lbank="6" prog="102"/>
+<Patch name="Sonics" hbank="4" lbank="6" prog="120"/>
+<Patch name="Oh Yea" hbank="4" lbank="6" prog="109"/>
+<Patch name="Soft &amp; Hard" hbank="4" lbank="6" prog="119"/>
+<Patch name="Home 1" hbank="4" lbank="6" prog="103"/>
+<Patch name="All Purpose" hbank="4" lbank="6" prog="96"/>
+<Patch name="Phlappy" hbank="4" lbank="6" prog="113"/>
+<Patch name="Ultimate 1" hbank="4" lbank="6" prog="127"/>
+<Patch name="Standard" hbank="4" lbank="6" prog="123"/>
+<Patch name="Pocket" hbank="4" lbank="6" prog="114"/>
+<Patch name="Smoothy" hbank="4" lbank="6" prog="118"/>
+<Patch name="Pure" hbank="4" lbank="6" prog="115"/>
+<Patch name="DX 1" hbank="4" lbank="6" prog="98"/>
+<Patch name="Tapp" hbank="4" lbank="6" prog="125"/>
+<Patch name="VP1 2" hbank="4" lbank="7" prog="3"/>
+<Patch name="Home 2" hbank="4" lbank="6" prog="104"/>
+<Patch name="Perco" hbank="4" lbank="6" prog="112"/>
+<Patch name="VP1 1" hbank="4" lbank="7" prog="2"/>
+<Patch name="Say What" hbank="4" lbank="6" prog="116"/>
+<Patch name="DX 3" hbank="4" lbank="6" prog="100"/>
+<Patch name="Hybrid" hbank="4" lbank="6" prog="105"/>
+<Patch name="Feeder" hbank="4" lbank="6" prog="101"/>
+<Patch name="Spitt" hbank="4" lbank="6" prog="121"/>
+<Patch name="Slider" hbank="4" lbank="6" prog="117"/>
+<Patch name="Spread" hbank="4" lbank="6" prog="122"/>
+<Patch name="Mozamdrip" hbank="4" lbank="6" prog="108"/>
+<Patch name="Knocker" hbank="4" lbank="6" prog="106"/>
+</PatchGroup>
+<PatchGroup name="gtr">
+<Patch name="Heavy Mon" hbank="4" lbank="7" prog="21"/>
+<Patch name="Distorter-X" hbank="4" lbank="7" prog="10"/>
+<Patch name="Cry Babies" hbank="4" lbank="7" prog="8"/>
+<Patch name="Wah Minor" hbank="4" lbank="7" prog="55"/>
+<Patch name="Nye Lonny" hbank="4" lbank="7" prog="36"/>
+<Patch name="Chuckin" hbank="4" lbank="7" prog="7"/>
+<Patch name="TwangyNylon" hbank="4" lbank="7" prog="53"/>
+<Patch name="Power 1" hbank="4" lbank="7" prog="42"/>
+<Patch name="Rezatronics" hbank="4" lbank="7" prog="44"/>
+<Patch name="Waaaa Waaaa" hbank="4" lbank="7" prog="54"/>
+<Patch name="Looz 12s" hbank="4" lbank="7" prog="26"/>
+<Patch name="Slippery Joe" hbank="4" lbank="7" prog="45"/>
+<Patch name="Electric 2" hbank="4" lbank="7" prog="15"/>
+<Patch name="Carlos" hbank="4" lbank="7" prog="5"/>
+<Patch name="ThickPick" hbank="4" lbank="7" prog="52"/>
+<Patch name="MutableJazz" hbank="4" lbank="7" prog="29"/>
+<Patch name="Metal Head" hbank="4" lbank="7" prog="28"/>
+<Patch name="EmmTV Crunch" hbank="4" lbank="7" prog="17"/>
+<Patch name="FullNylon" hbank="4" lbank="7" prog="19"/>
+<Patch name="WaaKeeGa" hbank="4" lbank="4" prog="38"/>
+<Patch name="LA Strata" hbank="4" lbank="7" prog="25"/>
+<Patch name="Power 2" hbank="4" lbank="7" prog="43"/>
+<Patch name="MellowElect" hbank="4" lbank="7" prog="27"/>
+<Patch name="SlipSly" hbank="4" lbank="7" prog="46"/>
+<Patch name="Steel Real" hbank="4" lbank="7" prog="49"/>
+<Patch name="Dark Gut" hbank="4" lbank="7" prog="9"/>
+<Patch name="Grusty" hbank="4" lbank="4" prog="3"/>
+<Patch name="FlangnVioWah" hbank="4" lbank="7" prog="18"/>
+<Patch name="El Mute 2" hbank="4" lbank="7" prog="13"/>
+<Patch name="JangleWah" hbank="4" lbank="7" prog="22"/>
+<Patch name="FunkChunk" hbank="4" lbank="7" prog="20"/>
+<Patch name="Mute-Ted" hbank="4" lbank="7" prog="32"/>
+<Patch name="Nrysty12" hbank="4" lbank="7" prog="35"/>
+<Patch name="El Mute 1" hbank="4" lbank="7" prog="12"/>
+<Patch name="Stolen7Away" hbank="4" lbank="4" prog="13"/>
+<Patch name="ElectricDis" hbank="4" lbank="7" prog="16"/>
+<Patch name="Nylonistic" hbank="4" lbank="7" prog="40"/>
+<Patch name="Dolobroso" hbank="4" lbank="7" prog="11"/>
+<Patch name="Jazzed" hbank="4" lbank="7" prog="24"/>
+<Patch name="Nylon Silk" hbank="4" lbank="7" prog="38"/>
+<Patch name="WahWah Spice" hbank="4" lbank="7" prog="56"/>
+<Patch name="Pantastic" hbank="4" lbank="7" prog="41"/>
+<Patch name="Cast Teller" hbank="4" lbank="7" prog="6"/>
+<Patch name="The 12String" hbank="4" lbank="7" prog="51"/>
+<Patch name="Spy" hbank="4" lbank="7" prog="47"/>
+<Patch name="Jazz" hbank="4" lbank="7" prog="23"/>
+<Patch name="Strat Wow" hbank="4" lbank="7" prog="50"/>
+<Patch name="Electric 1" hbank="4" lbank="7" prog="14"/>
+<Patch name="Mutes" hbank="4" lbank="7" prog="33"/>
+<Patch name="Steel" hbank="4" lbank="7" prog="48"/>
+<Patch name="NyloSteel" hbank="4" lbank="4" prog="32"/>
+<Patch name="Mutant Pick" hbank="4" lbank="7" prog="30"/>
+<Patch name="Nylon" hbank="4" lbank="7" prog="37"/>
+<Patch name="Nrysty" hbank="4" lbank="7" prog="34"/>
+<Patch name="Nylon Vox" hbank="4" lbank="7" prog="39"/>
+<Patch name="Mute Gtr vsw" hbank="4" lbank="7" prog="31"/>
+</PatchGroup>
+<PatchGroup name="hit">
+<Patch name="Dance Hits 1" hbank="4" lbank="2" prog="48"/>
+<Patch name="MasterBlast" hbank="4" lbank="4" prog="31"/>
+<Patch name="Guitars" hbank="4" lbank="2" prog="54"/>
+<Patch name="Brass Hits 2" hbank="4" lbank="2" prog="42"/>
+<Patch name="Brass Hitz" hbank="4" lbank="2" prog="46"/>
+<Patch name="Vox Grunts" hbank="4" lbank="2" prog="65"/>
+<Patch name="Dirt Strings" hbank="4" lbank="2" prog="51"/>
+<Patch name="Fashion" hbank="4" lbank="2" prog="52"/>
+<Patch name="Big Band" hbank="4" lbank="2" prog="37"/>
+<Patch name="Garagiste" hbank="4" lbank="2" prog="53"/>
+<Patch name="Alta Trumpt" hbank="4" lbank="2" prog="34"/>
+<Patch name="Sax Scandals" hbank="4" lbank="2" prog="61"/>
+<Patch name="Orch Fatlow" hbank="4" lbank="2" prog="56"/>
+<Patch name="Brass Hits 3" hbank="4" lbank="2" prog="43"/>
+<Patch name="Vox Hits 1" hbank="4" lbank="2" prog="66"/>
+<Patch name="Organ Hits 1" hbank="4" lbank="2" prog="57"/>
+<Patch name="String Hits" hbank="4" lbank="2" prog="63"/>
+<Patch name="Punch Prak" hbank="4" lbank="2" prog="60"/>
+<Patch name="Dance Hits 2" hbank="4" lbank="2" prog="49"/>
+<Patch name="Guitarzits" hbank="4" lbank="2" prog="55"/>
+<Patch name="Deep Brass" hbank="4" lbank="2" prog="50"/>
+<Patch name="Synth Basses" hbank="4" lbank="2" prog="64"/>
+<Patch name="Poker" hbank="4" lbank="2" prog="59"/>
+<Patch name="Skweeler" hbank="4" lbank="2" prog="62"/>
+<Patch name="Brass Bite" hbank="4" lbank="2" prog="40"/>
+<Patch name="Vox Hitties" hbank="4" lbank="2" prog="68"/>
+<Patch name="Bass Slips" hbank="4" lbank="2" prog="35"/>
+<Patch name="Brass Hits 1" hbank="4" lbank="2" prog="41"/>
+<Patch name="Basses" hbank="4" lbank="2" prog="36"/>
+<Patch name="Da Danzits" hbank="4" lbank="2" prog="47"/>
+<Patch name="Brass Batz" hbank="4" lbank="2" prog="39"/>
+<Patch name="Organ Hits 2" hbank="4" lbank="2" prog="58"/>
+<Patch name="Brass Hits 4" hbank="4" lbank="2" prog="44"/>
+<Patch name="Biggy Brass" hbank="4" lbank="2" prog="38"/>
+<Patch name="Brass Hittas" hbank="4" lbank="2" prog="45"/>
+<Patch name="Vox Hits 2" hbank="4" lbank="2" prog="67"/>
+</PatchGroup>
+<PatchGroup name="kb1">
+<Patch name="Sung Piano" hbank="4" lbank="4" prog="57"/>
+<Patch name="Concert Pno" hbank="4" lbank="4" prog="42"/>
+<Patch name="Grande" hbank="4" lbank="4" prog="45"/>
+<Patch name="Layer Piano" hbank="4" lbank="4" prog="48"/>
+<Patch name="Piano&amp;Strng2" hbank="4" lbank="4" prog="52"/>
+<Patch name="HonkTonkeyz" hbank="4" lbank="4" prog="46"/>
+<Patch name="Chime Grand" hbank="4" lbank="4" prog="41"/>
+<Patch name="StereoGrand2" hbank="4" lbank="4" prog="54"/>
+<Patch name="StereoGrand1" hbank="4" lbank="4" prog="53"/>
+<Patch name="Techno Piano" hbank="4" lbank="4" prog="58"/>
+<Patch name="Miami Grand" hbank="4" lbank="4" prog="49"/>
+<Patch name="Piano Mio" hbank="4" lbank="4" prog="50"/>
+<Patch name="Dance Pno" hbank="4" lbank="4" prog="43"/>
+<Patch name="Piano&amp;Strng1" hbank="4" lbank="4" prog="51"/>
+<Patch name="Klassical" hbank="4" lbank="4" prog="47"/>
+<Patch name="Elecro7CP" hbank="4" lbank="4" prog="44"/>
+<Patch name="StereoGrand3" hbank="4" lbank="4" prog="55"/>
+<Patch name="StereoGrand4" hbank="4" lbank="4" prog="56"/>
+<Patch name="Ballad Grand" hbank="4" lbank="4" prog="40"/>
+<Patch name="And Voice" hbank="4" lbank="4" prog="10"/>
+<Patch name="DynamicGrand" hbank="4" lbank="4" prog="0"/>
+</PatchGroup>
+<PatchGroup name="kb2">
+<Patch name="Med Dyno" hbank="4" lbank="4" prog="73"/>
+<Patch name="Hard EP" hbank="4" lbank="4" prog="71"/>
+<Patch name="FM EP 1" hbank="4" lbank="4" prog="67"/>
+<Patch name="WurlitzerSft" hbank="4" lbank="4" prog="81"/>
+<Patch name="Wurlitzer Hd" hbank="4" lbank="4" prog="80"/>
+<Patch name="WurlyDLayer" hbank="4" lbank="4" prog="82"/>
+<Patch name="FM El Piano" hbank="4" lbank="4" prog="66"/>
+<Patch name="Supatramp EP" hbank="4" lbank="4" prog="79"/>
+<Patch name="Classic EP 4" hbank="4" lbank="4" prog="63"/>
+<Patch name="Classic EP 3" hbank="4" lbank="4" prog="62"/>
+<Patch name="PrettyLushEP" hbank="4" lbank="4" prog="76"/>
+<Patch name="Melosoul EP" hbank="4" lbank="4" prog="28"/>
+<Patch name="FM2Classic" hbank="4" lbank="4" prog="69"/>
+<Patch name="Pretty EP" hbank="4" lbank="4" prog="75"/>
+<Patch name="FM EP 2" hbank="4" lbank="4" prog="68"/>
+<Patch name="Hard Tine" hbank="4" lbank="4" prog="72"/>
+<Patch name="Classic EP 1" hbank="4" lbank="4" prog="60"/>
+<Patch name="DooGie" hbank="4" lbank="4" prog="64"/>
+<Patch name="Classic EP 2" hbank="4" lbank="4" prog="61"/>
+<Patch name="Dynofunk EP" hbank="4" lbank="4" prog="65"/>
+<Patch name="Hard Dyno" hbank="4" lbank="4" prog="70"/>
+<Patch name="Suitcase EP" hbank="4" lbank="4" prog="78"/>
+<Patch name="Ballad Tine" hbank="4" lbank="4" prog="59"/>
+<Patch name="Rezzroadz" hbank="4" lbank="4" prog="77"/>
+<Patch name="Lovers Fm EP" hbank="4" lbank="4" prog="36"/>
+<Patch name="WideSuitcase" hbank="4" lbank="4" prog="6"/>
+<Patch name="Med EP" hbank="4" lbank="4" prog="74"/>
+</PatchGroup>
+<PatchGroup name="kb3">
+<Patch name="Simple Organ" hbank="4" lbank="4" prog="111"/>
+<Patch name="Disco" hbank="4" lbank="4" prog="92"/>
+<Patch name="DirtyHertz" hbank="4" lbank="4" prog="91"/>
+<Patch name="Full Organ" hbank="4" lbank="4" prog="97"/>
+<Patch name="Rockin B" hbank="4" lbank="4" prog="5"/>
+<Patch name="Nod" hbank="4" lbank="4" prog="105"/>
+<Patch name="B3OrganWave1" hbank="4" lbank="4" prog="84"/>
+<Patch name="WheelSpeed B" hbank="4" lbank="4" prog="117"/>
+<Patch name="DX Organ" hbank="4" lbank="4" prog="96"/>
+<Patch name="Gritty B Wav" hbank="4" lbank="4" prog="100"/>
+<Patch name="Clicky B" hbank="4" lbank="4" prog="88"/>
+<Patch name="DX" hbank="4" lbank="4" prog="95"/>
+<Patch name="B3 X-Wheel 1" hbank="4" lbank="4" prog="83"/>
+<Patch name="Organomics X" hbank="4" lbank="4" prog="108"/>
+<Patch name="Clean X-Whl" hbank="4" lbank="4" prog="87"/>
+<Patch name="Tone Organ" hbank="4" lbank="4" prog="113"/>
+<Patch name="Org Lite" hbank="4" lbank="4" prog="107"/>
+<Patch name="Testify" hbank="4" lbank="4" prog="112"/>
+<Patch name="GreenEyed" hbank="4" lbank="4" prog="99"/>
+<Patch name="Drawbar" hbank="4" lbank="4" prog="93"/>
+<Patch name="Drawbars" hbank="4" lbank="4" prog="94"/>
+<Patch name="Day" hbank="4" lbank="4" prog="89"/>
+<Patch name="Upper B" hbank="4" lbank="4" prog="114"/>
+<Patch name="DirT baG" hbank="4" lbank="4" prog="90"/>
+<Patch name="Oddd Organ" hbank="4" lbank="4" prog="106"/>
+<Patch name="Vox 2" hbank="4" lbank="4" prog="116"/>
+<Patch name="JX Organ" hbank="4" lbank="4" prog="102"/>
+<Patch name="Grundge XXX" hbank="4" lbank="4" prog="101"/>
+<Patch name="JimmyJazzy B" hbank="4" lbank="4" prog="33"/>
+<Patch name="Gospel Soul" hbank="4" lbank="4" prog="98"/>
+<Patch name="Pipe Organ" hbank="4" lbank="4" prog="110"/>
+<Patch name="B3OrganWave2" hbank="4" lbank="4" prog="85"/>
+<Patch name="Bally Yard" hbank="4" lbank="4" prog="86"/>
+<Patch name="Perc Organ" hbank="4" lbank="4" prog="109"/>
+<Patch name="Kool N Mello" hbank="4" lbank="4" prog="103"/>
+<Patch name="Mellow Man" hbank="4" lbank="4" prog="104"/>
+<Patch name="Vox 1" hbank="4" lbank="4" prog="115"/>
+</PatchGroup>
+<PatchGroup name="kb4">
+<Patch name="Comp Keyz 3" hbank="4" lbank="4" prog="126"/>
+<Patch name="EP Roll 2" hbank="4" lbank="5" prog="10"/>
+<Patch name="Vox-A-Phaze" hbank="4" lbank="5" prog="37"/>
+<Patch name="Electrified" hbank="4" lbank="5" prog="7"/>
+<Patch name="Yo My Dynos" hbank="4" lbank="4" prog="1"/>
+<Patch name="Clavinet 3" hbank="4" lbank="4" prog="121"/>
+<Patch name="Knockkerz" hbank="4" lbank="5" prog="22"/>
+<Patch name="Farfisa 3" hbank="4" lbank="5" prog="14"/>
+<Patch name="Clavinet 1" hbank="4" lbank="4" prog="119"/>
+<Patch name="Elecre 1" hbank="4" lbank="5" prog="4"/>
+<Patch name="Breathy" hbank="4" lbank="4" prog="118"/>
+<Patch name="EP Roll 1" hbank="4" lbank="5" prog="9"/>
+<Patch name="Elecre 3" hbank="4" lbank="5" prog="6"/>
+<Patch name="PnoWndStrg 1" hbank="4" lbank="5" prog="29"/>
+<Patch name="Mystery Roll" hbank="4" lbank="5" prog="24"/>
+<Patch name="Hard Tined" hbank="4" lbank="5" prog="21"/>
+<Patch name="Elecre 2" hbank="4" lbank="5" prog="5"/>
+<Patch name="PerkyRhodes" hbank="4" lbank="5" prog="27"/>
+<Patch name="Hard Comp 4" hbank="4" lbank="5" prog="19"/>
+<Patch name="M12Tines" hbank="4" lbank="5" prog="23"/>
+<Patch name="Whistle Keys" hbank="4" lbank="5" prog="38"/>
+<Patch name="PnoWndStrg 2" hbank="4" lbank="5" prog="30"/>
+<Patch name="Farfisa 1" hbank="4" lbank="5" prog="12"/>
+<Patch name="Synth Cheese" hbank="4" lbank="5" prog="34"/>
+<Patch name="Comp Keyz 1" hbank="4" lbank="4" prog="124"/>
+<Patch name="RollinDreams" hbank="4" lbank="5" prog="32"/>
+<Patch name="Pharpheeza" hbank="4" lbank="5" prog="28"/>
+<Patch name="Dyno Piano" hbank="4" lbank="5" prog="1"/>
+<Patch name="Farfisa 2" hbank="4" lbank="5" prog="13"/>
+<Patch name="EP Roll 3" hbank="4" lbank="5" prog="11"/>
+<Patch name="Comp Keyz 2" hbank="4" lbank="4" prog="125"/>
+<Patch name="Hard Comp 5" hbank="4" lbank="5" prog="20"/>
+<Patch name="DynoWahClav" hbank="4" lbank="5" prog="2"/>
+<Patch name="Clavity" hbank="4" lbank="4" prog="123"/>
+<Patch name="E Grand" hbank="4" lbank="5" prog="3"/>
+<Patch name="Synth Organ" hbank="4" lbank="5" prog="35"/>
+<Patch name="Dance" hbank="4" lbank="5" prog="0"/>
+<Patch name="Roll" hbank="4" lbank="5" prog="31"/>
+<Patch name="Nu Tynez 1" hbank="4" lbank="5" prog="25"/>
+<Patch name="EP Fog" hbank="4" lbank="5" prog="8"/>
+<Patch name="Clavinetti" hbank="4" lbank="4" prog="19"/>
+<Patch name="Hard Comp 2" hbank="4" lbank="5" prog="17"/>
+<Patch name="Hard Comp 1" hbank="4" lbank="5" prog="16"/>
+<Patch name="Clavinet 2" hbank="4" lbank="4" prog="120"/>
+<Patch name="Hard Comp 3" hbank="4" lbank="5" prog="18"/>
+<Patch name="Grand FM" hbank="4" lbank="5" prog="15"/>
+<Patch name="Clavin It" hbank="4" lbank="4" prog="122"/>
+<Patch name="Nu Tynez 2" hbank="4" lbank="5" prog="26"/>
+<Patch name="Tine EP" hbank="4" lbank="5" prog="36"/>
+<Patch name="Syn Ballad" hbank="4" lbank="5" prog="33"/>
+<Patch name="Crystal" hbank="4" lbank="4" prog="127"/>
+</PatchGroup>
+<PatchGroup name="kit">
+<Patch name="Hot Swing" hbank="4" lbank="3" prog="108"/>
+<Patch name="Swing Hop 3" hbank="4" lbank="3" prog="124"/>
+<Patch name="Dance 2" hbank="4" lbank="3" prog="89"/>
+<Patch name="Kit" hbank="4" lbank="4" prog="34"/>
+<Patch name="ClubVinyl" hbank="4" lbank="3" prog="86"/>
+<Patch name="Drum/Bass 1" hbank="4" lbank="3" prog="96"/>
+<Patch name="GritKitt" hbank="4" lbank="3" prog="106"/>
+<Patch name="Dee and Be 1" hbank="4" lbank="3" prog="91"/>
+<Patch name="Skin Drums" hbank="4" lbank="3" prog="117"/>
+<Patch name="SounDfacTory" hbank="4" lbank="3" prog="119"/>
+<Patch name="Clean R&amp;B" hbank="4" lbank="3" prog="85"/>
+<Patch name="Kit 16" hbank="4" lbank="3" prog="74"/>
+<Patch name="Bag O Tricks" hbank="4" lbank="4" prog="27"/>
+<Patch name="Swing Hop 1" hbank="4" lbank="3" prog="122"/>
+<Patch name="Shag" hbank="4" lbank="3" prog="116"/>
+<Patch name="Kit 02" hbank="4" lbank="3" prog="60"/>
+<Patch name="Acoustic 2" hbank="4" lbank="3" prog="79"/>
+<Patch name="Acoustic 1" hbank="4" lbank="4" prog="20"/>
+<Patch name="Subversive" hbank="4" lbank="3" prog="121"/>
+<Patch name="OnTheTip" hbank="4" lbank="3" prog="112"/>
+<Patch name="Drum/Bass 6" hbank="4" lbank="3" prog="101"/>
+<Patch name="Drum/Bass 4" hbank="4" lbank="3" prog="99"/>
+<Patch name="ClassicHouse" hbank="4" lbank="3" prog="84"/>
+<Patch name="BMF" hbank="4" lbank="3" prog="82"/>
+<Patch name="This &amp; That" hbank="4" lbank="3" prog="125"/>
+<Patch name="Kit 19" hbank="4" lbank="3" prog="77"/>
+<Patch name="Kit 12" hbank="4" lbank="3" prog="70"/>
+<Patch name="Booster" hbank="4" lbank="3" prog="83"/>
+<Patch name="Berzerker" hbank="4" lbank="3" prog="81"/>
+<Patch name="Kit 09" hbank="4" lbank="3" prog="67"/>
+<Patch name="DeepBooty" hbank="4" lbank="3" prog="93"/>
+<Patch name="Jazz Trio" hbank="4" lbank="3" prog="111"/>
+<Patch name="Kit 05" hbank="4" lbank="3" prog="63"/>
+<Patch name="Kit 10" hbank="4" lbank="3" prog="68"/>
+<Patch name="Gate Dances" hbank="4" lbank="3" prog="104"/>
+<Patch name="Kit 07" hbank="4" lbank="3" prog="65"/>
+<Patch name="DearLyBeEmuD" hbank="4" lbank="3" prog="90"/>
+<Patch name="Jazz Quartet" hbank="4" lbank="3" prog="110"/>
+<Patch name="Smackers" hbank="4" lbank="3" prog="118"/>
+<Patch name="Speed Garage" hbank="4" lbank="3" prog="120"/>
+<Patch name="Kit 06" hbank="4" lbank="3" prog="64"/>
+<Patch name="Dance 1" hbank="4" lbank="3" prog="88"/>
+<Patch name="Phattasassin" hbank="4" lbank="3" prog="114"/>
+<Patch name="Dee and Be 2" hbank="4" lbank="3" prog="92"/>
+<Patch name="Jams" hbank="4" lbank="3" prog="109"/>
+<Patch name="Kit 15" hbank="4" lbank="3" prog="73"/>
+<Patch name="Drum/Bass 2" hbank="4" lbank="3" prog="97"/>
+<Patch name="For Real" hbank="4" lbank="3" prog="103"/>
+<Patch name="Kit 17" hbank="4" lbank="3" prog="75"/>
+<Patch name="Swing Hop 2" hbank="4" lbank="3" prog="123"/>
+<Patch name="Kit 03" hbank="4" lbank="3" prog="61"/>
+<Patch name="424" hbank="4" lbank="3" prog="59"/>
+<Patch name="Drum/Bass 3" hbank="4" lbank="3" prog="98"/>
+<Patch name="DrumBuzza" hbank="4" lbank="3" prog="102"/>
+<Patch name="Kit 08" hbank="4" lbank="3" prog="66"/>
+<Patch name="Drum/Bass 5" hbank="4" lbank="3" prog="100"/>
+<Patch name="Kit 14" hbank="4" lbank="3" prog="72"/>
+<Patch name="Kit 11" hbank="4" lbank="3" prog="69"/>
+<Patch name="Kit 04" hbank="4" lbank="3" prog="62"/>
+<Patch name="Disenegrate" hbank="4" lbank="3" prog="94"/>
+<Patch name="All Niter" hbank="4" lbank="3" prog="80"/>
+<Patch name="Kit 13" hbank="4" lbank="3" prog="71"/>
+<Patch name="HatAttack" hbank="4" lbank="3" prog="107"/>
+<Patch name="Gett..OutPt2" hbank="4" lbank="3" prog="105"/>
+<Patch name="Werzerker" hbank="4" lbank="3" prog="127"/>
+<Patch name="Phased DrumR" hbank="4" lbank="3" prog="113"/>
+<Patch name="Kit 1" hbank="4" lbank="4" prog="9"/>
+<Patch name="R&amp;B Flava" hbank="4" lbank="3" prog="115"/>
+<Patch name="Tribal House" hbank="4" lbank="3" prog="126"/>
+<Patch name="CookUsAHit" hbank="4" lbank="3" prog="87"/>
+<Patch name="Drum 3" hbank="4" lbank="3" prog="95"/>
+<Patch name="Kit 20" hbank="4" lbank="3" prog="78"/>
+<Patch name="Kit 18" hbank="4" lbank="3" prog="76"/>
+</PatchGroup>
+<PatchGroup name="led">
+<Patch name="Dwiddle" hbank="4" lbank="0" prog="94"/>
+<Patch name="Freakus" hbank="4" lbank="0" prog="97"/>
+<Patch name="Flutter" hbank="4" lbank="0" prog="96"/>
+<Patch name="Speedronic" hbank="4" lbank="0" prog="111"/>
+<Patch name="Ethereosity" hbank="4" lbank="0" prog="95"/>
+<Patch name="Shiner" hbank="4" lbank="0" prog="108"/>
+<Patch name="Apple Eater" hbank="4" lbank="0" prog="90"/>
+<Patch name="Syrian Nod" hbank="4" lbank="0" prog="112"/>
+<Patch name="Blue Danube" hbank="4" lbank="0" prog="91"/>
+<Patch name="LVs Worm" hbank="4" lbank="4" prog="26"/>
+<Patch name="Dancerama" hbank="4" lbank="0" prog="93"/>
+<Patch name="Wandering" hbank="4" lbank="0" prog="113"/>
+<Patch name="RememberWhen" hbank="4" lbank="0" prog="105"/>
+<Patch name="Laser Larry" hbank="4" lbank="0" prog="100"/>
+<Patch name="JabbaStabba" hbank="4" lbank="0" prog="99"/>
+<Patch name="Cats Nip" hbank="4" lbank="0" prog="92"/>
+<Patch name="inBottles" hbank="4" lbank="4" prog="39"/>
+<Patch name="Q Snapper" hbank="4" lbank="0" prog="103"/>
+<Patch name="Post 90s DM" hbank="4" lbank="0" prog="102"/>
+<Patch name="Nice Lead" hbank="4" lbank="0" prog="101"/>
+<Patch name="Worm 2" hbank="4" lbank="0" prog="116"/>
+<Patch name="Intervalis" hbank="4" lbank="0" prog="98"/>
+<Patch name="Quacker" hbank="4" lbank="0" prog="104"/>
+<Patch name="Sci-Fi B" hbank="4" lbank="0" prog="106"/>
+<Patch name="Smack Bender" hbank="4" lbank="0" prog="110"/>
+<Patch name="Worm 1" hbank="4" lbank="0" prog="115"/>
+<Patch name="Zimppler" hbank="4" lbank="4" prog="7"/>
+<Patch name="Weezy Lead" hbank="4" lbank="0" prog="114"/>
+<Patch name="Shimmy" hbank="4" lbank="0" prog="107"/>
+<Patch name="Wormy Janis" hbank="4" lbank="0" prog="118"/>
+<Patch name="SineSurprise" hbank="4" lbank="0" prog="109"/>
+<Patch name="Wormwood" hbank="4" lbank="0" prog="117"/>
+<Patch name="Zaw Za Zah" hbank="4" lbank="0" prog="119"/>
+</PatchGroup>
+<PatchGroup name="nse">
+<Patch name="Carrion" hbank="4" lbank="2" prog="108"/>
+<Patch name="Vinyl" hbank="4" lbank="2" prog="114"/>
+<Patch name="Jungle Pump" hbank="4" lbank="2" prog="110"/>
+<Patch name="StopThat!" hbank="4" lbank="2" prog="113"/>
+<Patch name="White" hbank="4" lbank="2" prog="115"/>
+<Patch name="Dust Bunny" hbank="4" lbank="2" prog="109"/>
+<Patch name="Pink" hbank="4" lbank="2" prog="112"/>
+<Patch name="Lift Off" hbank="4" lbank="2" prog="111"/>
+</PatchGroup>
+<PatchGroup name="orc">
+<Patch name="Orch w/Perc" hbank="4" lbank="2" prog="72"/>
+<Patch name="Orchestral" hbank="4" lbank="4" prog="2"/>
+<Patch name="PnoBrsStrg" hbank="4" lbank="2" prog="74"/>
+<Patch name="Brasso" hbank="4" lbank="2" prog="69"/>
+<Patch name="Fanfare" hbank="4" lbank="2" prog="71"/>
+<Patch name="Str/Brs/Wd2" hbank="4" lbank="2" prog="76"/>
+<Patch name="Combo" hbank="4" lbank="2" prog="70"/>
+<Patch name="Orchestra" hbank="4" lbank="2" prog="73"/>
+<Patch name="Str/Brs/Wd3" hbank="4" lbank="2" prog="77"/>
+<Patch name="Str/Brs/Wd1" hbank="4" lbank="2" prog="75"/>
+</PatchGroup>
+<PatchGroup name="pad">
+<Patch name="PWM Rezslide" hbank="4" lbank="2" prog="9"/>
+<Patch name="Kingdom High" hbank="4" lbank="1" prog="125"/>
+<Patch name="Classic" hbank="4" lbank="1" prog="110"/>
+<Patch name="Paddy" hbank="4" lbank="2" prog="3"/>
+<Patch name="Tunguska" hbank="4" lbank="2" prog="14"/>
+<Patch name="Under Pad FM" hbank="4" lbank="2" prog="15"/>
+<Patch name="Deep Spacy" hbank="4" lbank="1" prog="115"/>
+<Patch name="Xylo Pad" hbank="4" lbank="2" prog="18"/>
+<Patch name="MovingBells" hbank="4" lbank="2" prog="1"/>
+<Patch name="Dreamer" hbank="4" lbank="1" prog="117"/>
+<Patch name="Meloden" hbank="4" lbank="1" prog="127"/>
+<Patch name="Keyngdom" hbank="4" lbank="1" prog="124"/>
+<Patch name="Pulsation" hbank="4" lbank="2" prog="7"/>
+<Patch name="JP6 Pad" hbank="4" lbank="1" prog="123"/>
+<Patch name="Dream Pad" hbank="4" lbank="1" prog="116"/>
+<Patch name="Infants" hbank="4" lbank="1" prog="122"/>
+<Patch name="LOCoMotion" hbank="4" lbank="1" prog="126"/>
+<Patch name="Zoom 2000!" hbank="4" lbank="2" prog="20"/>
+<Patch name="RiffTrippin" hbank="4" lbank="2" prog="10"/>
+<Patch name="Dance Chord" hbank="4" lbank="1" prog="113"/>
+<Patch name="Pad Life" hbank="4" lbank="2" prog="2"/>
+<Patch name="Dreamy" hbank="4" lbank="1" prog="118"/>
+<Patch name="Phat Pan" hbank="4" lbank="2" prog="6"/>
+<Patch name="Dances Well" hbank="4" lbank="1" prog="114"/>
+<Patch name="Urban Pipe" hbank="4" lbank="2" prog="16"/>
+<Patch name="Highway" hbank="4" lbank="1" prog="121"/>
+<Patch name="Whisp" hbank="4" lbank="2" prog="17"/>
+<Patch name="Crystal Beam" hbank="4" lbank="1" prog="112"/>
+<Patch name="Spinwip Octa" hbank="4" lbank="2" prog="11"/>
+<Patch name="Paddy Flange" hbank="4" lbank="2" prog="4"/>
+<Patch name="PWM Melopadd" hbank="4" lbank="2" prog="8"/>
+<Patch name="Zoom" hbank="4" lbank="2" prog="19"/>
+<Patch name="Cloud 9" hbank="4" lbank="1" prog="111"/>
+<Patch name="Synth Pad" hbank="4" lbank="2" prog="13"/>
+<Patch name="Floatatious" hbank="4" lbank="1" prog="119"/>
+<Patch name="GreaT" hbank="4" lbank="1" prog="120"/>
+<Patch name="Zyzzle" hbank="4" lbank="2" prog="21"/>
+<Patch name="Phat Pad" hbank="4" lbank="2" prog="5"/>
+<Patch name="MetalBeats" hbank="4" lbank="2" prog="0"/>
+<Patch name="SweptAway" hbank="4" lbank="2" prog="12"/>
+</PatchGroup>
+<PatchGroup name="prc">
+<Patch name="Bells1" hbank="4" lbank="3" prog="4"/>
+<Patch name="Borneo" hbank="4" lbank="3" prog="8"/>
+<Patch name="Blocks2" hbank="4" lbank="3" prog="7"/>
+<Patch name="Kix 1" hbank="4" lbank="3" prog="26"/>
+<Patch name="Bells2" hbank="4" lbank="3" prog="5"/>
+<Patch name="Xylophone" hbank="4" lbank="3" prog="58"/>
+<Patch name="Tams 2" hbank="4" lbank="3" prog="47"/>
+<Patch name="Orchestral" hbank="4" lbank="3" prog="32"/>
+<Patch name="TV Spy Vibes" hbank="4" lbank="3" prog="53"/>
+<Patch name="PerkyThings1" hbank="4" lbank="3" prog="34"/>
+<Patch name="Vibraslap" hbank="4" lbank="3" prog="55"/>
+<Patch name="C Bells" hbank="4" lbank="3" prog="9"/>
+<Patch name="Cyms 1" hbank="4" lbank="3" prog="16"/>
+<Patch name="Congas2" hbank="4" lbank="3" prog="15"/>
+<Patch name="Snares 2" hbank="4" lbank="3" prog="42"/>
+<Patch name="Hard Vibes" hbank="4" lbank="3" prog="21"/>
+<Patch name="Stuff 2" hbank="4" lbank="3" prog="45"/>
+<Patch name="Village" hbank="4" lbank="3" prog="56"/>
+<Patch name="Cargo" hbank="4" lbank="3" prog="10"/>
+<Patch name="Electro" hbank="4" lbank="3" prog="18"/>
+<Patch name="Log On" hbank="4" lbank="3" prog="28"/>
+<Patch name="Toms 2" hbank="4" lbank="3" prog="52"/>
+<Patch name="Plexitone" hbank="4" lbank="3" prog="36"/>
+<Patch name="Velo Vibes" hbank="4" lbank="3" prog="54"/>
+<Patch name="Congas1" hbank="4" lbank="3" prog="14"/>
+<Patch name="Agogos" hbank="4" lbank="3" prog="1"/>
+<Patch name="Hats 1" hbank="4" lbank="3" prog="22"/>
+<Patch name="Flexi" hbank="4" lbank="3" prog="19"/>
+<Patch name="Miscellany" hbank="4" lbank="3" prog="31"/>
+<Patch name="Bell Tree 1" hbank="4" lbank="3" prog="2"/>
+<Patch name="Toms 1" hbank="4" lbank="3" prog="51"/>
+<Patch name="Blocks1" hbank="4" lbank="3" prog="6"/>
+<Patch name="Snares 1" hbank="4" lbank="3" prog="41"/>
+<Patch name="Timbs 1" hbank="4" lbank="3" prog="48"/>
+<Patch name="Soft Vibes" hbank="4" lbank="3" prog="43"/>
+<Patch name="Timbs 2" hbank="4" lbank="3" prog="49"/>
+<Patch name="Hats 2" hbank="4" lbank="3" prog="23"/>
+<Patch name="Claves" hbank="4" lbank="3" prog="13"/>
+<Patch name="Timpani" hbank="4" lbank="3" prog="50"/>
+<Patch name="Progress" hbank="4" lbank="3" prog="37"/>
+<Patch name="Guiros" hbank="4" lbank="3" prog="20"/>
+<Patch name="Perky Dance" hbank="4" lbank="3" prog="33"/>
+<Patch name="SiameseCats" hbank="4" lbank="3" prog="39"/>
+<Patch name="Hi Bell" hbank="4" lbank="3" prog="24"/>
+<Patch name="Snaps" hbank="4" lbank="3" prog="40"/>
+<Patch name="Kix 2" hbank="4" lbank="3" prog="27"/>
+<Patch name="Claps 2" hbank="4" lbank="3" prog="12"/>
+<Patch name="Bell Tree 2" hbank="4" lbank="3" prog="3"/>
+<Patch name="Stuff 1" hbank="4" lbank="3" prog="44"/>
+<Patch name="Marimba" hbank="4" lbank="3" prog="30"/>
+<Patch name="WoodHitsBell" hbank="4" lbank="3" prog="57"/>
+<Patch name="Acidphone" hbank="4" lbank="3" prog="0"/>
+<Patch name="Maracca" hbank="4" lbank="3" prog="29"/>
+<Patch name="Cyms 2" hbank="4" lbank="3" prog="17"/>
+<Patch name="PerkyThings2" hbank="4" lbank="3" prog="35"/>
+<Patch name="Shakers" hbank="4" lbank="3" prog="38"/>
+<Patch name="Kalimba" hbank="4" lbank="3" prog="25"/>
+<Patch name="Claps 1" hbank="4" lbank="3" prog="11"/>
+<Patch name="Tams 1" hbank="4" lbank="3" prog="46"/>
+</PatchGroup>
+<PatchGroup name="scr">
+<Patch name="Outa Sqaced" hbank="4" lbank="2" prog="121"/>
+<Patch name="From Vinyl" hbank="4" lbank="2" prog="119"/>
+<Patch name="Scratches 1" hbank="4" lbank="2" prog="124"/>
+<Patch name="Scratches 2" hbank="4" lbank="2" prog="125"/>
+<Patch name="Skrach Dis" hbank="4" lbank="2" prog="126"/>
+<Patch name="DissedSkrach" hbank="4" lbank="2" prog="117"/>
+<Patch name="Monsta Slips" hbank="4" lbank="2" prog="120"/>
+<Patch name="PuppyAlarm" hbank="4" lbank="2" prog="123"/>
+<Patch name="DogsnHeat" hbank="4" lbank="2" prog="118"/>
+<Patch name="Vinyl Set" hbank="4" lbank="2" prog="127"/>
+<Patch name="Cuts &amp; Hats" hbank="4" lbank="2" prog="116"/>
+<Patch name="Play It" hbank="4" lbank="2" prog="122"/>
+</PatchGroup>
+<PatchGroup name="sfx">
+<Patch name="Bass Scrape" hbank="4" lbank="2" prog="82"/>
+<Patch name="Hill" hbank="4" lbank="2" prog="93"/>
+<Patch name="Full Circle" hbank="4" lbank="2" prog="87"/>
+<Patch name="We Ha" hbank="4" lbank="2" prog="104"/>
+<Patch name="Gtr Scrape 1" hbank="4" lbank="2" prog="88"/>
+<Patch name="Crickets" hbank="4" lbank="2" prog="84"/>
+<Patch name="Ritual" hbank="4" lbank="2" prog="101"/>
+<Patch name="Loop 3" hbank="4" lbank="2" prog="95"/>
+<Patch name="AKS Vinyl" hbank="4" lbank="2" prog="80"/>
+<Patch name="30" hbank="4" lbank="2" prog="78"/>
+<Patch name="7Os Phazzy" hbank="4" lbank="2" prog="79"/>
+<Patch name="Bad Bells" hbank="4" lbank="2" prog="81"/>
+<Patch name="TarzansDance" hbank="4" lbank="2" prog="103"/>
+<Patch name="Hello!!!" hbank="4" lbank="2" prog="92"/>
+<Patch name="WhoaWhoa" hbank="4" lbank="2" prog="105"/>
+<Patch name="GtrBodyKnock" hbank="4" lbank="2" prog="90"/>
+<Patch name="Guitar Pick" hbank="4" lbank="2" prog="91"/>
+<Patch name="Crowd" hbank="4" lbank="2" prog="85"/>
+<Patch name="StringScrape" hbank="4" lbank="2" prog="102"/>
+<Patch name="Its Coming" hbank="4" lbank="2" prog="94"/>
+<Patch name="Bass Thud" hbank="4" lbank="2" prog="83"/>
+<Patch name="Oh No its..." hbank="4" lbank="2" prog="97"/>
+<Patch name="PoppysOnMars" hbank="4" lbank="2" prog="100"/>
+<Patch name="NightCrawler" hbank="4" lbank="2" prog="96"/>
+<Patch name="Ya Who" hbank="4" lbank="2" prog="107"/>
+<Patch name="PnoSndBoard" hbank="4" lbank="2" prog="99"/>
+<Patch name="Woooo!" hbank="4" lbank="2" prog="106"/>
+<Patch name="Gtr Scrape 2" hbank="4" lbank="2" prog="89"/>
+<Patch name="Ohh" hbank="4" lbank="2" prog="98"/>
+<Patch name="DawnFollows" hbank="4" lbank="2" prog="86"/>
+<Patch name="MetalScience" hbank="4" lbank="4" prog="11"/>
+</PatchGroup>
+<PatchGroup name="str">
+<Patch name="Section" hbank="4" lbank="7" prog="84"/>
+<Patch name="Allin a Pizz" hbank="4" lbank="4" prog="23"/>
+<Patch name="AbbeyStrngs" hbank="4" lbank="7" prog="57"/>
+<Patch name="Hindookurdoo" hbank="4" lbank="7" prog="71"/>
+<Patch name="Sectioned" hbank="4" lbank="7" prog="85"/>
+<Patch name="The Lonely 1" hbank="4" lbank="7" prog="94"/>
+<Patch name="So Long" hbank="4" lbank="7" prog="90"/>
+<Patch name="SitarTalk" hbank="4" lbank="7" prog="87"/>
+<Patch name="Obieanna" hbank="4" lbank="7" prog="79"/>
+<Patch name="Velo Marcato" hbank="4" lbank="7" prog="97"/>
+<Patch name="Drews Harp" hbank="4" lbank="7" prog="66"/>
+<Patch name="Filmscore" hbank="4" lbank="4" prog="25"/>
+<Patch name="Analogic" hbank="4" lbank="7" prog="59"/>
+<Patch name="Tron" hbank="4" lbank="7" prog="95"/>
+<Patch name="Pizzicato" hbank="4" lbank="7" prog="81"/>
+<Patch name="Japanman" hbank="4" lbank="7" prog="72"/>
+<Patch name="Koto" hbank="4" lbank="7" prog="73"/>
+<Patch name="MeltroniKnbD" hbank="4" lbank="7" prog="77"/>
+<Patch name="ChamberGrp" hbank="4" lbank="7" prog="62"/>
+<Patch name="Swoon" hbank="4" lbank="7" prog="92"/>
+<Patch name="Many Quarts" hbank="4" lbank="7" prog="75"/>
+<Patch name="GlissiPizzi" hbank="4" lbank="7" prog="69"/>
+<Patch name="DarkMoods" hbank="4" lbank="7" prog="63"/>
+<Patch name="Morocco Feel" hbank="4" lbank="7" prog="78"/>
+<Patch name="Kult E Vatn" hbank="4" lbank="7" prog="74"/>
+<Patch name="Texture" hbank="4" lbank="7" prog="93"/>
+<Patch name="SoloOutFront" hbank="4" lbank="7" prog="91"/>
+<Patch name="Sneajy" hbank="4" lbank="7" prog="88"/>
+<Patch name="Rich Analogs" hbank="4" lbank="7" prog="83"/>
+<Patch name="Big Strings" hbank="4" lbank="7" prog="61"/>
+<Patch name="Dyna-heim" hbank="4" lbank="4" prog="15"/>
+<Patch name="Sham Wave" hbank="4" lbank="7" prog="86"/>
+<Patch name="Real Matrix" hbank="4" lbank="7" prog="82"/>
+<Patch name="Solo Quartet" hbank="4" lbank="7" prog="89"/>
+<Patch name="Digital 1" hbank="4" lbank="7" prog="64"/>
+<Patch name="Digital 2" hbank="4" lbank="7" prog="65"/>
+<Patch name="Victrola" hbank="4" lbank="7" prog="98"/>
+<Patch name="Fortuna" hbank="4" lbank="7" prog="68"/>
+<Patch name="ArcotremPizz" hbank="4" lbank="7" prog="60"/>
+<Patch name="TronStrings" hbank="4" lbank="7" prog="96"/>
+<Patch name="ExtremeStrng" hbank="4" lbank="7" prog="67"/>
+<Patch name="Helium" hbank="4" lbank="7" prog="70"/>
+<Patch name="Analog" hbank="4" lbank="7" prog="58"/>
+<Patch name="Matrix Synth" hbank="4" lbank="7" prog="76"/>
+<Patch name="Pizzicati" hbank="4" lbank="7" prog="80"/>
+</PatchGroup>
+<PatchGroup name="syn">
+<Patch name="Big Planet" hbank="4" lbank="1" prog="50"/>
+<Patch name="Festival" hbank="4" lbank="1" prog="63"/>
+<Patch name="Pulse Pulse" hbank="4" lbank="1" prog="82"/>
+<Patch name="Synbrasso" hbank="4" lbank="1" prog="95"/>
+<Patch name="Skreach Arp" hbank="4" lbank="1" prog="93"/>
+<Patch name="Heavy" hbank="4" lbank="1" prog="65"/>
+<Patch name="LOCoCution" hbank="4" lbank="1" prog="70"/>
+<Patch name="8O8 Synthax" hbank="4" lbank="1" prog="47"/>
+<Patch name="Moog" hbank="4" lbank="1" prog="73"/>
+<Patch name="Syncty" hbank="4" lbank="1" prog="97"/>
+<Patch name="Hydraine" hbank="4" lbank="1" prog="68"/>
+<Patch name="Nervous" hbank="4" lbank="1" prog="75"/>
+<Patch name="Arpitty" hbank="4" lbank="1" prog="48"/>
+<Patch name="Synthall AT" hbank="4" lbank="1" prog="100"/>
+<Patch name="CZ Synstring" hbank="4" lbank="1" prog="55"/>
+<Patch name="Soft Synth" hbank="4" lbank="1" prog="94"/>
+<Patch name="AirBorn" hbank="4" lbank="1" prog="109"/>
+<Patch name="Rez Synth" hbank="4" lbank="1" prog="87"/>
+<Patch name="Brazz" hbank="4" lbank="1" prog="52"/>
+<Patch name="Saw Sweep" hbank="4" lbank="1" prog="91"/>
+<Patch name="Wheezy Worm" hbank="4" lbank="1" prog="106"/>
+<Patch name="Synth Brass" hbank="4" lbank="1" prog="101"/>
+<Patch name="Messy" hbank="4" lbank="1" prog="71"/>
+<Patch name="Blippoid" hbank="4" lbank="1" prog="51"/>
+<Patch name="JunoPlseComp" hbank="4" lbank="4" prog="37"/>
+<Patch name="OBX Saws" hbank="4" lbank="1" prog="77"/>
+<Patch name="Pulsey!" hbank="4" lbank="1" prog="83"/>
+<Patch name="OohAhh Vox" hbank="4" lbank="1" prog="78"/>
+<Patch name="Ensemblist" hbank="4" lbank="1" prog="59"/>
+<Patch name="Rezzy Wave" hbank="4" lbank="1" prog="88"/>
+<Patch name="Fat Slide" hbank="4" lbank="1" prog="62"/>
+<Patch name="Transpander" hbank="4" lbank="1" prog="104"/>
+<Patch name="Syntax On2" hbank="4" lbank="1" prog="99"/>
+<Patch name="Mood Strings" hbank="4" lbank="1" prog="72"/>
+<Patch name="P5 Brass" hbank="4" lbank="1" prog="79"/>
+<Patch name="Hi String" hbank="4" lbank="1" prog="67"/>
+<Patch name="Gritstrings" hbank="4" lbank="1" prog="64"/>
+<Patch name="Ethnosplint" hbank="4" lbank="1" prog="60"/>
+<Patch name="Hi Oct Synth" hbank="4" lbank="1" prog="66"/>
+<Patch name="DinkedSquare" hbank="4" lbank="1" prog="58"/>
+<Patch name="Promoseus" hbank="4" lbank="1" prog="81"/>
+<Patch name="Buzz Synth" hbank="4" lbank="1" prog="53"/>
+<Patch name="Saw Blip" hbank="4" lbank="1" prog="89"/>
+<Patch name="ThinTecPulse" hbank="4" lbank="1" prog="103"/>
+<Patch name="SynEnsemble" hbank="4" lbank="1" prog="98"/>
+<Patch name="Razor" hbank="4" lbank="1" prog="85"/>
+<Patch name="DigiBuzphaze" hbank="4" lbank="1" prog="56"/>
+<Patch name="Z&amp;C Leeder" hbank="4" lbank="1" prog="108"/>
+<Patch name="Wildsync" hbank="4" lbank="1" prog="107"/>
+<Patch name="Razor Edge" hbank="4" lbank="1" prog="86"/>
+<Patch name="Euro Wave" hbank="4" lbank="1" prog="61"/>
+<Patch name="BenderPlanet" hbank="4" lbank="1" prog="49"/>
+<Patch name="Silk OBXsaws" hbank="4" lbank="4" prog="12"/>
+<Patch name="NarrowEscape" hbank="4" lbank="1" prog="74"/>
+<Patch name="Saw Stack" hbank="4" lbank="1" prog="90"/>
+<Patch name="Conglomo" hbank="4" lbank="1" prog="54"/>
+<Patch name="Pweet Square" hbank="4" lbank="1" prog="84"/>
+<Patch name="Syncsyn Clav" hbank="4" lbank="1" prog="96"/>
+<Patch name="5th Brass" hbank="4" lbank="1" prog="46"/>
+<Patch name="ProfitMargin" hbank="4" lbank="1" prog="80"/>
+<Patch name="SawsweepComp" hbank="4" lbank="1" prog="92"/>
+<Patch name="Digiglass" hbank="4" lbank="1" prog="57"/>
+<Patch name="VoxNonsense" hbank="4" lbank="1" prog="105"/>
+<Patch name="ThinHi Worm" hbank="4" lbank="1" prog="102"/>
+<Patch name="No NerveNet" hbank="4" lbank="1" prog="76"/>
+<Patch name="Little Tins" hbank="4" lbank="1" prog="69"/>
+</PatchGroup>
+<PatchGroup name="vox">
+<Patch name="Slo Lunarvox" hbank="4" lbank="0" prog="82"/>
+<Patch name="Pop Oohs" hbank="4" lbank="0" prog="81"/>
+<Patch name="Pop Aahs" hbank="4" lbank="0" prog="80"/>
+<Patch name="Majestic" hbank="4" lbank="0" prog="73"/>
+<Patch name="PhasePhlips" hbank="4" lbank="0" prog="79"/>
+<Patch name="Mist" hbank="4" lbank="0" prog="75"/>
+<Patch name="New Age Oohs" hbank="4" lbank="4" prog="17"/>
+<Patch name="Common Vox" hbank="4" lbank="0" prog="67"/>
+<Patch name="SpiritWorld" hbank="4" lbank="0" prog="84"/>
+<Patch name="ThroatRattle" hbank="4" lbank="0" prog="87"/>
+<Patch name="Lo FakeChoir" hbank="4" lbank="0" prog="71"/>
+<Patch name="SynthSing" hbank="4" lbank="0" prog="85"/>
+<Patch name="Odd Vox" hbank="4" lbank="0" prog="77"/>
+<Patch name="Soul Oohs" hbank="4" lbank="0" prog="83"/>
+<Patch name="Tarzanalien" hbank="4" lbank="0" prog="86"/>
+<Patch name="Ahhs" hbank="4" lbank="0" prog="65"/>
+<Patch name="Gothic Dream" hbank="4" lbank="0" prog="70"/>
+<Patch name="Frozen Time" hbank="4" lbank="4" prog="30"/>
+<Patch name="Dark Angels" hbank="4" lbank="0" prog="68"/>
+<Patch name="Lo-Fi Ether" hbank="4" lbank="0" prog="72"/>
+<Patch name="Tokenring" hbank="4" lbank="0" prog="88"/>
+<Patch name="Oohs Souls" hbank="4" lbank="0" prog="78"/>
+<Patch name="Gossamer" hbank="4" lbank="0" prog="69"/>
+<Patch name="MauzeWowz" hbank="4" lbank="0" prog="74"/>
+<Patch name="Odd Boys" hbank="4" lbank="0" prog="76"/>
+<Patch name="Arco Breath" hbank="4" lbank="0" prog="66"/>
+<Patch name="Trapped" hbank="4" lbank="0" prog="89"/>
+</PatchGroup>
+<PatchGroup name="wav">
+<Patch name="Overtone Syn" hbank="4" lbank="1" prog="19"/>
+<Patch name="Synthetic" hbank="4" lbank="1" prog="40"/>
+<Patch name="CZ Lead" hbank="4" lbank="0" prog="127"/>
+<Patch name="Blipper" hbank="4" lbank="0" prog="123"/>
+<Patch name="M12 Sync" hbank="4" lbank="1" prog="11"/>
+<Patch name="Sync 1" hbank="4" lbank="1" prog="33"/>
+<Patch name="Metal 2" hbank="4" lbank="1" prog="14"/>
+<Patch name="Glass Perc" hbank="4" lbank="1" prog="5"/>
+<Patch name="Moog Lead" hbank="4" lbank="1" prog="17"/>
+<Patch name="Fat Attack" hbank="4" lbank="1" prog="4"/>
+<Patch name="Narrow Synth" hbank="4" lbank="1" prog="18"/>
+<Patch name="Sync 4" hbank="4" lbank="1" prog="36"/>
+<Patch name="Pop Square" hbank="4" lbank="1" prog="22"/>
+<Patch name="Whine" hbank="4" lbank="1" prog="44"/>
+<Patch name="PPG" hbank="4" lbank="1" prog="23"/>
+<Patch name="Juno Pulse" hbank="4" lbank="1" prog="7"/>
+<Patch name="Perc Axe Syn" hbank="4" lbank="1" prog="20"/>
+<Patch name="SquareAttack" hbank="4" lbank="1" prog="30"/>
+<Patch name="Spacey Keys" hbank="4" lbank="1" prog="28"/>
+<Patch name="Sync 2" hbank="4" lbank="1" prog="34"/>
+<Patch name="Arp" hbank="4" lbank="0" prog="120"/>
+<Patch name="ES Rag" hbank="4" lbank="1" prog="3"/>
+<Patch name="Rezzy" hbank="4" lbank="1" prog="27"/>
+<Patch name="Rast Keys" hbank="4" lbank="1" prog="26"/>
+<Patch name="Bass Synth" hbank="4" lbank="0" prog="121"/>
+<Patch name="Sync 6" hbank="4" lbank="1" prog="38"/>
+<Patch name="MetalAttack" hbank="4" lbank="1" prog="15"/>
+<Patch name="Mini Lead" hbank="4" lbank="1" prog="16"/>
+<Patch name="Buzz Saw Syn" hbank="4" lbank="0" prog="124"/>
+<Patch name="Bell Synth" hbank="4" lbank="0" prog="122"/>
+<Patch name="Pluck Tone" hbank="4" lbank="1" prog="21"/>
+<Patch name="CZ Echo" hbank="4" lbank="0" prog="126"/>
+<Patch name="Sync 5" hbank="4" lbank="1" prog="37"/>
+<Patch name="Synth Wave" hbank="4" lbank="1" prog="39"/>
+<Patch name="Wild Synth" hbank="4" lbank="1" prog="45"/>
+<Patch name="Pure H" hbank="4" lbank="1" prog="24"/>
+<Patch name="Eraser" hbank="4" lbank="1" prog="2"/>
+<Patch name="Chime" hbank="4" lbank="0" prog="125"/>
+<Patch name="Log Hit" hbank="4" lbank="1" prog="9"/>
+<Patch name="Juno Square" hbank="4" lbank="1" prog="8"/>
+<Patch name="Magic" hbank="4" lbank="1" prog="12"/>
+<Patch name="PWM" hbank="4" lbank="1" prog="25"/>
+<Patch name="CZ101 Digi" hbank="4" lbank="1" prog="0"/>
+<Patch name="VS37" hbank="4" lbank="1" prog="42"/>
+<Patch name="VS Voxwav" hbank="4" lbank="1" prog="41"/>
+<Patch name="Syn Tone" hbank="4" lbank="1" prog="32"/>
+<Patch name="Square Lead" hbank="4" lbank="1" prog="29"/>
+<Patch name="Dig Buzz Syn" hbank="4" lbank="1" prog="1"/>
+<Patch name="SquareChorus" hbank="4" lbank="1" prog="31"/>
+<Patch name="Hollow Deep" hbank="4" lbank="1" prog="6"/>
+<Patch name="Metal 1" hbank="4" lbank="1" prog="13"/>
+<Patch name="M12 Lead" hbank="4" lbank="1" prog="10"/>
+<Patch name="Sync 3" hbank="4" lbank="1" prog="35"/>
+<Patch name="VS48" hbank="4" lbank="1" prog="43"/>
+</PatchGroup>
+<PatchGroup name="wnd">
+<Patch name="Oboe 2" hbank="4" lbank="0" prog="49"/>
+<Patch name="T-Sax" hbank="4" lbank="0" prog="61"/>
+<Patch name="Big Top" hbank="4" lbank="0" prog="27"/>
+<Patch name="Breathy Flt1" hbank="4" lbank="0" prog="29"/>
+<Patch name="Pan Flute 2" hbank="4" lbank="0" prog="53"/>
+<Patch name="Bari" hbank="4" lbank="0" prog="26"/>
+<Patch name="Polka Cheat" hbank="4" lbank="0" prog="55"/>
+<Patch name="Clarinet" hbank="4" lbank="0" prog="34"/>
+<Patch name="Gs Soprano" hbank="4" lbank="0" prog="41"/>
+<Patch name="WindTrio" hbank="4" lbank="0" prog="64"/>
+<Patch name="Real Flute" hbank="4" lbank="4" prog="22"/>
+<Patch name="Nuages" hbank="4" lbank="0" prog="47"/>
+<Patch name="AiryClarinet" hbank="4" lbank="0" prog="21"/>
+<Patch name="Monica Blow" hbank="4" lbank="0" prog="46"/>
+<Patch name="Pastoral" hbank="4" lbank="0" prog="54"/>
+<Patch name="S-Sax" hbank="4" lbank="0" prog="56"/>
+<Patch name="Sax FX 1 2 3" hbank="4" lbank="0" prog="57"/>
+<Patch name="Harmony" hbank="4" lbank="0" prog="45"/>
+<Patch name="B-Sax" hbank="4" lbank="0" prog="24"/>
+<Patch name="Breather" hbank="4" lbank="4" prog="29"/>
+<Patch name="Ocarina 1" hbank="4" lbank="0" prog="50"/>
+<Patch name="Harmonica" hbank="4" lbank="0" prog="43"/>
+<Patch name="Sax Session" hbank="4" lbank="0" prog="58"/>
+<Patch name="Bottle Blow" hbank="4" lbank="0" prog="28"/>
+<Patch name="Chi-Town" hbank="4" lbank="0" prog="32"/>
+<Patch name="Harmonika" hbank="4" lbank="0" prog="44"/>
+<Patch name="Fieldberries" hbank="4" lbank="0" prog="37"/>
+<Patch name="Alto Saxo" hbank="4" lbank="0" prog="23"/>
+<Patch name="Synth Flute" hbank="4" lbank="0" prog="60"/>
+<Patch name="Chamber Orch" hbank="4" lbank="0" prog="31"/>
+<Patch name="B2-Sax" hbank="4" lbank="0" prog="25"/>
+<Patch name="Flute" hbank="4" lbank="0" prog="39"/>
+<Patch name="Ocarina 2" hbank="4" lbank="0" prog="51"/>
+<Patch name="Pan Flute 1" hbank="4" lbank="0" prog="52"/>
+<Patch name="Flt/Obe/Bone" hbank="4" lbank="0" prog="38"/>
+<Patch name="Virtuaccord" hbank="4" lbank="0" prog="63"/>
+<Patch name="Full Bari" hbank="4" lbank="0" prog="40"/>
+<Patch name="Breathy Flt2" hbank="4" lbank="0" prog="30"/>
+<Patch name="English Horn" hbank="4" lbank="0" prog="36"/>
+<Patch name="Akkordione" hbank="4" lbank="0" prog="22"/>
+<Patch name="Shenai" hbank="4" lbank="0" prog="59"/>
+<Patch name="Oboe 1" hbank="4" lbank="0" prog="48"/>
+<Patch name="Tenor Phone" hbank="4" lbank="0" prog="62"/>
+<Patch name="Clarinette" hbank="4" lbank="0" prog="35"/>
+<Patch name="A-SAX" hbank="4" lbank="0" prog="20"/>
+<Patch name="Grouch" hbank="4" lbank="0" prog="42"/>
+<Patch name="Clar/Oboe" hbank="4" lbank="0" prog="33"/>
+</PatchGroup>
+
+
+
+ </MidiInstrument>
+ </muse>
+
+
diff --git a/muse/share/instruments/gm.idf b/muse/share/instruments/gm.idf
new file mode 100644
index 00000000..7cc0e7ef
--- /dev/null
+++ b/muse/share/instruments/gm.idf
@@ -0,0 +1,209 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="GM">
+ <Init>
+ </Init>
+ <PatchGroup name="Piano">
+ <Patch name="Grand Piano" prog="0"/>
+ <Patch name="Bright Piano" prog="1"/>
+ <Patch name="E.Grand" prog="2"/>
+ <Patch name="Honky-tonk" prog="3"/>
+ <Patch name="E.Piano" prog="4"/>
+ <Patch name="E.Piano 2" prog="5"/>
+ <Patch name="Harpsichord" prog="6"/>
+ <Patch name="Clav." prog="7"/>
+ </PatchGroup>
+ <PatchGroup name="Chromatic Perc">
+ <Patch name="Celesta" prog="8"/>
+ <Patch name="Glockenspiel" prog="9"/>
+ <Patch name="Music Box" prog="10"/>
+ <Patch name="Vibraphone" prog="11"/>
+ <Patch name="Marimba" prog="12"/>
+ <Patch name="Xylophone" prog="13"/>
+ <Patch name="Tubular Bells" prog="14"/>
+ <Patch name="Dulcimer" prog="15"/>
+ </PatchGroup>
+ <PatchGroup name="Organ">
+ <Patch name="Drawbar Organ" prog="16"/>
+ <Patch name="Perc. Organ" prog="17"/>
+ <Patch name="Rock Organ" prog="18"/>
+ <Patch name="Church Organ" prog="19"/>
+ <Patch name="Reed Organ" prog="20"/>
+ <Patch name="Akkordion" prog="21"/>
+ <Patch name="Harmonica" prog="22"/>
+ <Patch name="Bandoneon" prog="23"/>
+ </PatchGroup>
+ <PatchGroup name="Guitar">
+ <Patch name="Nylon Gtr." prog="24"/>
+ <Patch name="Steel Gtr." prog="25"/>
+ <Patch name="Jazz Guitar" prog="26"/>
+ <Patch name="Clean Guitar" prog="27"/>
+ <Patch name="Muted Guitar" prog="28"/>
+ <Patch name="Overdrive Gtr" prog="29"/>
+ <Patch name="Distortion Gtr" prog="30"/>
+ <Patch name="Gtr. Harmonics" prog="31"/>
+ </PatchGroup>
+ <PatchGroup name="Bass">
+ <Patch name="Acoustic Bass" prog="32"/>
+ <Patch name="Fingered Bass" prog="33"/>
+ <Patch name="Picked Bass" prog="34"/>
+ <Patch name="Fretless Bass" prog="35"/>
+ <Patch name="Slap Bass 1" prog="36"/>
+ <Patch name="Slap Bass 2" prog="37"/>
+ <Patch name="Synth Bass 1" prog="38"/>
+ <Patch name="Synth Bass 2" prog="39"/>
+ </PatchGroup>
+ <PatchGroup name="Strings/Orch">
+ <Patch name="Violin" prog="40"/>
+ <Patch name="Viola" prog="41"/>
+ <Patch name="Cello" prog="42"/>
+ <Patch name="Contrabass" prog="43"/>
+ <Patch name="Tremolo Str." prog="44"/>
+ <Patch name="Pizzicato Str." prog="45"/>
+ <Patch name="Harp" prog="46"/>
+ <Patch name="Timpani" prog="47"/>
+ </PatchGroup>
+ <PatchGroup name="Ensemble">
+ <Patch name="Strings 1" prog="48"/>
+ <Patch name="Strings 2" prog="49"/>
+ <Patch name="Syn. Strings 1" prog="50"/>
+ <Patch name="Syn. Strings 2" prog="51"/>
+ <Patch name="Choir Aahs" prog="52"/>
+ <Patch name="Voice Oohs" prog="53"/>
+ <Patch name="Synth Voice" prog="54"/>
+ <Patch name="Orchestra Hit" prog="55"/>
+ </PatchGroup>
+ <PatchGroup name="Brass">
+ <Patch name="Trumpet" prog="56"/>
+ <Patch name="Trombone" prog="57"/>
+ <Patch name="Tuba" prog="58"/>
+ <Patch name="Muted Trumpet" prog="59"/>
+ <Patch name="French Horn" prog="60"/>
+ <Patch name="Brass Section" prog="61"/>
+ <Patch name="Synth Brass 1" prog="62"/>
+ <Patch name="Synth Brass 2" prog="63"/>
+ </PatchGroup>
+ <PatchGroup name="Reed">
+ <Patch name="Soprano Sax" prog="64"/>
+ <Patch name="Alto Sax" prog="65"/>
+ <Patch name="Tenor Sax" prog="66"/>
+ <Patch name="Baritone Sax" prog="67"/>
+ <Patch name="Oboe" prog="68"/>
+ <Patch name="English Horn" prog="69"/>
+ <Patch name="Bassoon" prog="70"/>
+ <Patch name="Clarinet" prog="71"/>
+ </PatchGroup>
+ <PatchGroup name="Pipe">
+ <Patch name="Piccolo" prog="72"/>
+ <Patch name="Flute" prog="73"/>
+ <Patch name="Recorder" prog="74"/>
+ <Patch name="Pan Flute" prog="75"/>
+ <Patch name="Blown Bottle" prog="76"/>
+ <Patch name="Shakuhachi" prog="77"/>
+ <Patch name="Whistle" prog="78"/>
+ <Patch name="Ocarina" prog="79"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Lead">
+ <Patch name="Square Wave" prog="80"/>
+ <Patch name="Saw Wave" prog="81"/>
+ <Patch name="Calliope" prog="82"/>
+ <Patch name="Chiffer Lead" prog="83"/>
+ <Patch name="Charang" prog="84"/>
+ <Patch name="Solo Vox" prog="85"/>
+ <Patch name="Fifth Saw" prog="86"/>
+ <Patch name="Bass Lead" prog="87"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Pad">
+ <Patch name="New Age Pad" prog="88"/>
+ <Patch name="Warm Pad" prog="89"/>
+ <Patch name="Polysynth Pad" prog="90"/>
+ <Patch name="Choir Pad" prog="91"/>
+ <Patch name="Bowed Pad" prog="92"/>
+ <Patch name="Metallic Pad" prog="93"/>
+ <Patch name="Halo Pad" prog="94"/>
+ <Patch name="Sweep Pad" prog="95"/>
+ </PatchGroup>
+ <PatchGroup name="Synth FX">
+ <Patch name="Rain" prog="96"/>
+ <Patch name="Soundtrack" prog="97"/>
+ <Patch name="Crystal" prog="98"/>
+ <Patch name="Athmosphere" prog="99"/>
+ <Patch name="Brightness" prog="100"/>
+ <Patch name="Goblins" prog="101"/>
+ <Patch name="Echoes" prog="102"/>
+ <Patch name="Sci-Fi" prog="103"/>
+ </PatchGroup>
+ <PatchGroup name="Ethnic">
+ <Patch name="Sitar" prog="104"/>
+ <Patch name="Banjo" prog="105"/>
+ <Patch name="Shamisen" prog="106"/>
+ <Patch name="Koto" prog="107"/>
+ <Patch name="Kalimba" prog="108"/>
+ <Patch name="Bagpipe" prog="109"/>
+ <Patch name="Fiddle" prog="110"/>
+ <Patch name="Shanai" prog="111"/>
+ </PatchGroup>
+ <PatchGroup name="Percussive">
+ <Patch name="Tinkle Bell" prog="112"/>
+ <Patch name="Agogo" prog="113"/>
+ <Patch name="Steel Drums" prog="114"/>
+ <Patch name="Woodblock" prog="115"/>
+ <Patch name="Taiko Drum" prog="116"/>
+ <Patch name="Melodic Drum" prog="117"/>
+ <Patch name="Synth Drum" prog="118"/>
+ <Patch name="Rev. Cymbal" prog="119"/>
+ </PatchGroup>
+ <PatchGroup name="Special FX">
+ <Patch name="Gtr Fret Noise" prog="120"/>
+ <Patch name="Breath Noise" prog="121"/>
+ <Patch name="Seashore" prog="122"/>
+ <Patch name="Bird Tweed" prog="123"/>
+ <Patch name="Telephone" prog="124"/>
+ <Patch name="Helicopter" prog="125"/>
+ <Patch name="Applaus" prog="126"/>
+ <Patch name="Gunshot" prog="127"/>
+ </PatchGroup>
+
+ <!-- Controller -->
+ <Controller name="Pitch" type="Pitch" />
+ <Controller name="Program" type="Program" />
+
+ <Controller name="Modulation" type="Control" l="1" />
+ <Controller name="PortamentoTime" type="Control" l="5" />
+ <Controller name="MainVolume" type="Control" l="7" init="100" />
+ <Controller name="Pan" type="Control" l="10" init="64" />
+ <Controller name="Expression" type="Control" l="11" init="127" />
+ <Controller name="Sustain" type="Control" l="64" />
+ <Controller name="Portamento" type="Control" l="65" />
+ <Controller name="Sostenuto" type="Control" l="66" />
+ <Controller name="SoftPedal" type="Control" l="67" />
+ <Controller name="FilterResonance" type="Control" l="71" init="64"/>
+ <Controller name="ReleaseTime" type="Control" l="72" init="64"/>
+ <Controller name="AttackTime" type="Control" l="73" init="64"/>
+ <Controller name="Brightness" type="Control" l="74" init="64"/>
+ <Controller name="DecayTime" type="Control" l="75" init="64"/>
+ <Controller name="VibrateRate" type="Control" l="76" init="64"/>
+ <Controller name="VibrateDepth" type="Control" l="77" init="64"/>
+ <Controller name="VibrateDelay" type="Control" l="78" init="64"/>
+ <Controller name="PortamentoControl" type="Control" l="84" />
+ <Controller name="ReverbSendLevel" type="Control" l="91" init="40" />
+ <Controller name="ChorusSendLevel" type="Control" l="93" init="0" />
+ <Controller name="VariationSend" type="Control" l="94" init="0" />
+
+ <Controller name="AllSoundsOff" type="Control" l="120" />
+ <Controller name="ResetAllController" type="Control" l="121" />
+ <Controller name="AllNotesOff" type="Control" l="123" />
+
+ <!-- RPN's -->
+ <Controller name="PitchBendSensitivity" type="RPN" l="0" min="0" max="0x18" init="2" />
+ <Controller name="FineTuning" type="RPN" l="1" min="-64" max="64" init="2" />
+
+ <!-- SysEx's -->
+ <SysEx name="GM on">
+ <comment>Switch General Midi mode on</comment>
+ <data>0x7e 0x7f 0x09 0x01</data>
+ </SysEx>
+
+ </MidiInstrument>
+ </muse>
+
diff --git a/muse/share/instruments/gs.idf b/muse/share/instruments/gs.idf
new file mode 100644
index 00000000..070758ad
--- /dev/null
+++ b/muse/share/instruments/gs.idf
@@ -0,0 +1,236 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="GS">
+ <Init>
+ </Init>
+ <PatchGroup name="Piano">
+ <Patch name="Grand Piano" hbank="0" lbank="0" prog="0"/>
+ <Patch name="Bright Piano" hbank="0" lbank="0" prog="1"/>
+ <Patch name="E.Grand" hbank="0" lbank="0" prog="2"/>
+ <Patch name="Honky-tonk" hbank="0" lbank="0" prog="3"/>
+ <Patch name="E.Piano" hbank="0" lbank="0" prog="4"/>
+ <Patch name="E.Piano 2" hbank="0" lbank="0" prog="5"/>
+ <Patch name="Harpsichord" hbank="0" lbank="0" prog="6"/>
+ <Patch name="Clav." hbank="0" lbank="0" prog="7"/>
+ </PatchGroup>
+ <PatchGroup name="Chromatic Perc">
+ <Patch name="Celesta" hbank="0" lbank="0" prog="8"/>
+ <Patch name="Glockenspiel" hbank="0" lbank="0" prog="9"/>
+ <Patch name="Music Box" hbank="0" lbank="0" prog="10"/>
+ <Patch name="Vibraphone" hbank="0" lbank="0" prog="11"/>
+ <Patch name="Marimba" hbank="0" lbank="0" prog="12"/>
+ <Patch name="Xylophone" hbank="0" lbank="0" prog="13"/>
+ <Patch name="Tubular Bells" hbank="0" lbank="0" prog="14"/>
+ <Patch name="Dulcimer" hbank="0" lbank="0" prog="15"/>
+ </PatchGroup>
+ <PatchGroup name="Organ">
+ <Patch name="Drawbar Organ" hbank="0" lbank="0" prog="16"/>
+ <Patch name="Perc. Organ" hbank="0" lbank="0" prog="17"/>
+ <Patch name="Rock Organ" hbank="0" lbank="0" prog="18"/>
+ <Patch name="Church Organ" hbank="0" lbank="0" prog="19"/>
+ <Patch name="Reed Organ" hbank="0" lbank="0" prog="20"/>
+ <Patch name="Akkordion" hbank="0" lbank="0" prog="21"/>
+ <Patch name="Harmonica" hbank="0" lbank="0" prog="22"/>
+ <Patch name="Bandoneon" hbank="0" lbank="0" prog="23"/>
+ </PatchGroup>
+ <PatchGroup name="Guitar">
+ <Patch name="Nylon Gtr." hbank="0" lbank="0" prog="24"/>
+ <Patch name="Steel Gtr." hbank="0" lbank="0" prog="25"/>
+ <Patch name="Jazz Guitar" hbank="0" lbank="0" prog="26"/>
+ <Patch name="Clean Guitar" hbank="0" lbank="0" prog="27"/>
+ <Patch name="Muted Guitar" hbank="0" lbank="0" prog="28"/>
+ <Patch name="Overdrive Gtr" hbank="0" lbank="0" prog="29"/>
+ <Patch name="Distortion Gtr" hbank="0" lbank="0" prog="30"/>
+ <Patch name="Gtr. Harmonics" hbank="0" lbank="0" prog="31"/>
+ </PatchGroup>
+ <PatchGroup name="Bass">
+ <Patch name="Acoustic Bass" hbank="0" lbank="0" prog="32"/>
+ <Patch name="Fingered Bass" hbank="0" lbank="0" prog="33"/>
+ <Patch name="Picked Bass" hbank="0" lbank="0" prog="34"/>
+ <Patch name="Fretless Bass" hbank="0" lbank="0" prog="35"/>
+ <Patch name="Slap Bass 1" hbank="0" lbank="0" prog="36"/>
+ <Patch name="Slap Bass 2" hbank="0" lbank="0" prog="37"/>
+ <Patch name="Synth Bass 1" hbank="0" lbank="0" prog="38"/>
+ <Patch name="Synth Bass 2" hbank="0" lbank="0" prog="39"/>
+ </PatchGroup>
+ <PatchGroup name="Strings/Orch">
+ <Patch name="Violin" hbank="0" lbank="0" prog="40"/>
+ <Patch name="Viola" hbank="0" lbank="0" prog="41"/>
+ <Patch name="Cello" hbank="0" lbank="0" prog="42"/>
+ <Patch name="Contrabass" hbank="0" lbank="0" prog="43"/>
+ <Patch name="Tremolo Str." hbank="0" lbank="0" prog="44"/>
+ <Patch name="Pizzicato Str." hbank="0" lbank="0" prog="45"/>
+ <Patch name="Harp" hbank="0" lbank="0" prog="46"/>
+ <Patch name="Timpani" hbank="0" lbank="0" prog="47"/>
+ </PatchGroup>
+ <PatchGroup name="Ensemble">
+ <Patch name="Strings 1" hbank="0" lbank="0" prog="48"/>
+ <Patch name="Strings 2" hbank="0" lbank="0" prog="49"/>
+ <Patch name="Syn. Strings 1" hbank="0" lbank="0" prog="50"/>
+ <Patch name="Syn. Strings 2" hbank="0" lbank="0" prog="51"/>
+ <Patch name="Choir Aahs" hbank="0" lbank="0" prog="52"/>
+ <Patch name="Voice Oohs" hbank="0" lbank="0" prog="53"/>
+ <Patch name="Synth Voice" hbank="0" lbank="0" prog="54"/>
+ <Patch name="Orchestra Hit" hbank="0" lbank="0" prog="55"/>
+ </PatchGroup>
+ <PatchGroup name="Brass">
+ <Patch name="Trumpet" hbank="0" lbank="0" prog="56"/>
+ <Patch name="Trombone" hbank="0" lbank="0" prog="57"/>
+ <Patch name="Tuba" hbank="0" lbank="0" prog="58"/>
+ <Patch name="Muted Trumpet" hbank="0" lbank="0" prog="59"/>
+ <Patch name="French Horn" hbank="0" lbank="0" prog="60"/>
+ <Patch name="Brass Section" hbank="0" lbank="0" prog="61"/>
+ <Patch name="Synth Brass 1" hbank="0" lbank="0" prog="62"/>
+ <Patch name="Synth Brass 2" hbank="0" lbank="0" prog="63"/>
+ </PatchGroup>
+ <PatchGroup name="Reed">
+ <Patch name="Soprano Sax" hbank="0" lbank="0" prog="64"/>
+ <Patch name="Alto Sax" hbank="0" lbank="0" prog="65"/>
+ <Patch name="Tenor Sax" hbank="0" lbank="0" prog="66"/>
+ <Patch name="Baritone Sax" hbank="0" lbank="0" prog="67"/>
+ <Patch name="Oboe" hbank="0" lbank="0" prog="68"/>
+ <Patch name="English Horn" hbank="0" lbank="0" prog="69"/>
+ <Patch name="Bassoon" hbank="0" lbank="0" prog="70"/>
+ <Patch name="Clarinet" hbank="0" lbank="0" prog="71"/>
+ </PatchGroup>
+ <PatchGroup name="Pipe">
+ <Patch name="Piccolo" hbank="0" lbank="0" prog="72"/>
+ <Patch name="Flute" hbank="0" lbank="0" prog="73"/>
+ <Patch name="Recorder" hbank="0" lbank="0" prog="74"/>
+ <Patch name="Pan Flute" hbank="0" lbank="0" prog="75"/>
+ <Patch name="Blown Bottle" hbank="0" lbank="0" prog="76"/>
+ <Patch name="Shakuhachi" hbank="0" lbank="0" prog="77"/>
+ <Patch name="Whistle" hbank="0" lbank="0" prog="78"/>
+ <Patch name="Ocarina" hbank="0" lbank="0" prog="79"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Lead">
+ <Patch name="Square Wave" hbank="0" lbank="0" prog="80"/>
+ <Patch name="Saw Wave" hbank="0" lbank="0" prog="81"/>
+ <Patch name="Calliope" hbank="0" lbank="0" prog="82"/>
+ <Patch name="Chiffer Lead" hbank="0" lbank="0" prog="83"/>
+ <Patch name="Charang" hbank="0" lbank="0" prog="84"/>
+ <Patch name="Solo Vox" hbank="0" lbank="0" prog="85"/>
+ <Patch name="Fifth Saw" hbank="0" lbank="0" prog="86"/>
+ <Patch name="Bass Lead" hbank="0" lbank="0" prog="87"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Pad">
+ <Patch name="New Age Pad" hbank="0" lbank="0" prog="88"/>
+ <Patch name="Warm Pad" hbank="0" lbank="0" prog="89"/>
+ <Patch name="Polysynth Pad" hbank="0" lbank="0" prog="90"/>
+ <Patch name="Choir Pad" hbank="0" lbank="0" prog="91"/>
+ <Patch name="Bowed Pad" hbank="0" lbank="0" prog="92"/>
+ <Patch name="Metallic Pad" hbank="0" lbank="0" prog="93"/>
+ <Patch name="Halo Pad" hbank="0" lbank="0" prog="94"/>
+ <Patch name="Sweep Pad" hbank="0" lbank="0" prog="95"/>
+ </PatchGroup>
+ <PatchGroup name="Synth FX">
+ <Patch name="Rain" hbank="0" lbank="0" prog="96"/>
+ <Patch name="Soundtrack" hbank="0" lbank="0" prog="97"/>
+ <Patch name="Crystal" hbank="0" lbank="0" prog="98"/>
+ <Patch name="Athmosphere" hbank="0" lbank="0" prog="99"/>
+ <Patch name="Brightness" hbank="0" lbank="0" prog="100"/>
+ <Patch name="Goblins" hbank="0" lbank="0" prog="101"/>
+ <Patch name="Echoes" hbank="0" lbank="0" prog="102"/>
+ <Patch name="Sci-Fi" hbank="0" lbank="0" prog="103"/>
+ </PatchGroup>
+ <PatchGroup name="Ethnic">
+ <Patch name="Sitar" hbank="0" lbank="0" prog="104"/>
+ <Patch name="Banjo" hbank="0" lbank="0" prog="105"/>
+ <Patch name="Shamisen" hbank="0" lbank="0" prog="106"/>
+ <Patch name="Koto" hbank="0" lbank="0" prog="107"/>
+ <Patch name="Kalimba" hbank="0" lbank="0" prog="108"/>
+ <Patch name="Bagpipe" hbank="0" lbank="0" prog="109"/>
+ <Patch name="Fiddle" hbank="0" lbank="0" prog="110"/>
+ <Patch name="Shanai" hbank="0" lbank="0" prog="111"/>
+ </PatchGroup>
+ <PatchGroup name="Percussive">
+ <Patch name="Tinkle Bell" hbank="0" lbank="0" prog="112"/>
+ <Patch name="Agogo" hbank="0" lbank="0" prog="113"/>
+ <Patch name="Steel Drums" hbank="0" lbank="0" prog="114"/>
+ <Patch name="Woodblock" hbank="0" lbank="0" prog="115"/>
+ <Patch name="Taiko Drum" hbank="0" lbank="0" prog="116"/>
+ <Patch name="Melodic Drum" hbank="0" lbank="0" prog="117"/>
+ <Patch name="Synth Drum" hbank="0" lbank="0" prog="118"/>
+ <Patch name="Rev. Cymbal" hbank="0" lbank="0" prog="119"/>
+ </PatchGroup>
+ <PatchGroup name="Special FX">
+ <Patch name="Gtr Fret Noise" hbank="0" lbank="0" prog="120"/>
+ <Patch name="Breath Noise" hbank="0" lbank="0" prog="121"/>
+ <Patch name="Seashore" hbank="0" lbank="0" prog="122"/>
+ <Patch name="Bird Tweed" hbank="0" lbank="0" prog="123"/>
+ <Patch name="Telephone" hbank="0" lbank="0" prog="124"/>
+ <Patch name="Helicopter" hbank="0" lbank="0" prog="125"/>
+ <Patch name="Applaus" hbank="0" lbank="0" prog="126"/>
+ <Patch name="Gunshot" hbank="0" lbank="0" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="Drums">
+ <Patch name="Standard" hbank="17" lbank="0" prog="0"/>
+ <Patch name="Room" hbank="17" lbank="0" prog="8"/>
+ <Patch name="Electro" hbank="17" lbank="0" prog="24"/>
+ <Patch name="Analog" hbank="17" lbank="0" prog="25"/>
+ <Patch name="Jazz" hbank="17" lbank="0" prog="32"/>
+ <Patch name="Brush" hbank="17" lbank="0" prog="40"/>
+ <Patch name="Classic" hbank="17" lbank="0" prog="48"/>
+ <Patch name="Power" hbank="17" lbank="0" prog="16"/>
+ <Patch name="SFX1" hbank="17" lbank="0" prog="56"/>
+ <Patch name="GM" hbank="17" lbank="0" prog="127"/>
+ </PatchGroup>
+
+ <!-- Controller -->
+ <Controller name="Pitch" type="Pitch" />
+ <Controller name="Program" type="Program" />
+
+ <Controller name="Modulation" type="Control" l="1" />
+ <Controller name="PortamentoTime" type="Control" l="5" />
+ <Controller name="MainVolume" type="Control" l="7" init="100" />
+ <Controller name="Pan" type="Control" l="10" init="64" />
+ <Controller name="Expression" type="Control" l="11" />
+ <Controller name="GenPurpose1" type="Control" l="16" />
+ <Controller name="GenPurpose2" type="Control" l="17" />
+ <Controller name="GenPurpose3" type="Control" l="18" />
+ <Controller name="GenPurpose4" type="Control" l="19" />
+ <Controller name="Sustain" type="Control" l="64" />
+ <Controller name="Portamento" type="Control" l="65" />
+ <Controller name="Sostenuto" type="Control" l="66" />
+ <Controller name="SoftPedal" type="Control" l="67" />
+ <Controller name="HarmonicContent" type="Control" l="68" />
+ <Controller name="ReleaseTime" type="Control" l="72" />
+ <Controller name="AttackTime" type="Control" l="73" />
+ <Controller name="Brightness" type="Control" l="74" />
+ <Controller name="PortamentoControl" type="Control" l="75" />
+ <Controller name="Effect1Depth" type="Control" l="76" />
+ <Controller name="Effect3Depth" type="Control" l="93" />
+ <Controller name="AttackTime" type="Control" l="0x49" />
+ <Controller name="VariationSend" type="Control" l="0x5e" />
+ <Controller name="AllSoundsOff" type="Control" l="120" />
+ <Controller name="ResetAllController" type="Control" l="121" />
+ <Controller name="AllNotesOff" type="Control" l="123" />
+
+ <!-- RPN's -->
+ <Controller name="PitchBendSensitivity" type="RPN" l="0" min="0" max="0x18" init="2" />
+ <Controller name="FineTuning" type="RPN" l="1" min="-64" max="64" init="2" />
+
+ <!-- NPN's -->
+ <Controller name="VibratoRate" type="NRPN" h="0x01" l="0x08" />
+ <Controller name="VibratoDepth" type="NRPN" h="0x01" l="0x09" />
+ <Controller name="VibratoDelay" type="NRPN" h="0x01" l="0x0a" />
+ <Controller name="FilterCutoffFreq" type="NRPN" h="0x01" l="0x20" />
+ <Controller name="FilterResonance" type="NRPN" h="0x01" l="0x21" />
+ <Controller name="AttackRate" type="NRPN" h="0x01" l="0x63" />
+ <Controller name="DecayRate" type="NRPN" h="0x01" l="0x64" />
+ <Controller name="ReleaseRate" type="NRPN" h="0x01" l="0x66" />
+ <Controller name="DrumPitchCoarseTune" type="NRPN" h="0x18" l="pitch" />
+ <Controller name="DrumLevel" type="NRPN" h="0x1a" l="pitch" />
+ <Controller name="DrumPanpot" type="NRPN" h="0x1c" l="pitch" />
+ <Controller name="DrumReverbSend" type="NRPN" h="0x1d" l="pitch" />
+ <Controller name="DrumChorusSend" type="NRPN" h="0x1e" l="pitch" />
+
+ <!-- SysEx's -->
+ <SysEx name="GS on">
+ <comment>Switch GS mode on</comment>
+ <data>0x41 0x10 0x42 0x12 0x40 0x00 0x7f 0x00 0x41</data>
+ </SysEx>
+
+ </MidiInstrument>
+ </muse>
+
diff --git a/muse/share/instruments/ns5r.idf b/muse/share/instruments/ns5r.idf
new file mode 100644
index 00000000..b51e6b80
--- /dev/null
+++ b/muse/share/instruments/ns5r.idf
@@ -0,0 +1,568 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="Korg-NS5R">
+ <Init>
+ </Init>
+ <PatchGroup name="Piano">
+ <Patch name="Grand Piano" mode="7" hbank="0" lbank="0" prog="0"/>
+ <Patch name="GrndPnoK" mode="4" hbank="0" lbank="1" prog="0"/>
+ <Patch name="MelloGrP" mode="4" hbank="0" lbank="18" prog="0"/>
+ <Patch name="PianoStr" mode="4" hbank="0" lbank="40" prog="0"/>
+ <Patch name="Dream" mode="4" hbank="0" lbank="41" prog="0"/>
+ <Patch name="Bright Piano" mode="7" hbank="0" lbank="0" prog="1"/>
+ <Patch name="BritPnoK" mode="4" hbank="0" lbank="1" prog="1"/>
+ <Patch name="E.Grand" mode="7" hbank="0" lbank="0" prog="2"/>
+ <Patch name="ElGrPnoK" mode="4" hbank="0" lbank="1" prog="2"/>
+ <Patch name="Det.CP80" mode="4" hbank="0" lbank="32" prog="2"/>
+ <Patch name="ElGrPno1" mode="4" hbank="0" lbank="40" prog="2"/>
+ <Patch name="ElGrPno2" mode="4" hbank="0" lbank="41" prog="2"/>
+ <Patch name="Honky-tonk" mode="7" hbank="0" lbank="0" prog="3"/>
+ <Patch name="HonkyTonkK" mode="4" hbank="0" lbank="1" prog="3"/>
+ <Patch name="E.Piano" mode="7" hbank="0" lbank="0" prog="4"/>
+ <Patch name="El.Pno1K" mode="4" hbank="0" lbank="1" prog="4"/>
+ <Patch name="MelloEP1" mode="4" hbank="0" lbank="18" prog="4"/>
+ <Patch name="Chor.EP1" mode="4" hbank="0" lbank="32" prog="4"/>
+ <Patch name="HardEl.P" mode="4" hbank="0" lbank="40" prog="4"/>
+ <Patch name="VXElP1" mode="4" hbank="0" lbank="45" prog="4"/>
+ <Patch name="60sEl.P" mode="4" hbank="0" lbank="64" prog="4"/>
+ <Patch name="E.Piano 2" mode="7" hbank="0" lbank="0" prog="5"/>
+ <Patch name="El.Pno2K" mode="4" hbank="0" lbank="1" prog="5"/>
+ <Patch name="Chor.EP2" mode="4" hbank="0" lbank="32" prog="5"/>
+ <Patch name="DX.Hard" mode="4" hbank="0" lbank="33" prog="5"/>
+ <Patch name="DXLegend" mode="4" hbank="0" lbank="34" prog="5"/>
+ <Patch name="DXPhase" mode="4" hbank="0" lbank="40" prog="5"/>
+ <Patch name="DX+Analg" mode="4" hbank="0" lbank="41" prog="5"/>
+ <Patch name="DXKotoEP" mode="4" hbank="0" lbank="42" prog="5"/>
+ <Patch name="VXEl.P2" mode="4" hbank="0" lbank="45" prog="5"/>
+ <Patch name="Harpsichord" mode="7" hbank="0" lbank="0" prog="6"/>
+ <Patch name="Harpsi.K" mode="4" hbank="0" lbank="1" prog="6"/>
+ <Patch name="Harpsi.2" mode="4" hbank="0" lbank="25" prog="6"/>
+ <Patch name="Harpsi.3" mode="4" hbank="0" lbank="35" prog="6"/>
+ <Patch name="Clav." mode="7" hbank="0" lbank="0" prog="7"/>
+ <Patch name="Clavi.K" mode="4" hbank="0" lbank="1" prog="7"/>
+ <Patch name="ClaviWah" mode="4" hbank="0" lbank="27" prog="7"/>
+ <Patch name="PulseClv" mode="4" hbank="0" lbank="64" prog="7"/>
+ <Patch name="PierceCl" mode="4" hbank="0" lbank="65" prog="7"/>
+ </PatchGroup>
+ <PatchGroup name="Chromatic Perc">
+ <Patch name="Celesta" mode="7" hbank="0" lbank="0" prog="8"/>
+ <Patch name="Glockenspiel" mode="7" hbank="0" lbank="0" prog="9"/>
+ <Patch name="Music Box" mode="7" hbank="0" lbank="0" prog="10"/>
+ <Patch name="Orgel" mode="4" hbank="0" lbank="64" prog="10"/>
+ <Patch name="Vibraphone" mode="7" hbank="0" lbank="0" prog="11"/>
+ <Patch name="VibesK" mode="4" hbank="0" lbank="1" prog="11"/>
+ <Patch name="HardVibe" mode="4" hbank="0" lbank="45" prog="11"/>
+ <Patch name="Marimba" mode="7" hbank="0" lbank="0" prog="12"/>
+ <Patch name="MarimbaK" mode="4" hbank="0" lbank="1" prog="12"/>
+ <Patch name="SineMrmb" mode="4" hbank="0" lbank="64" prog="12"/>
+ <Patch name="Balafon" mode="4" hbank="0" lbank="96" prog="12"/>
+ <Patch name="Balafon2" mode="4" hbank="0" lbank="97" prog="12"/>
+ <Patch name="LogDrum" mode="4" hbank="0" lbank="98" prog="12"/>
+ <Patch name="Xylophone" mode="7" hbank="0" lbank="0" prog="13"/>
+ <Patch name="Tubular Bells" mode="7" hbank="0" lbank="0" prog="14"/>
+ <Patch name="ChrchBel" mode="4" hbank="0" lbank="96" prog="14"/>
+ <Patch name="Carillon" mode="4" hbank="0" lbank="97" prog="14"/>
+ <Patch name="Dulcimer" mode="7" hbank="0" lbank="0" prog="15"/>
+ <Patch name="Dulcimr2" mode="4" hbank="0" lbank="35" prog="15"/>
+ <Patch name="Cimbalom" mode="4" hbank="0" lbank="96" prog="15"/>
+ <Patch name="Santur" mode="4" hbank="0" lbank="97" prog="15"/>
+ </PatchGroup>
+ <PatchGroup name="Organ">
+ <Patch name="Drawbar Organ" mode="7" hbank="0" lbank="0" prog="16"/>
+ <Patch name="DelDrwOr" mode="4" hbank="0" lbank="32" prog="16"/>
+ <Patch name="60sDrOr1" mode="4" hbank="0" lbank="33" prog="16"/>
+ <Patch name="60sDrOr2" mode="4" hbank="0" lbank="34" prog="16"/>
+ <Patch name="70sDrOr1" mode="4" hbank="0" lbank="35" prog="16"/>
+ <Patch name="DrawOrg2" mode="4" hbank="0" lbank="36" prog="16"/>
+ <Patch name="60sDrOr3" mode="4" hbank="0" lbank="37" prog="16"/>
+ <Patch name="EvenBar" mode="4" hbank="0" lbank="38" prog="16"/>
+ <Patch name="16+2&quot;2/3" mode="4" hbank="0" lbank="40" prog="16"/>
+ <Patch name="OrganBa" mode="4" hbank="0" lbank="64" prog="16"/>
+ <Patch name="70sDrOr2" mode="4" hbank="0" lbank="65" prog="16"/>
+ <Patch name="CheezOrg" mode="4" hbank="0" lbank="66" prog="16"/>
+ <Patch name="DrawOrg3" mode="4" hbank="0" lbank="67" prog="16"/>
+ <Patch name="Perc. Organ" mode="7" hbank="0" lbank="0" prog="17"/>
+ <Patch name="70sPcOr1" mode="4" hbank="0" lbank="24" prog="17"/>
+ <Patch name="DetPrcOr" mode="4" hbank="0" lbank="32" prog="17"/>
+ <Patch name="LiteOrg" mode="4" hbank="0" lbank="33" prog="17"/>
+ <Patch name="PercOrg2" mode="4" hbank="0" lbank="37" prog="17"/>
+ <Patch name="Rock Organ" mode="7" hbank="0" lbank="0" prog="18"/>
+ <Patch name="RotaryOr" mode="4" hbank="0" lbank="64" prog="18"/>
+ <Patch name="SloRotar" mode="4" hbank="0" lbank="65" prog="18"/>
+ <Patch name="FstRotar" mode="4" hbank="0" lbank="66" prog="18"/>
+ <Patch name="Church Organ" mode="7" hbank="0" lbank="0" prog="19"/>
+ <Patch name="ChurOrg3" mode="4" hbank="0" lbank="32" prog="19"/>
+ <Patch name="ChurOrg2" mode="4" hbank="0" lbank="35" prog="19"/>
+ <Patch name="NotreDam" mode="4" hbank="0" lbank="40" prog="19"/>
+ <Patch name="OrgFlute" mode="4" hbank="0" lbank="64" prog="19"/>
+ <Patch name="TrmOrgFl" mode="4" hbank="0" lbank="65" prog="19"/>
+ <Patch name="Reed Organ" mode="7" hbank="0" lbank="0" prog="20"/>
+ <Patch name="PuffOrg" mode="4" hbank="0" lbank="40" prog="20"/>
+ <Patch name="Akkordion" mode="7" hbank="0" lbank="0" prog="21"/>
+ <Patch name="Accordlt" mode="4" hbank="0" lbank="32" prog="21"/>
+ <Patch name="Harmonica" mode="7" hbank="0" lbank="0" prog="22"/>
+ <Patch name="Harmo2" mode="4" hbank="0" lbank="32" prog="22"/>
+ <Patch name="Bandoneon" mode="7" hbank="0" lbank="0" prog="23"/>
+ <Patch name="TngoAcd2" mode="4" hbank="0" lbank="64" prog="23"/>
+ </PatchGroup>
+ <PatchGroup name="Guitar">
+ <Patch name="Nylon Gtr." mode="7" hbank="0" lbank="0" prog="24"/>
+ <Patch name="NylonGt2" mode="4" hbank="0" lbank="16" prog="24"/>
+ <Patch name="NylonGt3" mode="4" hbank="0" lbank="25" prog="24"/>
+ <Patch name="VelGtHrm" mode="4" hbank="0" lbank="43" prog="24"/>
+ <Patch name="Ukelele" mode="4" hbank="0" lbank="96" prog="24"/>
+ <Patch name="Steel Gtr." mode="7" hbank="0" lbank="0" prog="25"/>
+ <Patch name="SteelGt2" mode="4" hbank="0" lbank="16" prog="25"/>
+ <Patch name="12StrGtr" mode="4" hbank="0" lbank="35" prog="25"/>
+ <Patch name="Nylon-Stl" mode="4" hbank="0" lbank="40" prog="25"/>
+ <Patch name="Stl-Body" mode="4" hbank="0" lbank="41" prog="25"/>
+ <Patch name="Mandolin" mode="4" hbank="0" lbank="96" prog="25"/>
+ <Patch name="Jazz Guitar" mode="7" hbank="0" lbank="0" prog="26"/>
+ <Patch name="MelloGtr" mode="4" hbank="0" lbank="18" prog="26"/>
+ <Patch name="JazzAmp" mode="4" hbank="0" lbank="32" prog="26"/>
+ <Patch name="PdlSteel" mode="4" hbank="0" lbank="96" prog="26"/>
+ <Patch name="Clean Guitar" mode="7" hbank="0" lbank="0" prog="27"/>
+ <Patch name="ChorusGt" mode="4" hbank="0" lbank="32" prog="27"/>
+ <Patch name="CleanGt2" mode="4" hbank="0" lbank="64" prog="27"/>
+ <Patch name="Muted Guitar" mode="7" hbank="0" lbank="0" prog="28"/>
+ <Patch name="FunkGtr1" mode="4" hbank="0" lbank="40" prog="28"/>
+ <Patch name="MuteStlG" mode="4" hbank="0" lbank="41" prog="28"/>
+ <Patch name="FunkGtr2" mode="4" hbank="0" lbank="43" prog="28"/>
+ <Patch name="JazzMan" mode="4" hbank="0" lbank="45" prog="28"/>
+ <Patch name="Mu.DstGt" mode="4" hbank="0" lbank="96" prog="28"/>
+ <Patch name="Overdrive Gtr" mode="7" hbank="0" lbank="0" prog="29"/>
+ <Patch name="Gt.Pinch" mode="4" hbank="0" lbank="43" prog="29"/>
+ <Patch name="Distortion Gtr" mode="7" hbank="0" lbank="0" prog="30"/>
+ <Patch name="DstRthmG" mode="4" hbank="0" lbank="12" prog="30"/>
+ <Patch name="DistGtr2" mode="4" hbank="0" lbank="24" prog="30"/>
+ <Patch name="DistGtr3" mode="4" hbank="0" lbank="35" prog="30"/>
+ <Patch name="PowerGt2" mode="4" hbank="0" lbank="36" prog="30"/>
+ <Patch name="PowerGt1" mode="4" hbank="0" lbank="37" prog="30"/>
+ <Patch name="Dst.5ths" mode="4" hbank="0" lbank="38" prog="30"/>
+ <Patch name="FeedbkGt" mode="4" hbank="0" lbank="40" prog="30"/>
+ <Patch name="FeedbGt2" mode="4" hbank="0" lbank="41" prog="30"/>
+ <Patch name="RkRythm2" mode="4" hbank="0" lbank="43" prog="30"/>
+ <Patch name="RockRthm" mode="4" hbank="0" lbank="45" prog="30"/>
+ <Patch name="Gtr. Harmonics" mode="7" hbank="0" lbank="0" prog="31"/>
+ <Patch name="GtFeedbk" mode="4" hbank="0" lbank="65" prog="31"/>
+ <Patch name="GtrHrmo2" mode="4" hbank="0" lbank="66" prog="31"/>
+ <Patch name="AcoHarmo" mode="4" hbank="0" lbank="64" prog="31"/>
+ </PatchGroup>
+ <PatchGroup name="Bass">
+ <Patch name="Acoustic Bass" mode="7" hbank="0" lbank="0" prog="32"/>
+ <Patch name="JazzRthm" mode="4" hbank="0" lbank="40" prog="32"/>
+ <Patch name="VXUprght" mode="4" hbank="0" lbank="45" prog="32"/>
+ <Patch name="Fingered Bass" mode="7" hbank="0" lbank="0" prog="33"/>
+ <Patch name="FingrDrk" mode="4" hbank="0" lbank="18" prog="33"/>
+ <Patch name="FlangeBa" mode="4" hbank="0" lbank="27" prog="33"/>
+ <Patch name="Ba-DstEG" mode="4" hbank="0" lbank="40" prog="33"/>
+ <Patch name="FngrSlap" mode="4" hbank="0" lbank="43" prog="33"/>
+ <Patch name="FngBass2" mode="4" hbank="0" lbank="45" prog="33"/>
+ <Patch name="JazzBass" mode="4" hbank="0" lbank="64" prog="33"/>
+ <Patch name="ModAlem" mode="4" hbank="0" lbank="65" prog="33"/>
+ <Patch name="Picked Bass" mode="7" hbank="0" lbank="0" prog="34"/>
+ <Patch name="MutePkBa" mode="4" hbank="0" lbank="28" prog="34"/>
+ <Patch name="Fretless Bass" mode="7" hbank="0" lbank="0" prog="35"/>
+ <Patch name="Fretles2" mode="4" hbank="0" lbank="32" prog="35"/>
+ <Patch name="Fretles3" mode="4" hbank="0" lbank="33" prog="35"/>
+ <Patch name="Fretles4" mode="4" hbank="0" lbank="34" prog="35"/>
+ <Patch name="SynFretl" mode="4" hbank="0" lbank="96" prog="35"/>
+ <Patch name="Smooth" mode="4" hbank="0" lbank="97" prog="35"/>
+ <Patch name="Slap Bass 1" mode="7" hbank="0" lbank="0" prog="36"/>
+ <Patch name="ResoSlap" mode="4" hbank="0" lbank="27" prog="36"/>
+ <Patch name="PunchThm" mode="4" hbank="0" lbank="32" prog="36"/>
+ <Patch name="Slap Bass 2" mode="7" hbank="0" lbank="0" prog="37"/>
+ <Patch name="VeloSlap" mode="4" hbank="0" lbank="43" prog="37"/>
+ <Patch name="Synth Bass 1" mode="7" hbank="0" lbank="0" prog="38"/>
+ <Patch name="SynBa1Dk" mode="4" hbank="0" lbank="18" prog="38"/>
+ <Patch name="FastResB" mode="4" hbank="0" lbank="20" prog="38"/>
+ <Patch name="AcidBass" mode="4" hbank="0" lbank="24" prog="38"/>
+ <Patch name="ClvBass" mode="4" hbank="0" lbank="35" prog="38"/>
+ <Patch name="TeknoBa" mode="4" hbank="0" lbank="40" prog="38"/>
+ <Patch name="Oscar" mode="4" hbank="0" lbank="64" prog="38"/>
+ <Patch name="SqrBass" mode="4" hbank="0" lbank="65" prog="38"/>
+ <Patch name="RubberBa" mode="4" hbank="0" lbank="66" prog="38"/>
+ <Patch name="Hammer" mode="4" hbank="0" lbank="96" prog="38"/>
+ <Patch name="Synth Bass 2" mode="7" hbank="0" lbank="0" prog="39"/>
+ <Patch name="MelloSB1" mode="4" hbank="0" lbank="6" prog="39"/>
+ <Patch name="SeqBass" mode="4" hbank="0" lbank="12" prog="39"/>
+ <Patch name="ClkSynBa" mode="4" hbank="0" lbank="18" prog="39"/>
+ <Patch name="SynBa2Dk" mode="4" hbank="0" lbank="19" prog="39"/>
+ <Patch name="SmthBa2" mode="4" hbank="0" lbank="32" prog="39"/>
+ <Patch name="ModulrBa" mode="4" hbank="0" lbank="40" prog="39"/>
+ <Patch name="DXBass" mode="4" hbank="0" lbank="41" prog="39"/>
+ <Patch name="XWireBa" mode="4" hbank="0" lbank="64" prog="39"/>
+ </PatchGroup>
+ <PatchGroup name="Strings/Orch">
+ <Patch name="Violin" mode="7" hbank="0" lbank="0" prog="40"/>
+ <Patch name="SlowVln" mode="4" hbank="0" lbank="8" prog="40"/>
+ <Patch name="Viola" mode="7" hbank="0" lbank="0" prog="41"/>
+ <Patch name="Cello" mode="7" hbank="0" lbank="0" prog="42"/>
+ <Patch name="Contrabass" mode="7" hbank="0" lbank="0" prog="43"/>
+ <Patch name="Tremolo Str." mode="7" hbank="0" lbank="0" prog="44"/>
+ <Patch name="SlowTrSt" mode="4" hbank="0" lbank="8" prog="44"/>
+ <Patch name="SuspStr" mode="4" hbank="0" lbank="40" prog="44"/>
+ <Patch name="Pizzicato Str." mode="7" hbank="0" lbank="0" prog="45"/>
+ <Patch name="Harp" mode="7" hbank="0" lbank="0" prog="46"/>
+ <Patch name="YangChin" mode="4" hbank="0" lbank="40" prog="46"/>
+ <Patch name="Timpani" mode="7" hbank="0" lbank="0" prog="47"/>
+ </PatchGroup>
+ <PatchGroup name="Ensemble">
+ <Patch name="Strings 1" mode="7" hbank="0" lbank="0" prog="48"/>
+ <Patch name="S.Strngs" mode="4" hbank="0" lbank="3" prog="48"/>
+ <Patch name="SlowStr" mode="4" hbank="0" lbank="8" prog="48"/>
+ <Patch name="ArcoStr" mode="4" hbank="0" lbank="24" prog="48"/>
+ <Patch name="60sStrng" mode="4" hbank="0" lbank="35" prog="48"/>
+ <Patch name="Orchestr" mode="4" hbank="0" lbank="40" prog="48"/>
+ <Patch name="Orchstr2" mode="4" hbank="0" lbank="41" prog="48"/>
+ <Patch name="TremOrch" mode="4" hbank="0" lbank="42" prog="48"/>
+ <Patch name="VeloStr" mode="4" hbank="0" lbank="45" prog="48"/>
+ <Patch name="Strings 2" mode="7" hbank="0" lbank="0" prog="49"/>
+ <Patch name="S.SlwStr" mode="4" hbank="0" lbank="3" prog="49"/>
+ <Patch name="LegatoSt" mode="4" hbank="0" lbank="8" prog="49"/>
+ <Patch name="WarmStr" mode="4" hbank="0" lbank="40" prog="49"/>
+ <Patch name="Kingdom" mode="4" hbank="0" lbank="41" prog="49"/>
+ <Patch name="70sStr" mode="4" hbank="0" lbank="64" prog="49"/>
+ <Patch name="StrEns3" mode="4" hbank="0" lbank="65" prog="49"/>
+ <Patch name="Syn. Strings 1" mode="7" hbank="0" lbank="0" prog="50"/>
+ <Patch name="ResoStr" mode="4" hbank="0" lbank="27" prog="50"/>
+ <Patch name="SynStr4" mode="4" hbank="0" lbank="64" prog="50"/>
+ <Patch name="SSStr" mode="4" hbank="0" lbank="65" prog="50"/>
+ <Patch name="SynStr3" mode="4" hbank="0" lbank="35" prog="50"/>
+ <Patch name="Syn. Strings 2" mode="7" hbank="0" lbank="0" prog="51"/>
+ <Patch name="Choir Aahs" mode="7" hbank="0" lbank="0" prog="52"/>
+ <Patch name="S.Choir" mode="4" hbank="0" lbank="3" prog="52"/>
+ <Patch name="Ch.Aahs2" mode="4" hbank="0" lbank="16" prog="52"/>
+ <Patch name="MelChoir" mode="4" hbank="0" lbank="32" prog="52"/>
+ <Patch name="ChoirStr" mode="4" hbank="0" lbank="40" prog="52"/>
+ <Patch name="StrngAah" mode="4" hbank="0" lbank="64" prog="52"/>
+ <Patch name="MaleAah" mode="4" hbank="0" lbank="65" prog="52"/>
+ <Patch name="Voice Oohs" mode="7" hbank="0" lbank="0" prog="53"/>
+ <Patch name="VoiceDoo" mode="4" hbank="0" lbank="64" prog="53"/>
+ <Patch name="VoiceHmn" mode="4" hbank="0" lbank="96" prog="53"/>
+ <Patch name="Synth Voice" mode="7" hbank="0" lbank="0" prog="54"/>
+ <Patch name="SynVox2" mode="4" hbank="0" lbank="40" prog="54"/>
+ <Patch name="Choral" mode="4" hbank="0" lbank="41" prog="54"/>
+ <Patch name="AnaVoice" mode="4" hbank="0" lbank="64" prog="54"/>
+ <Patch name="Orchestra Hit" mode="7" hbank="0" lbank="0" prog="55"/>
+ <Patch name="OrchHit2" mode="4" hbank="0" lbank="35" prog="55"/>
+ <Patch name="Impact" mode="4" hbank="0" lbank="64" prog="55"/>
+ <Patch name="DoublHit" mode="4" hbank="0" lbank="66" prog="55"/>
+ <Patch name="BrStab80" mode="4" hbank="0" lbank="67" prog="55"/>
+ </PatchGroup>
+ <PatchGroup name="Brass">
+ <Patch name="Trumpet" mode="7" hbank="0" lbank="0" prog="56"/>
+ <Patch name="Trumpet2" mode="4" hbank="0" lbank="16" prog="56"/>
+ <Patch name="BriteTrp" mode="4" hbank="0" lbank="17" prog="56"/>
+ <Patch name="WarmTrp" mode="4" hbank="0" lbank="32" prog="56"/>
+ <Patch name="FluglHrn" mode="4" hbank="0" lbank="96" prog="56"/>
+ <Patch name="Trombone" mode="7" hbank="0" lbank="0" prog="57"/>
+ <Patch name="Trmbone2" mode="4" hbank="0" lbank="18" prog="57"/>
+ <Patch name="Tuba" mode="7" hbank="0" lbank="0" prog="58"/>
+ <Patch name="Tuba2" mode="4" hbank="0" lbank="16" prog="58"/>
+ <Patch name="Muted Trumpet" mode="7" hbank="0" lbank="0" prog="59"/>
+ <Patch name="MuteTrp2" mode="4" hbank="2" lbank="64" prog="59"/>
+ <Patch name="French Horn" mode="7" hbank="0" lbank="0" prog="60"/>
+ <Patch name="FrHrSolo" mode="4" hbank="0" lbank="6" prog="60"/>
+ <Patch name="FrHorn2" mode="4" hbank="0" lbank="32" prog="60"/>
+ <Patch name="HornOrch" mode="4" hbank="0" lbank="37" prog="60"/>
+ <Patch name="Brass Section" mode="7" hbank="0" lbank="0" prog="61"/>
+ <Patch name="Tp-TbSec" mode="4" hbank="0" lbank="35" prog="61"/>
+ <Patch name="BrssSec2" mode="4" hbank="0" lbank="40" prog="61"/>
+ <Patch name="HiBrass" mode="4" hbank="0" lbank="41" prog="61"/>
+ <Patch name="MelloBrs" mode="4" hbank="0" lbank="42" prog="61"/>
+ <Patch name="SfrzndBr" mode="4" hbank="0" lbank="14" prog="61"/>
+ <Patch name="BrssFall" mode="4" hbank="0" lbank="39" prog="61"/>
+ <Patch name="Synth Brass 1" mode="7" hbank="0" lbank="0" prog="62"/>
+ <Patch name="QuackBr" mode="4" hbank="0" lbank="12" prog="62"/>
+ <Patch name="RezSynBr" mode="4" hbank="0" lbank="20" prog="62"/>
+ <Patch name="PolyBrss" mode="4" hbank="0" lbank="24" prog="62"/>
+ <Patch name="SynBras3" mode="4" hbank="0" lbank="27" prog="62"/>
+ <Patch name="JumpBrss" mode="4" hbank="0" lbank="32" prog="62"/>
+ <Patch name="AnaVelBr" mode="4" hbank="0" lbank="45" prog="62"/>
+ <Patch name="AnaBrss1" mode="4" hbank="0" lbank="64" prog="62"/>
+ <Patch name="Synth Brass 2" mode="7" hbank="0" lbank="0" prog="63"/>
+ <Patch name="SoftBrs" mode="4" hbank="0" lbank="18" prog="63"/>
+ <Patch name="SynBras4" mode="4" hbank="0" lbank="40" prog="63"/>
+ <Patch name="ChoBrss" mode="4" hbank="0" lbank="41" prog="63"/>
+ <Patch name="VelBras2" mode="4" hbank="0" lbank="45" prog="63"/>
+ <Patch name="AnaBras2" mode="4" hbank="0" lbank="64" prog="63"/>
+ </PatchGroup>
+ <PatchGroup name="Reed">
+ <Patch name="Soprano Sax" mode="7" hbank="0" lbank="0" prog="64"/>
+ <Patch name="Alto Sax" mode="7" hbank="0" lbank="0" prog="65"/>
+ <Patch name="SaxSect" mode="4" hbank="0" lbank="40" prog="65"/>
+ <Patch name="HyprAlto" mode="4" hbank="0" lbank="43" prog="65"/>
+ <Patch name="Tenor Sax" mode="7" hbank="0" lbank="0" prog="66"/>
+ <Patch name="BrthTnSx" mode="4" hbank="0" lbank="40" prog="66"/>
+ <Patch name="SoftTenr" mode="4" hbank="0" lbank="41" prog="66"/>
+ <Patch name="TnrSax2" mode="4" hbank="0" lbank="64" prog="66"/>
+ <Patch name="Baritone Sax" mode="7" hbank="0" lbank="0" prog="67"/>
+ <Patch name="Oboe" mode="7" hbank="0" lbank="0" prog="68"/>
+ <Patch name="English Horn" mode="7" hbank="0" lbank="0" prog="69"/>
+ <Patch name="Bassoon" mode="7" hbank="0" lbank="0" prog="70"/>
+ <Patch name="Clarinet" mode="7" hbank="0" lbank="0" prog="71"/>
+ <Patch name="BassClar" mode="4" hbank="0" lbank="96" prog="71"/>
+ </PatchGroup>
+ <PatchGroup name="Pipe">
+ <Patch name="Piccolo" mode="7" hbank="0" lbank="0" prog="72"/>
+ <Patch name="Flute" mode="7" hbank="0" lbank="0" prog="73"/>
+ <Patch name="Recorder" mode="7" hbank="0" lbank="0" prog="74"/>
+ <Patch name="Pan Flute" mode="7" hbank="0" lbank="0" prog="75"/>
+ <Patch name="PanFlut2" mode="4" hbank="0" lbank="64" prog="75"/>
+ <Patch name="Kawala" mode="4" hbank="0" lbank="96" prog="75"/>
+ <Patch name="Blown Bottle" mode="7" hbank="0" lbank="0" prog="76"/>
+ <Patch name="Shakuhachi" mode="7" hbank="0" lbank="0" prog="77"/>
+ <Patch name="Whistle" mode="7" hbank="0" lbank="0" prog="78"/>
+ <Patch name="Ocarina" mode="7" hbank="0" lbank="0" prog="79"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Lead">
+ <Patch name="Square Wave" mode="7" hbank="0" lbank="0" prog="80"/>
+ <Patch name="Square2" mode="4" hbank="0" lbank="6" prog="80"/>
+ <Patch name="LMSquare" mode="4" hbank="0" lbank="8" prog="80"/>
+ <Patch name="Hollow" mode="4" hbank="0" lbank="18" prog="80"/>
+ <Patch name="Shmoog" mode="4" hbank="0" lbank="19" prog="80"/>
+ <Patch name="Mellow" mode="4" hbank="0" lbank="64" prog="80"/>
+ <Patch name="SoloSine" mode="4" hbank="0" lbank="65" prog="80"/>
+ <Patch name="SineLead" mode="4" hbank="0" lbank="66" prog="80"/>
+ <Patch name="Saw Wave" mode="7" hbank="0" lbank="0" prog="81"/>
+ <Patch name="Saw2" mode="4" hbank="0" lbank="6" prog="81"/>
+ <Patch name="ThickSaw" mode="4" hbank="0" lbank="8" prog="81"/>
+ <Patch name="DynaSaw" mode="4" hbank="0" lbank="18" prog="81"/>
+ <Patch name="DigiSaw" mode="4" hbank="0" lbank="19" prog="81"/>
+ <Patch name="BigLead" mode="4" hbank="0" lbank="20" prog="81"/>
+ <Patch name="HeavySyn" mode="4" hbank="0" lbank="24" prog="81"/>
+ <Patch name="WaspySyn" mode="4" hbank="0" lbank="25" prog="81"/>
+ <Patch name="PulseSaw" mode="4" hbank="0" lbank="40" prog="81"/>
+ <Patch name="Dr.Lead" mode="4" hbank="0" lbank="41" prog="81"/>
+ <Patch name="VeloLead" mode="4" hbank="0" lbank="45" prog="81"/>
+ <Patch name="SeqAna" mode="4" hbank="0" lbank="96" prog="81"/>
+ <Patch name="Calliope" mode="7" hbank="0" lbank="0" prog="82"/>
+ <Patch name="PurePad" mode="4" hbank="0" lbank="65" prog="82"/>
+ <Patch name="VentSyn" mode="4" hbank="0" lbank="64" prog="82"/>
+ <Patch name="Chiffer Lead" mode="7" hbank="0" lbank="0" prog="83"/>
+ <Patch name="Rubby" mode="4" hbank="0" lbank="64" prog="83"/>
+ <Patch name="Charang" mode="7" hbank="0" lbank="0" prog="84"/>
+ <Patch name="DistLead" mode="4" hbank="0" lbank="64" prog="84"/>
+ <Patch name="WireLead" mode="4" hbank="0" lbank="65" prog="84"/>
+ <Patch name="Solo Vox" mode="7" hbank="0" lbank="0" prog="85"/>
+ <Patch name="SynthAah" mode="4" hbank="0" lbank="24" prog="85"/>
+ <Patch name="VoxLead" mode="4" hbank="0" lbank="64" prog="85"/>
+ <Patch name="Fifth Saw" mode="7" hbank="0" lbank="0" prog="86"/>
+ <Patch name="BigFive" mode="4" hbank="0" lbank="35" prog="86"/>
+ <Patch name="Bass Lead" mode="7" hbank="0" lbank="0" prog="87"/>
+ <Patch name="Big-Low" mode="4" hbank="0" lbank="16" prog="87"/>
+ <Patch name="Fat-Prky" mode="4" hbank="0" lbank="64" prog="87"/>
+ <Patch name="SoftWurl" mode="4" hbank="0" lbank="65" prog="87"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Pad">
+ <Patch name="New Age Pad" mode="7" hbank="0" lbank="0" prog="88"/>
+ <Patch name="Fantasy2" mode="4" hbank="0" lbank="64" prog="88"/>
+ <Patch name="Warm Pad" mode="7" hbank="0" lbank="0" prog="89"/>
+ <Patch name="ThickPad" mode="4" hbank="0" lbank="16" prog="89"/>
+ <Patch name="SoftPad" mode="4" hbank="0" lbank="17" prog="89"/>
+ <Patch name="SinePad" mode="4" hbank="0" lbank="18" prog="89"/>
+ <Patch name="HornPad" mode="4" hbank="0" lbank="64" prog="89"/>
+ <Patch name="RotarStr" mode="4" hbank="0" lbank="65" prog="89"/>
+ <Patch name="Polysynth Pad" mode="7" hbank="0" lbank="0" prog="90"/>
+ <Patch name="PolyPd80" mode="4" hbank="0" lbank="64" prog="90"/>
+ <Patch name="ClickPad" mode="4" hbank="0" lbank="65" prog="90"/>
+ <Patch name="AnaPad" mode="4" hbank="0" lbank="66" prog="90"/>
+ <Patch name="SquarPad" mode="4" hbank="0" lbank="67" prog="90"/>
+ <Patch name="Choir Pad" mode="7" hbank="0" lbank="0" prog="91"/>
+ <Patch name="Heaven2" mode="4" hbank="0" lbank="64" prog="91"/>
+ <Patch name="Itopia" mode="4" hbank="0" lbank="66" prog="91"/>
+ <Patch name="CCPad" mode="4" hbank="0" lbank="67" prog="91"/>
+ <Patch name="LitePad" mode="4" hbank="0" lbank="65" prog="91"/>
+ <Patch name="Bowed Pad" mode="7" hbank="0" lbank="0" prog="92"/>
+ <Patch name="Glacier" mode="4" hbank="0" lbank="64" prog="92"/>
+ <Patch name="GlassPad" mode="4" hbank="0" lbank="65" prog="92"/>
+ <Patch name="Metallic Pad" mode="7" hbank="0" lbank="0" prog="93"/>
+ <Patch name="TinePad" mode="4" hbank="0" lbank="64" prog="93"/>
+ <Patch name="PanPad" mode="4" hbank="0" lbank="65" prog="93"/>
+ <Patch name="Halo Pad" mode="7" hbank="0" lbank="0" prog="94"/>
+ <Patch name="Sweep Pad" mode="7" hbank="0" lbank="0" prog="95"/>
+ <Patch name="Shwimmer" mode="4" hbank="0" lbank="20" prog="95"/>
+ <Patch name="Converge" mode="4" hbank="0" lbank="27" prog="95"/>
+ <Patch name="PolarPad" mode="4" hbank="0" lbank="64" prog="95"/>
+ <Patch name="Celstial" mode="4" hbank="0" lbank="66" prog="95"/>
+ <Patch name="Sweepy" mode="4" hbank="0" lbank="65" prog="95"/>
+ </PatchGroup>
+ <PatchGroup name="Synth FX">
+ <Patch name="Rain" mode="7" hbank="0" lbank="0" prog="96"/>
+ <Patch name="ClaviPad" mode="4" hbank="0" lbank="45" prog="96"/>
+ <Patch name="HrmoRain" mode="4" hbank="0" lbank="64" prog="96"/>
+ <Patch name="AfrcnWnd" mode="4" hbank="0" lbank="65" prog="96"/>
+ <Patch name="Caribean" mode="4" hbank="0" lbank="66" prog="96"/>
+ <Patch name="Soundtrack" mode="7" hbank="0" lbank="0" prog="97"/>
+ <Patch name="Prologue" mode="4" hbank="0" lbank="27" prog="97"/>
+ <Patch name="Ancestrl" mode="4" hbank="0" lbank="64" prog="97"/>
+ <Patch name="Rave" mode="4" hbank="0" lbank="65" prog="97"/>
+ <Patch name="Crystal" mode="7" hbank="0" lbank="0" prog="98"/>
+ <Patch name="SynDrCmp" mode="4" hbank="0" lbank="12" prog="98"/>
+ <Patch name="Popcorn" mode="4" hbank="0" lbank="14" prog="98"/>
+ <Patch name="TinyBell" mode="4" hbank="0" lbank="18" prog="98"/>
+ <Patch name="RndGlock" mode="4" hbank="0" lbank="35" prog="98"/>
+ <Patch name="GlockChi" mode="4" hbank="0" lbank="40" prog="98"/>
+ <Patch name="ClearBel" mode="4" hbank="0" lbank="41" prog="98"/>
+ <Patch name="ChorBell" mode="4" hbank="0" lbank="42" prog="98"/>
+ <Patch name="SynMalet" mode="4" hbank="0" lbank="64" prog="98"/>
+ <Patch name="SftCryst" mode="4" hbank="0" lbank="65" prog="98"/>
+ <Patch name="LoudGlok" mode="4" hbank="0" lbank="66" prog="98"/>
+ <Patch name="XmasBell" mode="4" hbank="0" lbank="67" prog="98"/>
+ <Patch name="VibeBell" mode="4" hbank="0" lbank="68" prog="98"/>
+ <Patch name="DigiBell" mode="4" hbank="0" lbank="69" prog="98"/>
+ <Patch name="AirBells" mode="4" hbank="0" lbank="70" prog="98"/>
+ <Patch name="BellHarp" mode="4" hbank="0" lbank="71" prog="98"/>
+ <Patch name="Gamelmba" mode="4" hbank="0" lbank="72" prog="98"/>
+ <Patch name="Athmosphere" mode="7" hbank="0" lbank="0" prog="99"/>
+ <Patch name="WarmAtms" mode="4" hbank="0" lbank="18" prog="99"/>
+ <Patch name="HollwRls" mode="4" hbank="0" lbank="19" prog="99"/>
+ <Patch name="NylonEP" mode="4" hbank="0" lbank="40" prog="99"/>
+ <Patch name="NylnHarp" mode="4" hbank="0" lbank="64" prog="99"/>
+ <Patch name="HarpVox" mode="4" hbank="0" lbank="65" prog="99"/>
+ <Patch name="Brightness" mode="7" hbank="0" lbank="0" prog="100"/>
+ <Patch name="Goblins" mode="7" hbank="0" lbank="0" prog="101"/>
+ <Patch name="MilkyWay" mode="4" hbank="0" lbank="69" prog="101"/>
+ <Patch name="Puffy" mode="4" hbank="0" lbank="72" prog="101"/>
+ <Patch name="Echoes" mode="7" hbank="0" lbank="0" prog="102"/>
+ <Patch name="Sci-Fi" mode="7" hbank="0" lbank="0" prog="103"/>
+ <Patch name="Odyssey" mode="4" hbank="0" lbank="65" prog="103"/>
+ </PatchGroup>
+ <PatchGroup name="Ethnic">
+ <Patch name="Sitar" mode="7" hbank="0" lbank="0" prog="104"/>
+ <Patch name="DetSitar" mode="4" hbank="0" lbank="32" prog="104"/>
+ <Patch name="Sitar2" mode="4" hbank="0" lbank="35" prog="104"/>
+ <Patch name="Tambra" mode="4" hbank="0" lbank="96" prog="104"/>
+ <Patch name="Tamboura" mode="4" hbank="0" lbank="97" prog="104"/>
+ <Patch name="Banjo" mode="7" hbank="0" lbank="0" prog="105"/>
+ <Patch name="MuteBnjo" mode="4" hbank="0" lbank="28" prog="105"/>
+ <Patch name="Rabab" mode="4" hbank="0" lbank="96" prog="105"/>
+ <Patch name="Gopichnt" mode="4" hbank="0" lbank="97" prog="105"/>
+ <Patch name="Oud" mode="4" hbank="0" lbank="98" prog="105"/>
+ <Patch name="Shamisen" mode="7" hbank="0" lbank="0" prog="106"/>
+ <Patch name="Tsugaru" mode="4" hbank="0" lbank="96" prog="106"/>
+ <Patch name="Koto" mode="7" hbank="0" lbank="0" prog="107"/>
+ <Patch name="T.Koto" mode="4" hbank="0" lbank="96" prog="107"/>
+ <Patch name="Kanoon" mode="4" hbank="0" lbank="97" prog="107"/>
+ <Patch name="Kalimba" mode="7" hbank="0" lbank="0" prog="108"/>
+ <Patch name="BigKalim" mode="4" hbank="0" lbank="64" prog="108"/>
+ <Patch name="Bagpipe" mode="7" hbank="0" lbank="0" prog="109"/>
+ <Patch name="Fiddle" mode="7" hbank="0" lbank="0" prog="110"/>
+ <Patch name="Shanai" mode="7" hbank="0" lbank="0" prog="111"/>
+ <Patch name="Shanai2" mode="4" hbank="0" lbank="64" prog="111"/>
+ <Patch name="Pungi" mode="4" hbank="0" lbank="96" prog="111"/>
+ <Patch name="Hichriki" mode="4" hbank="0" lbank="97" prog="111"/>
+ </PatchGroup>
+ <PatchGroup name="Percussive">
+ <Patch name="Tinkle Bell" mode="7" hbank="0" lbank="0" prog="112"/>
+ <Patch name="Bonang" mode="4" hbank="0" lbank="96" prog="112"/>
+ <Patch name="Gender" mode="4" hbank="0" lbank="97" prog="112"/>
+ <Patch name="Gamelan" mode="4" hbank="0" lbank="98" prog="112"/>
+ <Patch name="S.Gamlan" mode="4" hbank="0" lbank="99" prog="112"/>
+ <Patch name="RamaCym" mode="4" hbank="0" lbank="100" prog="112"/>
+ <Patch name="AsianBel" mode="4" hbank="0" lbank="101" prog="112"/>
+ <Patch name="Agogo" mode="7" hbank="0" lbank="0" prog="113"/>
+ <Patch name="Atrigane" mode="4" hbank="0" lbank="96" prog="113"/>
+ <Patch name="Steel Drums" mode="7" hbank="0" lbank="0" prog="114"/>
+ <Patch name="GlasPerc" mode="4" hbank="0" lbank="97" prog="114"/>
+ <Patch name="ThaiBell" mode="4" hbank="0" lbank="98" prog="114"/>
+ <Patch name="Tablas" mode="4" hbank="0" lbank="96" prog="114"/>
+ <Patch name="Woodblock" mode="7" hbank="0" lbank="0" prog="115"/>
+ <Patch name="Castanet" mode="4" hbank="0" lbank="96" prog="115"/>
+ <Patch name="Taiko Drum" mode="7" hbank="0" lbank="0" prog="116"/>
+ <Patch name="Gr.Cassa" mode="4" hbank="0" lbank="96" prog="116"/>
+ <Patch name="Melodic Drum" mode="7" hbank="0" lbank="0" prog="117"/>
+ <Patch name="MelTom2" mode="4" hbank="0" lbank="64" prog="117"/>
+ <Patch name="RealTom" mode="4" hbank="0" lbank="65" prog="117"/>
+ <Patch name="RockTom" mode="4" hbank="0" lbank="66" prog="117"/>
+ <Patch name="Synth Drum" mode="7" hbank="0" lbank="0" prog="118"/>
+ <Patch name="AnaTom" mode="4" hbank="0" lbank="64" prog="118"/>
+ <Patch name="ElecPerc" mode="4" hbank="0" lbank="65" prog="118"/>
+ <Patch name="Rev. Cymbal" mode="7" hbank="0" lbank="0" prog="119"/>
+ <Patch name="RevCym2" mode="4" hbank="0" lbank="64" prog="119"/>
+ <Patch name="RevSnar1" mode="4" hbank="0" lbank="96" prog="119"/>
+ <Patch name="RevSnar2" mode="4" hbank="0" lbank="97" prog="119"/>
+ <Patch name="RevKick1" mode="4" hbank="0" lbank="98" prog="119"/>
+ <Patch name="RevConBD" mode="4" hbank="0" lbank="99" prog="119"/>
+ <Patch name="RevTom1" mode="4" hbank="0" lbank="100" prog="119"/>
+ <Patch name="RevTom2" mode="4" hbank="0" lbank="101" prog="119"/>
+ </PatchGroup>
+ <PatchGroup name="Special FX">
+ <Patch name="Gtr Fret Noise" mode="7" hbank="0" lbank="0" prog="120"/>
+ <Patch name="Breath Noise" mode="7" hbank="0" lbank="0" prog="121"/>
+ <Patch name="Seashore" mode="7" hbank="0" lbank="0" prog="122"/>
+ <Patch name="Bird Tweed" mode="7" hbank="0" lbank="0" prog="123"/>
+ <Patch name="Telephone" mode="7" hbank="0" lbank="0" prog="124"/>
+ <Patch name="Helicopter" mode="7" hbank="0" lbank="0" prog="125"/>
+ <Patch name="Applaus" mode="7" hbank="0" lbank="0" prog="126"/>
+ <Patch name="Gunshot" mode="7" hbank="0" lbank="0" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="Drums">
+ <Patch name="Standard" mode="6" hbank="17" lbank="0" prog="0"/>
+ <Patch name="Standrd2" mode="4" hbank="17" lbank="0" prog="1"/>
+ <Patch name="Room" mode="6" hbank="17" lbank="0" prog="8"/>
+ <Patch name="Rock" mode="4" hbank="17" lbank="0" prog="16"/>
+ <Patch name="Electro" mode="6" hbank="17" lbank="0" prog="24"/>
+ <Patch name="Analog" mode="6" hbank="17" lbank="0" prog="25"/>
+ <Patch name="Jazz" mode="6" hbank="17" lbank="0" prog="32"/>
+ <Patch name="Brush" mode="6" hbank="17" lbank="0" prog="40"/>
+ <Patch name="Classic" mode="6" hbank="17" lbank="0" prog="48"/>
+ <Patch name="Power" mode="2" hbank="17" lbank="0" prog="16"/>
+ <Patch name="SFX1" mode="2" hbank="17" lbank="0" prog="56"/>
+ <Patch name="GM" mode="2" hbank="17" lbank="0" prog="127"/>
+ <Patch name="SFX1" mode="4" hbank="16" lbank="0" prog="0"/>
+ <Patch name="SFX2" mode="4" hbank="16" lbank="0" prog="1"/>
+ <Patch name="CuttngNz" mode="4" hbank="4" lbank="0" prog="0"/>
+ <Patch name="CuttngNz2" mode="4" hbank="4" lbank="0" prog="1"/>
+ <Patch name="StrSlap" mode="4" hbank="4" lbank="0" prog="3"/>
+ <Patch name="Fl.KClik" mode="4" hbank="4" lbank="0" prog="16"/>
+ <Patch name="Rain" mode="4" hbank="4" lbank="0" prog="32"/>
+ <Patch name="Thunder" mode="4" hbank="4" lbank="0" prog="33"/>
+ <Patch name="Wind" mode="4" hbank="4" lbank="0" prog="34"/>
+ <Patch name="Stream" mode="4" hbank="4" lbank="0" prog="35"/>
+ <Patch name="Bubble" mode="4" hbank="4" lbank="0" prog="36"/>
+ <Patch name="Feed" mode="4" hbank="4" lbank="0" prog="37"/>
+ <Patch name="Dog" mode="4" hbank="4" lbank="0" prog="48"/>
+ <Patch name="Horse" mode="4" hbank="4" lbank="0" prog="49"/>
+ <Patch name="Bird2" mode="4" hbank="4" lbank="0" prog="50"/>
+ <Patch name="Ghost" mode="4" hbank="4" lbank="0" prog="54"/>
+ <Patch name="Maou" mode="4" hbank="4" lbank="0" prog="55"/>
+ <Patch name="Tel.Dial" mode="4" hbank="4" lbank="0" prog="64"/>
+ <Patch name="DoorSqek" mode="4" hbank="4" lbank="0" prog="65"/>
+ <Patch name="DoorSlam" mode="4" hbank="4" lbank="0" prog="66"/>
+ <Patch name="Scratch" mode="4" hbank="4" lbank="0" prog="67"/>
+ <Patch name="Scratch2" mode="4" hbank="4" lbank="0" prog="68"/>
+ <Patch name="WindChm" mode="4" hbank="4" lbank="0" prog="69"/>
+ <Patch name="Telphon2" mode="4" hbank="4" lbank="0" prog="70"/>
+ <Patch name="CarEngin" mode="4" hbank="4" lbank="0" prog="80"/>
+ <Patch name="CarStop" mode="4" hbank="4" lbank="0" prog="81"/>
+ <Patch name="CarPass" mode="4" hbank="4" lbank="0" prog="82"/>
+ <Patch name="CarCrash" mode="4" hbank="4" lbank="0" prog="83"/>
+ <Patch name="Siren" mode="4" hbank="4" lbank="0" prog="84"/>
+ <Patch name="Train" mode="4" hbank="4" lbank="0" prog="85"/>
+ <Patch name="Jetplane" mode="4" hbank="4" lbank="0" prog="86"/>
+ <Patch name="Starship" mode="4" hbank="4" lbank="0" prog="87"/>
+ <Patch name="Burst" mode="4" hbank="4" lbank="0" prog="88"/>
+ <Patch name="Coaster" mode="4" hbank="4" lbank="0" prog="89"/>
+ <Patch name="SbMarine" mode="4" hbank="4" lbank="0" prog="90"/>
+ <Patch name="Laughing" mode="4" hbank="4" lbank="0" prog="96"/>
+ <Patch name="Scream" mode="4" hbank="4" lbank="0" prog="97"/>
+ <Patch name="Punch" mode="4" hbank="4" lbank="0" prog="98"/>
+ <Patch name="Heart" mode="4" hbank="4" lbank="0" prog="99"/>
+ <Patch name="FootStep" mode="4" hbank="4" lbank="0" prog="100"/>
+ <Patch name="MchinGun" mode="4" hbank="4" lbank="0" prog="112"/>
+ <Patch name="LaserGun" mode="4" hbank="4" lbank="0" prog="113"/>
+ <Patch name="Xplosion" mode="4" hbank="4" lbank="0" prog="114"/>
+ <Patch name="FireWork" mode="4" hbank="4" lbank="0" prog="115"/>
+ <Patch name="DstCutNz" mode="4" hbank="4" lbank="0" prog="2"/>
+ <Patch name="B.Slide" mode="4" hbank="4" lbank="0" prog="4"/>
+ <Patch name="P.Scrape" mode="4" hbank="4" lbank="0" prog="5"/>
+ <Patch name="Kitty" mode="4" hbank="4" lbank="0" prog="51"/>
+ <Patch name="Growl" mode="4" hbank="4" lbank="0" prog="52"/>
+ <Patch name="Haunted" mode="4" hbank="4" lbank="0" prog="53"/>
+ <Patch name="Applaus2" mode="4" hbank="4" lbank="0" prog="101"/>
+ </PatchGroup>
+ </MidiInstrument>
+ </muse>
+
diff --git a/muse/share/instruments/xg.idf b/muse/share/instruments/xg.idf
new file mode 100644
index 00000000..2d3a895a
--- /dev/null
+++ b/muse/share/instruments/xg.idf
@@ -0,0 +1,623 @@
+<?xml version="1.0"?>
+<muse version="1.0">
+ <MidiInstrument name="XG">
+ <Init>
+ </Init>
+ <PatchGroup name="Piano">
+ <Patch name="Grand Piano" hbank="0" lbank="0" prog="0"/>
+ <Patch name="GrndPnoK" hbank="0" lbank="1" prog="0"/>
+ <Patch name="MelloGrP" hbank="0" lbank="18" prog="0"/>
+ <Patch name="PianoStr" hbank="0" lbank="40" prog="0"/>
+ <Patch name="Dream" hbank="0" lbank="41" prog="0"/>
+ <Patch name="Bright Piano" hbank="0" lbank="0" prog="1"/>
+ <Patch name="BritPnoK" hbank="0" lbank="1" prog="1"/>
+ <Patch name="E.Grand" hbank="0" lbank="0" prog="2"/>
+ <Patch name="ElGrPnoK" hbank="0" lbank="1" prog="2"/>
+ <Patch name="Det.CP80" hbank="0" lbank="32" prog="2"/>
+ <Patch name="ElGrPno1" hbank="0" lbank="40" prog="2"/>
+ <Patch name="ElGrPno2" hbank="0" lbank="41" prog="2"/>
+ <Patch name="Honky-tonk" hbank="0" lbank="0" prog="3"/>
+ <Patch name="HonkyTonkK" hbank="0" lbank="1" prog="3"/>
+ <Patch name="E.Piano" hbank="0" lbank="0" prog="4"/>
+ <Patch name="El.Pno1K" hbank="0" lbank="1" prog="4"/>
+ <Patch name="MelloEP1" hbank="0" lbank="18" prog="4"/>
+ <Patch name="Chor.EP1" hbank="0" lbank="32" prog="4"/>
+ <Patch name="HardEl.P" hbank="0" lbank="40" prog="4"/>
+ <Patch name="VXElP1" hbank="0" lbank="45" prog="4"/>
+ <Patch name="60sEl.P" hbank="0" lbank="64" prog="4"/>
+ <Patch name="E.Piano 2" hbank="0" lbank="0" prog="5"/>
+ <Patch name="El.Pno2K" hbank="0" lbank="1" prog="5"/>
+ <Patch name="Chor.EP2" hbank="0" lbank="32" prog="5"/>
+ <Patch name="DX.Hard" hbank="0" lbank="33" prog="5"/>
+ <Patch name="DXLegend" hbank="0" lbank="34" prog="5"/>
+ <Patch name="DXPhase" hbank="0" lbank="40" prog="5"/>
+ <Patch name="DX+Analg" hbank="0" lbank="41" prog="5"/>
+ <Patch name="DXKotoEP" hbank="0" lbank="42" prog="5"/>
+ <Patch name="VXEl.P2" hbank="0" lbank="45" prog="5"/>
+ <Patch name="Harpsichord" hbank="0" lbank="0" prog="6"/>
+ <Patch name="Harpsi.K" hbank="0" lbank="1" prog="6"/>
+ <Patch name="Harpsi.2" hbank="0" lbank="25" prog="6"/>
+ <Patch name="Harpsi.3" hbank="0" lbank="35" prog="6"/>
+ <Patch name="Clav." hbank="0" lbank="0" prog="7"/>
+ <Patch name="Clavi.K" hbank="0" lbank="1" prog="7"/>
+ <Patch name="ClaviWah" hbank="0" lbank="27" prog="7"/>
+ <Patch name="PulseClv" hbank="0" lbank="64" prog="7"/>
+ <Patch name="PierceCl" hbank="0" lbank="65" prog="7"/>
+ </PatchGroup>
+ <PatchGroup name="Chromatic Perc">
+ <Patch name="Celesta" hbank="0" lbank="0" prog="8"/>
+ <Patch name="Glockenspiel" hbank="0" lbank="0" prog="9"/>
+ <Patch name="Music Box" hbank="0" lbank="0" prog="10"/>
+ <Patch name="Orgel" hbank="0" lbank="64" prog="10"/>
+ <Patch name="Vibraphone" hbank="0" lbank="0" prog="11"/>
+ <Patch name="VibesK" hbank="0" lbank="1" prog="11"/>
+ <Patch name="HardVibe" hbank="0" lbank="45" prog="11"/>
+ <Patch name="Marimba" hbank="0" lbank="0" prog="12"/>
+ <Patch name="MarimbaK" hbank="0" lbank="1" prog="12"/>
+ <Patch name="SineMrmb" hbank="0" lbank="64" prog="12"/>
+ <Patch name="Balafon" hbank="0" lbank="96" prog="12"/>
+ <Patch name="Balafon2" hbank="0" lbank="97" prog="12"/>
+ <Patch name="LogDrum" hbank="0" lbank="98" prog="12"/>
+ <Patch name="Xylophone" hbank="0" lbank="0" prog="13"/>
+ <Patch name="Tubular Bells" hbank="0" lbank="0" prog="14"/>
+ <Patch name="ChrchBel" hbank="0" lbank="96" prog="14"/>
+ <Patch name="Carillon" hbank="0" lbank="97" prog="14"/>
+ <Patch name="Dulcimer" hbank="0" lbank="0" prog="15"/>
+ <Patch name="Dulcimr2" hbank="0" lbank="35" prog="15"/>
+ <Patch name="Cimbalom" hbank="0" lbank="96" prog="15"/>
+ <Patch name="Santur" hbank="0" lbank="97" prog="15"/>
+ </PatchGroup>
+ <PatchGroup name="Organ">
+ <Patch name="Drawbar Organ" hbank="0" lbank="0" prog="16"/>
+ <Patch name="DelDrwOr" hbank="0" lbank="32" prog="16"/>
+ <Patch name="60sDrOr1" hbank="0" lbank="33" prog="16"/>
+ <Patch name="60sDrOr2" hbank="0" lbank="34" prog="16"/>
+ <Patch name="70sDrOr1" hbank="0" lbank="35" prog="16"/>
+ <Patch name="DrawOrg2" hbank="0" lbank="36" prog="16"/>
+ <Patch name="60sDrOr3" hbank="0" lbank="37" prog="16"/>
+ <Patch name="EvenBar" hbank="0" lbank="38" prog="16"/>
+ <Patch name="16+2&quot;2/3" hbank="0" lbank="40" prog="16"/>
+ <Patch name="OrganBa" hbank="0" lbank="64" prog="16"/>
+ <Patch name="70sDrOr2" hbank="0" lbank="65" prog="16"/>
+ <Patch name="CheezOrg" hbank="0" lbank="66" prog="16"/>
+ <Patch name="DrawOrg3" hbank="0" lbank="67" prog="16"/>
+ <Patch name="Perc. Organ" hbank="0" lbank="0" prog="17"/>
+ <Patch name="70sPcOr1" hbank="0" lbank="24" prog="17"/>
+ <Patch name="DetPrcOr" hbank="0" lbank="32" prog="17"/>
+ <Patch name="LiteOrg" hbank="0" lbank="33" prog="17"/>
+ <Patch name="PercOrg2" hbank="0" lbank="37" prog="17"/>
+ <Patch name="Rock Organ" hbank="0" lbank="0" prog="18"/>
+ <Patch name="RotaryOr" hbank="0" lbank="64" prog="18"/>
+ <Patch name="SloRotar" hbank="0" lbank="65" prog="18"/>
+ <Patch name="FstRotar" hbank="0" lbank="66" prog="18"/>
+ <Patch name="Church Organ" hbank="0" lbank="0" prog="19"/>
+ <Patch name="ChurOrg3" hbank="0" lbank="32" prog="19"/>
+ <Patch name="ChurOrg2" hbank="0" lbank="35" prog="19"/>
+ <Patch name="NotreDam" hbank="0" lbank="40" prog="19"/>
+ <Patch name="OrgFlute" hbank="0" lbank="64" prog="19"/>
+ <Patch name="TrmOrgFl" hbank="0" lbank="65" prog="19"/>
+ <Patch name="Reed Organ" hbank="0" lbank="0" prog="20"/>
+ <Patch name="PuffOrg" hbank="0" lbank="40" prog="20"/>
+ <Patch name="Akkordion" hbank="0" lbank="0" prog="21"/>
+ <Patch name="Accordlt" hbank="0" lbank="32" prog="21"/>
+ <Patch name="Harmonica" hbank="0" lbank="0" prog="22"/>
+ <Patch name="Harmo2" hbank="0" lbank="32" prog="22"/>
+ <Patch name="Bandoneon" hbank="0" lbank="0" prog="23"/>
+ <Patch name="TngoAcd2" hbank="0" lbank="64" prog="23"/>
+ </PatchGroup>
+ <PatchGroup name="Guitar">
+ <Patch name="Nylon Gtr." hbank="0" lbank="0" prog="24"/>
+ <Patch name="NylonGt2" hbank="0" lbank="16" prog="24"/>
+ <Patch name="NylonGt3" hbank="0" lbank="25" prog="24"/>
+ <Patch name="VelGtHrm" hbank="0" lbank="43" prog="24"/>
+ <Patch name="Ukelele" hbank="0" lbank="96" prog="24"/>
+ <Patch name="Steel Gtr." hbank="0" lbank="0" prog="25"/>
+ <Patch name="SteelGt2" hbank="0" lbank="16" prog="25"/>
+ <Patch name="12StrGtr" hbank="0" lbank="35" prog="25"/>
+ <Patch name="Nylon-Stl" hbank="0" lbank="40" prog="25"/>
+ <Patch name="Stl-Body" hbank="0" lbank="41" prog="25"/>
+ <Patch name="Mandolin" hbank="0" lbank="96" prog="25"/>
+ <Patch name="Jazz Guitar" hbank="0" lbank="0" prog="26"/>
+ <Patch name="MelloGtr" hbank="0" lbank="18" prog="26"/>
+ <Patch name="JazzAmp" hbank="0" lbank="32" prog="26"/>
+ <Patch name="PdlSteel" hbank="0" lbank="96" prog="26"/>
+ <Patch name="Clean Guitar" hbank="0" lbank="0" prog="27"/>
+ <Patch name="ChorusGt" hbank="0" lbank="32" prog="27"/>
+ <Patch name="CleanGt2" hbank="0" lbank="64" prog="27"/>
+ <Patch name="Muted Guitar" hbank="0" lbank="0" prog="28"/>
+ <Patch name="FunkGtr1" hbank="0" lbank="40" prog="28"/>
+ <Patch name="MuteStlG" hbank="0" lbank="41" prog="28"/>
+ <Patch name="FunkGtr2" hbank="0" lbank="43" prog="28"/>
+ <Patch name="JazzMan" hbank="0" lbank="45" prog="28"/>
+ <Patch name="Mu.DstGt" hbank="0" lbank="96" prog="28"/>
+ <Patch name="Overdrive Gtr" hbank="0" lbank="0" prog="29"/>
+ <Patch name="Gt.Pinch" hbank="0" lbank="43" prog="29"/>
+ <Patch name="Distortion Gtr" hbank="0" lbank="0" prog="30"/>
+ <Patch name="DstRthmG" hbank="0" lbank="12" prog="30"/>
+ <Patch name="DistGtr2" hbank="0" lbank="24" prog="30"/>
+ <Patch name="DistGtr3" hbank="0" lbank="35" prog="30"/>
+ <Patch name="PowerGt2" hbank="0" lbank="36" prog="30"/>
+ <Patch name="PowerGt1" hbank="0" lbank="37" prog="30"/>
+ <Patch name="Dst.5ths" hbank="0" lbank="38" prog="30"/>
+ <Patch name="FeedbkGt" hbank="0" lbank="40" prog="30"/>
+ <Patch name="FeedbGt2" hbank="0" lbank="41" prog="30"/>
+ <Patch name="RkRythm2" hbank="0" lbank="43" prog="30"/>
+ <Patch name="RockRthm" hbank="0" lbank="45" prog="30"/>
+ <Patch name="Gtr. Harmonics" hbank="0" lbank="0" prog="31"/>
+ <Patch name="GtFeedbk" hbank="0" lbank="65" prog="31"/>
+ <Patch name="GtrHrmo2" hbank="0" lbank="66" prog="31"/>
+ <Patch name="AcoHarmo" hbank="0" lbank="64" prog="31"/>
+ </PatchGroup>
+ <PatchGroup name="Bass">
+ <Patch name="Acoustic Bass" hbank="0" lbank="0" prog="32"/>
+ <Patch name="JazzRthm" hbank="0" lbank="40" prog="32"/>
+ <Patch name="VXUprght" hbank="0" lbank="45" prog="32"/>
+ <Patch name="Fingered Bass" hbank="0" lbank="0" prog="33"/>
+ <Patch name="FingrDrk" hbank="0" lbank="18" prog="33"/>
+ <Patch name="FlangeBa" hbank="0" lbank="27" prog="33"/>
+ <Patch name="Ba-DstEG" hbank="0" lbank="40" prog="33"/>
+ <Patch name="FngrSlap" hbank="0" lbank="43" prog="33"/>
+ <Patch name="FngBass2" hbank="0" lbank="45" prog="33"/>
+ <Patch name="JazzBass" hbank="0" lbank="64" prog="33"/>
+ <Patch name="ModAlem" hbank="0" lbank="65" prog="33"/>
+ <Patch name="Picked Bass" hbank="0" lbank="0" prog="34"/>
+ <Patch name="MutePkBa" hbank="0" lbank="28" prog="34"/>
+ <Patch name="Fretless Bass" hbank="0" lbank="0" prog="35"/>
+ <Patch name="Fretles2" hbank="0" lbank="32" prog="35"/>
+ <Patch name="Fretles3" hbank="0" lbank="33" prog="35"/>
+ <Patch name="Fretles4" hbank="0" lbank="34" prog="35"/>
+ <Patch name="SynFretl" hbank="0" lbank="96" prog="35"/>
+ <Patch name="Smooth" hbank="0" lbank="97" prog="35"/>
+ <Patch name="Slap Bass 1" hbank="0" lbank="0" prog="36"/>
+ <Patch name="ResoSlap" hbank="0" lbank="27" prog="36"/>
+ <Patch name="PunchThm" hbank="0" lbank="32" prog="36"/>
+ <Patch name="Slap Bass 2" hbank="0" lbank="0" prog="37"/>
+ <Patch name="VeloSlap" hbank="0" lbank="43" prog="37"/>
+ <Patch name="Synth Bass 1" hbank="0" lbank="0" prog="38"/>
+ <Patch name="SynBa1Dk" hbank="0" lbank="18" prog="38"/>
+ <Patch name="FastResB" hbank="0" lbank="20" prog="38"/>
+ <Patch name="AcidBass" hbank="0" lbank="24" prog="38"/>
+ <Patch name="ClvBass" hbank="0" lbank="35" prog="38"/>
+ <Patch name="TeknoBa" hbank="0" lbank="40" prog="38"/>
+ <Patch name="Oscar" hbank="0" lbank="64" prog="38"/>
+ <Patch name="SqrBass" hbank="0" lbank="65" prog="38"/>
+ <Patch name="RubberBa" hbank="0" lbank="66" prog="38"/>
+ <Patch name="Hammer" hbank="0" lbank="96" prog="38"/>
+ <Patch name="Synth Bass 2" hbank="0" lbank="0" prog="39"/>
+ <Patch name="MelloSB1" hbank="0" lbank="6" prog="39"/>
+ <Patch name="SeqBass" hbank="0" lbank="12" prog="39"/>
+ <Patch name="ClkSynBa" hbank="0" lbank="18" prog="39"/>
+ <Patch name="SynBa2Dk" hbank="0" lbank="19" prog="39"/>
+ <Patch name="SmthBa2" hbank="0" lbank="32" prog="39"/>
+ <Patch name="ModulrBa" hbank="0" lbank="40" prog="39"/>
+ <Patch name="DXBass" hbank="0" lbank="41" prog="39"/>
+ <Patch name="XWireBa" hbank="0" lbank="64" prog="39"/>
+ </PatchGroup>
+ <PatchGroup name="Strings/Orch">
+ <Patch name="Violin" hbank="0" lbank="0" prog="40"/>
+ <Patch name="SlowVln" hbank="0" lbank="8" prog="40"/>
+ <Patch name="Viola" hbank="0" lbank="0" prog="41"/>
+ <Patch name="Cello" hbank="0" lbank="0" prog="42"/>
+ <Patch name="Contrabass" hbank="0" lbank="0" prog="43"/>
+ <Patch name="Tremolo Str." hbank="0" lbank="0" prog="44"/>
+ <Patch name="SlowTrSt" hbank="0" lbank="8" prog="44"/>
+ <Patch name="SuspStr" hbank="0" lbank="40" prog="44"/>
+ <Patch name="Pizzicato Str." hbank="0" lbank="0" prog="45"/>
+ <Patch name="Harp" hbank="0" lbank="0" prog="46"/>
+ <Patch name="YangChin" hbank="0" lbank="40" prog="46"/>
+ <Patch name="Timpani" hbank="0" lbank="0" prog="47"/>
+ </PatchGroup>
+ <PatchGroup name="Ensemble">
+ <Patch name="Strings 1" hbank="0" lbank="0" prog="48"/>
+ <Patch name="S.Strngs" hbank="0" lbank="3" prog="48"/>
+ <Patch name="SlowStr" hbank="0" lbank="8" prog="48"/>
+ <Patch name="ArcoStr" hbank="0" lbank="24" prog="48"/>
+ <Patch name="60sStrng" hbank="0" lbank="35" prog="48"/>
+ <Patch name="Orchestr" hbank="0" lbank="40" prog="48"/>
+ <Patch name="Orchstr2" hbank="0" lbank="41" prog="48"/>
+ <Patch name="TremOrch" hbank="0" lbank="42" prog="48"/>
+ <Patch name="VeloStr" hbank="0" lbank="45" prog="48"/>
+ <Patch name="Strings 2" hbank="0" lbank="0" prog="49"/>
+ <Patch name="S.SlwStr" hbank="0" lbank="3" prog="49"/>
+ <Patch name="LegatoSt" hbank="0" lbank="8" prog="49"/>
+ <Patch name="WarmStr" hbank="0" lbank="40" prog="49"/>
+ <Patch name="Kingdom" hbank="0" lbank="41" prog="49"/>
+ <Patch name="70sStr" hbank="0" lbank="64" prog="49"/>
+ <Patch name="StrEns3" hbank="0" lbank="65" prog="49"/>
+ <Patch name="Syn. Strings 1" hbank="0" lbank="0" prog="50"/>
+ <Patch name="ResoStr" hbank="0" lbank="27" prog="50"/>
+ <Patch name="SynStr4" hbank="0" lbank="64" prog="50"/>
+ <Patch name="SSStr" hbank="0" lbank="65" prog="50"/>
+ <Patch name="SynStr3" hbank="0" lbank="35" prog="50"/>
+ <Patch name="Syn. Strings 2" hbank="0" lbank="0" prog="51"/>
+ <Patch name="Choir Aahs" hbank="0" lbank="0" prog="52"/>
+ <Patch name="S.Choir" hbank="0" lbank="3" prog="52"/>
+ <Patch name="Ch.Aahs2" hbank="0" lbank="16" prog="52"/>
+ <Patch name="MelChoir" hbank="0" lbank="32" prog="52"/>
+ <Patch name="ChoirStr" hbank="0" lbank="40" prog="52"/>
+ <Patch name="StrngAah" hbank="0" lbank="64" prog="52"/>
+ <Patch name="MaleAah" hbank="0" lbank="65" prog="52"/>
+ <Patch name="Voice Oohs" hbank="0" lbank="0" prog="53"/>
+ <Patch name="VoiceDoo" hbank="0" lbank="64" prog="53"/>
+ <Patch name="VoiceHmn" hbank="0" lbank="96" prog="53"/>
+ <Patch name="Synth Voice" hbank="0" lbank="0" prog="54"/>
+ <Patch name="SynVox2" hbank="0" lbank="40" prog="54"/>
+ <Patch name="Choral" hbank="0" lbank="41" prog="54"/>
+ <Patch name="AnaVoice" hbank="0" lbank="64" prog="54"/>
+ <Patch name="Orchestra Hit" hbank="0" lbank="0" prog="55"/>
+ <Patch name="OrchHit2" hbank="0" lbank="35" prog="55"/>
+ <Patch name="Impact" hbank="0" lbank="64" prog="55"/>
+ <Patch name="DoublHit" hbank="0" lbank="66" prog="55"/>
+ <Patch name="BrStab80" hbank="0" lbank="67" prog="55"/>
+ </PatchGroup>
+ <PatchGroup name="Brass">
+ <Patch name="Trumpet" hbank="0" lbank="0" prog="56"/>
+ <Patch name="Trumpet2" hbank="0" lbank="16" prog="56"/>
+ <Patch name="BriteTrp" hbank="0" lbank="17" prog="56"/>
+ <Patch name="WarmTrp" hbank="0" lbank="32" prog="56"/>
+ <Patch name="FluglHrn" hbank="0" lbank="96" prog="56"/>
+ <Patch name="Trombone" hbank="0" lbank="0" prog="57"/>
+ <Patch name="Trmbone2" hbank="0" lbank="18" prog="57"/>
+ <Patch name="Tuba" hbank="0" lbank="0" prog="58"/>
+ <Patch name="Tuba2" hbank="0" lbank="16" prog="58"/>
+ <Patch name="Muted Trumpet" hbank="0" lbank="0" prog="59"/>
+ <Patch name="MuteTrp2" hbank="2" lbank="64" prog="59"/>
+ <Patch name="French Horn" hbank="0" lbank="0" prog="60"/>
+ <Patch name="FrHrSolo" hbank="0" lbank="6" prog="60"/>
+ <Patch name="FrHorn2" hbank="0" lbank="32" prog="60"/>
+ <Patch name="HornOrch" hbank="0" lbank="37" prog="60"/>
+ <Patch name="Brass Section" hbank="0" lbank="0" prog="61"/>
+ <Patch name="Tp-TbSec" hbank="0" lbank="35" prog="61"/>
+ <Patch name="BrssSec2" hbank="0" lbank="40" prog="61"/>
+ <Patch name="HiBrass" hbank="0" lbank="41" prog="61"/>
+ <Patch name="MelloBrs" hbank="0" lbank="42" prog="61"/>
+ <Patch name="SfrzndBr" hbank="0" lbank="14" prog="61"/>
+ <Patch name="BrssFall" hbank="0" lbank="39" prog="61"/>
+ <Patch name="Synth Brass 1" hbank="0" lbank="0" prog="62"/>
+ <Patch name="QuackBr" hbank="0" lbank="12" prog="62"/>
+ <Patch name="RezSynBr" hbank="0" lbank="20" prog="62"/>
+ <Patch name="PolyBrss" hbank="0" lbank="24" prog="62"/>
+ <Patch name="SynBras3" hbank="0" lbank="27" prog="62"/>
+ <Patch name="JumpBrss" hbank="0" lbank="32" prog="62"/>
+ <Patch name="AnaVelBr" hbank="0" lbank="45" prog="62"/>
+ <Patch name="AnaBrss1" hbank="0" lbank="64" prog="62"/>
+ <Patch name="Synth Brass 2" hbank="0" lbank="0" prog="63"/>
+ <Patch name="SoftBrs" hbank="0" lbank="18" prog="63"/>
+ <Patch name="SynBras4" hbank="0" lbank="40" prog="63"/>
+ <Patch name="ChoBrss" hbank="0" lbank="41" prog="63"/>
+ <Patch name="VelBras2" hbank="0" lbank="45" prog="63"/>
+ <Patch name="AnaBras2" hbank="0" lbank="64" prog="63"/>
+ </PatchGroup>
+ <PatchGroup name="Reed">
+ <Patch name="Soprano Sax" hbank="0" lbank="0" prog="64"/>
+ <Patch name="Alto Sax" hbank="0" lbank="0" prog="65"/>
+ <Patch name="SaxSect" hbank="0" lbank="40" prog="65"/>
+ <Patch name="HyprAlto" hbank="0" lbank="43" prog="65"/>
+ <Patch name="Tenor Sax" hbank="0" lbank="0" prog="66"/>
+ <Patch name="BrthTnSx" hbank="0" lbank="40" prog="66"/>
+ <Patch name="SoftTenr" hbank="0" lbank="41" prog="66"/>
+ <Patch name="TnrSax2" hbank="0" lbank="64" prog="66"/>
+ <Patch name="Baritone Sax" hbank="0" lbank="0" prog="67"/>
+ <Patch name="Oboe" hbank="0" lbank="0" prog="68"/>
+ <Patch name="English Horn" hbank="0" lbank="0" prog="69"/>
+ <Patch name="Bassoon" hbank="0" lbank="0" prog="70"/>
+ <Patch name="Clarinet" hbank="0" lbank="0" prog="71"/>
+ <Patch name="BassClar" hbank="0" lbank="96" prog="71"/>
+ </PatchGroup>
+ <PatchGroup name="Pipe">
+ <Patch name="Piccolo" hbank="0" lbank="0" prog="72"/>
+ <Patch name="Flute" hbank="0" lbank="0" prog="73"/>
+ <Patch name="Recorder" hbank="0" lbank="0" prog="74"/>
+ <Patch name="Pan Flute" hbank="0" lbank="0" prog="75"/>
+ <Patch name="PanFlut2" hbank="0" lbank="64" prog="75"/>
+ <Patch name="Kawala" hbank="0" lbank="96" prog="75"/>
+ <Patch name="Blown Bottle" hbank="0" lbank="0" prog="76"/>
+ <Patch name="Shakuhachi" hbank="0" lbank="0" prog="77"/>
+ <Patch name="Whistle" hbank="0" lbank="0" prog="78"/>
+ <Patch name="Ocarina" hbank="0" lbank="0" prog="79"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Lead">
+ <Patch name="Square Wave" hbank="0" lbank="0" prog="80"/>
+ <Patch name="Square2" hbank="0" lbank="6" prog="80"/>
+ <Patch name="LMSquare" hbank="0" lbank="8" prog="80"/>
+ <Patch name="Hollow" hbank="0" lbank="18" prog="80"/>
+ <Patch name="Shmoog" hbank="0" lbank="19" prog="80"/>
+ <Patch name="Mellow" hbank="0" lbank="64" prog="80"/>
+ <Patch name="SoloSine" hbank="0" lbank="65" prog="80"/>
+ <Patch name="SineLead" hbank="0" lbank="66" prog="80"/>
+ <Patch name="Saw Wave" hbank="0" lbank="0" prog="81"/>
+ <Patch name="Saw2" hbank="0" lbank="6" prog="81"/>
+ <Patch name="ThickSaw" hbank="0" lbank="8" prog="81"/>
+ <Patch name="DynaSaw" hbank="0" lbank="18" prog="81"/>
+ <Patch name="DigiSaw" hbank="0" lbank="19" prog="81"/>
+ <Patch name="BigLead" hbank="0" lbank="20" prog="81"/>
+ <Patch name="HeavySyn" hbank="0" lbank="24" prog="81"/>
+ <Patch name="WaspySyn" hbank="0" lbank="25" prog="81"/>
+ <Patch name="PulseSaw" hbank="0" lbank="40" prog="81"/>
+ <Patch name="Dr.Lead" hbank="0" lbank="41" prog="81"/>
+ <Patch name="VeloLead" hbank="0" lbank="45" prog="81"/>
+ <Patch name="SeqAna" hbank="0" lbank="96" prog="81"/>
+ <Patch name="Calliope" hbank="0" lbank="0" prog="82"/>
+ <Patch name="PurePad" hbank="0" lbank="65" prog="82"/>
+ <Patch name="VentSyn" hbank="0" lbank="64" prog="82"/>
+ <Patch name="Chiffer Lead" hbank="0" lbank="0" prog="83"/>
+ <Patch name="Rubby" hbank="0" lbank="64" prog="83"/>
+ <Patch name="Charang" hbank="0" lbank="0" prog="84"/>
+ <Patch name="DistLead" hbank="0" lbank="64" prog="84"/>
+ <Patch name="WireLead" hbank="0" lbank="65" prog="84"/>
+ <Patch name="Solo Vox" hbank="0" lbank="0" prog="85"/>
+ <Patch name="SynthAah" hbank="0" lbank="24" prog="85"/>
+ <Patch name="VoxLead" hbank="0" lbank="64" prog="85"/>
+ <Patch name="Fifth Saw" hbank="0" lbank="0" prog="86"/>
+ <Patch name="BigFive" hbank="0" lbank="35" prog="86"/>
+ <Patch name="Bass Lead" hbank="0" lbank="0" prog="87"/>
+ <Patch name="Big-Low" hbank="0" lbank="16" prog="87"/>
+ <Patch name="Fat-Prky" hbank="0" lbank="64" prog="87"/>
+ <Patch name="SoftWurl" hbank="0" lbank="65" prog="87"/>
+ </PatchGroup>
+ <PatchGroup name="Synth Pad">
+ <Patch name="New Age Pad" hbank="0" lbank="0" prog="88"/>
+ <Patch name="Fantasy2" hbank="0" lbank="64" prog="88"/>
+ <Patch name="Warm Pad" hbank="0" lbank="0" prog="89"/>
+ <Patch name="ThickPad" hbank="0" lbank="16" prog="89"/>
+ <Patch name="SoftPad" hbank="0" lbank="17" prog="89"/>
+ <Patch name="SinePad" hbank="0" lbank="18" prog="89"/>
+ <Patch name="HornPad" hbank="0" lbank="64" prog="89"/>
+ <Patch name="RotarStr" hbank="0" lbank="65" prog="89"/>
+ <Patch name="Polysynth Pad" hbank="0" lbank="0" prog="90"/>
+ <Patch name="PolyPd80" hbank="0" lbank="64" prog="90"/>
+ <Patch name="ClickPad" hbank="0" lbank="65" prog="90"/>
+ <Patch name="AnaPad" hbank="0" lbank="66" prog="90"/>
+ <Patch name="SquarPad" hbank="0" lbank="67" prog="90"/>
+ <Patch name="Choir Pad" hbank="0" lbank="0" prog="91"/>
+ <Patch name="Heaven2" hbank="0" lbank="64" prog="91"/>
+ <Patch name="Itopia" hbank="0" lbank="66" prog="91"/>
+ <Patch name="CCPad" hbank="0" lbank="67" prog="91"/>
+ <Patch name="LitePad" hbank="0" lbank="65" prog="91"/>
+ <Patch name="Bowed Pad" hbank="0" lbank="0" prog="92"/>
+ <Patch name="Glacier" hbank="0" lbank="64" prog="92"/>
+ <Patch name="GlassPad" hbank="0" lbank="65" prog="92"/>
+ <Patch name="Metallic Pad" hbank="0" lbank="0" prog="93"/>
+ <Patch name="TinePad" hbank="0" lbank="64" prog="93"/>
+ <Patch name="PanPad" hbank="0" lbank="65" prog="93"/>
+ <Patch name="Halo Pad" hbank="0" lbank="0" prog="94"/>
+ <Patch name="Sweep Pad" hbank="0" lbank="0" prog="95"/>
+ <Patch name="Shwimmer" hbank="0" lbank="20" prog="95"/>
+ <Patch name="Converge" hbank="0" lbank="27" prog="95"/>
+ <Patch name="PolarPad" hbank="0" lbank="64" prog="95"/>
+ <Patch name="Celstial" hbank="0" lbank="66" prog="95"/>
+ <Patch name="Sweepy" hbank="0" lbank="65" prog="95"/>
+ </PatchGroup>
+ <PatchGroup name="Synth FX">
+ <Patch name="Rain" hbank="0" lbank="0" prog="96"/>
+ <Patch name="ClaviPad" hbank="0" lbank="45" prog="96"/>
+ <Patch name="HrmoRain" hbank="0" lbank="64" prog="96"/>
+ <Patch name="AfrcnWnd" hbank="0" lbank="65" prog="96"/>
+ <Patch name="Caribean" hbank="0" lbank="66" prog="96"/>
+ <Patch name="Soundtrack" hbank="0" lbank="0" prog="97"/>
+ <Patch name="Prologue" hbank="0" lbank="27" prog="97"/>
+ <Patch name="Ancestrl" hbank="0" lbank="64" prog="97"/>
+ <Patch name="Rave" hbank="0" lbank="65" prog="97"/>
+ <Patch name="Crystal" hbank="0" lbank="0" prog="98"/>
+ <Patch name="SynDrCmp" hbank="0" lbank="12" prog="98"/>
+ <Patch name="Popcorn" hbank="0" lbank="14" prog="98"/>
+ <Patch name="TinyBell" hbank="0" lbank="18" prog="98"/>
+ <Patch name="RndGlock" hbank="0" lbank="35" prog="98"/>
+ <Patch name="GlockChi" hbank="0" lbank="40" prog="98"/>
+ <Patch name="ClearBel" hbank="0" lbank="41" prog="98"/>
+ <Patch name="ChorBell" hbank="0" lbank="42" prog="98"/>
+ <Patch name="SynMalet" hbank="0" lbank="64" prog="98"/>
+ <Patch name="SftCryst" hbank="0" lbank="65" prog="98"/>
+ <Patch name="LoudGlok" hbank="0" lbank="66" prog="98"/>
+ <Patch name="XmasBell" hbank="0" lbank="67" prog="98"/>
+ <Patch name="VibeBell" hbank="0" lbank="68" prog="98"/>
+ <Patch name="DigiBell" hbank="0" lbank="69" prog="98"/>
+ <Patch name="AirBells" hbank="0" lbank="70" prog="98"/>
+ <Patch name="BellHarp" hbank="0" lbank="71" prog="98"/>
+ <Patch name="Gamelmba" hbank="0" lbank="72" prog="98"/>
+ <Patch name="Athmosphere" hbank="0" lbank="0" prog="99"/>
+ <Patch name="WarmAtms" hbank="0" lbank="18" prog="99"/>
+ <Patch name="HollwRls" hbank="0" lbank="19" prog="99"/>
+ <Patch name="NylonEP" hbank="0" lbank="40" prog="99"/>
+ <Patch name="NylnHarp" hbank="0" lbank="64" prog="99"/>
+ <Patch name="HarpVox" hbank="0" lbank="65" prog="99"/>
+ <Patch name="Brightness" hbank="0" lbank="0" prog="100"/>
+ <Patch name="Goblins" hbank="0" lbank="0" prog="101"/>
+ <Patch name="MilkyWay" hbank="0" lbank="69" prog="101"/>
+ <Patch name="Puffy" hbank="0" lbank="72" prog="101"/>
+ <Patch name="Echoes" hbank="0" lbank="0" prog="102"/>
+ <Patch name="Sci-Fi" hbank="0" lbank="0" prog="103"/>
+ <Patch name="Odyssey" hbank="0" lbank="65" prog="103"/>
+ </PatchGroup>
+ <PatchGroup name="Ethnic">
+ <Patch name="Sitar" hbank="0" lbank="0" prog="104"/>
+ <Patch name="DetSitar" hbank="0" lbank="32" prog="104"/>
+ <Patch name="Sitar2" hbank="0" lbank="35" prog="104"/>
+ <Patch name="Tambra" hbank="0" lbank="96" prog="104"/>
+ <Patch name="Tamboura" hbank="0" lbank="97" prog="104"/>
+ <Patch name="Banjo" hbank="0" lbank="0" prog="105"/>
+ <Patch name="MuteBnjo" hbank="0" lbank="28" prog="105"/>
+ <Patch name="Rabab" hbank="0" lbank="96" prog="105"/>
+ <Patch name="Gopichnt" hbank="0" lbank="97" prog="105"/>
+ <Patch name="Oud" hbank="0" lbank="98" prog="105"/>
+ <Patch name="Shamisen" hbank="0" lbank="0" prog="106"/>
+ <Patch name="Tsugaru" hbank="0" lbank="96" prog="106"/>
+ <Patch name="Koto" hbank="0" lbank="0" prog="107"/>
+ <Patch name="T.Koto" hbank="0" lbank="96" prog="107"/>
+ <Patch name="Kanoon" hbank="0" lbank="97" prog="107"/>
+ <Patch name="Kalimba" hbank="0" lbank="0" prog="108"/>
+ <Patch name="BigKalim" hbank="0" lbank="64" prog="108"/>
+ <Patch name="Bagpipe" hbank="0" lbank="0" prog="109"/>
+ <Patch name="Fiddle" hbank="0" lbank="0" prog="110"/>
+ <Patch name="Shanai" hbank="0" lbank="0" prog="111"/>
+ <Patch name="Shanai2" hbank="0" lbank="64" prog="111"/>
+ <Patch name="Pungi" hbank="0" lbank="96" prog="111"/>
+ <Patch name="Hichriki" hbank="0" lbank="97" prog="111"/>
+ </PatchGroup>
+ <PatchGroup name="Percussive">
+ <Patch name="Tinkle Bell" hbank="0" lbank="0" prog="112"/>
+ <Patch name="Bonang" hbank="0" lbank="96" prog="112"/>
+ <Patch name="Gender" hbank="0" lbank="97" prog="112"/>
+ <Patch name="Gamelan" hbank="0" lbank="98" prog="112"/>
+ <Patch name="S.Gamlan" hbank="0" lbank="99" prog="112"/>
+ <Patch name="RamaCym" hbank="0" lbank="100" prog="112"/>
+ <Patch name="AsianBel" hbank="0" lbank="101" prog="112"/>
+ <Patch name="Agogo" hbank="0" lbank="0" prog="113"/>
+ <Patch name="Atrigane" hbank="0" lbank="96" prog="113"/>
+ <Patch name="Steel Drums" hbank="0" lbank="0" prog="114"/>
+ <Patch name="GlasPerc" hbank="0" lbank="97" prog="114"/>
+ <Patch name="ThaiBell" hbank="0" lbank="98" prog="114"/>
+ <Patch name="Tablas" hbank="0" lbank="96" prog="114"/>
+ <Patch name="Woodblock" hbank="0" lbank="0" prog="115"/>
+ <Patch name="Castanet" hbank="0" lbank="96" prog="115"/>
+ <Patch name="Taiko Drum" hbank="0" lbank="0" prog="116"/>
+ <Patch name="Gr.Cassa" hbank="0" lbank="96" prog="116"/>
+ <Patch name="Melodic Drum" hbank="0" lbank="0" prog="117"/>
+ <Patch name="MelTom2" hbank="0" lbank="64" prog="117"/>
+ <Patch name="RealTom" hbank="0" lbank="65" prog="117"/>
+ <Patch name="RockTom" hbank="0" lbank="66" prog="117"/>
+ <Patch name="Synth Drum" hbank="0" lbank="0" prog="118"/>
+ <Patch name="AnaTom" hbank="0" lbank="64" prog="118"/>
+ <Patch name="ElecPerc" hbank="0" lbank="65" prog="118"/>
+ <Patch name="Rev. Cymbal" hbank="0" lbank="0" prog="119"/>
+ <Patch name="RevCym2" hbank="0" lbank="64" prog="119"/>
+ <Patch name="RevSnar1" hbank="0" lbank="96" prog="119"/>
+ <Patch name="RevSnar2" hbank="0" lbank="97" prog="119"/>
+ <Patch name="RevKick1" hbank="0" lbank="98" prog="119"/>
+ <Patch name="RevConBD" hbank="0" lbank="99" prog="119"/>
+ <Patch name="RevTom1" hbank="0" lbank="100" prog="119"/>
+ <Patch name="RevTom2" hbank="0" lbank="101" prog="119"/>
+ </PatchGroup>
+ <PatchGroup name="Special FX">
+ <Patch name="Gtr Fret Noise" hbank="0" lbank="0" prog="120"/>
+ <Patch name="Breath Noise" hbank="0" lbank="0" prog="121"/>
+ <Patch name="Seashore" hbank="0" lbank="0" prog="122"/>
+ <Patch name="Bird Tweed" hbank="0" lbank="0" prog="123"/>
+ <Patch name="Telephone" hbank="0" lbank="0" prog="124"/>
+ <Patch name="Helicopter" hbank="0" lbank="0" prog="125"/>
+ <Patch name="Applaus" hbank="0" lbank="0" prog="126"/>
+ <Patch name="Gunshot" hbank="0" lbank="0" prog="127"/>
+ </PatchGroup>
+ <PatchGroup name="Drums">
+ <Patch name="Standard" hbank="17" lbank="0" prog="0"/>
+ <Patch name="Standrd2" hbank="17" lbank="0" prog="1"/>
+ <Patch name="Room" hbank="17" lbank="0" prog="8"/>
+ <Patch name="Rock" hbank="17" lbank="0" prog="16"/>
+ <Patch name="Electro" hbank="17" lbank="0" prog="24"/>
+ <Patch name="Analog" hbank="17" lbank="0" prog="25"/>
+ <Patch name="Jazz" hbank="17" lbank="0" prog="32"/>
+ <Patch name="Brush" hbank="17" lbank="0" prog="40"/>
+ <Patch name="Classic" hbank="17" lbank="0" prog="48"/>
+ <Patch name="SFX1" hbank="16" lbank="0" prog="0"/>
+ <Patch name="SFX2" hbank="16" lbank="0" prog="1"/>
+ <Patch name="CuttngNz" hbank="4" lbank="0" prog="0"/>
+ <Patch name="CuttngNz2" hbank="4" lbank="0" prog="1"/>
+ <Patch name="StrSlap" hbank="4" lbank="0" prog="3"/>
+ <Patch name="Fl.KClik" hbank="4" lbank="0" prog="16"/>
+ <Patch name="Rain" hbank="4" lbank="0" prog="32"/>
+ <Patch name="Thunder" hbank="4" lbank="0" prog="33"/>
+ <Patch name="Wind" hbank="4" lbank="0" prog="34"/>
+ <Patch name="Stream" hbank="4" lbank="0" prog="35"/>
+ <Patch name="Bubble" hbank="4" lbank="0" prog="36"/>
+ <Patch name="Feed" hbank="4" lbank="0" prog="37"/>
+ <Patch name="Dog" hbank="4" lbank="0" prog="48"/>
+ <Patch name="Horse" hbank="4" lbank="0" prog="49"/>
+ <Patch name="Bird2" hbank="4" lbank="0" prog="50"/>
+ <Patch name="Ghost" hbank="4" lbank="0" prog="54"/>
+ <Patch name="Maou" hbank="4" lbank="0" prog="55"/>
+ <Patch name="Tel.Dial" hbank="4" lbank="0" prog="64"/>
+ <Patch name="DoorSqek" hbank="4" lbank="0" prog="65"/>
+ <Patch name="DoorSlam" hbank="4" lbank="0" prog="66"/>
+ <Patch name="Scratch" hbank="4" lbank="0" prog="67"/>
+ <Patch name="Scratch2" hbank="4" lbank="0" prog="68"/>
+ <Patch name="WindChm" hbank="4" lbank="0" prog="69"/>
+ <Patch name="Telphon2" hbank="4" lbank="0" prog="70"/>
+ <Patch name="CarEngin" hbank="4" lbank="0" prog="80"/>
+ <Patch name="CarStop" hbank="4" lbank="0" prog="81"/>
+ <Patch name="CarPass" hbank="4" lbank="0" prog="82"/>
+ <Patch name="CarCrash" hbank="4" lbank="0" prog="83"/>
+ <Patch name="Siren" hbank="4" lbank="0" prog="84"/>
+ <Patch name="Train" hbank="4" lbank="0" prog="85"/>
+ <Patch name="Jetplane" hbank="4" lbank="0" prog="86"/>
+ <Patch name="Starship" hbank="4" lbank="0" prog="87"/>
+ <Patch name="Burst" hbank="4" lbank="0" prog="88"/>
+ <Patch name="Coaster" hbank="4" lbank="0" prog="89"/>
+ <Patch name="SbMarine" hbank="4" lbank="0" prog="90"/>
+ <Patch name="Laughing" hbank="4" lbank="0" prog="96"/>
+ <Patch name="Scream" hbank="4" lbank="0" prog="97"/>
+ <Patch name="Punch" hbank="4" lbank="0" prog="98"/>
+ <Patch name="Heart" hbank="4" lbank="0" prog="99"/>
+ <Patch name="FootStep" hbank="4" lbank="0" prog="100"/>
+ <Patch name="MchinGun" hbank="4" lbank="0" prog="112"/>
+ <Patch name="LaserGun" hbank="4" lbank="0" prog="113"/>
+ <Patch name="Xplosion" hbank="4" lbank="0" prog="114"/>
+ <Patch name="FireWork" hbank="4" lbank="0" prog="115"/>
+ <Patch name="DstCutNz" hbank="4" lbank="0" prog="2"/>
+ <Patch name="B.Slide" hbank="4" lbank="0" prog="4"/>
+ <Patch name="P.Scrape" hbank="4" lbank="0" prog="5"/>
+ <Patch name="Kitty" hbank="4" lbank="0" prog="51"/>
+ <Patch name="Growl" hbank="4" lbank="0" prog="52"/>
+ <Patch name="Haunted" hbank="4" lbank="0" prog="53"/>
+ <Patch name="Applaus2" hbank="4" lbank="0" prog="101"/>
+ </PatchGroup>
+
+ <!-- Controller -->
+ <Controller name="Pitch" type="Pitch" />
+ <Controller name="Program" type="Program" />
+
+ <Controller name="Modulation" type="Control" l="1" />
+ <Controller name="BreathControl" type="Control" l="2" />
+ <Controller name="FootControl" type="Control" l="4" />
+ <Controller name="PortamentoTime" type="Control" l="5" />
+ <Controller name="MainVolume" type="Control" l="7" init="100" />
+ <Controller name="Balance" type="Control" l="8" />
+ <Controller name="Pan" type="Control" l="10" init="64" />
+ <Controller name="Expression" type="Control" l="11" />
+ <Controller name="Sustain" type="Control" l="64" />
+ <Controller name="Portamento" type="Control" l="65" />
+ <Controller name="Sostenuto" type="Control" l="66" />
+ <Controller name="SoftPedal" type="Control" l="67" />
+ <Controller name="HarmonicContent" type="Control" l="71" />
+ <Controller name="ReleaseTime" type="Control" l="72" />
+ <Controller name="AttackTime" type="Control" l="73" />
+ <Controller name="Brightness" type="Control" l="74" />
+ <Controller name="PortamentoControl" type="Control" l="84" />
+ <Controller name="Effect1Depth" type="Control" l="91" />
+ <Controller name="Effect3Depth" type="Control" l="93" />
+ <Controller name="VariationSend" type="Control" l="0x5e" />
+
+ <!-- NRPN's -->
+ <Controller name="VibratoRate" type="NRPN" h="0x01" l="0x08" />
+ <Controller name="VibratoDepth" type="NRPN" h="0x01" l="0x09" />
+ <Controller name="VibratoDelay" type="NRPN" h="0x01" l="0x0a" />
+ <Controller name="FilterCutoffFreq" type="NRPN" h="0x01" l="0x20" />
+ <Controller name="FilterResonance" type="NRPN" h="0x01" l="0x21" />
+ <Controller name="EG AttackTime" type="NRPN" h="0x01" l="0x63" />
+ <Controller name="EG DecayTime" type="NRPN" h="0x01" l="0x64" />
+ <Controller name="EG Release" type="NRPN" h="0x01" l="0x66" />
+
+ <Controller name="Drum FilterCutoffFreq" type="NRPN" h="0x14" l="pitch" />
+ <Controller name="Drum FilterResonance" type="NRPN" h="0x15" l="pitch" />
+ <Controller name="Drum EG AttackRate" type="NRPN" h="0x16" l="pitch" />
+ <Controller name="Drum EG DecayRage" type="NRPN" h="0x17" l="pitch" />
+ <Controller name="Drum Pitch Coarse" type="NRPN" h="0x18" l="pitch" />
+ <Controller name="Drum Pitch Fine" type="NRPN" h="0x19" l="pitch" />
+ <Controller name="Drum Level" type="NRPN" h="0x1a" l="pitch" />
+ <Controller name="Drum Pan" type="NRPN" h="0x1c" l="pitch" />
+ <Controller name="Drum ReverbSendLevel" type="NRPN" h="0x1d" l="pitch" />
+ <Controller name="Drum ChorusSendLevel" type="NRPN" h="0x1e" l="pitch" />
+ <Controller name="Drum VariationSendLev" type="NRPN" h="0x1f" l="pitch" />
+
+ <!-- RPN's -->
+ <Controller name="PitchBendSensitivity" type="RPN" l="0" min="0" max="0x18" init="2" />
+ <Controller name="FineTuning" type="RPN" l="1" min="-64" max="64" init="2" />
+
+ <!-- SysEx's -->
+ <SysEx name="XG on">
+ <comment>Switch XG mode on</comment>
+ <data>0x43 0x10 0x4c 0x00 0x00 0x7e 0x00</data>
+ </SysEx>
+
+ </MidiInstrument>
+ </muse>
+
diff --git a/muse/share/locale/CMakeLists.txt b/muse/share/locale/CMakeLists.txt
new file mode 100644
index 00000000..83dbdc76
--- /dev/null
+++ b/muse/share/locale/CMakeLists.txt
@@ -0,0 +1,22 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+install_files( /share/muse-1.0pre1 .*\\.qm )
+
diff --git a/muse/share/locale/muse_de.qm b/muse/share/locale/muse_de.qm
new file mode 100644
index 00000000..58190146
--- /dev/null
+++ b/muse/share/locale/muse_de.qm
Binary files differ
diff --git a/muse/share/locale/muse_de.ts b/muse/share/locale/muse_de.ts
new file mode 100644
index 00000000..598ad292
--- /dev/null
+++ b/muse/share/locale/muse_de.ts
@@ -0,0 +1,5290 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name></name>
+ <message>
+ <source>Click this button to enable recording</source>
+ <translation type="obsolete">dieser Button schaltet in den Aufnahmemode</translation>
+ </message>
+</context>
+<context>
+ <name>@default</name>
+ <message>
+ <source>Click this button to open a &lt;em&gt;new song&lt;/em&gt;.&lt;br&gt;You can also select the &lt;b&gt;Open command&lt;/b&gt; from the File menu.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to save the song you are editing. You will be prompted for a file name.
+You can also select the Save command from the File menu.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create New Song</source>
+ <translation type="unfinished">Erzeuge neuen Song</translation>
+ </message>
+ <message>
+ <source>Click this button to stop playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to start playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to rewind to start position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to rewind</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to forward current play position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>loop between left mark and right mark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>record starts at left mark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>record stops at right mark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>rewind to start position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>rewind current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>move current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>stop sequencer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start sequencer play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>to record press record and then play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>send note off to all midi channels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>pointer</source>
+ <translation type="obsolete">Zeiger</translation>
+ </message>
+ <message>
+ <source>presets (*.pre *.pre.gz *.pre.bz2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Wave Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Audio Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Audio Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Audio Input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Aux Send</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to enable recording</source>
+ <translation type="unfinished">dieser Button schaltet in den Aufnahmemode</translation>
+ </message>
+ <message>
+ <source>Midi Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Output Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Input Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>AboutBox</name>
+ <message>
+ <source>AboutBox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keep On Rocking!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Version 0.7.0
+
+(C) Copyright 1999-2004 Werner Schweer and others.
+See http://lmuse.sourceforge.net for new versions and
+more information.
+
+Published under the GNU Public License</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Appearance</name>
+ <message>
+ <source>MusE: load image</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>AppearanceDialogBase</name>
+ <message>
+ <source>MusE: Appearance settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show names</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show Cakewalk Style</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>note on</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>poly pressure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>aftertouch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>pitch bend</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>program change</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>special</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Background picture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>bg</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>select...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show snap grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Style/Fonts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>QT Theme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Metal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Norwegian Wood</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Platinum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CDE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Motif</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Motif Plus</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Family</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Font 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Font 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Font 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Font 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Font 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Font 5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>add to palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Itemdsfkajlk jölk ljfölajföajföajf</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Arranger</name>
+ <message>
+ <source>NO</source>
+ <translation type="obsolete">Nein</translation>
+ </message>
+ <message>
+ <source>TrackInfo</source>
+ <translation type="obsolete">SpurInfo</translation>
+ </message>
+ <message>
+ <source>Track</source>
+ <translation type="obsolete">Spur</translation>
+ </message>
+</context>
+<context>
+ <name>ClipListEditorBase</name>
+ <message>
+ <source>MusE: ClipList</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Refs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clip Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pos:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Len:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CommentBase</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiCtrlBase</name>
+ <message>
+ <source>MusE: Config Midi Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automated Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiFileBase</name>
+ <message>
+ <source>MusE: Config Midi File Export</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0 (single track)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 (multiple tracks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Format:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Division:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copyright:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable extended smf format</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ConfigTrackListBase</name>
+ <message>
+ <source>MusE: Config Track List</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Aux</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available Items:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configured Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Name Size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DeicsOnzeGuiBase</name>
+ <message>
+ <source>DeicsOnze</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Presets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subcategory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PRO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NONE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>INITVOICE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op4 Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Feedback level of the operator 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modulation Matrix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Algorithm 1&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 2&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by both &lt;i&gt;Op 3&lt;/i&gt; and &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 3&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 4&lt;/i&gt; and &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 4&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 2&lt;/i&gt; and &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 5&lt;/b&gt; : (&lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt;) add to (&lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;) &lt;br&gt;
+&lt;b&gt;Algorithm 6&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; all modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 7&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; with &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 8&lt;/b&gt; : addition of the four &lt;i&gt;Op 1, 2, 3, 4&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Waveform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Envelope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FIX</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle Fix Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Enable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keyboard Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Eg Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack Rate of the operator 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>48dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>24dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>12dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form 1 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)&lt;/i&gt;&lt;br&gt;
+Wave form 2 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;))&lt;/i&gt;&lt;br&gt;
+Wave form 3 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 4 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 5 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 6 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 7 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 8 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>2° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rate Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>amplitude Envelope 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Fun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phony Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>POLY</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MONO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foot Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bend Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modulation Wheel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Breath Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>After Touch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Potamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FINGER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FULL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PT</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foot Switch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configuration File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished">Sichern</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quality</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Middle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NbrV</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of Voices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save only the used presets into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the entire set into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the configuration into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DrumEdit</name>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Port</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl7DialogBase</name>
+ <message>
+ <source>MusE: Enter Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>controller value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrlBase</name>
+ <message>
+ <source>MusE: Edit Controller Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create New Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Channel:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditInstrumentBase</name>
+ <message>
+ <source>MusE: Instrument Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patches</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High Bank:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low Bank:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <comment>dont care</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch/Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>GM</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>GS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>XG</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Min</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="unfinished">Liste der definierten Controller</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SysEx</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Initialization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hex Entry:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">Datei</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation type="unfinished">Werkzeuge</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished">Neu</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">Neu</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished">�fnen</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="unfinished">�fnen...</translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished">Sichern</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished">&amp;Sichern</translation>
+ </message>
+ <message>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="unfinished">Sichern als</translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="unfinished">Beenden</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished">Beenden</translation>
+ </message>
+</context>
+<context>
+ <name>EditMetaDialogBase</name>
+ <message>
+ <source>MusE: Enter Meta Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TextLabel1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Meta Type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter Hex</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditNoteDialogBase</name>
+ <message>
+ <source>MusE: Enter Note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Length:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Velocity On:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Velocity Off:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditSysexDialogBase</name>
+ <message>
+ <source>MusE: Enter SysEx</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TimePosition:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Known SysEx:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDGuiBase</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDSynthGuiBase</name>
+ <message>
+ <source>FLUID Synth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dump Info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fontname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Damping</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Room Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CHANNEL SETUP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Triangle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chorus</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Gain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LOADED SOUNDFONTS</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileDialogButtons</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Songdata +
+Cofiguration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>only
+Songdata</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GateTimeBase</name>
+ <message>
+ <source>MusE: Modify Gate Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GlobalSettingsDialogBase</name>
+ <message>
+ <source>MusE: Global Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>min. Meter Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>min.Slider Val</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ticks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1024</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2048</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>4096</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>8172</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Displayed Resolution
+(Ticks/Quarternote)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>48</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>768</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1536</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>3072</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>6144</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>12288</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RTC Resolution
+(Ticks/Sec)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>GUI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>/sec</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>GUI Refresh Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help Browser:</source>
+ <translation type="unfinished">Hilfe Browser:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start Muse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with last song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start song:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Views</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>y-pos</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>x-pos</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Big Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cur</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>set current values</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with template: default.med</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show splash screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>use JACK freewheel mode if possible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MITTransposeBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TriggerKey</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transpose:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MPConfig</name>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Port</translation>
+ </message>
+</context>
+<context>
+ <name>MRConfigBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Remote Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Actions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation type="unfinished">Halt</translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation type="unfinished">Aufnahme</translation>
+ </message>
+ <message>
+ <source>Goto Left Mark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation type="unfinished">Wiedergabe</translation>
+ </message>
+</context>
+<context>
+ <name>MidiController</name>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiControllerEditDialogBase</name>
+ <message>
+ <source>Type </source>
+ <translation type="unfinished">Typ</translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation type="unfinished">Eigenschaften</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Typ</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">Neu</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">Löschen</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">Abbrechen</translation>
+ </message>
+ <message>
+ <source>MusE: Define Midi Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>create new entry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>pressing the New button you create a new entry
+in the MusE list of defined controllers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>delete selected entry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="unfinished">Liste der definierten Controller</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Managed Controller for Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Min Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiInputTransformDialogBase</name>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Port</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">Neu</translation>
+ </message>
+</context>
+<context>
+ <name>MidiPortRouteBase</name>
+ <message>
+ <source>MusE: Midi Port Routing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Port 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiSyncConfigBase</name>
+ <message>
+ <source>MusE: Midi Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sync Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Slave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sync Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>accept MTC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>accept Midi Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>accept MMC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Id:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>device id</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sync Gen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Time Code (MTC)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Machine Control (MMC)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MTC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>24</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>25</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>30D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>30N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>frame</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>f</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>subframe</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTrackInfoBase</name>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished">Spur Info</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished">Spur Name</translation>
+ </message>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>all midi events are send to this output channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Note Length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Port</source>
+ <translation type="unfinished">Ausg.Port</translation>
+ </message>
+ <message>
+ <source>OCh.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Compress Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transp.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Compr.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Ports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>IChan.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Channels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Events from all configured channels are
+recorded to this track.
+You can specify more than one channel for
+recording:
+ 1 2 3 record from channel 1 2 and 3
+ 1-3 same
+ 1-3 5<byte value="x9"/> record from channel 1 2 3 and 5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Channel Info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>???</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select Instrument Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select LSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select MSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument High Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument Low Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Progr.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument/Program/Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformDialogBase</name>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">Neu</translation>
+ </message>
+ <message>
+ <source>MusE: Midi Transformator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PresetList</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Event Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keep</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Control Change</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Aftertouch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Plus</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minus</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Multiply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Divide</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ScaleMap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dyn</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Equal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unequal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sysex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Meta</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Higher</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inside</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outside</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bar Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>process all events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>selected tracks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>inside loop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Function</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished">Kopieren</translation>
+ </message>
+ <message>
+ <source>Extract</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformerDialog</name>
+ <message>
+ <source>New</source>
+ <translation type="unfinished">Neu</translation>
+ </message>
+</context>
+<context>
+ <name>MixdownFileDialogBase</name>
+ <message>
+ <source>MusE: Set Mixdown Wavefile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File Path</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>5.1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wav,16 Bit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wav, 24 Bit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wav, 32 Bit (float)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Format</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Mixer</name>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Port</translation>
+ </message>
+</context>
+<context>
+ <name>MusE</name>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">Datei</translation>
+ </message>
+ <message>
+ <source>Open &amp;Recent</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save &amp;As</source>
+ <translation type="unfinished">Sichern als</translation>
+ </message>
+ <message>
+ <source>Config &amp;Printer</source>
+ <translation type="obsolete">Druckerkonfiguration</translation>
+ </message>
+ <message>
+ <source>Import Midifile</source>
+ <translation type="unfinished">Mididatei Importieren</translation>
+ </message>
+ <message>
+ <source>Export Midifile</source>
+ <translation type="unfinished">Mididatei Exportieren</translation>
+ </message>
+ <message>
+ <source>Import Wave File</source>
+ <translation type="unfinished">Wavedatei Importieren</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation type="unfinished">Beenden</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">Editieren</translation>
+ </message>
+ <message>
+ <source>C&amp;ut</source>
+ <translation type="unfinished">Ausschneiden</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">Kopieren</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="unfinished">Einfgen</translation>
+ </message>
+ <message>
+ <source>Delete Track</source>
+ <translation type="obsolete">Spur Lschen</translation>
+ </message>
+ <message>
+ <source>Add Track</source>
+ <translation type="unfinished">Spur hinzufgen</translation>
+ </message>
+ <message>
+ <source>Select &amp;All</source>
+ <translation type="unfinished">Alles Ausw�len</translation>
+ </message>
+ <message>
+ <source>&amp;Deselect All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invert &amp;Selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Inside Loop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Outside Loop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All &amp;Parts on Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drums</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Graphic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mastertrack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi &amp;Transform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Gate Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Crescendo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Thin Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Erase Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Note Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Erase Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mix Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Structure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Global Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Global Insert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Global Split</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cut Events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport Panel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bigtime window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>dont follow Song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>follow page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>follow continuous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Global Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>follow song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Appearance settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Remote Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Plugins</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reset Instr.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Init Instr.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>local off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Audio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bounce to Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bounce to File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;Hilfe</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation type="obsolete">Browser</translation>
+ </message>
+ <message>
+ <source>About&amp;Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: load project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Save Current Project?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished">&amp;Sichern</translation>
+ </message>
+ <message>
+ <source>&amp;Nosave</source>
+ <translation type="unfinished">&amp;NichtSichern</translation>
+ </message>
+ <message>
+ <source>&amp;Abort</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Save As</source>
+ <translation type="unfinished">MusE: Sichern als</translation>
+ </message>
+ <message>
+ <source>Nothing to edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Load overwrites current Project:
+Save Current Project?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>no help found at: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Open Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UndoRedo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Und&amp;o</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Re&amp;do</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>undo last change to song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>redo last undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation type="unfinished">Schleife</translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Punchin</source>
+ <translation type="unfinished">Einfgen</translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Punchout</source>
+ <translation type="unfinished">Punchout</translation>
+ </message>
+ <message>
+ <source>start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rewind</source>
+ <translation type="unfinished">Zurck</translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation type="unfinished">Vorw�ts</translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation type="unfinished">Halt</translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation type="unfinished">Wiedergabe</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation type="unfinished">Aufnahme</translation>
+ </message>
+ <message>
+ <source>panic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">Neu</translation>
+ </message>
+ <message>
+ <source>open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>pianoroll</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Marker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File Buttons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown File Format</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Write File failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Song: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Copy Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>not implemented</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Cut Events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>more than one target track selected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wrong target track type,
+select wave track as target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>no target track selected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete Selected Tracks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Instrument</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configure shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi File Export</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;MusE homepage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Report Bug...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;About MusE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot read template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File open error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File read error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: load template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Bounce</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>set left/right marker for bounce range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>no output track found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Export Midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Import Midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add midi file to current project?
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add to Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>reading midifile
+ </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>
+failed: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>midi pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>global midi pitch shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tempo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>midi tempo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Create tmp file failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Setti&amp;ngs</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OrganGuiBase</name>
+ <message>
+ <source>MusE: Organ</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawbars</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>16&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>4&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2 2/3&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>5 1/3&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>8&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Hi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>cB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Lo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>O-1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Oscillator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Brass</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Flute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PageSettings</name>
+ <message>
+ <source>Track Name</source>
+ <translation type="obsolete">Spur Name</translation>
+ </message>
+</context>
+<context>
+ <name>PartCanvas</name>
+ <message>
+ <source>delete</source>
+ <translation type="obsolete">Entfernen</translation>
+ </message>
+</context>
+<context>
+ <name>PatchBayBase</name>
+ <message>
+ <source>ALSA Patch Bay</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginDialog</name>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: select plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lib</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>IP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>id</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copyright</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stereo and Mono</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select which types of plugins should be visible in the list.&lt;br&gt;Note that using mono plugins on stereo tracks is not a problem, two will be used in parallell.&lt;br&gt;Also beware that the &apos;all&apos; alternative includes plugins that probably not are usable by MusE.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginGui</name>
+ <message>
+ <source>bypass plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: load preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: save preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File Buttons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load Preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QHeader</name>
+ <message>
+ <source>Track Name</source>
+ <translation type="obsolete">Spur Name</translation>
+ </message>
+ <message>
+ <source>Output Port</source>
+ <translation type="obsolete">Ausg.Port</translation>
+ </message>
+</context>
+<context>
+ <name>QPopupMenu</name>
+ <message>
+ <source>Add Midi Generator...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Soft Synth...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QWidget</name>
+ <message>
+ <source>new</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>
+exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: write</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RhythmBase</name>
+ <message>
+ <source>Group</source>
+ <translation type="obsolete">Gruppe</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">Neu</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="obsolete">Liste der definierten Controller</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">Datei</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">Editieren</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="obsolete">&amp;Hilfe</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation type="obsolete">Werkzeuge</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="obsolete">Neu</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="obsolete">�fnen</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="obsolete">�fnen...</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Sichern</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="obsolete">&amp;Sichern</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="obsolete">Sichern als</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="obsolete">Drucken</translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation type="obsolete">Drucken</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="obsolete">Beenden</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="obsolete">Beenden</translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="obsolete">Rckg�gig</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="obsolete">Rckg�gig</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="obsolete">Wiederherstellen</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="obsolete">Wiederherstellen</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Ausschneiden</translation>
+ </message>
+ <message>
+ <source>&amp;Cut</source>
+ <translation type="obsolete">Ausschneiden</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Kopieren</translation>
+ </message>
+ <message>
+ <source>C&amp;opy</source>
+ <translation type="obsolete">Kopieren</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Einfgen</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="obsolete">Einfgen</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation type="obsolete">Suchen</translation>
+ </message>
+ <message>
+ <source>&amp;Find...</source>
+ <translation type="obsolete">Suchen</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation type="obsolete">Inhalt</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation type="obsolete">Inhalt</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation type="obsolete">Index</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation type="obsolete">Index</translation>
+ </message>
+</context>
+<context>
+ <name>RhythmGenerator</name>
+ <message>
+ <source>Instrument Settings:</source>
+ <translation type="obsolete">Instrument Einstellungen</translation>
+ </message>
+ <message>
+ <source>add</source>
+ <translation type="obsolete">Zufgen</translation>
+ </message>
+ <message>
+ <source>delete</source>
+ <translation type="obsolete">Entfernen</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation type="obsolete">Gruppe</translation>
+ </message>
+</context>
+<context>
+ <name>RouteDialogBase</name>
+ <message>
+ <source>MusE: Routing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Route</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Destination:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>connect source to destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Current Routes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>remove selected route</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SS_PluginChooserBase</name>
+ <message>
+ <source>SimpleDrums - Ladspa Plugin Chooser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Creator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutCaptureDialogBase</name>
+ <message>
+ <source>Enter shortcut sequence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Press keys to enter shortcut sequence!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Old shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undefined</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfig</name>
+ <message>
+ <source>Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drumeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List Mastertrack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All categories</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Start playback from current location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle metronome</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Stop Playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Play, Stop, Rewind</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Goto left marker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Goto right marker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Loop section</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Paste,</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: New project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Open from disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Save project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Open recent file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Save as</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Load template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Import midi file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Export midi file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Import audio file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Quit MusE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select parts on track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open pianoroll</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open drumeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open listeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open graphical mastertrack editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open list mastertrack editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open midi transformer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add midi track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add drum track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add wave track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio aux</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global insert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global split</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Copy range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Cut events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Open mixer window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Toggle transport window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Toggle bigtime window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Open marker window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song by page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song continuous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Global configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Configure shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Configure metronome</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi sync configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi file export configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Appearance settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi ports / Soft Synth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Audio subsystem configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Edit midi instruments</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input transform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi input transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi remote control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Random rhythm generator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Reset midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Init midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi local off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Restart audio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Mixer automation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Take mixer snapshot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Clear mixer automation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help: Open Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help: Toggle whatsthis mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Edit selected part</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track above</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track above</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track below</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track below</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select none</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Invert selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts inside locators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts outside locators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part/event to the left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the left to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the right to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Set locators to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Increase pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Decrease pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Set fixed length on midi events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Over Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Note On Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Note On/Off Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Iterative Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Configure quant</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Gate Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Crescendo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Thin Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Erase Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Note Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Move Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Copy Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Erase Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Delete Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Create Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Change event color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Pointer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Pencil</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Eraser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Line Draw</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Scissor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Glue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Mute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Increase current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Decrease current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/1 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/2 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/4 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/8 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/16 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/32 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/64 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle triol quantization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization (2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Insert at location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Increase event position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Decrease event position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Tempo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Signature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Change Event Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Event Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfigBase</name>
+ <message>
+ <source>Configure Keyboard Shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Define</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SimpleDrumsGuiBase</name>
+ <message>
+ <source>DrumSynth 0.1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TList</name>
+ <message>
+ <source>Delete Track</source>
+ <translation type="obsolete">Spur Lschen</translation>
+ </message>
+</context>
+<context>
+ <name>TempoSig</name>
+ <message>
+ <source>Tempo/Sig</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Transport</name>
+ <message>
+ <source>Punch In</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation type="unfinished">Schleife</translation>
+ </message>
+ <message>
+ <source>Punch Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Left Mark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Right Mark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Overdub</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rec Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cycle Rec</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>rewind to start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>quantize during record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>metronom click on/off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external sync on/off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>use master track</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransposeDialogBase</name>
+ <message>
+ <source>MusE: Midi Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>halftones</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>between markers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>all in selected tracks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>VelocityBase</name>
+ <message>
+ <source>MusE: Modify Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WaveEdit</name>
+ <message>
+ <source>Normalize</source>
+ <translation type="obsolete">Normalisieren</translation>
+ </message>
+</context>
+<context>
+ <name>WaveTrackInfoBase</name>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished">Spur Info</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished">Spur Name</translation>
+ </message>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay (Frames)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/muse/share/locale/muse_es.qm b/muse/share/locale/muse_es.qm
new file mode 100644
index 00000000..d21aa030
--- /dev/null
+++ b/muse/share/locale/muse_es.qm
Binary files differ
diff --git a/muse/share/locale/muse_es.ts b/muse/share/locale/muse_es.ts
new file mode 100644
index 00000000..093d2f59
--- /dev/null
+++ b/muse/share/locale/muse_es.ts
@@ -0,0 +1,8803 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name></name>
+ <message>
+ <source>Click this button to enable recording</source>
+ <translation type="obsolete">Pulsa este botďż˝ para habilitar la grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>sets amount of quantization:
+0 - no quantization
+100 - full quantization</source>
+ <translation type="obsolete">selecciona la cantidad de cuantizaciďż˝:
+0 - sin cuantizar
+100 - cuantizaciďż˝ completa</translation>
+ </message>
+ <message>
+ <source>select Pointer Tool:
+with the pointer tool you can:
+ select parts
+ move parts
+ copy parts</source>
+ <translation type="obsolete">selecciona la Herramienta de Puntero:
+con la herramienta de puntero puedes:
+ seleccionar partes
+ mover partes
+ copiar partes</translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation type="obsolete">Insertar nota</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="obsolete">Insertar sistema exclusivo</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="obsolete">Insertar controlador</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="obsolete">Insertar Meta</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="obsolete">Insertar AfterTouch de canal</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="obsolete">Insertar AfterTouch de tecla</translation>
+ </message>
+</context>
+<context>
+ <name>@default</name>
+ <message>
+ <source>Click this button to open a &lt;em&gt;new song&lt;/em&gt;.&lt;br&gt;You can also select the &lt;b&gt;Open command&lt;/b&gt; from the File menu.</source>
+ <translation type="unfinished">Pulsa este botďż˝ para abrir una &lt;em&gt;nueva canciďż˝&lt;/em&gt;Puedes usar tambiďż˝ el comando &lt;b&gt;Abrir&lt;/b&gt; del me de archivo</translation>
+ </message>
+ <message>
+ <source>Click this button to save the song you are editing. You will be prompted for a file name.
+You can also select the Save command from the File menu.</source>
+ <translation type="unfinished">Pulsa este bot� para guardar la canci� que est� editando. Se te preguntar�por un nombre de archivo.
+Puedes seleccionar tambiďż˝ el comando Guardar del men de Archivo</translation>
+ </message>
+ <message>
+ <source>Create New Song</source>
+ <translation type="unfinished">Crea una nueva Canciďż˝</translation>
+ </message>
+ <message>
+ <source>Click this button to stop playback</source>
+ <translation type="unfinished">Pulsa este botďż˝ para parar la reproducciďż˝</translation>
+ </message>
+ <message>
+ <source>Click this button to start playback</source>
+ <translation type="unfinished">Pulsa este botďż˝ para iniciar la reproducciďż˝</translation>
+ </message>
+ <message>
+ <source>Click this button to rewind to start position</source>
+ <translation type="unfinished">Pulsa este botďż˝ para regresar al principio</translation>
+ </message>
+ <message>
+ <source>Click this button to rewind</source>
+ <translation type="unfinished">Pulsa este botďż˝ para ir hacia atrďż˝</translation>
+ </message>
+ <message>
+ <source>Click this button to forward current play position</source>
+ <translation type="unfinished">Pulsa este botďż˝ para adelantar la posiciďż˝ de reproducciďż˝</translation>
+ </message>
+ <message>
+ <source>don&apos;t quantize notes above this tick limit</source>
+ <translation type="obsolete">no cuantices notas por encima de este l�ite de tick</translation>
+ </message>
+ <message>
+ <source>quantize also note len as default</source>
+ <translation type="obsolete">cuantiza tambiďż˝ la longitud de la nota al valor por defecto</translation>
+ </message>
+ <message>
+ <source>loop between left mark and right mark</source>
+ <translation type="unfinished">hace un bucle entre las marcas de izquierda y derecha</translation>
+ </message>
+ <message>
+ <source>record starts at left mark</source>
+ <translation type="unfinished">la grabaciďż˝ comienza en la marca izquierda</translation>
+ </message>
+ <message>
+ <source>record stops at right mark</source>
+ <translation type="unfinished">la grabaciďż˝ termina en la merca derecha</translation>
+ </message>
+ <message>
+ <source>rewind to start position</source>
+ <translation type="unfinished">retrocede a la posiciďż˝ de inicio</translation>
+ </message>
+ <message>
+ <source>rewind current position</source>
+ <translation type="unfinished">retrasa la posiciďż˝ actual</translation>
+ </message>
+ <message>
+ <source>move current position</source>
+ <translation type="unfinished">mueve la posiciďż˝ actual</translation>
+ </message>
+ <message>
+ <source>stop sequencer</source>
+ <translation type="unfinished">para el secuenciador</translation>
+ </message>
+ <message>
+ <source>start sequencer play</source>
+ <translation type="unfinished">inicia el secuenciador</translation>
+ </message>
+ <message>
+ <source>to record press record and then play</source>
+ <translation type="unfinished">para grabar pulsa grabar y despuďż˝ reproducir</translation>
+ </message>
+ <message>
+ <source>send note off to all midi channels</source>
+ <translation type="unfinished">envia un apagado de nota (note off) a todos los canales midi</translation>
+ </message>
+ <message>
+ <source>select Pencil Tool:
+with the pencil tool you can:
+ create new parts
+ modify length of parts</source>
+ <translation type="obsolete">selecciona la Herramienta de L�iz:
+con la herramienta de l�iz puedes:
+ crear nuevas partes
+ modificar la longitud de las partes</translation>
+ </message>
+ <message>
+ <source>select Delete Tool:
+with the delete tool you can delete parts</source>
+ <translation type="obsolete">selecciona la Herramienta de Borrado:
+con la herramienta de borrado puedes borrar partes</translation>
+ </message>
+ <message>
+ <source>select Cut Tool:
+with the cut tool you can split a part</source>
+ <translation type="obsolete">selecciona la Herramienta de Corte:
+con la herramienta de core puedes partir una parte</translation>
+ </message>
+ <message>
+ <source>select Glue Tool:
+with the glue tool you can glue two parts</source>
+ <translation type="obsolete">selecciona la Herramienta de Pegado:
+con la herramienta de pegado puedes unir dos partes</translation>
+ </message>
+ <message>
+ <source>select Score Tool:
+</source>
+ <translation type="obsolete">selecciona la Herramienta de Partitura:
+</translation>
+ </message>
+ <message>
+ <source>select Quantize Tool:
+insert display quantize event</source>
+ <translation type="obsolete">selecciona la Herramianta de Cuantizaciďż˝:
+inserta un evento de cuantizaciďż˝ de visualizaciďż˝</translation>
+ </message>
+ <message>
+ <source>select Drawing Tool</source>
+ <translation type="obsolete">selecciona la Herramienta de Dibujo</translation>
+ </message>
+ <message>
+ <source>select Muting Tool:
+click on part to mute/unmute</source>
+ <translation type="obsolete">selecciona la Herramienta de Silenciar:
+haz click en una parte para silenciar/des-silenciar</translation>
+ </message>
+ <message>
+ <source>pointer</source>
+ <translation type="obsolete">puntero</translation>
+ </message>
+ <message>
+ <source>pencil</source>
+ <translation type="obsolete">l�iz</translation>
+ </message>
+ <message>
+ <source>rubber</source>
+ <translation type="obsolete">goma</translation>
+ </message>
+ <message>
+ <source>cutter</source>
+ <translation type="obsolete">cortador</translation>
+ </message>
+ <message>
+ <source>score</source>
+ <translation type="obsolete">partitura</translation>
+ </message>
+ <message>
+ <source>glue</source>
+ <translation type="obsolete">pegamento</translation>
+ </message>
+ <message>
+ <source>quantize</source>
+ <translation type="obsolete">cuantizador</translation>
+ </message>
+ <message>
+ <source>draw</source>
+ <translation type="obsolete">dibujar</translation>
+ </message>
+ <message>
+ <source>mute parts</source>
+ <translation type="obsolete">silenciar partes</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Apagar</translation>
+ </message>
+ <message>
+ <source>presets (*.pre *.pre.gz *.pre.bz2)</source>
+ <translation type="unfinished">preselecciones (*.pre *.pre.gz *.pre.bz2)</translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation type="unfinished">Todos los archivos (*)</translation>
+ </message>
+ <message>
+ <source>Add Midi Track</source>
+ <translation type="unfinished">A�dir pista MIDI</translation>
+ </message>
+ <message>
+ <source>Add Wave Track</source>
+ <translation type="unfinished">A�dir pista de audio</translation>
+ </message>
+ <message>
+ <source>Add Audio Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Audio Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Audio Input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Aux Send</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to enable recording</source>
+ <translation type="unfinished">Pulsa este botďż˝ para habilitar la grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>Midi Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Output Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Input Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>AboutBox</name>
+ <message>
+ <source>AboutBox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keep On Rocking!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Version 0.7.0
+
+(C) Copyright 1999-2004 Werner Schweer and others.
+See http://lmuse.sourceforge.net for new versions and
+more information.
+
+Published under the GNU Public License</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Appearance</name>
+ <message>
+ <source>MusE: load image</source>
+ <translation type="unfinished">MusE: carga imagen</translation>
+ </message>
+ <message>
+ <source>handle of transport window</source>
+ <translation type="obsolete">gestor de la ventana de transporte</translation>
+ </message>
+ <message>
+ <source>track activity in arranger</source>
+ <translation type="obsolete">actividad de tramos en el arreglador</translation>
+ </message>
+ <message>
+ <source>bigtime font color</source>
+ <translation type="obsolete">color de fuente bigtime</translation>
+ </message>
+ <message>
+ <source>bigtime background color</source>
+ <translation type="obsolete">color de fondo de bigtime</translation>
+ </message>
+ <message>
+ <source>waveedit background color</source>
+ <translation type="obsolete">color de fondo de ediciďż˝ de onda</translation>
+ </message>
+</context>
+<context>
+ <name>AppearanceDialogBase</name>
+ <message>
+ <source>MusE: Appearance settings</source>
+ <translation type="unfinished">MusE: Configuraciďż˝ de apariencia</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="unfinished">Aplicar</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished">Arreglador</translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation type="unfinished">Partes</translation>
+ </message>
+ <message>
+ <source>show frames</source>
+ <translation type="obsolete">mostrar frames</translation>
+ </message>
+ <message>
+ <source>show names</source>
+ <translation type="unfinished">mostrar nombres</translation>
+ </message>
+ <message>
+ <source>show events</source>
+ <translation type="unfinished">mostrar eventos</translation>
+ </message>
+ <message>
+ <source>show Cakewalk Style</source>
+ <translation type="unfinished">mostrar al estilo de Cakewalk</translation>
+ </message>
+ <message>
+ <source>Events</source>
+ <translation type="unfinished">Eventos</translation>
+ </message>
+ <message>
+ <source>note on</source>
+ <translation type="unfinished">nota on</translation>
+ </message>
+ <message>
+ <source>poly pressure</source>
+ <translation type="unfinished">presi� polif�ica</translation>
+ </message>
+ <message>
+ <source>controller</source>
+ <translation type="unfinished">controlador</translation>
+ </message>
+ <message>
+ <source>aftertouch</source>
+ <translation type="unfinished">aftertouch</translation>
+ </message>
+ <message>
+ <source>pitch bend</source>
+ <translation type="unfinished">pitch bend</translation>
+ </message>
+ <message>
+ <source>program change</source>
+ <translation type="unfinished">cambio de programa</translation>
+ </message>
+ <message>
+ <source>special</source>
+ <translation type="unfinished">especial</translation>
+ </message>
+ <message>
+ <source>Background picture</source>
+ <translation type="unfinished">Imagen de fondo</translation>
+ </message>
+ <message>
+ <source>bg</source>
+ <translation type="unfinished">fondo</translation>
+ </message>
+ <message>
+ <source>select...</source>
+ <translation type="unfinished">selecciona...</translation>
+ </message>
+ <message>
+ <source>show snap grid</source>
+ <translation type="unfinished">muestra la rejilla de captura</translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation type="unfinished">Colores</translation>
+ </message>
+ <message>
+ <source>Items</source>
+ <translation type="unfinished">Objetos</translation>
+ </message>
+ <message>
+ <source>selected</source>
+ <translation type="obsolete">seleccionado</translation>
+ </message>
+ <message>
+ <source>current:</source>
+ <translation type="obsolete">actual:</translation>
+ </message>
+ <message>
+ <source>change...</source>
+ <translation type="obsolete">cambia...</translation>
+ </message>
+ <message>
+ <source>dynamic colors for track activity in arranger</source>
+ <translation type="obsolete">colores din�icos para actividad en el arreglador</translation>
+ </message>
+ <message>
+ <source>Style/Fonts</source>
+ <translation type="unfinished">Estilo/Tipografia</translation>
+ </message>
+ <message>
+ <source>QT Theme</source>
+ <translation type="unfinished">tema QT</translation>
+ </message>
+ <message>
+ <source>Windows</source>
+ <translation type="unfinished">Ventanas</translation>
+ </message>
+ <message>
+ <source>MusE</source>
+ <translation type="unfinished">MusE</translation>
+ </message>
+ <message>
+ <source>Metal</source>
+ <translation type="unfinished">Metal</translation>
+ </message>
+ <message>
+ <source>Norwegian Wood</source>
+ <translation type="unfinished">Madera Noruega</translation>
+ </message>
+ <message>
+ <source>Platinum</source>
+ <translation type="unfinished">Platino</translation>
+ </message>
+ <message>
+ <source>CDE</source>
+ <translation type="unfinished">CDE</translation>
+ </message>
+ <message>
+ <source>Motif</source>
+ <translation type="unfinished">Motif</translation>
+ </message>
+ <message>
+ <source>Motif Plus</source>
+ <translation type="unfinished">Motif Plus</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation type="unfinished">Tipografia</translation>
+ </message>
+ <message>
+ <source>Family</source>
+ <translation type="unfinished">Familia</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation type="unfinished">Tamaďż˝</translation>
+ </message>
+ <message>
+ <source>Font 1</source>
+ <translation type="unfinished">Tipografia 1</translation>
+ </message>
+ <message>
+ <source>Font 2</source>
+ <translation type="unfinished">Tipografia 2</translation>
+ </message>
+ <message>
+ <source>Font 3</source>
+ <translation type="unfinished">Tipografia 3</translation>
+ </message>
+ <message>
+ <source>Font 0</source>
+ <translation type="unfinished">Tipografia 0</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation type="unfinished">Negrita</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation type="unfinished">Cursiva</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation type="unfinished">...</translation>
+ </message>
+ <message>
+ <source>Font 4</source>
+ <translation type="unfinished">Tipografia 4</translation>
+ </message>
+ <message>
+ <source>Font 5</source>
+ <translation type="unfinished">Tipografia 5</translation>
+ </message>
+ <message>
+ <source>Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>add to palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="unfinished">S</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation type="unfinished">R</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Itemdsfkajlk jölk ljfölajföajföajf</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Arranger</name>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Cursor</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="obsolete">Snap</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="obsolete">Longitud</translation>
+ </message>
+ <message>
+ <source>NO</source>
+ <translation type="obsolete">No</translation>
+ </message>
+ <message>
+ <source>TrackInfo</source>
+ <translation type="obsolete">Informaciďż˝ de pista</translation>
+ </message>
+ <message>
+ <source>Track</source>
+ <translation type="obsolete">Pista</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Tipo</translation>
+ </message>
+ <message>
+ <source>midi song type</source>
+ <translation type="obsolete">tipo de canciďż˝ midi</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tono</translation>
+ </message>
+ <message>
+ <source>midi pitch</source>
+ <translation type="obsolete">tono midi</translation>
+ </message>
+ <message>
+ <source>global midi pitch shift</source>
+ <translation type="obsolete">desplazamiento de tono midi</translation>
+ </message>
+ <message>
+ <source>Tempo</source>
+ <translation type="obsolete">Tempo</translation>
+ </message>
+ <message>
+ <source>midi tempo</source>
+ <translation type="obsolete">tempo midi</translation>
+ </message>
+ <message>
+ <source>O-Port</source>
+ <translation type="obsolete">Port de Salida</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="obsolete">Arreglador</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">apagado</translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation type="obsolete">compďż˝</translation>
+ </message>
+ <message>
+ <source>GM</source>
+ <translation type="obsolete">GM</translation>
+ </message>
+ <message>
+ <source>GS</source>
+ <translation type="obsolete">GS</translation>
+ </message>
+ <message>
+ <source>XG</source>
+ <translation type="obsolete">XG</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation type="obsolete">N</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation type="obsolete">R</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation type="obsolete">A</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation type="obsolete">M</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="obsolete">S</translation>
+ </message>
+ <message>
+ <source>C</source>
+ <translation type="obsolete">C</translation>
+ </message>
+ <message>
+ <source>Ch</source>
+ <translation type="obsolete">Ch</translation>
+ </message>
+ <message>
+ <source>T</source>
+ <translation type="obsolete">T</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Maestro</translation>
+ </message>
+ <message>
+ <source>Group A</source>
+ <translation type="obsolete">Grupo A</translation>
+ </message>
+ <message>
+ <source>Group B</source>
+ <translation type="obsolete">Grupo B</translation>
+ </message>
+ <message>
+ <source>Group C</source>
+ <translation type="obsolete">Grupo C</translation>
+ </message>
+ <message>
+ <source>Group D</source>
+ <translation type="obsolete">Grupo D</translation>
+ </message>
+</context>
+<context>
+ <name>AudioConfBase</name>
+ <message>
+ <source>MusE: Audio Configuration</source>
+ <translation type="obsolete">MusE: Configuraciďż˝ de Audio</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="obsolete">&amp;Aplicar</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">C&amp;orrecto</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Cancelar</translation>
+ </message>
+ <message>
+ <source>Audio Parameters</source>
+ <translation type="obsolete">Par�etros de Audio</translation>
+ </message>
+ <message>
+ <source>32</source>
+ <translation type="obsolete">32</translation>
+ </message>
+ <message>
+ <source>64</source>
+ <translation type="obsolete">64</translation>
+ </message>
+ <message>
+ <source>128</source>
+ <translation type="obsolete">128</translation>
+ </message>
+ <message>
+ <source>256</source>
+ <translation type="obsolete">256</translation>
+ </message>
+ <message>
+ <source>512</source>
+ <translation type="obsolete">512</translation>
+ </message>
+ <message>
+ <source>1024</source>
+ <translation type="obsolete">1024</translation>
+ </message>
+ <message>
+ <source>2048</source>
+ <translation type="obsolete">2048</translation>
+ </message>
+ <message>
+ <source>4096</source>
+ <translation type="obsolete">4096</translation>
+ </message>
+ <message>
+ <source>Frame Size:</source>
+ <translation type="obsolete">Tamaďż˝ de ventana:</translation>
+ </message>
+ <message>
+ <source>Delay:</source>
+ <translation type="obsolete">Retardo:</translation>
+ </message>
+ <message>
+ <source>Sample Rate:</source>
+ <translation type="obsolete">Velocidad de muestreo:</translation>
+ </message>
+ <message>
+ <source>44100</source>
+ <translation type="obsolete">44100</translation>
+ </message>
+ <message>
+ <source>48000</source>
+ <translation type="obsolete">48000</translation>
+ </message>
+ <message>
+ <source>96000</source>
+ <translation type="obsolete">96000</translation>
+ </message>
+ <message>
+ <source>Audio Driver</source>
+ <translation type="obsolete">Controlador de Audio</translation>
+ </message>
+ <message>
+ <source>Use Alsa</source>
+ <translation type="obsolete">Usa Alsa</translation>
+ </message>
+ <message>
+ <source>Use JACK</source>
+ <translation type="obsolete">Usa Jack</translation>
+ </message>
+ <message>
+ <source>No Audio</source>
+ <translation type="obsolete">Sin Audio</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation type="obsolete">Estado:</translation>
+ </message>
+ <message>
+ <source>TextLabel6</source>
+ <translation type="obsolete">EtiquetadeTexto16</translation>
+ </message>
+</context>
+<context>
+ <name>AudioMixerApp</name>
+ <message>
+ <source>1/2 channel</source>
+ <translation type="obsolete">Canales 1/2</translation>
+ </message>
+ <message>
+ <source>pre fader - post fader</source>
+ <translation type="obsolete">pre fader - port fader</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="obsolete">grabar</translation>
+ </message>
+ <message>
+ <source>mute</source>
+ <translation type="obsolete">silencio</translation>
+ </message>
+ <message>
+ <source>pre fader listening</source>
+ <translation type="obsolete">monitorizar pre fader</translation>
+ </message>
+ <message>
+ <source>record downmix</source>
+ <translation type="obsolete">downmix de grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="obsolete">apagado</translation>
+ </message>
+ <message>
+ <source>output routing</source>
+ <translation type="obsolete">ruteado de entrada</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Configuraciďż˝</translation>
+ </message>
+ <message>
+ <source>Add Input Strip</source>
+ <translation type="obsolete">A�dir canal de entrada</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="obsolete">S</translation>
+ </message>
+ <message>
+ <source>Pre</source>
+ <translation type="obsolete">Pre</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="obsolete">dB</translation>
+ </message>
+ <message>
+ <source>MusE: Audio Mixer</source>
+ <translation type="obsolete">MusE: Mezclador de audio</translation>
+ </message>
+ <message>
+ <source>Inputs</source>
+ <translation type="obsolete">Entradas</translation>
+ </message>
+ <message>
+ <source>Synthi</source>
+ <translation type="obsolete">Entrada de sintetizador</translation>
+ </message>
+ <message>
+ <source>Tracks</source>
+ <translation type="obsolete">Pistas</translation>
+ </message>
+ <message>
+ <source>Groups</source>
+ <translation type="obsolete">Grupos</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Maestro</translation>
+ </message>
+ <message>
+ <source>Group A</source>
+ <translation type="obsolete">Grupo A</translation>
+ </message>
+ <message>
+ <source>Group B</source>
+ <translation type="obsolete">Grupo B</translation>
+ </message>
+ <message>
+ <source>Group C</source>
+ <translation type="obsolete">Grupo C</translation>
+ </message>
+ <message>
+ <source>Group D</source>
+ <translation type="obsolete">Grupo D</translation>
+ </message>
+</context>
+<context>
+ <name>AudioStrip</name>
+ <message>
+ <source>off</source>
+ <translation type="obsolete">apagado</translation>
+ </message>
+ <message>
+ <source>Pan</source>
+ <translation type="obsolete">Bal</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="obsolete">S</translation>
+ </message>
+ <message>
+ <source>1/2 channel</source>
+ <translation type="obsolete">Canales 1/2</translation>
+ </message>
+ <message>
+ <source>Pre</source>
+ <translation type="obsolete">Pre</translation>
+ </message>
+ <message>
+ <source>pre fader - post fader</source>
+ <translation type="obsolete">pre fader - port fader</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="obsolete">dB</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="obsolete">grabar</translation>
+ </message>
+ <message>
+ <source>mute</source>
+ <translation type="obsolete">silencio</translation>
+ </message>
+ <message>
+ <source>record downmix</source>
+ <translation type="obsolete">downmix de grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>pre fader listening</source>
+ <translation type="obsolete">monitorizar pre fader</translation>
+ </message>
+ <message>
+ <source>output routing</source>
+ <translation type="obsolete">ruteado de entrada</translation>
+ </message>
+</context>
+<context>
+ <name>BigTime</name>
+ <message>
+ <source>MusE: Bigtime</source>
+ <translation type="obsolete">MusE: Big Time</translation>
+ </message>
+</context>
+<context>
+ <name>ClipListEdit</name>
+ <message>
+ <source>MusE: Clip List Editor</source>
+ <translation type="obsolete">MusE: Editor de lista de clips</translation>
+ </message>
+</context>
+<context>
+ <name>ClipListEditorBase</name>
+ <message>
+ <source>MusE: ClipList</source>
+ <translation type="unfinished">MusE: Lista de Clips</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Nombre</translation>
+ </message>
+ <message>
+ <source>Refs</source>
+ <translation type="unfinished">Referencias</translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished">Inicio</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="unfinished">Longitud</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="unfinished">Datos</translation>
+ </message>
+ <message>
+ <source>Clip Properties</source>
+ <translation type="unfinished">Propiedades del Clip</translation>
+ </message>
+ <message>
+ <source>Pos:</source>
+ <translation type="unfinished">Posiciďż˝:</translation>
+ </message>
+ <message>
+ <source>Len:</source>
+ <translation type="unfinished">Longitud:</translation>
+ </message>
+</context>
+<context>
+ <name>CommentBase</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished">Form1</translation>
+ </message>
+ <message>
+ <source>Track Comment</source>
+ <translation type="unfinished">Comentario de la pista</translation>
+ </message>
+ <message>
+ <source>Track 1</source>
+ <translation type="unfinished">Pista 1</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiCtrlBase</name>
+ <message>
+ <source>MusE: Config Midi Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automated Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiFileBase</name>
+ <message>
+ <source>MusE: Config Midi File Export</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Cancelar</translation>
+ </message>
+ <message>
+ <source>0 (single track)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 (multiple tracks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Format:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation type="unfinished">96</translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation type="unfinished">192</translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation type="unfinished">384</translation>
+ </message>
+ <message>
+ <source>Division:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copyright:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable extended smf format</source>
+ <translation type="unfinished">Habilita el formato extendido de smf</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigTrackListBase</name>
+ <message>
+ <source>MusE: Config Track List</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Aux</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available Items:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation type="unfinished">Arriba</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation type="unfinished">Abajo</translation>
+ </message>
+ <message>
+ <source>Configured Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Name Size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>CtrlPanel</name>
+ <message>
+ <source>select controller</source>
+ <translation type="obsolete">selecciona controlador</translation>
+ </message>
+ <message>
+ <source>remove panel</source>
+ <translation type="obsolete">quitar panel</translation>
+ </message>
+ <message>
+ <source>other ...</source>
+ <translation type="obsolete">otro ...</translation>
+ </message>
+ <message>
+ <source>Sel</source>
+ <translation type="obsolete">Sel</translation>
+ </message>
+ <message>
+ <source>x</source>
+ <translation type="obsolete">x</translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="obsolete">Velocidad</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tono</translation>
+ </message>
+</context>
+<context>
+ <name>DeicsOnzeGuiBase</name>
+ <message>
+ <source>DeicsOnze</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Presets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subcategory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PRO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished">Preselecciďż˝</translation>
+ </message>
+ <message>
+ <source>Bank numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NONE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>INITVOICE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op4 Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Feedback level of the operator 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modulation Matrix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Algorithm 1&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 2&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by both &lt;i&gt;Op 3&lt;/i&gt; and &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 3&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 4&lt;/i&gt; and &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 4&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 2&lt;/i&gt; and &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 5&lt;/b&gt; : (&lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt;) add to (&lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;) &lt;br&gt;
+&lt;b&gt;Algorithm 6&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; all modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 7&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; with &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 8&lt;/b&gt; : addition of the four &lt;i&gt;Op 1, 2, 3, 4&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO</source>
+ <translation type="unfinished">LFO</translation>
+ </message>
+ <message>
+ <source>LFO Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Waveform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished">Velocidad</translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Envelope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Volume</source>
+ <translation type="unfinished">Volumen</translation>
+ </message>
+ <message>
+ <source>Frequency 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FIX</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle Fix Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Enable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keyboard Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Eg Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune</source>
+ <translation type="unfinished">Desafinaciďż˝</translation>
+ </message>
+ <message>
+ <source>Attack Rate of the operator 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>48dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>24dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>12dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form 1 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)&lt;/i&gt;&lt;br&gt;
+Wave form 2 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;))&lt;/i&gt;&lt;br&gt;
+Wave form 3 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 4 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 5 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 6 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 7 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 8 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>2° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rate Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>amplitude Envelope 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Fun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phony Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>POLY</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MONO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished">Reverberaciďż˝</translation>
+ </message>
+ <message>
+ <source>Foot Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bend Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Tono</translation>
+ </message>
+ <message>
+ <source>Modulation Wheel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Breath Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>After Touch</source>
+ <translation type="unfinished">After Touch</translation>
+ </message>
+ <message>
+ <source>Potamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FINGER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FULL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PT</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foot Switch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished">Sostenido</translation>
+ </message>
+ <message>
+ <source>Portamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="unfinished">Transponer</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configuration File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished">Guardar</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Cargar</translation>
+ </message>
+ <message>
+ <source>Quality</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Middle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NbrV</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of Voices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="unfinished">Texto</translation>
+ </message>
+ <message>
+ <source>Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save only the used presets into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the entire set into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the configuration into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DrumEdit</name>
+ <message>
+ <source>Load Map</source>
+ <translation type="obsolete">Carga Mapa</translation>
+ </message>
+ <message>
+ <source>Save Map</source>
+ <translation type="obsolete">Guarda Mapa</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Editar</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Cortar</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Copiar</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Pegar</translation>
+ </message>
+ <message>
+ <source>Delete Events</source>
+ <translation type="obsolete">Borrar Eventos</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="obsolete">Seleccionar todo</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation type="obsolete">Deseleccionar</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Invertir</translation>
+ </message>
+ <message>
+ <source>Inside Loop</source>
+ <translation type="obsolete">Bucle interior</translation>
+ </message>
+ <message>
+ <source>Outside Loop</source>
+ <translation type="obsolete">Bucle exterior</translation>
+ </message>
+ <message>
+ <source>&amp;Select</source>
+ <translation type="obsolete">&amp;Seleccionar</translation>
+ </message>
+ <message>
+ <source>Step Record</source>
+ <translation type="obsolete">Parar Grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>Midi Input</source>
+ <translation type="obsolete">Entrada MIDI</translation>
+ </message>
+ <message>
+ <source>Add Controller View</source>
+ <translation type="obsolete">A�dir Controlador</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation type="obsolete">M</translation>
+ </message>
+ <message>
+ <source>Sound</source>
+ <translation type="obsolete">Sonido</translation>
+ </message>
+ <message>
+ <source>QNT</source>
+ <translation type="obsolete">QNT</translation>
+ </message>
+ <message>
+ <source>E-Note</source>
+ <translation type="obsolete">Nota-E</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="obsolete">Longitud</translation>
+ </message>
+ <message>
+ <source>A-Note</source>
+ <translation type="obsolete">Nota-A</translation>
+ </message>
+ <message>
+ <source>Ch</source>
+ <translation type="obsolete">Ch</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Puerto</translation>
+ </message>
+ <message>
+ <source>LV1</source>
+ <translation type="obsolete">VL1</translation>
+ </message>
+ <message>
+ <source>LV2</source>
+ <translation type="obsolete">VL2</translation>
+ </message>
+ <message>
+ <source>LV3</source>
+ <translation type="obsolete">VL3</translation>
+ </message>
+ <message>
+ <source>LV4</source>
+ <translation type="obsolete">VL4</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Fichero</translation>
+ </message>
+ <message>
+ <source>Load Drummap</source>
+ <translation type="obsolete">Cargar mapa de percusiďż˝</translation>
+ </message>
+ <message>
+ <source>Store Drummap</source>
+ <translation type="obsolete">Guardar mapa de percusiďż˝</translation>
+ </message>
+ <message>
+ <source>ctrl</source>
+ <translation type="obsolete">control</translation>
+ </message>
+ <message>
+ <source>drummaps</source>
+ <translation type="obsolete">mapas de percusiďż˝</translation>
+ </message>
+ <message>
+ <source>Muse: Load Drum Map</source>
+ <translation type="obsolete">MusE: Cargar mapa de percusiďż˝</translation>
+ </message>
+ <message>
+ <source>MusE: Store Drum Map</source>
+ <translation type="obsolete">MusE: Guardar mapa de percusiďż˝</translation>
+ </message>
+</context>
+<context>
+ <name>EditCAfterDialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Posiciďż˝ de tiempo</translation>
+ </message>
+ <message>
+ <source>Pressure</source>
+ <translation type="obsolete">Presiďż˝</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Channel Aftertouch</source>
+ <translation type="obsolete">MusE: Introduce el AfterTouch del canal</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl14Dialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Posiciďż˝ de tiempo</translation>
+ </message>
+ <message>
+ <source>Controller-H</source>
+ <translation type="obsolete">Controlador-H</translation>
+ </message>
+ <message>
+ <source>Controller-L</source>
+ <translation type="obsolete">Controlador-L</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="obsolete">Valor</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Controller14 Event</source>
+ <translation type="obsolete">MusE: Introduce el evento del controlador 14</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl7Dialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Posiciďż˝ de tiempo</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="obsolete">Controlador</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="obsolete">Valor</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Controller Event</source>
+ <translation type="obsolete">MusE: Introduce el evento del controlador</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl7DialogBase</name>
+ <message>
+ <source>MusE: Enter Controller</source>
+ <translation type="unfinished">MusE: Introduce controlador</translation>
+ </message>
+ <message>
+ <source>Controller:</source>
+ <translation type="unfinished">Controlador:</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished">Posiciďż˝ de tiempo:</translation>
+ </message>
+ <message>
+ <source>Value:</source>
+ <translation type="unfinished">Valor:</translation>
+ </message>
+ <message>
+ <source>controller value</source>
+ <translation type="unfinished">valor del controlador</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrlBase</name>
+ <message>
+ <source>MusE: Edit Controller Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Posiciďż˝ de tiempo</translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create New Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished">Valor</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="unfinished">Controlador</translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation type="unfinished">Banco-H</translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation type="unfinished">Banco-L</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">apagado</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Cancelar</translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Channel:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditEventDialog</name>
+ <message>
+ <source>Ok</source>
+ <translation type="obsolete">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>EditInstrumentBase</name>
+ <message>
+ <source>MusE: Instrument Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patches</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High Bank:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low Bank:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <comment>dont care</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch/Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Borrar</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum</source>
+ <translation type="unfinished">Percusiďż˝</translation>
+ </message>
+ <message>
+ <source>GM</source>
+ <translation type="unfinished">GM</translation>
+ </message>
+ <message>
+ <source>GS</source>
+ <translation type="unfinished">GS</translation>
+ </message>
+ <message>
+ <source>XG</source>
+ <translation type="unfinished">XG</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="unfinished">Controlador</translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Nombre</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Tipo</translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished">RPN</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished">NRPN</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Tono</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">Rango</translation>
+ </message>
+ <message>
+ <source>Min</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="unfinished">Lista de controladores definidos</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="unfinished">Esta es la lista de controladores definidos en MusE.</translation>
+ </message>
+ <message>
+ <source>SysEx</source>
+ <translation type="unfinished">Sistema Exclusivo</translation>
+ </message>
+ <message>
+ <source>Initialization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hex Entry:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation type="unfinished">Herramientas</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished">Nueva</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Nuevo</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished">Abrir</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="unfinished">&amp;Abrir...</translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished">Guardar</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished">&amp;Guardar</translation>
+ </message>
+ <message>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="unfinished">Guardar como</translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="unfinished">Guardar &amp;Como...</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="unfinished">Salir</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished">&amp;Salir</translation>
+ </message>
+</context>
+<context>
+ <name>EditMetaDialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Posiciďż˝ de tiempo</translation>
+ </message>
+ <message>
+ <source>Meta Type</source>
+ <translation type="obsolete">Tipo de Meta</translation>
+ </message>
+ <message>
+ <source>Enter Hex</source>
+ <translation type="obsolete">Introduzca en Hexadecimal</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Meta Event</source>
+ <translation type="obsolete">MusE: Introduzca evento Meta</translation>
+ </message>
+</context>
+<context>
+ <name>EditMetaDialogBase</name>
+ <message>
+ <source>MusE: Enter Meta Event</source>
+ <translation type="unfinished">MusE: Introduzca evento Meta</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+ <message>
+ <source>TextLabel1</source>
+ <translation type="unfinished">EtiquetaTexto1</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished">Posiciďż˝ de tiempo</translation>
+ </message>
+ <message>
+ <source>Meta Type:</source>
+ <translation type="unfinished">Tipo de Meta:</translation>
+ </message>
+ <message>
+ <source>Enter Hex</source>
+ <translation type="unfinished">Escribe Hexadecimal</translation>
+ </message>
+</context>
+<context>
+ <name>EditNoteDialogBase</name>
+ <message>
+ <source>MusE: Enter Note</source>
+ <translation type="unfinished">MusE: Escribe Nota</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+ <message>
+ <source>Length:</source>
+ <translation type="unfinished">Longitud:</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished">Posiciďż˝ de tiempo</translation>
+ </message>
+ <message>
+ <source>Pitch:</source>
+ <translation type="unfinished">Tono:</translation>
+ </message>
+ <message>
+ <source>Velocity On:</source>
+ <translation type="unfinished">Velocidad On:</translation>
+ </message>
+ <message>
+ <source>Velocity Off:</source>
+ <translation type="unfinished">Velocidad Off:</translation>
+ </message>
+</context>
+<context>
+ <name>EditPAfterDialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Posiciďż˝ de tiempo</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tono</translation>
+ </message>
+ <message>
+ <source>Pressure</source>
+ <translation type="obsolete">Presiďż˝</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Poly Aftertouch</source>
+ <translation type="obsolete">Muse: Escribe el aftertouch polif�ico</translation>
+ </message>
+</context>
+<context>
+ <name>EditPitchDialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Posiciďż˝ de tiempo</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tono</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Pitch Shift</source>
+ <translation type="obsolete">MusE: Introduce el deplazamiento de tono</translation>
+ </message>
+</context>
+<context>
+ <name>EditSysexDialogBase</name>
+ <message>
+ <source>MusE: Enter SysEx</source>
+ <translation type="unfinished">MusE: Introduce el sistema exclusivo</translation>
+ </message>
+ <message>
+ <source>TimePosition:</source>
+ <translation type="unfinished">Posiciďż˝ de tiempo:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="unfinished">Comentario:</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+ <message>
+ <source>Known SysEx:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditToolBar</name>
+ <message>
+ <source>Edit Tools</source>
+ <translation type="obsolete">Editar herramientas</translation>
+ </message>
+</context>
+<context>
+ <name>EffectRack</name>
+ <message>
+ <source>effect rack</source>
+ <translation type="obsolete">rack de efectos</translation>
+ </message>
+ <message>
+ <source>move up</source>
+ <translation type="obsolete">subir</translation>
+ </message>
+ <message>
+ <source>move down</source>
+ <translation type="obsolete">bajar</translation>
+ </message>
+ <message>
+ <source>remove</source>
+ <translation type="obsolete">quitar</translation>
+ </message>
+ <message>
+ <source>bypass</source>
+ <translation type="obsolete">saltar</translation>
+ </message>
+ <message>
+ <source>show gui</source>
+ <translation type="obsolete">mostrar gui</translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation type="obsolete">nuevo</translation>
+ </message>
+ <message>
+ <source>change</source>
+ <translation type="obsolete">cambiar</translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDGuiBase</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished">Formulario1</translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished">Fuente de sonido</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Cargar</translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDSynthGuiBase</name>
+ <message>
+ <source>FLUID Synth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Cargar</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dump Info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fontname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished">Fuente de sonido</translation>
+ </message>
+ <message>
+ <source>Drum Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation type="unfinished">Nivel</translation>
+ </message>
+ <message>
+ <source>Width</source>
+ <translation type="unfinished">Anchura</translation>
+ </message>
+ <message>
+ <source>Damping</source>
+ <translation type="unfinished">Amortiguamiento</translation>
+ </message>
+ <message>
+ <source>Room Size</source>
+ <translation type="unfinished">Tamaďż˝ estancia</translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished">Reverberaciďż˝</translation>
+ </message>
+ <message>
+ <source>CHANNEL SETUP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sine</source>
+ <translation type="unfinished">Seno</translation>
+ </message>
+ <message>
+ <source>Triangle</source>
+ <translation type="unfinished">Tri�gulo</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Tipo</translation>
+ </message>
+ <message>
+ <source>Number</source>
+ <translation type="unfinished">Nmero</translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished">Velocidad</translation>
+ </message>
+ <message>
+ <source>Depth</source>
+ <translation type="unfinished">Profundidad</translation>
+ </message>
+ <message>
+ <source>Chorus</source>
+ <translation type="unfinished">Coro ;-)</translation>
+ </message>
+ <message>
+ <source>Gain</source>
+ <translation type="unfinished">Ganancia</translation>
+ </message>
+ <message>
+ <source>LOADED SOUNDFONTS</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileDialogButtons</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished">Formulario1</translation>
+ </message>
+ <message>
+ <source>Global</source>
+ <translation type="unfinished">Global</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation type="unfinished">Usuario</translation>
+ </message>
+ <message>
+ <source>Project</source>
+ <translation type="unfinished">Proyecto</translation>
+ </message>
+ <message>
+ <source>Load:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Songdata +
+Cofiguration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>only
+Songdata</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FontSel</name>
+ <message>
+ <source>Size:</source>
+ <translation type="obsolete">Tamaďż˝:</translation>
+ </message>
+</context>
+<context>
+ <name>GateTimeBase</name>
+ <message>
+ <source>MusE: Modify Gate Time</source>
+ <translation type="unfinished">MusE: Modifica el timpo de puerta</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">Rango</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation type="unfinished">Todos los eventos</translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation type="unfinished">Eventos seleccionados</translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation type="unfinished">Eventos en bucle</translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation type="unfinished">Seleccionados y en bucle</translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation type="unfinished">Valores</translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation type="unfinished">Velocidad:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished">Desplazamiento:</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished">%</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>GlobalSettingsDialogBase</name>
+ <message>
+ <source>MusE: Global Settings</source>
+ <translation type="unfinished">MusE: Valores globales</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">Audio</translation>
+ </message>
+ <message>
+ <source>Mixer</source>
+ <translation type="unfinished">Mezclador</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="unfinished">dB</translation>
+ </message>
+ <message>
+ <source>min. Meter Value</source>
+ <translation type="unfinished">valor m�imo del vumeter</translation>
+ </message>
+ <message>
+ <source>min.Slider Val</source>
+ <translation type="unfinished">valor m�imo del desplazador</translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation type="unfinished">MIDI</translation>
+ </message>
+ <message>
+ <source>Ticks</source>
+ <translation type="unfinished">Ticks</translation>
+ </message>
+ <message>
+ <source>1024</source>
+ <translation type="unfinished">1024</translation>
+ </message>
+ <message>
+ <source>2048</source>
+ <translation type="unfinished">2048</translation>
+ </message>
+ <message>
+ <source>4096</source>
+ <translation type="unfinished">4096</translation>
+ </message>
+ <message>
+ <source>8172</source>
+ <translation type="unfinished">8172</translation>
+ </message>
+ <message>
+ <source>Displayed Resolution
+(Ticks/Quarternote)</source>
+ <translation type="unfinished">Resoluciďż˝ mostrada
+(ticks/negra)</translation>
+ </message>
+ <message>
+ <source>48</source>
+ <translation type="unfinished">48</translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation type="unfinished">96</translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation type="unfinished">192</translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation type="unfinished">384</translation>
+ </message>
+ <message>
+ <source>768</source>
+ <translation type="unfinished">768</translation>
+ </message>
+ <message>
+ <source>1536</source>
+ <translation type="unfinished">1536</translation>
+ </message>
+ <message>
+ <source>3072</source>
+ <translation type="unfinished">3072</translation>
+ </message>
+ <message>
+ <source>6144</source>
+ <translation type="unfinished">6144</translation>
+ </message>
+ <message>
+ <source>12288</source>
+ <translation type="unfinished">12288</translation>
+ </message>
+ <message>
+ <source>RTC Resolution
+(Ticks/Sec)</source>
+ <translation type="unfinished">Resoluciďż˝ del reloj
+(Ticks/segundo)</translation>
+ </message>
+ <message>
+ <source>GUI</source>
+ <translation type="unfinished">GUI</translation>
+ </message>
+ <message>
+ <source>/sec</source>
+ <translation type="unfinished">/seg</translation>
+ </message>
+ <message>
+ <source>GUI Refresh Rate</source>
+ <translation type="unfinished">Velocidad de refresco del GUI</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished">&amp;Aplicar</translation>
+ </message>
+ <message>
+ <source>&amp;Ok</source>
+ <translation type="unfinished">Ac&amp;eptar</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Cancelar</translation>
+ </message>
+ <message>
+ <source>Help Browser:</source>
+ <translation type="unfinished">Navegador de ayuda:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start Muse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with last song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start song:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Views</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>y-pos</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>x-pos</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Big Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished">Arreglador</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cur</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>set current values</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with template: default.med</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show splash screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>use JACK freewheel mode if possible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IIWUGuiBase</name>
+ <message>
+ <source>Form1</source>
+ <translation type="obsolete">Formulario1</translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="obsolete">Fuente de sonido</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="obsolete">Cargar</translation>
+ </message>
+</context>
+<context>
+ <name>IIWUSynthGuiBase</name>
+ <message>
+ <source>IIWU Synth</source>
+ <translation type="obsolete">Sintetizador IIWU</translation>
+ </message>
+ <message>
+ <source>Gain</source>
+ <translation type="obsolete">Ganancia</translation>
+ </message>
+ <message>
+ <source>Room Size</source>
+ <translation type="obsolete">Tamaďż˝ estancia</translation>
+ </message>
+ <message>
+ <source>Damping</source>
+ <translation type="obsolete">Amortiguamiento</translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation type="obsolete">Nivel</translation>
+ </message>
+ <message>
+ <source>Width</source>
+ <translation type="obsolete">Anchura</translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="obsolete">Velocidad</translation>
+ </message>
+ <message>
+ <source>Depth</source>
+ <translation type="obsolete">Profundidad</translation>
+ </message>
+ <message>
+ <source>Number</source>
+ <translation type="obsolete">Nmero</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Tipo</translation>
+ </message>
+ <message>
+ <source>Sine</source>
+ <translation type="obsolete">Seno</translation>
+ </message>
+ <message>
+ <source>Triangle</source>
+ <translation type="obsolete">Tri�gulo</translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="obsolete">Reverberaciďż˝</translation>
+ </message>
+ <message>
+ <source>Chorus</source>
+ <translation type="obsolete">Coro ;-)</translation>
+ </message>
+ <message>
+ <source>Pop</source>
+ <translation type="obsolete">Pop 8-?</translation>
+ </message>
+ <message>
+ <source>Push</source>
+ <translation type="obsolete">Empuje</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation type="obsolete">...</translation>
+ </message>
+ <message>
+ <source>show iiwusynth controls</source>
+ <translation type="obsolete">mostrar controles del sintetizador iiwu</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="obsolete">Cargar</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Guardar</translation>
+ </message>
+</context>
+<context>
+ <name>LMaster</name>
+ <message>
+ <source>new tempo</source>
+ <translation type="obsolete">nuevo tempo</translation>
+ </message>
+ <message>
+ <source>new signature</source>
+ <translation type="obsolete">nuevo compďż˝</translation>
+ </message>
+ <message>
+ <source>Meter</source>
+ <translation type="obsolete">Metr�omo</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation type="obsolete">Tiempo</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Tipo</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="obsolete">Valor</translation>
+ </message>
+ <message>
+ <source>MusE: Mastertrack</source>
+ <translation type="obsolete">MusE: Pista maestra</translation>
+ </message>
+ <message>
+ <source>Tempo</source>
+ <translation type="obsolete">Tempo</translation>
+ </message>
+ <message>
+ <source>Timesig</source>
+ <translation type="obsolete">compďż˝</translation>
+ </message>
+</context>
+<context>
+ <name>ListEdit</name>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Editar</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Cortar</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Copiar</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Pegar</translation>
+ </message>
+ <message>
+ <source>List Tools</source>
+ <translation type="obsolete">Lista de herramientas</translation>
+ </message>
+ <message>
+ <source>Insert Tools</source>
+ <translation type="obsolete">Insertar herramientas</translation>
+ </message>
+ <message>
+ <source>Delete Events</source>
+ <translation type="obsolete">Borrar eventos</translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation type="obsolete">Insertar nota</translation>
+ </message>
+ <message>
+ <source>insert Note</source>
+ <translation type="obsolete">insertar Nota</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="obsolete">Insertar sistema exclusivo</translation>
+ </message>
+ <message>
+ <source>insert SysEx</source>
+ <translation type="obsolete">insertar sistema exclusivo</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="obsolete">Insertar controlador</translation>
+ </message>
+ <message>
+ <source>insert Ctrl</source>
+ <translation type="obsolete">insertar controlador</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="obsolete">Insertar Meta</translation>
+ </message>
+ <message>
+ <source>insert Meta</source>
+ <translation type="obsolete">insertar Meta</translation>
+ </message>
+ <message>
+ <source>Insert Pitch</source>
+ <translation type="obsolete">Insertar Tono</translation>
+ </message>
+ <message>
+ <source>insert Pitch</source>
+ <translation type="obsolete">insertar Tono</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="obsolete">Insertar AfterTouch de canal</translation>
+ </message>
+ <message>
+ <source>insert Channel Aftertouch</source>
+ <translation type="obsolete">insertar AfterTouch de canal</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="obsolete">Insertar AfterTouch de tecla</translation>
+ </message>
+ <message>
+ <source>insert Poly Aftertouch</source>
+ <translation type="obsolete">insertar AfterTouch Polif�ico</translation>
+ </message>
+ <message>
+ <source>Tick</source>
+ <translation type="obsolete">Tick</translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation type="obsolete">Compďż˝</translation>
+ </message>
+ <message>
+ <source>Typ</source>
+ <translation type="obsolete">Tip</translation>
+ </message>
+ <message>
+ <source>Ch</source>
+ <translation type="obsolete">Cn</translation>
+ </message>
+ <message>
+ <source>Val A</source>
+ <translation type="obsolete">Val A</translation>
+ </message>
+ <message>
+ <source>Val B</source>
+ <translation type="obsolete">Val B</translation>
+ </message>
+ <message>
+ <source>Val C</source>
+ <translation type="obsolete">Val C</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="obsolete">Lon</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="obsolete">Comentario</translation>
+ </message>
+</context>
+<context>
+ <name>MITTransposeBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Transpose</source>
+ <translation type="unfinished">MusE: Plugin de entrada MIDI : Transposiciďż˝</translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation type="unfinished">Encendido</translation>
+ </message>
+ <message>
+ <source>TriggerKey</source>
+ <translation type="unfinished">Tecla de salto</translation>
+ </message>
+ <message>
+ <source>Transpose:</source>
+ <translation type="unfinished">Trasponer:</translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation type="unfinished">+0</translation>
+ </message>
+</context>
+<context>
+ <name>MPConfig</name>
+ <message>
+ <source>none</source>
+ <translation type="obsolete">ninguno</translation>
+ </message>
+ <message>
+ <source>other raw ...</source>
+ <translation type="obsolete">otro crudo (raw) ...</translation>
+ </message>
+ <message>
+ <source>MusE: Midi Port Table</source>
+ <translation type="obsolete">MusE: Tabla de puertos MIDI</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Puerto</translation>
+ </message>
+ <message>
+ <source>GUI</source>
+ <translation type="obsolete">GUI</translation>
+ </message>
+ <message>
+ <source>Rec</source>
+ <translation type="obsolete">Grabar</translation>
+ </message>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">Instrumento</translation>
+ </message>
+ <message>
+ <source>Device Name</source>
+ <translation type="obsolete">Nombre de dispositivo</translation>
+ </message>
+ <message>
+ <source>State</source>
+ <translation type="obsolete">Estado</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="obsolete">desconocido</translation>
+ </message>
+</context>
+<context>
+ <name>MRConfigBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Remote Control</source>
+ <translation type="unfinished">MusE: Pluginde entrada MIDI : Control remoto</translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation type="unfinished">Activar</translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation type="unfinished">Encendido</translation>
+ </message>
+ <message>
+ <source>Actions</source>
+ <translation type="unfinished">Acciones</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation type="unfinished">Parar</translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation type="unfinished">Grabar</translation>
+ </message>
+ <message>
+ <source>Goto Left Mark</source>
+ <translation type="unfinished">Ir ala marca izquierda</translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation type="unfinished">Reproducir</translation>
+ </message>
+</context>
+<context>
+ <name>MTScale</name>
+ <message>
+ <source>bar scale</source>
+ <translation type="obsolete">escala de compases</translation>
+ </message>
+</context>
+<context>
+ <name>MarkerView</name>
+ <message>
+ <source>Bar:Beat:Tick</source>
+ <translation type="obsolete">Barra:Golpe:Tick</translation>
+ </message>
+ <message>
+ <source>Hr:Mn:Sc:Fr:Sf</source>
+ <translation type="obsolete">Hr:Mn:Sg:Fr:Sf</translation>
+ </message>
+ <message>
+ <source>Lock</source>
+ <translation type="obsolete">Bloquear</translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="obsolete">Texto</translation>
+ </message>
+ <message>
+ <source>Marker Properties</source>
+ <translation type="obsolete">Propiedades del marcador</translation>
+ </message>
+ <message>
+ <source>MusE: Marker</source>
+ <translation type="obsolete">MusE: Marcador</translation>
+ </message>
+ <message>
+ <source>add marker</source>
+ <translation type="obsolete">a�dir marcador</translation>
+ </message>
+ <message>
+ <source>Add Marker</source>
+ <translation type="obsolete">A�dir marcador</translation>
+ </message>
+ <message>
+ <source>delete marker</source>
+ <translation type="obsolete">borrar marcador</translation>
+ </message>
+ <message>
+ <source>Delete Marker</source>
+ <translation type="obsolete">Borrar Marcador</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Archivo</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Editar</translation>
+ </message>
+</context>
+<context>
+ <name>MasterEdit</name>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Cursor</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="obsolete">Snap</translation>
+ </message>
+ <message>
+ <source>time at cursor position</source>
+ <translation type="obsolete">tiempo en la posiciďż˝ del cursor</translation>
+ </message>
+ <message>
+ <source>tempo at cursor position</source>
+ <translation type="obsolete">tempo en la posiciďż˝ del cursor</translation>
+ </message>
+ <message>
+ <source>CurPos </source>
+ <translation type="obsolete">Posiciďż˝ del cursor </translation>
+ </message>
+ <message>
+ <source>tempo at current position</source>
+ <translation type="obsolete">tempo en la posiciďż˝ actual</translation>
+ </message>
+ <message>
+ <source>time signature at current position</source>
+ <translation type="obsolete">compďż˝ en la posiciďż˝ actual</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Maestro</translation>
+ </message>
+ <message>
+ <source>MusE: Mastertrack</source>
+ <translation type="obsolete">Muse: Pista Maestra</translation>
+ </message>
+ <message>
+ <source>edit tools</source>
+ <translation type="obsolete">editar herramientas</translation>
+ </message>
+ <message>
+ <source>EnableMaster</source>
+ <translation type="obsolete">Habilitar maestro</translation>
+ </message>
+ <message>
+ <source>use master track</source>
+ <translation type="obsolete">usar pista maestra</translation>
+ </message>
+ <message>
+ <source>Info</source>
+ <translation type="obsolete">Info</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Apagado</translation>
+ </message>
+</context>
+<context>
+ <name>MetronomeConfigBase</name>
+ <message>
+ <source>MusE: Metronome Config</source>
+ <translation type="obsolete">MusE: Configuraci� del metr�omo</translation>
+ </message>
+ <message>
+ <source>Metronome</source>
+ <translation type="obsolete">Metr�omo</translation>
+ </message>
+ <message>
+ <source>Audio Beep</source>
+ <translation type="obsolete">Bip de audio</translation>
+ </message>
+ <message>
+ <source>MIDI Click</source>
+ <translation type="obsolete">Click MIDI</translation>
+ </message>
+ <message>
+ <source>Midi Channel</source>
+ <translation type="obsolete">Canal MIDI</translation>
+ </message>
+ <message>
+ <source>Measure Note</source>
+ <translation type="obsolete">Nota de compďż˝</translation>
+ </message>
+ <message>
+ <source>Measure Velocity</source>
+ <translation type="obsolete">Velocidad de compďż˝</translation>
+ </message>
+ <message>
+ <source>Beat Velocity</source>
+ <translation type="obsolete">Velocidad de barra</translation>
+ </message>
+ <message>
+ <source>Beat Note</source>
+ <translation type="obsolete">Nota de barra</translation>
+ </message>
+ <message>
+ <source>Midi Port</source>
+ <translation type="obsolete">Puerto MIDI</translation>
+ </message>
+ <message>
+ <source>Precount</source>
+ <translation type="obsolete">Cuenta atrďż˝</translation>
+ </message>
+ <message>
+ <source>enable</source>
+ <translation type="obsolete">habilitada</translation>
+ </message>
+ <message>
+ <source>Bars</source>
+ <translation type="obsolete">Compases</translation>
+ </message>
+ <message>
+ <source>From Mastertrack</source>
+ <translation type="obsolete">desde la pista Mestra</translation>
+ </message>
+ <message>
+ <source>/</source>
+ <translation type="obsolete">/</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation type="obsolete">compďż˝</translation>
+ </message>
+ <message>
+ <source>Prerecord</source>
+ <translation type="obsolete">pre-grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>Preroll</source>
+ <translation type="obsolete">pre-escucha</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="obsolete">&amp;Aplicar</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">Ac&amp;eptar</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>MidiController</name>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Velocidad</translation>
+ </message>
+</context>
+<context>
+ <name>MidiControllerEditDialog</name>
+ <message>
+ <source>MusE: save midi controller list</source>
+ <translation type="obsolete">MusE: guardar lista de controladores MIDI</translation>
+ </message>
+ <message>
+ <source>MusE: load midi controller list</source>
+ <translation type="obsolete">MusE: Cargar lista de controladores MIDI</translation>
+ </message>
+</context>
+<context>
+ <name>MidiControllerEditDialogBase</name>
+ <message>
+ <source>MusE: Define Midi Controller</source>
+ <translation type="unfinished">MusE: Define controlador MIDI</translation>
+ </message>
+ <message>
+ <source>replace controller set</source>
+ <translation type="obsolete">reemplazar conjunto de controladores</translation>
+ </message>
+ <message>
+ <source>merge controller set</source>
+ <translation type="obsolete">unir conjunto de controladores</translation>
+ </message>
+ <message>
+ <source>save controller set as</source>
+ <translation type="obsolete">guardar conjunto de controladores como</translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation type="unfinished">Nombre </translation>
+ </message>
+ <message>
+ <source>Type </source>
+ <translation type="unfinished">Tipo </translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation type="unfinished">Control-H</translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation type="unfinished">Control-L</translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation type="unfinished">Valor m�imo</translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation type="unfinished">Valor m�imo</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="unfinished">lista de controladores definidos</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="unfinished">Esta es la lista de controladores definidos por MusE.</translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation type="unfinished">Propiedades</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Nombre</translation>
+ </message>
+ <message>
+ <source>Max Value</source>
+ <translation type="unfinished">Valor m�imo</translation>
+ </message>
+ <message>
+ <source>Min Value</source>
+ <translation type="unfinished">Valor m�imo</translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation type="unfinished">Control7 :-?</translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation type="unfinished">Control14</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished">RPN</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished">NRPN</translation>
+ </message>
+ <message>
+ <source>XG-SysEx</source>
+ <translation type="obsolete">Sys-Ex-XG</translation>
+ </message>
+ <message>
+ <source>SysEx</source>
+ <translation type="obsolete">Sistema Exclusivo</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Tipo</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nuevo</translation>
+ </message>
+ <message>
+ <source>create new entry</source>
+ <translation type="unfinished">crear entrada nueva</translation>
+ </message>
+ <message>
+ <source>pressing the New button you create a new entry
+in the MusE list of defined controllers</source>
+ <translation type="unfinished">pulsando el bot� se crear�una nueva
+clase de controladores en la lista de MusE.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Borrar</translation>
+ </message>
+ <message>
+ <source>delete selected entry</source>
+ <translation type="unfinished">borra la clase seleccionada</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;Aceptar</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Cancelar</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Managed Controller for Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="unfinished">Canal</translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Tono</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">Rango</translation>
+ </message>
+</context>
+<context>
+ <name>MidiFileConfig</name>
+ <message>
+ <source>Enable extended smf format</source>
+ <translation type="obsolete">Habilita el formato extendido de smf</translation>
+ </message>
+ <message>
+ <source>Division</source>
+ <translation type="obsolete">Divisiďż˝</translation>
+ </message>
+ <message>
+ <source>Copyright</source>
+ <translation type="obsolete">Copyright</translation>
+ </message>
+ <message>
+ <source>Config exported Midi Files</source>
+ <translation type="obsolete">Configurar archivos MIDI exportados</translation>
+ </message>
+ <message>
+ <source>MusE: Config exported Midi Files</source>
+ <translation type="obsolete">MusE: configurar archivos MIDi exportados</translation>
+ </message>
+</context>
+<context>
+ <name>MidiFilterConfigBase</name>
+ <message>
+ <source>MusE: Midi Input Filter</source>
+ <translation type="obsolete">MusE: Filtro de entrada MIDI</translation>
+ </message>
+ <message>
+ <source>Record Filter</source>
+ <translation type="obsolete">Filtro de grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>Note On</source>
+ <translation type="obsolete">Nota on</translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="obsolete">Presi� polif�ica</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="obsolete">Caontrolador</translation>
+ </message>
+ <message>
+ <source>Program Change</source>
+ <translation type="obsolete">Cambio de programa</translation>
+ </message>
+ <message>
+ <source>After Touch</source>
+ <translation type="obsolete">After Touch</translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="obsolete">Rueda de bend</translation>
+ </message>
+ <message>
+ <source>Sysex</source>
+ <translation type="obsolete">Sistema exclusivo</translation>
+ </message>
+ <message>
+ <source>Thru Filter</source>
+ <translation type="obsolete">Filtro Thru</translation>
+ </message>
+ <message>
+ <source>Controller Filter</source>
+ <translation type="obsolete">Filtrar controlador</translation>
+ </message>
+ <message>
+ <source>Channel Filter</source>
+ <translation type="obsolete">Filtro de canal</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation type="obsolete">14</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation type="obsolete">10</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation type="obsolete">6</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation type="obsolete">12</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation type="obsolete">4</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation type="obsolete">2</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation type="obsolete">9</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation type="obsolete">8</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation type="obsolete">3</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation type="obsolete">13</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation type="obsolete">15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation type="obsolete">16</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation type="obsolete">7</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation type="obsolete">11</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation type="obsolete">5</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation type="obsolete">1</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>MidiInputTransformDialog</name>
+ <message>
+ <source>New</source>
+ <translation type="obsolete">Nueva</translation>
+ </message>
+</context>
+<context>
+ <name>MidiInputTransformDialogBase</name>
+ <message>
+ <source>MusE: Midi Input Transformator</source>
+ <translation type="obsolete">MusE: Transformador de entrada MIDI</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="obsolete">Filtrar</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="obsolete">Todo</translation>
+ </message>
+ <message>
+ <source>Equal</source>
+ <translation type="obsolete">Igual</translation>
+ </message>
+ <message>
+ <source>Unequal</source>
+ <translation type="obsolete">Diferente</translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="obsolete">Nota</translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="obsolete">Presi� poif�ica</translation>
+ </message>
+ <message>
+ <source>Control Change</source>
+ <translation type="obsolete">Cambio de control</translation>
+ </message>
+ <message>
+ <source>Aftertouch</source>
+ <translation type="obsolete">AfterTouch</translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="obsolete">Rueda de modulaciďż˝</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="obsolete">NRPN</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="obsolete">RPN</translation>
+ </message>
+ <message>
+ <source>Value 2</source>
+ <translation type="obsolete">Valor 2</translation>
+ </message>
+ <message>
+ <source>Value 1</source>
+ <translation type="obsolete">Valor 1</translation>
+ </message>
+ <message>
+ <source>Event Type</source>
+ <translation type="obsolete">Tipo de Evento</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="obsolete">Ignorar</translation>
+ </message>
+ <message>
+ <source>Higher</source>
+ <translation type="obsolete">Mayor</translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="obsolete">Menor</translation>
+ </message>
+ <message>
+ <source>Inside</source>
+ <translation type="obsolete">Entre</translation>
+ </message>
+ <message>
+ <source>Outside</source>
+ <translation type="obsolete">Fuera</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="obsolete">Canal</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Puerto</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="obsolete">Procesando</translation>
+ </message>
+ <message>
+ <source>Keep</source>
+ <translation type="obsolete">Mantener</translation>
+ </message>
+ <message>
+ <source>Fix</source>
+ <translation type="obsolete">Arreglar</translation>
+ </message>
+ <message>
+ <source>Plus</source>
+ <translation type="obsolete">Mďż˝</translation>
+ </message>
+ <message>
+ <source>Minus</source>
+ <translation type="obsolete">Menos</translation>
+ </message>
+ <message>
+ <source>Multiply</source>
+ <translation type="obsolete">Multiplicar</translation>
+ </message>
+ <message>
+ <source>Divide</source>
+ <translation type="obsolete">Dividir</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Invertir</translation>
+ </message>
+ <message>
+ <source>ScaleMap</source>
+ <translation type="obsolete">Mapa de escalado</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation type="obsolete">cambiar</translation>
+ </message>
+ <message>
+ <source>Dyn</source>
+ <translation type="obsolete">Din�ico</translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="obsolete">Aleatorio</translation>
+ </message>
+ <message>
+ <source>Modules</source>
+ <translation type="obsolete">M�ulos</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation type="obsolete">1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation type="obsolete">2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation type="obsolete">3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation type="obsolete">4</translation>
+ </message>
+ <message>
+ <source>enable modul 1</source>
+ <translation type="obsolete">habilitar m�ulo 1</translation>
+ </message>
+ <message>
+ <source>enable modul 2</source>
+ <translation type="obsolete">habilitar m�ulo 2</translation>
+ </message>
+ <message>
+ <source>enable modul 3</source>
+ <translation type="obsolete">habilitar m�ulo 3</translation>
+ </message>
+ <message>
+ <source>enable modul 4</source>
+ <translation type="obsolete">habilitar m�ulo 4</translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="obsolete">Preselecciďż˝</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="obsolete">Nombre:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="obsolete">Comentario:</translation>
+ </message>
+ <message>
+ <source>Function</source>
+ <translation type="obsolete">Funciďż˝</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nueva</translation>
+ </message>
+ <message>
+ <source>create new preset</source>
+ <translation type="obsolete">crea nueva preselecciďż˝</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;Borrar</translation>
+ </message>
+ <message>
+ <source>delete preset</source>
+ <translation type="obsolete">borra la preselecciďż˝</translation>
+ </message>
+ <message>
+ <source>&amp;Dismiss</source>
+ <translation type="obsolete">&amp;Ocultar</translation>
+ </message>
+ <message>
+ <source>PresetList</source>
+ <translation type="obsolete">Lista de Preselecciones</translation>
+ </message>
+</context>
+<context>
+ <name>MidiPortRouteBase</name>
+ <message>
+ <source>MusE: Midi Port Routing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Port 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input</source>
+ <translation type="unfinished">Entrada</translation>
+ </message>
+</context>
+<context>
+ <name>MidiRawDeviceDialogBase</name>
+ <message>
+ <source>MusE: raw midi device configuration</source>
+ <translation type="obsolete">NusE: Condifuraciďż˝ de dispositivo MIDI directo</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="obsolete">Nombre</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation type="obsolete">Dispositivo</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Tipo</translation>
+ </message>
+ <message>
+ <source>Virt. Ports</source>
+ <translation type="obsolete">Puertos virtuales</translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="obsolete">Velocidad</translation>
+ </message>
+ <message>
+ <source>Handshaking</source>
+ <translation type="obsolete">Control de flujo</translation>
+ </message>
+ <message>
+ <source>Device Properties</source>
+ <translation type="obsolete">Propiedades del dispositivo</translation>
+ </message>
+ <message>
+ <source>Virt.Ports</source>
+ <translation type="obsolete">Ports Virtuales</translation>
+ </message>
+ <message>
+ <source>Raw Device</source>
+ <translation type="obsolete">Dispositivo directo</translation>
+ </message>
+ <message>
+ <source>Serial Port</source>
+ <translation type="obsolete">Puerto s�ie</translation>
+ </message>
+ <message>
+ <source>Pipe</source>
+ <translation type="obsolete">Tuberia</translation>
+ </message>
+ <message>
+ <source>Device Path</source>
+ <translation type="obsolete">Direcciďż˝ del dispositivo</translation>
+ </message>
+ <message>
+ <source>9600</source>
+ <translation type="obsolete">9600</translation>
+ </message>
+ <message>
+ <source>19200</source>
+ <translation type="obsolete">19200</translation>
+ </message>
+ <message>
+ <source>38400</source>
+ <translation type="obsolete">38400</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="obsolete">Ninguno</translation>
+ </message>
+ <message>
+ <source>RTS/CTS</source>
+ <translation type="obsolete">RTS/CTS</translation>
+ </message>
+ <message>
+ <source>Xon/Xoff</source>
+ <translation type="obsolete">Xon/Xoff</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nuevo</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;Borrar</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">&amp;Aceptar</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>MidiStrip</name>
+ <message>
+ <source>Var</source>
+ <translation type="obsolete">Var</translation>
+ </message>
+ <message>
+ <source>Rev</source>
+ <translation type="obsolete">Rev</translation>
+ </message>
+ <message>
+ <source>Cho</source>
+ <translation type="obsolete">Cho</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="obsolete">apagado</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="obsolete">dB</translation>
+ </message>
+ <message>
+ <source>Pan</source>
+ <translation type="obsolete">Bal</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="obsolete">grabar</translation>
+ </message>
+ <message>
+ <source>mute</source>
+ <translation type="obsolete">silencio</translation>
+ </message>
+ <message>
+ <source>pre fader listening</source>
+ <translation type="obsolete">monitorizar pre fader</translation>
+ </message>
+</context>
+<context>
+ <name>MidiSyncConfigBase</name>
+ <message>
+ <source>MusE: Midi Sync</source>
+ <translation type="unfinished">MusE: Sincronizaciďż˝ MIDI</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="unfinished">Aplicar</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation type="unfinished">hora</translation>
+ </message>
+ <message>
+ <source>h</source>
+ <translation type="unfinished">h</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation type="unfinished">minuto</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished">m</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation type="unfinished">segundo</translation>
+ </message>
+ <message>
+ <source>s</source>
+ <translation type="unfinished">s</translation>
+ </message>
+ <message>
+ <source>frame</source>
+ <translation type="unfinished">frame</translation>
+ </message>
+ <message>
+ <source>f</source>
+ <translation type="unfinished">f</translation>
+ </message>
+ <message>
+ <source>subframe</source>
+ <translation type="unfinished">sub-frame</translation>
+ </message>
+ <message>
+ <source>24</source>
+ <translation type="unfinished">24</translation>
+ </message>
+ <message>
+ <source>25</source>
+ <translation type="unfinished">25</translation>
+ </message>
+ <message>
+ <source>30D</source>
+ <translation type="unfinished">30D</translation>
+ </message>
+ <message>
+ <source>30N</source>
+ <translation type="unfinished">30N</translation>
+ </message>
+ <message>
+ <source>Id:</source>
+ <translation type="unfinished">Id:</translation>
+ </message>
+ <message>
+ <source>device id</source>
+ <translation type="unfinished">id de dispositivo</translation>
+ </message>
+ <message>
+ <source>Port:</source>
+ <translation type="obsolete">Puerto:</translation>
+ </message>
+ <message>
+ <source>midi port</source>
+ <translation type="obsolete">puerto MIDI</translation>
+ </message>
+ <message>
+ <source>Sync Source</source>
+ <translation type="unfinished">Fuente de Sincronizaciďż˝</translation>
+ </message>
+ <message>
+ <source>accept MTC</source>
+ <translation type="unfinished">aceptar MTC</translation>
+ </message>
+ <message>
+ <source>accept Midi Clock</source>
+ <translation type="unfinished">aceptar MIDI clock</translation>
+ </message>
+ <message>
+ <source>accept MMC</source>
+ <translation type="unfinished">aceptar MMC</translation>
+ </message>
+ <message>
+ <source>Sync Gen</source>
+ <translation type="unfinished">Generar Sync</translation>
+ </message>
+ <message>
+ <source>Midi Time Code (MTC)</source>
+ <translation type="unfinished">C�igo de Tiempo Midi (MTC)</translation>
+ </message>
+ <message>
+ <source>Midi Clock</source>
+ <translation type="unfinished">Reloj Midi</translation>
+ </message>
+ <message>
+ <source>Midi Machine Control (MMC)</source>
+ <translation type="unfinished">Control de m�uina MIDI (MMC)</translation>
+ </message>
+ <message>
+ <source>Sync Mode</source>
+ <translation type="unfinished">Modo de sincronizaciďż˝</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="unfinished">Maestro</translation>
+ </message>
+ <message>
+ <source>Slave</source>
+ <translation type="unfinished">Esclavo</translation>
+ </message>
+ <message>
+ <source>all</source>
+ <translation type="obsolete">todo</translation>
+ </message>
+ <message>
+ <source>MTC</source>
+ <translation type="unfinished">MTC</translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation type="unfinished">Tipo:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished">Desplazamiento:</translation>
+ </message>
+</context>
+<context>
+ <name>MidiTrackInfoBase</name>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished">MusE: Informaciďż˝ de pista</translation>
+ </message>
+ <message>
+ <source>output channel</source>
+ <translation type="obsolete">canal de salida</translation>
+ </message>
+ <message>
+ <source>all midi events are send to this output channel</source>
+ <translation type="unfinished">todos los eventos MIDI se envian a �te canal de salida</translation>
+ </message>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished">Informaciďż˝ de Pista</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished">%</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished">Nombre de Pista</translation>
+ </message>
+ <message>
+ <source>output port</source>
+ <translation type="obsolete">puerto de salida</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">apagado</translation>
+ </message>
+ <message>
+ <source>change stereo position</source>
+ <translation type="obsolete">cambiar posici� estereof�ica</translation>
+ </message>
+ <message>
+ <source>OCh.</source>
+ <translation type="unfinished">OCh.</translation>
+ </message>
+ <message>
+ <source>MidiThru</source>
+ <translation type="obsolete">Midi Thru</translation>
+ </message>
+ <message>
+ <source>???</source>
+ <translation type="unfinished">???</translation>
+ </message>
+ <message>
+ <source>select instrument patch</source>
+ <translation type="obsolete">selecciona el grupo de instrumento</translation>
+ </message>
+ <message>
+ <source>Transp.</source>
+ <translation type="unfinished">Transposiciďż˝</translation>
+ </message>
+ <message>
+ <source>Volume</source>
+ <translation type="obsolete">Volumen</translation>
+ </message>
+ <message>
+ <source>Channel Info</source>
+ <translation type="unfinished">Informaciďż˝ de Canal</translation>
+ </message>
+ <message>
+ <source>Pan</source>
+ <translation type="obsolete">Balance</translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished">Delay</translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation type="unfinished">Banco-H</translation>
+ </message>
+ <message>
+ <source>Compr.</source>
+ <translation type="unfinished">Compr.</translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation type="unfinished">Banco-L</translation>
+ </message>
+ <message>
+ <source>Progr.</source>
+ <translation type="unfinished">Progr.</translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Velocidad</translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished">Longitud</translation>
+ </message>
+ <message>
+ <source>input ports</source>
+ <translation type="obsolete">puertos de entrada</translation>
+ </message>
+ <message>
+ <source>IChan.</source>
+ <translation type="unfinished">Canal de entrada</translation>
+ </message>
+ <message>
+ <source>input channels</source>
+ <translation type="obsolete">Canales de entrada</translation>
+ </message>
+ <message>
+ <source>Events from all configured channels are
+recorded to this track.
+You can specify more than one channel for
+recording:
+ 1 2 3 record from channel 1 2 and 3
+ 1-3 same
+ 1-3 5<byte value="x9"/> record from channel 1 2 3 and 5</source>
+ <translation type="unfinished">Los eventos de todos los canales configurados
+se graban en esta pista.
+Puedes especificar mďż˝ de un canal para grabar:
+ 1 2 3<byte value="x9"/>Graba desde los canales 1, 2 y 3
+ 1-3<byte value="x9"/><byte value="x9"/>Lo mismo
+ 1-3 5<byte value="x9"/>Graba desde los canales 1, 2, 3 y 5</translation>
+ </message>
+ <message>
+ <source>Rec</source>
+ <translation type="obsolete">Grabar</translation>
+ </message>
+ <message>
+ <source>Output Channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Note Length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Port</source>
+ <translation type="unfinished">Puerto de salida</translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Compress Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Ports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Channels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select Instrument Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select LSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select MSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument High Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument Low Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument/Program/Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformDialogBase</name>
+ <message>
+ <source>MusE: Midi Transformator</source>
+ <translation type="unfinished">MusE: Transformador MIDI</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Nueva</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Borrar</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished">&amp;Aplicar</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">Ac&amp;eptar</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Cancelar</translation>
+ </message>
+ <message>
+ <source>PresetList</source>
+ <translation type="unfinished">Lista de preselecciones</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="unfinished">Procesando</translation>
+ </message>
+ <message>
+ <source>Event Type</source>
+ <translation type="unfinished">Tipo de evento</translation>
+ </message>
+ <message>
+ <source>Keep</source>
+ <translation type="unfinished">Mantener</translation>
+ </message>
+ <message>
+ <source>Fix</source>
+ <translation type="unfinished">Arreglar</translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="unfinished">Nota</translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="unfinished">Presi� polif�ica</translation>
+ </message>
+ <message>
+ <source>Control Change</source>
+ <translation type="unfinished">Cambio de control</translation>
+ </message>
+ <message>
+ <source>Aftertouch</source>
+ <translation type="unfinished">AfterTouch</translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="unfinished">Rueda de modulaciďż˝</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished">NRPN</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished">RPN</translation>
+ </message>
+ <message>
+ <source>Plus</source>
+ <translation type="unfinished">Mďż˝</translation>
+ </message>
+ <message>
+ <source>Minus</source>
+ <translation type="unfinished">Menos</translation>
+ </message>
+ <message>
+ <source>Multiply</source>
+ <translation type="unfinished">Multiplicar</translation>
+ </message>
+ <message>
+ <source>Divide</source>
+ <translation type="unfinished">Dividir</translation>
+ </message>
+ <message>
+ <source>Value 2</source>
+ <translation type="unfinished">Valor 2</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="unfinished">Invertir</translation>
+ </message>
+ <message>
+ <source>ScaleMap</source>
+ <translation type="unfinished">Escalado de mapa</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation type="unfinished">Cambiar</translation>
+ </message>
+ <message>
+ <source>Dyn</source>
+ <translation type="unfinished">Dyn</translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="unfinished">Aleatorio</translation>
+ </message>
+ <message>
+ <source>Value 1</source>
+ <translation type="unfinished">Valor 1</translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished">Longitud</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished">Posiciďż˝</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="unfinished">Filtro</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="unfinished">Todo</translation>
+ </message>
+ <message>
+ <source>Equal</source>
+ <translation type="unfinished">Igual</translation>
+ </message>
+ <message>
+ <source>Unequal</source>
+ <translation type="unfinished">Diferente</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="unfinished">Ignora</translation>
+ </message>
+ <message>
+ <source>Higher</source>
+ <translation type="unfinished">Mayor</translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="unfinished">Menor</translation>
+ </message>
+ <message>
+ <source>Inside</source>
+ <translation type="unfinished">Entre</translation>
+ </message>
+ <message>
+ <source>Outside</source>
+ <translation type="unfinished">Fuera</translation>
+ </message>
+ <message>
+ <source>Bar Range</source>
+ <translation type="unfinished">Rango de compases</translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished">Preselecciďż˝</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">Nombre:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="unfinished">Comentario:</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">Rango</translation>
+ </message>
+ <message>
+ <source>process all events</source>
+ <translation type="unfinished">procesar todos los eventos</translation>
+ </message>
+ <message>
+ <source>selected tracks</source>
+ <translation type="unfinished">seleccionar pistas</translation>
+ </message>
+ <message>
+ <source>inside loop</source>
+ <translation type="unfinished">dentro de bucle</translation>
+ </message>
+ <message>
+ <source>Function</source>
+ <translation type="unfinished">Funciďż˝</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation type="unfinished">Seleccionar</translation>
+ </message>
+ <message>
+ <source>Quantize</source>
+ <translation type="unfinished">Cuantizar</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished">Borrar</translation>
+ </message>
+ <message>
+ <source>Transform</source>
+ <translation type="unfinished">Transformar</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation type="unfinished">Insertar</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished">Copiar</translation>
+ </message>
+ <message>
+ <source>Extract</source>
+ <translation type="unfinished">Extraer</translation>
+ </message>
+ <message>
+ <source>Quantize Value</source>
+ <translation type="unfinished">Cuantizar valor</translation>
+ </message>
+ <message>
+ <source>Sysex</source>
+ <translation type="unfinished">Sistema exclusivo</translation>
+ </message>
+ <message>
+ <source>Meta</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformerDialog</name>
+ <message>
+ <source>New</source>
+ <translation type="unfinished">Nueva</translation>
+ </message>
+</context>
+<context>
+ <name>MixdownFileDialog</name>
+ <message>
+ <source>Wave Files (*.wav);;All Files (*)</source>
+ <translation type="obsolete">Archivos de onda (*.wav);;Todos los archivos(*)</translation>
+ </message>
+</context>
+<context>
+ <name>MixdownFileDialogBase</name>
+ <message>
+ <source>MusE: Set Mixdown Wavefile</source>
+ <translation type="unfinished">MusE: Selecciona el archivo de Masterizaciďż˝</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;Aceptar</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Cancelar</translation>
+ </message>
+ <message>
+ <source>File Path</source>
+ <translation type="unfinished">Directorio del archivo</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="unfinished">Canal</translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="unfinished">Est�eo</translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="unfinished">Mono</translation>
+ </message>
+ <message>
+ <source>5.1</source>
+ <translation type="unfinished">5.1</translation>
+ </message>
+ <message>
+ <source>wav,16 Bit</source>
+ <translation type="unfinished">wav, 16 bits</translation>
+ </message>
+ <message>
+ <source>wav, 24 Bit</source>
+ <translation type="unfinished">wav, 24 bits</translation>
+ </message>
+ <message>
+ <source>wav, 32 Bit (float)</source>
+ <translation type="unfinished">wav, 32 bits</translation>
+ </message>
+ <message>
+ <source>Format</source>
+ <translation type="unfinished">Formato</translation>
+ </message>
+</context>
+<context>
+ <name>Mixer</name>
+ <message>
+ <source>Mute</source>
+ <translation type="obsolete">Silencio</translation>
+ </message>
+ <message>
+ <source>MusE: Midi Mixer</source>
+ <translation type="obsolete">MusE: MExclador MIDI</translation>
+ </message>
+ <message>
+ <source>Rev</source>
+ <translation type="obsolete">Rev</translation>
+ </message>
+ <message>
+ <source>Cho</source>
+ <translation type="obsolete">Cho</translation>
+ </message>
+ <message>
+ <source>Var</source>
+ <translation type="obsolete">Var</translation>
+ </message>
+ <message>
+ <source>Pan</source>
+ <translation type="obsolete">Bal</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Maestro</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Puerto</translation>
+ </message>
+</context>
+<context>
+ <name>MusE</name>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Archivo</translation>
+ </message>
+ <message>
+ <source>Open &amp;Recent</source>
+ <translation type="unfinished">Abrir &amp;Recientes</translation>
+ </message>
+ <message>
+ <source>Save &amp;As</source>
+ <translation type="unfinished">Guardar c&amp;omo</translation>
+ </message>
+ <message>
+ <source>Config &amp;Printer</source>
+ <translation type="obsolete">Configurar &amp;Impresiďż˝</translation>
+ </message>
+ <message>
+ <source>Import Midifile</source>
+ <translation type="unfinished">Importar archivo MIDI</translation>
+ </message>
+ <message>
+ <source>Export Midifile</source>
+ <translation type="unfinished">Exportar archivo MIDI</translation>
+ </message>
+ <message>
+ <source>Import Wave File</source>
+ <translation type="unfinished">Importar archivo de audio</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation type="unfinished">&amp;Salir</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">&amp;Editar</translation>
+ </message>
+ <message>
+ <source>C&amp;ut</source>
+ <translation type="unfinished">C&amp;ortar</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">&amp;Copiar</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="unfinished">&amp;Pegar</translation>
+ </message>
+ <message>
+ <source>Delete Track</source>
+ <translation type="obsolete">Borrar pista</translation>
+ </message>
+ <message>
+ <source>Add Track</source>
+ <translation type="unfinished">A�dir Pista</translation>
+ </message>
+ <message>
+ <source>Select &amp;All</source>
+ <translation type="unfinished">Seleccion&amp;ar Todo</translation>
+ </message>
+ <message>
+ <source>&amp;Deselect All</source>
+ <translation type="unfinished">&amp;Deseleccionar Todo</translation>
+ </message>
+ <message>
+ <source>Invert &amp;Selection</source>
+ <translation type="unfinished">Invertir &amp;Selecciďż˝</translation>
+ </message>
+ <message>
+ <source>&amp;Inside Loop</source>
+ <translation type="unfinished">&amp;Interior de bucle</translation>
+ </message>
+ <message>
+ <source>&amp;Outside Loop</source>
+ <translation type="unfinished">&amp;Exterior de Bucle</translation>
+ </message>
+ <message>
+ <source>All &amp;Parts on Track</source>
+ <translation type="unfinished">Todas las &amp;Partes de la pista</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation type="unfinished">Seleccionar</translation>
+ </message>
+ <message>
+ <source>Drums</source>
+ <translation type="unfinished">Percusiďż˝</translation>
+ </message>
+ <message>
+ <source>List</source>
+ <translation type="unfinished">Lista</translation>
+ </message>
+ <message>
+ <source>Graphic</source>
+ <translation type="unfinished">Gr�ico</translation>
+ </message>
+ <message>
+ <source>Mastertrack</source>
+ <translation type="unfinished">Pista Maestra</translation>
+ </message>
+ <message>
+ <source>Midi &amp;Transform</source>
+ <translation type="unfinished">&amp;Transformaciďż˝ MIDI</translation>
+ </message>
+ <message>
+ <source>Modify Gate Time</source>
+ <translation type="unfinished">Modificar el tiempo de puerta</translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation type="unfinished">Modificar Velocidad</translation>
+ </message>
+ <message>
+ <source>Crescendo</source>
+ <translation type="unfinished">Crescendo</translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="unfinished">Transponer</translation>
+ </message>
+ <message>
+ <source>Thin Out</source>
+ <translation type="unfinished">Adelgazar? (Thin Out)</translation>
+ </message>
+ <message>
+ <source>Erase Event</source>
+ <translation type="unfinished">Borrar Evento</translation>
+ </message>
+ <message>
+ <source>Note Shift</source>
+ <translation type="unfinished">Desplazamiento de nota</translation>
+ </message>
+ <message>
+ <source>Move Clock</source>
+ <translation type="unfinished">Mover reloj</translation>
+ </message>
+ <message>
+ <source>Copy Measure</source>
+ <translation type="unfinished">Copiar compďż˝</translation>
+ </message>
+ <message>
+ <source>Erase Measure</source>
+ <translation type="unfinished">Vaciar compďż˝</translation>
+ </message>
+ <message>
+ <source>Delete Measure</source>
+ <translation type="unfinished">Borrar compďż˝</translation>
+ </message>
+ <message>
+ <source>Create Measure</source>
+ <translation type="unfinished">Crear compďż˝</translation>
+ </message>
+ <message>
+ <source>Mix Track</source>
+ <translation type="unfinished">Mezclar pista</translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation type="unfinished">MIDI</translation>
+ </message>
+ <message>
+ <source>&amp;Structure</source>
+ <translation type="unfinished">E&amp;structura</translation>
+ </message>
+ <message>
+ <source>Global Cut</source>
+ <translation type="unfinished">Corte global</translation>
+ </message>
+ <message>
+ <source>Global Insert</source>
+ <translation type="unfinished">Inserciďż˝ Global</translation>
+ </message>
+ <message>
+ <source>Global Split</source>
+ <translation type="unfinished">Particiďż˝ Global</translation>
+ </message>
+ <message>
+ <source>Copy Range</source>
+ <translation type="unfinished">Copiar Rango</translation>
+ </message>
+ <message>
+ <source>Cut Events</source>
+ <translation type="unfinished">Cortar eventos</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="obsolete">&amp;Mostrar</translation>
+ </message>
+ <message>
+ <source>Transport Panel</source>
+ <translation type="unfinished">Panel de transporte</translation>
+ </message>
+ <message>
+ <source>Bigtime window</source>
+ <translation type="unfinished">ventana BigTime</translation>
+ </message>
+ <message>
+ <source>dont follow Song</source>
+ <translation type="unfinished">no sigas la canciďż˝</translation>
+ </message>
+ <message>
+ <source>follow page</source>
+ <translation type="unfinished">sigue la p�ina</translation>
+ </message>
+ <message>
+ <source>follow continuous</source>
+ <translation type="unfinished">sigue cont�uamente</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Configuraciďż˝</translation>
+ </message>
+ <message>
+ <source>Global Settings</source>
+ <translation type="unfinished">Selecciones Globales</translation>
+ </message>
+ <message>
+ <source>follow song</source>
+ <translation type="unfinished">seguir canciďż˝</translation>
+ </message>
+ <message>
+ <source>Metronome</source>
+ <translation type="obsolete">Metr�omo</translation>
+ </message>
+ <message>
+ <source>Midi Sync</source>
+ <translation type="unfinished">Sincronizaciďż˝ MIDI</translation>
+ </message>
+ <message>
+ <source>Midi File Config</source>
+ <translation type="obsolete">Configuraciďż˝ de archivos MIDI</translation>
+ </message>
+ <message>
+ <source>Appearance settings</source>
+ <translation type="unfinished">Selecciones de apariencia</translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation type="obsolete">Sintetizador virtual</translation>
+ </message>
+ <message>
+ <source>Midi Ports</source>
+ <translation type="obsolete">Puertos MIDI</translation>
+ </message>
+ <message>
+ <source>Audio System</source>
+ <translation type="obsolete">Sistema de Audio</translation>
+ </message>
+ <message>
+ <source>Save Configuration</source>
+ <translation type="obsolete">Guardar configuraciďż˝</translation>
+ </message>
+ <message>
+ <source>Midi Input Transform</source>
+ <translation type="obsolete">Transformaciďż˝ de entrada MIDI</translation>
+ </message>
+ <message>
+ <source>Midi Input Filter</source>
+ <translation type="obsolete">Filtrado de entrada MIDI</translation>
+ </message>
+ <message>
+ <source>Midi Remote Control</source>
+ <translation type="unfinished">Control remoto MIDI</translation>
+ </message>
+ <message>
+ <source>Random Rhythm Generator</source>
+ <translation type="obsolete">generador aleatorio de ritmos</translation>
+ </message>
+ <message>
+ <source>&amp;Midi</source>
+ <translation type="unfinished">&amp;MIDI</translation>
+ </message>
+ <message>
+ <source>Mixer</source>
+ <translation type="obsolete">Mezclador</translation>
+ </message>
+ <message>
+ <source>Define Controller</source>
+ <translation type="obsolete">Define Controlador</translation>
+ </message>
+ <message>
+ <source>Input Plugins</source>
+ <translation type="unfinished">Plugins e entrada</translation>
+ </message>
+ <message>
+ <source>Reset Instr.</source>
+ <translation type="unfinished">Reinicializa Instrumento</translation>
+ </message>
+ <message>
+ <source>Init Instr.</source>
+ <translation type="unfinished">Inicializa Instruemnto</translation>
+ </message>
+ <message>
+ <source>local off</source>
+ <translation type="unfinished">apagado local</translation>
+ </message>
+ <message>
+ <source>&amp;Audio</source>
+ <translation type="unfinished">&amp;Audio</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation type="obsolete">Audio</translation>
+ </message>
+ <message>
+ <source>Cliplist</source>
+ <translation type="obsolete">Lista de Clips</translation>
+ </message>
+ <message>
+ <source>Bounce to Track</source>
+ <translation type="unfinished">Rebotar a pista</translation>
+ </message>
+ <message>
+ <source>Bounce to File</source>
+ <translation type="unfinished">Rebotar a Archivo</translation>
+ </message>
+ <message>
+ <source>Bounce</source>
+ <translation type="obsolete">Rebotar</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">A&amp;yuda</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation type="obsolete">Navegador</translation>
+ </message>
+ <message>
+ <source>&amp;About</source>
+ <translation type="obsolete">&amp;Acerca de</translation>
+ </message>
+ <message>
+ <source>About&amp;Qt</source>
+ <translation type="unfinished">Acerca de &amp;Qt</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This</source>
+ <translation type="obsolete">Qu�es esto</translation>
+ </message>
+ <message>
+ <source>MusE: load project</source>
+ <translation type="unfinished">MusE: Carga proyecto</translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Save Current Project?</source>
+ <translation type="unfinished">El proyecto actual contiene datos no guardados
+Guardamos el proyecto actual?</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished">&amp;Guardar</translation>
+ </message>
+ <message>
+ <source>&amp;Nosave</source>
+ <translation type="unfinished">&amp;No Guardar</translation>
+ </message>
+ <message>
+ <source>&amp;Abort</source>
+ <translation type="unfinished">&amp;Abortar</translation>
+ </message>
+ <message>
+ <source>MusE: Save As</source>
+ <translation type="unfinished">MusE: Guardar como</translation>
+ </message>
+ <message>
+ <source>MusE: Import Midi</source>
+ <translation type="unfinished">MusE: Importar MIDI</translation>
+ </message>
+ <message>
+ <source>MusE: Export Midi</source>
+ <translation type="unfinished">MusE: Exportar MIDI</translation>
+ </message>
+ <message>
+ <source>Nothing to edit</source>
+ <translation type="unfinished">Nada para editar</translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Load overwrites current Project:
+Save Current Project?</source>
+ <translation type="unfinished">El proyecto actual contine datos no guardados
+Cargar sobreescribe el proyecto actual:
+Guardar el proyecto actual?</translation>
+ </message>
+ <message>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished">S&amp;obre escribir</translation>
+ </message>
+ <message>
+ <source>no help found at: </source>
+ <translation type="unfinished">no se ha encontrado ayuda en: </translation>
+ </message>
+ <message>
+ <source>MusE: Open Help</source>
+ <translation type="unfinished">MusE: Abre ayuda</translation>
+ </message>
+ <message>
+ <source>to import a audio file you have first to selecta audio track</source>
+ <translation type="obsolete">para importar un archivo de audio tienes que tener seleccionada una pista de audio</translation>
+ </message>
+ <message>
+ <source>UndoRedo</source>
+ <translation type="unfinished">Deshacer/Rehacer</translation>
+ </message>
+ <message>
+ <source>undo</source>
+ <translation type="unfinished">deshacer</translation>
+ </message>
+ <message>
+ <source>Und&amp;o</source>
+ <translation type="unfinished">&amp;Deshacer</translation>
+ </message>
+ <message>
+ <source>redo</source>
+ <translation type="unfinished">rehacer</translation>
+ </message>
+ <message>
+ <source>Re&amp;do</source>
+ <translation type="unfinished">&amp;Rehacer</translation>
+ </message>
+ <message>
+ <source>undo last change to song</source>
+ <translation type="unfinished">deshace el ltimo cambio en la canciďż˝</translation>
+ </message>
+ <message>
+ <source>redo last undo</source>
+ <translation type="unfinished">rehace el ltimo deshacer</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation type="unfinished">bucle</translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation type="unfinished">Bucle</translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation type="unfinished">pinchar</translation>
+ </message>
+ <message>
+ <source>Punchin</source>
+ <translation type="unfinished">Pinchar</translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation type="unfinished">fin pinchado</translation>
+ </message>
+ <message>
+ <source>Punchout</source>
+ <translation type="unfinished">Fin pinchado</translation>
+ </message>
+ <message>
+ <source>start</source>
+ <translation type="unfinished">empezar</translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished">Empezar</translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation type="unfinished">retroceder</translation>
+ </message>
+ <message>
+ <source>Rewind</source>
+ <translation type="unfinished">Retroceder</translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation type="unfinished">avanzar</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation type="unfinished">Avanzar</translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation type="unfinished">parar</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation type="unfinished">Parar</translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation type="unfinished">reproducir</translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation type="unfinished">Reproducir</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="unfinished">grabar</translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation type="unfinished">Grabar</translation>
+ </message>
+ <message>
+ <source>panic</source>
+ <translation type="unfinished">p�ico</translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation type="unfinished">P�ico</translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation type="unfinished">nuevo</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Nuevo</translation>
+ </message>
+ <message>
+ <source>open</source>
+ <translation type="unfinished">abrir</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation type="unfinished">&amp;Abrir</translation>
+ </message>
+ <message>
+ <source>save</source>
+ <translation type="unfinished">guardar</translation>
+ </message>
+ <message>
+ <source>pianoroll</source>
+ <translation type="unfinished">pianola</translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation type="unfinished">Pianola</translation>
+ </message>
+ <message>
+ <source>score</source>
+ <translation type="obsolete">partitura</translation>
+ </message>
+ <message>
+ <source>Score</source>
+ <translation type="obsolete">Partitura</translation>
+ </message>
+ <message>
+ <source>marker</source>
+ <translation type="obsolete">marcador</translation>
+ </message>
+ <message>
+ <source>Marker</source>
+ <translation type="unfinished">Marcador</translation>
+ </message>
+ <message>
+ <source>File Buttons</source>
+ <translation type="unfinished">Botones de Archivo</translation>
+ </message>
+ <message>
+ <source>Unknown File Format</source>
+ <translation type="unfinished">Formato de archivo desconocido</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="obsolete">ninguno</translation>
+ </message>
+ <message>
+ <source>MusE: Write File failed</source>
+ <translation type="unfinished">MusE: La grabaciďż˝ del archivo ha fallado</translation>
+ </message>
+ <message>
+ <source>MusE: About</source>
+ <translation type="obsolete">Muse: Acerca de</translation>
+ </message>
+ <message>
+ <source>MusE: Song: </source>
+ <translation type="unfinished">MusE: Canciďż˝: </translation>
+ </message>
+ <message>
+ <source>reading midifile
+ </source>
+ <translation type="unfinished">leyendo archivo midi
+ </translation>
+ </message>
+ <message>
+ <source>
+failed</source>
+ <translation type="obsolete">
+fallďż˝</translation>
+ </message>
+ <message>
+ <source>MusE: Copy Range</source>
+ <translation type="unfinished">MusE: Copiar Rango</translation>
+ </message>
+ <message>
+ <source>not implemented</source>
+ <translation type="unfinished">no implementado</translation>
+ </message>
+ <message>
+ <source>MusE: Cut Events</source>
+ <translation type="unfinished">MusE: Cortar Eventos</translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to Track</source>
+ <translation type="unfinished">MusE: Rebotar a la pista</translation>
+ </message>
+ <message>
+ <source>more than one target track selected</source>
+ <translation type="unfinished">mďż˝ de una pista de destino seleccionada</translation>
+ </message>
+ <message>
+ <source>wrong target track type,
+select wave track as target</source>
+ <translation type="unfinished">tipo de pista err�ea,
+selecciona una pista de audio como destino</translation>
+ </message>
+ <message>
+ <source>no target track selected</source>
+ <translation type="unfinished">no hay pista de destino seleccionada</translation>
+ </message>
+ <message>
+ <source>Delete Selected Tracks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Instrument</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configure shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi File Export</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;MusE homepage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Report Bug...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;About MusE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot read template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File open error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File read error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: load template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Bounce</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>set left/right marker for bounce range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>no output track found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add midi file to current project?
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add to Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>
+failed: </source>
+ <translation type="unfinished">
+fallďż˝ </translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished">Arreglador</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="unfinished">Cursor</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="unfinished">Snap</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Tono</translation>
+ </message>
+ <message>
+ <source>midi pitch</source>
+ <translation type="unfinished">tono midi</translation>
+ </message>
+ <message>
+ <source>global midi pitch shift</source>
+ <translation type="unfinished">desplazamiento de tono midi</translation>
+ </message>
+ <message>
+ <source>Tempo</source>
+ <translation type="unfinished">Tempo</translation>
+ </message>
+ <message>
+ <source>midi tempo</source>
+ <translation type="unfinished">tempo midi</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation type="unfinished">N</translation>
+ </message>
+ <message>
+ <source>MusE: Create tmp file failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Setti&amp;ngs</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NoteInfo</name>
+ <message>
+ <source>Start</source>
+ <translation type="obsolete">Inicio</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="obsolete">Longitud</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tono</translation>
+ </message>
+ <message>
+ <source>Velo On</source>
+ <translation type="obsolete">Velocidad On</translation>
+ </message>
+ <message>
+ <source>Velo Off</source>
+ <translation type="obsolete">Velocidad Off</translation>
+ </message>
+ <message>
+ <source>Note Info</source>
+ <translation type="obsolete">Informaciďż˝ de nota</translation>
+ </message>
+</context>
+<context>
+ <name>OrganGuiBase</name>
+ <message>
+ <source>MusE: Organ</source>
+ <translation type="unfinished">MusE: �gano</translation>
+ </message>
+ <message>
+ <source>Presets</source>
+ <translation type="obsolete">Preselecciones</translation>
+ </message>
+ <message>
+ <source>Set</source>
+ <translation type="obsolete">Pon</translation>
+ </message>
+ <message>
+ <source>load preset list</source>
+ <translation type="obsolete">cargar lista de preselecciones</translation>
+ </message>
+ <message>
+ <source>save preset list</source>
+ <translation type="obsolete">guardar lista de preselecciones</translation>
+ </message>
+ <message>
+ <source>O-1</source>
+ <translation type="unfinished">0-1</translation>
+ </message>
+ <message>
+ <source>Oscillator</source>
+ <translation type="unfinished">Oscilador</translation>
+ </message>
+ <message>
+ <source>Brass</source>
+ <translation type="unfinished">Metales</translation>
+ </message>
+ <message>
+ <source>Reed</source>
+ <translation type="unfinished">Reed</translation>
+ </message>
+ <message>
+ <source>Flute</source>
+ <translation type="unfinished">Flauta</translation>
+ </message>
+ <message>
+ <source>Drawbars</source>
+ <translation type="unfinished">Drawbars</translation>
+ </message>
+ <message>
+ <source>16&apos;</source>
+ <translation type="unfinished">16&apos;</translation>
+ </message>
+ <message>
+ <source>4&apos;</source>
+ <translation type="unfinished">4&apos;</translation>
+ </message>
+ <message>
+ <source>2 2/3&apos;</source>
+ <translation type="unfinished">2 2/3&apos;</translation>
+ </message>
+ <message>
+ <source>2&apos;</source>
+ <translation type="unfinished">2&apos;</translation>
+ </message>
+ <message>
+ <source>8&apos;</source>
+ <translation type="unfinished">8&apos;</translation>
+ </message>
+ <message>
+ <source>5 1/3&apos;</source>
+ <translation type="unfinished">5 1/3&apos;</translation>
+ </message>
+ <message>
+ <source>Envelope Lo</source>
+ <translation type="unfinished">Envolvente Lo</translation>
+ </message>
+ <message>
+ <source>Attack(ms)</source>
+ <translation type="obsolete">Ataque (ms)</translation>
+ </message>
+ <message>
+ <source>Decay(ms)</source>
+ <translation type="obsolete">Decaimiento (ms)</translation>
+ </message>
+ <message>
+ <source>Sustain(%)</source>
+ <translation type="obsolete">Sostenido (%)</translation>
+ </message>
+ <message>
+ <source>Release(ms)</source>
+ <translation type="obsolete">Relajaciďż˝ (ms)</translation>
+ </message>
+ <message>
+ <source>Envelope Hi</source>
+ <translation type="unfinished">Envolvente Hi</translation>
+ </message>
+ <message>
+ <source>Release</source>
+ <translation type="unfinished">Relajaciďż˝</translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished">Sostenido</translation>
+ </message>
+ <message>
+ <source>Decay</source>
+ <translation type="unfinished">Decaimiento</translation>
+ </message>
+ <message>
+ <source>Attack</source>
+ <translation type="unfinished">Ataque</translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>cB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Velocidad</translation>
+ </message>
+</context>
+<context>
+ <name>PageSettings</name>
+ <message>
+ <source>Paper Size</source>
+ <translation type="obsolete">Tamaďż˝ del papel</translation>
+ </message>
+ <message>
+ <source>user</source>
+ <translation type="obsolete">usuario</translation>
+ </message>
+ <message>
+ <source>Margins</source>
+ <translation type="obsolete">M�genes</translation>
+ </message>
+ <message>
+ <source>Header</source>
+ <translation type="obsolete">Cabecera</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation type="obsolete">T�ulo</translation>
+ </message>
+ <message>
+ <source>Author</source>
+ <translation type="obsolete">Autor</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation type="obsolete">Tipos</translation>
+ </message>
+ <message>
+ <source>Page No.</source>
+ <translation type="obsolete">P�ina n</translation>
+ </message>
+ <message>
+ <source>Measure No</source>
+ <translation type="obsolete">Compďż˝ n</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="obsolete">Nombre de Pista</translation>
+ </message>
+ <message>
+ <source>Lyrics</source>
+ <translation type="obsolete">Letra</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+ <translation type="obsolete">Disposiciďż˝</translation>
+ </message>
+ <message>
+ <source>Scale</source>
+ <translation type="obsolete">Escala</translation>
+ </message>
+ <message>
+ <source>Flags</source>
+ <translation type="obsolete">Se�lizadores</translation>
+ </message>
+ <message>
+ <source>show page no.</source>
+ <translation type="obsolete">muestra el nmero de p�ina</translation>
+ </message>
+ <message>
+ <source>show measure no.</source>
+ <translation type="obsolete">muestra el nmero de compďż˝</translation>
+ </message>
+ <message>
+ <source>show track name</source>
+ <translation type="obsolete">muestra el nombre de la pista</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="obsolete">Aceptar</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="obsolete">Aplicar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Cancelar</translation>
+ </message>
+ <message>
+ <source>left Margin</source>
+ <translation type="obsolete">Margen izquierdo</translation>
+ </message>
+ <message>
+ <source>top Margin</source>
+ <translation type="obsolete">Margen Superior</translation>
+ </message>
+ <message>
+ <source>right Margin</source>
+ <translation type="obsolete">Margen derecho</translation>
+ </message>
+ <message>
+ <source>bottom Margin</source>
+ <translation type="obsolete">Margen inferior</translation>
+ </message>
+ <message>
+ <source>Bars across the Page</source>
+ <translation type="obsolete">Barras a trav� de la p�ina</translation>
+ </message>
+</context>
+<context>
+ <name>PartCanvas</name>
+ <message>
+ <source>C&amp;ut</source>
+ <translation type="obsolete">C&amp;ortar</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="obsolete">&amp;Copiar</translation>
+ </message>
+ <message>
+ <source>rename</source>
+ <translation type="obsolete">renombrar</translation>
+ </message>
+ <message>
+ <source>delete</source>
+ <translation type="obsolete">borrar</translation>
+ </message>
+ <message>
+ <source>split</source>
+ <translation type="obsolete">partir</translation>
+ </message>
+ <message>
+ <source>glue</source>
+ <translation type="obsolete">pegar</translation>
+ </message>
+ <message>
+ <source>pianoroll</source>
+ <translation type="obsolete">pianola</translation>
+ </message>
+ <message>
+ <source>score</source>
+ <translation type="obsolete">partitura</translation>
+ </message>
+ <message>
+ <source>list</source>
+ <translation type="obsolete">lista</translation>
+ </message>
+ <message>
+ <source>drums</source>
+ <translation type="obsolete">percusiďż˝</translation>
+ </message>
+ <message>
+ <source>Cannot copy/move/clone to different Track-Type</source>
+ <translation type="obsolete">No puedo copiar/mover/clonar a un tipo diferente de pista</translation>
+ </message>
+ <message>
+ <source>color</source>
+ <translation type="obsolete">color</translation>
+ </message>
+ <message>
+ <source>de-clone</source>
+ <translation type="obsolete">des-clonar</translation>
+ </message>
+ <message>
+ <source>wave edit</source>
+ <translation type="obsolete">editar onda</translation>
+ </message>
+ <message>
+ <source>Cannot paste: multiple tracks selected</source>
+ <translation type="obsolete">No puedo pegar: mtilpes pistas seleccionadas</translation>
+ </message>
+ <message>
+ <source>Cannot paste: no track selected</source>
+ <translation type="obsolete">No puedo pegar: No hay pista seleccionada</translation>
+ </message>
+ <message>
+ <source>Cannot paste midi parts to wave track</source>
+ <translation type="obsolete">No puedo pegar MIDI en una pista de audio</translation>
+ </message>
+ <message>
+ <source>Cannot paste wave parts to midi track</source>
+ <translation type="obsolete">No puedo pegar audio en una pista MIDI</translation>
+ </message>
+ <message>
+ <source>Cannot paste: wrong data type</source>
+ <translation type="obsolete">No puedo pegar: Tipo de datos equivocado</translation>
+ </message>
+</context>
+<context>
+ <name>PatchBay</name>
+ <message>
+ <source>MusE: ALSA MIDI Patch Bay</source>
+ <translation type="obsolete">MusE: Panel de ruteado MIDI de ALSA</translation>
+ </message>
+</context>
+<context>
+ <name>PatchBayBase</name>
+ <message>
+ <source>ALSA Patch Bay</source>
+ <translation type="unfinished">Panel de ruteado de ALSA</translation>
+ </message>
+</context>
+<context>
+ <name>PianoRoll</name>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Editar</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Cortar</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Copiar</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Pegar</translation>
+ </message>
+ <message>
+ <source>Delete Events</source>
+ <translation type="obsolete">Borrar eventos</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="obsolete">Seleccionar Todo</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation type="obsolete">De-seleccionar todo</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Invertir</translation>
+ </message>
+ <message>
+ <source>Inside Loop</source>
+ <translation type="obsolete">Dentro del bucle</translation>
+ </message>
+ <message>
+ <source>Outside Loop</source>
+ <translation type="obsolete">Fuera del bucle</translation>
+ </message>
+ <message>
+ <source>&amp;Select</source>
+ <translation type="obsolete">&amp;Seleccionar</translation>
+ </message>
+ <message>
+ <source>blue</source>
+ <translation type="obsolete">azul</translation>
+ </message>
+ <message>
+ <source>pitch colors</source>
+ <translation type="obsolete">colores de tono</translation>
+ </message>
+ <message>
+ <source>velocity colors</source>
+ <translation type="obsolete">colores de velocidad</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Configurar</translation>
+ </message>
+ <message>
+ <source>event color</source>
+ <translation type="obsolete">color de eventos</translation>
+ </message>
+ <message>
+ <source>&amp;Functions</source>
+ <translation type="obsolete">&amp;Funciones</translation>
+ </message>
+ <message>
+ <source>Over Quantize</source>
+ <translation type="obsolete">Sobre cuantizar</translation>
+ </message>
+ <message>
+ <source>Note On Quantize</source>
+ <translation type="obsolete">Cuantizar inicio de nota</translation>
+ </message>
+ <message>
+ <source>Note On/Off Quantize</source>
+ <translation type="obsolete">Cuantizar inicio y final de nota</translation>
+ </message>
+ <message>
+ <source>Iterative Quantize</source>
+ <translation type="obsolete">Cuantizaciďż˝ iterativa</translation>
+ </message>
+ <message>
+ <source>Pianoroll Tools</source>
+ <translation type="obsolete">Herramientas de pianola</translation>
+ </message>
+ <message>
+ <source>Step Record</source>
+ <translation type="obsolete">Grabaciďż˝ por pasos</translation>
+ </message>
+ <message>
+ <source>Midi Input</source>
+ <translation type="obsolete">Entrada MIDI</translation>
+ </message>
+ <message>
+ <source>Play Events</source>
+ <translation type="obsolete">Reproducir eventos</translation>
+ </message>
+ <message>
+ <source>Add Controller View</source>
+ <translation type="obsolete">A�de vista de controladores</translation>
+ </message>
+ <message>
+ <source>Config Quant...</source>
+ <translation type="obsolete">Configura cuantizaciďż˝...</translation>
+ </message>
+ <message>
+ <source>Modify Gate Time</source>
+ <translation type="obsolete">Modifica el tiempo de puerta</translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation type="obsolete">Modifica la velocidad</translation>
+ </message>
+ <message>
+ <source>Crescendo</source>
+ <translation type="obsolete">Crescendo</translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="obsolete">Transponer</translation>
+ </message>
+ <message>
+ <source>Thin Out</source>
+ <translation type="obsolete">Adelgazar</translation>
+ </message>
+ <message>
+ <source>Erase Event</source>
+ <translation type="obsolete">Borrar evento</translation>
+ </message>
+ <message>
+ <source>Note Shift</source>
+ <translation type="obsolete">Desplazar nota</translation>
+ </message>
+ <message>
+ <source>Move Clock</source>
+ <translation type="obsolete">Mover reloj</translation>
+ </message>
+ <message>
+ <source>Copy Measure</source>
+ <translation type="obsolete">Copiar compďż˝</translation>
+ </message>
+ <message>
+ <source>Erase Measure</source>
+ <translation type="obsolete">Vaciar compďż˝</translation>
+ </message>
+ <message>
+ <source>Delete Measure</source>
+ <translation type="obsolete">Borrar compďż˝</translation>
+ </message>
+ <message>
+ <source>Create Measure</source>
+ <translation type="obsolete">Crear compďż˝</translation>
+ </message>
+ <message>
+ <source>ctrl</source>
+ <translation type="obsolete">control</translation>
+ </message>
+</context>
+<context>
+ <name>PluginDialog</name>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+ <message>
+ <source>MusE: select plugin</source>
+ <translation type="unfinished">MusE: Selecciona el plugin</translation>
+ </message>
+ <message>
+ <source>Lib</source>
+ <translation type="unfinished">Lib</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Etiqueta</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Nombre</translation>
+ </message>
+ <message>
+ <source>AI</source>
+ <translation type="unfinished">AI</translation>
+ </message>
+ <message>
+ <source>AO</source>
+ <translation type="unfinished">AO</translation>
+ </message>
+ <message>
+ <source>CI</source>
+ <translation type="unfinished">CI</translation>
+ </message>
+ <message>
+ <source>CO</source>
+ <translation type="unfinished">CO</translation>
+ </message>
+ <message>
+ <source>IP</source>
+ <translation type="unfinished">IP</translation>
+ </message>
+ <message>
+ <source>id</source>
+ <translation type="unfinished">id</translation>
+ </message>
+ <message>
+ <source>Maker</source>
+ <translation type="unfinished">Fabricante</translation>
+ </message>
+ <message>
+ <source>Copyright</source>
+ <translation type="unfinished">Copyright</translation>
+ </message>
+ <message>
+ <source>Stereo and Mono</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="unfinished">Est�eo</translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="unfinished">Mono</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="unfinished">Todo</translation>
+ </message>
+ <message>
+ <source>Select which types of plugins should be visible in the list.&lt;br&gt;Note that using mono plugins on stereo tracks is not a problem, two will be used in parallell.&lt;br&gt;Also beware that the &apos;all&apos; alternative includes plugins that probably not are usable by MusE.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginGui</name>
+ <message>
+ <source>bypass plugin</source>
+ <translation type="unfinished">saltar plugin</translation>
+ </message>
+ <message>
+ <source>MusE: load preset</source>
+ <translation type="unfinished">MusE: Cargar plantilla</translation>
+ </message>
+ <message>
+ <source>MusE: save preset</source>
+ <translation type="unfinished">MusE: Guardar plantilla</translation>
+ </message>
+ <message>
+ <source>File Buttons</source>
+ <translation type="unfinished">Archivar botones</translation>
+ </message>
+ <message>
+ <source>Load Preset</source>
+ <translation type="unfinished">Cargar plantilla</translation>
+ </message>
+ <message>
+ <source>Save Preset</source>
+ <translation type="unfinished">Guardar plantilla</translation>
+ </message>
+</context>
+<context>
+ <name>PrinterConfig</name>
+ <message>
+ <source>MusE: Config Printer</source>
+ <translation type="obsolete">MusE: Configuraciďż˝ de impresora</translation>
+ </message>
+ <message>
+ <source>Print to file</source>
+ <translation type="obsolete">Imprimir en archivo</translation>
+ </message>
+ <message>
+ <source>Print Command</source>
+ <translation type="obsolete">Comando de impresiďż˝</translation>
+ </message>
+ <message>
+ <source>Preview Command</source>
+ <translation type="obsolete">Comando de previsualizaciďż˝</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="obsolete">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>QHeader</name>
+ <message>
+ <source>Port Number</source>
+ <translation type="obsolete">Nmero de puerto</translation>
+ </message>
+ <message>
+ <source>enable gui for device</source>
+ <translation type="obsolete">habilitar gui para dispositivo</translation>
+ </message>
+ <message>
+ <source>enables recording from the device</source>
+ <translation type="obsolete">habilita la grabaciďż˝ para el dispositivo</translation>
+ </message>
+ <message>
+ <source>Instrument connected to port</source>
+ <translation type="obsolete">Instrumento conectado al puerto</translation>
+ </message>
+ <message>
+ <source>State: result of opening the device</source>
+ <translation type="obsolete">Estado: resultado de abrir el puerto</translation>
+ </message>
+ <message>
+ <source>mute instrument</source>
+ <translation type="obsolete">silenciar instrumento</translation>
+ </message>
+ <message>
+ <source>sound name</source>
+ <translation type="obsolete">nombre del sonido</translation>
+ </message>
+ <message>
+ <source>quantisation
+currently not used</source>
+ <translation type="obsolete">cuantizaciďż˝
+actualmente sin usar</translation>
+ </message>
+ <message>
+ <source>this input note triggers the sound</source>
+ <translation type="obsolete">ensta nota de entrada dispara el sonido</translation>
+ </message>
+ <message>
+ <source>note length</source>
+ <translation type="obsolete">longitud de nota</translation>
+ </message>
+ <message>
+ <source>this note is send for the sound</source>
+ <translation type="obsolete">esta nota se envia al sonido</translation>
+ </message>
+ <message>
+ <source>output channel
+currently not used</source>
+ <translation type="obsolete">canal de salida
+actualmente sin uso</translation>
+ </message>
+ <message>
+ <source>output port
+currently not used</source>
+ <translation type="obsolete">puerto de salida
+actualmente sin uso</translation>
+ </message>
+ <message>
+ <source>velocity level 1</source>
+ <translation type="obsolete">nivel de velocidad 1</translation>
+ </message>
+ <message>
+ <source>velocity level 2</source>
+ <translation type="obsolete">nivel de velocidad 2</translation>
+ </message>
+ <message>
+ <source>velocity level 3</source>
+ <translation type="obsolete">nivel de velocidad 3</translation>
+ </message>
+ <message>
+ <source>velocity level 4</source>
+ <translation type="obsolete">nivel de velocidad 4</translation>
+ </message>
+ <message>
+ <source>quantisation</source>
+ <translation type="obsolete">cuantizaciďż˝</translation>
+ </message>
+ <message>
+ <source>output channel</source>
+ <translation type="obsolete">canal de salida</translation>
+ </message>
+ <message>
+ <source>output port</source>
+ <translation type="obsolete">puerto de salida</translation>
+ </message>
+ <message>
+ <source>Enable Recording</source>
+ <translation type="obsolete">Habilita grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>Track Activity</source>
+ <translation type="obsolete">Actividad de pista</translation>
+ </message>
+ <message>
+ <source>Mute Indicator</source>
+ <translation type="obsolete">Indicador de silencio</translation>
+ </message>
+ <message>
+ <source>Solo Indicator</source>
+ <translation type="obsolete">Indicador de solo</translation>
+ </message>
+ <message>
+ <source>Track Type</source>
+ <translation type="obsolete">Tipo de pista</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="obsolete">Nombre de pista</translation>
+ </message>
+ <message>
+ <source>Output Channel Number</source>
+ <translation type="obsolete">Nmero de canal de salida</translation>
+ </message>
+ <message>
+ <source>Output Port</source>
+ <translation type="obsolete">Puerto de salida</translation>
+ </message>
+ <message>
+ <source>Time Lock</source>
+ <translation type="obsolete">Bloqueo de tiempo</translation>
+ </message>
+ <message>
+ <source>Solo/Pre Fader Listening</source>
+ <translation type="obsolete">Escucha de S�o/pre-fader</translation>
+ </message>
+ <message>
+ <source>Name of the midi device associated with this port number</source>
+ <translation type="obsolete">Nombre del dispositivo MIDI asociado con este nmero de puerto</translation>
+ </message>
+</context>
+<context>
+ <name>QPopupMenu</name>
+ <message>
+ <source>Add Midi Generator...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Soft Synth...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QWidget</name>
+ <message>
+ <source>Cannot transform non empty track</source>
+ <translation type="obsolete">No puedo transformar una pista que no est�vacia</translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="obsolete">Velocidad</translation>
+ </message>
+ <message>
+ <source>Cannot convert sysex string</source>
+ <translation type="obsolete">No puedo convertir el paquete de sistema exclusivo</translation>
+ </message>
+ <message>
+ <source>Hex String too long (2048 bytes limit)</source>
+ <translation type="obsolete">Cadena hexadecimal demasiado larga (l�ite de 2048 bytes)</translation>
+ </message>
+ <message>
+ <source>generic midi</source>
+ <translation type="obsolete">midi gen�ico</translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation type="unfinished">nuevo</translation>
+ </message>
+ <message>
+ <source>create peakfile for </source>
+ <translation type="obsolete">crear archivo de picos para</translation>
+ </message>
+ <message>
+ <source>MusE: get file name</source>
+ <translation type="obsolete">MusE: obtener el nombre de archivo</translation>
+ </message>
+ <message>
+ <source>the directory
+</source>
+ <translation type="obsolete">el directorio
+</translation>
+ </message>
+ <message>
+ <source>
+does not exist
+create?</source>
+ <translation type="obsolete">
+no existe
+ Lo creo ?</translation>
+ </message>
+ <message>
+ <source>&amp;Create</source>
+ <translation type="obsolete">&amp;Crear</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Cancelar</translation>
+ </message>
+ <message>
+ <source>MusE: create directory</source>
+ <translation type="obsolete">MusE: crear directorio</translation>
+ </message>
+ <message>
+ <source>creating dir failed</source>
+ <translation type="obsolete">fall�la creaci� de directorio</translation>
+ </message>
+ <message>
+ <source>File
+</source>
+ <translation type="unfinished">El archivo
+</translation>
+ </message>
+ <message>
+ <source>
+exists</source>
+ <translation type="unfinished">
+existe</translation>
+ </message>
+ <message>
+ <source>MusE: write</source>
+ <translation type="unfinished">MusE: escribe</translation>
+ </message>
+ <message>
+ <source>Overwrite</source>
+ <translation type="unfinished">Sobre escribe</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation type="unfinished">Salir</translation>
+ </message>
+ <message>
+ <source>Open File
+</source>
+ <translation type="obsolete">Abrir archivo</translation>
+ </message>
+ <message>
+ <source>
+failed: </source>
+ <translation type="obsolete">
+fallďż˝ </translation>
+ </message>
+ <message>
+ <source>MusE: Open File</source>
+ <translation type="obsolete">MusE: Abrir archivo</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">Ninguno</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Maestro</translation>
+ </message>
+ <message>
+ <source>Input</source>
+ <translation type="obsolete">Entrada</translation>
+ </message>
+ <message>
+ <source>Group %c</source>
+ <translation type="obsolete">Grupo %c</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="obsolete">Desconocido</translation>
+ </message>
+</context>
+<context>
+ <name>QuantConfig</name>
+ <message>
+ <source>Config Quantize</source>
+ <translation type="obsolete">Configurar Cuantizaciďż˝</translation>
+ </message>
+ <message>
+ <source>Strength</source>
+ <translation type="obsolete">Fuerza</translation>
+ </message>
+ <message>
+ <source>Don&#xb4;t Quantize</source>
+ <translation type="obsolete">No cuantizes</translation>
+ </message>
+ <message>
+ <source>Quant Len</source>
+ <translation type="obsolete">Cuantizar la longitud</translation>
+ </message>
+ <message>
+ <source>MusE: Config Quantize</source>
+ <translation type="obsolete">MusE: Configurar Cuantizaciďż˝</translation>
+ </message>
+</context>
+<context>
+ <name>QuantDialog</name>
+ <message>
+ <source>Display Quantize</source>
+ <translation type="obsolete">Mostrar la cuantizaciďż˝</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="obsolete">Posiciďż˝</translation>
+ </message>
+ <message>
+ <source>Note Quantize</source>
+ <translation type="obsolete">Cuantizar Nota</translation>
+ </message>
+ <message>
+ <source>Rest Quantize</source>
+ <translation type="obsolete">Cuantizar el resto</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="obsolete">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>RhythmBase</name>
+ <message>
+ <source>MusE: Random Rhythm Generator</source>
+ <translation type="obsolete">MusE: Generador de r�mo aleatorio</translation>
+ </message>
+ <message>
+ <source>Instrument Properties</source>
+ <translation type="obsolete">Propiedades del instrumento</translation>
+ </message>
+ <message>
+ <source>counts/bar</source>
+ <translation type="obsolete">cuentar por barra</translation>
+ </message>
+ <message>
+ <source>steps/count</source>
+ <translation type="obsolete">pasos por cuenta</translation>
+ </message>
+ <message>
+ <source># bars</source>
+ <translation type="obsolete">n barras</translation>
+ </message>
+ <message>
+ <source>test</source>
+ <translation type="obsolete">probar</translation>
+ </message>
+ <message>
+ <source>contrib</source>
+ <translation type="obsolete">contribuir</translation>
+ </message>
+ <message>
+ <source>randomize</source>
+ <translation type="obsolete">aleartorizar</translation>
+ </message>
+ <message>
+ <source>Group 1</source>
+ <translation type="obsolete">Grupo 1</translation>
+ </message>
+ <message>
+ <source>Group 2</source>
+ <translation type="obsolete">Grupo 2</translation>
+ </message>
+ <message>
+ <source>Group 3</source>
+ <translation type="obsolete">Grupo 3</translation>
+ </message>
+ <message>
+ <source>Group 4</source>
+ <translation type="obsolete">Grupo 4</translation>
+ </message>
+ <message>
+ <source>Group 5</source>
+ <translation type="obsolete">Grupo 5</translation>
+ </message>
+ <message>
+ <source>listen</source>
+ <translation type="obsolete">escuchar</translation>
+ </message>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">Instrumento</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation type="obsolete">Grupo</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nuevo</translation>
+ </message>
+ <message>
+ <source>create new entry</source>
+ <translation type="obsolete">crear nueva entrada</translation>
+ </message>
+ <message>
+ <source>pressing the New button you create a new entry
+in the MusE list of defined controllers</source>
+ <translation type="obsolete">pulsando el botďż˝ Nuevo creas una entrada nueva
+en la lista de controles definidos por MusE</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;Borrar</translation>
+ </message>
+ <message>
+ <source>delete selected entry</source>
+ <translation type="obsolete">borra la entrada seleccionada</translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation type="obsolete">Arriba</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation type="obsolete">Abajo</translation>
+ </message>
+ <message>
+ <source>Instrument </source>
+ <translation type="obsolete">Instrumento </translation>
+ </message>
+ <message>
+ <source>steps/count </source>
+ <translation type="obsolete">pasos por cuenta </translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="obsolete">Lista de controladores definidos</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="obsolete">Esta es la lista de controladores definidos en MusE.</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Archivo</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Editar</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="obsolete">A&amp;yuda</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation type="obsolete">Herramientas</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="obsolete">Nuevo</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="obsolete">Abrir</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="obsolete">&amp;Abrir...</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Guardar</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="obsolete">&amp;Guardar</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="obsolete">Guardar como</translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="obsolete">Guardar &amp;Como...</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="obsolete">Imprimir</translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation type="obsolete">&amp;Imprimir...</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="obsolete">Salir</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="obsolete">&amp;Salir</translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="obsolete">Deshacer</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="obsolete">&amp;Deshacer</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="obsolete">Rehacer</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="obsolete">&amp;Rehacer</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Cortar</translation>
+ </message>
+ <message>
+ <source>&amp;Cut</source>
+ <translation type="obsolete">&amp;Cortar</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Copiar</translation>
+ </message>
+ <message>
+ <source>C&amp;opy</source>
+ <translation type="obsolete">C&amp;opiar</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Pegar</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="obsolete">&amp;Pegar</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation type="obsolete">Buscar</translation>
+ </message>
+ <message>
+ <source>&amp;Find...</source>
+ <translation type="obsolete">&amp;Buscar...</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation type="obsolete">Contenidos</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation type="obsolete">&amp;Contenidos...</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation type="obsolete">�dice</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation type="obsolete">&amp;Indice...</translation>
+ </message>
+ <message>
+ <source>About</source>
+ <translation type="obsolete">Acerca de</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation type="obsolete">&amp;Acerca de ...</translation>
+ </message>
+</context>
+<context>
+ <name>RhythmGenerator</name>
+ <message>
+ <source>Form3</source>
+ <translation type="obsolete">Formulario3</translation>
+ </message>
+ <message>
+ <source>Instrument Settings:</source>
+ <translation type="obsolete">Configuraciďż˝ de instrumento:</translation>
+ </message>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">Instrumento</translation>
+ </message>
+ <message>
+ <source>Hi-Hat</source>
+ <translation type="obsolete">Charli</translation>
+ </message>
+ <message>
+ <source>add</source>
+ <translation type="obsolete">a�dir</translation>
+ </message>
+ <message>
+ <source>delete</source>
+ <translation type="obsolete">borrar</translation>
+ </message>
+ <message>
+ <source>steps/count</source>
+ <translation type="obsolete">pasos/cuenta</translation>
+ </message>
+ <message>
+ <source>count/bar</source>
+ <translation type="obsolete">cuentas/compďż˝</translation>
+ </message>
+ <message>
+ <source># bars</source>
+ <translation type="obsolete">n compases</translation>
+ </message>
+ <message>
+ <source>Group Settings:</source>
+ <translation type="obsolete">Configuraciďż˝ de grupo:</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation type="obsolete">Grupo</translation>
+ </message>
+ <message>
+ <source>Group 1</source>
+ <translation type="obsolete">Grupo 1</translation>
+ </message>
+ <message>
+ <source>Group 2</source>
+ <translation type="obsolete">Grupo 2</translation>
+ </message>
+ <message>
+ <source>Group 3</source>
+ <translation type="obsolete">Grupo 3</translation>
+ </message>
+ <message>
+ <source>Group 4</source>
+ <translation type="obsolete">Grupo 4</translation>
+ </message>
+ <message>
+ <source>Group 5</source>
+ <translation type="obsolete">Grupo 5</translation>
+ </message>
+ <message>
+ <source>contrib</source>
+ <translation type="obsolete">contrib</translation>
+ </message>
+ <message>
+ <source>listen</source>
+ <translation type="obsolete">escuchar</translation>
+ </message>
+ <message>
+ <source>Randomize</source>
+ <translation type="obsolete">aleatorizar</translation>
+ </message>
+ <message>
+ <source>Rhythm Style:</source>
+ <translation type="obsolete">Estilo de ritmo:</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="obsolete">L�pio</translation>
+ </message>
+ <message>
+ <source>Open...</source>
+ <translation type="obsolete">Abrir...</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Guardar</translation>
+ </message>
+ <message>
+ <source>Save as...</source>
+ <translation type="obsolete">Guardar como...</translation>
+ </message>
+ <message>
+ <source>Generate</source>
+ <translation type="obsolete">Generar</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="obsolete">Cerrar</translation>
+ </message>
+</context>
+<context>
+ <name>RouteDialogBase</name>
+ <message>
+ <source>MusE: Routing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Route</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Destination:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>connect source to destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Current Routes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>remove selected route</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SS_PluginChooserBase</name>
+ <message>
+ <source>SimpleDrums - Ladspa Plugin Chooser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Nombre</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Creator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Cancelar</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Score</name>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Configuraciďż˝</translation>
+ </message>
+ <message>
+ <source>Page Settings</source>
+ <translation type="obsolete">Configuraci� de p�ina</translation>
+ </message>
+ <message>
+ <source>Staff Settings</source>
+ <translation type="obsolete">Configuraciďż˝ de pentagrama</translation>
+ </message>
+ <message>
+ <source>Background Pixmap</source>
+ <translation type="obsolete">imagen de fondo</translation>
+ </message>
+ <message>
+ <source>Palettes</source>
+ <translation type="obsolete">Paletas</translation>
+ </message>
+ <message>
+ <source>Dynamics</source>
+ <translation type="obsolete">Din�icos</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="obsolete">Imprimir</translation>
+ </message>
+ <message>
+ <source>Preview Print</source>
+ <translation type="obsolete">Previsualizar la impresiďż˝</translation>
+ </message>
+ <message>
+ <source>Lyrics</source>
+ <translation type="obsolete">Letra</translation>
+ </message>
+ <message>
+ <source>enter lyrics</source>
+ <translation type="obsolete">escribe la letra</translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="obsolete">Texto</translation>
+ </message>
+ <message>
+ <source>enter text</source>
+ <translation type="obsolete">escribe el texto</translation>
+ </message>
+ <message>
+ <source>C7m</source>
+ <translation type="obsolete">C7m</translation>
+ </message>
+ <message>
+ <source>enter chord symbol</source>
+ <translation type="obsolete">escribe el s�bolo del acorde</translation>
+ </message>
+ <message>
+ <source>to previous voice</source>
+ <translation type="obsolete">al timbre anterior</translation>
+ </message>
+ <message>
+ <source>to next voice</source>
+ <translation type="obsolete">al timbre siguiente</translation>
+ </message>
+ <message>
+ <source>flip stem direction</source>
+ <translation type="obsolete">intercambia la direcciďż˝ de la armadura</translation>
+ </message>
+ <message>
+ <source>move marked notes to previous voice or to upper stave in a split system</source>
+ <translation type="obsolete">mueve las notas marcadas al timbre anterior o a la parte superior en sistemas partidos</translation>
+ </message>
+ <message>
+ <source>move marked notes to next voice or to lower stave in a split system</source>
+ <translation type="obsolete">mueve las notas marcadas al timbre siguiente o a la parte inferior en sistemas partidos</translation>
+ </message>
+ <message>
+ <source>flip stem direction of selected notes</source>
+ <translation type="obsolete">intercambia la direcciďż˝ de la armadura de las notas seleccionadas</translation>
+ </message>
+ <message>
+ <source>StaffSettings</source>
+ <translation type="obsolete">Configuraciďż˝ de pentagrama</translation>
+ </message>
+ <message>
+ <source>MusE: config wallpaper</source>
+ <translation type="obsolete">MusE: Configurar imagen de fondo</translation>
+ </message>
+ <message>
+ <source>Score</source>
+ <translation type="obsolete">Partitura</translation>
+ </message>
+</context>
+<context>
+ <name>ScoreConfig</name>
+ <message>
+ <source>Staff Settings: </source>
+ <translation type="obsolete">Configuraciďż˝ de Pentagrama: </translation>
+ </message>
+ <message>
+ <source>Track List</source>
+ <translation type="obsolete">Lista de pistas</translation>
+ </message>
+ <message>
+ <source>Key/Clef</source>
+ <translation type="obsolete">Clave</translation>
+ </message>
+ <message>
+ <source>Raster</source>
+ <translation type="obsolete">Raster</translation>
+ </message>
+ <message>
+ <source>Note Quantize</source>
+ <translation type="obsolete">Cuantizaciďż˝ de nota</translation>
+ </message>
+ <message>
+ <source>Rest Quantize</source>
+ <translation type="obsolete">Restaurar cuantizaciďż˝</translation>
+ </message>
+ <message>
+ <source>Mode</source>
+ <translation type="obsolete">Modo</translation>
+ </message>
+ <message>
+ <source>Split System</source>
+ <translation type="obsolete">Sistema partido</translation>
+ </message>
+ <message>
+ <source>Splitpoint</source>
+ <translation type="obsolete">punto de separaciďż˝</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="obsolete">Aceptar</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="obsolete">Aplicar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Cancelar</translation>
+ </message>
+ <message>
+ <source>Upper Staff</source>
+ <translation type="obsolete">Pentagrama superior</translation>
+ </message>
+ <message>
+ <source>Lower Staff</source>
+ <translation type="obsolete">Pentagrama inferior</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollScale</name>
+ <message>
+ <source>next page</source>
+ <translation type="obsolete">p�ina siguiente</translation>
+ </message>
+ <message>
+ <source>previous page</source>
+ <translation type="obsolete">p�ina anterior</translation>
+ </message>
+ <message>
+ <source>current page number</source>
+ <translation type="obsolete">numero de p�ina actual</translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutCaptureDialogBase</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+ <message>
+ <source>Enter shortcut sequence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Press keys to enter shortcut sequence!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Old shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undefined</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfig</name>
+ <message>
+ <source>Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished">Arreglador</translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drumeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List Mastertrack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All categories</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Start playback from current location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle metronome</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Stop Playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Play, Stop, Rewind</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Goto left marker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Goto right marker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Loop section</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Paste,</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: New project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Open from disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Save project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Open recent file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Save as</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Load template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Import midi file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Export midi file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Import audio file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Quit MusE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select parts on track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open pianoroll</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open drumeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open listeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open graphical mastertrack editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open list mastertrack editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open midi transformer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add midi track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add drum track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add wave track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio aux</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global insert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global split</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Copy range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Cut events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Open mixer window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Toggle transport window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Toggle bigtime window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Open marker window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song by page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song continuous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Global configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Configure shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Configure metronome</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi sync configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi file export configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Appearance settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi ports / Soft Synth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Audio subsystem configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Edit midi instruments</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input transform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi input transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi remote control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Random rhythm generator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Reset midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Init midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi local off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Restart audio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Mixer automation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Take mixer snapshot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Clear mixer automation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help: Open Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help: Toggle whatsthis mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Edit selected part</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track above</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track above</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track below</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track below</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select none</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Invert selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts inside locators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts outside locators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part/event to the left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the left to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the right to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Set locators to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Increase pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Decrease pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Set fixed length on midi events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Over Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Note On Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Note On/Off Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Iterative Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Configure quant</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Gate Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Crescendo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Thin Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Erase Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Note Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Move Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Copy Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Erase Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Delete Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Create Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Change event color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Pointer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Pencil</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Eraser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Line Draw</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Scissor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Glue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Mute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Increase current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Decrease current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/1 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/2 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/4 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/8 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/16 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/32 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/64 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle triol quantization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization (2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Insert at location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation type="unfinished">Insertar nota</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="unfinished">Insertar sistema exclusivo</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="unfinished">Insertar controlador</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="unfinished">Insertar Meta</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="unfinished">Insertar AfterTouch de canal</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="unfinished">Insertar AfterTouch de tecla</translation>
+ </message>
+ <message>
+ <source>Edit: Increase event position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Decrease event position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Tempo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Signature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Change Event Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Event Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfigBase</name>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished">&amp;Aplicar</translation>
+ </message>
+ <message>
+ <source>Configure Keyboard Shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Define</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SigScale</name>
+ <message>
+ <source>signature scale</source>
+ <translation type="obsolete">Armadura de la escala</translation>
+ </message>
+</context>
+<context>
+ <name>SimpleDrumsGuiBase</name>
+ <message>
+ <source>DrumSynth 0.1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>StkGuiBase</name>
+ <message>
+ <source>MyDialog2</source>
+ <translation type="obsolete">MiDialogo2</translation>
+ </message>
+ <message>
+ <source>Voices</source>
+ <translation type="obsolete">Voces</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="obsolete">Editar</translation>
+ </message>
+</context>
+<context>
+ <name>SynthConfigBase</name>
+ <message>
+ <source>MusE: Soft Synth Configuration</source>
+ <translation type="obsolete">MusE: Configuraciďż˝ del Sintetizador virtual</translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation type="obsolete">Sintetizador Virtual</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation type="obsolete">Archivo</translation>
+ </message>
+ <message>
+ <source>Instances</source>
+ <translation type="obsolete">Copias</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="obsolete">Nombre</translation>
+ </message>
+ <message>
+ <source>list of available software synthesizers</source>
+ <translation type="obsolete">lista de sintetizadores de software dispoibles</translation>
+ </message>
+ <message>
+ <source>Add Instance</source>
+ <translation type="obsolete">A�dir copia</translation>
+ </message>
+ <message>
+ <source>Alsa Port</source>
+ <translation type="obsolete">Puerto ALSA</translation>
+ </message>
+ <message>
+ <source>Remove Instance</source>
+ <translation type="obsolete">Quitar copia</translation>
+ </message>
+</context>
+<context>
+ <name>TList</name>
+ <message>
+ <source>Midi</source>
+ <translation type="obsolete">MIDI</translation>
+ </message>
+ <message>
+ <source>Drum</source>
+ <translation type="obsolete">Percusiďż˝</translation>
+ </message>
+ <message>
+ <source>Wave</source>
+ <translation type="obsolete">Audio</translation>
+ </message>
+ <message>
+ <source>Delete Track</source>
+ <translation type="obsolete">Borrar pista</translation>
+ </message>
+ <message>
+ <source>Track Comment</source>
+ <translation type="obsolete">Comentario de pista</translation>
+ </message>
+ <message>
+ <source>Show Gui</source>
+ <translation type="obsolete">Mostrar GUI</translation>
+ </message>
+ <message>
+ <source>Add Midi Track</source>
+ <translation type="obsolete">A�dir pista MIDI</translation>
+ </message>
+ <message>
+ <source>Add Drum Track</source>
+ <translation type="obsolete">A�dir pista de percusi�</translation>
+ </message>
+ <message>
+ <source>Add Wave Track</source>
+ <translation type="obsolete">A�dir pista de audio</translation>
+ </message>
+</context>
+<context>
+ <name>TempoSig</name>
+ <message>
+ <source>Tempo/Sig</source>
+ <translation type="unfinished">tempo/firma</translation>
+ </message>
+</context>
+<context>
+ <name>Toolbar1</name>
+ <message>
+ <source>Solo</source>
+ <translation type="obsolete">Solo</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="obsolete">Snap</translation>
+ </message>
+ <message>
+ <source>Quantize</source>
+ <translation type="obsolete">Cuantizar</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="obsolete">A</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation type="obsolete">Todos los eventos</translation>
+ </message>
+ <message>
+ <source>Looped Ev.</source>
+ <translation type="obsolete">Eventos del bucle</translation>
+ </message>
+ <message>
+ <source>Selected Ev.</source>
+ <translation type="obsolete">Eventos seleccionados</translation>
+ </message>
+ <message>
+ <source>Looped+Sel.</source>
+ <translation type="obsolete">Bucle + Selecciďż˝</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Cursor</translation>
+ </message>
+</context>
+<context>
+ <name>TrackComment</name>
+ <message>
+ <source>MusE: Track Comment</source>
+ <translation type="obsolete">MusE: Comentario de la pista</translation>
+ </message>
+ <message>
+ <source>Track Comment:</source>
+ <translation type="obsolete">Comentario de la pista:</translation>
+ </message>
+</context>
+<context>
+ <name>Transport</name>
+ <message>
+ <source>Punch In</source>
+ <translation type="unfinished">Pinchar</translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation type="unfinished">Bucle</translation>
+ </message>
+ <message>
+ <source>Punch Out</source>
+ <translation type="unfinished">Fin pinchado</translation>
+ </message>
+ <message>
+ <source>Left Mark</source>
+ <translation type="unfinished">Marca izquierda</translation>
+ </message>
+ <message>
+ <source>Right Mark</source>
+ <translation type="unfinished">Marca derecha</translation>
+ </message>
+ <message>
+ <source>Overdub</source>
+ <translation type="unfinished">A�dir</translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation type="unfinished">Reemplazar</translation>
+ </message>
+ <message>
+ <source>Rec Mode</source>
+ <translation type="unfinished">Modo de grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished">Normal</translation>
+ </message>
+ <message>
+ <source>Mix</source>
+ <translation type="unfinished">Mezcla</translation>
+ </message>
+ <message>
+ <source>Cycle Rec</source>
+ <translation type="unfinished">Ciclar Grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation type="unfinished">pinchar</translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation type="unfinished">bucle</translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation type="unfinished">fin pinchado</translation>
+ </message>
+ <message>
+ <source>rewind to start</source>
+ <translation type="unfinished">retroceder al inicio</translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation type="unfinished">retroceder</translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation type="unfinished">avanzar</translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation type="unfinished">parar</translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation type="unfinished">reproducir</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="unfinished">grabar</translation>
+ </message>
+ <message>
+ <source>AC</source>
+ <translation type="unfinished">AC</translation>
+ </message>
+ <message>
+ <source>quantize during record</source>
+ <translation type="unfinished">cuantizar durante la grabaciďż˝</translation>
+ </message>
+ <message>
+ <source>Click</source>
+ <translation type="unfinished">Click</translation>
+ </message>
+ <message>
+ <source>metronom click on/off</source>
+ <translation type="unfinished">Click del metr�omo encendido/apagado</translation>
+ </message>
+ <message>
+ <source>Sync</source>
+ <translation type="unfinished">Sinconizaciďż˝</translation>
+ </message>
+ <message>
+ <source>external sync on/off</source>
+ <translation type="unfinished">Sincronizaciďż˝ externa encedida/apagada</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="unfinished">Maestro</translation>
+ </message>
+ <message>
+ <source>use master track</source>
+ <translation type="unfinished">usar pista maestra</translation>
+ </message>
+</context>
+<context>
+ <name>TransposeDialogBase</name>
+ <message>
+ <source>MusE: Midi Transpose</source>
+ <translation type="unfinished">MusE: Transposiciďż˝ MIDI</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished">Valor</translation>
+ </message>
+ <message>
+ <source>halftones</source>
+ <translation type="unfinished">semitonos</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation type="unfinished">Tiempo</translation>
+ </message>
+ <message>
+ <source>all</source>
+ <translation type="unfinished">todo</translation>
+ </message>
+ <message>
+ <source>between markers</source>
+ <translation type="unfinished">entre marcadores</translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation type="unfinished">Partes</translation>
+ </message>
+ <message>
+ <source>all in selected tracks</source>
+ <translation type="unfinished">todo en las pistas seleccionadas</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>VAMGuiBase</name>
+ <message>
+ <source>Virtual Analogue for MusE</source>
+ <translation type="obsolete">Analogico virtual para MusE</translation>
+ </message>
+ <message>
+ <source>LFO</source>
+ <translation type="obsolete">LFO</translation>
+ </message>
+ <message>
+ <source>Freq</source>
+ <translation type="obsolete">Freq</translation>
+ </message>
+ <message>
+ <source>Waveform</source>
+ <translation type="obsolete">Tipo Onda</translation>
+ </message>
+ <message>
+ <source>Sine</source>
+ <translation type="obsolete">Seno</translation>
+ </message>
+ <message>
+ <source>Pulse</source>
+ <translation type="obsolete">Pulso</translation>
+ </message>
+ <message>
+ <source>Saw</source>
+ <translation type="obsolete">Sierra</translation>
+ </message>
+ <message>
+ <source>Triangle</source>
+ <translation type="obsolete">Tri�gulo</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="obsolete">Filtro</translation>
+ </message>
+ <message>
+ <source>EnvMod</source>
+ <translation type="obsolete">Modulaciďż˝ de envolvente</translation>
+ </message>
+ <message>
+ <source>Attack</source>
+ <translation type="obsolete">Ataque</translation>
+ </message>
+ <message>
+ <source>Decay</source>
+ <translation type="obsolete">Decaimiento</translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="obsolete">Sostenido</translation>
+ </message>
+ <message>
+ <source>Release</source>
+ <translation type="obsolete">Relajaciďż˝</translation>
+ </message>
+ <message>
+ <source>Cutoff</source>
+ <translation type="obsolete">Frecuencia de corte</translation>
+ </message>
+ <message>
+ <source>Resonance</source>
+ <translation type="obsolete">Resonancia</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Invertir</translation>
+ </message>
+ <message>
+ <source>KeyTrack</source>
+ <translation type="obsolete">Seguir teclas</translation>
+ </message>
+ <message>
+ <source>Presets</source>
+ <translation type="obsolete">Plantillas</translation>
+ </message>
+ <message>
+ <source>Set</source>
+ <translation type="obsolete">Establecer</translation>
+ </message>
+ <message>
+ <source>load preset list</source>
+ <translation type="obsolete">cargar lista de plantillas</translation>
+ </message>
+ <message>
+ <source>save preset list</source>
+ <translation type="obsolete">guardar lista de plantillas</translation>
+ </message>
+ <message>
+ <source>save preset list to a new file</source>
+ <translation type="obsolete">guardar lista de plantillas en un archivo nuevo</translation>
+ </message>
+ <message>
+ <source>delete preset</source>
+ <translation type="obsolete">borrar plantilla</translation>
+ </message>
+ <message>
+ <source>DCO 1</source>
+ <translation type="obsolete">DCO 1</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tono</translation>
+ </message>
+ <message>
+ <source>Detune</source>
+ <translation type="obsolete">Desafinaciďż˝</translation>
+ </message>
+ <message>
+ <source>PWM</source>
+ <translation type="obsolete">PWM</translation>
+ </message>
+ <message>
+ <source>FM</source>
+ <translation type="obsolete">FM</translation>
+ </message>
+ <message>
+ <source>PW</source>
+ <translation type="obsolete">PW</translation>
+ </message>
+ <message>
+ <source>DCO 2</source>
+ <translation type="obsolete">DCO 2</translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation type="obsolete">Encendido</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>VAM 1.0beta2
+Virtual Analog for MusE
+Released under GPL.
+Copyright(C) 2002
+Jotsif Lindman Hörnlund
+( jotsif@linux.nu )</source>
+ <translation type="obsolete">VAM 1.0beta2
+Virtual Analog for MusE
+Released under GPL.
+Copyright(C) 2002
+Jotsif Lindman Hörnlund
+( jotsif@linux.nu )</translation>
+ </message>
+</context>
+<context>
+ <name>VelocityBase</name>
+ <message>
+ <source>MusE: Modify Velocity</source>
+ <translation type="unfinished">MusE: Modificar velocidad</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">Rango</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation type="unfinished">Todos los eventos</translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation type="unfinished">Eventos seleccionados</translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation type="unfinished">Eventos del bucle</translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation type="unfinished">Seleccionados y bucle</translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation type="unfinished">Valores</translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation type="unfinished">Velocidad:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished">Desplazamiento:</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished">%</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">Aceptar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Cancelar</translation>
+ </message>
+</context>
+<context>
+ <name>WTScale</name>
+ <message>
+ <source>bar scale</source>
+ <translation type="obsolete">escala de compases</translation>
+ </message>
+</context>
+<context>
+ <name>WaveEdit</name>
+ <message>
+ <source>Normalize</source>
+ <translation type="obsolete">Normalizar</translation>
+ </message>
+ <message>
+ <source>weTools</source>
+ <translation type="obsolete">Herramientas de Audio</translation>
+ </message>
+ <message>
+ <source>Solo</source>
+ <translation type="obsolete">Solo</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Cursor</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Archivo</translation>
+ </message>
+ <message>
+ <source>Functions</source>
+ <translation type="obsolete">Funciones</translation>
+ </message>
+</context>
+<context>
+ <name>WaveTrackInfoBase</name>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished">MusE: Informaciďż˝ de pista</translation>
+ </message>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished">Informaciďż˝ de pista</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished">Nombre de pista</translation>
+ </message>
+ <message>
+ <source>Output Route:</source>
+ <translation type="obsolete">Ruta de salida:</translation>
+ </message>
+ <message>
+ <source>Input Route:</source>
+ <translation type="obsolete">Ruta de netrada:</translation>
+ </message>
+ <message>
+ <source>Ports:</source>
+ <translation type="obsolete">Puertos:</translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="obsolete">Mono</translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="obsolete">Est�eo</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">apagado</translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay (Frames)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/muse/share/locale/muse_fr.qm b/muse/share/locale/muse_fr.qm
new file mode 100644
index 00000000..72c396c1
--- /dev/null
+++ b/muse/share/locale/muse_fr.qm
Binary files differ
diff --git a/muse/share/locale/muse_fr.ts b/muse/share/locale/muse_fr.ts
new file mode 100644
index 00000000..93fd1b2d
--- /dev/null
+++ b/muse/share/locale/muse_fr.ts
@@ -0,0 +1,7700 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name></name>
+ <message>
+ <source>Click this button to enable recording</source>
+ <translation type="obsolete">Cliquez sur ce bouton pour activer l&apos;enregistrement</translation>
+ </message>
+ <message>
+ <source>sets amount of quantization:
+0 - no quantization
+100 - full quantization</source>
+ <translation type="obsolete">DĂ©finit le niveau de quantisation:
+0 - pas de quantisation
+100 - quantisation complète</translation>
+ </message>
+ <message>
+ <source>select Pointer Tool:
+with the pointer tool you can:
+ select parts
+ move parts
+ copy parts</source>
+ <translation type="obsolete">Choisir l&apos;Outil de Pointage:
+avec l&apos;outil de pointage vous pouvez:
+ choisir des pièces
+ déplacer des pièces
+ copier des pièces</translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation type="obsolete">Insérer Note</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="obsolete">Insérer SysEx</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="obsolete">Insérer Ctrl</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="obsolete">Insérer Meta</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="obsolete">Insérr Canal de Pression</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="obsolete">Insérer une note de Pression</translation>
+ </message>
+</context>
+<context>
+ <name>@default</name>
+ <message>
+ <source>Click this button to open a &lt;em&gt;new song&lt;/em&gt;.&lt;br&gt;You can also select the &lt;b&gt;Open command&lt;/b&gt; from the File menu.</source>
+ <translation>Cliquez sur ce bouton pour ouvrir une &lt;em&gt;nouvelle chansong&lt;/em&gt;.&lt;br&gt;Vous pouvez aussi sélectionner la &lt;b&gt;commande Ouvrir&lt;/b&gt; à partir du menu Fichier.</translation>
+ </message>
+ <message>
+ <source>Click this button to save the song you are editing. You will be prompted for a file name.
+You can also select the Save command from the File menu.</source>
+ <translation>Cliquez sur ce bouton pour sauvegarder la chanson que vous éditez. Le nom de sauvegarde vous sera demandé.
+Vous pouvez aussi choisir la commande Enregistrer dans le menu Fichier.<byte value="x9"/></translation>
+ </message>
+ <message>
+ <source>Create New Song</source>
+ <translation>Créer une nouvelle chanson</translation>
+ </message>
+ <message>
+ <source>Click this button to stop playback</source>
+ <translation>Cliquez sur ce bouton pour arréter la lecture</translation>
+ </message>
+ <message>
+ <source>Click this button to start playback</source>
+ <translation>Cliquez sur ce bouton pour démarrer la lecture</translation>
+ </message>
+ <message>
+ <source>Click this button to rewind to start position</source>
+ <translation>Cliquez sur ce bouton pour revenir à la position de départ</translation>
+ </message>
+ <message>
+ <source>Click this button to rewind</source>
+ <translation>Cliquez sur ce bouton pour revenir en arrière</translation>
+ </message>
+ <message>
+ <source>Click this button to forward current play position</source>
+ <translation>Cliquez sur ce bouton pour avancer dans la lecture</translation>
+ </message>
+ <message>
+ <source>don&apos;t quantize notes above this tick limit</source>
+ <translation type="obsolete">Ne pas quantiser les notes sur cette limite (en tick)</translation>
+ </message>
+ <message>
+ <source>quantize also note len as default</source>
+ <translation type="obsolete">quantiser aussi la longueur de note par défault</translation>
+ </message>
+ <message>
+ <source>loop between left mark and right mark</source>
+ <translation>Boucler entre les marqueurs gauche et droit</translation>
+ </message>
+ <message>
+ <source>record starts at left mark</source>
+ <translation>l&apos;enregistrement démarre au marqueur gauche</translation>
+ </message>
+ <message>
+ <source>record stops at right mark</source>
+ <translation>l&apos;enregistrement s&apos;arrète au marqueur droit</translation>
+ </message>
+ <message>
+ <source>rewind to start position</source>
+ <translation>revenir à la position de départ</translation>
+ </message>
+ <message>
+ <source>rewind current position</source>
+ <translation>revenir Ă  la position en cours</translation>
+ </message>
+ <message>
+ <source>move current position</source>
+ <translation>déplacer la position en cours</translation>
+ </message>
+ <message>
+ <source>stop sequencer</source>
+ <translation>arréter le séquenceur</translation>
+ </message>
+ <message>
+ <source>start sequencer play</source>
+ <translation>démarrer la lecture du séquenceur</translation>
+ </message>
+ <message>
+ <source>to record press record and then play</source>
+ <translation>pour enregistrer, presser Enregistrement (Record) puis Lecture (Play)</translation>
+ </message>
+ <message>
+ <source>send note off to all midi channels</source>
+ <translation>envoyer ordre de relachement de note Ă  tous les canaux midi</translation>
+ </message>
+ <message>
+ <source>select Pencil Tool:
+with the pencil tool you can:
+ create new parts
+ modify length of parts</source>
+ <translation type="obsolete">Choisir l&apos;Outil Crayon
+avec le crayon vous pouvez:
+ créer de nouvelles pièces
+ modifier la longueur des pièces</translation>
+ </message>
+ <message>
+ <source>select Delete Tool:
+with the delete tool you can delete parts</source>
+ <translation type="obsolete">choisir l&apos;Outil Gomme:
+avec la gomme vous pouvez effacer les pièces</translation>
+ </message>
+ <message>
+ <source>select Cut Tool:
+with the cut tool you can split a part</source>
+ <translation type="obsolete">Choisir l&apos;Outil Ciseaux
+avec les ciseaux vous pouver couper une pièce</translation>
+ </message>
+ <message>
+ <source>select Glue Tool:
+with the glue tool you can glue two parts</source>
+ <translation type="obsolete">Choisir l&apos;Outil Colle:
+avec la colle vous pouvez coller deux pièces ensemble</translation>
+ </message>
+ <message>
+ <source>select Score Tool:
+</source>
+ <translation type="obsolete">Choisir l&apos;Outil Partition</translation>
+ </message>
+ <message>
+ <source>select Quantize Tool:
+insert display quantize event</source>
+ <translation type="obsolete">Choisir l&apos;Outil Quantisation:
+pour voir les marques de quantisation</translation>
+ </message>
+ <message>
+ <source>select Drawing Tool</source>
+ <translation type="obsolete">Choisir l&apos;Outil de Dessin</translation>
+ </message>
+ <message>
+ <source>select Muting Tool:
+click on part to mute/unmute</source>
+ <translation type="obsolete">Choisir l&apos;Outil Silence:
+cliquez sur une pièces pour la rendre muette ou pas.</translation>
+ </message>
+ <message>
+ <source>pointer</source>
+ <translation type="obsolete">pointeur</translation>
+ </message>
+ <message>
+ <source>pencil</source>
+ <translation type="obsolete">crayon</translation>
+ </message>
+ <message>
+ <source>rubber</source>
+ <translation type="obsolete">Ă©lastique</translation>
+ </message>
+ <message>
+ <source>cutter</source>
+ <translation type="obsolete">ciseaux</translation>
+ </message>
+ <message>
+ <source>score</source>
+ <translation type="obsolete">partition</translation>
+ </message>
+ <message>
+ <source>glue</source>
+ <translation type="obsolete">colle</translation>
+ </message>
+ <message>
+ <source>quantize</source>
+ <translation type="obsolete">quantisation</translation>
+ </message>
+ <message>
+ <source>draw</source>
+ <translation type="obsolete">dessin</translation>
+ </message>
+ <message>
+ <source>mute parts</source>
+ <translation type="obsolete">silence</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Arrt</translation>
+ </message>
+ <message>
+ <source>presets (*.pre *.pre.gz *.pre.bz2)</source>
+ <translation>réglages (presets: *.pre *.pre.gz *.pre.bz2)</translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation>Tous les Fichiers</translation>
+ </message>
+ <message>
+ <source>Add Midi Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Wave Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Audio Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Audio Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Audio Input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Aux Send</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click this button to enable recording</source>
+ <translation type="unfinished">Cliquez sur ce bouton pour activer l&apos;enregistrement</translation>
+ </message>
+ <message>
+ <source>Midi Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Output Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Input Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>AboutBox</name>
+ <message>
+ <source>AboutBox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keep On Rocking!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Version 0.7.0
+
+(C) Copyright 1999-2004 Werner Schweer and others.
+See http://lmuse.sourceforge.net for new versions and
+more information.
+
+Published under the GNU Public License</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Appearance</name>
+ <message>
+ <source>MusE: load image</source>
+ <translation>MusE: charger une image</translation>
+ </message>
+ <message>
+ <source>handle of transport window</source>
+ <translation type="obsolete">Accroche de la fenĂŞtre Transport</translation>
+ </message>
+ <message>
+ <source>track activity in arranger</source>
+ <translation type="obsolete">Activité des pistes dans l&apos;Arrangeur</translation>
+ </message>
+ <message>
+ <source>bigtime font color</source>
+ <translation type="obsolete">Couleur de la police dans le GrandChrono</translation>
+ </message>
+ <message>
+ <source>bigtime background color</source>
+ <translation type="obsolete">Couleur de fond du GrandChrono</translation>
+ </message>
+ <message>
+ <source>waveedit background color</source>
+ <translation type="obsolete">Couleur du fond de l&apos;Ă©diteur d&apos;Ă©chantillon</translation>
+ </message>
+</context>
+<context>
+ <name>AppearanceDialogBase</name>
+ <message>
+ <source>MusE: Appearance settings</source>
+ <translation>MusE: réglages de l&apos;apparence</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>Appliquer</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation>Arrangeur</translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation>Pièces</translation>
+ </message>
+ <message>
+ <source>show frames</source>
+ <translation type="obsolete">montrer les séparations</translation>
+ </message>
+ <message>
+ <source>show names</source>
+ <translation>montrer les noms</translation>
+ </message>
+ <message>
+ <source>show events</source>
+ <translation>montrer les évènements</translation>
+ </message>
+ <message>
+ <source>show Cakewalk Style</source>
+ <translation>montrer dans le style Cakewalk</translation>
+ </message>
+ <message>
+ <source>Events</source>
+ <translation>Evènement</translation>
+ </message>
+ <message>
+ <source>note on</source>
+ <translation>note on</translation>
+ </message>
+ <message>
+ <source>poly pressure</source>
+ <translation>pression poly</translation>
+ </message>
+ <message>
+ <source>controller</source>
+ <translation>contrleurs</translation>
+ </message>
+ <message>
+ <source>aftertouch</source>
+ <translation>pression (aftertouch)</translation>
+ </message>
+ <message>
+ <source>pitch bend</source>
+ <translation>molette de hauteur (pitch)</translation>
+ </message>
+ <message>
+ <source>program change</source>
+ <translation>sélection de programme (prog. change)</translation>
+ </message>
+ <message>
+ <source>special</source>
+ <translation>spécial</translation>
+ </message>
+ <message>
+ <source>Background picture</source>
+ <translation>image de fond</translation>
+ </message>
+ <message>
+ <source>bg</source>
+ <translation>fond</translation>
+ </message>
+ <message>
+ <source>select...</source>
+ <translation>choisissez...</translation>
+ </message>
+ <message>
+ <source>show snap grid</source>
+ <translation>voir la grille de positionnement</translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation>couleurs</translation>
+ </message>
+ <message>
+ <source>Items</source>
+ <translation>Objets</translation>
+ </message>
+ <message>
+ <source>selected</source>
+ <translation type="obsolete">sélectionné</translation>
+ </message>
+ <message>
+ <source>current:</source>
+ <translation type="obsolete">en cours:</translation>
+ </message>
+ <message>
+ <source>change...</source>
+ <translation type="obsolete">changer...</translation>
+ </message>
+ <message>
+ <source>dynamic colors for track activity in arranger</source>
+ <translation type="obsolete">Choix auto des couleurs pour l&apos;activité des pistes dans l&apos;Arrangeur</translation>
+ </message>
+ <message>
+ <source>Style/Fonts</source>
+ <translation>Styles/Polices</translation>
+ </message>
+ <message>
+ <source>QT Theme</source>
+ <translation>Thème</translation>
+ </message>
+ <message>
+ <source>Windows</source>
+ <translation>Windows</translation>
+ </message>
+ <message>
+ <source>MusE</source>
+ <translation>MusE</translation>
+ </message>
+ <message>
+ <source>Metal</source>
+ <translation>Metal</translation>
+ </message>
+ <message>
+ <source>Norwegian Wood</source>
+ <translation>Norwegian Wood</translation>
+ </message>
+ <message>
+ <source>Platinum</source>
+ <translation>Platinum</translation>
+ </message>
+ <message>
+ <source>CDE</source>
+ <translation>CDE</translation>
+ </message>
+ <message>
+ <source>Motif</source>
+ <translation>Motif</translation>
+ </message>
+ <message>
+ <source>Motif Plus</source>
+ <translation>Motif Plus</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation>Polices</translation>
+ </message>
+ <message>
+ <source>Family</source>
+ <translation>Famille</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <source>Font 1</source>
+ <translation>Police 1</translation>
+ </message>
+ <message>
+ <source>Font 2</source>
+ <translation>Police 2</translation>
+ </message>
+ <message>
+ <source>Font 3</source>
+ <translation>Police 3</translation>
+ </message>
+ <message>
+ <source>Font 0</source>
+ <translation>Police 0</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>Gras</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>Italique</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <source>Font 4</source>
+ <translation>Police 4</translation>
+ </message>
+ <message>
+ <source>Font 5</source>
+ <translation>Police 5</translation>
+ </message>
+ <message>
+ <source>Palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>add to palette</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="unfinished">S</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation type="unfinished">R</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Itemdsfkajlk jölk ljfölajföajföajf</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Arranger</name>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Curseur</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="obsolete">Aligne</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="obsolete">Longueur</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Type</translation>
+ </message>
+ <message>
+ <source>NO</source>
+ <translation type="obsolete">NON</translation>
+ </message>
+ <message>
+ <source>midi song type</source>
+ <translation type="obsolete">type de fichier midi</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Hauteur</translation>
+ </message>
+ <message>
+ <source>midi pitch</source>
+ <translation type="obsolete">hauteur midi</translation>
+ </message>
+ <message>
+ <source>global midi pitch shift</source>
+ <translation type="obsolete">transposition midi globale</translation>
+ </message>
+ <message>
+ <source>Tempo</source>
+ <translation type="obsolete">Tempo</translation>
+ </message>
+ <message>
+ <source>midi tempo</source>
+ <translation type="obsolete">tempo midi</translation>
+ </message>
+ <message>
+ <source>TrackInfo</source>
+ <translation type="obsolete">InfoPiste</translation>
+ </message>
+ <message>
+ <source>Track</source>
+ <translation type="obsolete">Piste</translation>
+ </message>
+ <message>
+ <source>O-Port</source>
+ <translation type="obsolete">0-Port</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="obsolete">Arrangeur</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Arrt</translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation type="obsolete">Mesure</translation>
+ </message>
+ <message>
+ <source>GM</source>
+ <translation type="obsolete">GM</translation>
+ </message>
+ <message>
+ <source>GS</source>
+ <translation type="obsolete">GS</translation>
+ </message>
+ <message>
+ <source>XG</source>
+ <translation type="obsolete">XG</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation type="obsolete">N</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation type="obsolete">R</translation>
+ </message>
+ <message>
+ <source>A</source>
+ <translation type="obsolete">A</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation type="obsolete">M</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="obsolete">S</translation>
+ </message>
+ <message>
+ <source>C</source>
+ <translation type="obsolete">C</translation>
+ </message>
+ <message>
+ <source>Ch</source>
+ <translation type="obsolete">Ch</translation>
+ </message>
+ <message>
+ <source>T</source>
+ <translation type="obsolete">T</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Matre</translation>
+ </message>
+ <message>
+ <source>Group A</source>
+ <translation type="obsolete">Groupe A</translation>
+ </message>
+ <message>
+ <source>Group B</source>
+ <translation type="obsolete">Groupe B</translation>
+ </message>
+ <message>
+ <source>Group C</source>
+ <translation type="obsolete">Groupe C</translation>
+ </message>
+ <message>
+ <source>Group D</source>
+ <translation type="obsolete">Groupe D</translation>
+ </message>
+</context>
+<context>
+ <name>AudioConfBase</name>
+ <message>
+ <source>MusE: Audio Configuration</source>
+ <translation type="obsolete">MusE: Configuration Audio</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="obsolete">&amp;Appliquer</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">A&amp;nnuler</translation>
+ </message>
+ <message>
+ <source>Audio Parameters</source>
+ <translation type="obsolete">Paramètres Audio</translation>
+ </message>
+ <message>
+ <source>32</source>
+ <translation type="obsolete">32</translation>
+ </message>
+ <message>
+ <source>64</source>
+ <translation type="obsolete">64</translation>
+ </message>
+ <message>
+ <source>128</source>
+ <translation type="obsolete">128</translation>
+ </message>
+ <message>
+ <source>256</source>
+ <translation type="obsolete">256</translation>
+ </message>
+ <message>
+ <source>512</source>
+ <translation type="obsolete">512</translation>
+ </message>
+ <message>
+ <source>1024</source>
+ <translation type="obsolete">1024</translation>
+ </message>
+ <message>
+ <source>2048</source>
+ <translation type="obsolete">2048</translation>
+ </message>
+ <message>
+ <source>4096</source>
+ <translation type="obsolete">4096</translation>
+ </message>
+ <message>
+ <source>Frame Size:</source>
+ <translation type="obsolete">Longueur des frames:</translation>
+ </message>
+ <message>
+ <source>Delay:</source>
+ <translation type="obsolete">DĂ©lai:</translation>
+ </message>
+ <message>
+ <source>Sample Rate:</source>
+ <translation type="obsolete">Vitesse d&apos;Ă©chantillonage:</translation>
+ </message>
+ <message>
+ <source>44100</source>
+ <translation type="obsolete">44100</translation>
+ </message>
+ <message>
+ <source>48000</source>
+ <translation type="obsolete">48000</translation>
+ </message>
+ <message>
+ <source>96000</source>
+ <translation type="obsolete">96000</translation>
+ </message>
+ <message>
+ <source>Audio Driver</source>
+ <translation type="obsolete">Pilote Audio</translation>
+ </message>
+ <message>
+ <source>Use Alsa</source>
+ <translation type="obsolete">Alsa</translation>
+ </message>
+ <message>
+ <source>Use JACK</source>
+ <translation type="obsolete">JACK</translation>
+ </message>
+ <message>
+ <source>No Audio</source>
+ <translation type="obsolete">Pas d&apos;audio</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation type="obsolete">Etat:</translation>
+ </message>
+ <message>
+ <source>TextLabel6</source>
+ <translation type="obsolete">TextLabel6</translation>
+ </message>
+</context>
+<context>
+ <name>AudioMixerApp</name>
+ <message>
+ <source>1/2 channel</source>
+ <translation type="obsolete">1/2 canal</translation>
+ </message>
+ <message>
+ <source>pre fader - post fader</source>
+ <translation type="obsolete">pre fader - post fader</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="obsolete">enregistrement</translation>
+ </message>
+ <message>
+ <source>mute</source>
+ <translation type="obsolete">silence</translation>
+ </message>
+ <message>
+ <source>pre fader listening</source>
+ <translation type="obsolete">Ă©coute pre fader</translation>
+ </message>
+ <message>
+ <source>record downmix</source>
+ <translation type="obsolete">enregistrer mixdown</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="obsolete">arr</translation>
+ </message>
+ <message>
+ <source>output routing</source>
+ <translation type="obsolete">chemin de sortie (routing)</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Configuration</translation>
+ </message>
+ <message>
+ <source>Add Input Strip</source>
+ <translation type="obsolete">Ajouter une Bande d&apos;Entrée</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="obsolete">S</translation>
+ </message>
+ <message>
+ <source>Pre</source>
+ <translation type="obsolete">Pre</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="obsolete">dB</translation>
+ </message>
+ <message>
+ <source>MusE: Audio Mixer</source>
+ <translation type="obsolete">MusE: Mixer Audio</translation>
+ </message>
+ <message>
+ <source>Inputs</source>
+ <translation type="obsolete">Entrées</translation>
+ </message>
+ <message>
+ <source>Synthi</source>
+ <translation type="obsolete">Synth</translation>
+ </message>
+ <message>
+ <source>Tracks</source>
+ <translation type="obsolete">Pistes</translation>
+ </message>
+ <message>
+ <source>Groups</source>
+ <translation type="obsolete">Groupes</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Matre</translation>
+ </message>
+ <message>
+ <source>Group A</source>
+ <translation type="obsolete">Groupe A</translation>
+ </message>
+ <message>
+ <source>Group B</source>
+ <translation type="obsolete">Groupe B</translation>
+ </message>
+ <message>
+ <source>Group C</source>
+ <translation type="obsolete">Groupe C</translation>
+ </message>
+ <message>
+ <source>Group D</source>
+ <translation type="obsolete">Groupe D</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="obsolete">Aucun</translation>
+ </message>
+</context>
+<context>
+ <name>AudioStrip</name>
+ <message>
+ <source>Pan</source>
+ <translation type="obsolete">Pan</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="obsolete">S</translation>
+ </message>
+ <message>
+ <source>1/2 channel</source>
+ <translation type="obsolete">1/2 canal</translation>
+ </message>
+ <message>
+ <source>Pre</source>
+ <translation type="obsolete">Pre</translation>
+ </message>
+ <message>
+ <source>pre fader - post fader</source>
+ <translation type="obsolete">pre fader - post fader</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="obsolete">dB</translation>
+ </message>
+ <message>
+ <source>mute</source>
+ <translation type="obsolete">silence</translation>
+ </message>
+ <message>
+ <source>record downmix</source>
+ <translation type="obsolete">enregistrer mixdown</translation>
+ </message>
+ <message>
+ <source>pre fader listening</source>
+ <translation type="obsolete">Ă©coute pre fader</translation>
+ </message>
+ <message>
+ <source>output routing</source>
+ <translation type="obsolete">chemin de sortie (routing)</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="obsolete">Canal</translation>
+ </message>
+</context>
+<context>
+ <name>BigTime</name>
+ <message>
+ <source>MusE: Bigtime</source>
+ <translation type="obsolete">MusE: GrandChrono</translation>
+ </message>
+</context>
+<context>
+ <name>ClipListEdit</name>
+ <message>
+ <source>MusE: Clip List Editor</source>
+ <translation type="obsolete">MusE: Editeur de la Liste de Clips</translation>
+ </message>
+</context>
+<context>
+ <name>ClipListEditorBase</name>
+ <message>
+ <source>MusE: ClipList</source>
+ <translation>MusE: Liste de Clips</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Refs</source>
+ <translation>RĂ©fs</translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation>DĂ©part</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation>Long</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation>Données</translation>
+ </message>
+ <message>
+ <source>Clip Properties</source>
+ <translation>Propriétés du Clip</translation>
+ </message>
+ <message>
+ <source>Pos:</source>
+ <translation>Pos:</translation>
+ </message>
+ <message>
+ <source>Len:</source>
+ <translation>Long:</translation>
+ </message>
+</context>
+<context>
+ <name>CommentBase</name>
+ <message>
+ <source>Form1</source>
+ <translation>Forme1</translation>
+ </message>
+ <message>
+ <source>Track Comment</source>
+ <translation>Commentaire pour la Piste</translation>
+ </message>
+ <message>
+ <source>Track 1</source>
+ <translation>Piste 1</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiCtrlBase</name>
+ <message>
+ <source>MusE: Config Midi Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automated Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiFileBase</name>
+ <message>
+ <source>MusE: Config Midi File Export</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0 (single track)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 (multiple tracks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Format:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation type="unfinished">96</translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation type="unfinished">192</translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation type="unfinished">384</translation>
+ </message>
+ <message>
+ <source>Division:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copyright:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable extended smf format</source>
+ <translation type="unfinished">Activer la prise en charge du format smf Ă©tendu</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigTrackListBase</name>
+ <message>
+ <source>MusE: Config Track List</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Aux</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation type="unfinished">Synthétiseur virtuel</translation>
+ </message>
+ <message>
+ <source>Midi Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum Track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available Items:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configured Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Name Size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CtrlPanel</name>
+ <message>
+ <source>select controller</source>
+ <translation type="obsolete">Choisissez le contrlleur</translation>
+ </message>
+ <message>
+ <source>remove panel</source>
+ <translation type="obsolete">enlever le panneau</translation>
+ </message>
+ <message>
+ <source>other ...</source>
+ <translation type="obsolete">autres...</translation>
+ </message>
+ <message>
+ <source>Sel</source>
+ <translation type="obsolete">SĂ©l</translation>
+ </message>
+ <message>
+ <source>x</source>
+ <translation type="obsolete">x</translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="obsolete">Vélocité</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Hauteur</translation>
+ </message>
+</context>
+<context>
+ <name>DeicsOnzeGuiBase</name>
+ <message>
+ <source>DeicsOnze</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Presets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subcategory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PRO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished">Réglages enregistrés</translation>
+ </message>
+ <message>
+ <source>Bank numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NONE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>INITVOICE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op4 Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Feedback level of the operator 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modulation Matrix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Algorithm 1&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 2&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by both &lt;i&gt;Op 3&lt;/i&gt; and &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 3&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 4&lt;/i&gt; and &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 4&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 2&lt;/i&gt; and &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 5&lt;/b&gt; : (&lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt;) add to (&lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;) &lt;br&gt;
+&lt;b&gt;Algorithm 6&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; all modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 7&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; with &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 8&lt;/b&gt; : addition of the four &lt;i&gt;Op 1, 2, 3, 4&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Waveform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished">Vitesse</translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Envelope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Volume</source>
+ <translation type="unfinished">Volume</translation>
+ </message>
+ <message>
+ <source>Frequency 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FIX</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle Fix Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Enable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keyboard Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Eg Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack Rate of the operator 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>48dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>24dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>12dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form 1 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)&lt;/i&gt;&lt;br&gt;
+Wave form 2 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;))&lt;/i&gt;&lt;br&gt;
+Wave form 3 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 4 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 5 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 6 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 7 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 8 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>2° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rate Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>amplitude Envelope 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Fun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phony Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>POLY</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MONO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foot Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bend Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Hauteur</translation>
+ </message>
+ <message>
+ <source>Modulation Wheel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Breath Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>After Touch</source>
+ <translation type="unfinished">Pression (After Touch)</translation>
+ </message>
+ <message>
+ <source>Potamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FINGER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FULL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PT</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foot Switch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="unfinished">Transposition</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="unfinished">&amp;Configuration</translation>
+ </message>
+ <message>
+ <source>Configuration File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished">Enregistrer</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quality</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Middle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NbrV</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of Voices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation type="unfinished">couleurs</translation>
+ </message>
+ <message>
+ <source>Red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="unfinished">Texte</translation>
+ </message>
+ <message>
+ <source>Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save only the used presets into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the entire set into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the configuration into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DrumEdit</name>
+ <message>
+ <source>Load Map</source>
+ <translation type="obsolete">Charger</translation>
+ </message>
+ <message>
+ <source>Save Map</source>
+ <translation type="obsolete">Enregistrer</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Editer</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Couper</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Copier</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Coller</translation>
+ </message>
+ <message>
+ <source>Delete Events</source>
+ <translation type="obsolete">Effacer</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="obsolete">Tout sélectionner</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation type="obsolete">Dé-sélectionner</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Inverser</translation>
+ </message>
+ <message>
+ <source>Inside Loop</source>
+ <translation type="obsolete">Dans la boucle</translation>
+ </message>
+ <message>
+ <source>Outside Loop</source>
+ <translation type="obsolete">Hors de la boucle</translation>
+ </message>
+ <message>
+ <source>&amp;Select</source>
+ <translation type="obsolete">&amp;SĂ©lectionner</translation>
+ </message>
+ <message>
+ <source>Step Record</source>
+ <translation type="obsolete">Enregistrement pas-Ă -pas</translation>
+ </message>
+ <message>
+ <source>Midi Input</source>
+ <translation type="obsolete">Entrée Midi</translation>
+ </message>
+ <message>
+ <source>Add Controller View</source>
+ <translation type="obsolete">Ajouter une Vue de contrlleurs</translation>
+ </message>
+ <message>
+ <source>M</source>
+ <translation type="obsolete">M</translation>
+ </message>
+ <message>
+ <source>Sound</source>
+ <translation type="obsolete">Son</translation>
+ </message>
+ <message>
+ <source>QNT</source>
+ <translation type="obsolete">QNT</translation>
+ </message>
+ <message>
+ <source>E-Note</source>
+ <translation type="obsolete">E-Note</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="obsolete">Long</translation>
+ </message>
+ <message>
+ <source>A-Note</source>
+ <translation type="obsolete">A-Note</translation>
+ </message>
+ <message>
+ <source>Ch</source>
+ <translation type="obsolete">Ch</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Port</translation>
+ </message>
+ <message>
+ <source>LV1</source>
+ <translation type="obsolete">LV1</translation>
+ </message>
+ <message>
+ <source>LV2</source>
+ <translation type="obsolete">LV2</translation>
+ </message>
+ <message>
+ <source>LV3</source>
+ <translation type="obsolete">LV3</translation>
+ </message>
+ <message>
+ <source>LV4</source>
+ <translation type="obsolete">LV4</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Fichier</translation>
+ </message>
+ <message>
+ <source>Load Drummap</source>
+ <translation type="obsolete">Charger Set de Batterie</translation>
+ </message>
+ <message>
+ <source>Store Drummap</source>
+ <translation type="obsolete">Enregistrer Set de Batterie</translation>
+ </message>
+ <message>
+ <source>ctrl</source>
+ <translation type="obsolete">ctrl</translation>
+ </message>
+ <message>
+ <source>drummaps</source>
+ <translation type="obsolete">Sets de Batterie</translation>
+ </message>
+ <message>
+ <source>Muse: Load Drum Map</source>
+ <translation type="obsolete">MusE: Charger Set de Batt.</translation>
+ </message>
+ <message>
+ <source>MusE: Store Drum Map</source>
+ <translation type="obsolete">MusE: Enregistrer Set de Batt.</translation>
+ </message>
+ <message>
+ <source>&amp;Functions</source>
+ <translation type="obsolete">&amp;Fonctions</translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation type="obsolete">Modifier la vélocité</translation>
+ </message>
+</context>
+<context>
+ <name>EditCAfterDialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Position temporelle</translation>
+ </message>
+ <message>
+ <source>Pressure</source>
+ <translation type="obsolete">Pression</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Channel Aftertouch</source>
+ <translation type="obsolete">MusE: Entrez le Canal de Pression (AfterTouch)</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl14Dialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Position temporelle</translation>
+ </message>
+ <message>
+ <source>Controller-H</source>
+ <translation type="obsolete">Contrlleur H</translation>
+ </message>
+ <message>
+ <source>Controller-L</source>
+ <translation type="obsolete">Contrlleur L</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="obsolete">Valeur</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Controller14 Event</source>
+ <translation type="obsolete">MusE: Entrer l&apos;évènement Contrlleur 14</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl7Dialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Position temporelle</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="obsolete">Contrlleur</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="obsolete">Valeur</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Controller Event</source>
+ <translation type="obsolete">MusE: Entrez l&apos;Evénement Contrlleur</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl7DialogBase</name>
+ <message>
+ <source>MusE: Enter Controller</source>
+ <translation>Muse: Entrez le Contrlleur</translation>
+ </message>
+ <message>
+ <source>Controller:</source>
+ <translation>Contrlleur:</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Position temporelle</translation>
+ </message>
+ <message>
+ <source>Value:</source>
+ <translation>Valeur</translation>
+ </message>
+ <message>
+ <source>controller value</source>
+ <translation>Valeur du Contrlleur</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrlBase</name>
+ <message>
+ <source>MusE: Edit Controller Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create New Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished">Valeur</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation type="unfinished">H-Bank</translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation type="unfinished">L-Bank</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">arr</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Channel:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditEventDialog</name>
+ <message>
+ <source>Ok</source>
+ <translation type="obsolete">Ok</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>EditInstrumentBase</name>
+ <message>
+ <source>MusE: Instrument Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patches</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High Bank:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low Bank:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <comment>dont care</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch/Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>GM</source>
+ <translation type="unfinished">GM</translation>
+ </message>
+ <message>
+ <source>GS</source>
+ <translation type="unfinished">GS</translation>
+ </message>
+ <message>
+ <source>XG</source>
+ <translation type="unfinished">XG</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Nom</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Type</translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished">RPN</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished">NRPN</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Hauteur</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">Entre</translation>
+ </message>
+ <message>
+ <source>Min</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="unfinished">list des controleurs définis</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="unfinished">C&apos;est la liste des controleurs qui ont été définis</translation>
+ </message>
+ <message>
+ <source>SysEx</source>
+ <translation type="unfinished">SysEx</translation>
+ </message>
+ <message>
+ <source>Initialization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation type="unfinished">Panique!</translation>
+ </message>
+ <message>
+ <source>Hex Entry:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Fichier</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Nouveau</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished">Enregistrer</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished">&amp;Enregistrer</translation>
+ </message>
+ <message>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditMetaDialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Position temporelle</translation>
+ </message>
+ <message>
+ <source>Meta Type</source>
+ <translation type="obsolete">Meta Type</translation>
+ </message>
+ <message>
+ <source>Enter Hex</source>
+ <translation type="obsolete">Entrez en Hexa</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Meta Event</source>
+ <translation type="obsolete">MusE: Entrer un Evènement en Hexa</translation>
+ </message>
+</context>
+<context>
+ <name>EditMetaDialogBase</name>
+ <message>
+ <source>MusE: Enter Meta Event</source>
+ <translation>MusE: Entrer un Méta Evènement</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>TextLabel1</source>
+ <translation>TextLabel1</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Position temporelle</translation>
+ </message>
+ <message>
+ <source>Meta Type:</source>
+ <translation>Meta Type</translation>
+ </message>
+ <message>
+ <source>Enter Hex</source>
+ <translation>Entrée Hexa</translation>
+ </message>
+</context>
+<context>
+ <name>EditNoteDialogBase</name>
+ <message>
+ <source>MusE: Enter Note</source>
+ <translation>Mus2: Entrer la Note</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>ANnuler</translation>
+ </message>
+ <message>
+ <source>Length:</source>
+ <translation>Longueur:</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Position temporelle:</translation>
+ </message>
+ <message>
+ <source>Pitch:</source>
+ <translation>Hauteur</translation>
+ </message>
+ <message>
+ <source>Velocity On:</source>
+ <translation>Vélocité On:</translation>
+ </message>
+ <message>
+ <source>Velocity Off:</source>
+ <translation>Vélocité Off:</translation>
+ </message>
+</context>
+<context>
+ <name>EditPAfterDialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Position temporelle</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Hauteur</translation>
+ </message>
+ <message>
+ <source>Pressure</source>
+ <translation type="obsolete">Pression</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Poly Aftertouch</source>
+ <translation type="obsolete">Muse: Entrer la Pression polyph.</translation>
+ </message>
+</context>
+<context>
+ <name>EditPitchDialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Editer la Position temporelle</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Hauteur</translation>
+ </message>
+ <message>
+ <source>MusE: Enter Pitch Shift</source>
+ <translation type="obsolete">MusE: Entrez le décalage de Hauteur:</translation>
+ </message>
+</context>
+<context>
+ <name>EditSysexDialogBase</name>
+ <message>
+ <source>MusE: Enter SysEx</source>
+ <translation>MusE: Entrer le Sysex</translation>
+ </message>
+ <message>
+ <source>TimePosition:</source>
+ <translation>Position temporelle</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>Commentaires:</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Known SysEx:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditToolBar</name>
+ <message>
+ <source>Edit Tools</source>
+ <translation type="obsolete">Outils d&apos;Edition</translation>
+ </message>
+</context>
+<context>
+ <name>EffectRack</name>
+ <message>
+ <source>effect rack</source>
+ <translation type="obsolete">rack d&apos;effets</translation>
+ </message>
+ <message>
+ <source>move up</source>
+ <translation type="obsolete">DĂ©placer vers le haut</translation>
+ </message>
+ <message>
+ <source>move down</source>
+ <translation type="obsolete">DĂ©placer vers le bas</translation>
+ </message>
+ <message>
+ <source>remove</source>
+ <translation type="obsolete">enlever</translation>
+ </message>
+ <message>
+ <source>bypass</source>
+ <translation type="obsolete">direct</translation>
+ </message>
+ <message>
+ <source>show gui</source>
+ <translation type="obsolete">montrer l&apos;interface</translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation type="obsolete">nouveau</translation>
+ </message>
+ <message>
+ <source>change</source>
+ <translation type="obsolete">changement</translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDGuiBase</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished">Form1</translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished">Set de Sons</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Charger</translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDSynthGuiBase</name>
+ <message>
+ <source>FLUID Synth</source>
+ <translation type="unfinished">FLUID Synth</translation>
+ </message>
+ <message>
+ <source>Gain</source>
+ <translation type="unfinished">Gain</translation>
+ </message>
+ <message>
+ <source>Room Size</source>
+ <translation type="unfinished">Dimension de la chambre</translation>
+ </message>
+ <message>
+ <source>Damping</source>
+ <translation type="unfinished">Atténuation</translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation type="unfinished">Niveau</translation>
+ </message>
+ <message>
+ <source>Width</source>
+ <translation type="unfinished">Largeur</translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished">Vitesse</translation>
+ </message>
+ <message>
+ <source>Depth</source>
+ <translation type="unfinished">Profondeur</translation>
+ </message>
+ <message>
+ <source>Number</source>
+ <translation type="unfinished">Nombre</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Type</translation>
+ </message>
+ <message>
+ <source>Sine</source>
+ <translation type="unfinished">Sinusoide</translation>
+ </message>
+ <message>
+ <source>Triangle</source>
+ <translation type="unfinished">Triangle</translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished">RĂ©verb</translation>
+ </message>
+ <message>
+ <source>Chorus</source>
+ <translation type="unfinished">Chorus</translation>
+ </message>
+ <message>
+ <source>Pop</source>
+ <translation type="obsolete">Pop</translation>
+ </message>
+ <message>
+ <source>Push</source>
+ <translation type="obsolete">Pousser</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation type="obsolete">...</translation>
+ </message>
+ <message>
+ <source>show fluidsynth controls</source>
+ <translation type="obsolete">Montrer les contrles de fluidsynth</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">charger</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Enregistrer</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dump Info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fontname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CHANNEL SETUP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LOADED SOUNDFONTS</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileDialogButtons</name>
+ <message>
+ <source>Form1</source>
+ <translation>Form1</translation>
+ </message>
+ <message>
+ <source>Global</source>
+ <translation>Global</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Utilisateur</translation>
+ </message>
+ <message>
+ <source>Project</source>
+ <translation>Projet</translation>
+ </message>
+ <message>
+ <source>Load:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Songdata +
+Cofiguration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>only
+Songdata</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FontSel</name>
+ <message>
+ <source>Size:</source>
+ <translation type="obsolete">Taille:</translation>
+ </message>
+</context>
+<context>
+ <name>GateTimeBase</name>
+ <message>
+ <source>MusE: Modify Gate Time</source>
+ <translation>MusE: modifier le temps de fermeture (Gate Time)</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation>Entre</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation>Tous les Evènements</translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation>Evènements choisis</translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation>Evènements bouclés</translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation>Boucle &amp; sélectionnée</translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation>Valeurs</translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation>Vitesse:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation>DĂ©calage:</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>GlobalSettingsDialogBase</name>
+ <message>
+ <source>MusE: Global Settings</source>
+ <translation>MusE: Paramètres</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Mixer</source>
+ <translation>Mixer</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation>dB</translation>
+ </message>
+ <message>
+ <source>min. Meter Value</source>
+ <translation>MĂ©trage min.</translation>
+ </message>
+ <message>
+ <source>min.Slider Val</source>
+ <translation>Val. mini. du Curseur</translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation>Midi</translation>
+ </message>
+ <message>
+ <source>Ticks</source>
+ <translation>Tic</translation>
+ </message>
+ <message>
+ <source>1024</source>
+ <translation>1024</translation>
+ </message>
+ <message>
+ <source>2048</source>
+ <translation>2048</translation>
+ </message>
+ <message>
+ <source>4096</source>
+ <translation>4096</translation>
+ </message>
+ <message>
+ <source>8172</source>
+ <translation>8172</translation>
+ </message>
+ <message>
+ <source>Displayed Resolution
+(Ticks/Quarternote)</source>
+ <translation>Résolution affichée (Tics par 1/4 de note)</translation>
+ </message>
+ <message>
+ <source>48</source>
+ <translation>48</translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation>96</translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation>192</translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation>384</translation>
+ </message>
+ <message>
+ <source>768</source>
+ <translation>768</translation>
+ </message>
+ <message>
+ <source>1536</source>
+ <translation>1536</translation>
+ </message>
+ <message>
+ <source>3072</source>
+ <translation>3072</translation>
+ </message>
+ <message>
+ <source>6144</source>
+ <translation>6144</translation>
+ </message>
+ <message>
+ <source>12288</source>
+ <translation>12288</translation>
+ </message>
+ <message>
+ <source>RTC Resolution
+(Ticks/Sec)</source>
+ <translation>RĂ©solution RTC (Tics par sec.)</translation>
+ </message>
+ <message>
+ <source>GUI</source>
+ <translation>GUI</translation>
+ </message>
+ <message>
+ <source>/sec</source>
+ <translation>/sec</translation>
+ </message>
+ <message>
+ <source>GUI Refresh Rate</source>
+ <translation>Vitesse de rafraichissement de l&apos;interface</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation>&amp;Appliquer</translation>
+ </message>
+ <message>
+ <source>&amp;Ok</source>
+ <translation>&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>Help Browser:</source>
+ <translation>Navigateur pour l&apos;aide:</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start Muse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with last song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start song:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Views</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>y-pos</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>x-pos</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Big Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished">Arrangeur</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transport</translation>
+ </message>
+ <message>
+ <source>Cur</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>set current values</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with template: default.med</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show splash screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>use JACK freewheel mode if possible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LMaster</name>
+ <message>
+ <source>new tempo</source>
+ <translation type="obsolete">nouveau tempo</translation>
+ </message>
+ <message>
+ <source>new signature</source>
+ <translation type="obsolete">nouvelle signature</translation>
+ </message>
+ <message>
+ <source>Meter</source>
+ <translation type="obsolete">MĂ©trage</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation type="obsolete">Temps</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Type</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="obsolete">Valeur</translation>
+ </message>
+ <message>
+ <source>MusE: Mastertrack</source>
+ <translation type="obsolete">MusE: Piste principale</translation>
+ </message>
+ <message>
+ <source>Tempo</source>
+ <translation type="obsolete">Tempo</translation>
+ </message>
+ <message>
+ <source>Timesig</source>
+ <translation type="obsolete">Signature Temporelle</translation>
+ </message>
+</context>
+<context>
+ <name>ListEdit</name>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Edition</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Couper</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Copier</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Coller</translation>
+ </message>
+ <message>
+ <source>Delete Events</source>
+ <translation type="obsolete">Effacer évènements</translation>
+ </message>
+ <message>
+ <source>List Tools</source>
+ <translation type="obsolete">Outils de Liste</translation>
+ </message>
+ <message>
+ <source>Insert Tools</source>
+ <translation type="obsolete">Outils d&apos;Insertion</translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation type="obsolete">Insérer Note</translation>
+ </message>
+ <message>
+ <source>insert Note</source>
+ <translation type="obsolete">insére une note</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="obsolete">Insérer SysEx</translation>
+ </message>
+ <message>
+ <source>insert SysEx</source>
+ <translation type="obsolete">insère une commande midi SysEx</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="obsolete">Insérer Ctrl</translation>
+ </message>
+ <message>
+ <source>insert Ctrl</source>
+ <translation type="obsolete">insére un caractère de Controle</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="obsolete">Insérer Meta</translation>
+ </message>
+ <message>
+ <source>insert Meta</source>
+ <translation type="obsolete">insére une balise Meta</translation>
+ </message>
+ <message>
+ <source>Insert Pitch</source>
+ <translation type="obsolete">Insérer Hauteur</translation>
+ </message>
+ <message>
+ <source>insert Pitch</source>
+ <translation type="obsolete">insére un changement de tonalité</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="obsolete">Insérr Canal de Pression</translation>
+ </message>
+ <message>
+ <source>insert Channel Aftertouch</source>
+ <translation type="obsolete">insére un canal de Pression (AfterTouch)</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="obsolete">Insérer une note de Pression</translation>
+ </message>
+ <message>
+ <source>insert Poly Aftertouch</source>
+ <translation type="obsolete">insère une Pression (AfterTouch) polyphonique</translation>
+ </message>
+ <message>
+ <source>Tick</source>
+ <translation type="obsolete">Tic</translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation type="obsolete">Mesure</translation>
+ </message>
+ <message>
+ <source>Typ</source>
+ <translation type="obsolete">Typ</translation>
+ </message>
+ <message>
+ <source>Ch</source>
+ <translation type="obsolete">Can</translation>
+ </message>
+ <message>
+ <source>Val A</source>
+ <translation type="obsolete">Val A</translation>
+ </message>
+ <message>
+ <source>Val B</source>
+ <translation type="obsolete">Val B</translation>
+ </message>
+ <message>
+ <source>Val C</source>
+ <translation type="obsolete">Val C</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="obsolete">Lon</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="obsolete">Comment.</translation>
+ </message>
+</context>
+<context>
+ <name>MITTransposeBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Transpose</source>
+ <translation type="unfinished">MusE: Plugin d&apos;Entrée Midi: Transposition</translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation type="unfinished">On</translation>
+ </message>
+ <message>
+ <source>TriggerKey</source>
+ <translation type="unfinished">Note de DĂ©clenchement</translation>
+ </message>
+ <message>
+ <source>Transpose:</source>
+ <translation type="unfinished">Transposition:</translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation type="unfinished">+0</translation>
+ </message>
+</context>
+<context>
+ <name>MPConfig</name>
+ <message>
+ <source>none</source>
+ <translation type="obsolete">aucun</translation>
+ </message>
+ <message>
+ <source>other raw ...</source>
+ <translation type="obsolete">autre brut (raw)...</translation>
+ </message>
+ <message>
+ <source>MusE: Midi Port Table</source>
+ <translation type="obsolete">MusE: Table des ports Midi</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Port</translation>
+ </message>
+ <message>
+ <source>GUI</source>
+ <translation type="obsolete">GUI</translation>
+ </message>
+ <message>
+ <source>Rec</source>
+ <translation type="obsolete">Enr</translation>
+ </message>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">Instrument</translation>
+ </message>
+ <message>
+ <source>Device Name</source>
+ <translation type="obsolete">Nom du Périphérique</translation>
+ </message>
+ <message>
+ <source>State</source>
+ <translation type="obsolete">Etat</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="obsolete">inconnu</translation>
+ </message>
+</context>
+<context>
+ <name>MRConfigBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Remote Control</source>
+ <translation>MusE: Plugin d&apos;Entrée Midi: Contrôle Distant</translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation>Activer</translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation>On</translation>
+ </message>
+ <message>
+ <source>Actions</source>
+ <translation>Actions</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation>Enregistre</translation>
+ </message>
+ <message>
+ <source>Goto Left Mark</source>
+ <translation>Aller Ă  la Marque Gauche</translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation>Jouer</translation>
+ </message>
+</context>
+<context>
+ <name>MTScale</name>
+ <message>
+ <source>bar scale</source>
+ <translation type="obsolete">Echelle de la mesure</translation>
+ </message>
+</context>
+<context>
+ <name>MarkerView</name>
+ <message>
+ <source>Bar:Beat:Tick</source>
+ <translation type="obsolete">Mesure:RĂ©solution(Beat):Tic</translation>
+ </message>
+ <message>
+ <source>Hr:Mn:Sc:Fr:Sf</source>
+ <translation type="obsolete">Hr:Mn:Sc:Fr:Sf</translation>
+ </message>
+ <message>
+ <source>Lock</source>
+ <translation type="obsolete">Verrouillage</translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="obsolete">Texte</translation>
+ </message>
+ <message>
+ <source>Marker Properties</source>
+ <translation type="obsolete">Propriétés du Marqueur</translation>
+ </message>
+ <message>
+ <source>MusE: Marker</source>
+ <translation type="obsolete">MusE: Marqueur</translation>
+ </message>
+ <message>
+ <source>add marker</source>
+ <translation type="obsolete">Ajouter marqueur</translation>
+ </message>
+ <message>
+ <source>Add Marker</source>
+ <translation type="obsolete">Ajoute un marqueur</translation>
+ </message>
+ <message>
+ <source>delete marker</source>
+ <translation type="obsolete">Effacer Marqueur</translation>
+ </message>
+ <message>
+ <source>Delete Marker</source>
+ <translation type="obsolete">Efface le marqueur</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Fichier</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Edition</translation>
+ </message>
+</context>
+<context>
+ <name>MasterEdit</name>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Maitre</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Curseur</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="obsolete">Aligne</translation>
+ </message>
+ <message>
+ <source>time at cursor position</source>
+ <translation type="obsolete">Temps Ă  la position du curseur</translation>
+ </message>
+ <message>
+ <source>tempo at cursor position</source>
+ <translation type="obsolete">Temps Ă  la position du curseur</translation>
+ </message>
+ <message>
+ <source>CurPos </source>
+ <translation type="obsolete">PosCur</translation>
+ </message>
+ <message>
+ <source>tempo at current position</source>
+ <translation type="obsolete">tempo Ă  la position en cours</translation>
+ </message>
+ <message>
+ <source>time signature at current position</source>
+ <translation type="obsolete">Signature temporellet Ă  la position en cours</translation>
+ </message>
+ <message>
+ <source>MusE: Mastertrack</source>
+ <translation type="obsolete">MusE: PistePrincipale</translation>
+ </message>
+ <message>
+ <source>edit tools</source>
+ <translation type="obsolete">outils d&apos;Ă©dition</translation>
+ </message>
+ <message>
+ <source>EnableMaster</source>
+ <translation type="obsolete">ActiverMaitre</translation>
+ </message>
+ <message>
+ <source>use master track</source>
+ <translation type="obsolete">Utiliser la piste principale</translation>
+ </message>
+ <message>
+ <source>Info</source>
+ <translation type="obsolete">Info</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Off</translation>
+ </message>
+</context>
+<context>
+ <name>MetronomeConfigBase</name>
+ <message>
+ <source>MusE: Metronome Config</source>
+ <translation type="obsolete">MusE: Configuration du MĂ©tronome</translation>
+ </message>
+ <message>
+ <source>Metronome</source>
+ <translation type="obsolete">MĂ©tronome</translation>
+ </message>
+ <message>
+ <source>Audio Beep</source>
+ <translation type="obsolete">Bip audio</translation>
+ </message>
+ <message>
+ <source>MIDI Click</source>
+ <translation type="obsolete">Clic MIDI</translation>
+ </message>
+ <message>
+ <source>Midi Channel</source>
+ <translation type="obsolete">Canal Midi</translation>
+ </message>
+ <message>
+ <source>Measure Note</source>
+ <translation type="obsolete">Note Mesure</translation>
+ </message>
+ <message>
+ <source>Measure Velocity</source>
+ <translation type="obsolete">Vélocité de la Mesure</translation>
+ </message>
+ <message>
+ <source>Beat Velocity</source>
+ <translation type="obsolete">Résolution (Beat) de la Vélocité</translation>
+ </message>
+ <message>
+ <source>Beat Note</source>
+ <translation type="obsolete">Note de RĂ©solution (Beat)</translation>
+ </message>
+ <message>
+ <source>Midi Port</source>
+ <translation type="obsolete">Port MIDI</translation>
+ </message>
+ <message>
+ <source>Precount</source>
+ <translation type="obsolete">Pré-compte</translation>
+ </message>
+ <message>
+ <source>enable</source>
+ <translation type="obsolete">activer</translation>
+ </message>
+ <message>
+ <source>Bars</source>
+ <translation type="obsolete">Mesures</translation>
+ </message>
+ <message>
+ <source>From Mastertrack</source>
+ <translation type="obsolete">de la Piste Principale</translation>
+ </message>
+ <message>
+ <source>/</source>
+ <translation type="obsolete">/</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation type="obsolete">Signature</translation>
+ </message>
+ <message>
+ <source>Prerecord</source>
+ <translation type="obsolete">Pré-enregistrement</translation>
+ </message>
+ <message>
+ <source>Preroll</source>
+ <translation type="obsolete">PreRoll</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="obsolete">&amp;Appliquer</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>MidiController</name>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Vélocité</translation>
+ </message>
+</context>
+<context>
+ <name>MidiControllerEditDialog</name>
+ <message>
+ <source>MusE: save midi controller list</source>
+ <translation type="obsolete">MusE: enregistrer la liste des controleurs midi</translation>
+ </message>
+ <message>
+ <source>MusE: load midi controller list</source>
+ <translation type="obsolete">MusE: charger une liste de controleurs midi</translation>
+ </message>
+</context>
+<context>
+ <name>MidiControllerEditDialogBase</name>
+ <message>
+ <source>MusE: Define Midi Controller</source>
+ <translation type="unfinished">MusE: DĂ©finir un Controleur Midi</translation>
+ </message>
+ <message>
+ <source>replace controller set</source>
+ <translation type="obsolete">remplacer le groupe de controleurs</translation>
+ </message>
+ <message>
+ <source>merge controller set</source>
+ <translation type="obsolete">ajouter le groupe de controleurs</translation>
+ </message>
+ <message>
+ <source>save controller set as</source>
+ <translation type="obsolete">Enregistrer le groupe de controleurs sous...</translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation type="unfinished">Nom </translation>
+ </message>
+ <message>
+ <source>Type </source>
+ <translation type="unfinished">Type </translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation type="unfinished">H-Ctrl</translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation type="unfinished">L-Ctrl</translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation type="unfinished">Val Min</translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation type="unfinished">Val Max</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="unfinished">list des controleurs définis</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="unfinished">C&apos;est la liste des controleurs qui ont été définis</translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation type="unfinished">Propriétés</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Nom</translation>
+ </message>
+ <message>
+ <source>Max Value</source>
+ <translation type="unfinished">Valeur Max</translation>
+ </message>
+ <message>
+ <source>Min Value</source>
+ <translation type="unfinished">Valeur Mini</translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation type="unfinished">Control7</translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation type="unfinished">Control8</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished">RPN</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished">NRPN</translation>
+ </message>
+ <message>
+ <source>XG-SysEx</source>
+ <translation type="obsolete">XG-SysEx</translation>
+ </message>
+ <message>
+ <source>SysEx</source>
+ <translation type="obsolete">SysEx</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Type</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nouveau</translation>
+ </message>
+ <message>
+ <source>create new entry</source>
+ <translation type="unfinished">Crée une nouvelle entrée</translation>
+ </message>
+ <message>
+ <source>pressing the New button you create a new entry
+in the MusE list of defined controllers</source>
+ <translation type="unfinished">Crée une nouvelle entrée dans la liste des controleurs</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Effacer</translation>
+ </message>
+ <message>
+ <source>delete selected entry</source>
+ <translation type="unfinished">efface l&apos;entrée sélectionnée</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Managed Controller for Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="unfinished">Canal</translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Hauteur</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">Entre</translation>
+ </message>
+</context>
+<context>
+ <name>MidiFileConfig</name>
+ <message>
+ <source>Enable extended smf format</source>
+ <translation type="obsolete">Activer la prise en charge du format smf Ă©tendu</translation>
+ </message>
+ <message>
+ <source>Division</source>
+ <translation type="obsolete">Division</translation>
+ </message>
+ <message>
+ <source>Copyright</source>
+ <translation type="obsolete">Copyright</translation>
+ </message>
+ <message>
+ <source>Config exported Midi Files</source>
+ <translation type="obsolete">Configuration de l&apos;export en fichier Midi</translation>
+ </message>
+ <message>
+ <source>MusE: Config exported Midi Files</source>
+ <translation type="obsolete">MusE: Configurer l&apos;export en fichier Midi</translation>
+ </message>
+</context>
+<context>
+ <name>MidiFilterConfigBase</name>
+ <message>
+ <source>MusE: Midi Input Filter</source>
+ <translation type="obsolete">MusE: Filtre Entrée Midi</translation>
+ </message>
+ <message>
+ <source>Record Filter</source>
+ <translation type="obsolete">Filtre d&apos;Enregistrement</translation>
+ </message>
+ <message>
+ <source>Note On</source>
+ <translation type="obsolete">Note On</translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="obsolete">Pression Poly</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="obsolete">Controleur</translation>
+ </message>
+ <message>
+ <source>Program Change</source>
+ <translation type="obsolete">Changement de son (Program Change)</translation>
+ </message>
+ <message>
+ <source>After Touch</source>
+ <translation type="obsolete">Pression (After Touch)</translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="obsolete">Molette de modulation - Hauteur</translation>
+ </message>
+ <message>
+ <source>Sysex</source>
+ <translation type="obsolete">SysEx</translation>
+ </message>
+ <message>
+ <source>Thru Filter</source>
+ <translation type="obsolete">Filtre Thru</translation>
+ </message>
+ <message>
+ <source>Controller Filter</source>
+ <translation type="obsolete">Filtre Controleur</translation>
+ </message>
+ <message>
+ <source>Channel Filter</source>
+ <translation type="obsolete">Filtre Canal</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation type="obsolete">14</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation type="obsolete">10</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation type="obsolete">6</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation type="obsolete">12</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation type="obsolete">4</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation type="obsolete">2</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation type="obsolete">9</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation type="obsolete">8</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation type="obsolete">3</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation type="obsolete">13</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation type="obsolete">15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation type="obsolete">16</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation type="obsolete">7</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation type="obsolete">11</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation type="obsolete">5</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation type="obsolete">1</translation>
+ </message>
+</context>
+<context>
+ <name>MidiInputTransformDialog</name>
+ <message>
+ <source>New</source>
+ <translation type="obsolete">Nouveau</translation>
+ </message>
+</context>
+<context>
+ <name>MidiInputTransformDialogBase</name>
+ <message>
+ <source>MusE: Midi Input Transformator</source>
+ <translation type="obsolete">MusE: Transformateur d&apos;Entrée Midi</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="obsolete">Filtre</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="obsolete">Tous</translation>
+ </message>
+ <message>
+ <source>Equal</source>
+ <translation type="obsolete">Egal</translation>
+ </message>
+ <message>
+ <source>Unequal</source>
+ <translation type="obsolete">Différent de</translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="obsolete">Note</translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="obsolete">Pression Poly</translation>
+ </message>
+ <message>
+ <source>Control Change</source>
+ <translation type="obsolete">Controle de Changement</translation>
+ </message>
+ <message>
+ <source>Aftertouch</source>
+ <translation type="obsolete">Pression</translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="obsolete">Molette de modulation</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="obsolete">NRPN</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="obsolete">RPN</translation>
+ </message>
+ <message>
+ <source>Value 2</source>
+ <translation type="obsolete">Valeur 2</translation>
+ </message>
+ <message>
+ <source>Value 1</source>
+ <translation type="obsolete">Valeur 1</translation>
+ </message>
+ <message>
+ <source>Event Type</source>
+ <translation type="obsolete">Type d&apos;Evènements</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="obsolete">Ignore</translation>
+ </message>
+ <message>
+ <source>Higher</source>
+ <translation type="obsolete">Plus Haut</translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="obsolete">Plus Bas</translation>
+ </message>
+ <message>
+ <source>Inside</source>
+ <translation type="obsolete">A l&apos;intérieur</translation>
+ </message>
+ <message>
+ <source>Outside</source>
+ <translation type="obsolete">Al&apos;extérieur</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="obsolete">Canal</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Port</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="obsolete">Travail</translation>
+ </message>
+ <message>
+ <source>Keep</source>
+ <translation type="obsolete">Garder</translation>
+ </message>
+ <message>
+ <source>Fix</source>
+ <translation type="obsolete">Fixer</translation>
+ </message>
+ <message>
+ <source>Plus</source>
+ <translation type="obsolete">Plus</translation>
+ </message>
+ <message>
+ <source>Minus</source>
+ <translation type="obsolete">Moins</translation>
+ </message>
+ <message>
+ <source>Multiply</source>
+ <translation type="obsolete">Multiplier</translation>
+ </message>
+ <message>
+ <source>Divide</source>
+ <translation type="obsolete">Diviser</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Inverser</translation>
+ </message>
+ <message>
+ <source>ScaleMap</source>
+ <translation type="obsolete">Echelle</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation type="obsolete">Retourner</translation>
+ </message>
+ <message>
+ <source>Dyn</source>
+ <translation type="obsolete">Dyn</translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="obsolete">Aléatoire</translation>
+ </message>
+ <message>
+ <source>Modules</source>
+ <translation type="obsolete">Modules</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation type="obsolete">1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation type="obsolete">2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation type="obsolete">3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation type="obsolete">4</translation>
+ </message>
+ <message>
+ <source>enable modul 1</source>
+ <translation type="obsolete">Activer module 1</translation>
+ </message>
+ <message>
+ <source>enable modul 2</source>
+ <translation type="obsolete">Activer module 2</translation>
+ </message>
+ <message>
+ <source>enable modul 3</source>
+ <translation type="obsolete">Activer module 3</translation>
+ </message>
+ <message>
+ <source>enable modul 4</source>
+ <translation type="obsolete">Activer module 4</translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="obsolete">Réglages enregistrés</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="obsolete">Nom:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="obsolete">Commentaires:</translation>
+ </message>
+ <message>
+ <source>Function</source>
+ <translation type="obsolete">Fonction</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nouveau</translation>
+ </message>
+ <message>
+ <source>create new preset</source>
+ <translation type="obsolete">Crée un nouveau réglage</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;Efface</translation>
+ </message>
+ <message>
+ <source>delete preset</source>
+ <translation type="obsolete">efface un réglage</translation>
+ </message>
+ <message>
+ <source>&amp;Dismiss</source>
+ <translation type="obsolete">&amp;Rejeter</translation>
+ </message>
+ <message>
+ <source>PresetList</source>
+ <translation type="obsolete">Liste de RĂ©glages</translation>
+ </message>
+</context>
+<context>
+ <name>MidiPortRouteBase</name>
+ <message>
+ <source>MusE: Midi Port Routing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Port 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiRawDeviceDialogBase</name>
+ <message>
+ <source>MusE: raw midi device configuration</source>
+ <translation type="obsolete">MusE: configuration des périphériques Midi</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="obsolete">Nom</translation>
+ </message>
+ <message>
+ <source>Device</source>
+ <translation type="obsolete">Périphérique</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Type</translation>
+ </message>
+ <message>
+ <source>Virt. Ports</source>
+ <translation type="obsolete">Ports virtuels</translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="obsolete">Vitesse</translation>
+ </message>
+ <message>
+ <source>Handshaking</source>
+ <translation type="obsolete">MĂ©thode (handshaking)</translation>
+ </message>
+ <message>
+ <source>Device Properties</source>
+ <translation type="obsolete">Propriétés du périphérique</translation>
+ </message>
+ <message>
+ <source>Virt.Ports</source>
+ <translation type="obsolete">Ports virtuels</translation>
+ </message>
+ <message>
+ <source>Raw Device</source>
+ <translation type="obsolete">Périphérique pur (raw)</translation>
+ </message>
+ <message>
+ <source>Serial Port</source>
+ <translation type="obsolete">Port série</translation>
+ </message>
+ <message>
+ <source>Pipe</source>
+ <translation type="obsolete">Tuyau (Pipe)</translation>
+ </message>
+ <message>
+ <source>Device Path</source>
+ <translation type="obsolete">Chemin du périphérique</translation>
+ </message>
+ <message>
+ <source>9600</source>
+ <translation type="obsolete">9600</translation>
+ </message>
+ <message>
+ <source>19200</source>
+ <translation type="obsolete">19200</translation>
+ </message>
+ <message>
+ <source>38400</source>
+ <translation type="obsolete">38400</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="obsolete">Aucun</translation>
+ </message>
+ <message>
+ <source>RTS/CTS</source>
+ <translation type="obsolete">RTS/CTS</translation>
+ </message>
+ <message>
+ <source>Xon/Xoff</source>
+ <translation type="obsolete">Xon/Xoff</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nouveau</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;Effacer</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>MidiStrip</name>
+ <message>
+ <source>Var</source>
+ <translation type="obsolete">Var</translation>
+ </message>
+ <message>
+ <source>Rev</source>
+ <translation type="obsolete">Rev</translation>
+ </message>
+ <message>
+ <source>Cho</source>
+ <translation type="obsolete">Cho</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="obsolete">dB</translation>
+ </message>
+ <message>
+ <source>Pan</source>
+ <translation type="obsolete">Pan</translation>
+ </message>
+ <message>
+ <source>mute</source>
+ <translation type="obsolete">silence</translation>
+ </message>
+ <message>
+ <source>pre fader listening</source>
+ <translation type="obsolete">Ă©coute pre fader</translation>
+ </message>
+</context>
+<context>
+ <name>MidiSyncConfigBase</name>
+ <message>
+ <source>MusE: Midi Sync</source>
+ <translation type="unfinished">MusE: Synchro Midi</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="unfinished">Appliquer</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished">Ok</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Annuler</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation type="unfinished">heure</translation>
+ </message>
+ <message>
+ <source>h</source>
+ <translation type="unfinished">h</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation type="unfinished">minute</translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished">m</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation type="unfinished">second</translation>
+ </message>
+ <message>
+ <source>s</source>
+ <translation type="unfinished">s</translation>
+ </message>
+ <message>
+ <source>frame</source>
+ <translation type="unfinished">Armature (frame)</translation>
+ </message>
+ <message>
+ <source>f</source>
+ <translation type="unfinished">f</translation>
+ </message>
+ <message>
+ <source>subframe</source>
+ <translation type="unfinished">Armature fine (subframe)</translation>
+ </message>
+ <message>
+ <source>24</source>
+ <translation type="unfinished">24</translation>
+ </message>
+ <message>
+ <source>25</source>
+ <translation type="unfinished">25</translation>
+ </message>
+ <message>
+ <source>30D</source>
+ <translation type="unfinished">30D</translation>
+ </message>
+ <message>
+ <source>30N</source>
+ <translation type="unfinished">30N</translation>
+ </message>
+ <message>
+ <source>Id:</source>
+ <translation type="unfinished">Id:</translation>
+ </message>
+ <message>
+ <source>device id</source>
+ <translation type="unfinished">Id. du périphérique</translation>
+ </message>
+ <message>
+ <source>Port:</source>
+ <translation type="obsolete">Port:</translation>
+ </message>
+ <message>
+ <source>midi port</source>
+ <translation type="obsolete">port midi</translation>
+ </message>
+ <message>
+ <source>Sync Source</source>
+ <translation type="unfinished">Source de la synchro</translation>
+ </message>
+ <message>
+ <source>accept MTC</source>
+ <translation type="unfinished">accepter MTC</translation>
+ </message>
+ <message>
+ <source>accept Midi Clock</source>
+ <translation type="unfinished">accepter Horloge Midi</translation>
+ </message>
+ <message>
+ <source>accept MMC</source>
+ <translation type="unfinished">accepter MMC</translation>
+ </message>
+ <message>
+ <source>Sync Gen</source>
+ <translation type="unfinished">Générer Synchro</translation>
+ </message>
+ <message>
+ <source>Midi Time Code (MTC)</source>
+ <translation type="unfinished">Code Temporel Midi (MTC)</translation>
+ </message>
+ <message>
+ <source>Midi Clock</source>
+ <translation type="unfinished">Horloge Midi</translation>
+ </message>
+ <message>
+ <source>Midi Machine Control (MMC)</source>
+ <translation type="unfinished">Controle Machine MIDI (MMC)</translation>
+ </message>
+ <message>
+ <source>Sync Mode</source>
+ <translation type="unfinished">Mode de synchro</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="unfinished">Maitre</translation>
+ </message>
+ <message>
+ <source>Slave</source>
+ <translation type="unfinished">Esclave</translation>
+ </message>
+ <message>
+ <source>all</source>
+ <translation type="obsolete">tous</translation>
+ </message>
+ <message>
+ <source>MTC</source>
+ <translation type="unfinished">MTC</translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation type="unfinished">Type:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished">DĂ©calage:</translation>
+ </message>
+</context>
+<context>
+ <name>MidiTrackInfoBase</name>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished">MusE: InfoPiste</translation>
+ </message>
+ <message>
+ <source>output channel</source>
+ <translation type="obsolete">canal de sortie</translation>
+ </message>
+ <message>
+ <source>all midi events are send to this output channel</source>
+ <translation type="unfinished">tous les évènements midi seront envoyés vers cette sortie</translation>
+ </message>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished">Info Piste</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished">%</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished">Nom de Piste</translation>
+ </message>
+ <message>
+ <source>output port</source>
+ <translation type="obsolete">port de sortie (Output Ch.)</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">off</translation>
+ </message>
+ <message>
+ <source>change stereo position</source>
+ <translation type="obsolete">changer la position stéréo</translation>
+ </message>
+ <message>
+ <source>OCh.</source>
+ <translation type="unfinished">OCh.</translation>
+ </message>
+ <message>
+ <source>MidiThru</source>
+ <translation type="obsolete">MidiThru</translation>
+ </message>
+ <message>
+ <source>???</source>
+ <translation type="unfinished">???</translation>
+ </message>
+ <message>
+ <source>select instrument patch</source>
+ <translation type="obsolete">choisissez le groupe d&apos;instruments</translation>
+ </message>
+ <message>
+ <source>Transp.</source>
+ <translation type="unfinished">Transp.</translation>
+ </message>
+ <message>
+ <source>Volume</source>
+ <translation type="obsolete">Volume</translation>
+ </message>
+ <message>
+ <source>Channel Info</source>
+ <translation type="unfinished">Info canal</translation>
+ </message>
+ <message>
+ <source>Pan</source>
+ <translation type="obsolete">Pan</translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished">DĂ©lai</translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation type="unfinished">H-Bank</translation>
+ </message>
+ <message>
+ <source>Compr.</source>
+ <translation type="unfinished">Compr.</translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation type="unfinished">L-Bank</translation>
+ </message>
+ <message>
+ <source>Progr.</source>
+ <translation type="unfinished">Progr.</translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Vélocité</translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished">Longueur</translation>
+ </message>
+ <message>
+ <source>input ports</source>
+ <translation type="obsolete">ports d&apos;entrée (Input Ch.)</translation>
+ </message>
+ <message>
+ <source>IChan.</source>
+ <translation type="unfinished">IChan:</translation>
+ </message>
+ <message>
+ <source>input channels</source>
+ <translation type="obsolete">canaux d&apos;entrée</translation>
+ </message>
+ <message>
+ <source>Events from all configured channels are
+recorded to this track.
+You can specify more than one channel for
+recording:
+ 1 2 3 record from channel 1 2 and 3
+ 1-3 same
+ 1-3 5<byte value="x9"/> record from channel 1 2 3 and 5</source>
+ <translation type="unfinished">Les évènements de tous les canaux
+configurés sont enregistrés sur cette piste.<byte value="x9"/>
+Vous pouvez spécifier plus d&apos;un canal
+pour l&apos;enregistrement:
+ 1 2 3<byte value="x9"/>enregistre depuis les canaux 1, 2 et 3
+ 1-3<byte value="x9"/><byte value="x9"/>idem
+ 1-3 5<byte value="x9"/> enregistre depuis les canaux 1, 2, 3 et 5</translation>
+ </message>
+ <message>
+ <source>Rec</source>
+ <translation type="obsolete">Enr</translation>
+ </message>
+ <message>
+ <source>Output Channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Note Length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Compress Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Ports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Channels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select Instrument Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select LSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select MSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument High Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument Low Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument/Program/Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformDialogBase</name>
+ <message>
+ <source>MusE: Midi Transformator</source>
+ <translation type="unfinished">MusE: Transformateur Midi</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Nouveau</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Effacer</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished">&amp;Appliquer</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>PresetList</source>
+ <translation type="unfinished">ListRĂ©glages</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="unfinished">Transformations</translation>
+ </message>
+ <message>
+ <source>Event Type</source>
+ <translation type="unfinished">Type d&apos;évènements</translation>
+ </message>
+ <message>
+ <source>Keep</source>
+ <translation type="unfinished">Garder</translation>
+ </message>
+ <message>
+ <source>Fix</source>
+ <translation type="unfinished">Fixer</translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="unfinished">Note</translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="unfinished">Pression Poly</translation>
+ </message>
+ <message>
+ <source>Control Change</source>
+ <translation type="unfinished">Changement de Controle</translation>
+ </message>
+ <message>
+ <source>Aftertouch</source>
+ <translation type="unfinished">Pression</translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="unfinished">Molette de modulation</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished">NRPN</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished">RPN</translation>
+ </message>
+ <message>
+ <source>Plus</source>
+ <translation type="unfinished">Addition</translation>
+ </message>
+ <message>
+ <source>Minus</source>
+ <translation type="unfinished">Soustraction</translation>
+ </message>
+ <message>
+ <source>Multiply</source>
+ <translation type="unfinished">Multiplication</translation>
+ </message>
+ <message>
+ <source>Divide</source>
+ <translation type="unfinished">Division</translation>
+ </message>
+ <message>
+ <source>Value 2</source>
+ <translation type="unfinished">Valeur 2</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="unfinished">Inverser</translation>
+ </message>
+ <message>
+ <source>ScaleMap</source>
+ <translation type="unfinished">Echelle</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation type="unfinished">Retourner</translation>
+ </message>
+ <message>
+ <source>Dyn</source>
+ <translation type="unfinished">Dyn</translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="unfinished">Aléatoire</translation>
+ </message>
+ <message>
+ <source>Value 1</source>
+ <translation type="unfinished">Valeur 1</translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished">Longueur</translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished">Position</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="unfinished">Filtre</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="unfinished">Tous</translation>
+ </message>
+ <message>
+ <source>Equal</source>
+ <translation type="unfinished">Egal</translation>
+ </message>
+ <message>
+ <source>Unequal</source>
+ <translation type="unfinished">Différent</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="unfinished">Ignore</translation>
+ </message>
+ <message>
+ <source>Higher</source>
+ <translation type="unfinished">Plus haut</translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="unfinished">Plus bas</translation>
+ </message>
+ <message>
+ <source>Inside</source>
+ <translation type="unfinished">A l&apos;intérieur</translation>
+ </message>
+ <message>
+ <source>Outside</source>
+ <translation type="unfinished">A l&apos;extérieur</translation>
+ </message>
+ <message>
+ <source>Bar Range</source>
+ <translation type="unfinished">Type de mesure</translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished">RĂ©glages</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">Nom:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="unfinished">Commentaire:</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">Type</translation>
+ </message>
+ <message>
+ <source>process all events</source>
+ <translation type="unfinished">Transformer tous les évènements</translation>
+ </message>
+ <message>
+ <source>selected tracks</source>
+ <translation type="unfinished">pistes sélectionnées</translation>
+ </message>
+ <message>
+ <source>inside loop</source>
+ <translation type="unfinished">dans la boucle</translation>
+ </message>
+ <message>
+ <source>Function</source>
+ <translation type="unfinished">fonction</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation type="unfinished">SĂ©lectionner</translation>
+ </message>
+ <message>
+ <source>Quantize</source>
+ <translation type="unfinished">Quantiser</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished">Effacer</translation>
+ </message>
+ <message>
+ <source>Transform</source>
+ <translation type="unfinished">Transformer</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation type="unfinished">Insérer</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished">Copier</translation>
+ </message>
+ <message>
+ <source>Extract</source>
+ <translation type="unfinished">Extraire</translation>
+ </message>
+ <message>
+ <source>Quantize Value</source>
+ <translation type="unfinished">Valeur de Quantisation</translation>
+ </message>
+ <message>
+ <source>Sysex</source>
+ <translation type="unfinished">SysEx</translation>
+ </message>
+ <message>
+ <source>Meta</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformerDialog</name>
+ <message>
+ <source>New</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>MixdownFileDialog</name>
+ <message>
+ <source>Wave Files (*.wav);;All Files (*)</source>
+ <translation type="obsolete">Fichiers Wave (*.wav);;Tous les Fichiers (*)</translation>
+ </message>
+</context>
+<context>
+ <name>MixdownFileDialogBase</name>
+ <message>
+ <source>MusE: Set Mixdown Wavefile</source>
+ <translation type="unfinished">MusE: Fichier wav pour mixage</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>File Path</source>
+ <translation type="unfinished">Chemin d&apos;accés</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="unfinished">Canal</translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="unfinished">Stéréo</translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="unfinished">Mono</translation>
+ </message>
+ <message>
+ <source>5.1</source>
+ <translation type="unfinished">5.1</translation>
+ </message>
+ <message>
+ <source>wav,16 Bit</source>
+ <translation type="unfinished">wav,16 Bit</translation>
+ </message>
+ <message>
+ <source>wav, 24 Bit</source>
+ <translation type="unfinished">v, 24 Bit</translation>
+ </message>
+ <message>
+ <source>wav, 32 Bit (float)</source>
+ <translation type="unfinished">wav, 32 Bit (flottant)</translation>
+ </message>
+ <message>
+ <source>Format</source>
+ <translation type="unfinished">Format</translation>
+ </message>
+</context>
+<context>
+ <name>Mixer</name>
+ <message>
+ <source>Mute</source>
+ <translation type="obsolete">Muet</translation>
+ </message>
+ <message>
+ <source>MusE: Midi Mixer</source>
+ <translation type="obsolete">MusE: Mixeur Midi</translation>
+ </message>
+ <message>
+ <source>Rev</source>
+ <translation type="obsolete">Rev</translation>
+ </message>
+ <message>
+ <source>Cho</source>
+ <translation type="obsolete">Cho</translation>
+ </message>
+ <message>
+ <source>Var</source>
+ <translation type="obsolete">Var</translation>
+ </message>
+ <message>
+ <source>Pan</source>
+ <translation type="obsolete">Pan</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Maitre</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Port</translation>
+ </message>
+</context>
+<context>
+ <name>MusE</name>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Fichier</translation>
+ </message>
+ <message>
+ <source>Open &amp;Recent</source>
+ <translation>Ouvrir &amp;RĂ©cent</translation>
+ </message>
+ <message>
+ <source>Save &amp;As</source>
+ <translation>Enregistrer &amp;Sous</translation>
+ </message>
+ <message>
+ <source>Config &amp;Printer</source>
+ <translation type="obsolete">Configuration Im&amp;primante</translation>
+ </message>
+ <message>
+ <source>Import Midifile</source>
+ <translation>Importer fichier MIDI</translation>
+ </message>
+ <message>
+ <source>Export Midifile</source>
+ <translation>Exporter fichier MIDI</translation>
+ </message>
+ <message>
+ <source>Import Wave File</source>
+ <translation>Importer fichier WAV</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>&amp;Quitter</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Edition</translation>
+ </message>
+ <message>
+ <source>C&amp;ut</source>
+ <translation>Co&amp;uper</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Copier</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>Co&amp;ller</translation>
+ </message>
+ <message>
+ <source>Delete Track</source>
+ <translation type="obsolete">Effacer Piste</translation>
+ </message>
+ <message>
+ <source>Add Track</source>
+ <translation>Ajouter Piste</translation>
+ </message>
+ <message>
+ <source>Select &amp;All</source>
+ <translation>Selectionner &amp;Tout</translation>
+ </message>
+ <message>
+ <source>&amp;Deselect All</source>
+ <translation>&amp;DĂ©-selectionner tout</translation>
+ </message>
+ <message>
+ <source>Invert &amp;Selection</source>
+ <translation>Inverser la &amp;SĂ©lection</translation>
+ </message>
+ <message>
+ <source>&amp;Inside Loop</source>
+ <translation>A l&apos;&amp;intérieur de la Boucle</translation>
+ </message>
+ <message>
+ <source>&amp;Outside Loop</source>
+ <translation>A l&apos;e&amp;xtérieur de la Boucle</translation>
+ </message>
+ <message>
+ <source>All &amp;Parts on Track</source>
+ <translation>Tous les &amp;bouts de la Piste</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>SĂ©lectionner</translation>
+ </message>
+ <message>
+ <source>Drums</source>
+ <translation>Batterie</translation>
+ </message>
+ <message>
+ <source>List</source>
+ <translation>Liste</translation>
+ </message>
+ <message>
+ <source>Graphic</source>
+ <translation>Graphique</translation>
+ </message>
+ <message>
+ <source>Mastertrack</source>
+ <translation>PistePrincipale</translation>
+ </message>
+ <message>
+ <source>Midi &amp;Transform</source>
+ <translation>&amp;Transformation MIDI</translation>
+ </message>
+ <message>
+ <source>Modify Gate Time</source>
+ <translation>Modifier la Durée du Pont (Gate Time)</translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation>Modifier la vélocité</translation>
+ </message>
+ <message>
+ <source>Crescendo</source>
+ <translation>Crescendo</translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation>Transposition</translation>
+ </message>
+ <message>
+ <source>Thin Out</source>
+ <translation>Sortie fine</translation>
+ </message>
+ <message>
+ <source>Erase Event</source>
+ <translation>Effacer évènements</translation>
+ </message>
+ <message>
+ <source>Note Shift</source>
+ <translation>DĂ©calage de note</translation>
+ </message>
+ <message>
+ <source>Move Clock</source>
+ <translation>DĂ©calage horloge</translation>
+ </message>
+ <message>
+ <source>Copy Measure</source>
+ <translation>Copier la mesure</translation>
+ </message>
+ <message>
+ <source>Erase Measure</source>
+ <translation>Effacer la mesure</translation>
+ </message>
+ <message>
+ <source>Delete Measure</source>
+ <translation>Supprimer la mesure</translation>
+ </message>
+ <message>
+ <source>Create Measure</source>
+ <translation>Créer une mesure</translation>
+ </message>
+ <message>
+ <source>Mix Track</source>
+ <translation>Mixer Piste</translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation>MIDI</translation>
+ </message>
+ <message>
+ <source>&amp;Structure</source>
+ <translation>&amp;Structure</translation>
+ </message>
+ <message>
+ <source>Global Cut</source>
+ <translation>Couper tout</translation>
+ </message>
+ <message>
+ <source>Global Insert</source>
+ <translation>Insérer tout</translation>
+ </message>
+ <message>
+ <source>Global Split</source>
+ <translation>Diviser Tout</translation>
+ </message>
+ <message>
+ <source>Copy Range</source>
+ <translation>Limites de Copie</translation>
+ </message>
+ <message>
+ <source>Cut Events</source>
+ <translation>Couper Evènements</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="obsolete">&amp;Affichage</translation>
+ </message>
+ <message>
+ <source>Transport Panel</source>
+ <translation>Panneau de Controle</translation>
+ </message>
+ <message>
+ <source>Bigtime window</source>
+ <translation>Fenetre GrandeHorloge</translation>
+ </message>
+ <message>
+ <source>dont follow Song</source>
+ <translation>Ne pas suivre la chanson</translation>
+ </message>
+ <message>
+ <source>follow page</source>
+ <translation>DĂ©filement par page</translation>
+ </message>
+ <message>
+ <source>follow continuous</source>
+ <translation>DĂ©filement fin</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Configuration</translation>
+ </message>
+ <message>
+ <source>Global Settings</source>
+ <translation>Paramètres Généraux</translation>
+ </message>
+ <message>
+ <source>follow song</source>
+ <translation>Suivre la chanson</translation>
+ </message>
+ <message>
+ <source>Metronome</source>
+ <translation type="obsolete">MĂ©tronome</translation>
+ </message>
+ <message>
+ <source>Midi Sync</source>
+ <translation>Synchro MIDI</translation>
+ </message>
+ <message>
+ <source>Midi File Config</source>
+ <translation type="obsolete">Paramètres du fichier MIDI</translation>
+ </message>
+ <message>
+ <source>Appearance settings</source>
+ <translation>Apparance</translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation type="obsolete">Synthétiseur virtuel</translation>
+ </message>
+ <message>
+ <source>Midi Ports</source>
+ <translation type="obsolete">Ports MIDI</translation>
+ </message>
+ <message>
+ <source>Audio System</source>
+ <translation type="obsolete">System Audio</translation>
+ </message>
+ <message>
+ <source>Save Configuration</source>
+ <translation type="obsolete">Sauvegarder la Configuration</translation>
+ </message>
+ <message>
+ <source>Midi Input Transform</source>
+ <translation type="obsolete">Transformations Entrée MIDI</translation>
+ </message>
+ <message>
+ <source>Midi Input Filter</source>
+ <translation type="obsolete">Filtres pour l&apos;Entrée MIDI</translation>
+ </message>
+ <message>
+ <source>Midi Remote Control</source>
+ <translation>Controle MIDI a distance</translation>
+ </message>
+ <message>
+ <source>Random Rhythm Generator</source>
+ <translation type="obsolete">Générateur aléatoire de rythmes</translation>
+ </message>
+ <message>
+ <source>&amp;Midi</source>
+ <translation>&amp;MIDI</translation>
+ </message>
+ <message>
+ <source>Mixer</source>
+ <translation type="obsolete">Mixer</translation>
+ </message>
+ <message>
+ <source>Define Controller</source>
+ <translation type="obsolete">DĂ©finir Controleur</translation>
+ </message>
+ <message>
+ <source>Input Plugins</source>
+ <translation>Plugins d&apos;Entrée</translation>
+ </message>
+ <message>
+ <source>Reset Instr.</source>
+ <translation>RĂ©-initialisation des Instruments</translation>
+ </message>
+ <message>
+ <source>Init Instr.</source>
+ <translation>Init. Instr.</translation>
+ </message>
+ <message>
+ <source>local off</source>
+ <translation>local off</translation>
+ </message>
+ <message>
+ <source>&amp;Audio</source>
+ <translation>&amp;Audio</translation>
+ </message>
+ <message>
+ <source>Cliplist</source>
+ <translation type="obsolete">ListClip</translation>
+ </message>
+ <message>
+ <source>Bounce to Track</source>
+ <translation>Rebondir (bounce) sur la piste</translation>
+ </message>
+ <message>
+ <source>Bounce to File</source>
+ <translation>Rebondir (bounce) sur Fichier</translation>
+ </message>
+ <message>
+ <source>Bounce</source>
+ <translation type="obsolete">Rebondir (bounce)</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Aide</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation type="obsolete">Navigateur</translation>
+ </message>
+ <message>
+ <source>&amp;About</source>
+ <translation type="obsolete">&amp;A propos</translation>
+ </message>
+ <message>
+ <source>About&amp;Qt</source>
+ <translation>A propos de &amp;Qt</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This</source>
+ <translation type="obsolete">Qu&apos;est-ce que c&apos;es&amp;t</translation>
+ </message>
+ <message>
+ <source>MusE: load project</source>
+ <translation>Muse: charger Projet</translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Save Current Project?</source>
+ <translation>Le Projet en cours contient des données non encore sauvegardées.
+Enregistrer?</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Enregistrer</translation>
+ </message>
+ <message>
+ <source>&amp;Nosave</source>
+ <translation>&amp;Pas d&apos;enregistrement</translation>
+ </message>
+ <message>
+ <source>&amp;Abort</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>MusE: Save As</source>
+ <translation>MusE: enregistrer sous</translation>
+ </message>
+ <message>
+ <source>MusE: Import Midi</source>
+ <translation type="unfinished">MusE: importer fichier MIDI</translation>
+ </message>
+ <message>
+ <source>MusE: Export Midi</source>
+ <translation type="unfinished">MusE: exporter fichier MIDI</translation>
+ </message>
+ <message>
+ <source>Nothing to edit</source>
+ <translation>Rien Ă  Ă©diter</translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Load overwrites current Project:
+Save Current Project?</source>
+ <translation>Le Projet en cours contient des données non sauvegardées.
+Enregistrer?<byte value="x9"/></translation>
+ </message>
+ <message>
+ <source>&amp;Overwrite</source>
+ <translation>Ec&amp;raser</translation>
+ </message>
+ <message>
+ <source>no help found at: </source>
+ <translation>Pas d&apos;aide trouvée ici:</translation>
+ </message>
+ <message>
+ <source>MusE: Open Help</source>
+ <translation>MusE: Ouvrir l&apos;Aide</translation>
+ </message>
+ <message>
+ <source>to import a audio file you have first to selecta audio track</source>
+ <translation type="obsolete">Pour importer in fichier AUDIO, sélectionner d&apos;abord une piste AUDIO</translation>
+ </message>
+ <message>
+ <source>UndoRedo</source>
+ <translation>AnnulerRefaire</translation>
+ </message>
+ <message>
+ <source>undo</source>
+ <translation>annuler</translation>
+ </message>
+ <message>
+ <source>Und&amp;o</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <source>redo</source>
+ <translation>Refaire</translation>
+ </message>
+ <message>
+ <source>Re&amp;do</source>
+ <translation>Re&amp;faire</translation>
+ </message>
+ <message>
+ <source>undo last change to song</source>
+ <translation>Annuler le dernier changement sur la chanson</translation>
+ </message>
+ <message>
+ <source>redo last undo</source>
+ <translation>Annuler l&apos;annulation (refaire)</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation>Transport</translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation>boucle</translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation>Boucle</translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation>Punch-In</translation>
+ </message>
+ <message>
+ <source>Punchin</source>
+ <translation>Punch-In</translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation>Punch-Out</translation>
+ </message>
+ <message>
+ <source>Punchout</source>
+ <translation>Punch-Out</translation>
+ </message>
+ <message>
+ <source>start</source>
+ <translation>démarrer</translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation>DĂ©marrer</translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation>rembobiner</translation>
+ </message>
+ <message>
+ <source>Rewind</source>
+ <translation>Rembobiner</translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation>avance</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>Avance</translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation>stop</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation>jouer</translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation>Jouer</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation>enregistrer</translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation>Enregistrer</translation>
+ </message>
+ <message>
+ <source>panic</source>
+ <translation>panique!</translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation>Panique!</translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation>nouveau</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Nouveau</translation>
+ </message>
+ <message>
+ <source>open</source>
+ <translation>ouvrir</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Ouvrir</translation>
+ </message>
+ <message>
+ <source>save</source>
+ <translation>enregistrer</translation>
+ </message>
+ <message>
+ <source>pianoroll</source>
+ <translation>rouleau Piano</translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation>Rouleau-Piano</translation>
+ </message>
+ <message>
+ <source>score</source>
+ <translation type="obsolete">partition</translation>
+ </message>
+ <message>
+ <source>Score</source>
+ <translation type="obsolete">Partition</translation>
+ </message>
+ <message>
+ <source>marker</source>
+ <translation type="obsolete">marqueur</translation>
+ </message>
+ <message>
+ <source>Marker</source>
+ <translation>Marker</translation>
+ </message>
+ <message>
+ <source>File Buttons</source>
+ <translation>Boutons Fichiers</translation>
+ </message>
+ <message>
+ <source>Unknown File Format</source>
+ <translation>Format de fichier inconnu</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="obsolete">aucun</translation>
+ </message>
+ <message>
+ <source>MusE: Write File failed</source>
+ <translation>MusE: Ă©chec de l&apos;enregistrement</translation>
+ </message>
+ <message>
+ <source>MusE: About</source>
+ <translation type="obsolete">MusE: A propos</translation>
+ </message>
+ <message>
+ <source>MusE: Song: </source>
+ <translation>MusE: chanson</translation>
+ </message>
+ <message>
+ <source>reading midifile
+ </source>
+ <translation type="unfinished">lecture du fichier MIDI</translation>
+ </message>
+ <message>
+ <source>
+failed</source>
+ <translation type="obsolete">Echec</translation>
+ </message>
+ <message>
+ <source>MusE: Copy Range</source>
+ <translation>MusE: limites de la copie</translation>
+ </message>
+ <message>
+ <source>not implemented</source>
+ <translation>Non-implémenté (désolé)</translation>
+ </message>
+ <message>
+ <source>MusE: Cut Events</source>
+ <translation>MusE: Couper Evènements</translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to Track</source>
+ <translation>MusE: Rebondir sur la piste (bounce)</translation>
+ </message>
+ <message>
+ <source>more than one target track selected</source>
+ <translation>vous avez sélectionné plus d&apos;une piste en destination</translation>
+ </message>
+ <message>
+ <source>wrong target track type,
+select wave track as target</source>
+ <translation>mauvais type de piste en destination,
+choisissez une piste AUDIO en destination</translation>
+ </message>
+ <message>
+ <source>no target track selected</source>
+ <translation>vous n&apos;avez pas sélectionné de piste de destination</translation>
+ </message>
+ <message>
+ <source>Delete Selected Tracks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Instrument</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configure shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi File Export</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;MusE homepage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Report Bug...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;About MusE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot read template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File open error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File read error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: load template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Bounce</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>set left/right marker for bounce range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>no output track found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add midi file to current project?
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add to Project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>
+failed: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished">Arrangeur</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="unfinished">Curseur</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation type="unfinished">Mesure</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="unfinished">Aligne</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Hauteur</translation>
+ </message>
+ <message>
+ <source>midi pitch</source>
+ <translation type="unfinished">hauteur midi</translation>
+ </message>
+ <message>
+ <source>global midi pitch shift</source>
+ <translation type="unfinished">transposition midi globale</translation>
+ </message>
+ <message>
+ <source>Tempo</source>
+ <translation type="unfinished">Tempo</translation>
+ </message>
+ <message>
+ <source>midi tempo</source>
+ <translation type="unfinished">tempo midi</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation type="unfinished">N</translation>
+ </message>
+ <message>
+ <source>MusE: Create tmp file failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Setti&amp;ngs</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NoteInfo</name>
+ <message>
+ <source>Start</source>
+ <translation type="obsolete">DĂ©but</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="obsolete">Lon</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Hauteur</translation>
+ </message>
+ <message>
+ <source>Velo On</source>
+ <translation type="obsolete">Velo on</translation>
+ </message>
+ <message>
+ <source>Velo Off</source>
+ <translation type="obsolete">Velo off</translation>
+ </message>
+ <message>
+ <source>Note Info</source>
+ <translation type="obsolete">Info Note</translation>
+ </message>
+</context>
+<context>
+ <name>OrganGuiBase</name>
+ <message>
+ <source>MusE: Organ</source>
+ <translation type="unfinished">MusE: Orgue</translation>
+ </message>
+ <message>
+ <source>Presets</source>
+ <translation type="obsolete">Presets</translation>
+ </message>
+ <message>
+ <source>Set</source>
+ <translation type="obsolete">Set</translation>
+ </message>
+ <message>
+ <source>load preset list</source>
+ <translation type="obsolete">charger la liste des presets</translation>
+ </message>
+ <message>
+ <source>save preset list</source>
+ <translation type="obsolete">enregistrer la liste des presets</translation>
+ </message>
+ <message>
+ <source>O-1</source>
+ <translation type="unfinished">0-1</translation>
+ </message>
+ <message>
+ <source>Oscillator</source>
+ <translation type="unfinished">Oscillateur</translation>
+ </message>
+ <message>
+ <source>Brass</source>
+ <translation type="unfinished">Cuivres</translation>
+ </message>
+ <message>
+ <source>Reed</source>
+ <translation type="unfinished">Roseau</translation>
+ </message>
+ <message>
+ <source>Flute</source>
+ <translation type="unfinished">Flute</translation>
+ </message>
+ <message>
+ <source>Drawbars</source>
+ <translation type="unfinished">Grands Tuyaux</translation>
+ </message>
+ <message>
+ <source>16&apos;</source>
+ <translation type="unfinished">16&apos;</translation>
+ </message>
+ <message>
+ <source>4&apos;</source>
+ <translation type="unfinished">4&apos;</translation>
+ </message>
+ <message>
+ <source>2 2/3&apos;</source>
+ <translation type="unfinished">2 2/3&apos;</translation>
+ </message>
+ <message>
+ <source>2&apos;</source>
+ <translation type="unfinished">2&apos;</translation>
+ </message>
+ <message>
+ <source>8&apos;</source>
+ <translation type="unfinished">8&apos;</translation>
+ </message>
+ <message>
+ <source>5 1/3&apos;</source>
+ <translation type="unfinished">5 1/3&apos;</translation>
+ </message>
+ <message>
+ <source>Envelope Lo</source>
+ <translation type="unfinished">Enveloppe basse (Lo)</translation>
+ </message>
+ <message>
+ <source>Attack(ms)</source>
+ <translation type="obsolete">Attaque (en ms)</translation>
+ </message>
+ <message>
+ <source>Decay(ms)</source>
+ <translation type="obsolete">Affaiblissement (ms)</translation>
+ </message>
+ <message>
+ <source>Sustain(%)</source>
+ <translation type="obsolete">Tenue (%)</translation>
+ </message>
+ <message>
+ <source>Release(ms)</source>
+ <translation type="obsolete">Relachement (ms)</translation>
+ </message>
+ <message>
+ <source>Envelope Hi</source>
+ <translation type="unfinished">Enveloppe Haute (Hi)</translation>
+ </message>
+ <message>
+ <source>Release</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>cB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Vélocité</translation>
+ </message>
+</context>
+<context>
+ <name>PageSettings</name>
+ <message>
+ <source>Paper Size</source>
+ <translation type="obsolete">Dimension de la feuille</translation>
+ </message>
+ <message>
+ <source>user</source>
+ <translation type="obsolete">utilisateur</translation>
+ </message>
+ <message>
+ <source>Margins</source>
+ <translation type="obsolete">Marges</translation>
+ </message>
+ <message>
+ <source>Header</source>
+ <translation type="obsolete">En-Tte</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation type="obsolete">Titre</translation>
+ </message>
+ <message>
+ <source>Author</source>
+ <translation type="obsolete">Auteur</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation type="obsolete">Polices</translation>
+ </message>
+ <message>
+ <source>Page No.</source>
+ <translation type="obsolete">N° de page</translation>
+ </message>
+ <message>
+ <source>Measure No</source>
+ <translation type="obsolete">N° de mesure</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="obsolete">Nom de la Piste</translation>
+ </message>
+ <message>
+ <source>Lyrics</source>
+ <translation type="obsolete">Paroles</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+ <translation type="obsolete">Disposition</translation>
+ </message>
+ <message>
+ <source>Scale</source>
+ <translation type="obsolete">Echelle</translation>
+ </message>
+ <message>
+ <source>Flags</source>
+ <translation type="obsolete">Drapeaux</translation>
+ </message>
+ <message>
+ <source>show page no.</source>
+ <translation type="obsolete">Montrer la page N°</translation>
+ </message>
+ <message>
+ <source>show measure no.</source>
+ <translation type="obsolete">Montrer la mesure N°</translation>
+ </message>
+ <message>
+ <source>show track name</source>
+ <translation type="obsolete">Montrer le nom des Pistes</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="obsolete">Ok</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="obsolete">Appliquer</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Annuler</translation>
+ </message>
+ <message>
+ <source>left Margin</source>
+ <translation type="obsolete">Marge de gauche</translation>
+ </message>
+ <message>
+ <source>top Margin</source>
+ <translation type="obsolete">Marge du haut</translation>
+ </message>
+ <message>
+ <source>right Margin</source>
+ <translation type="obsolete">Marge de droite</translation>
+ </message>
+ <message>
+ <source>bottom Margin</source>
+ <translation type="obsolete">Marge du bas</translation>
+ </message>
+ <message>
+ <source>Bars across the Page</source>
+ <translation type="obsolete">Mesures par Page</translation>
+ </message>
+</context>
+<context>
+ <name>PartCanvas</name>
+ <message>
+ <source>Cannot copy/move/clone to different Track-Type</source>
+ <translation type="obsolete">Ne peut copier/déplacer vers une type de Piste différent</translation>
+ </message>
+ <message>
+ <source>C&amp;ut</source>
+ <translation type="obsolete">Co&amp;uper</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="obsolete">&amp;Copier</translation>
+ </message>
+ <message>
+ <source>rename</source>
+ <translation type="obsolete">renommer</translation>
+ </message>
+ <message>
+ <source>color</source>
+ <translation type="obsolete">couleur</translation>
+ </message>
+ <message>
+ <source>delete</source>
+ <translation type="obsolete">effacer</translation>
+ </message>
+ <message>
+ <source>split</source>
+ <translation type="obsolete">séparer</translation>
+ </message>
+ <message>
+ <source>glue</source>
+ <translation type="obsolete">coller</translation>
+ </message>
+ <message>
+ <source>de-clone</source>
+ <translation type="obsolete">annuler-clonage</translation>
+ </message>
+ <message>
+ <source>pianoroll</source>
+ <translation type="obsolete">piano-roll</translation>
+ </message>
+ <message>
+ <source>score</source>
+ <translation type="obsolete">partition</translation>
+ </message>
+ <message>
+ <source>list</source>
+ <translation type="obsolete">liste</translation>
+ </message>
+ <message>
+ <source>drums</source>
+ <translation type="obsolete">batterie</translation>
+ </message>
+ <message>
+ <source>wave edit</source>
+ <translation type="obsolete">Ă©dition wav</translation>
+ </message>
+ <message>
+ <source>Cannot paste: multiple tracks selected</source>
+ <translation type="obsolete">Ne peut coller: plusieurs pistes sélectionnées</translation>
+ </message>
+ <message>
+ <source>Cannot paste: no track selected</source>
+ <translation type="obsolete">Ne peut coller: pas de piste choisie</translation>
+ </message>
+ <message>
+ <source>Cannot paste midi parts to wave track</source>
+ <translation type="obsolete">Ne peut coller des bouts MIDI sur des pistes AUDIO</translation>
+ </message>
+ <message>
+ <source>Cannot paste wave parts to midi track</source>
+ <translation type="obsolete">Ne peut copier des bouts AUDIO sur des pistes MIDI</translation>
+ </message>
+ <message>
+ <source>Cannot paste: wrong data type</source>
+ <translation type="obsolete">Ne peut coller: mauvais type de donnée</translation>
+ </message>
+</context>
+<context>
+ <name>PatchBay</name>
+ <message>
+ <source>MusE: ALSA MIDI Patch Bay</source>
+ <translation type="obsolete">MusE: Baie de Patches MIDI ALSA</translation>
+ </message>
+</context>
+<context>
+ <name>PatchBayBase</name>
+ <message>
+ <source>ALSA Patch Bay</source>
+ <translation>Baie de Patches ALSA</translation>
+ </message>
+</context>
+<context>
+ <name>PianoRoll</name>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Edition</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Couper</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Copier</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Coller</translation>
+ </message>
+ <message>
+ <source>Delete Events</source>
+ <translation type="obsolete">Effacer Evènements</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="obsolete">SĂ©lectionner tout</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation type="obsolete">Dé-sélectionner</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Inverser</translation>
+ </message>
+ <message>
+ <source>Inside Loop</source>
+ <translation type="obsolete">Dans la Boucle</translation>
+ </message>
+ <message>
+ <source>Outside Loop</source>
+ <translation type="obsolete">Hors de la Boucle</translation>
+ </message>
+ <message>
+ <source>&amp;Select</source>
+ <translation type="obsolete">&amp;SĂ©lectionner</translation>
+ </message>
+ <message>
+ <source>blue</source>
+ <translation type="obsolete">bleu</translation>
+ </message>
+ <message>
+ <source>pitch colors</source>
+ <translation type="obsolete">couleurs pour la hauteur</translation>
+ </message>
+ <message>
+ <source>velocity colors</source>
+ <translation type="obsolete">couleurs pour la vélocité</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Configuration</translation>
+ </message>
+ <message>
+ <source>event color</source>
+ <translation type="obsolete">couleur pour les évènements</translation>
+ </message>
+ <message>
+ <source>&amp;Functions</source>
+ <translation type="obsolete">&amp;Fonctions</translation>
+ </message>
+ <message>
+ <source>Over Quantize</source>
+ <translation type="obsolete">Plus de Quantisation</translation>
+ </message>
+ <message>
+ <source>Note On Quantize</source>
+ <translation type="obsolete">Quantisation Appui de Note</translation>
+ </message>
+ <message>
+ <source>Note On/Off Quantize</source>
+ <translation type="obsolete">Quantisation Appui/Relachement de Note</translation>
+ </message>
+ <message>
+ <source>Iterative Quantize</source>
+ <translation type="obsolete">Quantisation itérative</translation>
+ </message>
+ <message>
+ <source>Config Quant...</source>
+ <translation type="obsolete">Config. Quant.</translation>
+ </message>
+ <message>
+ <source>Modify Gate Time</source>
+ <translation type="obsolete">Modifier temps de fermeture (gate time)</translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation type="obsolete">Modifier la vélocité</translation>
+ </message>
+ <message>
+ <source>Crescendo</source>
+ <translation type="obsolete">Crescendo</translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="obsolete">Transposition</translation>
+ </message>
+ <message>
+ <source>Thin Out</source>
+ <translation type="obsolete">Sortie fine</translation>
+ </message>
+ <message>
+ <source>Erase Event</source>
+ <translation type="obsolete">Effacer Evènements</translation>
+ </message>
+ <message>
+ <source>Note Shift</source>
+ <translation type="obsolete">DĂ©calage de Note</translation>
+ </message>
+ <message>
+ <source>Move Clock</source>
+ <translation type="obsolete">DĂ©calage temporel</translation>
+ </message>
+ <message>
+ <source>Copy Measure</source>
+ <translation type="obsolete">Copier mesure</translation>
+ </message>
+ <message>
+ <source>Erase Measure</source>
+ <translation type="obsolete">Effacer mesure</translation>
+ </message>
+ <message>
+ <source>Delete Measure</source>
+ <translation type="obsolete">Supprimer mesure</translation>
+ </message>
+ <message>
+ <source>Create Measure</source>
+ <translation type="obsolete">Créer mesure</translation>
+ </message>
+ <message>
+ <source>Pianoroll Tools</source>
+ <translation type="obsolete">Outils de piano-roll</translation>
+ </message>
+ <message>
+ <source>Step Record</source>
+ <translation type="obsolete">Enregistrement pas-a-pas</translation>
+ </message>
+ <message>
+ <source>Midi Input</source>
+ <translation type="obsolete">Entrée MIDI</translation>
+ </message>
+ <message>
+ <source>Play Events</source>
+ <translation type="obsolete">Jouer Evènements</translation>
+ </message>
+ <message>
+ <source>Add Controller View</source>
+ <translation type="obsolete">Ajouter une vue de contrles</translation>
+ </message>
+ <message>
+ <source>ctrl</source>
+ <translation type="obsolete">ctrl</translation>
+ </message>
+</context>
+<context>
+ <name>PluginDialog</name>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>MusE: select plugin</source>
+ <translation>MusE: choisir plugin</translation>
+ </message>
+ <message>
+ <source>Lib</source>
+ <translation>Lib</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation>Label</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Nom</translation>
+ </message>
+ <message>
+ <source>AI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>IP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>id</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copyright</source>
+ <translation type="unfinished">Copyright</translation>
+ </message>
+ <message>
+ <source>Stereo and Mono</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="unfinished">Stéréo</translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="unfinished">Mono</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="unfinished">Tous</translation>
+ </message>
+ <message>
+ <source>Select which types of plugins should be visible in the list.&lt;br&gt;Note that using mono plugins on stereo tracks is not a problem, two will be used in parallell.&lt;br&gt;Also beware that the &apos;all&apos; alternative includes plugins that probably not are usable by MusE.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginGui</name>
+ <message>
+ <source>bypass plugin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: load preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: save preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File Buttons</source>
+ <translation type="unfinished">Boutons Fichiers</translation>
+ </message>
+ <message>
+ <source>Load Preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QHeader</name>
+ <message>
+ <source>output channel</source>
+ <translation type="obsolete">canal de sortie</translation>
+ </message>
+ <message>
+ <source>output port</source>
+ <translation type="obsolete">port de sortie (Output Ch.)</translation>
+ </message>
+</context>
+<context>
+ <name>QPopupMenu</name>
+ <message>
+ <source>Add Midi Generator...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Soft Synth...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QWidget</name>
+ <message>
+ <source>new</source>
+ <translation type="unfinished">nouveau</translation>
+ </message>
+ <message>
+ <source>File
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>
+exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: write</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">Aucun</translation>
+ </message>
+</context>
+<context>
+ <name>RhythmBase</name>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">Instrument</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nouveau</translation>
+ </message>
+ <message>
+ <source>create new entry</source>
+ <translation type="obsolete">Crée une nouvelle entrée</translation>
+ </message>
+ <message>
+ <source>pressing the New button you create a new entry
+in the MusE list of defined controllers</source>
+ <translation type="obsolete">Crée une nouvelle entrée dans la liste des controleurs</translation>
+ </message>
+ <message>
+ <source>delete selected entry</source>
+ <translation type="obsolete">efface l&apos;entrée sélectionnée</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="obsolete">list des controleurs définis</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="obsolete">C&apos;est la liste des controleurs qui ont été définis</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Fichier</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="obsolete">&amp;Aide</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Enregistrer</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="obsolete">&amp;Enregistrer</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Couper</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Copier</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Coller</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="obsolete">Co&amp;ller</translation>
+ </message>
+</context>
+<context>
+ <name>RhythmGenerator</name>
+ <message>
+ <source>Form3</source>
+ <translation type="obsolete">Form3</translation>
+ </message>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">Instrument</translation>
+ </message>
+ <message>
+ <source>delete</source>
+ <translation type="obsolete">effacer</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Enregistrer</translation>
+ </message>
+</context>
+<context>
+ <name>RouteDialogBase</name>
+ <message>
+ <source>MusE: Routing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Route</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Destination:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>connect source to destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Current Routes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>remove selected route</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SS_PluginChooserBase</name>
+ <message>
+ <source>SimpleDrums - Ladspa Plugin Chooser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Nom</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Label</translation>
+ </message>
+ <message>
+ <source>Inports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Creator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutCaptureDialogBase</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">OK</translation>
+ </message>
+ <message>
+ <source>Enter shortcut sequence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Press keys to enter shortcut sequence!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Old shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undefined</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfig</name>
+ <message>
+ <source>Global</source>
+ <translation type="unfinished">Global</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished">Arrangeur</translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation type="unfinished">Rouleau-Piano</translation>
+ </message>
+ <message>
+ <source>Drumeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List Mastertrack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All categories</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Start playback from current location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle metronome</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Stop Playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Play, Stop, Rewind</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Goto left marker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Goto right marker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Loop section</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Paste,</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: New project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Open from disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Save project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Open recent file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Save as</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Load template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Import midi file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Export midi file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Import audio file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Quit MusE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select parts on track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open pianoroll</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open drumeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open listeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open graphical mastertrack editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open list mastertrack editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open midi transformer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add midi track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add drum track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add wave track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio aux</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global insert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global split</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Copy range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Cut events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Open mixer window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Toggle transport window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Toggle bigtime window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Open marker window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song by page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song continuous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Global configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Configure shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Configure metronome</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi sync configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi file export configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Appearance settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi ports / Soft Synth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Audio subsystem configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Edit midi instruments</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input transform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi input transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi remote control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Random rhythm generator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Reset midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Init midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi local off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Restart audio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Mixer automation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Take mixer snapshot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Clear mixer automation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help: Open Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help: Toggle whatsthis mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Edit selected part</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track above</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track above</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track below</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track below</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select none</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Invert selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts inside locators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts outside locators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part/event to the left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the left to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the right to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Set locators to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Increase pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Decrease pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Set fixed length on midi events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Over Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Note On Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Note On/Off Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Iterative Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Configure quant</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Gate Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Crescendo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Thin Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Erase Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Note Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Move Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Copy Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Erase Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Delete Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Create Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Change event color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Pointer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Pencil</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Eraser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Line Draw</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Scissor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Glue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Mute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Increase current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Decrease current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/1 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/2 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/4 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/8 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/16 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/32 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/64 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle triol quantization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization (2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Insert at location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation type="unfinished">Insérer Note</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="unfinished">Insérer SysEx</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="unfinished">Insérer Ctrl</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="unfinished">Insérer Meta</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="unfinished">Insérr Canal de Pression</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="unfinished">Insérer une note de Pression</translation>
+ </message>
+ <message>
+ <source>Edit: Increase event position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Decrease event position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Tempo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Signature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Change Event Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Event Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfigBase</name>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished">&amp;Appliquer</translation>
+ </message>
+ <message>
+ <source>Configure Keyboard Shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Define</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SimpleDrumsGuiBase</name>
+ <message>
+ <source>DrumSynth 0.1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SynthConfigBase</name>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation type="obsolete">Synthétiseur virtuel</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="obsolete">Nom</translation>
+ </message>
+ <message>
+ <source>Midi Port</source>
+ <translation type="obsolete">Port MIDI</translation>
+ </message>
+</context>
+<context>
+ <name>TList</name>
+ <message>
+ <source>Delete Track</source>
+ <translation type="obsolete">Effacer Piste</translation>
+ </message>
+ <message>
+ <source>Track Comment</source>
+ <translation type="obsolete">Commentaire pour la Piste</translation>
+ </message>
+</context>
+<context>
+ <name>TempoSig</name>
+ <message>
+ <source>Tempo/Sig</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Toolbar1</name>
+ <message>
+ <source>Snap</source>
+ <translation type="obsolete">Aligne</translation>
+ </message>
+ <message>
+ <source>Quantize</source>
+ <translation type="obsolete">Quantiser</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation type="obsolete">Tous les Evènements</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Curseur</translation>
+ </message>
+</context>
+<context>
+ <name>Transport</name>
+ <message>
+ <source>Punch In</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation type="unfinished">Boucle</translation>
+ </message>
+ <message>
+ <source>Punch Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Left Mark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Right Mark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Overdub</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rec Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cycle Rec</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation type="unfinished">Punch-In</translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation type="unfinished">boucle</translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation type="unfinished">Punch-Out</translation>
+ </message>
+ <message>
+ <source>rewind to start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation type="unfinished">rembobiner</translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation type="unfinished">avance</translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation type="unfinished">stop</translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation type="unfinished">jouer</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>quantize during record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>metronom click on/off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>external sync on/off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>use master track</source>
+ <translation type="unfinished">Utiliser la piste principale</translation>
+ </message>
+</context>
+<context>
+ <name>TransposeDialogBase</name>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished">Valeur</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation type="unfinished">Temps</translation>
+ </message>
+ <message>
+ <source>all</source>
+ <translation type="unfinished">tous</translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation type="unfinished">Pièces</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">OK</translation>
+ </message>
+ <message>
+ <source>MusE: Midi Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>halftones</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>between markers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>all in selected tracks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>VelocityBase</name>
+ <message>
+ <source>All Events</source>
+ <translation type="unfinished">Tous les Evènements</translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation type="unfinished">Evènements choisis</translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation type="unfinished">Evènements bouclés</translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation type="unfinished">Boucle &amp; sélectionnée</translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation type="unfinished">Valeurs</translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation type="unfinished">Vitesse:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished">DĂ©calage:</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished">%</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">OK</translation>
+ </message>
+ <message>
+ <source>MusE: Modify Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">Entre</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WTScale</name>
+ <message>
+ <source>bar scale</source>
+ <translation type="obsolete">Echelle de la mesure</translation>
+ </message>
+</context>
+<context>
+ <name>WaveEdit</name>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Curseur</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Fichier</translation>
+ </message>
+</context>
+<context>
+ <name>WaveTrackInfoBase</name>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished">MusE: InfoPiste</translation>
+ </message>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished">Info Piste</translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="obsolete">Mono</translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="obsolete">Stéréo</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished">Nom de la Piste</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">arr</translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay (Frames)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/muse/share/locale/muse_ru.qm b/muse/share/locale/muse_ru.qm
new file mode 100644
index 00000000..06d9d3ab
--- /dev/null
+++ b/muse/share/locale/muse_ru.qm
Binary files differ
diff --git a/muse/share/locale/muse_ru.ts b/muse/share/locale/muse_ru.ts
new file mode 100644
index 00000000..0749d8d9
--- /dev/null
+++ b/muse/share/locale/muse_ru.ts
@@ -0,0 +1,5819 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name></name>
+ <message>
+ <source>Insert Note</source>
+ <translation type="obsolete">Đ’Ńтавить нотŃ</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="obsolete">Đ’Ńтавить SysEx</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="obsolete">Đ’Ńтавить контроллер</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="obsolete">Đ’Ńтавить Meta</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="obsolete">Đ’Ńтавить Channel Aftertouch</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="obsolete">Đ’Ńтавить Key Aftertouch</translation>
+ </message>
+</context>
+<context>
+ <name>@default</name>
+ <message>
+ <source>Click this button to stop playback</source>
+ <translation>Нажмите ŃŤŃ‚Ń ĐşĐ˝ĐľĐżĐşŃ Đ´Đ»ŃŹ ĐľŃтановки воŃпроизведения</translation>
+ </message>
+ <message>
+ <source>Click this button to start playback</source>
+ <translation>Нажмите ŃŤŃ‚Ń ĐşĐ˝ĐľĐżĐşŃ Đ´Đ»ŃŹ начала воŃпроизведения</translation>
+ </message>
+ <message>
+ <source>Click this button to rewind to start position</source>
+ <translation>Нажмите ŃŤŃ‚Ń ĐşĐ˝ĐľĐżĐşŃ Đ´Đ»ŃŹ перемещения Đş началŃ</translation>
+ </message>
+ <message>
+ <source>Click this button to rewind</source>
+ <translation>Нажмите ŃŤŃ‚Ń ĐşĐ˝ĐľĐżĐşŃ Đ´Đ»ŃŹ перемотки назад</translation>
+ </message>
+ <message>
+ <source>Click this button to forward current play position</source>
+ <translation>Нажмите ŃŤŃ‚Ń ĐşĐ˝ĐľĐżĐşŃ Đ´Đ»ŃŹ перемещения вперёд</translation>
+ </message>
+ <message>
+ <source>Click this button to open a &lt;em&gt;new song&lt;/em&gt;.&lt;br&gt;You can also select the &lt;b&gt;Open command&lt;/b&gt; from the File menu.</source>
+ <translation>Нажмите ŃŤŃ‚Ń ĐşĐ˝ĐľĐżĐşŃ Đ´Đ»ŃŹ открытия &lt;em&gt;Đ´Ń€Ńгой композиции&lt;/em&gt;.&lt;br&gt;Đ’Ń‹ также можете выбрать ĐżŃнкт &lt;b&gt;Открыть&lt;/b&gt; в меню &quot;Файл&quot;.</translation>
+ </message>
+ <message>
+ <source>Click this button to save the song you are editing. You will be prompted for a file name.
+You can also select the Save command from the File menu.</source>
+ <translation>Нажмите ŃŤŃ‚Ń ĐşĐ˝ĐľĐżĐşŃ Đ´Đ»ŃŹ Ńохранения редактирŃемой композиции.
+Đ’Ń‹ также можете выбрать ĐżŃнкт &lt;b&gt;Открыть&lt;/b&gt; в меню &quot;Файл&quot;.</translation>
+ </message>
+ <message>
+ <source>Create New Song</source>
+ <translation>Создать новŃŃŽ композицию</translation>
+ </message>
+ <message>
+ <source>loop between left mark and right mark</source>
+ <translation>Цикл ĐĽĐµĐ¶Đ´Ń Đ»ĐµĐ˛Ń‹ĐĽ и правым маркерами</translation>
+ </message>
+ <message>
+ <source>record starts at left mark</source>
+ <translation>ЗапиŃŃŚ начинаетŃŃŹ от маркера Ńлева</translation>
+ </message>
+ <message>
+ <source>record stops at right mark</source>
+ <translation>ЗапиŃŃŚ ĐľŃтанавливаетŃŃŹ по ĐĽĐ°Ń€ĐşĐµŃ€Ń Ńправа</translation>
+ </message>
+ <message>
+ <source>rewind to start position</source>
+ <translation>Перемотать к начальной позиции</translation>
+ </message>
+ <message>
+ <source>rewind current position</source>
+ <translation>Перемотать Đş текŃщей позиции</translation>
+ </message>
+ <message>
+ <source>move current position</source>
+ <translation>ПеремеŃтить текŃщŃŃŽ позицию</translation>
+ </message>
+ <message>
+ <source>stop sequencer</source>
+ <translation>ĐžŃтановить ŃеквенŃер</translation>
+ </message>
+ <message>
+ <source>start sequencer play</source>
+ <translation>Начать воŃпроизведение из ŃеквенŃера</translation>
+ </message>
+ <message>
+ <source>to record press record and then play</source>
+ <translation>Для начала запиŃи нажмите &quot;ЗапиŃĐ°Ń‚ŃŚ&quot;, Đ° затем &quot;Đ’ĐľŃпроизвеŃти&quot;</translation>
+ </message>
+ <message>
+ <source>send note off to all midi channels</source>
+ <translation>ПоŃлать note off на вŃе MIDI-каналы</translation>
+ </message>
+ <message>
+ <source>presets (*.pre *.pre.gz *.pre.bz2)</source>
+ <translation>ПредŃŃтановки (*.pre *.pre.gz *.pre.bz2)</translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation>Đ’Ńе файлы (*)</translation>
+ </message>
+ <message>
+ <source>Add Midi Track</source>
+ <translation>Добавить MIDI-дорожкŃ</translation>
+ </message>
+ <message>
+ <source>Add Drum Track</source>
+ <translation type="obsolete">Добавить Đ´ĐľŃ€ĐľĐ¶ĐşŃ Ń Ńдарными</translation>
+ </message>
+ <message>
+ <source>Add Wave Track</source>
+ <translation>Добавить звŃковŃŃŽ дорожкŃ</translation>
+ </message>
+ <message>
+ <source>Add Audio Output</source>
+ <translation>Добавить звŃковой выход</translation>
+ </message>
+ <message>
+ <source>Add Audio Group</source>
+ <translation>Добавить звŃковŃŃŽ грŃппŃ</translation>
+ </message>
+ <message>
+ <source>Add Audio Input</source>
+ <translation>Добавить звŃковой вход</translation>
+ </message>
+ <message>
+ <source>Add Aux Send</source>
+ <translation>Добавить aux поŃŃ‹Đ»</translation>
+ </message>
+ <message>
+ <source>Click this button to enable recording</source>
+ <translation type="unfinished">Нажмите ŃŤŃ‚Ń ĐşĐ»Đ°Đ˛Đ¸ŃŃ Đ´Đ»ŃŹ начала запиŃи</translation>
+ </message>
+ <message>
+ <source>Midi Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Output Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Input Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>AboutBox</name>
+ <message>
+ <source>AboutBox</source>
+ <translation>О программе</translation>
+ </message>
+ <message>
+ <source>Keep On Rocking!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Version 0.7.0
+
+(C) Copyright 1999-2004 Werner Schweer and others.
+See http://lmuse.sourceforge.net for new versions and
+more information.
+
+Published under the GNU Public License</source>
+ <translation>ВерŃия 0.7.0
+
+(C) Copyright 1999-2004 Werner Schweer и Đ´Ń€Ńгие.
+Новые верŃии и подробноŃти Ńмотрите на Ńайте
+http://lmuse.sourceforge.net
+
+ОпŃбликовано на ŃŃловиях GNU Public License</translation>
+ </message>
+</context>
+<context>
+ <name>Appearance</name>
+ <message>
+ <source>MusE: load image</source>
+ <translation>MusE: загрŃзить изображение</translation>
+ </message>
+</context>
+<context>
+ <name>AppearanceDialogBase</name>
+ <message>
+ <source>MusE: Appearance settings</source>
+ <translation>MusE: НаŃтройки облика</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>Применить</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отменить</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation>Компоновщик</translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation>ЧаŃти</translation>
+ </message>
+ <message>
+ <source>show names</source>
+ <translation>показывать рамки</translation>
+ </message>
+ <message>
+ <source>show events</source>
+ <translation>показывать Ńобытия</translation>
+ </message>
+ <message>
+ <source>show Cakewalk Style</source>
+ <translation>показывать в Ńтиле Cakewalk</translation>
+ </message>
+ <message>
+ <source>Events</source>
+ <translation>События</translation>
+ </message>
+ <message>
+ <source>note on</source>
+ <translation>note on</translation>
+ </message>
+ <message>
+ <source>poly pressure</source>
+ <translation>полифоничеŃкое поŃлекаŃание</translation>
+ </message>
+ <message>
+ <source>controller</source>
+ <translation>контроллер</translation>
+ </message>
+ <message>
+ <source>aftertouch</source>
+ <translation>поŃлекаŃание</translation>
+ </message>
+ <message>
+ <source>pitch bend</source>
+ <translation>Ńмена выŃоты звŃка</translation>
+ </message>
+ <message>
+ <source>program change</source>
+ <translation>Ńмена программы</translation>
+ </message>
+ <message>
+ <source>special</source>
+ <translation>Ńпециальная</translation>
+ </message>
+ <message>
+ <source>Background picture</source>
+ <translation>Фоновое изображение</translation>
+ </message>
+ <message>
+ <source>bg</source>
+ <translation>фон</translation>
+ </message>
+ <message>
+ <source>select...</source>
+ <translation>выбрать...</translation>
+ </message>
+ <message>
+ <source>show snap grid</source>
+ <translation>показывать ŃĐµŃ‚ĐşŃ ĐżŃ€Đ¸Đ˛ŃŹĐ·ĐşĐ¸</translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation>Цвета</translation>
+ </message>
+ <message>
+ <source>Items</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Style/Fonts</source>
+ <translation>Стиль/Шрифты</translation>
+ </message>
+ <message>
+ <source>QT Theme</source>
+ <translation>Тема QT</translation>
+ </message>
+ <message>
+ <source>Windows</source>
+ <translation>Окна</translation>
+ </message>
+ <message>
+ <source>MusE</source>
+ <translation>MusE</translation>
+ </message>
+ <message>
+ <source>Metal</source>
+ <translation>Металл</translation>
+ </message>
+ <message>
+ <source>Norwegian Wood</source>
+ <translation>НорвежŃкое дерево</translation>
+ </message>
+ <message>
+ <source>Platinum</source>
+ <translation>Платина</translation>
+ </message>
+ <message>
+ <source>CDE</source>
+ <translation>CDE</translation>
+ </message>
+ <message>
+ <source>Motif</source>
+ <translation>Motif</translation>
+ </message>
+ <message>
+ <source>Motif Plus</source>
+ <translation>Motif Plus</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation>Шрифты</translation>
+ </message>
+ <message>
+ <source>Family</source>
+ <translation>СемейŃтво</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Размер</translation>
+ </message>
+ <message>
+ <source>Font 1</source>
+ <translation>Шрифт 1</translation>
+ </message>
+ <message>
+ <source>Font 2</source>
+ <translation>Шрифт 2</translation>
+ </message>
+ <message>
+ <source>Font 3</source>
+ <translation>Шрифт 3</translation>
+ </message>
+ <message>
+ <source>Font 0</source>
+ <translation>Шрифт 0</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>Жирный</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>ĐšŃŃ€Ńив</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <source>Font 4</source>
+ <translation>Шрифт 4</translation>
+ </message>
+ <message>
+ <source>Font 5</source>
+ <translation>Шрифт 5</translation>
+ </message>
+ <message>
+ <source>Palette</source>
+ <translation>Палитра</translation>
+ </message>
+ <message>
+ <source>add to palette</source>
+ <translation>Добавить в палитрŃ</translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation>B</translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation>S</translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation>H</translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation>V</translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation>G</translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation>R</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Itemdsfkajlk jölk ljfölajföajföajf</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ClipListEditorBase</name>
+ <message>
+ <source>MusE: ClipList</source>
+ <translation>MusE: СпиŃок фрагментов</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>ĐĐĽŃŹ</translation>
+ </message>
+ <message>
+ <source>Refs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation>Начало</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation>Длн</translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation>Данные</translation>
+ </message>
+ <message>
+ <source>Clip Properties</source>
+ <translation>СвойŃтва фрагмента</translation>
+ </message>
+ <message>
+ <source>Pos:</source>
+ <translation>Поз.:</translation>
+ </message>
+ <message>
+ <source>Len:</source>
+ <translation>Длн.:</translation>
+ </message>
+</context>
+<context>
+ <name>CommentBase</name>
+ <message>
+ <source>Form1</source>
+ <translation>Form1</translation>
+ </message>
+ <message>
+ <source>Track Comment</source>
+ <translation>Комментарий к дорожке</translation>
+ </message>
+ <message>
+ <source>Track 1</source>
+ <translation>Дорожка 1</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiCtrlBase</name>
+ <message>
+ <source>MusE: Config Midi Controller</source>
+ <translation>MusE: НаŃтройка MIDI-контроллера</translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation>MIDI-порт:</translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation>ДоŃŃ‚Ńпный контроллер:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Добавить</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>Automated Controller:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;ОК</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>О&amp;тменить</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiFileBase</name>
+ <message>
+ <source>MusE: Config Midi File Export</source>
+ <translation>MusE: НаŃтройка ŃŤĐşŃпорта в MIDI</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;ОК</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>О&amp;тменить</translation>
+ </message>
+ <message>
+ <source>0 (single track)</source>
+ <translation>0 (одиночная дорожка)</translation>
+ </message>
+ <message>
+ <source>1 (multiple tracks)</source>
+ <translation>1 (больŃе одной дорожки)</translation>
+ </message>
+ <message>
+ <source>Format:</source>
+ <translation>Формат:</translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation>96</translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation>192</translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation>384</translation>
+ </message>
+ <message>
+ <source>Division:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copyright:</source>
+ <translation>ĐвторŃкие и Ńмежные права:</translation>
+ </message>
+ <message>
+ <source>Enable extended smf format</source>
+ <translation>РазреŃить раŃŃиренный формат SMF</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigTrackListBase</name>
+ <message>
+ <source>MusE: Config Track List</source>
+ <translation>MusE: НаŃтройка ŃпиŃка дорожек</translation>
+ </message>
+ <message>
+ <source>Track Type:</source>
+ <translation>Тип дорожки:</translation>
+ </message>
+ <message>
+ <source>Audio Output</source>
+ <translation>ĐŃдиовыход</translation>
+ </message>
+ <message>
+ <source>Audio Group</source>
+ <translation>ĐŃдиогрŃппа</translation>
+ </message>
+ <message>
+ <source>Audio Aux</source>
+ <translation>Audio Aux</translation>
+ </message>
+ <message>
+ <source>Wave Track</source>
+ <translation>ĐŃдиодорожка</translation>
+ </message>
+ <message>
+ <source>Audio Input</source>
+ <translation>ĐŃдиовход</translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation>Программный Ńинтезатор</translation>
+ </message>
+ <message>
+ <source>Midi Track</source>
+ <translation>MIDI-дорожка</translation>
+ </message>
+ <message>
+ <source>Drum Track</source>
+ <translation>ПеркŃŃŃионная дорожка</translation>
+ </message>
+ <message>
+ <source>Available Items:</source>
+ <translation>ДоŃŃ‚Ńпные варианты:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Добавить</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation>Вверх</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation>Вниз</translation>
+ </message>
+ <message>
+ <source>Configured Items</source>
+ <translation>НаŃтроенные дорожки</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;ОК</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>О&amp;тменить</translation>
+ </message>
+ <message>
+ <source>Track Name Size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DeicsOnzeGuiBase</name>
+ <message>
+ <source>DeicsOnze</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Presets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subcategory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PRO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished">ПредŃŃтановка</translation>
+ </message>
+ <message>
+ <source>Bank numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NONE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>INITVOICE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op4 Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Feedback level of the operator 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modulation Matrix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Algorithm 1&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 2&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by both &lt;i&gt;Op 3&lt;/i&gt; and &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 3&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 4&lt;/i&gt; and &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 4&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 2&lt;/i&gt; and &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 5&lt;/b&gt; : (&lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt;) add to (&lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;) &lt;br&gt;
+&lt;b&gt;Algorithm 6&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; all modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 7&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; with &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 8&lt;/b&gt; : addition of the four &lt;i&gt;Op 1, 2, 3, 4&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Waveform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Envelope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FIX</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle Fix Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Enable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keyboard Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Eg Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack Rate of the operator 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>48dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>24dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>12dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form 1 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)&lt;/i&gt;&lt;br&gt;
+Wave form 2 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;))&lt;/i&gt;&lt;br&gt;
+Wave form 3 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 4 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 5 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 6 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 7 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 8 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>2° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rate Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>amplitude Envelope 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Fun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phony Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>POLY</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MONO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foot Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bend Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Đ’Ń‹Ńота тона</translation>
+ </message>
+ <message>
+ <source>Modulation Wheel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Breath Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>After Touch</source>
+ <translation type="unfinished">ПоŃлекаŃание</translation>
+ </message>
+ <message>
+ <source>Potamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FINGER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FULL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PT</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foot Switch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="unfinished">ТранŃпонировать</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configuration File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished">Сохранить</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quality</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Middle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NbrV</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of Voices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation type="unfinished">Цвета</translation>
+ </message>
+ <message>
+ <source>Red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save only the used presets into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the entire set into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the configuration into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl7DialogBase</name>
+ <message>
+ <source>MusE: Enter Controller</source>
+ <translation>MusE: ВвеŃти контроллер</translation>
+ </message>
+ <message>
+ <source>Controller:</source>
+ <translation>Контроллер:</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Позиция во времени:</translation>
+ </message>
+ <message>
+ <source>Value:</source>
+ <translation>Значение:</translation>
+ </message>
+ <message>
+ <source>controller value</source>
+ <translation>значение контроллера</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отменить</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrlBase</name>
+ <message>
+ <source>MusE: Edit Controller Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Позиция во времени</translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation type="unfinished">ДоŃŃ‚Ńпный контроллер:</translation>
+ </message>
+ <message>
+ <source>Create New Controller</source>
+ <translation>Создать новый контроллер</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Значение</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation>Контроллер</translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation type="unfinished">H-банк</translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation type="unfinished">L-банк</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation>Программа</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation>выкл</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;ОК</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">О&amp;тменить</translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation type="unfinished">MIDI-порт:</translation>
+ </message>
+ <message>
+ <source>Midi Channel:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation type="unfinished">Позиция во времени:</translation>
+ </message>
+ <message>
+ <source>Patch Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditInstrumentBase</name>
+ <message>
+ <source>MusE: Instrument Editor</source>
+ <translation>MusE: Редактор инŃŃ‚Ń€Ńментов</translation>
+ </message>
+ <message>
+ <source>Patches</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High Bank:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low Bank:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program:</source>
+ <translation>Программа:</translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <comment>dont care</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch/Group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>У&amp;далить</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>&amp;New Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>New Group</source>
+ <translation>Новая грŃппа</translation>
+ </message>
+ <message>
+ <source>Drum</source>
+ <translation>Ударные</translation>
+ </message>
+ <message>
+ <source>GM</source>
+ <translation>GM</translation>
+ </message>
+ <message>
+ <source>GS</source>
+ <translation>GS</translation>
+ </message>
+ <message>
+ <source>XG</source>
+ <translation>XG</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation>Контроллер</translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation>Предопределённый контроллер:</translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation>СвойŃтва</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>ĐĐĽŃŹ</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Тип</translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation>Control7</translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation>Control14</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation>RPN</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation>NRPN</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Đ’Ń‹Ńота тона</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation>Программа</translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation>H-Ctrl</translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation type="unfinished">L-Ctrl</translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation>ОблаŃŃ‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Min</source>
+ <translation>Мин</translation>
+ </message>
+ <message>
+ <source>Max</source>
+ <translation>МакŃ</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation>ĐĐĽŃŹ </translation>
+ </message>
+ <message>
+ <source>Type </source>
+ <translation>Тип </translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation>Мин знач</translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation>ĐśĐ°ĐşŃ Đ·Đ˝Đ°Ń‡</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="unfinished">ŃпиŃок назначенных контроллеров</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation>Đ­Ń‚Đľ ŃпиŃок назначенных контроллеров для MusE.</translation>
+ </message>
+ <message>
+ <source>SysEx</source>
+ <translation>SysEx</translation>
+ </message>
+ <message>
+ <source>Initialization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hex Entry:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Файл</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>СервиŃ</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation>Новый</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Новый</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation>Ctrl+N</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Открыть</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation>&amp;Открыть...</translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation>Ctrl+O</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Сохранить</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Сохранить</translation>
+ </message>
+ <message>
+ <source>Ctrl+S</source>
+ <translation>Ctrl+S</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>Сохранить как</translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation>Сохранить &amp;как...</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Выйти</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation>В&amp;ыйти</translation>
+ </message>
+</context>
+<context>
+ <name>EditMetaDialogBase</name>
+ <message>
+ <source>MusE: Enter Meta Event</source>
+ <translation>MusE: ВвеŃти метаŃобытие</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отменить</translation>
+ </message>
+ <message>
+ <source>TextLabel1</source>
+ <translation>ТекŃтоваяМетка1</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Позиция во времени:</translation>
+ </message>
+ <message>
+ <source>Meta Type:</source>
+ <translation>Метатип:</translation>
+ </message>
+ <message>
+ <source>Enter Hex</source>
+ <translation>Введите Hex</translation>
+ </message>
+</context>
+<context>
+ <name>EditNoteDialogBase</name>
+ <message>
+ <source>MusE: Enter Note</source>
+ <translation>MusE: ВвеŃти нотŃ</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отменить</translation>
+ </message>
+ <message>
+ <source>Length:</source>
+ <translation>ПродолжительноŃŃ‚ŃŚ:</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Позиция во времени:</translation>
+ </message>
+ <message>
+ <source>Pitch:</source>
+ <translation>Đ’Ń‹Ńота тона:</translation>
+ </message>
+ <message>
+ <source>Velocity On:</source>
+ <translation>СкороŃŃ‚ŃŚ вкл.:</translation>
+ </message>
+ <message>
+ <source>Velocity Off:</source>
+ <translation>СкороŃŃ‚ŃŚ выкл.:</translation>
+ </message>
+</context>
+<context>
+ <name>EditSysexDialogBase</name>
+ <message>
+ <source>MusE: Enter SysEx</source>
+ <translation>MusE: ВвеŃти SysEx</translation>
+ </message>
+ <message>
+ <source>TimePosition:</source>
+ <translation>Время:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>Комментарий:</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отменить</translation>
+ </message>
+ <message>
+ <source>Known SysEx:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation type="unfinished">Добавить</translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDGuiBase</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished">Form1</translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDSynthGuiBase</name>
+ <message>
+ <source>FLUID Synth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dump Info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fontname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Damping</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Room Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CHANNEL SETUP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Triangle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Тип</translation>
+ </message>
+ <message>
+ <source>Number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chorus</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Gain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LOADED SOUNDFONTS</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileDialogButtons</name>
+ <message>
+ <source>Form1</source>
+ <translation>Form1</translation>
+ </message>
+ <message>
+ <source>Global</source>
+ <translation>Глобально</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>ДомаŃний
+каталог</translation>
+ </message>
+ <message>
+ <source>Project</source>
+ <translation>Проект</translation>
+ </message>
+ <message>
+ <source>Load:</source>
+ <translation>ЗагрŃзить:</translation>
+ </message>
+ <message>
+ <source>Songdata +
+Cofiguration</source>
+ <translation>Композиции +
+наŃтройки</translation>
+ </message>
+ <message>
+ <source>only
+Songdata</source>
+ <translation>только
+композиции</translation>
+ </message>
+</context>
+<context>
+ <name>GateTimeBase</name>
+ <message>
+ <source>MusE: Modify Gate Time</source>
+ <translation>MusE: Đзменить время звŃчания</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation>ОблаŃŃ‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation>Đ’Ńе Ńобытия</translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation>Выбранные Ńобытия</translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation>События в цикле</translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation>Выбранные и в цикле</translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation>Значения</translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation>ЧаŃтота:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation>Смещение:</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>ОК</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отменить</translation>
+ </message>
+</context>
+<context>
+ <name>GlobalSettingsDialogBase</name>
+ <message>
+ <source>MusE: Global Settings</source>
+ <translation>MusE: Общие наŃтройки</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation>&amp;Применить</translation>
+ </message>
+ <message>
+ <source>&amp;Ok</source>
+ <translation>&amp;ОК</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>О&amp;тменить</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation>ЗвŃĐş</translation>
+ </message>
+ <message>
+ <source>Mixer</source>
+ <translation>МикŃер</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation>Дб</translation>
+ </message>
+ <message>
+ <source>min. Meter Value</source>
+ <translation>мин. значение индикатора</translation>
+ </message>
+ <message>
+ <source>min.Slider Val</source>
+ <translation>мин. значение ползŃнка</translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation>MIDI</translation>
+ </message>
+ <message>
+ <source>Ticks</source>
+ <translation>Тактовые импŃльŃŃ‹ (тики)</translation>
+ </message>
+ <message>
+ <source>1024</source>
+ <translation>1024</translation>
+ </message>
+ <message>
+ <source>2048</source>
+ <translation>2048</translation>
+ </message>
+ <message>
+ <source>4096</source>
+ <translation>4096</translation>
+ </message>
+ <message>
+ <source>8172</source>
+ <translation>8172</translation>
+ </message>
+ <message>
+ <source>Displayed Resolution
+(Ticks/Quarternote)</source>
+ <translation>Отображаемое разреŃение
+(Тиков/четвертей)</translation>
+ </message>
+ <message>
+ <source>48</source>
+ <translation>48</translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation>96</translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation>192</translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation>384</translation>
+ </message>
+ <message>
+ <source>768</source>
+ <translation>768</translation>
+ </message>
+ <message>
+ <source>1536</source>
+ <translation>1536</translation>
+ </message>
+ <message>
+ <source>3072</source>
+ <translation>3072</translation>
+ </message>
+ <message>
+ <source>6144</source>
+ <translation>6144</translation>
+ </message>
+ <message>
+ <source>12288</source>
+ <translation>12288</translation>
+ </message>
+ <message>
+ <source>RTC Resolution
+(Ticks/Sec)</source>
+ <translation>RTC-разреŃение
+(тиков/Ńек)</translation>
+ </message>
+ <message>
+ <source>GUI</source>
+ <translation>GUI</translation>
+ </message>
+ <message>
+ <source>Help Browser:</source>
+ <translation>Đ’ чём читать ŃправкŃ:</translation>
+ </message>
+ <message>
+ <source>GUI Refresh Rate</source>
+ <translation>ЧаŃтота обновления GUI</translation>
+ </message>
+ <message>
+ <source>/sec</source>
+ <translation>/Ńек</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Приложение</translation>
+ </message>
+ <message>
+ <source>Start Muse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with last song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with song</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start song:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Views</source>
+ <translation>Виды</translation>
+ </message>
+ <message>
+ <source>y-pos</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>x-pos</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>height</source>
+ <translation>выŃота</translation>
+ </message>
+ <message>
+ <source>width</source>
+ <translation>Ńирина</translation>
+ </message>
+ <message>
+ <source>Big Time</source>
+ <translation>Хронометр</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation>Компоновщик</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation>ТранŃпорт</translation>
+ </message>
+ <message>
+ <source>Cur</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>set current values</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start with template: default.med</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>show splash screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>use JACK freewheel mode if possible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MITTransposeBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation type="unfinished">Вкл</translation>
+ </message>
+ <message>
+ <source>TriggerKey</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transpose:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MPConfig</name>
+ <message>
+ <source>none</source>
+ <translation type="obsolete">ничего</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Порт</translation>
+ </message>
+ <message>
+ <source>GUI</source>
+ <translation type="obsolete">GUI</translation>
+ </message>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">ĐĐ˝ŃŃ‚Ń€Ńмент</translation>
+ </message>
+ <message>
+ <source>Device Name</source>
+ <translation type="obsolete">ĐĐĽŃŹ ŃŃтройŃтва</translation>
+ </message>
+ <message>
+ <source>State</source>
+ <translation type="obsolete">СоŃтояние</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="obsolete">неизвеŃтно</translation>
+ </message>
+ <message>
+ <source>I</source>
+ <translation type="obsolete">I</translation>
+ </message>
+ <message>
+ <source>O</source>
+ <translation type="obsolete">O</translation>
+ </message>
+</context>
+<context>
+ <name>MRConfigBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Remote Control</source>
+ <translation>MusE: Входной MIDI-модŃль: ДиŃŃ‚Đ°Đ˝. Ńправление</translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation>Đктивировать</translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation>Вкл</translation>
+ </message>
+ <message>
+ <source>Actions</source>
+ <translation>ДейŃтвия</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>ĐžŃтановить</translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation>ЗапиŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Goto Left Mark</source>
+ <translation>Перейти к левой метке</translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation>Đ’ĐľŃпроизвеŃти</translation>
+ </message>
+</context>
+<context>
+ <name>MidiController</name>
+ <message>
+ <source>Velocity</source>
+ <translation>Сила нажатия</translation>
+ </message>
+</context>
+<context>
+ <name>MidiControllerEditDialogBase</name>
+ <message>
+ <source>MusE: Define Midi Controller</source>
+ <translation>MusE: Назначить MIDI-контроллер</translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation>ĐĐĽŃŹ </translation>
+ </message>
+ <message>
+ <source>Type </source>
+ <translation>Тип </translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation>H-Ctrl</translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation>L-Ctrl</translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation>Мин знач</translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation>ĐśĐ°ĐşŃ Đ·Đ˝Đ°Ń‡</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation>ŃпиŃок назначенных контроллеров</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation>Đ­Ń‚Đľ ŃпиŃок назначенных в MusE контроллеров.</translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation>СвойŃтва</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>ĐĐĽŃŹ</translation>
+ </message>
+ <message>
+ <source>Max Value</source>
+ <translation>ĐśĐ°ĐşŃ Đ·Đ˝Đ°Ń‡ĐµĐ˝Đ¸Đµ</translation>
+ </message>
+ <message>
+ <source>Min Value</source>
+ <translation>Мин значение</translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation>Control7</translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation>Control14</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation>RPN</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation>NRPN</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Тип</translation>
+ </message>
+ <message>
+ <source>create new entry</source>
+ <translation>Ńоздать новŃŃŽ запиŃŃŚ</translation>
+ </message>
+ <message>
+ <source>pressing the New button you create a new entry
+in the MusE list of defined controllers</source>
+ <translation>По нажатию кнопки &quot;Новая&quot; ŃоздаётŃŃŹ новая
+запиŃŃŚ в ŃпиŃок назначенных в MusE контроллеров</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>У&amp;далить</translation>
+ </message>
+ <message>
+ <source>delete selected entry</source>
+ <translation>Ńдалить выделенное Ńобытие</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>О&amp;тменить</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation>Канал</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation>Đ’Ń‹Ńота тона</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation>ОблаŃŃ‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Добавить</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation>Предопределённый контроллер:</translation>
+ </message>
+ <message>
+ <source>Managed Controller for Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation>Программа</translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiFilterConfigBase</name>
+ <message>
+ <source>MusE: Midi Input Filter</source>
+ <translation type="obsolete">MusE: Фильтр входящих MIDI-Ńобытий</translation>
+ </message>
+ <message>
+ <source>Record Filter</source>
+ <translation type="obsolete">Фильтр запиŃи</translation>
+ </message>
+ <message>
+ <source>Note On</source>
+ <translation type="obsolete">Note On</translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="obsolete">ПолифоничеŃкое поŃлекаŃание</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="obsolete">Контроллер</translation>
+ </message>
+ <message>
+ <source>Program Change</source>
+ <translation type="obsolete">Смена программы</translation>
+ </message>
+ <message>
+ <source>After Touch</source>
+ <translation type="obsolete">ПоŃлекаŃание</translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="obsolete">Смена выŃоты звŃка</translation>
+ </message>
+ <message>
+ <source>Sysex</source>
+ <translation type="obsolete">SysEx</translation>
+ </message>
+ <message>
+ <source>Thru Filter</source>
+ <translation type="obsolete">Thru-фильтр</translation>
+ </message>
+ <message>
+ <source>Controller Filter</source>
+ <translation type="obsolete">Фильтр контроллеров</translation>
+ </message>
+ <message>
+ <source>Channel Filter</source>
+ <translation type="obsolete">Фильтр каналов</translation>
+ </message>
+ <message>
+ <source>14</source>
+ <translation type="obsolete">14</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation type="obsolete">10</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation type="obsolete">6</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation type="obsolete">12</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation type="obsolete">4</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation type="obsolete">2</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation type="obsolete">9</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation type="obsolete">8</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation type="obsolete">3</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation type="obsolete">13</translation>
+ </message>
+ <message>
+ <source>15</source>
+ <translation type="obsolete">15</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation type="obsolete">16</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation type="obsolete">7</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation type="obsolete">11</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation type="obsolete">5</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation type="obsolete">1</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">О&amp;тменить</translation>
+ </message>
+</context>
+<context>
+ <name>MidiInputTransformDialogBase</name>
+ <message>
+ <source>MusE: Midi Input Transformator</source>
+ <translation type="obsolete">MusE: Преобразование входящих MIDI-Ńообщений</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="obsolete">Фильтр</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="obsolete">Đ’Ńе</translation>
+ </message>
+ <message>
+ <source>Equal</source>
+ <translation type="obsolete">Равно</translation>
+ </message>
+ <message>
+ <source>Unequal</source>
+ <translation type="obsolete">Не равно</translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="obsolete">Нота</translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="obsolete">ПолифоничеŃкое поŃлекаŃание</translation>
+ </message>
+ <message>
+ <source>Control Change</source>
+ <translation type="obsolete">Смена контроллера</translation>
+ </message>
+ <message>
+ <source>Aftertouch</source>
+ <translation type="obsolete">ПоŃлекаŃание</translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="obsolete">Смена выŃоты звŃка</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="obsolete">NRPN</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="obsolete">RPN</translation>
+ </message>
+ <message>
+ <source>Value 2</source>
+ <translation type="obsolete">Значение 2</translation>
+ </message>
+ <message>
+ <source>Value 1</source>
+ <translation type="obsolete">Значение 1</translation>
+ </message>
+ <message>
+ <source>Event Type</source>
+ <translation type="obsolete">Тип Ńобытия</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="obsolete">Đгнорировать</translation>
+ </message>
+ <message>
+ <source>Higher</source>
+ <translation type="obsolete">Đ’Ń‹Ńе</translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="obsolete">Ниже</translation>
+ </message>
+ <message>
+ <source>Inside</source>
+ <translation type="obsolete">Đ’Đ˝Ńтри</translation>
+ </message>
+ <message>
+ <source>Outside</source>
+ <translation type="obsolete">СнарŃжи</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="obsolete">Канал</translation>
+ </message>
+ <message>
+ <source>Port</source>
+ <translation type="obsolete">Порт</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="obsolete">ĐĐ´Ń‘Ń‚ обработка</translation>
+ </message>
+ <message>
+ <source>Keep</source>
+ <translation type="obsolete">Сохранить</translation>
+ </message>
+ <message>
+ <source>Fix</source>
+ <translation type="obsolete">Поправить</translation>
+ </message>
+ <message>
+ <source>Plus</source>
+ <translation type="obsolete">ПлюŃ</translation>
+ </message>
+ <message>
+ <source>Minus</source>
+ <translation type="obsolete">МинŃŃ</translation>
+ </message>
+ <message>
+ <source>Multiply</source>
+ <translation type="obsolete">Умножить</translation>
+ </message>
+ <message>
+ <source>Divide</source>
+ <translation type="obsolete">Разделить</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Đнвертировать</translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="obsolete">СлŃчайно</translation>
+ </message>
+ <message>
+ <source>Modules</source>
+ <translation type="obsolete">МодŃли</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation type="obsolete">1</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation type="obsolete">2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation type="obsolete">3</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation type="obsolete">4</translation>
+ </message>
+ <message>
+ <source>enable modul 1</source>
+ <translation type="obsolete">разреŃить модŃль 1</translation>
+ </message>
+ <message>
+ <source>enable modul 2</source>
+ <translation type="obsolete">разреŃить модŃль 2</translation>
+ </message>
+ <message>
+ <source>enable modul 3</source>
+ <translation type="obsolete">разреŃить модŃль 3</translation>
+ </message>
+ <message>
+ <source>enable modul 4</source>
+ <translation type="obsolete">разреŃить модŃль 4</translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="obsolete">ПредŃŃтановка</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="obsolete">ĐĐĽŃŹ:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="obsolete">Комментарий:</translation>
+ </message>
+ <message>
+ <source>Function</source>
+ <translation type="obsolete">ФŃнкция</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Новый</translation>
+ </message>
+ <message>
+ <source>create new preset</source>
+ <translation type="obsolete">Ńоздать новŃŃŽ предŃŃтановкŃ</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;Удалить</translation>
+ </message>
+ <message>
+ <source>delete preset</source>
+ <translation type="obsolete">Ńдалить предŃŃтановкŃ</translation>
+ </message>
+ <message>
+ <source>&amp;Dismiss</source>
+ <translation type="obsolete">&amp;ПропŃŃтить</translation>
+ </message>
+ <message>
+ <source>PresetList</source>
+ <translation type="obsolete">СпиŃок предŃŃтановок</translation>
+ </message>
+</context>
+<context>
+ <name>MidiPortRouteBase</name>
+ <message>
+ <source>Input</source>
+ <translation>Вход</translation>
+ </message>
+ <message>
+ <source>MusE: Midi Port Routing</source>
+ <translation>MusE: МарŃŃ€ŃŃ‚Ń‹ ĐĽĐµĐ¶Đ´Ń MIDI-портами</translation>
+ </message>
+ <message>
+ <source>Port 2</source>
+ <translation>Порт 2</translation>
+ </message>
+ <message>
+ <source>Output</source>
+ <translation>Выход</translation>
+ </message>
+</context>
+<context>
+ <name>MidiSyncConfigBase</name>
+ <message>
+ <source>MusE: Midi Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sync Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="unfinished">МаŃтер</translation>
+ </message>
+ <message>
+ <source>Slave</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sync Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>accept MTC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>accept Midi Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>accept MMC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Id:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>device id</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sync Gen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Time Code (MTC)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Machine Control (MMC)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="unfinished">Применить</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Отменить</translation>
+ </message>
+ <message>
+ <source>MTC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>24</source>
+ <translation type="unfinished">24</translation>
+ </message>
+ <message>
+ <source>25</source>
+ <translation type="unfinished">25</translation>
+ </message>
+ <message>
+ <source>30D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>30N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished">Смещение:</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>frame</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>f</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>subframe</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTrackInfoBase</name>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>all midi events are send to this output channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished">%</translation>
+ </message>
+ <message>
+ <source>Modify Note Length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OCh.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">выкл</translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Compress Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transp.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Compr.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Сила нажатия</translation>
+ </message>
+ <message>
+ <source>Modify Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Ports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>IChan.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Channels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Events from all configured channels are
+recorded to this track.
+You can specify more than one channel for
+recording:
+ 1 2 3 record from channel 1 2 and 3
+ 1-3 same
+ 1-3 5<byte value="x9"/> record from channel 1 2 3 and 5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Channel Info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>???</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select Instrument Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select LSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select MSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument High Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument Low Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Progr.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument/Program/Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformDialogBase</name>
+ <message>
+ <source>MusE: Midi Transformator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Новый</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished">&amp;Применить</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">О&amp;тменить</translation>
+ </message>
+ <message>
+ <source>PresetList</source>
+ <translation type="unfinished">СпиŃок предŃŃтановок</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="unfinished">ĐĐ´Ń‘Ń‚ обработка</translation>
+ </message>
+ <message>
+ <source>Event Type</source>
+ <translation type="unfinished">Тип Ńобытия</translation>
+ </message>
+ <message>
+ <source>Keep</source>
+ <translation type="unfinished">Сохранить</translation>
+ </message>
+ <message>
+ <source>Fix</source>
+ <translation type="unfinished">Поправить</translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="unfinished">Нота</translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="unfinished">ПолифоничеŃкое поŃлекаŃание</translation>
+ </message>
+ <message>
+ <source>Control Change</source>
+ <translation type="unfinished">Смена контроллера</translation>
+ </message>
+ <message>
+ <source>Aftertouch</source>
+ <translation type="unfinished">ПоŃлекаŃание</translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="unfinished">Смена выŃоты звŃка</translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished">NRPN</translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished">RPN</translation>
+ </message>
+ <message>
+ <source>Plus</source>
+ <translation type="unfinished">ПлюŃ</translation>
+ </message>
+ <message>
+ <source>Minus</source>
+ <translation type="unfinished">МинŃŃ</translation>
+ </message>
+ <message>
+ <source>Multiply</source>
+ <translation type="unfinished">Умножить</translation>
+ </message>
+ <message>
+ <source>Divide</source>
+ <translation type="unfinished">Разделить</translation>
+ </message>
+ <message>
+ <source>Value 2</source>
+ <translation type="unfinished">Значение 2</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="unfinished">Đнвертировать</translation>
+ </message>
+ <message>
+ <source>ScaleMap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dyn</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="unfinished">СлŃчайно</translation>
+ </message>
+ <message>
+ <source>Value 1</source>
+ <translation type="unfinished">Значение 1</translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="unfinished">Фильтр</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="unfinished">Đ’Ńе</translation>
+ </message>
+ <message>
+ <source>Equal</source>
+ <translation type="unfinished">Равно</translation>
+ </message>
+ <message>
+ <source>Unequal</source>
+ <translation type="unfinished">Не равно</translation>
+ </message>
+ <message>
+ <source>Sysex</source>
+ <translation type="unfinished">SysEx</translation>
+ </message>
+ <message>
+ <source>Meta</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="unfinished">Đгнорировать</translation>
+ </message>
+ <message>
+ <source>Higher</source>
+ <translation type="unfinished">Đ’Ń‹Ńе</translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="unfinished">Ниже</translation>
+ </message>
+ <message>
+ <source>Inside</source>
+ <translation type="unfinished">Đ’Đ˝Ńтри</translation>
+ </message>
+ <message>
+ <source>Outside</source>
+ <translation type="unfinished">СнарŃжи</translation>
+ </message>
+ <message>
+ <source>Bar Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished">ПредŃŃтановка</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">ĐĐĽŃŹ:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="unfinished">Комментарий:</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">ОблаŃŃ‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>process all events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>selected tracks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>inside loop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Function</source>
+ <translation type="unfinished">ФŃнкция</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation type="unfinished">Выделить</translation>
+ </message>
+ <message>
+ <source>Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished">Скопировать</translation>
+ </message>
+ <message>
+ <source>Extract</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformerDialog</name>
+ <message>
+ <source>New</source>
+ <translation>Новый</translation>
+ </message>
+</context>
+<context>
+ <name>MixdownFileDialogBase</name>
+ <message>
+ <source>MusE: Set Mixdown Wavefile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">О&amp;тменить</translation>
+ </message>
+ <message>
+ <source>File Path</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="unfinished">Канал</translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="unfinished">Стерео</translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="unfinished">Моно</translation>
+ </message>
+ <message>
+ <source>5.1</source>
+ <translation type="unfinished">5.1</translation>
+ </message>
+ <message>
+ <source>wav,16 Bit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wav, 24 Bit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wav, 32 Bit (float)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Format</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MusE</name>
+ <message>
+ <source>Import Wave File</source>
+ <translation>Đмпортировать WAV-файл</translation>
+ </message>
+ <message>
+ <source>UndoRedo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>undo</source>
+ <translation>отменить</translation>
+ </message>
+ <message>
+ <source>Und&amp;o</source>
+ <translation>&amp;Отменить</translation>
+ </message>
+ <message>
+ <source>redo</source>
+ <translation>повторить</translation>
+ </message>
+ <message>
+ <source>Re&amp;do</source>
+ <translation>&amp;Повторить</translation>
+ </message>
+ <message>
+ <source>undo last change to song</source>
+ <translation>отменить поŃледнее изменение композиции</translation>
+ </message>
+ <message>
+ <source>redo last undo</source>
+ <translation>повторить поŃледнюю отменŃ</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation>ĐźŃльт Ńправления</translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation>цикл</translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation>Цикл</translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation>Начало врезки</translation>
+ </message>
+ <message>
+ <source>Punchin</source>
+ <translation>Начало врезки</translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation>Конец врезки</translation>
+ </message>
+ <message>
+ <source>Punchout</source>
+ <translation>Конец врезки</translation>
+ </message>
+ <message>
+ <source>start</source>
+ <translation>Đş началŃ</translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation>Đš началŃ</translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation>перемотать назад</translation>
+ </message>
+ <message>
+ <source>Rewind</source>
+ <translation>Перемотать назад</translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation>перемотать вперёд</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>Перемотать вперёд</translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation>ĐľŃтановить</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>ĐžŃтановить</translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation>воŃпроизвеŃти</translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation>Đ’ĐľŃпроизвеŃти</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation>запиŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation>ЗапиŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>panic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation>новый</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Новый</translation>
+ </message>
+ <message>
+ <source>open</source>
+ <translation>открыть</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Открыть</translation>
+ </message>
+ <message>
+ <source>save</source>
+ <translation>Ńохранить</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Сохранить</translation>
+ </message>
+ <message>
+ <source>pianoroll</source>
+ <translation>pianoroll</translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation>Pianoroll</translation>
+ </message>
+ <message>
+ <source>Marker</source>
+ <translation>Маркер</translation>
+ </message>
+ <message>
+ <source>File Buttons</source>
+ <translation type="unfinished">Файловые кнопки</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Файл</translation>
+ </message>
+ <message>
+ <source>Open &amp;Recent</source>
+ <translation>Открыть из &amp;недавних</translation>
+ </message>
+ <message>
+ <source>Save &amp;As</source>
+ <translation>Сохранить &amp;как</translation>
+ </message>
+ <message>
+ <source>Import Midifile</source>
+ <translation>Đмпортировать MIDI-файл</translation>
+ </message>
+ <message>
+ <source>Export Midifile</source>
+ <translation>Đ­ĐşŃпортировать MIDI-файл</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>Вы&amp;йти</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Правка</translation>
+ </message>
+ <message>
+ <source>C&amp;ut</source>
+ <translation>&amp;Вырезать</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>С&amp;копировать</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>&amp;Đ’Ńтавить</translation>
+ </message>
+ <message>
+ <source>Add Track</source>
+ <translation>Добавить дорожкŃ</translation>
+ </message>
+ <message>
+ <source>Select &amp;All</source>
+ <translation>Выделить &amp;вŃŃ‘</translation>
+ </message>
+ <message>
+ <source>&amp;Deselect All</source>
+ <translation>&amp;Убрать выделение</translation>
+ </message>
+ <message>
+ <source>Invert &amp;Selection</source>
+ <translation>Обратить в&amp;ыделение</translation>
+ </message>
+ <message>
+ <source>&amp;Inside Loop</source>
+ <translation>&amp;Đ’Đ˝Ńтри цикла</translation>
+ </message>
+ <message>
+ <source>&amp;Outside Loop</source>
+ <translation>&amp;СнарŃжи цикла</translation>
+ </message>
+ <message>
+ <source>All &amp;Parts on Track</source>
+ <translation>Đ’Ńе &amp;чаŃти в дорожке</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>Выделить</translation>
+ </message>
+ <message>
+ <source>Drums</source>
+ <translation>Ударные</translation>
+ </message>
+ <message>
+ <source>List</source>
+ <translation>СпиŃок</translation>
+ </message>
+ <message>
+ <source>Graphic</source>
+ <translation>Графика</translation>
+ </message>
+ <message>
+ <source>Mastertrack</source>
+ <translation>МаŃтер-дорожка</translation>
+ </message>
+ <message>
+ <source>Midi &amp;Transform</source>
+ <translation>&amp;Преобразовать MIDI-Ńообщения</translation>
+ </message>
+ <message>
+ <source>Modify Gate Time</source>
+ <translation>Đзменить время звŃчания</translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation>Đзменить ŃкороŃŃ‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Crescendo</source>
+ <translation>Крещендо</translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation>ТранŃпонировать</translation>
+ </message>
+ <message>
+ <source>Thin Out</source>
+ <translation>Удалить Đ´Ńбли</translation>
+ </message>
+ <message>
+ <source>Erase Event</source>
+ <translation>Удалить Ńобытие</translation>
+ </message>
+ <message>
+ <source>Note Shift</source>
+ <translation>Сдвиг ноты</translation>
+ </message>
+ <message>
+ <source>Move Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy Measure</source>
+ <translation>Скопировать деление</translation>
+ </message>
+ <message>
+ <source>Erase Measure</source>
+ <translation>Стереть деление</translation>
+ </message>
+ <message>
+ <source>Delete Measure</source>
+ <translation>Удалить деление</translation>
+ </message>
+ <message>
+ <source>Create Measure</source>
+ <translation>Создать деление</translation>
+ </message>
+ <message>
+ <source>Mix Track</source>
+ <translation>СвеŃти дорожкŃ</translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation>MIDI</translation>
+ </message>
+ <message>
+ <source>&amp;Structure</source>
+ <translation>&amp;СтрŃктŃра</translation>
+ </message>
+ <message>
+ <source>Global Cut</source>
+ <translation>Глобальное вырезание</translation>
+ </message>
+ <message>
+ <source>Global Insert</source>
+ <translation>Глобальная вŃтавка</translation>
+ </message>
+ <message>
+ <source>Global Split</source>
+ <translation>Глобальное разделение</translation>
+ </message>
+ <message>
+ <source>Copy Range</source>
+ <translation>Скопировать облаŃŃ‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Cut Events</source>
+ <translation>Вырезать Ńобытия</translation>
+ </message>
+ <message>
+ <source>Transport Panel</source>
+ <translation>Панель ĐżŃльта Ńправления</translation>
+ </message>
+ <message>
+ <source>Bigtime window</source>
+ <translation>Окно хронометра</translation>
+ </message>
+ <message>
+ <source>dont follow Song</source>
+ <translation>не Ńледовать Đ·Đ° композицией</translation>
+ </message>
+ <message>
+ <source>follow page</source>
+ <translation>Ńледовать поŃтранично</translation>
+ </message>
+ <message>
+ <source>follow continuous</source>
+ <translation>Ńледовать плавно</translation>
+ </message>
+ <message>
+ <source>Global Settings</source>
+ <translation>Общие наŃтройки</translation>
+ </message>
+ <message>
+ <source>follow song</source>
+ <translation>Ńледовать Đ·Đ° композицией</translation>
+ </message>
+ <message>
+ <source>Metronome</source>
+ <translation type="obsolete">Метроном</translation>
+ </message>
+ <message>
+ <source>Midi Sync</source>
+ <translation>MIDI-Ńинхронизация</translation>
+ </message>
+ <message>
+ <source>Appearance settings</source>
+ <translation>НаŃтройки облика</translation>
+ </message>
+ <message>
+ <source>Midi Input Transform</source>
+ <translation type="obsolete">Преобразование входящих MIDI-Ńообщений</translation>
+ </message>
+ <message>
+ <source>Midi Input Filter</source>
+ <translation type="obsolete">Фильтр входящих MIDI-Ńобытий</translation>
+ </message>
+ <message>
+ <source>Midi Remote Control</source>
+ <translation>ДиŃтанционное Ńправление MIDI</translation>
+ </message>
+ <message>
+ <source>Random Rhythm Generator</source>
+ <translation type="obsolete">Генератор ŃĐ»Ńчайного ритма</translation>
+ </message>
+ <message>
+ <source>&amp;Midi</source>
+ <translation>&amp;MIDI</translation>
+ </message>
+ <message>
+ <source>Mixer</source>
+ <translation type="obsolete">МикŃер</translation>
+ </message>
+ <message>
+ <source>Input Plugins</source>
+ <translation>МодŃли на входе</translation>
+ </message>
+ <message>
+ <source>Reset Instr.</source>
+ <translation>ПерегрŃзить инŃŃ‚Ń€Ńменты</translation>
+ </message>
+ <message>
+ <source>Init Instr.</source>
+ <translation>Đ—Đ°ĐżŃŃтить инŃŃ‚Ń€Ńменты</translation>
+ </message>
+ <message>
+ <source>local off</source>
+ <translation>откл. локальное Ńправление</translation>
+ </message>
+ <message>
+ <source>&amp;Audio</source>
+ <translation>&amp;ЗвŃĐş</translation>
+ </message>
+ <message>
+ <source>Bounce to Track</source>
+ <translation>СвеŃти в дорожкŃ</translation>
+ </message>
+ <message>
+ <source>Bounce to File</source>
+ <translation>СвеŃти в файл</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Помощь</translation>
+ </message>
+ <message>
+ <source>About&amp;Qt</source>
+ <translation>Đž &amp;Qt</translation>
+ </message>
+ <message>
+ <source>Unknown File Format</source>
+ <translation>НеизвеŃтный формат файла</translation>
+ </message>
+ <message>
+ <source>MusE: load project</source>
+ <translation>MusE: Открыть проект</translation>
+ </message>
+ <message>
+ <source>MusE: Write File failed</source>
+ <translation>MusE: Попытка запиŃĐ°Ń‚ŃŚ файл провалилаŃŃŚ</translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Save Current Project?</source>
+ <translation>ТекŃщий проект Ńодержит не Ńохранённые данные.
+Сохранить текŃщий проект?</translation>
+ </message>
+ <message>
+ <source>&amp;Nosave</source>
+ <translation>&amp;Не Ńохранять</translation>
+ </message>
+ <message>
+ <source>&amp;Abort</source>
+ <translation>&amp;Прервать</translation>
+ </message>
+ <message>
+ <source>MusE: Save As</source>
+ <translation>MusE: Сохранить как</translation>
+ </message>
+ <message>
+ <source>MusE: Song: </source>
+ <translation>MusE: ПеŃня:</translation>
+ </message>
+ <message>
+ <source>MusE: Import Midi</source>
+ <translation>MusE: Đмпортировать MIDI</translation>
+ </message>
+ <message>
+ <source>MusE: Export Midi</source>
+ <translation>MusE: Đ­ĐşŃпортировать MIDI</translation>
+ </message>
+ <message>
+ <source>reading midifile
+ </source>
+ <translation>читаетŃŃŹ MIDI-файл
+ </translation>
+ </message>
+ <message>
+ <source>Nothing to edit</source>
+ <translation>Нечего редактировать</translation>
+ </message>
+ <message>
+ <source>MusE: Copy Range</source>
+ <translation>MusE: Скопировать облаŃŃ‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>not implemented</source>
+ <translation>не реализовано</translation>
+ </message>
+ <message>
+ <source>MusE: Cut Events</source>
+ <translation>MusE: Вырезать Ńобытия</translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to Track</source>
+ <translation>MusE: Сведение в дорожкŃ</translation>
+ </message>
+ <message>
+ <source>more than one target track selected</source>
+ <translation>выбрано больŃе одной конечной дорожки</translation>
+ </message>
+ <message>
+ <source>wrong target track type,
+select wave track as target</source>
+ <translation>это неправильный тип конечной дорожки,
+выберите звŃковŃŃŽ дорожкŃ</translation>
+ </message>
+ <message>
+ <source>no target track selected</source>
+ <translation>конечная дорожка не выбрана</translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Load overwrites current Project:
+Save Current Project?</source>
+ <translation>ТекŃщий проект Ńодержит не Ńохранённые данные.
+ЗагрŃзка нового проекта приведёт Đş перезапиŃи данных этого.
+Сохранить текŃщий проект?</translation>
+ </message>
+ <message>
+ <source>&amp;Overwrite</source>
+ <translation>Пере&amp;запиŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>no help found at: </source>
+ <translation>Ńправка не найдена в:</translation>
+ </message>
+ <message>
+ <source>MusE: Open Help</source>
+ <translation>MusE: Открыть ŃправкŃ</translation>
+ </message>
+ <message>
+ <source>Midi Ports / Soft Synth</source>
+ <translation type="obsolete">MIDI-порты / Прогр. Ńинтезаторы</translation>
+ </message>
+ <message>
+ <source>Delete Selected Tracks</source>
+ <translation>Выбранные дорожки Ńдалены</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation type="obsolete">Вид</translation>
+ </message>
+ <message>
+ <source>Edit Instrument</source>
+ <translation>Đзменить инŃŃ‚Ń€Ńмент</translation>
+ </message>
+ <message>
+ <source>Restart Audio</source>
+ <translation type="obsolete">ПерезапŃŃтить звŃковой движок</translation>
+ </message>
+ <message>
+ <source>Take Snapshot</source>
+ <translation type="obsolete">Сделать Ńнимок</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="obsolete">НаŃтройки</translation>
+ </message>
+ <message>
+ <source>Configure shortcuts</source>
+ <translation>НаŃтроить горячие клавиŃи</translation>
+ </message>
+ <message>
+ <source>Midi File Export</source>
+ <translation>Đ­ĐşŃпорт в MIDI-файл</translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation>&amp;Đ ŃководŃтво</translation>
+ </message>
+ <message>
+ <source>&amp;MusE homepage</source>
+ <translation>ДомаŃняя &amp;Ńтраница MusE</translation>
+ </message>
+ <message>
+ <source>&amp;Report Bug...</source>
+ <translation>Сообщить Đľ&amp;б ĐľŃибке...</translation>
+ </message>
+ <message>
+ <source>&amp;About MusE</source>
+ <translation>&amp;Đž MusE</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation>&amp;Что это?</translation>
+ </message>
+ <message>
+ <source>Cannot read template</source>
+ <translation>Невозможно прочитать Ńаблон</translation>
+ </message>
+ <message>
+ <source>File open error</source>
+ <translation>ĐžŃибка при открытии файла</translation>
+ </message>
+ <message>
+ <source>File read error</source>
+ <translation>ĐžŃибка при чтении файла</translation>
+ </message>
+ <message>
+ <source>MusE: load template</source>
+ <translation>MusE: ЗагрŃзка Ńаблона</translation>
+ </message>
+ <message>
+ <source>MusE: Bounce</source>
+ <translation>MusE: Сведение</translation>
+ </message>
+ <message>
+ <source>set left/right marker for bounce range</source>
+ <translation>ŃŃтановите левый и правый маркеры для Ńказания облаŃти Ńведения</translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to File</source>
+ <translation>MusE: Сведение в файл</translation>
+ </message>
+ <message>
+ <source>no output track found</source>
+ <translation>не найдено ни одной дорожки выхода</translation>
+ </message>
+ <message>
+ <source>Add midi file to current project?
+</source>
+ <translation>Добавить MIDI-файл в текŃщий проект?
+</translation>
+ </message>
+ <message>
+ <source>&amp;Add to Project</source>
+ <translation>&amp;Добавить в проект</translation>
+ </message>
+ <message>
+ <source>&amp;Replace</source>
+ <translation>&amp;Заменить</translation>
+ </message>
+ <message>
+ <source>
+failed: </source>
+ <translation>
+не ŃдалоŃŃŚ:</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation>Компоновщик</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation>ĐšŃŃ€Ńор</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation>Выкл</translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation>Такт</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation>Привязка</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation>Длн</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Тип</translation>
+ </message>
+ <message>
+ <source>NO</source>
+ <translation type="obsolete">НЕТ</translation>
+ </message>
+ <message>
+ <source>GM</source>
+ <translation type="obsolete">GM</translation>
+ </message>
+ <message>
+ <source>GS</source>
+ <translation type="obsolete">GS</translation>
+ </message>
+ <message>
+ <source>XG</source>
+ <translation type="obsolete">XG</translation>
+ </message>
+ <message>
+ <source>midi song type</source>
+ <translation type="obsolete">тип MIDI-композиции</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation>Đ’Ń‹Ńота тона</translation>
+ </message>
+ <message>
+ <source>midi pitch</source>
+ <translation>midi выŃота тона</translation>
+ </message>
+ <message>
+ <source>global midi pitch shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tempo</source>
+ <translation>Темп</translation>
+ </message>
+ <message>
+ <source>midi tempo</source>
+ <translation>MIDI-темп</translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MusE: Create tmp file failed</source>
+ <translation>MusE: Попытка Ńоздать временный файл провалилаŃŃŚ</translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Setti&amp;ngs</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>OrganGuiBase</name>
+ <message>
+ <source>MusE: Organ</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawbars</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>16&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>4&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2 2/3&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>5 1/3&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>8&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Hi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>cB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Lo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>O-1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Oscillator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Brass</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Flute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Сила нажатия</translation>
+ </message>
+</context>
+<context>
+ <name>PatchBayBase</name>
+ <message>
+ <source>ALSA Patch Bay</source>
+ <translation>ALSA Patch Bay</translation>
+ </message>
+</context>
+<context>
+ <name>PluginDialog</name>
+ <message>
+ <source>MusE: select plugin</source>
+ <translation>MusE: выбрать модŃль</translation>
+ </message>
+ <message>
+ <source>Lib</source>
+ <translation>Библ.</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation>Метка</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>ĐĐĽŃŹ</translation>
+ </message>
+ <message>
+ <source>AI</source>
+ <translation>AI</translation>
+ </message>
+ <message>
+ <source>AO</source>
+ <translation>AO</translation>
+ </message>
+ <message>
+ <source>CI</source>
+ <translation>CI</translation>
+ </message>
+ <message>
+ <source>CO</source>
+ <translation>CP</translation>
+ </message>
+ <message>
+ <source>IP</source>
+ <translation>IP</translation>
+ </message>
+ <message>
+ <source>id</source>
+ <translation>id</translation>
+ </message>
+ <message>
+ <source>Maker</source>
+ <translation>Создатель</translation>
+ </message>
+ <message>
+ <source>Copyright</source>
+ <translation>ĐвторŃкое право</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отменить</translation>
+ </message>
+ <message>
+ <source>Select which types of plugins should be visible in the list,&lt;br&gt;beware that &apos;all&apos; includes plugins that probably are not usable by MusE.</source>
+ <translation type="obsolete">Выберите ти модŃлей, которые бŃĐ´ŃŃ‚ видны в ŃпиŃке,&lt;br&gt;помните, что &quot;вŃе&quot; включит в ŃпиŃок модŃли, которые &lt;br&gt;
+могŃŃ‚ быть непригодны для MusE.</translation>
+ </message>
+ <message>
+ <source>Stereo and Mono</source>
+ <translation>Стерео и моно</translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation>Стерео</translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation>Моно</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation>Đ’Ńе</translation>
+ </message>
+ <message>
+ <source>Select which types of plugins should be visible in the list.&lt;br&gt;Note that using mono plugins on stereo tracks is not a problem, two will be used in parallell.&lt;br&gt;Also beware that the &apos;all&apos; alternative includes plugins that probably not are usable by MusE.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginGui</name>
+ <message>
+ <source>File Buttons</source>
+ <translation>Файловые кнопки</translation>
+ </message>
+ <message>
+ <source>Load Preset</source>
+ <translation>ЗагрŃзить предŃŃтановкŃ</translation>
+ </message>
+ <message>
+ <source>Save Preset</source>
+ <translation>Сохранить предŃŃтановкŃ</translation>
+ </message>
+ <message>
+ <source>bypass plugin</source>
+ <translation>обойти модŃль</translation>
+ </message>
+ <message>
+ <source>MusE: load preset</source>
+ <translation>MusE: загрŃзить предŃŃтановкŃ</translation>
+ </message>
+ <message>
+ <source>MusE: save preset</source>
+ <translation>MusE: Ńохранить предŃŃтановкŃ</translation>
+ </message>
+</context>
+<context>
+ <name>QHeader</name>
+ <message>
+ <source>Port Number</source>
+ <translation type="obsolete">Номер порта</translation>
+ </message>
+ <message>
+ <source>enable gui for device</source>
+ <translation type="obsolete">разреŃить GUI для ŃŃтройŃтва</translation>
+ </message>
+ <message>
+ <source>Name of the midi device associated with this port number</source>
+ <translation type="obsolete">ĐĐĽŃŹ MIDI-ŃŃтройŃтва, Đ°ŃŃоциированного Ń Đ˝ĐľĐĽĐµŃ€ĐľĐĽ этого порта </translation>
+ </message>
+ <message>
+ <source>Instrument connected to port</source>
+ <translation type="obsolete">ĐĐ˝ŃŃ‚Ń€Ńмент, подŃоединённый Đş ŃŤŃ‚ĐľĐĽŃ ĐżĐľŃ€Ń‚Ń</translation>
+ </message>
+ <message>
+ <source>State: result of opening the device</source>
+ <translation type="obsolete">СоŃтояние: резŃльтат открытия ŃŃтройŃтва</translation>
+ </message>
+ <message>
+ <source>enables reading from device</source>
+ <translation type="obsolete">разреŃает чтение Ń ŃŃтройŃтва</translation>
+ </message>
+ <message>
+ <source>enables writing to device</source>
+ <translation type="obsolete">разреŃает запиŃŃŚ на ŃŃтройŃтво</translation>
+ </message>
+</context>
+<context>
+ <name>QPopupMenu</name>
+ <message>
+ <source>Add Soft Synth</source>
+ <translation type="obsolete">Добавить программный Ńинтезатор</translation>
+ </message>
+ <message>
+ <source>Add Midi Generator...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Soft Synth...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QWidget</name>
+ <message>
+ <source>new</source>
+ <translation>новый</translation>
+ </message>
+ <message>
+ <source>File
+</source>
+ <translation>Файл</translation>
+ </message>
+ <message>
+ <source>
+exists</source>
+ <translation>(new line)
+ŃŃщеŃтвŃет</translation>
+ </message>
+ <message>
+ <source>MusE: write</source>
+ <translation>MusE: запиŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Overwrite</source>
+ <translation>ПерезапиŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Выйти</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ничего</translation>
+ </message>
+</context>
+<context>
+ <name>RhythmBase</name>
+ <message>
+ <source>MusE: Random Rhythm Generator</source>
+ <translation type="obsolete">MusE: Генератор ŃĐ»Ńчайного ритма</translation>
+ </message>
+ <message>
+ <source>Instrument Properties</source>
+ <translation type="obsolete">СвойŃтва инŃŃ‚Ń€Ńмента</translation>
+ </message>
+ <message>
+ <source>test</source>
+ <translation type="obsolete">теŃŃ‚</translation>
+ </message>
+ <message>
+ <source>contrib</source>
+ <translation type="obsolete">внеŃти</translation>
+ </message>
+ <message>
+ <source>randomize</source>
+ <translation type="obsolete">перемеŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Group 1</source>
+ <translation type="obsolete">Đ“Ń€Ńппа C</translation>
+ </message>
+ <message>
+ <source>Group 2</source>
+ <translation type="obsolete">Đ“Ń€Ńппа 2</translation>
+ </message>
+ <message>
+ <source>Group 3</source>
+ <translation type="obsolete">Đ“Ń€Ńппа 3</translation>
+ </message>
+ <message>
+ <source>Group 4</source>
+ <translation type="obsolete">Đ“Ń€Ńппа 4</translation>
+ </message>
+ <message>
+ <source>Group 5</source>
+ <translation type="obsolete">Đ“Ń€Ńппа 5</translation>
+ </message>
+ <message>
+ <source>listen</source>
+ <translation type="obsolete">проŃĐ»ŃŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">ĐĐ˝ŃŃ‚Ń€Ńмент</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation type="obsolete">Đ“Ń€Ńппа</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Новый</translation>
+ </message>
+ <message>
+ <source>create new entry</source>
+ <translation type="obsolete">Ńоздать новŃŃŽ запиŃŃŚ</translation>
+ </message>
+ <message>
+ <source>pressing the New button you create a new entry
+in the MusE list of defined controllers</source>
+ <translation type="obsolete">По нажатию кнопки &quot;Новая&quot; ŃоздаётŃŃŹ новая
+запиŃŃŚ в ŃпиŃок назначенных в MusE контроллеров</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">У&amp;далить</translation>
+ </message>
+ <message>
+ <source>delete selected entry</source>
+ <translation type="obsolete">Ńдалить выделенное Ńобытие</translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation type="obsolete">Вверх</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation type="obsolete">Вниз</translation>
+ </message>
+ <message>
+ <source>Instrument </source>
+ <translation type="obsolete">ĐĐ˝ŃŃ‚Ń€Ńмент</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="obsolete">ŃпиŃок назначенных контроллеров</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="obsolete">Đ­Ń‚Đľ ŃпиŃок назначенных контроллеров для MusE</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Файл</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Правка</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="obsolete">П&amp;омощь</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation type="obsolete">СервиŃ</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="obsolete">Новый</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="obsolete">Открыть</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="obsolete">&amp;Открыть...</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Сохранить</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="obsolete">&amp;Сохранить</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="obsolete">Сохранить как</translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="obsolete">Сохранить &amp;как...</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="obsolete">Напечатать</translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation type="obsolete">&amp;Печать...</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="obsolete">Выйти</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="obsolete">В&amp;ыйти</translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="obsolete">Отменить</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="obsolete">&amp;Отменить</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="obsolete">Повторить</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="obsolete">П&amp;овторить</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Вырезать</translation>
+ </message>
+ <message>
+ <source>&amp;Cut</source>
+ <translation type="obsolete">&amp;Вырезать</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Скопировать</translation>
+ </message>
+ <message>
+ <source>C&amp;opy</source>
+ <translation type="obsolete">С&amp;копировать</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Đ’Ńтавить</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="obsolete">&amp;Đ’Ńтавить</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation type="obsolete">Найти</translation>
+ </message>
+ <message>
+ <source>&amp;Find...</source>
+ <translation type="obsolete">&amp;Найти...</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation type="obsolete">Содержание</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation type="obsolete">&amp;Содержание...</translation>
+ </message>
+ <message>
+ <source>Index</source>
+ <translation type="obsolete">ĐндекŃ</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation type="obsolete">&amp;ĐндекŃ...</translation>
+ </message>
+ <message>
+ <source>About</source>
+ <translation type="obsolete">О программе</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation type="obsolete">&amp;О программе...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Notice!&lt;/b&gt;&lt;br&gt;
+Random Rhythm Generator is not enabled yet!</source>
+ <translation type="obsolete">&lt;b&gt;Внимание!&lt;/b&gt;&lt;br&gt;
+СлŃчайный генератор ритма пока ещё не работает!</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="obsolete">Ctrl+N</translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation type="obsolete">Ctrl+O</translation>
+ </message>
+ <message>
+ <source>Ctrl+S</source>
+ <translation type="obsolete">Ctrl+S</translation>
+ </message>
+ <message>
+ <source>Ctrl+P</source>
+ <translation type="obsolete">Ctrl+P</translation>
+ </message>
+ <message>
+ <source>Ctrl+Z</source>
+ <translation type="obsolete">Ctrl+Z</translation>
+ </message>
+ <message>
+ <source>Ctrl+Y</source>
+ <translation type="obsolete">Ctrl+Y</translation>
+ </message>
+ <message>
+ <source>Ctrl+X</source>
+ <translation type="obsolete">Ctrl+X</translation>
+ </message>
+ <message>
+ <source>Ctrl+C</source>
+ <translation type="obsolete">Ctrl+C</translation>
+ </message>
+ <message>
+ <source>Ctrl+V</source>
+ <translation type="obsolete">Ctrl+V</translation>
+ </message>
+ <message>
+ <source>Ctrl+F</source>
+ <translation type="obsolete">Ctrl+F</translation>
+ </message>
+</context>
+<context>
+ <name>RouteDialogBase</name>
+ <message>
+ <source>MusE: Routing</source>
+ <translation>MusE: МарŃŃ€ŃŃ‚Ń‹</translation>
+ </message>
+ <message>
+ <source>Add Route</source>
+ <translation>Добавить ĐĽĐ°Ń€ŃŃ€ŃŃ‚</translation>
+ </message>
+ <message>
+ <source>Source:</source>
+ <translation>ĐŃточник:</translation>
+ </message>
+ <message>
+ <source>Destination:</source>
+ <translation>Назначение:</translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation>Соединить</translation>
+ </message>
+ <message>
+ <source>connect source to destination</source>
+ <translation>Ńоединить иŃточник Ń ĐĽĐµŃтом назначения</translation>
+ </message>
+ <message>
+ <source>Current Routes</source>
+ <translation>ТекŃщие ĐĽĐ°Ń€ŃŃ€ŃŃ‚Ń‹</translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation>ĐŃточник</translation>
+ </message>
+ <message>
+ <source>Destination</source>
+ <translation>Назначение</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>remove selected route</source>
+ <translation>Ńдалить текŃщий ĐĽĐ°Ń€ŃŃ€ŃŃ‚</translation>
+ </message>
+</context>
+<context>
+ <name>SS_PluginChooserBase</name>
+ <message>
+ <source>SimpleDrums - Ladspa Plugin Chooser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">ĐĐĽŃŹ</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Метка</translation>
+ </message>
+ <message>
+ <source>Inports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Creator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">О&amp;тменить</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutCaptureDialogBase</name>
+ <message>
+ <source>Enter shortcut sequence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Press keys to enter shortcut sequence!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Old shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undefined</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">ОК</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Отменить</translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfig</name>
+ <message>
+ <source>Global</source>
+ <translation type="unfinished">Глобально</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation type="unfinished">Компоновщик</translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation type="unfinished">Pianoroll</translation>
+ </message>
+ <message>
+ <source>Drumeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List Mastertrack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All categories</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Start playback from current location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle metronome</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Stop Playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Play, Stop, Rewind</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Goto left marker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Goto right marker</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Loop section</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Paste,</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: New project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Open from disk</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Save project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Open recent file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Save as</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Load template</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Import midi file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Export midi file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Import audio file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File: Quit MusE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select parts on track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open pianoroll</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open drumeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open listeditor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open graphical mastertrack editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open list mastertrack editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open midi transformer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add midi track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add drum track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add wave track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio group</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio input</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add audio aux</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global insert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Global split</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Copy range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Structure: Cut events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Open mixer window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Toggle transport window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Toggle bigtime window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View: Open marker window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song by page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Follow song continuous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Global configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Configure shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Configure metronome</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi sync configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi file export configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Appearance settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Midi ports / Soft Synth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings: Audio subsystem configuration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Edit midi instruments</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input transform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi input transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi remote control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Random rhythm generator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Reset midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Init midi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Midi local off</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to track</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio: Restart audio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Mixer automation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Take mixer snapshot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automation: Clear mixer automation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help: Open Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help: Toggle whatsthis mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Edit selected part</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track above</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track above</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track below</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track below</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi: Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select none</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Invert selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts inside locators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts outside locators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part/event to the left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the left to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the right to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Set locators to selection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Increase pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Decrease pitch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Set fixed length on midi events</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Over Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Note On Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Note On/Off Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Iterative Quantize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Configure quant</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Gate Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Crescendo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Thin Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Erase Event</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Note Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Move Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Copy Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Erase Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Delete Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Create Measure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Change event color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Pointer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Pencil</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Eraser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Line Draw</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Scissor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Glue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tool: Mute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Increase current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport: Decrease current position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/1 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/2 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/4 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/8 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/16 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/32 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/64 note</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle triol quantization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization (2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Insert at location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation type="unfinished">Đ’Ńтавить нотŃ</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="unfinished">Đ’Ńтавить SysEx</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="unfinished">Đ’Ńтавить контроллер</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="unfinished">Đ’Ńтавить Meta</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="unfinished">Đ’Ńтавить Channel Aftertouch</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="unfinished">Đ’Ńтавить Key Aftertouch</translation>
+ </message>
+ <message>
+ <source>Edit: Increase event position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit: Decrease event position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Tempo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert Signature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Change Event Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Event Value</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfigBase</name>
+ <message>
+ <source>Configure Keyboard Shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Define</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished">Alt+D</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished">&amp;Применить</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished">Alt+A</translation>
+ </message>
+</context>
+<context>
+ <name>SimpleDrumsGuiBase</name>
+ <message>
+ <source>DrumSynth 0.1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TempoSig</name>
+ <message>
+ <source>Tempo/Sig</source>
+ <translation>Темп/Знаки альтерации</translation>
+ </message>
+</context>
+<context>
+ <name>Transport</name>
+ <message>
+ <source>Overdub</source>
+ <translation>Наложить</translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation>Заменить</translation>
+ </message>
+ <message>
+ <source>Rec Mode</source>
+ <translation>Режим запиŃи</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation>Норм.</translation>
+ </message>
+ <message>
+ <source>Mix</source>
+ <translation>СмеŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>Cycle Rec</source>
+ <translation>Циклич. запиŃŃŚ</translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation>нач. врезки</translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation>цикл</translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation>кнц. врезки</translation>
+ </message>
+ <message>
+ <source>Punch In</source>
+ <translation>Начало врезки</translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation>Цикл</translation>
+ </message>
+ <message>
+ <source>Punch Out</source>
+ <translation>Конец врезки</translation>
+ </message>
+ <message>
+ <source>Left Mark</source>
+ <translation>Левый маркер</translation>
+ </message>
+ <message>
+ <source>Right Mark</source>
+ <translation>Правый маркер</translation>
+ </message>
+ <message>
+ <source>rewind to start</source>
+ <translation>перемотать Đş началŃ</translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation>перемотать назад</translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation>перемотать вперёд</translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation>ĐľŃтановить</translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation>воŃпроизвеŃти</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation>запиŃĐ°Ń‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>AC</source>
+ <translation>AC</translation>
+ </message>
+ <message>
+ <source>quantize during record</source>
+ <translation>квантовать при запиŃи</translation>
+ </message>
+ <message>
+ <source>Click</source>
+ <translation>Метр.</translation>
+ </message>
+ <message>
+ <source>metronom click on/off</source>
+ <translation>Щелчки метронома</translation>
+ </message>
+ <message>
+ <source>Sync</source>
+ <translation>Синхр.</translation>
+ </message>
+ <message>
+ <source>external sync on/off</source>
+ <translation>Вкл/выкл внеŃнюю Ńинхронизацию</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation>МаŃтер</translation>
+ </message>
+ <message>
+ <source>use master track</source>
+ <translation>иŃпользовать ĐĽĐ°Ńтер-дорожкŃ</translation>
+ </message>
+</context>
+<context>
+ <name>TransposeDialogBase</name>
+ <message>
+ <source>MusE: Midi Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished">Значение</translation>
+ </message>
+ <message>
+ <source>halftones</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>between markers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation type="unfinished">ЧаŃти</translation>
+ </message>
+ <message>
+ <source>all in selected tracks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">ОК</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Отменить</translation>
+ </message>
+</context>
+<context>
+ <name>VelocityBase</name>
+ <message>
+ <source>MusE: Modify Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">ОблаŃŃ‚ŃŚ</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation type="unfinished">Đ’Ńе Ńобытия</translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation type="unfinished">Выбранные Ńобытия</translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation type="unfinished">События в цикле</translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation type="unfinished">Выбранные и в цикле</translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation type="unfinished">Значения</translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation type="unfinished">ЧаŃтота:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished">Смещение:</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished">%</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">ОК</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Отменить</translation>
+ </message>
+</context>
+<context>
+ <name>WaveTrackInfoBase</name>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">выкл</translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay (Frames)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/muse/share/locale/muse_sv_SE.qm b/muse/share/locale/muse_sv_SE.qm
new file mode 100644
index 00000000..d6f75f97
--- /dev/null
+++ b/muse/share/locale/muse_sv_SE.qm
Binary files differ
diff --git a/muse/share/locale/muse_sv_SE.ts b/muse/share/locale/muse_sv_SE.ts
new file mode 100644
index 00000000..6928147e
--- /dev/null
+++ b/muse/share/locale/muse_sv_SE.ts
@@ -0,0 +1,8484 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name></name>
+ <message>
+ <source>Click this button to enable recording</source>
+ <translation type="obsolete">Klicka här för att spela in</translation>
+ </message>
+ <message>
+ <source>sets amount of quantization:
+0 - no quantization
+100 - full quantization</source>
+ <translation type="obsolete">Sätter mängden kvantisering:
+0 - ingen kvantisering
+100 - full kvantisering</translation>
+ </message>
+ <message>
+ <source>select Pointer Tool:
+with the pointer tool you can:
+ select parts
+ move parts
+ copy parts</source>
+ <translation type="obsolete">välj pek-verktyg:
+med pekverktyget kan du:
+ välja parter
+ flytta parter
+ kopiera parter</translation>
+ </message>
+ <message>
+ <source>Transport: Start playback from current location</source>
+ <translation type="obsolete">Transport: Starta uppspelning frĂĄn nuvarande position</translation>
+ </message>
+ <message>
+ <source>Transport: Toggle metronome</source>
+ <translation type="obsolete">Transport: Metronom av/pĂĄ</translation>
+ </message>
+ <message>
+ <source>Transport: Stop Playback</source>
+ <translation type="obsolete">Transport: Stoppa uppspelning</translation>
+ </message>
+ <message>
+ <source>Transport: Play, Stop, Rewind</source>
+ <translation type="obsolete">Transport: Spela, stoppa, spola tillbaka</translation>
+ </message>
+ <message>
+ <source>Transport: Goto left marker</source>
+ <translation type="obsolete">Transport: Gå till vänster markering</translation>
+ </message>
+ <message>
+ <source>Transport: Goto right marker</source>
+ <translation type="obsolete">Transport: Gå till höger markering</translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Loop section</source>
+ <translation type="obsolete">Transport: Loopa sektion av/pĂĄ</translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Record</source>
+ <translation type="obsolete">Transport: Inspelning av/pĂĄ</translation>
+ </message>
+ <message>
+ <source>Edit: Copy</source>
+ <translation type="obsolete">Redigera: Kopiera</translation>
+ </message>
+ <message>
+ <source>Edit: Undo</source>
+ <translation type="obsolete">Redigera: Ă…ngra</translation>
+ </message>
+ <message>
+ <source>Edit: Redo</source>
+ <translation type="obsolete">Redigera: Gör om</translation>
+ </message>
+ <message>
+ <source>Edit: Cut</source>
+ <translation type="obsolete">Redigera: Klipp ut</translation>
+ </message>
+ <message>
+ <source>Edit: Paste,</source>
+ <translation type="obsolete">Redigera: Klistra in</translation>
+ </message>
+ <message>
+ <source>Edit: Delete</source>
+ <translation type="obsolete">Redigera: Ta bort</translation>
+ </message>
+ <message>
+ <source>File: New project</source>
+ <translation type="obsolete">Arkiv: Nytt projekt</translation>
+ </message>
+ <message>
+ <source>File: Open from disk</source>
+ <translation type="obsolete">Arkiv: Ă–ppna</translation>
+ </message>
+ <message>
+ <source>File: Save project</source>
+ <translation type="obsolete">Arkiv: Spara</translation>
+ </message>
+ <message>
+ <source>File: Open recent file</source>
+ <translation type="obsolete">Arkiv: Öppna föregående fil</translation>
+ </message>
+ <message>
+ <source>File: Save as</source>
+ <translation type="obsolete">Arkiv: Spara som</translation>
+ </message>
+ <message>
+ <source>File: Load template</source>
+ <translation type="obsolete">Arkiv: Ladda mall</translation>
+ </message>
+ <message>
+ <source>File: Import midi file</source>
+ <translation type="obsolete">Arkiv: Importera midifil</translation>
+ </message>
+ <message>
+ <source>File: Export midi file</source>
+ <translation type="obsolete">Arkiv: Exportera midifil</translation>
+ </message>
+ <message>
+ <source>File: Import audio file</source>
+ <translation type="obsolete">Arkiv: Importera ljudfil</translation>
+ </message>
+ <message>
+ <source>File: Quit MusE</source>
+ <translation type="obsolete">Arkiv: Avsluta</translation>
+ </message>
+ <message>
+ <source>Edit: Select parts on track</source>
+ <translation type="obsolete">Arkiv: Välj alla parter i spår</translation>
+ </message>
+ <message>
+ <source>Open pianoroll</source>
+ <translation type="obsolete">Ă–ppna pianorulle</translation>
+ </message>
+ <message>
+ <source>Open drumeditor</source>
+ <translation type="obsolete">Ă–ppna trumeditor</translation>
+ </message>
+ <message>
+ <source>Open listeditor</source>
+ <translation type="obsolete">Ă–ppna listeditor</translation>
+ </message>
+ <message>
+ <source>Open graphical mastertrack editor</source>
+ <translation type="obsolete">Ă–ppna masterspĂĄr-editor (grafisk)</translation>
+ </message>
+ <message>
+ <source>Open list mastertrack editor</source>
+ <translation type="obsolete">Ă–ppna masterspĂĄr-editor (lista)</translation>
+ </message>
+ <message>
+ <source>Open midi transformer</source>
+ <translation type="obsolete">Ă–ppna miditransformer</translation>
+ </message>
+ <message>
+ <source>Add midi track</source>
+ <translation type="obsolete">Lägg till midispår</translation>
+ </message>
+ <message>
+ <source>Add drum track</source>
+ <translation type="obsolete">Lägg till trumspår</translation>
+ </message>
+ <message>
+ <source>Add wave track</source>
+ <translation type="obsolete">Lägg till ljudspår</translation>
+ </message>
+ <message>
+ <source>Add audio output</source>
+ <translation type="obsolete">Lägg till ljudutgång</translation>
+ </message>
+ <message>
+ <source>Add audio group</source>
+ <translation type="obsolete">Lägg till ljudgrupp</translation>
+ </message>
+ <message>
+ <source>Add audio input</source>
+ <translation type="obsolete">Lägg till ljudingång</translation>
+ </message>
+ <message>
+ <source>Add audio aux</source>
+ <translation type="obsolete">Lägg till aux</translation>
+ </message>
+ <message>
+ <source>Structure: Global cut</source>
+ <translation type="obsolete">Struktur: Globalt klipp</translation>
+ </message>
+ <message>
+ <source>Structure: Global insert</source>
+ <translation type="obsolete">Struktur: Global insättning</translation>
+ </message>
+ <message>
+ <source>Structure: Global split</source>
+ <translation type="obsolete">Struktur: Global delning</translation>
+ </message>
+ <message>
+ <source>Structure: Copy range</source>
+ <translation type="obsolete">Struktur: Kopiera omrĂĄde</translation>
+ </message>
+ <message>
+ <source>Structure: Cut events</source>
+ <translation type="obsolete">Struktur: Klipp ut händelse</translation>
+ </message>
+ <message>
+ <source>View: Open mixer window</source>
+ <translation type="obsolete">Vy: Öppna mixerfönster</translation>
+ </message>
+ <message>
+ <source>View: Toggle transport window</source>
+ <translation type="obsolete">Vy: Transportfönster av/på</translation>
+ </message>
+ <message>
+ <source>View: Toggle bigtime window</source>
+ <translation type="obsolete">Vy: Bigtimefönster av/på</translation>
+ </message>
+ <message>
+ <source>View: Open marker window</source>
+ <translation type="obsolete">Vy: Öppna markörfönster</translation>
+ </message>
+ <message>
+ <source>Settings: Follow song by page</source>
+ <translation type="obsolete">Inställningar: Följ sång efter sida</translation>
+ </message>
+ <message>
+ <source>Settings: Follow song off</source>
+ <translation type="obsolete">Inställningar: Följ sång av</translation>
+ </message>
+ <message>
+ <source>Settings: Follow song continuous</source>
+ <translation type="obsolete">Inställningar: Följ sång kontinuerligt</translation>
+ </message>
+ <message>
+ <source>Settings: Global configuration</source>
+ <translation type="obsolete">Inställningar: Globala inställningar</translation>
+ </message>
+ <message>
+ <source>Settings: Configure shortcuts</source>
+ <translation type="obsolete">Inställningar: Konfigurera tangentbordsgenvängar</translation>
+ </message>
+ <message>
+ <source>Settings: Configure metronome</source>
+ <translation type="obsolete">Inställningar: Konfigurera metronom</translation>
+ </message>
+ <message>
+ <source>Settings: Midi sync configuration</source>
+ <translation type="obsolete">Inställningar: Midi synk konfigurationg</translation>
+ </message>
+ <message>
+ <source>Settings: Midi file export configuration</source>
+ <translation type="obsolete">Inställningar: Midi fil export-konfiguration</translation>
+ </message>
+ <message>
+ <source>Settings: Appearance settings</source>
+ <translation type="obsolete">Inställningar: Utseendeinställningar</translation>
+ </message>
+ <message>
+ <source>Settings: Midi ports / Soft Synth</source>
+ <translation type="obsolete">Inställningar: Midiportar / Mjukvarusynthar</translation>
+ </message>
+ <message>
+ <source>Settings: Audio subsystem configuration</source>
+ <translation type="obsolete">Inställningar: Konfiguration av ljud-undersystem</translation>
+ </message>
+ <message>
+ <source>Midi: Edit midi instruments</source>
+ <translation type="obsolete">Midi: Editera midi-instrument</translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input transform</source>
+ <translation type="obsolete">Midi: Ă–ppna midi inputtransformator</translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input filter</source>
+ <translation type="obsolete">Midi: Ă–ppna midi indatafilter</translation>
+ </message>
+ <message>
+ <source>Midi: Midi input transpose</source>
+ <translation type="obsolete">Midi: Midi indata transponering</translation>
+ </message>
+ <message>
+ <source>Midi: Midi remote control</source>
+ <translation type="obsolete">Midi: Midi fjärrkontroll</translation>
+ </message>
+ <message>
+ <source>Midi: Random rhythm generator</source>
+ <translation type="obsolete">Midi: Slumprymtmgenerator</translation>
+ </message>
+ <message>
+ <source>Midi: Reset midi</source>
+ <translation type="obsolete">Midi: Resetta midi</translation>
+ </message>
+ <message>
+ <source>Midi: Init midi</source>
+ <translation type="obsolete">Midi: Initiera midi</translation>
+ </message>
+ <message>
+ <source>Midi: Midi local off</source>
+ <translation type="obsolete">Midi: Midi lokal av</translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to track</source>
+ <translation type="obsolete">Audio: Bounce till spĂĄr</translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to file</source>
+ <translation type="obsolete">Audio: Bounce till fil</translation>
+ </message>
+ <message>
+ <source>Audio: Restart audio</source>
+ <translation type="obsolete">Audio: Starta om audio</translation>
+ </message>
+ <message>
+ <source>Automation: Mixer automation</source>
+ <translation type="obsolete">Audio: Mixerautomation</translation>
+ </message>
+ <message>
+ <source>Automation: Take mixer snapshot</source>
+ <translation type="obsolete">Audio: Mixer ögonblicksbild</translation>
+ </message>
+ <message>
+ <source>Automation: Clear mixer automation</source>
+ <translation type="obsolete">Audio: Rensa mixerautomation</translation>
+ </message>
+ <message>
+ <source>Help: Open Manual</source>
+ <translation type="obsolete">Hjälp: Öppna manual</translation>
+ </message>
+ <message>
+ <source>Help: Toggle whatsthis mode</source>
+ <translation type="obsolete">Hjälp: What&apos;s this-läge av/på</translation>
+ </message>
+ <message>
+ <source>Edit: Edit selected part</source>
+ <translation type="obsolete">Redigera: Editera vald part</translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track above</source>
+ <translation type="obsolete">Redigera: Välj närmsta part på ovanstående spår</translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track above</source>
+ <translation type="obsolete">Redigera: Lägg till närmsta part på ovanstående spår till val</translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track below</source>
+ <translation type="obsolete">Redigera: Välj närmsta part på underliggande spår</translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track below</source>
+ <translation type="obsolete">Redigera: Lägg till närmsta part på underliggande spår till val</translation>
+ </message>
+ <message>
+ <source>Midi: Transpose</source>
+ <translation type="obsolete">Midi: Transponering</translation>
+ </message>
+ <message>
+ <source>Edit: Select all</source>
+ <translation type="obsolete">Redigera: Välj alla</translation>
+ </message>
+ <message>
+ <source>Edit: Select none</source>
+ <translation type="obsolete">Redigera: Välj ingen</translation>
+ </message>
+ <message>
+ <source>Edit: Invert selection</source>
+ <translation type="obsolete">Redigera: Invertera val</translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts inside locators</source>
+ <translation type="obsolete">Redigera: Välj händelser/parter inom sektion</translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts outside locators</source>
+ <translation type="obsolete">Redigera: Välj händelser/parter utanför sektion</translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part/event to the left</source>
+ <translation type="obsolete">Redigera: Välj närmsta part/händelse till vänster</translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the left to selection</source>
+ <translation type="obsolete">Redigera: Lägg till närmsta part/händelse till vänster till val</translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the right to selection</source>
+ <translation type="obsolete">Redigera: Lägg till närmsta part/händelse till höger till val</translation>
+ </message>
+ <message>
+ <source>Edit: Set locators to selection</source>
+ <translation type="obsolete">Redigera: Sätt loopsektion till valda parter/händelser</translation>
+ </message>
+ <message>
+ <source>Edit: Increase pitch</source>
+ <translation type="obsolete">Redigera: Höj pitch</translation>
+ </message>
+ <message>
+ <source>Edit: Decrease pitch</source>
+ <translation type="obsolete">Redigera: Sänk pitch</translation>
+ </message>
+ <message>
+ <source>Edit: Set fixed length on midi events</source>
+ <translation type="obsolete">Redigera: Sätt fix längd till valda midihändelser</translation>
+ </message>
+ <message>
+ <source>Quantize: Over Quantize</source>
+ <translation type="obsolete">Redigera: Ă–verkvantisera</translation>
+ </message>
+ <message>
+ <source>Quantize: Note On Quantize</source>
+ <translation type="obsolete">Kvantisering: Not pĂĄ-kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Note On/Off Quantize</source>
+ <translation type="obsolete">Kvantisering: Not pĂĄ/av-kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Iterative Quantize</source>
+ <translation type="obsolete">Kvantisering: Iterativ kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Configure quant</source>
+ <translation type="obsolete">Kvantisering: Konfigurera kvantisering<byte value="x9"/></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Gate Time</source>
+ <translation type="obsolete">Kvantisering: Modifiera gate-tid</translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Velocity</source>
+ <translation type="obsolete">Kvantisering: Modifiera velocity</translation>
+ </message>
+ <message>
+ <source>Edit: Crescendo</source>
+ <translation type="obsolete">Redigera: Crescendo</translation>
+ </message>
+ <message>
+ <source>Edit: Thin Out</source>
+ <translation type="obsolete">Redigera: Tunna ut</translation>
+ </message>
+ <message>
+ <source>Edit: Erase Event</source>
+ <translation type="obsolete">Redigera: Ta bort händelse</translation>
+ </message>
+ <message>
+ <source>Edit: Note Shift</source>
+ <translation type="obsolete">Redigera: Shifta Not</translation>
+ </message>
+ <message>
+ <source>Edit: Move Clock</source>
+ <translation type="obsolete">Redigera: Flytta Klocka</translation>
+ </message>
+ <message>
+ <source>Edit: Copy Measure</source>
+ <translation type="obsolete">Redigera: Kopiera Takt</translation>
+ </message>
+ <message>
+ <source>Edit: Erase Measure</source>
+ <translation type="obsolete">Redigera: Ta bort Takt</translation>
+ </message>
+ <message>
+ <source>Edit: Delete Measure</source>
+ <translation type="obsolete">Redigera: Ta bort Takt</translation>
+ </message>
+ <message>
+ <source>Edit: Create Measure</source>
+ <translation type="obsolete">Redigera: Lägg till Takt</translation>
+ </message>
+ <message>
+ <source>Edit: Change event color</source>
+ <translation type="obsolete">Redigera: Ändra färg på händelse</translation>
+ </message>
+ <message>
+ <source>Tool: Pointer</source>
+ <translation type="obsolete">Verktyg: Pekare</translation>
+ </message>
+ <message>
+ <source>Tool: Pencil</source>
+ <translation type="obsolete">Verktyg: Penna</translation>
+ </message>
+ <message>
+ <source>Tool: Eraser</source>
+ <translation type="obsolete">Verktyg: Radergummi</translation>
+ </message>
+ <message>
+ <source>Tool: Line Draw</source>
+ <translation type="obsolete">Verktyg: Rita linje</translation>
+ </message>
+ <message>
+ <source>Tool: Scissor</source>
+ <translation type="obsolete">Verktyg: Delare</translation>
+ </message>
+ <message>
+ <source>Tool: Glue</source>
+ <translation type="obsolete">Verktyg: Lim</translation>
+ </message>
+ <message>
+ <source>Tool: Mute</source>
+ <translation type="obsolete">Verktyg: Tysta</translation>
+ </message>
+ <message>
+ <source>Transport: Increase current position</source>
+ <translation type="obsolete">Transport: Ă–ka nuvarande position</translation>
+ </message>
+ <message>
+ <source>Transport: Decrease current position</source>
+ <translation type="obsolete">Transport: Minska nuvarande position</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/1 note</source>
+ <translation type="obsolete">Kvantisering: Sätt kvantisering till 1/1-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/2 note</source>
+ <translation type="obsolete">Kvantisering: Sätt kvantisering till 1/2-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/4 note</source>
+ <translation type="obsolete">Kvantisering: Sätt kvantisering till 1/4-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/8 note</source>
+ <translation type="obsolete">Kvantisering: Sätt kvantisering till 1/8-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/16 note</source>
+ <translation type="obsolete">Kvantisering: Sätt kvantisering till 1/16-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/32 note</source>
+ <translation type="obsolete">Kvantisering: Sätt kvantisering till 1/32-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/64 note</source>
+ <translation type="obsolete">Kvantisering: Sätt kvantisering till 1/64-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle triol quantization</source>
+ <translation type="obsolete">Kvantisering: Växla triol-kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization</source>
+ <translation type="obsolete">Kvantisering: Växla punktuerad kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization (2)</source>
+ <translation type="obsolete">Kvantisering: Växla punktuerad kvantisering (2)</translation>
+ </message>
+ <message>
+ <source>Edit: Insert at location</source>
+ <translation type="obsolete">Redigera: Sätt in på nuvarande position</translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation type="obsolete">Mata in Not</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="obsolete">Mata in SysEx</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="obsolete">Mata in Ctrl</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="obsolete">Mata in Meta</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="obsolete">Mata in Aftertouch för kanal</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="obsolete">Mata in Key Aftertouch</translation>
+ </message>
+ <message>
+ <source>Edit: Increase event position</source>
+ <translation type="obsolete">Redigera: Öka position för händelse</translation>
+ </message>
+ <message>
+ <source>Edit: Decrease event position</source>
+ <translation type="obsolete">Redigera: Minska position för händelse</translation>
+ </message>
+ <message>
+ <source>Insert Tempo</source>
+ <translation type="obsolete">Mata in Tempo</translation>
+ </message>
+ <message>
+ <source>Insert Signature</source>
+ <translation type="obsolete">Mata in tempo-signatur</translation>
+ </message>
+ <message>
+ <source>Change Event Position</source>
+ <translation type="obsolete">Ändra position för händelse</translation>
+ </message>
+ <message>
+ <source>Edit Event Value</source>
+ <translation type="obsolete">Redigera värde för händelse</translation>
+ </message>
+</context>
+<context>
+ <name>@default</name>
+ <message>
+ <source>Click this button to stop playback</source>
+ <translation>Klicka här för att stoppa uppspelning</translation>
+ </message>
+ <message>
+ <source>Click this button to start playback</source>
+ <translation>Klicka här för att starta uppspelning</translation>
+ </message>
+ <message>
+ <source>Click this button to rewind to start position</source>
+ <translation>Klicka här för att spola tillbaks till början</translation>
+ </message>
+ <message>
+ <source>Click this button to rewind</source>
+ <translation>Klicka här för att flytta markören bakåt</translation>
+ </message>
+ <message>
+ <source>Click this button to forward current play position</source>
+ <translation>Klicka här för att flytta markören framåt</translation>
+ </message>
+ <message>
+ <source>don&apos;t quantize notes above this tick limit</source>
+ <translation type="obsolete">Kvantisera inte över denna tick gräns</translation>
+ </message>
+ <message>
+ <source>quantize also note len as default</source>
+ <translation type="obsolete">Kvantisera &quot;note len&quot; som standard</translation>
+ </message>
+ <message>
+ <source>Click this button to open a &lt;em&gt;new song&lt;/em&gt;.&lt;br&gt;You can also select the &lt;b&gt;Open command&lt;/b&gt; from the File menu.</source>
+ <translation>Klicka här för att öppna en &lt;em&gt;ny sång&lt;/em&gt;.&lt;br&gt;Du kan också välja menyvalet &lt;b&gt;Öppna&lt;/b&gt; från Arkivmenyn.</translation>
+ </message>
+ <message>
+ <source>Click this button to save the song you are editing. You will be prompted for a file name.
+You can also select the Save command from the File menu.</source>
+ <translation>Klicka här för att spara den sång du håller på att redigera. En förfrågan om filnamn kommer att ställas.
+Du kan också välja menyalternativet Spara från Arkivmenyn.</translation>
+ </message>
+ <message>
+ <source>Create New Song</source>
+ <translation>Ny sĂĄng</translation>
+ </message>
+ <message>
+ <source>loop between left mark and right mark</source>
+ <translation>loopa mellan vänster och höger markering</translation>
+ </message>
+ <message>
+ <source>record starts at left mark</source>
+ <translation>inspelning börjar vid vänster markering</translation>
+ </message>
+ <message>
+ <source>record stops at right mark</source>
+ <translation>inspelning slutar vid höger markering</translation>
+ </message>
+ <message>
+ <source>rewind to start position</source>
+ <translation>spola tillbaka till startposition</translation>
+ </message>
+ <message>
+ <source>rewind current position</source>
+ <translation>flytta markörposition bakåt</translation>
+ </message>
+ <message>
+ <source>move current position</source>
+ <translation>flytta markörposition</translation>
+ </message>
+ <message>
+ <source>stop sequencer</source>
+ <translation>stoppa sequencer</translation>
+ </message>
+ <message>
+ <source>start sequencer play</source>
+ <translation>starta sequenceruppspelning</translation>
+ </message>
+ <message>
+ <source>to record press record and then play</source>
+ <translation>för att spela in, tryck på record och sen play</translation>
+ </message>
+ <message>
+ <source>send note off to all midi channels</source>
+ <translation>skicka note off till alla midi kanaler</translation>
+ </message>
+ <message>
+ <source>select Pencil Tool:
+with the pencil tool you can:
+ create new parts
+ modify length of parts</source>
+ <translation type="obsolete">välj pennverktyg:
+med pennverktyget kan du:
+ skapa parter
+ ändra längden på parter
+</translation>
+ </message>
+ <message>
+ <source>select Delete Tool:
+with the delete tool you can delete parts</source>
+ <translation type="obsolete">välj Suddverktyg:
+med suddverktyget kan du ta bort parter</translation>
+ </message>
+ <message>
+ <source>select Cut Tool:
+with the cut tool you can split a part</source>
+ <translation type="obsolete">välj Delningsverktyg:
+med delningsverktyget kan du dela pĂĄ parter</translation>
+ </message>
+ <message>
+ <source>select Glue Tool:
+with the glue tool you can glue two parts</source>
+ <translation type="obsolete">välj Limverktyg:
+med limverktyget kan du limma ihop tvĂĄ parter</translation>
+ </message>
+ <message>
+ <source>select Score Tool:
+</source>
+ <translation type="obsolete">välj Partiturverktyg:
+</translation>
+ </message>
+ <message>
+ <source>select Quantize Tool:
+insert display quantize event</source>
+ <translation type="obsolete">välj Kvantiseringsverktyg:
+sätt in kvantiseringshändelser</translation>
+ </message>
+ <message>
+ <source>select Drawing Tool</source>
+ <translation type="obsolete">välj Ritverktyg
+</translation>
+ </message>
+ <message>
+ <source>select Muting Tool:
+click on part to mute/unmute</source>
+ <translation type="obsolete">välj Tystningsverktyg:
+klicka på en part för att Tysta/Avtysta</translation>
+ </message>
+ <message>
+ <source>pencil</source>
+ <translation type="obsolete">penna</translation>
+ </message>
+ <message>
+ <source>rubber</source>
+ <translation type="obsolete">sudd</translation>
+ </message>
+ <message>
+ <source>cutter</source>
+ <translation type="obsolete">delare</translation>
+ </message>
+ <message>
+ <source>score</source>
+ <translation type="obsolete">partitur</translation>
+ </message>
+ <message>
+ <source>glue</source>
+ <translation type="obsolete">lim</translation>
+ </message>
+ <message>
+ <source>quantize</source>
+ <translation type="obsolete">kvantisering</translation>
+ </message>
+ <message>
+ <source>draw</source>
+ <translation type="obsolete">rita</translation>
+ </message>
+ <message>
+ <source>mute parts</source>
+ <translation type="obsolete">muta parter</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Av</translation>
+ </message>
+ <message>
+ <source>presets (*.pre *.pre.gz *.pre.bz2)</source>
+ <translation>inställningar (*.pre *.pre.gz *.pre.bz2)</translation>
+ </message>
+ <message>
+ <source>All Files (*)</source>
+ <translation>Alla filer (*)</translation>
+ </message>
+ <message>
+ <source>Add Midi Track</source>
+ <translation>Lägg till Midispår</translation>
+ </message>
+ <message>
+ <source>Add Drum Track</source>
+ <translation type="obsolete">Lägg till Trumspår</translation>
+ </message>
+ <message>
+ <source>Add Wave Track</source>
+ <translation>Lägg till Wavespår</translation>
+ </message>
+ <message>
+ <source>Add Audio Output</source>
+ <translation>Lägg till Ljudutgång</translation>
+ </message>
+ <message>
+ <source>Add Audio Group</source>
+ <translation>Lägg till Ljudgrupp</translation>
+ </message>
+ <message>
+ <source>Add Audio Input</source>
+ <translation>Lägg till Ljudingång</translation>
+ </message>
+ <message>
+ <source>Add Aux Send</source>
+ <translation>Lägg till aux sänd</translation>
+ </message>
+ <message>
+ <source>Click this button to enable recording</source>
+ <translation>Klicka här för att spela in</translation>
+ </message>
+ <message>
+ <source>Transport: Start playback from current location</source>
+ <translation type="obsolete">Transport: Starta uppspelning frĂĄn nuvarande position</translation>
+ </message>
+ <message>
+ <source>Midi Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Output Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Midi Input Port</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio Strips</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>AboutBox</name>
+ <message>
+ <source>AboutBox</source>
+ <translation>OmDialog</translation>
+ </message>
+ <message>
+ <source>Keep On Rocking!</source>
+ <translation>Keep On Rocking!</translation>
+ </message>
+ <message>
+ <source>Version 0.7.0
+
+(C) Copyright 1999-2004 Werner Schweer and others.
+See http://lmuse.sourceforge.net for new versions and
+more information.
+
+Published under the GNU Public License</source>
+ <translation>Version 0.7.0
+
+(C) Copyright 1999-2004 Werner Schweer m.fl.
+Se http://lmuse.sourceforge.net för nya versioner och
+mer information
+
+Published under the GNU Public License</translation>
+ </message>
+</context>
+<context>
+ <name>Appearance</name>
+ <message>
+ <source>handle of transport window</source>
+ <translation type="obsolete">handtag för transportfönster</translation>
+ </message>
+ <message>
+ <source>track activity in arranger</source>
+ <translation type="obsolete">spĂĄr-aktivitet i Arrangeraren</translation>
+ </message>
+ <message>
+ <source>bigtime font color</source>
+ <translation type="obsolete">bigtime typsnittsfärg</translation>
+ </message>
+ <message>
+ <source>bigtime background color</source>
+ <translation type="obsolete">bigtime bakgrundsfärg</translation>
+ </message>
+ <message>
+ <source>waveedit background color</source>
+ <translation type="obsolete">audioeditor bakgrundsfärg</translation>
+ </message>
+ <message>
+ <source>MusE: load image</source>
+ <translation>MusE: ladda bild</translation>
+ </message>
+</context>
+<context>
+ <name>AppearanceDialogBase</name>
+ <message>
+ <source>MusE: Appearance settings</source>
+ <translation>MusE: Utseendeinställningar</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation>Verkställ</translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation>Arrangerare</translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation>Parter</translation>
+ </message>
+ <message>
+ <source>show frames</source>
+ <translation type="obsolete">visa ramar</translation>
+ </message>
+ <message>
+ <source>show names</source>
+ <translation>visa namn</translation>
+ </message>
+ <message>
+ <source>show events</source>
+ <translation>visa händelser(events)</translation>
+ </message>
+ <message>
+ <source>show Cakewalk Style</source>
+ <translation>använd Cakewalkstil</translation>
+ </message>
+ <message>
+ <source>Events</source>
+ <translation>Händelser</translation>
+ </message>
+ <message>
+ <source>note on</source>
+ <translation>not pĂĄ</translation>
+ </message>
+ <message>
+ <source>poly pressure</source>
+ <translation>poly pressure</translation>
+ </message>
+ <message>
+ <source>controller</source>
+ <translation>controller</translation>
+ </message>
+ <message>
+ <source>aftertouch</source>
+ <translation>aftertouch</translation>
+ </message>
+ <message>
+ <source>pitch bend</source>
+ <translation>pitch bend</translation>
+ </message>
+ <message>
+ <source>program change</source>
+ <translation>program change</translation>
+ </message>
+ <message>
+ <source>special</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Background picture</source>
+ <translation>Bakgrundsbild</translation>
+ </message>
+ <message>
+ <source>bg</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>select...</source>
+ <translation>välj...</translation>
+ </message>
+ <message>
+ <source>show snap grid</source>
+ <translation>visa rutnät</translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation>Färger</translation>
+ </message>
+ <message>
+ <source>Items</source>
+ <translation>Objekt</translation>
+ </message>
+ <message>
+ <source>selected</source>
+ <translation type="obsolete">vald</translation>
+ </message>
+ <message>
+ <source>current:</source>
+ <translation type="obsolete">nuvarande:</translation>
+ </message>
+ <message>
+ <source>change...</source>
+ <translation type="obsolete">byt...</translation>
+ </message>
+ <message>
+ <source>dynamic colors for track activity in arranger</source>
+ <translation type="obsolete">dynamisk färgallokering för spåraktivitet i arranger</translation>
+ </message>
+ <message>
+ <source>Style/Fonts</source>
+ <translation>Style/Typsnitt</translation>
+ </message>
+ <message>
+ <source>QT Theme</source>
+ <translation>QT-tema</translation>
+ </message>
+ <message>
+ <source>Windows</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>MusE</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Metal</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Norwegian Wood</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Platinum</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>CDE</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Motif</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Motif Plus</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation>Typsnitt</translation>
+ </message>
+ <message>
+ <source>Family</source>
+ <translation>Familj</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Storlek</translation>
+ </message>
+ <message>
+ <source>Font 1</source>
+ <translation>Typsnitt 1</translation>
+ </message>
+ <message>
+ <source>Font 2</source>
+ <translation>Typsnitt 2</translation>
+ </message>
+ <message>
+ <source>Font 3</source>
+ <translation>Typsnitt 3</translation>
+ </message>
+ <message>
+ <source>Font 0</source>
+ <translation>Typsnitt 0</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>Fet</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>Kursiv</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Font 4</source>
+ <translation>Typsnitt 4</translation>
+ </message>
+ <message>
+ <source>Font 5</source>
+ <translation>Typsnitt 5</translation>
+ </message>
+ <message>
+ <source>Palette</source>
+ <translation>Palett</translation>
+ </message>
+ <message>
+ <source>add to palette</source>
+ <translation>lägg till i palett</translation>
+ </message>
+ <message>
+ <source>B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Itemdsfkajlk jölk ljfölajföajföajf</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Arranger</name>
+ <message>
+ <source>Arranger</source>
+ <translation type="obsolete">Arrangerare</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Markör</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Av</translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation type="obsolete">Takt</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="obsolete">Fäst vid</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Typ</translation>
+ </message>
+ <message>
+ <source>midi song type</source>
+ <translation type="obsolete">typ av midsĂĄng</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tonhöjd</translation>
+ </message>
+ <message>
+ <source>TrackInfo</source>
+ <translation type="obsolete">SpĂĄrinfo</translation>
+ </message>
+ <message>
+ <source>Track</source>
+ <translation type="obsolete">SpĂĄr</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Master</translation>
+ </message>
+ <message>
+ <source>Group A</source>
+ <translation type="obsolete">Grupp A</translation>
+ </message>
+ <message>
+ <source>Group B</source>
+ <translation type="obsolete">Grupp B</translation>
+ </message>
+ <message>
+ <source>Group C</source>
+ <translation type="obsolete">Grupp C</translation>
+ </message>
+ <message>
+ <source>Group D</source>
+ <translation type="obsolete">Grupp D</translation>
+ </message>
+</context>
+<context>
+ <name>AudioConfBase</name>
+ <message>
+ <source>MusE: Audio Configuration</source>
+ <translation type="obsolete">MusE: Ljudinställningar</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="obsolete">&amp;Verkställ</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Audio Parameters</source>
+ <translation type="obsolete">Ljudparametrar</translation>
+ </message>
+ <message>
+ <source>Frame Size:</source>
+ <translation type="obsolete">Ramstorlek:</translation>
+ </message>
+ <message>
+ <source>Delay:</source>
+ <translation type="obsolete">Fördröjning(ms):</translation>
+ </message>
+ <message>
+ <source>Sample Rate:</source>
+ <translation type="obsolete">Samplingsfrekvens:</translation>
+ </message>
+ <message>
+ <source>Audio Driver</source>
+ <translation type="obsolete">Ljuddrivrutin</translation>
+ </message>
+ <message>
+ <source>Use Alsa</source>
+ <translation type="obsolete">Använd Alsa</translation>
+ </message>
+ <message>
+ <source>Use JACK</source>
+ <translation type="obsolete">Använd JACK</translation>
+ </message>
+ <message>
+ <source>No Audio</source>
+ <translation type="obsolete">Ljud avstängt</translation>
+ </message>
+</context>
+<context>
+ <name>AudioMixerApp</name>
+ <message>
+ <source>1/2 channel</source>
+ <translation type="obsolete">1/2 kanal</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation type="obsolete">inspelning</translation>
+ </message>
+ <message>
+ <source>mute</source>
+ <translation type="obsolete">tysta</translation>
+ </message>
+ <message>
+ <source>pre fader listening</source>
+ <translation type="obsolete">pre fader lyssning</translation>
+ </message>
+ <message>
+ <source>record downmix</source>
+ <translation type="obsolete">spela in nermixning</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="obsolete">av</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Inställningar</translation>
+ </message>
+ <message>
+ <source>Add Input Strip</source>
+ <translation type="obsolete">Lägg till Input-remsa</translation>
+ </message>
+ <message>
+ <source>Inputs</source>
+ <translation type="obsolete">IngĂĄngar</translation>
+ </message>
+ <message>
+ <source>Tracks</source>
+ <translation type="obsolete">SpĂĄr</translation>
+ </message>
+ <message>
+ <source>Groups</source>
+ <translation type="obsolete">Grupper</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Master</translation>
+ </message>
+ <message>
+ <source>Group A</source>
+ <translation type="obsolete">Grupp A</translation>
+ </message>
+ <message>
+ <source>Group B</source>
+ <translation type="obsolete">Grupp B</translation>
+ </message>
+ <message>
+ <source>Group C</source>
+ <translation type="obsolete">Grupp C</translation>
+ </message>
+ <message>
+ <source>Group D</source>
+ <translation type="obsolete">Grupp D</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="obsolete">Ingen</translation>
+ </message>
+ <message>
+ <source>&amp;Create</source>
+ <translation type="obsolete">&amp;Skapa</translation>
+ </message>
+</context>
+<context>
+ <name>AudioStrip</name>
+ <message>
+ <source>off</source>
+ <translation type="obsolete">av</translation>
+ </message>
+ <message>
+ <source>1/2 channel</source>
+ <translation type="obsolete">1/2 kanal</translation>
+ </message>
+ <message>
+ <source>mute</source>
+ <translation type="obsolete">tysta</translation>
+ </message>
+ <message>
+ <source>record downmix</source>
+ <translation type="obsolete">spela in nermixning</translation>
+ </message>
+ <message>
+ <source>pre fader listening</source>
+ <translation type="obsolete">pre fader lyssning</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Av</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="obsolete">Kanal</translation>
+ </message>
+</context>
+<context>
+ <name>ClipListEdit</name>
+ <message>
+ <source>MusE: Clip List Editor</source>
+ <translation type="obsolete">MusE: Clip-listredigerare</translation>
+ </message>
+</context>
+<context>
+ <name>ClipListEditorBase</name>
+ <message>
+ <source>MusE: ClipList</source>
+ <translation>MusE: Clip-lista</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Namn</translation>
+ </message>
+ <message>
+ <source>Refs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clip Properties</source>
+ <translation>Clip-egenskaper</translation>
+ </message>
+ <message>
+ <source>Pos:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Len:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CommentBase</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Comment</source>
+ <translation>SpĂĄr-kommentar</translation>
+ </message>
+ <message>
+ <source>Track 1</source>
+ <translation>SpĂĄr 1</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiCtrlBase</name>
+ <message>
+ <source>MusE: Config Midi Controller</source>
+ <translation>MusE: Konfigurera Midi Controller</translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation>Midi Port:</translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation>Tillgänglig Controller:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Lägg till</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Ta bort</translation>
+ </message>
+ <message>
+ <source>Automated Controller:</source>
+ <translation>Automatiserad Controller:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigMidiFileBase</name>
+ <message>
+ <source>MusE: Config Midi File Export</source>
+ <translation>MusE: Midi fil export-konfiguration</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>0 (single track)</source>
+ <translation>0 (enskilt spĂĄr)</translation>
+ </message>
+ <message>
+ <source>1 (multiple tracks)</source>
+ <translation>1 (multipla spĂĄr)</translation>
+ </message>
+ <message>
+ <source>Format:</source>
+ <translation>Format:</translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Division:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copyright:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable extended smf format</source>
+ <translation type="unfinished">SlĂĄ pĂĄ utbyggt smf-format</translation>
+ </message>
+</context>
+<context>
+ <name>ConfigTrackListBase</name>
+ <message>
+ <source>MusE: Config Track List</source>
+ <translation>MusE: Konfigurera SpĂĄrlista</translation>
+ </message>
+ <message>
+ <source>Track Type:</source>
+ <translation>SpĂĄrtyp:</translation>
+ </message>
+ <message>
+ <source>Audio Output</source>
+ <translation>LjudutgĂĄng</translation>
+ </message>
+ <message>
+ <source>Audio Group</source>
+ <translation>Ljudgrupp</translation>
+ </message>
+ <message>
+ <source>Audio Aux</source>
+ <translation>Ljud Aux</translation>
+ </message>
+ <message>
+ <source>Wave Track</source>
+ <translation>WavespĂĄr</translation>
+ </message>
+ <message>
+ <source>Audio Input</source>
+ <translation>LjudingĂĄng</translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation>Mjukvarusynth</translation>
+ </message>
+ <message>
+ <source>Midi Track</source>
+ <translation>MidispĂĄr</translation>
+ </message>
+ <message>
+ <source>Drum Track</source>
+ <translation>TrumspĂĄr</translation>
+ </message>
+ <message>
+ <source>Available Items:</source>
+ <translation>Tillgängliga Objekt:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Lägg till</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Ta bort</translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation>Upp</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation>Ner</translation>
+ </message>
+ <message>
+ <source>Configured Items</source>
+ <translation>Konfigurerade Objekt</translation>
+ </message>
+ <message>
+ <source>Track Name Size:</source>
+ <translation>SpĂĄrnamn Storlek:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>CtrlPanel</name>
+ <message>
+ <source>select controller</source>
+ <translation type="obsolete">välj controller</translation>
+ </message>
+ <message>
+ <source>remove panel</source>
+ <translation type="obsolete">ta bort panel</translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="obsolete">Hastighet</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tonhöjd</translation>
+ </message>
+ <message>
+ <source>other ...</source>
+ <translation type="obsolete">annat ...</translation>
+ </message>
+</context>
+<context>
+ <name>DeicsOnzeGuiBase</name>
+ <message>
+ <source>DeicsOnze</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Presets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subcategory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PRO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NONE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Program numerous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>INITVOICE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HBA</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op4 Feedback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Feedback level of the operator 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Master volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modulation Matrix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Algorithm 1&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 2&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt; modulated by both &lt;i&gt;Op 3&lt;/i&gt; and &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 3&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 4&lt;/i&gt; and &lt;i&gt;Op 2&lt;/i&gt; modulated by &lt;i&gt;Op 3&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 4&lt;/b&gt; : &lt;i&gt;Op 1&lt;/i&gt; modulated by both &lt;i&gt;Op 2&lt;/i&gt; and &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 5&lt;/b&gt; : (&lt;i&gt;Op 1&lt;/i&gt; modulated by &lt;i&gt;Op 2&lt;/i&gt;) add to (&lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;) &lt;br&gt;
+&lt;b&gt;Algorithm 6&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; all modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 7&lt;/b&gt; : addition of the three &lt;i&gt;Op 1, 2, 3&lt;/i&gt; with &lt;i&gt;Op 3&lt;/i&gt; modulated by &lt;i&gt;Op 4&lt;/i&gt;&lt;br&gt;
+&lt;b&gt;Algorithm 8&lt;/b&gt; : addition of the four &lt;i&gt;Op 1, 2, 3, 4&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Sync</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch modulation depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude modulation sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Waveform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Modulation Depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LFO Speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AMD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished">Hastighet</translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PMS</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Envelope</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PL1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Volume</source>
+ <translation type="unfinished">Volym</translation>
+ </message>
+ <message>
+ <source>Frequency 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine Ratio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fixed Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FIX</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle Fix Frequency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Modulation Enable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keyboard Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key Velocity Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Eg Bias Sensitivity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack Rate of the operator 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>48dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>24dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>12dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EG Shift</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wave form 1 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)&lt;/i&gt;&lt;br&gt;
+Wave form 2 = &lt;i&gt;sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;))&lt;/i&gt;&lt;br&gt;
+Wave form 3 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 4 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(&lt;b&gt;t&lt;/b&gt;)*abs(sin(&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 5 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 6 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 7 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then abs(sin(2*&lt;b&gt;t&lt;/b&gt;)) else 0&lt;/i&gt;&lt;br&gt;
+Wave form 8 = &lt;i&gt;if &lt;b&gt;t&lt;/b&gt;&amp;#060 pi then sin(2*&lt;b&gt;t&lt;/b&gt;)*sin(2*&lt;b&gt;t&lt;/b&gt;) else 0&lt;/i&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>2° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>1° Decay Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack Rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rate Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level Scaling</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude Envelope 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Op &amp;4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sensitivity 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EBS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AME4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Detune, OSCWave, EGShift 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DET4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OUT 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scaling 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RS4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Frequency 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coarse 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fine 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Freq 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>amplitude Envelope 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D1L4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D2R4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RR4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Fun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phony Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>POLY</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MONO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foot Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bend Range</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Amplitude</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="unfinished">Tonhöjd</translation>
+ </message>
+ <message>
+ <source>Modulation Wheel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Breath Control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bias</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>After Touch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Potamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FINGER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FULL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PT</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Foot Switch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Portamento</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="unfinished">Transponera</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="unfinished">&amp;Inställningar</translation>
+ </message>
+ <message>
+ <source>Configuration File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished">Spara</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quality</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Middle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NbrV</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of Voices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation type="unfinished">Färger</translation>
+ </message>
+ <message>
+ <source>Red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="unfinished">Text</translation>
+ </message>
+ <message>
+ <source>Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit Background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save only the used presets into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the entire set into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the configuration into the project</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DrumEdit</name>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Arkiv</translation>
+ </message>
+ <message>
+ <source>Load Map</source>
+ <translation type="obsolete">Ladda mappning</translation>
+ </message>
+ <message>
+ <source>Save Map</source>
+ <translation type="obsolete">Spara Mappning</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Klipp ut</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Kopiera</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Klistra in</translation>
+ </message>
+ <message>
+ <source>Delete Events</source>
+ <translation type="obsolete">Ta bort händelser</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="obsolete">Välj Allt</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation type="obsolete">Välj Ingen</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Invertera</translation>
+ </message>
+ <message>
+ <source>Inside Loop</source>
+ <translation type="obsolete">I loop</translation>
+ </message>
+ <message>
+ <source>Outside Loop</source>
+ <translation type="obsolete">Utanför loop</translation>
+ </message>
+ <message>
+ <source>&amp;Select</source>
+ <translation type="obsolete">&amp;Välj</translation>
+ </message>
+ <message>
+ <source>Load Drummap</source>
+ <translation type="obsolete">Ladda trummappning</translation>
+ </message>
+ <message>
+ <source>Store Drummap</source>
+ <translation type="obsolete">Spara trummappning</translation>
+ </message>
+ <message>
+ <source>Step Record</source>
+ <translation type="obsolete">Stegvis inspelning</translation>
+ </message>
+ <message>
+ <source>Add Controller View</source>
+ <translation type="obsolete">Lägg till Controller vy</translation>
+ </message>
+ <message>
+ <source>Sound</source>
+ <translation type="obsolete">Ljud</translation>
+ </message>
+ <message>
+ <source>drummaps</source>
+ <translation type="obsolete">trummappningar</translation>
+ </message>
+ <message>
+ <source>Muse: Load Drum Map</source>
+ <translation type="obsolete">Muse: Ladda trummappning</translation>
+ </message>
+ <message>
+ <source>MusE: Store Drum Map</source>
+ <translation type="obsolete">MusE: Spara trummappning</translation>
+ </message>
+ <message>
+ <source>&amp;Functions</source>
+ <translation type="obsolete">&amp;Funktioner</translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation type="obsolete">Modifiera Velocity</translation>
+ </message>
+</context>
+<context>
+ <name>EditCAfterDialog</name>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Tidsposition</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl14Dialog</name>
+ <message>
+ <source>MusE: Enter Controller14 Event</source>
+ <translation type="obsolete">MusE: Mata in Controller14 Händelse</translation>
+ </message>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Tidsposition</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="obsolete">Värde</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl7Dialog</name>
+ <message>
+ <source>MusE: Enter Controller Event</source>
+ <translation type="obsolete">MusE: Mata in Controller Händelse</translation>
+ </message>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Tidsposition</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="obsolete">Värde</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrl7DialogBase</name>
+ <message>
+ <source>MusE: Enter Controller</source>
+ <translation>MusE: Mata in Controller</translation>
+ </message>
+ <message>
+ <source>Controller:</source>
+ <translation>Controller:</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Tidspositions:</translation>
+ </message>
+ <message>
+ <source>Value:</source>
+ <translation>Värde:</translation>
+ </message>
+ <message>
+ <source>controller value</source>
+ <translation>controllervärde</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>EditCtrlBase</name>
+ <message>
+ <source>MusE: Edit Controller Event</source>
+ <translation>MusE: Redigera Controllerhändelse</translation>
+ </message>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Tidsposition</translation>
+ </message>
+ <message>
+ <source>Available Controller:</source>
+ <translation>Tillgänglig Controller:</translation>
+ </message>
+ <message>
+ <source>Create New Controller</source>
+ <translation>Skapa Ny Controller</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation>Värde</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation>Controller</translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation>av</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Midi Port:</source>
+ <translation>Midi Port:</translation>
+ </message>
+ <message>
+ <source>Midi Channel:</source>
+ <translation>Midi Kanal:</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Tidsposition:</translation>
+ </message>
+ <message>
+ <source>Patch Name</source>
+ <translation>Patchnamn</translation>
+ </message>
+</context>
+<context>
+ <name>EditEventDialog</name>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>EditInstrumentBase</name>
+ <message>
+ <source>MusE: Instrument Editor</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Patches</source>
+ <translation>Patchar</translation>
+ </message>
+ <message>
+ <source>Patch Name:</source>
+ <translation>Patchnamn:</translation>
+ </message>
+ <message>
+ <source>High Bank:</source>
+ <translation>Hög Bank:</translation>
+ </message>
+ <message>
+ <source>Low Bank:</source>
+ <translation>LĂĄg Bank:</translation>
+ </message>
+ <message>
+ <source>Program:</source>
+ <translation>Program:</translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <comment>dont care</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>d.c.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Patch/Group</source>
+ <translation>Patch/Grupp</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Ta bort</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New Patch</source>
+ <translation>&amp;Ny Patch</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New Group</source>
+ <translation>Ny Grupp</translation>
+ </message>
+ <message>
+ <source>Drum</source>
+ <translation>Trumma</translation>
+ </message>
+ <message>
+ <source>GM</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>GS</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>XG</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation>Controller</translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation>Fördefinierad Controller:</translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation>Detta är en lista över vanligt förekommande controllers.
+Observera att i MusE hanteras pitch och program change som
+vanliga controllers.</translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation>Egenskaper</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Namn</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation>Tonhöjd</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation>Midi Controllernummer Hög Byte</translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation>Midi Controllernummer LĂĄg Byte</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation>OmrĂĄde</translation>
+ </message>
+ <message>
+ <source>Min</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Max</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation>Namn</translation>
+ </message>
+ <message>
+ <source>Type </source>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation>Min värde</translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation>Max värde</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation>lista med definierade controllers</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation>Detta är MusEs lista med definierade controllers.</translation>
+ </message>
+ <message>
+ <source>SysEx</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Initialization</source>
+ <translation>Initiering</translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation>Panik</translation>
+ </message>
+ <message>
+ <source>Hex Entry:</source>
+ <translation>Hex Värde:</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Arkiv</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation>Verktyg</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation>Ny</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Ny</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Ă–ppna</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation>&amp;Ă–ppna...</translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Spara</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Spara</translation>
+ </message>
+ <message>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>Spara som</translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation>S&amp;para som...</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation>Stäng</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation>S&amp;täng</translation>
+ </message>
+</context>
+<context>
+ <name>EditMetaDialog</name>
+ <message>
+ <source>MusE: Enter Meta Event</source>
+ <translation type="obsolete">MusE: Mata in Meta Händelse</translation>
+ </message>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Tidsposition</translation>
+ </message>
+ <message>
+ <source>Meta Type</source>
+ <translation type="obsolete">Metatyp</translation>
+ </message>
+ <message>
+ <source>Enter Hex</source>
+ <translation type="obsolete">Mata in Hex</translation>
+ </message>
+</context>
+<context>
+ <name>EditMetaDialogBase</name>
+ <message>
+ <source>MusE: Enter Meta Event</source>
+ <translation>MusE: Mata in Meta Händelse</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+ <message>
+ <source>TextLabel1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Tidsposition:</translation>
+ </message>
+ <message>
+ <source>Meta Type:</source>
+ <translation>Metatyp:</translation>
+ </message>
+ <message>
+ <source>Enter Hex</source>
+ <translation>Mata in hex</translation>
+ </message>
+</context>
+<context>
+ <name>EditNoteDialogBase</name>
+ <message>
+ <source>MusE: Enter Note</source>
+ <translation>MusE: Mata in Not</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+ <message>
+ <source>Length:</source>
+ <translation>Längd:</translation>
+ </message>
+ <message>
+ <source>Time Position:</source>
+ <translation>Tidsposition:</translation>
+ </message>
+ <message>
+ <source>Pitch:</source>
+ <translation>Tonhöjd:</translation>
+ </message>
+ <message>
+ <source>Velocity On:</source>
+ <translation>Velocity PĂĄ:</translation>
+ </message>
+ <message>
+ <source>Velocity Off:</source>
+ <translation>Velocity Av:</translation>
+ </message>
+</context>
+<context>
+ <name>EditPAfterDialog</name>
+ <message>
+ <source>MusE: Enter Poly Aftertouch</source>
+ <translation type="obsolete">MusE: Mata in Poly Aftertouch</translation>
+ </message>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Tidsposition</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tonhöjd</translation>
+ </message>
+</context>
+<context>
+ <name>EditPitchDialog</name>
+ <message>
+ <source>MusE: Enter Pitch Shift</source>
+ <translation type="obsolete">MusE: Mata in Pitch Shift</translation>
+ </message>
+ <message>
+ <source>Time Position</source>
+ <translation type="obsolete">Tidsposition</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tonhöjd</translation>
+ </message>
+</context>
+<context>
+ <name>EditSysexDialogBase</name>
+ <message>
+ <source>MusE: Enter SysEx</source>
+ <translation>MusE: Mata in SysEx</translation>
+ </message>
+ <message>
+ <source>TimePosition:</source>
+ <translation>Tidsposition:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation>Kommentar:</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+ <message>
+ <source>Known SysEx:</source>
+ <translation>Känd SysEx:</translation>
+ </message>
+ <message>
+ <source>Add</source>
+ <translation>Lägg till</translation>
+ </message>
+</context>
+<context>
+ <name>EditToolBar</name>
+ <message>
+ <source>Edit Tools</source>
+ <translation type="obsolete">Redigeringsverktyg</translation>
+ </message>
+</context>
+<context>
+ <name>EffectRack</name>
+ <message>
+ <source>effect rack</source>
+ <translation type="obsolete">effektrack</translation>
+ </message>
+ <message>
+ <source>move up</source>
+ <translation type="obsolete">flytta upp</translation>
+ </message>
+ <message>
+ <source>move down</source>
+ <translation type="obsolete">flytta ner</translation>
+ </message>
+ <message>
+ <source>remove</source>
+ <translation type="obsolete">ta bort</translation>
+ </message>
+ <message>
+ <source>show gui</source>
+ <translation type="obsolete">visa gui</translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation type="obsolete">ny</translation>
+ </message>
+ <message>
+ <source>change</source>
+ <translation type="obsolete">ändra</translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDGuiBase</name>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Ladda</translation>
+ </message>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FLUIDSynthGuiBase</name>
+ <message>
+ <source>Gain</source>
+ <translation type="unfinished">Förstärkning</translation>
+ </message>
+ <message>
+ <source>Room Size</source>
+ <translation type="unfinished">Rumsstorlek</translation>
+ </message>
+ <message>
+ <source>Damping</source>
+ <translation type="unfinished">Dämpning</translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation type="unfinished">NivĂĄ</translation>
+ </message>
+ <message>
+ <source>Width</source>
+ <translation type="unfinished">Bredd</translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="unfinished">Hastighet</translation>
+ </message>
+ <message>
+ <source>Depth</source>
+ <translation type="unfinished">Djup</translation>
+ </message>
+ <message>
+ <source>Number</source>
+ <translation type="unfinished">Nummer</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Typ</translation>
+ </message>
+ <message>
+ <source>Sine</source>
+ <translation type="unfinished">Sinus</translation>
+ </message>
+ <message>
+ <source>Triangle</source>
+ <translation type="unfinished">Triangel</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Ladda</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Spara</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished">Ta bort</translation>
+ </message>
+ <message>
+ <source>Fontname</source>
+ <translation type="unfinished">Fontnamn</translation>
+ </message>
+ <message>
+ <source>FLUID Synth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dump Info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Soundfont</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drum Chnl</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reverb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CHANNEL SETUP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Chorus</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>LOADED SOUNDFONTS</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileDialogButtons</name>
+ <message>
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Global</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Användare</translation>
+ </message>
+ <message>
+ <source>Project</source>
+ <translation>Projekt</translation>
+ </message>
+ <message>
+ <source>Load:</source>
+ <translation>Ă–ppna:</translation>
+ </message>
+ <message>
+ <source>Songdata +
+Cofiguration</source>
+ <translation>SĂĄngdata + Konfiguration</translation>
+ </message>
+ <message>
+ <source>only
+Songdata</source>
+ <translation>enbart SĂĄngdata</translation>
+ </message>
+</context>
+<context>
+ <name>FontSel</name>
+ <message>
+ <source>Size:</source>
+ <translation type="obsolete">Storlek:</translation>
+ </message>
+</context>
+<context>
+ <name>GateTimeBase</name>
+ <message>
+ <source>MusE: Modify Gate Time</source>
+ <translation>MusE: Ă„ndra Gate-tid</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation>OmrĂĄde</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation>Alla Händelser</translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation>Valda Händelser</translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation>Loopade Händelser</translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation>Valda &amp; Loopade</translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation>Värden</translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation>Hastighet:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation>Offset:</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>GlobalSettingsDialogBase</name>
+ <message>
+ <source>MusE: Global Settings</source>
+ <translation>MusE: Globala Inställningar</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation>&amp;Verkställ</translation>
+ </message>
+ <message>
+ <source>&amp;Ok</source>
+ <translation>&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation>Ljud</translation>
+ </message>
+ <message>
+ <source>Mixer</source>
+ <translation>Mixer</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>min. Meter Value</source>
+ <translation>min. Metervärde</translation>
+ </message>
+ <message>
+ <source>min.Slider Val</source>
+ <translation>min. Slider värde</translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation>Midi</translation>
+ </message>
+ <message>
+ <source>Ticks</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>1024</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2048</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>4096</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>8172</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Displayed Resolution
+(Ticks/Quarternote)</source>
+ <translation>Visad upplösning
+(Tick/Kvartsnot)</translation>
+ </message>
+ <message>
+ <source>48</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>96</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>192</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>384</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>768</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1536</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>3072</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>6144</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>12288</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RTC Resolution
+(Ticks/Sec)</source>
+ <translation>RTC-Upplösning
+(Tick/Sek)</translation>
+ </message>
+ <message>
+ <source>GUI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help Browser:</source>
+ <translation>Hjälpläsare:</translation>
+ </message>
+ <message>
+ <source>GUI Refresh Rate</source>
+ <translation>GUI-uppdateringsfrekvens</translation>
+ </message>
+ <message>
+ <source>/sec</source>
+ <translation>/sek</translation>
+ </message>
+ <message>
+ <source>Application</source>
+ <translation>Applikation</translation>
+ </message>
+ <message>
+ <source>Start Muse</source>
+ <translation>Starta MusE</translation>
+ </message>
+ <message>
+ <source>start with last song</source>
+ <translation>starta med senaste projekt</translation>
+ </message>
+ <message>
+ <source>start with song</source>
+ <translation>starta med projekt</translation>
+ </message>
+ <message>
+ <source>start song:</source>
+ <translation>starta projekt:</translation>
+ </message>
+ <message>
+ <source>Views</source>
+ <translation>Vyer</translation>
+ </message>
+ <message>
+ <source>y-pos</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>show</source>
+ <translation>visa</translation>
+ </message>
+ <message>
+ <source>x-pos</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>height</source>
+ <translation>höjd</translation>
+ </message>
+ <message>
+ <source>width</source>
+ <translation>bredd</translation>
+ </message>
+ <message>
+ <source>Big Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation>Arrangerare</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Cur</source>
+ <translation>Nuv</translation>
+ </message>
+ <message>
+ <source>set current values</source>
+ <translation>sätt nuvarande värden</translation>
+ </message>
+ <message>
+ <source>start with template: default.med</source>
+ <translation>starta med mall: default.med</translation>
+ </message>
+ <message>
+ <source>show splash screen</source>
+ <translation>visa splashscreen</translation>
+ </message>
+ <message>
+ <source>use JACK freewheel mode if possible</source>
+ <translation>använd JACK freewheel om möjligt</translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LMaster</name>
+ <message>
+ <source>MusE: Mastertrack</source>
+ <translation type="obsolete">MusE: MasterspĂĄr</translation>
+ </message>
+ <message>
+ <source>new tempo</source>
+ <translation type="obsolete">nytt tempo</translation>
+ </message>
+ <message>
+ <source>new signature</source>
+ <translation type="obsolete">ny signatur</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation type="obsolete">Tid</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Typ</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="obsolete">Värde</translation>
+ </message>
+</context>
+<context>
+ <name>ListEdit</name>
+ <message>
+ <source>Insert Note</source>
+ <translation type="obsolete">Mata in Not</translation>
+ </message>
+ <message>
+ <source>insert Note</source>
+ <translation type="obsolete">Mata in Not</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation type="obsolete">Mata in SysEx</translation>
+ </message>
+ <message>
+ <source>insert SysEx</source>
+ <translation type="obsolete">Mata in SysEx</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation type="obsolete">Mata in Ctrl</translation>
+ </message>
+ <message>
+ <source>insert Ctrl</source>
+ <translation type="obsolete">Mata in Ctrl</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation type="obsolete">Mata in Meta</translation>
+ </message>
+ <message>
+ <source>insert Meta</source>
+ <translation type="obsolete">Mata in Meta</translation>
+ </message>
+ <message>
+ <source>Insert Pitch</source>
+ <translation type="obsolete">Mata in Pitch</translation>
+ </message>
+ <message>
+ <source>insert Pitch</source>
+ <translation type="obsolete">Mata in Pitch</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation type="obsolete">Mata in Aftertouch för kanal</translation>
+ </message>
+ <message>
+ <source>insert Channel Aftertouch</source>
+ <translation type="obsolete">Mata in Aftertouch för kanal</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation type="obsolete">Mata in Key Aftertouch</translation>
+ </message>
+ <message>
+ <source>insert Poly Aftertouch</source>
+ <translation type="obsolete">Mata in Poly Aftertouch</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Klipp ut</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Kopiera</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Klistra in</translation>
+ </message>
+ <message>
+ <source>Delete Events</source>
+ <translation type="obsolete">Ta bort Händelser</translation>
+ </message>
+ <message>
+ <source>List Tools</source>
+ <translation type="obsolete">Listverktyg</translation>
+ </message>
+ <message>
+ <source>Insert Tools</source>
+ <translation type="obsolete">Inmatningsverktyg</translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation type="obsolete">Takt</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="obsolete">Kommentar</translation>
+ </message>
+</context>
+<context>
+ <name>MITTransposeBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Transpose</source>
+ <translation type="unfinished">MusE: Midi Inputplugin: Transponering</translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation type="unfinished">PĂĄ</translation>
+ </message>
+ <message>
+ <source>Transpose:</source>
+ <translation type="unfinished">Transponering:</translation>
+ </message>
+ <message>
+ <source>TriggerKey</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>+0</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MPConfig</name>
+ <message>
+ <source>none</source>
+ <translation type="obsolete">inga</translation>
+ </message>
+ <message>
+ <source>other raw ...</source>
+ <translation type="obsolete">annan raw ...</translation>
+ </message>
+ <message>
+ <source>MusE: Midi Port Table</source>
+ <translation type="obsolete">MusE: Midiporttabell</translation>
+ </message>
+ <message>
+ <source>Device Name</source>
+ <translation type="obsolete">Enhetsnamn</translation>
+ </message>
+ <message>
+ <source>State</source>
+ <translation type="obsolete">Status</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="obsolete">okänd</translation>
+ </message>
+</context>
+<context>
+ <name>MRConfigBase</name>
+ <message>
+ <source>MusE: Midi Input Plugin: Remote Control</source>
+ <translation>MusE: Midiinputplugin: Fjärrkontroll</translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation>Aktivera</translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation>PĂĄ</translation>
+ </message>
+ <message>
+ <source>Actions</source>
+ <translation>Kommandon</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Stopp</translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation>Inspelning</translation>
+ </message>
+ <message>
+ <source>Goto Left Mark</source>
+ <translation>Gå till vänster markering</translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation>Spela</translation>
+ </message>
+</context>
+<context>
+ <name>MTScale</name>
+ <message>
+ <source>bar scale</source>
+ <translation type="obsolete">takt skala</translation>
+ </message>
+</context>
+<context>
+ <name>MarkerView</name>
+ <message>
+ <source>MusE: Marker</source>
+ <translation type="obsolete">MusE: Markör</translation>
+ </message>
+ <message>
+ <source>add marker</source>
+ <translation type="obsolete">lägg till markör</translation>
+ </message>
+ <message>
+ <source>Add Marker</source>
+ <translation type="obsolete">Lägg till Markör</translation>
+ </message>
+ <message>
+ <source>delete marker</source>
+ <translation type="obsolete">ta bort markör</translation>
+ </message>
+ <message>
+ <source>Delete Marker</source>
+ <translation type="obsolete">Ta bort Markör</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Arkiv</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>Bar:Beat:Tick</source>
+ <translation type="obsolete">Takt:Slag:Tick</translation>
+ </message>
+ <message>
+ <source>Lock</source>
+ <translation type="obsolete">LĂĄs</translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="obsolete">Text</translation>
+ </message>
+ <message>
+ <source>Marker Properties</source>
+ <translation type="obsolete">Markörinställningar</translation>
+ </message>
+</context>
+<context>
+ <name>MasterEdit</name>
+ <message>
+ <source>MusE: Mastertrack</source>
+ <translation type="obsolete">MusE: MasterspĂĄr</translation>
+ </message>
+ <message>
+ <source>edit tools</source>
+ <translation type="obsolete">redigeringsverktyg</translation>
+ </message>
+ <message>
+ <source>EnableMaster</source>
+ <translation type="obsolete">Aktivera Master</translation>
+ </message>
+ <message>
+ <source>use master track</source>
+ <translation type="obsolete">använd master track</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Markör</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Av</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="obsolete">Fäst vid</translation>
+ </message>
+ <message>
+ <source>time at cursor position</source>
+ <translation type="obsolete">tid vid markörposition</translation>
+ </message>
+ <message>
+ <source>tempo at cursor position</source>
+ <translation type="obsolete">tempo vid markörposition</translation>
+ </message>
+ <message>
+ <source>tempo at current position</source>
+ <translation type="obsolete">tempo vid nuvarande position</translation>
+ </message>
+ <message>
+ <source>time signature at current position</source>
+ <translation type="obsolete">time signature vid nuvarande position</translation>
+ </message>
+</context>
+<context>
+ <name>MetronomeConfigBase</name>
+ <message>
+ <source>MusE: Metronome Config</source>
+ <translation type="obsolete">MusE: Metronomeconfiguration</translation>
+ </message>
+ <message>
+ <source>Metronome</source>
+ <translation type="obsolete">Metronom</translation>
+ </message>
+ <message>
+ <source>Audio Beep</source>
+ <translation type="obsolete">Audio - Ton</translation>
+ </message>
+ <message>
+ <source>Midi Channel</source>
+ <translation type="obsolete">Midi kanal</translation>
+ </message>
+ <message>
+ <source>Measure Note</source>
+ <translation type="obsolete">Takt Not</translation>
+ </message>
+ <message>
+ <source>Measure Velocity</source>
+ <translation type="obsolete">Takt-anslag</translation>
+ </message>
+ <message>
+ <source>Beat Velocity</source>
+ <translation type="obsolete">Slag-anslag</translation>
+ </message>
+ <message>
+ <source>Beat Note</source>
+ <translation type="obsolete">Slag-not</translation>
+ </message>
+ <message>
+ <source>Precount</source>
+ <translation type="obsolete">Inräkning</translation>
+ </message>
+ <message>
+ <source>enable</source>
+ <translation type="obsolete">pĂĄ</translation>
+ </message>
+ <message>
+ <source>Bars</source>
+ <translation type="obsolete">Takter</translation>
+ </message>
+ <message>
+ <source>From Mastertrack</source>
+ <translation type="obsolete">FrĂĄn MasterspĂĄr</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="obsolete">&amp;Verställ</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>MidiController</name>
+ <message>
+ <source>Velocity</source>
+ <translation>Hastighet</translation>
+ </message>
+</context>
+<context>
+ <name>MidiControllerEditDialog</name>
+ <message>
+ <source>MusE: save midi controller list</source>
+ <translation type="obsolete">MusE: spara midi-controller lista</translation>
+ </message>
+ <message>
+ <source>MusE: load midi controller list</source>
+ <translation type="obsolete">MusE:ladda midi-controller lista</translation>
+ </message>
+</context>
+<context>
+ <name>MidiControllerEditDialogBase</name>
+ <message>
+ <source>MusE: Define Midi Controller</source>
+ <translation>MusE: Definiera Midi-controller</translation>
+ </message>
+ <message>
+ <source>replace controller set</source>
+ <translation type="obsolete">ersätt controller-set</translation>
+ </message>
+ <message>
+ <source>merge controller set</source>
+ <translation type="obsolete">slĂĄ ihop controller-set</translation>
+ </message>
+ <message>
+ <source>save controller set as</source>
+ <translation type="obsolete">spara controller-set</translation>
+ </message>
+ <message>
+ <source>Name </source>
+ <translation>Namn</translation>
+ </message>
+ <message>
+ <source>Type </source>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Min Val</source>
+ <translation>Min värde</translation>
+ </message>
+ <message>
+ <source>Max Val</source>
+ <translation>Max värde</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation>lista med definierade controllers</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation>Detta är MusEs lista med definierade controllers.</translation>
+ </message>
+ <message>
+ <source>Properties</source>
+ <translation>Egenskaper</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Namn</translation>
+ </message>
+ <message>
+ <source>Max Value</source>
+ <translation>Max värde</translation>
+ </message>
+ <message>
+ <source>Min Value</source>
+ <translation>Min värde</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Ny</translation>
+ </message>
+ <message>
+ <source>create new entry</source>
+ <translation>skapa nytt inlägg</translation>
+ </message>
+ <message>
+ <source>pressing the New button you create a new entry
+in the MusE list of defined controllers</source>
+ <translation>tryck på Ny knappen för att skapa nytt inlägg
+i MusEs lista med definierade controllers</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Ta bort</translation>
+ </message>
+ <message>
+ <source>delete selected entry</source>
+ <translation>ta bort valt inlägg</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Lägg till</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Predefined Controller:</source>
+ <translation>Fördefinierad Controller:</translation>
+ </message>
+ <message>
+ <source>H-Ctrl</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>L-Ctrl</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Managed Controller for Port</source>
+ <translation>Hanterad Controller för Port</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation>Kanal</translation>
+ </message>
+ <message>
+ <source>This is a list of commonly used midi controllers.
+Note that in MusE pitch and program changes are
+handled like normal controllers.</source>
+ <translation>Detta är en lista över vanligt förekommande controllers.
+Observera att i MusE hanteras pitch och program change som
+vanliga controllers.</translation>
+ </message>
+ <message>
+ <source>Control7</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Control14</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation>Tonhöjd</translation>
+ </message>
+ <message>
+ <source>Program</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Midi Controller Number High Byte</source>
+ <translation>Midi Controllernummer Hög Byte</translation>
+ </message>
+ <message>
+ <source>Midi Controller Number Low Byte</source>
+ <translation>Midi Controllernummer Hög Byte</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation>OmrĂĄde</translation>
+ </message>
+</context>
+<context>
+ <name>MidiFileConfig</name>
+ <message>
+ <source>Config exported Midi Files</source>
+ <translation type="obsolete">Inställningar exporterade midifiler</translation>
+ </message>
+ <message>
+ <source>MusE: Config exported Midi Files</source>
+ <translation type="obsolete">MusE: Inställningar exporterade midifiler</translation>
+ </message>
+ <message>
+ <source>Enable extended smf format</source>
+ <translation type="obsolete">SlĂĄ pĂĄ utbyggt smf-format</translation>
+ </message>
+</context>
+<context>
+ <name>MidiFilterConfigBase</name>
+ <message>
+ <source>MusE: Midi Input Filter</source>
+ <translation type="obsolete">MusE: Midi Indatafilter</translation>
+ </message>
+ <message>
+ <source>Record Filter</source>
+ <translation type="obsolete">Indata Filter</translation>
+ </message>
+ <message>
+ <source>Note On</source>
+ <translation type="obsolete">Not PĂĄ</translation>
+ </message>
+ <message>
+ <source>Controller</source>
+ <translation type="obsolete">Controller</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>MidiInputTransformDialog</name>
+ <message>
+ <source>New</source>
+ <translation type="obsolete">Ny</translation>
+ </message>
+</context>
+<context>
+ <name>MidiInputTransformDialogBase</name>
+ <message>
+ <source>MusE: Midi Input Transformator</source>
+ <translation type="obsolete">MusE: Midi inputtransformator</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="obsolete">Filter</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="obsolete">Alla</translation>
+ </message>
+ <message>
+ <source>Equal</source>
+ <translation type="obsolete">Lika</translation>
+ </message>
+ <message>
+ <source>Unequal</source>
+ <translation type="obsolete">Ej lika</translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="obsolete">Not</translation>
+ </message>
+ <message>
+ <source>Value 2</source>
+ <translation type="obsolete">Värde 2</translation>
+ </message>
+ <message>
+ <source>Value 1</source>
+ <translation type="obsolete">Värde 1</translation>
+ </message>
+ <message>
+ <source>Event Type</source>
+ <translation type="obsolete">Händelsetyp</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="obsolete">Ignorera</translation>
+ </message>
+ <message>
+ <source>Higher</source>
+ <translation type="obsolete">Högre</translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="obsolete">Lägre</translation>
+ </message>
+ <message>
+ <source>Inside</source>
+ <translation type="obsolete">Innanför</translation>
+ </message>
+ <message>
+ <source>Outside</source>
+ <translation type="obsolete">Utanför</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="obsolete">Kanal</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="obsolete">Bearbetar</translation>
+ </message>
+ <message>
+ <source>Keep</source>
+ <translation type="obsolete">BehĂĄll</translation>
+ </message>
+ <message>
+ <source>Multiply</source>
+ <translation type="obsolete">Multiplicera</translation>
+ </message>
+ <message>
+ <source>Divide</source>
+ <translation type="obsolete">Dividera</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Invertera</translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation type="obsolete">Flippa</translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="obsolete">Slumpmässig</translation>
+ </message>
+ <message>
+ <source>Modules</source>
+ <translation type="obsolete">Moduler</translation>
+ </message>
+ <message>
+ <source>enable modul 1</source>
+ <translation type="obsolete">aktivera modul 1</translation>
+ </message>
+ <message>
+ <source>enable modul 2</source>
+ <translation type="obsolete">aktivera modul 2</translation>
+ </message>
+ <message>
+ <source>enable modul 3</source>
+ <translation type="obsolete">aktivera modul 3</translation>
+ </message>
+ <message>
+ <source>enable modul 4</source>
+ <translation type="obsolete">aktivera modul 4</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="obsolete">Namn:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="obsolete">Kommentar:</translation>
+ </message>
+ <message>
+ <source>Function</source>
+ <translation type="obsolete">Funktion</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Ny</translation>
+ </message>
+ <message>
+ <source>create new preset</source>
+ <translation type="obsolete">skapa nytt preset</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;Ta bort</translation>
+ </message>
+ <message>
+ <source>delete preset</source>
+ <translation type="obsolete">ta bort preset</translation>
+ </message>
+ <message>
+ <source>&amp;Dismiss</source>
+ <translation type="obsolete">&amp;Stäng</translation>
+ </message>
+ <message>
+ <source>PresetList</source>
+ <translation type="obsolete">Presetlista</translation>
+ </message>
+</context>
+<context>
+ <name>MidiPort</name>
+ <message>
+ <source>not configured</source>
+ <translation type="obsolete">ej konfigurerad</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="obsolete">okänd</translation>
+ </message>
+</context>
+<context>
+ <name>MidiPortRouteBase</name>
+ <message>
+ <source>MusE: Midi Port Routing</source>
+ <translation>MusE: Midi Port Routing</translation>
+ </message>
+ <message>
+ <source>Port 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiRawDeviceDialogBase</name>
+ <message>
+ <source>MusE: raw midi device configuration</source>
+ <translation type="obsolete">MusE: raw midienhets-inställningar</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="obsolete">Namn</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="obsolete">Typ</translation>
+ </message>
+ <message>
+ <source>Virt. Ports</source>
+ <translation type="obsolete">Virt. port</translation>
+ </message>
+ <message>
+ <source>Speed</source>
+ <translation type="obsolete">Hastighet</translation>
+ </message>
+ <message>
+ <source>Handshaking</source>
+ <translation type="obsolete">Handskakning</translation>
+ </message>
+ <message>
+ <source>Virt.Ports</source>
+ <translation type="obsolete">Virt.port</translation>
+ </message>
+ <message>
+ <source>Serial Port</source>
+ <translation type="obsolete">Serieport</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="obsolete">Ingen</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Ny</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;Ta bort</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="obsolete">&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="obsolete">&amp;Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>MidiStrip</name>
+ <message>
+ <source>off</source>
+ <translation type="obsolete">av</translation>
+ </message>
+ <message>
+ <source>mute</source>
+ <translation type="obsolete">tysta</translation>
+ </message>
+ <message>
+ <source>pre fader listening</source>
+ <translation type="obsolete">pre fader lyssning</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation type="obsolete">Av</translation>
+ </message>
+</context>
+<context>
+ <name>MidiSyncConfigBase</name>
+ <message>
+ <source>MusE: Midi Sync</source>
+ <translation type="unfinished">MusE: Midisync</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="unfinished">Master</translation>
+ </message>
+ <message>
+ <source>Slave</source>
+ <translation type="unfinished">Slav</translation>
+ </message>
+ <message>
+ <source>Sync Source</source>
+ <translation type="unfinished">Sync-källa</translation>
+ </message>
+ <message>
+ <source>all</source>
+ <translation type="obsolete">alla</translation>
+ </message>
+ <message>
+ <source>midi port</source>
+ <translation type="obsolete">midiport</translation>
+ </message>
+ <message>
+ <source>Midi Clock</source>
+ <translation type="unfinished">Midiklocka</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="unfinished">Verkställ</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Avbryt</translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation type="unfinished">Typ:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished">Offset:</translation>
+ </message>
+ <message>
+ <source>hour</source>
+ <translation type="unfinished">timma</translation>
+ </message>
+ <message>
+ <source>minute</source>
+ <translation type="unfinished">minut</translation>
+ </message>
+ <message>
+ <source>second</source>
+ <translation type="unfinished">sekund</translation>
+ </message>
+ <message>
+ <source>Sync Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>accept MTC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>accept Midi Clock</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>accept MMC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Id:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>device id</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sync Gen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Time Code (MTC)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Midi Machine Control (MMC)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation type="unfinished">Ok</translation>
+ </message>
+ <message>
+ <source>MTC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>24</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>25</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>30D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>30N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>h</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>frame</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>f</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>subframe</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTrackInfoBase</name>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished">MusE: SpĂĄrinfo</translation>
+ </message>
+ <message>
+ <source>output channel</source>
+ <translation type="obsolete">utgĂĄngskanal</translation>
+ </message>
+ <message>
+ <source>all midi events are send to this output channel</source>
+ <translation type="unfinished">alla midihändelser skickas till denna utkanal</translation>
+ </message>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished">SpĂĄrinfo</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished">SpĂĄrnamn</translation>
+ </message>
+ <message>
+ <source>output port</source>
+ <translation type="obsolete">utgĂĄngsport</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">av</translation>
+ </message>
+ <message>
+ <source>change stereo position</source>
+ <translation type="obsolete">byt stereoposition</translation>
+ </message>
+ <message>
+ <source>select instrument patch</source>
+ <translation type="obsolete">välj instrumentpatch</translation>
+ </message>
+ <message>
+ <source>Volume</source>
+ <translation type="obsolete">Volym</translation>
+ </message>
+ <message>
+ <source>Channel Info</source>
+ <translation type="unfinished">Kanalinfo</translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Hastighet</translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished">Längd</translation>
+ </message>
+ <message>
+ <source>input ports</source>
+ <translation type="obsolete">inputportar</translation>
+ </message>
+ <message>
+ <source>input channels</source>
+ <translation type="obsolete">inputkanaler</translation>
+ </message>
+ <message>
+ <source>Events from all configured channels are
+recorded to this track.
+You can specify more than one channel for
+recording:
+ 1 2 3 record from channel 1 2 and 3
+ 1-3 same
+ 1-3 5<byte value="x9"/> record from channel 1 2 3 and 5</source>
+ <translation type="unfinished">Händelser från alla konfigurerade kanaler
+spelas in pĂĄ detta spĂĄr
+Du kan specificera mer än en kanal för
+inspelning:
+ 1 2 3 spela in pĂĄ kanal 1 2 och 3
+ 1-3 samma
+ 1-3 5 spela in pĂĄ kanal 1 2 3 och 5</translation>
+ </message>
+ <message>
+ <source>Output Channel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Note Length</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Output Port</source>
+ <translation type="unfinished">UtgĂĄngsport</translation>
+ </message>
+ <message>
+ <source>OCh.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Compress Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Transpose</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transp.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Compr.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify Note Velocity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Ports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>IChan.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Input Channels</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>???</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select Instrument Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select LSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bank Select MSB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>H-Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument High Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>L-Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument Low Bank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Progr.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instrument/Program/Patch</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformDialogBase</name>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Ny</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Ta bort</translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished">&amp;Verkställ</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Processing</source>
+ <translation type="unfinished">Bearbetar</translation>
+ </message>
+ <message>
+ <source>Event Type</source>
+ <translation type="unfinished">Händelsetyp</translation>
+ </message>
+ <message>
+ <source>Keep</source>
+ <translation type="unfinished">BehĂĄll</translation>
+ </message>
+ <message>
+ <source>Note</source>
+ <translation type="unfinished">Not</translation>
+ </message>
+ <message>
+ <source>Multiply</source>
+ <translation type="unfinished">Multiplicera</translation>
+ </message>
+ <message>
+ <source>Value 2</source>
+ <translation type="unfinished">Värde 2</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="unfinished">Invertera</translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="unfinished">Slumpmässig</translation>
+ </message>
+ <message>
+ <source>Value 1</source>
+ <translation type="unfinished">Värde 1</translation>
+ </message>
+ <message>
+ <source>Length</source>
+ <translation type="unfinished">Längd</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="unfinished">Filter</translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation type="unfinished">Alla</translation>
+ </message>
+ <message>
+ <source>Equal</source>
+ <translation type="unfinished">Lika</translation>
+ </message>
+ <message>
+ <source>Unequal</source>
+ <translation type="unfinished">Ej lika</translation>
+ </message>
+ <message>
+ <source>Ignore</source>
+ <translation type="unfinished">Ignorera</translation>
+ </message>
+ <message>
+ <source>Higher</source>
+ <translation type="unfinished">Högre</translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="unfinished">Lägre</translation>
+ </message>
+ <message>
+ <source>Inside</source>
+ <translation type="unfinished">Innanför</translation>
+ </message>
+ <message>
+ <source>Outside</source>
+ <translation type="unfinished">Utanför</translation>
+ </message>
+ <message>
+ <source>Bar Range</source>
+ <translation type="unfinished">Takt OmrĂĄde</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">Namn:</translation>
+ </message>
+ <message>
+ <source>Comment:</source>
+ <translation type="unfinished">Kommentar:</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">OmrĂĄde</translation>
+ </message>
+ <message>
+ <source>process all events</source>
+ <translation type="unfinished">bearbeta alla händelser</translation>
+ </message>
+ <message>
+ <source>selected tracks</source>
+ <translation type="unfinished">valda spĂĄr</translation>
+ </message>
+ <message>
+ <source>inside loop</source>
+ <translation type="unfinished">I loop</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation type="unfinished">Välj</translation>
+ </message>
+ <message>
+ <source>Quantize</source>
+ <translation type="unfinished">Kvantisera</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished">Ta bort</translation>
+ </message>
+ <message>
+ <source>Transform</source>
+ <translation type="unfinished">Transformera</translation>
+ </message>
+ <message>
+ <source>Insert</source>
+ <translation type="unfinished">Sätt in</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished">Kopiera</translation>
+ </message>
+ <message>
+ <source>Quantize Value</source>
+ <translation type="unfinished">Kvantisera värde</translation>
+ </message>
+ <message>
+ <source>MusE: Midi Transformator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>PresetList</source>
+ <translation type="unfinished">Presetlista</translation>
+ </message>
+ <message>
+ <source>Fix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Poly Pressure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Control Change</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Aftertouch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pitch Bend</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NRPN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RPN</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Plus</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minus</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Divide</source>
+ <translation type="unfinished">Dividera</translation>
+ </message>
+ <message>
+ <source>ScaleMap</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Flip</source>
+ <translation type="unfinished">Flippa</translation>
+ </message>
+ <message>
+ <source>Dyn</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sysex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Meta</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Function</source>
+ <translation type="unfinished">Funktion</translation>
+ </message>
+ <message>
+ <source>Extract</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MidiTransformerDialog</name>
+ <message>
+ <source>New</source>
+ <translation>Ny</translation>
+ </message>
+</context>
+<context>
+ <name>MixdownFileDialog</name>
+ <message>
+ <source>Wave Files (*.wav);;All Files (*)</source>
+ <translation type="obsolete">Wavefiler (*.wav;;All FIles (*)</translation>
+ </message>
+</context>
+<context>
+ <name>MixdownFileDialogBase</name>
+ <message>
+ <source>MusE: Set Mixdown Wavefile</source>
+ <translation type="unfinished">MusE: Välj mixdown-ljudfil</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;Ok</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>File Path</source>
+ <translation type="unfinished">Sökväg till fil</translation>
+ </message>
+ <message>
+ <source>Channel</source>
+ <translation type="unfinished">Kanal</translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>5.1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wav,16 Bit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wav, 24 Bit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>wav, 32 Bit (float)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Format</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Mixer</name>
+ <message>
+ <source>MusE: Midi Mixer</source>
+ <translation type="obsolete">MusE: Midimixer</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Master</translation>
+ </message>
+</context>
+<context>
+ <name>MusE</name>
+ <message>
+ <source>to import a audio file you have first to selecta audio track</source>
+ <translation type="obsolete">för att importera en ljudfil måste du ha valt ett ljudspår</translation>
+ </message>
+ <message>
+ <source>Import Wave File</source>
+ <translation>Importera ljudfil</translation>
+ </message>
+ <message>
+ <source>UndoRedo</source>
+ <translation>ÅngraGörom</translation>
+ </message>
+ <message>
+ <source>undo</source>
+ <translation>ĂĄngra</translation>
+ </message>
+ <message>
+ <source>Und&amp;o</source>
+ <translation>&amp;Ă…ngra</translation>
+ </message>
+ <message>
+ <source>redo</source>
+ <translation>gör om</translation>
+ </message>
+ <message>
+ <source>Re&amp;do</source>
+ <translation>&amp;Gör om</translation>
+ </message>
+ <message>
+ <source>undo last change to song</source>
+ <translation>ångra sista ändring i sång</translation>
+ </message>
+ <message>
+ <source>redo last undo</source>
+ <translation>gör om sista ångring</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Punchin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Punchout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>start</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Start</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation>flytta tillbaka</translation>
+ </message>
+ <message>
+ <source>Rewind</source>
+ <translation>Spola tillbaka</translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation>framĂĄt</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>FramĂĄt</translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation>stopp</translation>
+ </message>
+ <message>
+ <source>Stop</source>
+ <translation>Stopp</translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation>spela</translation>
+ </message>
+ <message>
+ <source>Play</source>
+ <translation>Spela</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation>spela in</translation>
+ </message>
+ <message>
+ <source>Record</source>
+ <translation>Spela in</translation>
+ </message>
+ <message>
+ <source>panic</source>
+ <translation>panik</translation>
+ </message>
+ <message>
+ <source>Panic</source>
+ <translation>Panik</translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation>ny</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Ny</translation>
+ </message>
+ <message>
+ <source>open</source>
+ <translation>öppna</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Ă–ppna</translation>
+ </message>
+ <message>
+ <source>save</source>
+ <translation>spara</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation>&amp;Spara</translation>
+ </message>
+ <message>
+ <source>pianoroll</source>
+ <translation>pianorulle</translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation>Pianorulle</translation>
+ </message>
+ <message>
+ <source>score</source>
+ <translation type="obsolete">partitur</translation>
+ </message>
+ <message>
+ <source>Score</source>
+ <translation type="obsolete">Partitur</translation>
+ </message>
+ <message>
+ <source>marker</source>
+ <translation type="obsolete">markör</translation>
+ </message>
+ <message>
+ <source>Marker</source>
+ <translation>Markör</translation>
+ </message>
+ <message>
+ <source>File Buttons</source>
+ <translation>Arkivknappar</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Arkiv</translation>
+ </message>
+ <message>
+ <source>Open &amp;Recent</source>
+ <translation>&amp;Nyligen öppnade</translation>
+ </message>
+ <message>
+ <source>Save &amp;As</source>
+ <translation>S&amp;para som</translation>
+ </message>
+ <message>
+ <source>Config &amp;Printer</source>
+ <translation type="obsolete">&amp;Konfigurera skrivare</translation>
+ </message>
+ <message>
+ <source>Import Midifile</source>
+ <translation>Importera midifil</translation>
+ </message>
+ <message>
+ <source>Export Midifile</source>
+ <translation>Exportera midifil</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>A&amp;vsluta</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>C&amp;ut</source>
+ <translation>Klipp &amp;ut</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Kopiera</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>K&amp;listra in</translation>
+ </message>
+ <message>
+ <source>Delete Track</source>
+ <translation type="obsolete">Ta bort spĂĄr</translation>
+ </message>
+ <message>
+ <source>Add Track</source>
+ <translation>Lägg Till Spår</translation>
+ </message>
+ <message>
+ <source>Select &amp;All</source>
+ <translation>Markera &amp;Allt</translation>
+ </message>
+ <message>
+ <source>&amp;Deselect All</source>
+ <translation>A&amp;vmarkera Allt</translation>
+ </message>
+ <message>
+ <source>Invert &amp;Selection</source>
+ <translation>Invertera &amp;Markering</translation>
+ </message>
+ <message>
+ <source>&amp;Inside Loop</source>
+ <translation>&amp;I Loop</translation>
+ </message>
+ <message>
+ <source>&amp;Outside Loop</source>
+ <translation>&amp;Utanför Loop</translation>
+ </message>
+ <message>
+ <source>All &amp;Parts on Track</source>
+ <translation>Alla &amp;Parter i spĂĄr</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>Välj</translation>
+ </message>
+ <message>
+ <source>Drums</source>
+ <translation>Trummor</translation>
+ </message>
+ <message>
+ <source>List</source>
+ <translation>Lista</translation>
+ </message>
+ <message>
+ <source>Graphic</source>
+ <translation>Grafik</translation>
+ </message>
+ <message>
+ <source>Mastertrack</source>
+ <translation>MasterspĂĄr</translation>
+ </message>
+ <message>
+ <source>Midi &amp;Transform</source>
+ <translation>Midi &amp;Transform</translation>
+ </message>
+ <message>
+ <source>Modify Gate Time</source>
+ <translation>Modifiera Gate Time</translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation>Modifiera Velocity</translation>
+ </message>
+ <message>
+ <source>Crescendo</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation>Transponera</translation>
+ </message>
+ <message>
+ <source>Thin Out</source>
+ <translation>Tunna ut</translation>
+ </message>
+ <message>
+ <source>Erase Event</source>
+ <translation>Ta bort Händelse</translation>
+ </message>
+ <message>
+ <source>Note Shift</source>
+ <translation>Shifta Not</translation>
+ </message>
+ <message>
+ <source>Move Clock</source>
+ <translation>Flytta Klocka</translation>
+ </message>
+ <message>
+ <source>Copy Measure</source>
+ <translation>Kopiera Takt</translation>
+ </message>
+ <message>
+ <source>Erase Measure</source>
+ <translation>Radera Takt</translation>
+ </message>
+ <message>
+ <source>Delete Measure</source>
+ <translation>Ta bort Takt</translation>
+ </message>
+ <message>
+ <source>Create Measure</source>
+ <translation>Skapa Takt</translation>
+ </message>
+ <message>
+ <source>Mix Track</source>
+ <translation>Mixa SpĂĄr</translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation>Midi</translation>
+ </message>
+ <message>
+ <source>&amp;Structure</source>
+ <translation>&amp;Struktur</translation>
+ </message>
+ <message>
+ <source>Global Cut</source>
+ <translation>Globalt klipp</translation>
+ </message>
+ <message>
+ <source>Global Insert</source>
+ <translation>Global insättning</translation>
+ </message>
+ <message>
+ <source>Global Split</source>
+ <translation>Global delning</translation>
+ </message>
+ <message>
+ <source>Copy Range</source>
+ <translation>Kopiera OmrĂĄde</translation>
+ </message>
+ <message>
+ <source>Cut Events</source>
+ <translation>Klipp ut Händelse</translation>
+ </message>
+ <message>
+ <source>Transport Panel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bigtime window</source>
+ <translation>Bigtime fönster</translation>
+ </message>
+ <message>
+ <source>dont follow Song</source>
+ <translation>följ inte Sång</translation>
+ </message>
+ <message>
+ <source>follow page</source>
+ <translation>följ sida</translation>
+ </message>
+ <message>
+ <source>follow continuous</source>
+ <translation>följ kontinuerligt</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Inställningar</translation>
+ </message>
+ <message>
+ <source>Global Settings</source>
+ <translation>Globala Inställningar</translation>
+ </message>
+ <message>
+ <source>follow song</source>
+ <translation>följ sång</translation>
+ </message>
+ <message>
+ <source>Metronome</source>
+ <translation type="obsolete">Metronom</translation>
+ </message>
+ <message>
+ <source>Midi Sync</source>
+ <translation>Midi Synk</translation>
+ </message>
+ <message>
+ <source>Midi File Config</source>
+ <translation type="obsolete">Midi Filkonfigurering</translation>
+ </message>
+ <message>
+ <source>Appearance settings</source>
+ <translation>Utseende inställningar</translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation type="obsolete">Mjukvarusynthar</translation>
+ </message>
+ <message>
+ <source>Midi Ports</source>
+ <translation type="obsolete">Midiportar</translation>
+ </message>
+ <message>
+ <source>Audio System</source>
+ <translation type="obsolete">Audiosubsystem</translation>
+ </message>
+ <message>
+ <source>Save Configuration</source>
+ <translation type="obsolete">Spara Inställningar</translation>
+ </message>
+ <message>
+ <source>Midi Input Filter</source>
+ <translation type="obsolete">Midi Indatafilter</translation>
+ </message>
+ <message>
+ <source>Midi Remote Control</source>
+ <translation>Midi-fjärrkontroll</translation>
+ </message>
+ <message>
+ <source>Random Rhythm Generator</source>
+ <translation type="obsolete">Slumprytmgenerator</translation>
+ </message>
+ <message>
+ <source>&amp;Midi</source>
+ <translation>&amp;Midi</translation>
+ </message>
+ <message>
+ <source>Mixer</source>
+ <translation type="obsolete">Mixer</translation>
+ </message>
+ <message>
+ <source>Define Controller</source>
+ <translation type="obsolete">Definiera Controller</translation>
+ </message>
+ <message>
+ <source>Input Plugins</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Reset Instr.</source>
+ <translation>Resetta Instr.</translation>
+ </message>
+ <message>
+ <source>Init Instr.</source>
+ <translation>Initiera instr.</translation>
+ </message>
+ <message>
+ <source>local off</source>
+ <translation>lokal av</translation>
+ </message>
+ <message>
+ <source>&amp;Audio</source>
+ <translation>Au&amp;dio</translation>
+ </message>
+ <message>
+ <source>Bounce to Track</source>
+ <translation>Bounce till SpĂĄr</translation>
+ </message>
+ <message>
+ <source>Bounce to File</source>
+ <translation>Bounce till Fil</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Hjälp</translation>
+ </message>
+ <message>
+ <source>Browser</source>
+ <translation type="obsolete">Läsare</translation>
+ </message>
+ <message>
+ <source>&amp;About</source>
+ <translation type="obsolete">&amp;Om</translation>
+ </message>
+ <message>
+ <source>About&amp;Qt</source>
+ <translation>Om &amp;Qt</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This</source>
+ <translation type="obsolete">Vad är &amp;Detta</translation>
+ </message>
+ <message>
+ <source>Unknown File Format</source>
+ <translation>Okänt filformat</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="obsolete">inget</translation>
+ </message>
+ <message>
+ <source>MusE: load project</source>
+ <translation>MusE: Ă–ppna projekt</translation>
+ </message>
+ <message>
+ <source>MusE: Write File failed</source>
+ <translation>MusE: Misslyckades med att skriva Fil</translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Save Current Project?</source>
+ <translation>Det nuvarande Projektet innehåller osparade ändringar
+Spara nuvarande Projekt?</translation>
+ </message>
+ <message>
+ <source>&amp;Nosave</source>
+ <translation type="unfinished">Spara &amp;inte</translation>
+ </message>
+ <message>
+ <source>&amp;Abort</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>MusE: About</source>
+ <translation type="obsolete">MusE: Om</translation>
+ </message>
+ <message>
+ <source>MusE: Save As</source>
+ <translation>MusE: Spara Som</translation>
+ </message>
+ <message>
+ <source>MusE: Song: </source>
+ <translation>MusE: SĂĄng:</translation>
+ </message>
+ <message>
+ <source>MusE: Import Midi</source>
+ <translation>MusE: Importera Midi</translation>
+ </message>
+ <message>
+ <source>MusE: Export Midi</source>
+ <translation>MusE: Exportera Midi</translation>
+ </message>
+ <message>
+ <source>reading midifile
+ </source>
+ <translation>läser midifil</translation>
+ </message>
+ <message>
+ <source>
+failed</source>
+ <translation type="obsolete">misslyckades</translation>
+ </message>
+ <message>
+ <source>Nothing to edit</source>
+ <translation>Inget att redigera</translation>
+ </message>
+ <message>
+ <source>MusE: Copy Range</source>
+ <translation>MusE: Kopiera omrĂĄde</translation>
+ </message>
+ <message>
+ <source>not implemented</source>
+ <translation>ej implementerat</translation>
+ </message>
+ <message>
+ <source>MusE: Cut Events</source>
+ <translation>MusE: Klipp ut Händelse</translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to Track</source>
+ <translation>MusE: Bounce till SpĂĄr</translation>
+ </message>
+ <message>
+ <source>more than one target track selected</source>
+ <translation>mer än ett spår valt som mål</translation>
+ </message>
+ <message>
+ <source>wrong target track type,
+select wave track as target</source>
+ <translation>fel spĂĄrtyp som mĂĄl
+välj wave-spår som mål</translation>
+ </message>
+ <message>
+ <source>no target track selected</source>
+ <translation>inget spĂĄr valt som mĂĄl</translation>
+ </message>
+ <message>
+ <source>The current Project contains unsaved data
+Load overwrites current Project:
+Save Current Project?</source>
+ <translation>Det nuvarande Projektet innehåller osparade ändringar
+Öppning ersätter nuvarande Projekt
+Spara nuvarande Projekt?</translation>
+ </message>
+ <message>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished">&amp;Ersätt</translation>
+ </message>
+ <message>
+ <source>no help found at: </source>
+ <translation>ingen h jälp hittad vid:</translation>
+ </message>
+ <message>
+ <source>MusE: Open Help</source>
+ <translation>Muse: Arkiv hjälp</translation>
+ </message>
+ <message>
+ <source>Delete Selected Tracks</source>
+ <translation>Ta Bort Valda SpĂĄr</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation type="obsolete">Vy</translation>
+ </message>
+ <message>
+ <source>Edit Instrument</source>
+ <translation>Editera Instrument</translation>
+ </message>
+ <message>
+ <source>Restart Audio</source>
+ <translation type="obsolete">Starta om Audio</translation>
+ </message>
+ <message>
+ <source>Take Snapshot</source>
+ <translation type="obsolete">Ta Ă–gonblicksbild</translation>
+ </message>
+ <message>
+ <source>Clear Automation Data</source>
+ <translation type="obsolete">Rensa Automationsdata</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="obsolete">Inställningar</translation>
+ </message>
+ <message>
+ <source>Configure shortcuts</source>
+ <translation>Konfigurera Tangentbordsgenvägar</translation>
+ </message>
+ <message>
+ <source>Midi File Export</source>
+ <translation>Midi Fil Export</translation>
+ </message>
+ <message>
+ <source>Midi Ports / Soft Synth</source>
+ <translation type="obsolete">Midiportar / Mjukvarusynthar</translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation>&amp;Manual</translation>
+ </message>
+ <message>
+ <source>&amp;MusE homepage</source>
+ <translation>&amp;MusE hemsida</translation>
+ </message>
+ <message>
+ <source>&amp;Report Bug...</source>
+ <translation>&amp;Rapportera Bugg...</translation>
+ </message>
+ <message>
+ <source>&amp;About MusE</source>
+ <translation>&amp;Om MusE</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation>Vad är de&amp;t här?</translation>
+ </message>
+ <message>
+ <source>Cannot read template</source>
+ <translation>Kan inte läsa mall</translation>
+ </message>
+ <message>
+ <source>File open error</source>
+ <translation>Fel vid öppning av fil</translation>
+ </message>
+ <message>
+ <source>File read error</source>
+ <translation>Fel vid läsning av fil</translation>
+ </message>
+ <message>
+ <source>MusE: load template</source>
+ <translation>MusE: ladda mall</translation>
+ </message>
+ <message>
+ <source>MusE: Bounce</source>
+ <translation>MusE: Mixa Ner</translation>
+ </message>
+ <message>
+ <source>set left/right marker for bounce range</source>
+ <translation>sätt vänster/höger markör för nedmixningsområde</translation>
+ </message>
+ <message>
+ <source>MusE: Bounce to File</source>
+ <translation>MusE: Mixa Ner till Fil</translation>
+ </message>
+ <message>
+ <source>no output track found</source>
+ <translation>inget utmatningsspĂĄr kunde hittas</translation>
+ </message>
+ <message>
+ <source>Add midi file to current project?
+</source>
+ <translation>Lägg till midifil i nuvarande projekt?
+</translation>
+ </message>
+ <message>
+ <source>&amp;Add to Project</source>
+ <translation>&amp;Lägg till i Projekt</translation>
+ </message>
+ <message>
+ <source>&amp;Replace</source>
+ <translation>E&amp;rsätt</translation>
+ </message>
+ <message>
+ <source>
+failed: </source>
+ <translation>
+misslyckades:</translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation>Arrangerare</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation>Markör</translation>
+ </message>
+ <message>
+ <source>Off</source>
+ <translation>Av</translation>
+ </message>
+ <message>
+ <source>Bar</source>
+ <translation>Takt</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation>Fäst vid</translation>
+ </message>
+ <message>
+ <source>Len</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation>Tonhöjd</translation>
+ </message>
+ <message>
+ <source>midi pitch</source>
+ <translation>midi tonhöjd</translation>
+ </message>
+ <message>
+ <source>global midi pitch shift</source>
+ <translation>global midi tonhöjdsförändring</translation>
+ </message>
+ <message>
+ <source>Tempo</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>midi tempo</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>N</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>MusE: Create tmp file failed</source>
+ <translation>MusE: Skapande av temporär fil misslyckades</translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation>&amp;Vy</translation>
+ </message>
+ <message>
+ <source>Au&amp;tomation</source>
+ <translation type="obsolete">Au&amp;tomation</translation>
+ </message>
+ <message>
+ <source>Setti&amp;ngs</source>
+ <translation>I&amp;nställningar</translation>
+ </message>
+ <message>
+ <source>Mixer 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mixer 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NoteInfo</name>
+ <message>
+ <source>Note Info</source>
+ <translation type="obsolete">Notinfo</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tonhöjd</translation>
+ </message>
+</context>
+<context>
+ <name>OrganGuiBase</name>
+ <message>
+ <source>Presets</source>
+ <translation type="obsolete">Preset</translation>
+ </message>
+ <message>
+ <source>load preset list</source>
+ <translation type="obsolete">öppna presetlista</translation>
+ </message>
+ <message>
+ <source>save preset list</source>
+ <translation type="obsolete">spara presetlista</translation>
+ </message>
+ <message>
+ <source>MusE: Organ</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawbars</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>16&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>4&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2 2/3&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>5 1/3&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>8&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Hi</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sustain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Decay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>cB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Envelope Lo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>O-1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Oscillator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Brass</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Flute</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Velocity</source>
+ <translation type="unfinished">Hastighet</translation>
+ </message>
+</context>
+<context>
+ <name>PageSettings</name>
+ <message>
+ <source>Paper Size</source>
+ <translation type="obsolete">Pappersstorlek</translation>
+ </message>
+ <message>
+ <source>user</source>
+ <translation type="obsolete">användare</translation>
+ </message>
+ <message>
+ <source>Margins</source>
+ <translation type="obsolete">Marginal</translation>
+ </message>
+ <message>
+ <source>left Margin</source>
+ <translation type="obsolete">vänster Marginal</translation>
+ </message>
+ <message>
+ <source>top Margin</source>
+ <translation type="obsolete">övre Marginal</translation>
+ </message>
+ <message>
+ <source>right Margin</source>
+ <translation type="obsolete">höger Marginal</translation>
+ </message>
+ <message>
+ <source>bottom Margin</source>
+ <translation type="obsolete">undre Marginal</translation>
+ </message>
+ <message>
+ <source>Header</source>
+ <translation type="obsolete">Ă–verskrift</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation type="obsolete">Titel</translation>
+ </message>
+ <message>
+ <source>Author</source>
+ <translation type="obsolete">Författare</translation>
+ </message>
+ <message>
+ <source>Fonts</source>
+ <translation type="obsolete">Typsnitt</translation>
+ </message>
+ <message>
+ <source>Page No.</source>
+ <translation type="obsolete">Sidnummer.</translation>
+ </message>
+ <message>
+ <source>Measure No</source>
+ <translation type="obsolete">Taktnummer</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="obsolete">SpĂĄrnamn</translation>
+ </message>
+ <message>
+ <source>Lyrics</source>
+ <translation type="obsolete">Text</translation>
+ </message>
+ <message>
+ <source>Layout</source>
+ <translation type="obsolete">Utseende</translation>
+ </message>
+ <message>
+ <source>Bars across the Page</source>
+ <translation type="obsolete">Takter över sidan</translation>
+ </message>
+ <message>
+ <source>Scale</source>
+ <translation type="obsolete">Skala</translation>
+ </message>
+ <message>
+ <source>Flags</source>
+ <translation type="obsolete">Flaggor</translation>
+ </message>
+ <message>
+ <source>show page no.</source>
+ <translation type="obsolete">visa sida nr.</translation>
+ </message>
+ <message>
+ <source>show measure no.</source>
+ <translation type="obsolete">visa takt nr.</translation>
+ </message>
+ <message>
+ <source>show track name</source>
+ <translation type="obsolete">visa spĂĄrnamn</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="obsolete">Verkställ</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>PartCanvas</name>
+ <message>
+ <source>Cannot copy/move/clone to different Track-Type</source>
+ <translation type="obsolete">Kan inte kopiera/flytta/klona till annan SpĂĄrtyp</translation>
+ </message>
+ <message>
+ <source>C&amp;ut</source>
+ <translation type="obsolete">Klipp &amp;ut</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="obsolete">&amp;Kopiera</translation>
+ </message>
+ <message>
+ <source>rename</source>
+ <translation type="obsolete">byt namn</translation>
+ </message>
+ <message>
+ <source>color</source>
+ <translation type="obsolete">färg</translation>
+ </message>
+ <message>
+ <source>delete</source>
+ <translation type="obsolete">ta bort</translation>
+ </message>
+ <message>
+ <source>split</source>
+ <translation type="obsolete">dela</translation>
+ </message>
+ <message>
+ <source>glue</source>
+ <translation type="obsolete">lim</translation>
+ </message>
+ <message>
+ <source>de-clone</source>
+ <translation type="obsolete">häv kloning</translation>
+ </message>
+ <message>
+ <source>pianoroll</source>
+ <translation type="obsolete">pianorulle</translation>
+ </message>
+ <message>
+ <source>score</source>
+ <translation type="obsolete">partitur</translation>
+ </message>
+ <message>
+ <source>list</source>
+ <translation type="obsolete">lista</translation>
+ </message>
+ <message>
+ <source>drums</source>
+ <translation type="obsolete">trummor</translation>
+ </message>
+ <message>
+ <source>wave edit</source>
+ <translation type="obsolete">wave redigering</translation>
+ </message>
+ <message>
+ <source>Cannot paste: multiple tracks selected</source>
+ <translation type="obsolete">Kan inte klistra in: flera spĂĄr valda</translation>
+ </message>
+ <message>
+ <source>Cannot paste: no track selected</source>
+ <translation type="obsolete">Kan inte klistra in: inget spĂĄr valt</translation>
+ </message>
+ <message>
+ <source>Cannot paste midi parts to wave track</source>
+ <translation type="obsolete">Kan inte klistra in midipart till wavespĂĄr</translation>
+ </message>
+ <message>
+ <source>Cannot paste wave parts to midi track</source>
+ <translation type="obsolete">Kan inte klistra in wavepart pĂĄ midispĂĄr</translation>
+ </message>
+ <message>
+ <source>Cannot paste: wrong data type</source>
+ <translation type="obsolete">Kan inte klistra in: fel datatyp</translation>
+ </message>
+</context>
+<context>
+ <name>PatchBayBase</name>
+ <message>
+ <source>ALSA Patch Bay</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>PianoRoll</name>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Klipp ut</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Kopiera</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Klistra in</translation>
+ </message>
+ <message>
+ <source>Delete Events</source>
+ <translation type="obsolete">Ta bort Händelser</translation>
+ </message>
+ <message>
+ <source>Select All</source>
+ <translation type="obsolete">Välj Allt</translation>
+ </message>
+ <message>
+ <source>Select None</source>
+ <translation type="obsolete">Välj Ingen</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Invertera</translation>
+ </message>
+ <message>
+ <source>Inside Loop</source>
+ <translation type="obsolete">I loop</translation>
+ </message>
+ <message>
+ <source>Outside Loop</source>
+ <translation type="obsolete">Utanför loop</translation>
+ </message>
+ <message>
+ <source>&amp;Select</source>
+ <translation type="obsolete">&amp;Välj</translation>
+ </message>
+ <message>
+ <source>blue</source>
+ <translation type="obsolete">blĂĄ</translation>
+ </message>
+ <message>
+ <source>pitch colors</source>
+ <translation type="obsolete">pitchfärger</translation>
+ </message>
+ <message>
+ <source>velocity colors</source>
+ <translation type="obsolete">velocityfärger</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Inställningar</translation>
+ </message>
+ <message>
+ <source>event color</source>
+ <translation type="obsolete">händelsefärg</translation>
+ </message>
+ <message>
+ <source>&amp;Functions</source>
+ <translation type="obsolete">&amp;Funktioner</translation>
+ </message>
+ <message>
+ <source>Over Quantize</source>
+ <translation type="obsolete">Ă–ver Kvantisera</translation>
+ </message>
+ <message>
+ <source>Note On Quantize</source>
+ <translation type="obsolete">Note On-kvantisera</translation>
+ </message>
+ <message>
+ <source>Note On/Off Quantize</source>
+ <translation type="obsolete">Note On/Off Kvantisera</translation>
+ </message>
+ <message>
+ <source>Iterative Quantize</source>
+ <translation type="obsolete">Iterativ kvantisering</translation>
+ </message>
+ <message>
+ <source>Config Quant...</source>
+ <translation type="obsolete">Konfigurera Kvant...</translation>
+ </message>
+ <message>
+ <source>Modify Gate Time</source>
+ <translation type="obsolete">Modifiera Gate Time</translation>
+ </message>
+ <message>
+ <source>Modify Velocity</source>
+ <translation type="obsolete">Modifiera Velocity</translation>
+ </message>
+ <message>
+ <source>Transpose</source>
+ <translation type="obsolete">Transponera</translation>
+ </message>
+ <message>
+ <source>Thin Out</source>
+ <translation type="obsolete">Tunna ut</translation>
+ </message>
+ <message>
+ <source>Erase Event</source>
+ <translation type="obsolete">Ta bort Händelse</translation>
+ </message>
+ <message>
+ <source>Note Shift</source>
+ <translation type="obsolete">Shifta Not</translation>
+ </message>
+ <message>
+ <source>Move Clock</source>
+ <translation type="obsolete">Flytta Klocka</translation>
+ </message>
+ <message>
+ <source>Copy Measure</source>
+ <translation type="obsolete">Kopiera Takt</translation>
+ </message>
+ <message>
+ <source>Erase Measure</source>
+ <translation type="obsolete">Radera Takt</translation>
+ </message>
+ <message>
+ <source>Delete Measure</source>
+ <translation type="obsolete">Ta bort Takt</translation>
+ </message>
+ <message>
+ <source>Create Measure</source>
+ <translation type="obsolete">Skapa Takt</translation>
+ </message>
+ <message>
+ <source>Pianoroll Tools</source>
+ <translation type="obsolete">Verktyg Pianorulle</translation>
+ </message>
+ <message>
+ <source>Step Record</source>
+ <translation type="obsolete">Stegvis inspelning</translation>
+ </message>
+ <message>
+ <source>Play Events</source>
+ <translation type="obsolete">Spela Händelser</translation>
+ </message>
+ <message>
+ <source>Add Controller View</source>
+ <translation type="obsolete">Lägg till Controller Vy</translation>
+ </message>
+</context>
+<context>
+ <name>PluginDialog</name>
+ <message>
+ <source>MusE: select plugin</source>
+ <translation>MusE: välj plugin</translation>
+ </message>
+ <message>
+ <source>Lib</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation>Etikett</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Namn</translation>
+ </message>
+ <message>
+ <source>AI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CO</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>IP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>id</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maker</source>
+ <translation>Upphovsman</translation>
+ </message>
+ <message>
+ <source>Copyright</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ok</source>
+ <translation>Ok</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Avbryt</translation>
+ </message>
+ <message>
+ <source>Select which types of plugins should be visible in the list,&lt;br&gt;beware that &apos;all&apos; includes plugins that probably are not usable by MusE.</source>
+ <translation type="obsolete">Välj vilka typer av plugins som ska vara synliga i lista,&lt;br&gt;Observera att &apos;alla&apos; inkluderar plugins som möljigtvis inte är användbara i MusE.</translation>
+ </message>
+ <message>
+ <source>Stereo and Mono</source>
+ <translation>Stereo och Mono</translation>
+ </message>
+ <message>
+ <source>Stereo</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Mono</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>All</source>
+ <translation>Alla</translation>
+ </message>
+ <message>
+ <source>Select which types of plugins should be visible in the list.&lt;br&gt;Note that using mono plugins on stereo tracks is not a problem, two will be used in parallell.&lt;br&gt;Also beware that the &apos;all&apos; alternative includes plugins that probably not are usable by MusE.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PluginGui</name>
+ <message>
+ <source>File Buttons</source>
+ <translation>Arkiv Knappar</translation>
+ </message>
+ <message>
+ <source>Load Preset</source>
+ <translation>Ă–ppna Preset</translation>
+ </message>
+ <message>
+ <source>Save Preset</source>
+ <translation>Spara Preset</translation>
+ </message>
+ <message>
+ <source>bypass plugin</source>
+ <translation>koppla ur plugin</translation>
+ </message>
+ <message>
+ <source>MusE: load preset</source>
+ <translation>MusE: öppna preset</translation>
+ </message>
+ <message>
+ <source>MusE: save preset</source>
+ <translation>MusE: spara preset</translation>
+ </message>
+</context>
+<context>
+ <name>PrinterConfig</name>
+ <message>
+ <source>MusE: Config Printer</source>
+ <translation type="obsolete">MusE: Konfigurera Skrivare</translation>
+ </message>
+ <message>
+ <source>Print to file</source>
+ <translation type="obsolete">Skriv till fil</translation>
+ </message>
+ <message>
+ <source>Print Command</source>
+ <translation type="obsolete">Utskriftskommando</translation>
+ </message>
+ <message>
+ <source>Preview Command</source>
+ <translation type="obsolete">Förhandsgranskningskommando</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>QHeader</name>
+ <message>
+ <source>Port Number</source>
+ <translation type="obsolete">Portnummer</translation>
+ </message>
+ <message>
+ <source>enable gui for device</source>
+ <translation type="obsolete">visa gui för enhet</translation>
+ </message>
+ <message>
+ <source>enables recording from the device</source>
+ <translation type="obsolete">slĂĄ pĂĄ inspelning frĂĄn enhet</translation>
+ </message>
+ <message>
+ <source>Name of the midi device associated with this port number</source>
+ <translation type="obsolete">Namn pĂĄ midienhet associerad med detta portnummer</translation>
+ </message>
+ <message>
+ <source>Instrument connected to port</source>
+ <translation type="obsolete">Instrument kopplat till denna port</translation>
+ </message>
+ <message>
+ <source>State: result of opening the device</source>
+ <translation type="obsolete">Status: resultat av öppning av enhet</translation>
+ </message>
+ <message>
+ <source>mute instrument</source>
+ <translation type="obsolete">tysta instrument</translation>
+ </message>
+ <message>
+ <source>sound name</source>
+ <translation type="obsolete">ljudnamn</translation>
+ </message>
+ <message>
+ <source>quantisation
+currently not used</source>
+ <translation type="obsolete">kvantisering
+används inte för tillfället</translation>
+ </message>
+ <message>
+ <source>this input note triggers the sound</source>
+ <translation type="obsolete">denna in-not triggar ljudet</translation>
+ </message>
+ <message>
+ <source>note length</source>
+ <translation type="obsolete">notlängd</translation>
+ </message>
+ <message>
+ <source>this note is send for the sound</source>
+ <translation type="obsolete">denna not skickas för ljudet</translation>
+ </message>
+ <message>
+ <source>output channel
+currently not used</source>
+ <translation type="obsolete">utgĂĄngskanal
+används inte för tillfället</translation>
+ </message>
+ <message>
+ <source>output port
+currently not used</source>
+ <translation type="obsolete">utgĂĄngsport
+används inte för tillfället</translation>
+ </message>
+ <message>
+ <source>velocity level 1</source>
+ <translation type="obsolete">velocity nivĂĄ 1</translation>
+ </message>
+ <message>
+ <source>velocity level 2</source>
+ <translation type="obsolete">velocity nivĂĄ 2</translation>
+ </message>
+ <message>
+ <source>velocity level 3</source>
+ <translation type="obsolete">velocity nivĂĄ 3</translation>
+ </message>
+ <message>
+ <source>velocity level 4</source>
+ <translation type="obsolete">velocity nivĂĄ 4</translation>
+ </message>
+ <message>
+ <source>quantisation</source>
+ <translation type="obsolete">kvantisering</translation>
+ </message>
+ <message>
+ <source>output channel</source>
+ <translation type="obsolete">utgĂĄngskanal</translation>
+ </message>
+ <message>
+ <source>output port</source>
+ <translation type="obsolete">utgĂĄngsport</translation>
+ </message>
+ <message>
+ <source>Enable Recording</source>
+ <translation type="obsolete">SlĂĄ pĂĄ Inspelning</translation>
+ </message>
+ <message>
+ <source>Track Activity</source>
+ <translation type="obsolete">SpĂĄraktivitet</translation>
+ </message>
+ <message>
+ <source>Mute Indicator</source>
+ <translation type="obsolete">Tyst-Indikator</translation>
+ </message>
+ <message>
+ <source>Solo Indicator</source>
+ <translation type="obsolete">Solo-Indikator</translation>
+ </message>
+ <message>
+ <source>Track Type</source>
+ <translation type="obsolete">SpĂĄrtyp</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="obsolete">SpĂĄrnamn</translation>
+ </message>
+ <message>
+ <source>Output Channel Number</source>
+ <translation type="obsolete">Kanalnummer för utgång</translation>
+ </message>
+ <message>
+ <source>Output Port</source>
+ <translation type="obsolete">UtgĂĄngsport</translation>
+ </message>
+ <message>
+ <source>Time Lock</source>
+ <translation type="obsolete">TidlĂĄs</translation>
+ </message>
+ <message>
+ <source>Solo/Pre Fader Listening</source>
+ <translation type="obsolete">Solo/För-reglage lyssning</translation>
+ </message>
+ <message>
+ <source>enables reading from device</source>
+ <translation type="obsolete">möjliggör läsning från enhet</translation>
+ </message>
+ <message>
+ <source>enables writing to device</source>
+ <translation type="obsolete">möjliggör skrivning till enhet</translation>
+ </message>
+</context>
+<context>
+ <name>QPopupMenu</name>
+ <message>
+ <source>Add Soft Synth</source>
+ <translation type="obsolete">Lägg till Mjukvarusynth</translation>
+ </message>
+ <message>
+ <source>Add Midi Generator...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Soft Synth...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QWidget</name>
+ <message>
+ <source>Velocity</source>
+ <translation type="obsolete">Hastighet</translation>
+ </message>
+ <message>
+ <source>Cannot convert sysex string</source>
+ <translation type="obsolete">Kan inte konvertera sysex-sträng</translation>
+ </message>
+ <message>
+ <source>Hex String too long (2048 bytes limit)</source>
+ <translation type="obsolete">Hex-sträng för lång (2048 bytes maxgräns)</translation>
+ </message>
+ <message>
+ <source>generic midi</source>
+ <translation type="obsolete">generell midi</translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation>ny</translation>
+ </message>
+ <message>
+ <source>create peakfile for </source>
+ <translation type="obsolete">skapa &quot;peak&quot;-fil</translation>
+ </message>
+ <message>
+ <source>Cannot transform non empty track</source>
+ <translation type="obsolete">Kan inte transformera ej tomt spĂĄr</translation>
+ </message>
+ <message>
+ <source>MusE: get file name</source>
+ <translation type="obsolete">MusE: hämta filnamn</translation>
+ </message>
+ <message>
+ <source>the directory
+</source>
+ <translation type="obsolete">katalogen</translation>
+ </message>
+ <message>
+ <source>
+does not exist
+create?</source>
+ <translation type="obsolete">
+finns inte
+skapa?</translation>
+ </message>
+ <message>
+ <source>&amp;Create</source>
+ <translation type="obsolete">&amp;Skapa</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Avbryt</translation>
+ </message>
+ <message>
+ <source>MusE: create directory</source>
+ <translation type="obsolete">MusE: skapa katalog</translation>
+ </message>
+ <message>
+ <source>creating dir failed</source>
+ <translation type="obsolete">misslyckades med att skapa katalog</translation>
+ </message>
+ <message>
+ <source>File
+</source>
+ <translation>Filen
+</translation>
+ </message>
+ <message>
+ <source>
+exists</source>
+ <translation>
+existerar</translation>
+ </message>
+ <message>
+ <source>MusE: write</source>
+ <translation>MusE: skriv</translation>
+ </message>
+ <message>
+ <source>Overwrite</source>
+ <translation>Ersätt</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Avsluta</translation>
+ </message>
+ <message>
+ <source>Open File
+</source>
+ <translation type="obsolete">Ă–ppna fil</translation>
+ </message>
+ <message>
+ <source>
+failed: </source>
+ <translation type="obsolete">
+misslyckades:</translation>
+ </message>
+ <message>
+ <source>MusE: Open File</source>
+ <translation type="obsolete">MusE: Ă–ppna fil</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Ingen</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation type="obsolete">Master</translation>
+ </message>
+ <message>
+ <source>Group %c</source>
+ <translation type="obsolete">Grupp %c</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="obsolete">Okänd</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation type="obsolete">Grupp</translation>
+ </message>
+ <message>
+ <source>File </source>
+ <translation type="obsolete">Filen</translation>
+ </message>
+ <message>
+ <source> exists</source>
+ <translation type="obsolete">existerar</translation>
+ </message>
+</context>
+<context>
+ <name>QuantConfig</name>
+ <message>
+ <source>MusE: Config Quantize</source>
+ <translation type="obsolete">MusE: Konfigurera Kvantisering</translation>
+ </message>
+ <message>
+ <source>Config Quantize</source>
+ <translation type="obsolete">Konfigurera Kvantisering</translation>
+ </message>
+ <message>
+ <source>Strength</source>
+ <translation type="obsolete">Styrka</translation>
+ </message>
+ <message>
+ <source>Don&#xb4;t Quantize</source>
+ <translation type="obsolete">Kvantisera Inte</translation>
+ </message>
+ <message>
+ <source>Quant Len</source>
+ <translation type="obsolete">Kvant Längd</translation>
+ </message>
+</context>
+<context>
+ <name>QuantDialog</name>
+ <message>
+ <source>Display Quantize</source>
+ <translation type="obsolete">Visa Kvantisering</translation>
+ </message>
+ <message>
+ <source>Note Quantize</source>
+ <translation type="obsolete">Not Kvantisering</translation>
+ </message>
+ <message>
+ <source>Rest Quantize</source>
+ <translation type="obsolete">Rest Kvantisering</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>RhythmBase</name>
+ <message>
+ <source>MusE: Random Rhythm Generator</source>
+ <translation type="obsolete">MusE: Slumprytmgenerator</translation>
+ </message>
+ <message>
+ <source>Instrument Properties</source>
+ <translation type="obsolete">Instrumentinställningar</translation>
+ </message>
+ <message>
+ <source>counts/bar</source>
+ <translation type="obsolete">slag/takt</translation>
+ </message>
+ <message>
+ <source>steps/count</source>
+ <translation type="obsolete">steg/slag</translation>
+ </message>
+ <message>
+ <source># bars</source>
+ <translation type="obsolete"># takter</translation>
+ </message>
+ <message>
+ <source>randomize</source>
+ <translation type="obsolete">slumpa</translation>
+ </message>
+ <message>
+ <source>Group 1</source>
+ <translation type="obsolete">Grupp 1</translation>
+ </message>
+ <message>
+ <source>Group 2</source>
+ <translation type="obsolete">Grupp 2</translation>
+ </message>
+ <message>
+ <source>Group 3</source>
+ <translation type="obsolete">Grupp 3</translation>
+ </message>
+ <message>
+ <source>Group 4</source>
+ <translation type="obsolete">Grupp 4</translation>
+ </message>
+ <message>
+ <source>Group 5</source>
+ <translation type="obsolete">Grupp 5</translation>
+ </message>
+ <message>
+ <source>listen</source>
+ <translation type="obsolete">lyssna</translation>
+ </message>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">Instrument</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation type="obsolete">Grupp</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Ny</translation>
+ </message>
+ <message>
+ <source>create new entry</source>
+ <translation type="obsolete">skapa nytt inlägg</translation>
+ </message>
+ <message>
+ <source>pressing the New button you create a new entry
+in the MusE list of defined controllers</source>
+ <translation type="obsolete">skapa nytt inlägg genom att trycka på Ny knappen
+i MusEs lista över definierade controllers</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;Ta bort</translation>
+ </message>
+ <message>
+ <source>delete selected entry</source>
+ <translation type="obsolete">ta bort valt inlägg</translation>
+ </message>
+ <message>
+ <source>Up</source>
+ <translation type="obsolete">Upp</translation>
+ </message>
+ <message>
+ <source>Down</source>
+ <translation type="obsolete">Ner</translation>
+ </message>
+ <message>
+ <source>steps/count </source>
+ <translation type="obsolete">steg/slag</translation>
+ </message>
+ <message>
+ <source>list of defined controllers</source>
+ <translation type="obsolete">lista med definierade controllers</translation>
+ </message>
+ <message>
+ <source>This is the MusE list of defined controllers.</source>
+ <translation type="obsolete">Detta är MusEs lista med definierade controllers.</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">A&amp;rkiv</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="obsolete">&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="obsolete">&amp;Hjälp</translation>
+ </message>
+ <message>
+ <source>Tools</source>
+ <translation type="obsolete">Verktyg</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="obsolete">Ny</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="obsolete">Ă–ppna</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="obsolete">&amp;Ă–ppna...</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Spara</translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="obsolete">&amp;Spara</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="obsolete">Spara som</translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="obsolete">S&amp;para som...</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="obsolete">Skriv ut</translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation type="obsolete">Skriv &amp;ut...</translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="obsolete">Stäng</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="obsolete">S&amp;täng</translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="obsolete">Ă…ngra</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="obsolete">&amp;Ă…ngra</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="obsolete">Gör om</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="obsolete">Gör &amp;om</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="obsolete">Klipp ut</translation>
+ </message>
+ <message>
+ <source>&amp;Cut</source>
+ <translation type="obsolete">Klipp &amp;ut</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="obsolete">Kopiera</translation>
+ </message>
+ <message>
+ <source>C&amp;opy</source>
+ <translation type="obsolete">&amp;Ă–ppna</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="obsolete">Klistra in</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="obsolete">K&amp;listra in</translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation type="obsolete">Sök</translation>
+ </message>
+ <message>
+ <source>&amp;Find...</source>
+ <translation type="obsolete">&amp;Sök...</translation>
+ </message>
+ <message>
+ <source>Contents</source>
+ <translation type="obsolete">InnehĂĄll</translation>
+ </message>
+ <message>
+ <source>&amp;Contents...</source>
+ <translation type="obsolete">&amp;InnehĂĄll...</translation>
+ </message>
+ <message>
+ <source>&amp;Index...</source>
+ <translation type="obsolete">&amp;Index...</translation>
+ </message>
+ <message>
+ <source>About</source>
+ <translation type="obsolete">Om</translation>
+ </message>
+ <message>
+ <source>&amp;About...</source>
+ <translation type="obsolete">&amp;Om...</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Notice!&lt;/b&gt;&lt;br&gt;
+Random Rhythm Generator is not enabled yet!</source>
+ <translation type="obsolete">&lt;b&gt;Observera!&lt;/b&gt;&lt;br&gt;
+Slumprytms-generator fungerar inte än!</translation>
+ </message>
+</context>
+<context>
+ <name>RhythmGenerator</name>
+ <message>
+ <source>Instrument Settings:</source>
+ <translation type="obsolete">Instrumentinställningar:</translation>
+ </message>
+ <message>
+ <source>Instrument</source>
+ <translation type="obsolete">Instrument</translation>
+ </message>
+ <message>
+ <source>add</source>
+ <translation type="obsolete">lägg till</translation>
+ </message>
+ <message>
+ <source>delete</source>
+ <translation type="obsolete">ta bort</translation>
+ </message>
+ <message>
+ <source>count/bar</source>
+ <translation type="obsolete">slag/takt</translation>
+ </message>
+ <message>
+ <source># bars</source>
+ <translation type="obsolete"># takt</translation>
+ </message>
+ <message>
+ <source>Group Settings:</source>
+ <translation type="obsolete">Gruppinställningar:</translation>
+ </message>
+ <message>
+ <source>Group</source>
+ <translation type="obsolete">Grupp</translation>
+ </message>
+ <message>
+ <source>Group 1</source>
+ <translation type="obsolete">Grupp 1</translation>
+ </message>
+ <message>
+ <source>Group 2</source>
+ <translation type="obsolete">Grupp 2</translation>
+ </message>
+ <message>
+ <source>Group 3</source>
+ <translation type="obsolete">Grupp 3</translation>
+ </message>
+ <message>
+ <source>Group 4</source>
+ <translation type="obsolete">Grupp 4</translation>
+ </message>
+ <message>
+ <source>Group 5</source>
+ <translation type="obsolete">Grupp 5</translation>
+ </message>
+ <message>
+ <source>listen</source>
+ <translation type="obsolete">lyssna</translation>
+ </message>
+ <message>
+ <source>Randomize</source>
+ <translation type="obsolete">Slumpa</translation>
+ </message>
+ <message>
+ <source>Rhythm Style:</source>
+ <translation type="obsolete">Rytmstil:</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="obsolete">Rensa</translation>
+ </message>
+ <message>
+ <source>Open...</source>
+ <translation type="obsolete">Ă–ppna...</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="obsolete">Spara</translation>
+ </message>
+ <message>
+ <source>Save as...</source>
+ <translation type="obsolete">Spara som...</translation>
+ </message>
+ <message>
+ <source>Generate</source>
+ <translation type="obsolete">Generera</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="obsolete">Stäng</translation>
+ </message>
+</context>
+<context>
+ <name>RouteDialogBase</name>
+ <message>
+ <source>MusE: Routing</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Add Route</source>
+ <translation>Lägg till rutt</translation>
+ </message>
+ <message>
+ <source>Source:</source>
+ <translation>Källa:</translation>
+ </message>
+ <message>
+ <source>Destination:</source>
+ <translation>Destination:</translation>
+ </message>
+ <message>
+ <source>Connect</source>
+ <translation>Koppla</translation>
+ </message>
+ <message>
+ <source>connect source to destination</source>
+ <translation>koppla källa till destination</translation>
+ </message>
+ <message>
+ <source>Current Routes</source>
+ <translation>Nuvarande rutter</translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation>Källa</translation>
+ </message>
+ <message>
+ <source>Destination</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Ta bort</translation>
+ </message>
+ <message>
+ <source>remove selected route</source>
+ <translation>ta bort vald rutt</translation>
+ </message>
+</context>
+<context>
+ <name>SS_PluginChooserBase</name>
+ <message>
+ <source>SimpleDrums - Ladspa Plugin Chooser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Namn</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Etikett</translation>
+ </message>
+ <message>
+ <source>Inports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Creator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Score</name>
+ <message>
+ <source>Dynamics</source>
+ <translation type="obsolete">Dynamik</translation>
+ </message>
+ <message>
+ <source>&amp;Config</source>
+ <translation type="obsolete">&amp;Inställningar</translation>
+ </message>
+ <message>
+ <source>Page Settings</source>
+ <translation type="obsolete">Sidinställningar</translation>
+ </message>
+ <message>
+ <source>Staff Settings</source>
+ <translation type="obsolete">Notsystem inställningar</translation>
+ </message>
+ <message>
+ <source>Background Pixmap</source>
+ <translation type="obsolete">Bakgrundsbild</translation>
+ </message>
+ <message>
+ <source>Palettes</source>
+ <translation type="obsolete">Palett</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="obsolete">Skriv ut</translation>
+ </message>
+ <message>
+ <source>Preview Print</source>
+ <translation type="obsolete">Förhandsgranska utskrift</translation>
+ </message>
+ <message>
+ <source>Lyrics</source>
+ <translation type="obsolete">Text</translation>
+ </message>
+ <message>
+ <source>enter lyrics</source>
+ <translation type="obsolete">skriv in text</translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation type="obsolete">Text</translation>
+ </message>
+ <message>
+ <source>enter text</source>
+ <translation type="obsolete">skriv in Text</translation>
+ </message>
+ <message>
+ <source>enter chord symbol</source>
+ <translation type="obsolete">skriv in ackordsymbol</translation>
+ </message>
+ <message>
+ <source>Score</source>
+ <translation type="obsolete">Partitur</translation>
+ </message>
+ <message>
+ <source>to previous voice</source>
+ <translation type="obsolete">till föregående röst</translation>
+ </message>
+ <message>
+ <source>to next voice</source>
+ <translation type="obsolete">till nästa röst</translation>
+ </message>
+ <message>
+ <source>flip stem direction</source>
+ <translation type="obsolete">ändra stämriktning</translation>
+ </message>
+ <message>
+ <source>move marked notes to previous voice or to upper stave in a split system</source>
+ <translation type="obsolete">flytta de markerade noterna till föregående röst eller till övre notsystem i ett delat notssystem</translation>
+ </message>
+ <message>
+ <source>move marked notes to next voice or to lower stave in a split system</source>
+ <translation type="obsolete">flytta de markerade noterna till nästa röst eller undre notsystem i ett delat notsystem</translation>
+ </message>
+ <message>
+ <source>flip stem direction of selected notes</source>
+ <translation type="obsolete">byt stämriktning för valda noter</translation>
+ </message>
+ <message>
+ <source>StaffSettings</source>
+ <translation type="obsolete">Notsysteminställningar</translation>
+ </message>
+ <message>
+ <source>MusE: config wallpaper</source>
+ <translation type="obsolete">MusE: konfigurera bakgrundsbild</translation>
+ </message>
+</context>
+<context>
+ <name>ScoreConfig</name>
+ <message>
+ <source>Staff Settings: </source>
+ <translation type="obsolete">Partiturinställningar:</translation>
+ </message>
+ <message>
+ <source>Track List</source>
+ <translation type="obsolete">SpĂĄrlista</translation>
+ </message>
+ <message>
+ <source>Key/Clef</source>
+ <translation type="obsolete">Stämma/Klav</translation>
+ </message>
+ <message>
+ <source>Upper Staff</source>
+ <translation type="obsolete">Ă–vre notplan</translation>
+ </message>
+ <message>
+ <source>Lower Staff</source>
+ <translation type="obsolete">Nedre notplan</translation>
+ </message>
+ <message>
+ <source>Raster</source>
+ <translation type="obsolete">Rutnät</translation>
+ </message>
+ <message>
+ <source>Note Quantize</source>
+ <translation type="obsolete">Notkvantisera</translation>
+ </message>
+ <message>
+ <source>Rest Quantize</source>
+ <translation type="obsolete">Restkvantisera</translation>
+ </message>
+ <message>
+ <source>Mode</source>
+ <translation type="obsolete">Läge</translation>
+ </message>
+ <message>
+ <source>Split System</source>
+ <translation type="obsolete">Delat system</translation>
+ </message>
+ <message>
+ <source>Splitpoint</source>
+ <translation type="obsolete">Delningspunkt</translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="obsolete">Verkställ</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>ScrollScale</name>
+ <message>
+ <source>next page</source>
+ <translation type="obsolete">nästa sida</translation>
+ </message>
+ <message>
+ <source>previous page</source>
+ <translation type="obsolete">förra sidan</translation>
+ </message>
+ <message>
+ <source>current page number</source>
+ <translation type="obsolete">nuvarande sidnummer</translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutCaptureDialogBase</name>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Avbryt</translation>
+ </message>
+ <message>
+ <source>Enter shortcut sequence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Press keys to enter shortcut sequence!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Old shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undefined</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New shortcut:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">OK</translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfig</name>
+ <message>
+ <source>Transport: Start playback from current location</source>
+ <translation>Transport: Starta uppspelning frĂĄn nuvarande position</translation>
+ </message>
+ <message>
+ <source>Transport: Toggle metronome</source>
+ <translation>Transport: Metronom av/pĂĄ</translation>
+ </message>
+ <message>
+ <source>Transport: Stop Playback</source>
+ <translation>Transport: Stoppa uppspelning</translation>
+ </message>
+ <message>
+ <source>Transport: Play, Stop, Rewind</source>
+ <translation>Transport: Spela, stoppa, spola tillbaka</translation>
+ </message>
+ <message>
+ <source>Transport: Goto left marker</source>
+ <translation>Transport: Gå till vänster markering</translation>
+ </message>
+ <message>
+ <source>Transport: Goto right marker</source>
+ <translation>Transport: Gå till höger markering</translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Loop section</source>
+ <translation>Transport: Loopa sektion av/pĂĄ</translation>
+ </message>
+ <message>
+ <source>Transport: Toggle Record</source>
+ <translation>Transport: Inspelning av/pĂĄ</translation>
+ </message>
+ <message>
+ <source>Edit: Copy</source>
+ <translation>Redigera: Kopiera</translation>
+ </message>
+ <message>
+ <source>Edit: Undo</source>
+ <translation>Redigera: Ă…ngra</translation>
+ </message>
+ <message>
+ <source>Edit: Redo</source>
+ <translation>Redigera: Gör om</translation>
+ </message>
+ <message>
+ <source>Edit: Cut</source>
+ <translation>Redigera: Klipp ut</translation>
+ </message>
+ <message>
+ <source>Edit: Paste,</source>
+ <translation>Redigera: Klistra in</translation>
+ </message>
+ <message>
+ <source>Edit: Delete</source>
+ <translation>Redigera: Ta bort</translation>
+ </message>
+ <message>
+ <source>File: New project</source>
+ <translation>Arkiv: Nytt projekt</translation>
+ </message>
+ <message>
+ <source>File: Open from disk</source>
+ <translation>Arkiv: Ă–ppna</translation>
+ </message>
+ <message>
+ <source>File: Save project</source>
+ <translation>Arkiv: Spara</translation>
+ </message>
+ <message>
+ <source>File: Open recent file</source>
+ <translation>Arkiv: Öppna föregående fil</translation>
+ </message>
+ <message>
+ <source>File: Save as</source>
+ <translation>Arkiv: Spara som</translation>
+ </message>
+ <message>
+ <source>File: Load template</source>
+ <translation>Arkiv: Ladda mall</translation>
+ </message>
+ <message>
+ <source>File: Import midi file</source>
+ <translation>Arkiv: Importera midifil</translation>
+ </message>
+ <message>
+ <source>File: Export midi file</source>
+ <translation>Arkiv: Exportera midifil</translation>
+ </message>
+ <message>
+ <source>File: Import audio file</source>
+ <translation>Arkiv: Importera ljudfil</translation>
+ </message>
+ <message>
+ <source>File: Quit MusE</source>
+ <translation>Arkiv: Avsluta</translation>
+ </message>
+ <message>
+ <source>Edit: Select parts on track</source>
+ <translation>Arkiv: Välj alla parter i spår</translation>
+ </message>
+ <message>
+ <source>Open pianoroll</source>
+ <translation>Ă–ppna pianorulle</translation>
+ </message>
+ <message>
+ <source>Open drumeditor</source>
+ <translation>Ă–ppna trumeditor</translation>
+ </message>
+ <message>
+ <source>Open listeditor</source>
+ <translation>Ă–ppna listeditor</translation>
+ </message>
+ <message>
+ <source>Open graphical mastertrack editor</source>
+ <translation>Ă–ppna masterspĂĄr-editor (grafisk)</translation>
+ </message>
+ <message>
+ <source>Open list mastertrack editor</source>
+ <translation>Ă–ppna masterspĂĄr-editor (lista)</translation>
+ </message>
+ <message>
+ <source>Open midi transformer</source>
+ <translation>Ă–ppna miditransformer</translation>
+ </message>
+ <message>
+ <source>Add midi track</source>
+ <translation>Lägg till midispår</translation>
+ </message>
+ <message>
+ <source>Add drum track</source>
+ <translation>Lägg till trumspår</translation>
+ </message>
+ <message>
+ <source>Add wave track</source>
+ <translation>Lägg till ljudspår</translation>
+ </message>
+ <message>
+ <source>Add audio output</source>
+ <translation>Lägg till ljudutgång</translation>
+ </message>
+ <message>
+ <source>Add audio group</source>
+ <translation>Lägg till ljudgrupp</translation>
+ </message>
+ <message>
+ <source>Add audio input</source>
+ <translation>Lägg till ljudingång</translation>
+ </message>
+ <message>
+ <source>Add audio aux</source>
+ <translation>Lägg till aux</translation>
+ </message>
+ <message>
+ <source>Structure: Global cut</source>
+ <translation>Struktur: Globalt klipp</translation>
+ </message>
+ <message>
+ <source>Structure: Global insert</source>
+ <translation>Struktur: Global insättning</translation>
+ </message>
+ <message>
+ <source>Structure: Global split</source>
+ <translation>Struktur: Global delning</translation>
+ </message>
+ <message>
+ <source>Structure: Copy range</source>
+ <translation>Struktur: Kopiera omrĂĄde</translation>
+ </message>
+ <message>
+ <source>Structure: Cut events</source>
+ <translation>Struktur: Klipp ut händelse</translation>
+ </message>
+ <message>
+ <source>View: Open mixer window</source>
+ <translation>Vy: Öppna mixerfönster</translation>
+ </message>
+ <message>
+ <source>View: Toggle transport window</source>
+ <translation>Vy: Transportfönster av/på</translation>
+ </message>
+ <message>
+ <source>View: Toggle bigtime window</source>
+ <translation>Vy: Bigtimefönster av/på</translation>
+ </message>
+ <message>
+ <source>View: Open marker window</source>
+ <translation>Vy: Öppna markörfönster</translation>
+ </message>
+ <message>
+ <source>Settings: Follow song by page</source>
+ <translation>Inställningar: Följ sång efter sida</translation>
+ </message>
+ <message>
+ <source>Settings: Follow song off</source>
+ <translation>Inställningar: Följ sång av</translation>
+ </message>
+ <message>
+ <source>Settings: Follow song continuous</source>
+ <translation>Inställningar: Följ sång kontinuerligt</translation>
+ </message>
+ <message>
+ <source>Settings: Global configuration</source>
+ <translation>Inställningar: Globala inställningar</translation>
+ </message>
+ <message>
+ <source>Settings: Configure shortcuts</source>
+ <translation>Inställningar: Konfigurera tangentbordsgenvängar</translation>
+ </message>
+ <message>
+ <source>Settings: Configure metronome</source>
+ <translation>Inställningar: Konfigurera metronom</translation>
+ </message>
+ <message>
+ <source>Settings: Midi sync configuration</source>
+ <translation>Inställningar: Midi synk konfigurationg</translation>
+ </message>
+ <message>
+ <source>Settings: Midi file export configuration</source>
+ <translation>Inställningar: Midi fil export-konfiguration</translation>
+ </message>
+ <message>
+ <source>Settings: Appearance settings</source>
+ <translation>Inställningar: Utseendeinställningar</translation>
+ </message>
+ <message>
+ <source>Settings: Midi ports / Soft Synth</source>
+ <translation>Inställningar: Midiportar / Mjukvarusynthar</translation>
+ </message>
+ <message>
+ <source>Settings: Audio subsystem configuration</source>
+ <translation>Inställningar: Konfiguration av ljud-undersystem</translation>
+ </message>
+ <message>
+ <source>Midi: Edit midi instruments</source>
+ <translation>Midi: Editera midi-instrument</translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input transform</source>
+ <translation>Midi: Ă–ppna midi inputtransformator</translation>
+ </message>
+ <message>
+ <source>Midi: Open midi input filter</source>
+ <translation>Midi: Ă–ppna midi indatafilter</translation>
+ </message>
+ <message>
+ <source>Midi: Midi input transpose</source>
+ <translation>Midi: Midi indata transponering</translation>
+ </message>
+ <message>
+ <source>Midi: Midi remote control</source>
+ <translation>Midi: Midi fjärrkontroll</translation>
+ </message>
+ <message>
+ <source>Midi: Random rhythm generator</source>
+ <translation>Midi: Slumprymtmgenerator</translation>
+ </message>
+ <message>
+ <source>Midi: Reset midi</source>
+ <translation>Midi: Resetta midi</translation>
+ </message>
+ <message>
+ <source>Midi: Init midi</source>
+ <translation>Midi: Initiera midi</translation>
+ </message>
+ <message>
+ <source>Midi: Midi local off</source>
+ <translation>Midi: Midi lokal av</translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to track</source>
+ <translation>Audio: Bounce till spĂĄr</translation>
+ </message>
+ <message>
+ <source>Audio: Bounce audio to file</source>
+ <translation>Audio: Bounce till fil</translation>
+ </message>
+ <message>
+ <source>Audio: Restart audio</source>
+ <translation>Audio: Starta om audio</translation>
+ </message>
+ <message>
+ <source>Automation: Mixer automation</source>
+ <translation>Audio: Mixerautomation</translation>
+ </message>
+ <message>
+ <source>Automation: Take mixer snapshot</source>
+ <translation>Audio: Mixer ögonblicksbild</translation>
+ </message>
+ <message>
+ <source>Automation: Clear mixer automation</source>
+ <translation>Audio: Rensa mixerautomation</translation>
+ </message>
+ <message>
+ <source>Help: Open Manual</source>
+ <translation>Hjälp: Öppna manual</translation>
+ </message>
+ <message>
+ <source>Help: Toggle whatsthis mode</source>
+ <translation>Hjälp: What&apos;s this-läge av/på</translation>
+ </message>
+ <message>
+ <source>Edit: Edit selected part</source>
+ <translation>Redigera: Editera vald part</translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track above</source>
+ <translation>Redigera: Välj närmsta part på ovanstående spår</translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track above</source>
+ <translation>Redigera: Lägg till närmsta part på ovanstående spår till val</translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part on track below</source>
+ <translation>Redigera: Välj närmsta part på underliggande spår</translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part on track below</source>
+ <translation>Redigera: Lägg till närmsta part på underliggande spår till val</translation>
+ </message>
+ <message>
+ <source>Midi: Transpose</source>
+ <translation>Midi: Transponering</translation>
+ </message>
+ <message>
+ <source>Edit: Select all</source>
+ <translation>Redigera: Välj alla</translation>
+ </message>
+ <message>
+ <source>Edit: Select none</source>
+ <translation>Redigera: Välj ingen</translation>
+ </message>
+ <message>
+ <source>Edit: Invert selection</source>
+ <translation>Redigera: Invertera val</translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts inside locators</source>
+ <translation>Redigera: Välj händelser/parter inom sektion</translation>
+ </message>
+ <message>
+ <source>Edit: Select events/parts outside locators</source>
+ <translation>Redigera: Välj händelser/parter utanför sektion</translation>
+ </message>
+ <message>
+ <source>Edit: Select nearest part/event to the left</source>
+ <translation>Redigera: Välj närmsta part/händelse till vänster</translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the left to selection</source>
+ <translation>Redigera: Lägg till närmsta part/händelse till vänster till val</translation>
+ </message>
+ <message>
+ <source>Edit: Add nearest part/event to the right to selection</source>
+ <translation>Redigera: Lägg till närmsta part/händelse till höger till val</translation>
+ </message>
+ <message>
+ <source>Edit: Set locators to selection</source>
+ <translation>Redigera: Sätt loopsektion till valda parter/händelser</translation>
+ </message>
+ <message>
+ <source>Edit: Increase pitch</source>
+ <translation>Redigera: Höj pitch</translation>
+ </message>
+ <message>
+ <source>Edit: Decrease pitch</source>
+ <translation>Redigera: Sänk pitch</translation>
+ </message>
+ <message>
+ <source>Edit: Set fixed length on midi events</source>
+ <translation>Redigera: Sätt fix längd till valda midihändelser</translation>
+ </message>
+ <message>
+ <source>Quantize: Over Quantize</source>
+ <translation>Redigera: Ă–verkvantisera</translation>
+ </message>
+ <message>
+ <source>Quantize: Note On Quantize</source>
+ <translation>Kvantisering: Not pĂĄ-kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Note On/Off Quantize</source>
+ <translation>Kvantisering: Not pĂĄ/av-kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Iterative Quantize</source>
+ <translation>Kvantisering: Iterativ kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Configure quant</source>
+ <translation>Kvantisering: Konfigurera kvantisering<byte value="x9"/></translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Gate Time</source>
+ <translation>Kvantisering: Modifiera gate-tid</translation>
+ </message>
+ <message>
+ <source>Quantize: Modify Velocity</source>
+ <translation>Kvantisering: Modifiera velocity</translation>
+ </message>
+ <message>
+ <source>Edit: Crescendo</source>
+ <translation>Redigera: Crescendo</translation>
+ </message>
+ <message>
+ <source>Edit: Thin Out</source>
+ <translation>Redigera: Tunna ut</translation>
+ </message>
+ <message>
+ <source>Edit: Erase Event</source>
+ <translation>Redigera: Ta bort händelse</translation>
+ </message>
+ <message>
+ <source>Edit: Note Shift</source>
+ <translation>Redigera: Shifta Not</translation>
+ </message>
+ <message>
+ <source>Edit: Move Clock</source>
+ <translation>Redigera: Flytta Klocka</translation>
+ </message>
+ <message>
+ <source>Edit: Copy Measure</source>
+ <translation>Redigera: Kopiera Takt</translation>
+ </message>
+ <message>
+ <source>Edit: Erase Measure</source>
+ <translation>Redigera: Ta bort Takt</translation>
+ </message>
+ <message>
+ <source>Edit: Delete Measure</source>
+ <translation>Redigera: Ta bort Takt</translation>
+ </message>
+ <message>
+ <source>Edit: Create Measure</source>
+ <translation>Redigera: Lägg till Takt</translation>
+ </message>
+ <message>
+ <source>Edit: Change event color</source>
+ <translation>Redigera: Ändra färg på händelse</translation>
+ </message>
+ <message>
+ <source>Tool: Pointer</source>
+ <translation>Verktyg: Pekare</translation>
+ </message>
+ <message>
+ <source>Tool: Pencil</source>
+ <translation>Verktyg: Penna</translation>
+ </message>
+ <message>
+ <source>Tool: Eraser</source>
+ <translation>Verktyg: Radergummi</translation>
+ </message>
+ <message>
+ <source>Tool: Line Draw</source>
+ <translation>Verktyg: Rita linje</translation>
+ </message>
+ <message>
+ <source>Tool: Scissor</source>
+ <translation>Verktyg: Delare</translation>
+ </message>
+ <message>
+ <source>Tool: Glue</source>
+ <translation>Verktyg: Lim</translation>
+ </message>
+ <message>
+ <source>Tool: Mute</source>
+ <translation>Verktyg: Tysta</translation>
+ </message>
+ <message>
+ <source>Transport: Increase current position</source>
+ <translation>Transport: Ă–ka nuvarande position</translation>
+ </message>
+ <message>
+ <source>Transport: Decrease current position</source>
+ <translation>Transport: Minska nuvarande position</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/1 note</source>
+ <translation>Kvantisering: Sätt kvantisering till 1/1-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/2 note</source>
+ <translation>Kvantisering: Sätt kvantisering till 1/2-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/4 note</source>
+ <translation>Kvantisering: Sätt kvantisering till 1/4-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/8 note</source>
+ <translation>Kvantisering: Sätt kvantisering till 1/8-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/16 note</source>
+ <translation>Kvantisering: Sätt kvantisering till 1/16-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/32 note</source>
+ <translation>Kvantisering: Sätt kvantisering till 1/32-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Set quantize to 1/64 note</source>
+ <translation>Kvantisering: Sätt kvantisering till 1/64-not</translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle triol quantization</source>
+ <translation>Kvantisering: Växla triol-kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization</source>
+ <translation>Kvantisering: Växla punktuerad kvantisering</translation>
+ </message>
+ <message>
+ <source>Quantize: Toggle punctuation quantization (2)</source>
+ <translation>Kvantisering: Växla punktuerad kvantisering (2)</translation>
+ </message>
+ <message>
+ <source>Edit: Insert at location</source>
+ <translation>Redigera: Sätt in på nuvarande position</translation>
+ </message>
+ <message>
+ <source>Insert Note</source>
+ <translation>Mata in Not</translation>
+ </message>
+ <message>
+ <source>Insert SysEx</source>
+ <translation>Mata in SysEx</translation>
+ </message>
+ <message>
+ <source>Insert Ctrl</source>
+ <translation>Mata in Ctrl</translation>
+ </message>
+ <message>
+ <source>Insert Meta</source>
+ <translation>Mata in Meta</translation>
+ </message>
+ <message>
+ <source>Insert Channel Aftertouch</source>
+ <translation>Mata in Aftertouch för kanal</translation>
+ </message>
+ <message>
+ <source>Insert Key Aftertouch</source>
+ <translation>Mata in Key Aftertouch</translation>
+ </message>
+ <message>
+ <source>Edit: Increase event position</source>
+ <translation>Redigera: Öka position för händelse</translation>
+ </message>
+ <message>
+ <source>Edit: Decrease event position</source>
+ <translation>Redigera: Minska position för händelse</translation>
+ </message>
+ <message>
+ <source>Insert Tempo</source>
+ <translation>Mata in Tempo</translation>
+ </message>
+ <message>
+ <source>Insert Signature</source>
+ <translation>Mata in tempo-signatur</translation>
+ </message>
+ <message>
+ <source>Change Event Position</source>
+ <translation>Ändra position för händelse</translation>
+ </message>
+ <message>
+ <source>Edit Event Value</source>
+ <translation>Redigera värde för händelse</translation>
+ </message>
+ <message>
+ <source>Global</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Arranger</source>
+ <translation>Arrangerare</translation>
+ </message>
+ <message>
+ <source>Pianoroll</source>
+ <translation>Pianorulle</translation>
+ </message>
+ <message>
+ <source>Drumeditor</source>
+ <translation>Trumeditor</translation>
+ </message>
+ <message>
+ <source>List editor</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>List Mastertrack</source>
+ <translation>MasterspĂĄr, lista</translation>
+ </message>
+ <message>
+ <source>All categories</source>
+ <translation>Alla kategorier</translation>
+ </message>
+</context>
+<context>
+ <name>ShortcutConfigBase</name>
+ <message>
+ <source>Configure Keyboard Shortcuts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut Category</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shortcut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Define</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished">Alt+L</translation>
+ </message>
+</context>
+<context>
+ <name>SigScale</name>
+ <message>
+ <source>signature scale</source>
+ <translation type="obsolete">signaturskala</translation>
+ </message>
+</context>
+<context>
+ <name>SimpleDrumsGuiBase</name>
+ <message>
+ <source>DrumSynth 0.1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>StkGuiBase</name>
+ <message>
+ <source>Voices</source>
+ <translation type="obsolete">Röster</translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="obsolete">Redigera</translation>
+ </message>
+</context>
+<context>
+ <name>SynthConfigBase</name>
+ <message>
+ <source>MusE: Soft Synth Configuration</source>
+ <translation type="obsolete">MusE: Mjukvarusyntinställningar</translation>
+ </message>
+ <message>
+ <source>Soft Synthesizer</source>
+ <translation type="obsolete">Mjukvarusynt</translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation type="obsolete">Arkiv</translation>
+ </message>
+ <message>
+ <source>Instances</source>
+ <translation type="obsolete">Instanser</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="obsolete">Namn</translation>
+ </message>
+ <message>
+ <source>list of available software synthesizers</source>
+ <translation type="obsolete">lista av tillgängliga mjukvarusyntar</translation>
+ </message>
+ <message>
+ <source>Add Instance</source>
+ <translation type="obsolete">Lägg till instans</translation>
+ </message>
+ <message>
+ <source>Remove Instance</source>
+ <translation type="obsolete">Ta bort instans</translation>
+ </message>
+</context>
+<context>
+ <name>TList</name>
+ <message>
+ <source>Show Gui</source>
+ <translation type="obsolete">Visa Gui</translation>
+ </message>
+ <message>
+ <source>Add Midi Track</source>
+ <translation type="obsolete">Lägg till Midispår</translation>
+ </message>
+ <message>
+ <source>Add Drum Track</source>
+ <translation type="obsolete">Lägg till Trumspår</translation>
+ </message>
+ <message>
+ <source>Add Wave Track</source>
+ <translation type="obsolete">Lägg till Wavespår</translation>
+ </message>
+ <message>
+ <source>Delete Track</source>
+ <translation type="obsolete">Ta bort spĂĄr</translation>
+ </message>
+ <message>
+ <source>Track Comment</source>
+ <translation type="obsolete">SpĂĄrkommentar</translation>
+ </message>
+ <message>
+ <source>Midi</source>
+ <translation type="obsolete">Midi</translation>
+ </message>
+ <message>
+ <source>Drum</source>
+ <translation type="obsolete">Trumma</translation>
+ </message>
+ <message>
+ <source>Wave</source>
+ <translation type="obsolete">Wave</translation>
+ </message>
+ <message>
+ <source>This is your first wave track and the project
+doesn&apos;t appear to be saved yet.
+
+It is recommended that you save a project file now!
+
+By doing that you are implicitly selecting a folder
+where the audio files will end up.</source>
+ <translation type="obsolete">Detta är ditt första ljudspår och projektet verkar inte vara sparat ännu.
+
+Du rekommenderas att spara projektet nu!
+
+Genom att göra det så väljer du indirekt den katalog där
+ljudfilerna skall hamna.</translation>
+ </message>
+ <message>
+ <source>Save dialog</source>
+ <translation type="obsolete">Spara dialog</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="obsolete">Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>TempoSig</name>
+ <message>
+ <source>Tempo/Sig</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>Toolbar1</name>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Markör</translation>
+ </message>
+ <message>
+ <source>Snap</source>
+ <translation type="obsolete">Fäst vid</translation>
+ </message>
+ <message>
+ <source>Quantize</source>
+ <translation type="obsolete">Kvantisera</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="obsolete">Till</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation type="obsolete">Alla Händelser</translation>
+ </message>
+ <message>
+ <source>Looped Ev.</source>
+ <translation type="obsolete">Loopade Händelser.</translation>
+ </message>
+ <message>
+ <source>Selected Ev.</source>
+ <translation type="obsolete">Valda Händelser.</translation>
+ </message>
+ <message>
+ <source>Looped+Sel.</source>
+ <translation type="obsolete">Loopade och Valda.</translation>
+ </message>
+</context>
+<context>
+ <name>TrackComment</name>
+ <message>
+ <source>MusE: Track Comment</source>
+ <translation type="obsolete">MusE: SpĂĄrkommentar</translation>
+ </message>
+ <message>
+ <source>Track Comment:</source>
+ <translation type="obsolete">SpĂĄrkommentar:</translation>
+ </message>
+</context>
+<context>
+ <name>Transport</name>
+ <message>
+ <source>Overdub</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation>Ersätt</translation>
+ </message>
+ <message>
+ <source>Rec Mode</source>
+ <translation>Recläge</translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cycle Rec</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>punchin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>loop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>punchout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Punch In</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Punch Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Left Mark</source>
+ <translation>Vänster Markering</translation>
+ </message>
+ <message>
+ <source>Right Mark</source>
+ <translation>Höger Markering</translation>
+ </message>
+ <message>
+ <source>rewind to start</source>
+ <translation>flytta tillbaka till början</translation>
+ </message>
+ <message>
+ <source>rewind</source>
+ <translation>flytta tillbaka</translation>
+ </message>
+ <message>
+ <source>forward</source>
+ <translation>frammĂĄt</translation>
+ </message>
+ <message>
+ <source>stop</source>
+ <translation>stopp</translation>
+ </message>
+ <message>
+ <source>play</source>
+ <translation>spela</translation>
+ </message>
+ <message>
+ <source>record</source>
+ <translation>spela in</translation>
+ </message>
+ <message>
+ <source>AC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>quantize during record</source>
+ <translation>kvantisera under inspelning</translation>
+ </message>
+ <message>
+ <source>Click</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>metronom click on/off</source>
+ <translation>metronomklick av/pĂĄ</translation>
+ </message>
+ <message>
+ <source>Sync</source>
+ <translation>Synk</translation>
+ </message>
+ <message>
+ <source>external sync on/off</source>
+ <translation>externsynk. av/pĂĄ</translation>
+ </message>
+ <message>
+ <source>Master</source>
+ <translation>Master</translation>
+ </message>
+ <message>
+ <source>use master track</source>
+ <translation>använder masterspår</translation>
+ </message>
+</context>
+<context>
+ <name>TransposeDialogBase</name>
+ <message>
+ <source>MusE: Midi Transpose</source>
+ <translation type="unfinished">MusE: Miditransponering</translation>
+ </message>
+ <message>
+ <source>Value</source>
+ <translation type="unfinished">Värde</translation>
+ </message>
+ <message>
+ <source>halftones</source>
+ <translation type="unfinished">halvtoner</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation type="unfinished">Tid</translation>
+ </message>
+ <message>
+ <source>all</source>
+ <translation type="unfinished">alla</translation>
+ </message>
+ <message>
+ <source>between markers</source>
+ <translation type="unfinished">mellan markeringar</translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation type="unfinished">Parter</translation>
+ </message>
+ <message>
+ <source>all in selected tracks</source>
+ <translation type="unfinished">alla i valda spĂĄr</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Avbryt</translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">OK</translation>
+ </message>
+</context>
+<context>
+ <name>VAMGuiBase</name>
+ <message>
+ <source>Virtual Analogue for MusE</source>
+ <translation type="obsolete">Virtual Analogue för MusE</translation>
+ </message>
+ <message>
+ <source>Waveform</source>
+ <translation type="obsolete">VĂĄgform</translation>
+ </message>
+ <message>
+ <source>Sine</source>
+ <translation type="obsolete">Sinus</translation>
+ </message>
+ <message>
+ <source>Pulse</source>
+ <translation type="obsolete">Puls</translation>
+ </message>
+ <message>
+ <source>Saw</source>
+ <translation type="obsolete">SĂĄgtand</translation>
+ </message>
+ <message>
+ <source>Triangle</source>
+ <translation type="obsolete">Triangel</translation>
+ </message>
+ <message>
+ <source>Filter</source>
+ <translation type="obsolete">Filter</translation>
+ </message>
+ <message>
+ <source>Invert</source>
+ <translation type="obsolete">Invertera</translation>
+ </message>
+ <message>
+ <source>Presets</source>
+ <translation type="obsolete">Preset</translation>
+ </message>
+ <message>
+ <source>load preset list</source>
+ <translation type="obsolete">öppna presetlista</translation>
+ </message>
+ <message>
+ <source>save preset list</source>
+ <translation type="obsolete">spara presetlista</translation>
+ </message>
+ <message>
+ <source>save preset list to a new file</source>
+ <translation type="obsolete">spara presetlista till ny fil</translation>
+ </message>
+ <message>
+ <source>delete preset</source>
+ <translation type="obsolete">ta bort preset</translation>
+ </message>
+ <message>
+ <source>Pitch</source>
+ <translation type="obsolete">Tonhöjd</translation>
+ </message>
+ <message>
+ <source>On</source>
+ <translation type="obsolete">PĂĄ</translation>
+ </message>
+</context>
+<context>
+ <name>VelocityBase</name>
+ <message>
+ <source>MusE: Modify Velocity</source>
+ <translation type="unfinished">MusE: Modifiera Velocity</translation>
+ </message>
+ <message>
+ <source>Range</source>
+ <translation type="unfinished">OmrĂĄde</translation>
+ </message>
+ <message>
+ <source>All Events</source>
+ <translation type="unfinished">Alla Händelser</translation>
+ </message>
+ <message>
+ <source>Selected Events</source>
+ <translation type="unfinished">Valda Händelser</translation>
+ </message>
+ <message>
+ <source>Looped Events</source>
+ <translation type="unfinished">Loopade Händelser</translation>
+ </message>
+ <message>
+ <source>Selected &amp; Looped</source>
+ <translation type="unfinished">Valda &amp; Loopade</translation>
+ </message>
+ <message>
+ <source>Values</source>
+ <translation type="unfinished">Värden</translation>
+ </message>
+ <message>
+ <source>Rate:</source>
+ <translation type="unfinished">Hastighet:</translation>
+ </message>
+ <message>
+ <source>Offset:</source>
+ <translation type="unfinished">Offset:</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Avbryt</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished">OK</translation>
+ </message>
+</context>
+<context>
+ <name>WTScale</name>
+ <message>
+ <source>bar scale</source>
+ <translation type="obsolete">takt-skala</translation>
+ </message>
+</context>
+<context>
+ <name>WaveEdit</name>
+ <message>
+ <source>&amp;File</source>
+ <translation type="obsolete">&amp;Arkiv</translation>
+ </message>
+ <message>
+ <source>Functions</source>
+ <translation type="obsolete">Funktioner</translation>
+ </message>
+ <message>
+ <source>Normalize</source>
+ <translation type="obsolete">Normalisera</translation>
+ </message>
+ <message>
+ <source>Cursor</source>
+ <translation type="obsolete">Markör</translation>
+ </message>
+</context>
+<context>
+ <name>WaveTrackInfoBase</name>
+ <message>
+ <source>MusE: TrackInfo</source>
+ <translation type="unfinished">MusE: SpĂĄrinfo</translation>
+ </message>
+ <message>
+ <source>Track Info</source>
+ <translation type="unfinished">SpĂĄrinfo</translation>
+ </message>
+ <message>
+ <source>Track Name</source>
+ <translation type="unfinished">SpĂĄrnamn</translation>
+ </message>
+ <message>
+ <source>Ports:</source>
+ <translation type="obsolete">Portar:</translation>
+ </message>
+ <message>
+ <source>off</source>
+ <translation type="unfinished">av</translation>
+ </message>
+ <message>
+ <source>Track Delay (ticks)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delay (Frames)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/muse/share/plugins/1050.ui b/muse/share/plugins/1050.ui
new file mode 100644
index 00000000..d73ec5a1
--- /dev/null
+++ b/muse/share/plugins/1050.ui
@@ -0,0 +1,297 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>freeverb</class>
+ <widget class="QWidget" name="freeverb" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>398</width>
+ <height>120</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>FreeVerb</string>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="5" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Wet Level</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::FloatEntry" name="P2entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>2</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="3" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Damping</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::FloatEntry" name="P1entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="4" >
+ <widget class="Awl::Slider" name="P1slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="6" >
+ <widget class="Awl::Slider" name="P2slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>2</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-size:20pt;">Freeverb1&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>127</width>
+ <height>51</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="2" >
+ <widget class="Awl::Slider" name="P0slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Room Size</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::FloatEntry" name="P0entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>Awl::Slider</class>
+ <extends></extends>
+ <header>awl/slider.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Awl::FloatEntry</class>
+ <extends></extends>
+ <header>awl/floatentry.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/share/plugins/1436.ui b/muse/share/plugins/1436.ui
new file mode 100644
index 00000000..ef801ebb
--- /dev/null
+++ b/muse/share/plugins/1436.ui
@@ -0,0 +1,1090 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>freeverb</class>
+ <widget class="QWidget" name="freeverb" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>721</width>
+ <height>335</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>FreeVerb</string>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item rowspan="5" row="1" column="0" >
+ <widget class="QFrame" name="frame_4" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Delay (ms)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::FloatEntry" name="P2entry_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue" >
+ <double>2700</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P2slider_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaleValueColor" >
+ <color>
+ <red>200</red>
+ <green>12</green>
+ <blue>100</blue>
+ </color>
+ </property>
+ <property name="maxValue" >
+ <double>2700</double>
+ </property>
+ <property name="lineStep" >
+ <double>10</double>
+ </property>
+ <property name="pageStep" >
+ <double>100</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel2_4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Level</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::FloatEntry" name="P3entry_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>1</number>
+ </property>
+ <property name="maxValue" >
+ <double>50</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P3slider_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>1</number>
+ </property>
+ <property name="maxValue" >
+ <double>50</double>
+ </property>
+ <property name="lineStep" >
+ <double>0.5</double>
+ </property>
+ <property name="pageStep" >
+ <double>2</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="label_5" >
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>18</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:18pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;">&lt;span style=" font-size:18pt;">Left&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item rowspan="5" row="1" column="1" >
+ <widget class="QFrame" name="frame_2" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Delay (ms)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::FloatEntry" name="P2entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>2</number>
+ </property>
+ <property name="maxValue" >
+ <double>2700</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P2slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaleValueColor" >
+ <color>
+ <red>200</red>
+ <green>12</green>
+ <blue>100</blue>
+ </color>
+ </property>
+ <property name="id" >
+ <number>2</number>
+ </property>
+ <property name="maxValue" >
+ <double>2700</double>
+ </property>
+ <property name="lineStep" >
+ <double>10</double>
+ </property>
+ <property name="pageStep" >
+ <double>100</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel2_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Level</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::FloatEntry" name="P3entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>3</number>
+ </property>
+ <property name="maxValue" >
+ <double>50</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P3slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaleWidth" >
+ <number>4</number>
+ </property>
+ <property name="id" >
+ <number>3</number>
+ </property>
+ <property name="maxValue" >
+ <double>50</double>
+ </property>
+ <property name="lineStep" >
+ <double>0.5</double>
+ </property>
+ <property name="pageStep" >
+ <double>2</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="label_3" >
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>18</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-size:20pt;">Center&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-size:20pt;">L/C/R Delay - 1436&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="Awl::FloatEntry" name="P9entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>9</number>
+ </property>
+ <property name="maxValue" >
+ <double>50</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P9slider" >
+ <property name="id" >
+ <number>9</number>
+ </property>
+ <property name="maxValue" >
+ <double>50</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_8" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Spread</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item row="5" column="3" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="Awl::FloatEntry" name="P10entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P10slider" >
+ <property name="id" >
+ <number>10</number>
+ </property>
+ <property name="lineStep" >
+ <double>0.01</double>
+ </property>
+ <property name="pageStep" >
+ <double>0.1</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_9" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>9</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Dry/Wet level</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="3" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="Awl::FloatEntry" name="P6entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>6</number>
+ </property>
+ <property name="minValue" >
+ <double>-100</double>
+ </property>
+ <property name="maxValue" >
+ <double>100</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P6slider" >
+ <property name="id" >
+ <number>6</number>
+ </property>
+ <property name="minValue" >
+ <double>-100</double>
+ </property>
+ <property name="maxValue" >
+ <double>100</double>
+ </property>
+ <property name="lineStep" >
+ <double>0.5</double>
+ </property>
+ <property name="pageStep" >
+ <double>1</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Feedback</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item rowspan="5" row="1" column="2" >
+ <widget class="QFrame" name="frame_3" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Delay (ms)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::FloatEntry" name="P4entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>4</number>
+ </property>
+ <property name="maxValue" >
+ <double>2700</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P4slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaleValueColor" >
+ <color>
+ <red>200</red>
+ <green>12</green>
+ <blue>100</blue>
+ </color>
+ </property>
+ <property name="id" >
+ <number>4</number>
+ </property>
+ <property name="maxValue" >
+ <double>2700</double>
+ </property>
+ <property name="lineStep" >
+ <double>10</double>
+ </property>
+ <property name="pageStep" >
+ <double>100</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel2_3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Level</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::FloatEntry" name="P5entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>5</number>
+ </property>
+ <property name="maxValue" >
+ <double>50</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P5slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>5</number>
+ </property>
+ <property name="maxValue" >
+ <double>50</double>
+ </property>
+ <property name="lineStep" >
+ <double>0.5</double>
+ </property>
+ <property name="pageStep" >
+ <double>2</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QLabel" name="label_4" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-size:20pt;">Right&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="Awl::FloatEntry" name="P7entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>7</number>
+ </property>
+ <property name="maxValue" >
+ <double>100</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P7slider" >
+ <property name="id" >
+ <number>7</number>
+ </property>
+ <property name="maxValue" >
+ <double>100</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_6" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>High frequency damping (%)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="3" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="Awl::FloatEntry" name="P8entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>8</number>
+ </property>
+ <property name="maxValue" >
+ <double>100</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::Slider" name="P8slider" >
+ <property name="id" >
+ <number>8</number>
+ </property>
+ <property name="maxValue" >
+ <double>100</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_7" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Low frequency damping (%)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>Awl::Slider</class>
+ <extends></extends>
+ <header>awl/slider.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Awl::FloatEntry</class>
+ <extends></extends>
+ <header>awl/floatentry.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/share/plugins/2142.ui b/muse/share/plugins/2142.ui
new file mode 100644
index 00000000..63eb1542
--- /dev/null
+++ b/muse/share/plugins/2142.ui
@@ -0,0 +1,525 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>Form1</class>
+ <widget class="QWidget" name="Form1" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>357</width>
+ <height>190</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Tap-Reverberator</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>10</number>
+ </property>
+ <item row="0" column="0" colspan="2" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>4</number>
+ </property>
+ <item row="1" column="2" >
+ <widget class="Awl::Slider" name="P1slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaleWidth" >
+ <number>8</number>
+ </property>
+ <property name="id" >
+ <number>1</number>
+ </property>
+ <property name="minValue" >
+ <double>-70</double>
+ </property>
+ <property name="maxValue" >
+ <double>10</double>
+ </property>
+ <property name="log" >
+ <bool>true</bool>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="Awl::Slider" name="P0slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaleWidth" >
+ <number>8</number>
+ </property>
+ <property name="maxValue" >
+ <double>10000</double>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="Awl::FloatEntry" name="P1entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>1</number>
+ </property>
+ <property name="minValue" >
+ <double>-70</double>
+ </property>
+ <property name="maxValue" >
+ <double>10</double>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="textLabel1" >
+ <property name="text" >
+ <string>Decay [ms]</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="Awl::FloatEntry" name="P0entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="textLabel2" >
+ <property name="text" >
+ <string>Dry Level [dB]</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="Awl::Slider" name="P2slider" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="scaleWidth" >
+ <number>8</number>
+ </property>
+ <property name="id" >
+ <number>2</number>
+ </property>
+ <property name="minValue" >
+ <double>-70</double>
+ </property>
+ <property name="maxValue" >
+ <double>10</double>
+ </property>
+ <property name="log" >
+ <bool>true</bool>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="Awl::FloatEntry" name="P2entry" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="id" >
+ <number>2</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="textLabel3" >
+ <property name="text" >
+ <string>Wet Level [dB]</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item rowspan="3" row="1" column="0" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="Awl::CheckBox" name="P3checkbox" >
+ <property name="text" >
+ <string>Comb filters</string>
+ </property>
+ <property name="id" >
+ <number>3</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::CheckBox" name="P4checkbox" >
+ <property name="text" >
+ <string>Allpass filters</string>
+ </property>
+ <property name="id" >
+ <number>4</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::CheckBox" name="P5checkbox" >
+ <property name="text" >
+ <string>Bandpass filters</string>
+ </property>
+ <property name="id" >
+ <number>5</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="1" >
+ <widget class="Awl::CheckBox" name="P6checkbox" >
+ <property name="text" >
+ <string>Enhanced stereo</string>
+ </property>
+ <property name="id" >
+ <number>6</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel1_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Preset:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Awl::ComboBox" name="P7presetCombo" >
+ <property name="id" >
+ <number>7</number>
+ </property>
+ <item>
+ <property name="text" >
+ <string>AfterBurn</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>AfterBurn (Long)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Ambience</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Ambience (Thick)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Ambience (Thick) - HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Cathedral</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Cathedral - HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Drum Chamber</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Garage</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Garage (Bright)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Gymnasium</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Gymnasium (Bright)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Gymnasium (Bright) - HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Hall (Small)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Hall (Medium)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Hall (Large)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Hall (Large) - HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plate (Small)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plate (Medium)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plate (Large)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plate (Large) - HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pulse Chamber</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pulse Chamber (Reverse)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Resonator (96 ms)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Resonator (152 ms)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Resonator (208 ms)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Room (Small)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Room (Medium)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Room (Large)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Room (Large) - HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Slap Chamber</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Slap Chamber - HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Slap Chamber (Bright)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Slap Chamber (Bright) HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Smooth Hall (Small)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Smooth Hall (Medium)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Smooth Hall (Large)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Smooth Hall (Large) - HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Vocal Plate</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Vocal Plate - HD</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Warble Chamber</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Warehoouse</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Warehouse - HD</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;/head>&lt;body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&lt;span style=" font-size:15pt;">TAP Reverberator&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>Awl::Slider</class>
+ <extends></extends>
+ <header>awl/slider.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Awl::ComboBox</class>
+ <extends></extends>
+ <header>awl/combobox.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Awl::CheckBox</class>
+ <extends></extends>
+ <header>awl/checkbox.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>Awl::FloatEntry</class>
+ <extends></extends>
+ <header>awl/floatentry.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/share/plugins/CMakeLists.txt b/muse/share/plugins/CMakeLists.txt
new file mode 100644
index 00000000..5285fa13
--- /dev/null
+++ b/muse/share/plugins/CMakeLists.txt
@@ -0,0 +1,22 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+install_files ( /share/muse-1.0pre1/plugins .*\\.ui )
+
diff --git a/muse/share/templates/CMakeLists.txt b/muse/share/templates/CMakeLists.txt
new file mode 100644
index 00000000..54cb8afb
--- /dev/null
+++ b/muse/share/templates/CMakeLists.txt
@@ -0,0 +1,22 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+install_files ( /share/muse-1.0pre1/templates .*\\.med )
+
diff --git a/muse/share/templates/audio.med b/muse/share/templates/audio.med
new file mode 100644
index 00000000..208313ff
--- /dev/null
+++ b/muse/share/templates/audio.med
@@ -0,0 +1,329 @@
+<?xml version="1.0"?>
+<muse version="2.0">
+ <configuration>
+ <midiInputDevice>0</midiInputDevice>
+ <midiInputChannel>0</midiInputChannel>
+ <midiRecordType>0</midiRecordType>
+ <midiThruType>0</midiThruType>
+ <midiFilterCtrl1>0</midiFilterCtrl1>
+ <midiFilterCtrl2>0</midiFilterCtrl2>
+ <midiFilterCtrl3>0</midiFilterCtrl3>
+ <midiFilterCtrl4>0</midiFilterCtrl4>
+ <txDeviceId>127</txDeviceId>
+ <rxDeviceId>127</rxDeviceId>
+ <txSyncPort>1</txSyncPort>
+ <rxSyncPort>-1</rxSyncPort>
+ <mtctype>1</mtctype>
+ <mtcoffset>00:00:00:00:00</mtcoffset>
+ <extSync>0</extSync>
+ <genMTCSync>0</genMTCSync>
+ <genMCSync>0</genMCSync>
+ <genMMC>0</genMMC>
+ <acceptMTC>0</acceptMTC>
+ <acceptMMC>1</acceptMMC>
+ <acceptMC>1</acceptMC>
+ <bigtimeVisible>0</bigtimeVisible>
+ <transportVisible>0</transportVisible>
+ <mixerVisible>0</mixerVisible>
+ <arranger>
+ <info>1</info>
+ <split>298 764 </split>
+ <list>
+ <header> 7 6 5 4 3 2 1 0 </header>
+ </list>
+ <xpos>0</xpos>
+ <xmag>266</xmag>
+ <ypos>1</ypos>
+ </arranger>
+ <sequencer>
+ <metronom>
+ <premeasures>2</premeasures>
+ <measurepitch>63</measurepitch>
+ <measurevelo>127</measurevelo>
+ <beatpitch>63</beatpitch>
+ <beatvelo>70</beatvelo>
+ <channel>9</channel>
+ <port>0</port>
+ <precountEnable>1</precountEnable>
+ <fromMastertrack>1</fromMastertrack>
+ <signatureZ>4</signatureZ>
+ <signatureN>4</signatureN>
+ <prerecord>0</prerecord>
+ <preroll>0</preroll>
+ <midiClickEnable>1</midiClickEnable>
+ <audioClickEnable>0</audioClickEnable>
+ </metronom>
+ <rcEnable>0</rcEnable>
+ <rcStop>28</rcStop>
+ <rcRecord>31</rcRecord>
+ <rcGotoLeft>33</rcGotoLeft>
+ <rcPlay>29</rcPlay>
+ </sequencer>
+ <drumedit>
+ <quant>96</quant>
+ <raster>96</raster>
+ <width>600</width>
+ <height>400</height>
+ <dlistwidth>50</dlistwidth>
+ <dcanvaswidth>300</dcanvaswidth>
+ </drumedit>
+ <pianoroll>
+ <quant>96</quant>
+ <raster>96</raster>
+ <quantStrength>80</quantStrength>
+ <quantLimit>50</quantLimit>
+ <quantLen>0</quantLen>
+ <to>0</to>
+ <width>600</width>
+ <height>400</height>
+ <colormode>0</colormode>
+ </pianoroll>
+ <masteredit>
+ <raster>0</raster>
+ </masteredit>
+ <waveedit>
+ <bgcolor r="0" g="0" b="0"></bgcolor>
+ <width>600</width>
+ <height>400</height>
+ </waveedit>
+ </configuration>
+ <song>
+ <automation>0</automation>
+ <cpos>0</cpos>
+ <rpos>0</rpos>
+ <lpos>0</lpos>
+ <master>1</master>
+ <loop>0</loop>
+ <punchin>0</punchin>
+ <punchout>0</punchout>
+ <record>0</record>
+ <solo>0</solo>
+ <type>0</type>
+ <recmode>0</recmode>
+ <cycle>0</cycle>
+ <click>0</click>
+ <quantize>0</quantize>
+ <len>0</len>
+ <follow>1</follow>
+ <wavetrack>
+ <name>Track 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <selected>1</selected>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <auxSend idx=0>0</auxSend>
+ <auxSend idx=1>0</auxSend>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </wavetrack>
+ <wavetrack>
+ <name>Track 2</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>1</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <auxSend idx=0>0</auxSend>
+ <auxSend idx=1>0</auxSend>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </wavetrack>
+ <wavetrack>
+ <name>Track 3</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <auxSend idx=0>0</auxSend>
+ <auxSend idx=1>0</auxSend>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </wavetrack>
+ <wavetrack>
+ <name>Track 4</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <auxSend idx=0>0</auxSend>
+ <auxSend idx=1>0</auxSend>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </wavetrack>
+ <AudioGroup>
+ <name>Group 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>1</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <auxSend idx=0>0</auxSend>
+ <auxSend idx=1>0</auxSend>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </AudioGroup>
+ <AudioGroup>
+ <name>Group 2</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <auxSend idx=0>0</auxSend>
+ <auxSend idx=1>0</auxSend>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </AudioGroup>
+ <AudioAux>
+ <name>Aux 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>2</channels>
+ <height>20</height>
+ <locked>1</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </AudioAux>
+ <AudioAux>
+ <name>Aux 2</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>2</channels>
+ <height>20</height>
+ <locked>1</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </AudioAux>
+ <AudioInput>
+ <name>Input 1</name>
+ <record>0</record>
+ <mute>1</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>2</channels>
+ <height>20</height>
+ <locked>1</locked>
+ <mute>1</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <auxSend idx=0>0</auxSend>
+ <auxSend idx=1>0</auxSend>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </AudioInput>
+ <AudioOutput>
+ <name>Out 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>2</channels>
+ <height>20</height>
+ <locked>1</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <automation>1</automation>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </AudioOutput>
+ <tempolist fix="500000">
+ <tempo at="21474837">
+ <tick>0</tick>
+ <val>500000</val>
+ </tempo>
+ </tempolist>
+ <siglist>
+ <sig at="21474836">
+ <tick>0</tick>
+ <nom>4</nom>
+ <denom>4</denom>
+ </sig>
+ </siglist>
+ <drummap>
+ </drummap>
+ </song>
+ </muse>
diff --git a/muse/share/templates/default.med b/muse/share/templates/default.med
new file mode 100644
index 00000000..8edbfd8d
--- /dev/null
+++ b/muse/share/templates/default.med
@@ -0,0 +1,132 @@
+<?xml version="1.0"?>
+<muse version="2.0">
+ <configuration>
+ <midiInputDevice>0</midiInputDevice>
+ <midiInputChannel>0</midiInputChannel>
+ <midiRecordType>0</midiRecordType>
+ <midiThruType>0</midiThruType>
+ <midiFilterCtrl1>0</midiFilterCtrl1>
+ <midiFilterCtrl2>0</midiFilterCtrl2>
+ <midiFilterCtrl3>0</midiFilterCtrl3>
+ <midiFilterCtrl4>0</midiFilterCtrl4>
+ <txDeviceId>127</txDeviceId>
+ <rxDeviceId>127</rxDeviceId>
+ <txSyncPort>1</txSyncPort>
+ <rxSyncPort>-1</rxSyncPort>
+ <mtctype>1</mtctype>
+ <mtcoffset>00:00:00:00:00</mtcoffset>
+ <extSync>0</extSync>
+ <genMTCSync>0</genMTCSync>
+ <genMCSync>0</genMCSync>
+ <genMMC>0</genMMC>
+ <acceptMTC>0</acceptMTC>
+ <acceptMMC>1</acceptMMC>
+ <acceptMC>1</acceptMC>
+ <bigtimeVisible>0</bigtimeVisible>
+ <transportVisible>0</transportVisible>
+ <mixerVisible>0</mixerVisible>
+ <sequencer>
+ <metronom>
+ <premeasures>2</premeasures>
+ <measurepitch>63</measurepitch>
+ <measurevelo>127</measurevelo>
+ <beatpitch>63</beatpitch>
+ <beatvelo>70</beatvelo>
+ <channel>9</channel>
+ <port>0</port>
+ <precountEnable>0</precountEnable>
+ <fromMastertrack>0</fromMastertrack>
+ <signatureZ>4</signatureZ>
+ <signatureN>4</signatureN>
+ <prerecord>0</prerecord>
+ <preroll>0</preroll>
+ <midiClickEnable>1</midiClickEnable>
+ <audioClickEnable>0</audioClickEnable>
+ </metronom>
+ <rcEnable>0</rcEnable>
+ <rcStop>28</rcStop>
+ <rcRecord>31</rcRecord>
+ <rcGotoLeft>33</rcGotoLeft>
+ <rcPlay>29</rcPlay>
+ </sequencer>
+ <drumedit>
+ <quant>96</quant>
+ <raster>96</raster>
+ <width>600</width>
+ <height>400</height>
+ <dlistwidth>50</dlistwidth>
+ <dcanvaswidth>300</dcanvaswidth>
+ <to>0</to>
+ </drumedit>
+ <pianoroll>
+ <quant>96</quant>
+ <raster>96</raster>
+ <quantStrength>80</quantStrength>
+ <quantLimit>50</quantLimit>
+ <quantLen>0</quantLen>
+ <to>0</to>
+ <width>600</width>
+ <height>400</height>
+ <colormode>0</colormode>
+ </pianoroll>
+ <masteredit>
+ <raster>0</raster>
+ </masteredit>
+ <waveedit>
+ <bgcolor r="200" g="200" b="200"></bgcolor>
+ <width>600</width>
+ <height>400</height>
+ </waveedit>
+ </configuration>
+ <song>
+ <automation>1</automation>
+ <cpos>0</cpos>
+ <rpos>0</rpos>
+ <lpos>0</lpos>
+ <master>1</master>
+ <loop>0</loop>
+ <punchin>0</punchin>
+ <punchout>0</punchout>
+ <record>0</record>
+ <solo>0</solo>
+ <type>0</type>
+ <recmode>0</recmode>
+ <cycle>0</cycle>
+ <click>0</click>
+ <quantize>0</quantize>
+ <len>0</len>
+ <follow>1</follow>
+ <AudioOutput>
+ <name>Out 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>2</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <selected>1</selected>
+ <prefader>0</prefader>
+ <automation>1</automation>
+ <controller id="0" cur="0">
+ </controller>
+ <controller id="1" cur="0">
+ </controller>
+ </AudioOutput>
+ <tempolist fix="500000">
+ <tempo at="21474837">
+ <tick>0</tick>
+ <val>500000</val>
+ </tempo>
+ </tempolist>
+ <siglist>
+ <sig at="21474836">
+ <tick>0</tick>
+ <nom>4</nom>
+ <denom>4</denom>
+ </sig>
+ </siglist>
+ <drummap>
+ </drummap>
+ </song>
+ </muse>
diff --git a/muse/share/templates/midiGM.med b/muse/share/templates/midiGM.med
new file mode 100644
index 00000000..ebd6333b
--- /dev/null
+++ b/muse/share/templates/midiGM.med
@@ -0,0 +1,409 @@
+<?xml version="1.0"?>
+<muse version="2.0">
+ <configuration>
+ <midiInputDevice>0</midiInputDevice>
+ <midiInputChannel>0</midiInputChannel>
+ <midiRecordType>0</midiRecordType>
+ <midiThruType>0</midiThruType>
+ <midiFilterCtrl1>0</midiFilterCtrl1>
+ <midiFilterCtrl2>0</midiFilterCtrl2>
+ <midiFilterCtrl3>0</midiFilterCtrl3>
+ <midiFilterCtrl4>0</midiFilterCtrl4>
+ <txDeviceId>127</txDeviceId>
+ <rxDeviceId>127</rxDeviceId>
+ <txSyncPort>1</txSyncPort>
+ <rxSyncPort>-1</rxSyncPort>
+ <mtctype>1</mtctype>
+ <mtcoffset>00:00:00:00:00</mtcoffset>
+ <extSync>0</extSync>
+ <genMTCSync>0</genMTCSync>
+ <genMCSync>0</genMCSync>
+ <genMMC>0</genMMC>
+ <acceptMTC>0</acceptMTC>
+ <acceptMMC>1</acceptMMC>
+ <acceptMC>1</acceptMC>
+ <bigtimeVisible>0</bigtimeVisible>
+ <transportVisible>0</transportVisible>
+ <mixerVisible>0</mixerVisible>
+ <arranger>
+ <info>1</info>
+ <split>298 764 </split>
+ <list>
+ <header> 7 6 5 4 3 2 1 0 </header>
+ </list>
+ <xpos>0</xpos>
+ <xmag>266</xmag>
+ <ypos>1</ypos>
+ </arranger>
+ <sequencer>
+ <metronom>
+ <premeasures>2</premeasures>
+ <measurepitch>63</measurepitch>
+ <measurevelo>127</measurevelo>
+ <beatpitch>63</beatpitch>
+ <beatvelo>70</beatvelo>
+ <channel>9</channel>
+ <port>0</port>
+ <precountEnable>1</precountEnable>
+ <fromMastertrack>1</fromMastertrack>
+ <signatureZ>4</signatureZ>
+ <signatureN>4</signatureN>
+ <prerecord>0</prerecord>
+ <preroll>0</preroll>
+ <midiClickEnable>1</midiClickEnable>
+ <audioClickEnable>0</audioClickEnable>
+ </metronom>
+ <rcEnable>0</rcEnable>
+ <rcStop>28</rcStop>
+ <rcRecord>31</rcRecord>
+ <rcGotoLeft>33</rcGotoLeft>
+ <rcPlay>29</rcPlay>
+ <midiport idx="0">
+ <instrument>GM</instrument>
+ <channel idx="0">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="1">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="2">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="3">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="4">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="5">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="6">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="7">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="8">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="9">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="10">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="11">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="12">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="13">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="14">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ <channel idx="15">
+ <controller id="7">
+ <val>0</val>
+ </controller>
+ <controller id="10">
+ <val>0</val>
+ </controller>
+ <controller id="262145">
+ <val>0</val>
+ </controller>
+ </channel>
+ </midiport>
+ </sequencer>
+ <drumedit>
+ <quant>96</quant>
+ <raster>96</raster>
+ <width>600</width>
+ <height>400</height>
+ <dlistwidth>50</dlistwidth>
+ <dcanvaswidth>300</dcanvaswidth>
+ </drumedit>
+ <pianoroll>
+ <quant>96</quant>
+ <raster>96</raster>
+ <quantStrength>80</quantStrength>
+ <quantLimit>50</quantLimit>
+ <quantLen>0</quantLen>
+ <to>0</to>
+ <width>600</width>
+ <height>400</height>
+ <colormode>0</colormode>
+ </pianoroll>
+ <masteredit>
+ <raster>0</raster>
+ </masteredit>
+ <waveedit>
+ <bgcolor r="0" g="0" b="0"></bgcolor>
+ <width>600</width>
+ <height>400</height>
+ </waveedit>
+ </configuration>
+ <song>
+ <automation>0</automation>
+ <cpos>0</cpos>
+ <rpos>0</rpos>
+ <lpos>0</lpos>
+ <master>1</master>
+ <loop>0</loop>
+ <punchin>0</punchin>
+ <punchout>0</punchout>
+ <record>0</record>
+ <solo>0</solo>
+ <type>1</type>
+ <recmode>0</recmode>
+ <cycle>0</cycle>
+ <click>0</click>
+ <quantize>0</quantize>
+ <len>0</len>
+ <follow>1</follow>
+ <miditrack>
+ <name>Track 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>0</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <selected>1</selected>
+ <device>0</device>
+ <channel>0</channel>
+ <inportMap>65535</inportMap>
+ <inchannelMap>65535</inchannelMap>
+ <locked>0</locked>
+ <transposition>0</transposition>
+ <velocity>0</velocity>
+ <delay>0</delay>
+ <len>100</len>
+ <compression>100</compression>
+ <automation>1</automation>
+ </miditrack>
+ <miditrack>
+ <name>Track 2</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>0</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <device>0</device>
+ <channel>0</channel>
+ <inportMap>65535</inportMap>
+ <inchannelMap>65535</inchannelMap>
+ <locked>0</locked>
+ <transposition>0</transposition>
+ <velocity>0</velocity>
+ <delay>0</delay>
+ <len>100</len>
+ <compression>100</compression>
+ <automation>1</automation>
+ </miditrack>
+ <miditrack>
+ <name>Track 3</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>0</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <device>0</device>
+ <channel>0</channel>
+ <inportMap>65535</inportMap>
+ <inchannelMap>65535</inchannelMap>
+ <locked>0</locked>
+ <transposition>0</transposition>
+ <velocity>0</velocity>
+ <delay>0</delay>
+ <len>100</len>
+ <compression>100</compression>
+ <automation>1</automation>
+ </miditrack>
+ <miditrack>
+ <name>Track 4</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>0</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <device>0</device>
+ <channel>0</channel>
+ <inportMap>65535</inportMap>
+ <inchannelMap>65535</inchannelMap>
+ <locked>0</locked>
+ <transposition>0</transposition>
+ <velocity>0</velocity>
+ <delay>0</delay>
+ <len>100</len>
+ <compression>100</compression>
+ <automation>1</automation>
+ </miditrack>
+ <drumtrack>
+ <name>Track 5</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>0</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <device>0</device>
+ <channel>9</channel>
+ <inportMap>65535</inportMap>
+ <inchannelMap>65535</inchannelMap>
+ <locked>0</locked>
+ <transposition>0</transposition>
+ <velocity>0</velocity>
+ <delay>0</delay>
+ <len>100</len>
+ <compression>100</compression>
+ <automation>1</automation>
+ </drumtrack>
+ <tempolist fix="500000">
+ <tempo at="21474837">
+ <tick>0</tick>
+ <val>500000</val>
+ </tempo>
+ </tempolist>
+ <siglist>
+ <sig at="21474836">
+ <tick>0</tick>
+ <nom>4</nom>
+ <denom>4</denom>
+ </sig>
+ </siglist>
+ <drummap>
+ </drummap>
+ </song>
+ </muse>
diff --git a/muse/share/templates/monorecord.med b/muse/share/templates/monorecord.med
new file mode 100644
index 00000000..0ee96c59
--- /dev/null
+++ b/muse/share/templates/monorecord.med
@@ -0,0 +1,430 @@
+<?xml version="1.0"?>
+<muse version="2.0">
+ <configuration>
+ <midiInputDevice>0</midiInputDevice>
+ <midiInputChannel>0</midiInputChannel>
+ <midiRecordType>0</midiRecordType>
+ <midiThruType>0</midiThruType>
+ <midiFilterCtrl1>0</midiFilterCtrl1>
+ <midiFilterCtrl2>0</midiFilterCtrl2>
+ <midiFilterCtrl3>0</midiFilterCtrl3>
+ <midiFilterCtrl4>0</midiFilterCtrl4>
+ <txDeviceId>127</txDeviceId>
+ <rxDeviceId>127</rxDeviceId>
+ <txSyncPort>1</txSyncPort>
+ <rxSyncPort>-1</rxSyncPort>
+ <mtctype>1</mtctype>
+ <mtcoffset>00:00:00:00:00</mtcoffset>
+ <extSync>0</extSync>
+ <genMTCSync>0</genMTCSync>
+ <genMCSync>0</genMCSync>
+ <genMMC>0</genMMC>
+ <acceptMTC>0</acceptMTC>
+ <acceptMMC>1</acceptMMC>
+ <acceptMC>1</acceptMC>
+ <bigtimeVisible>0</bigtimeVisible>
+ <arranger>
+ <info>0</info>
+ <split>298 296 </split>
+ <list>
+ <header> 7 6 5 4 3 2 1 0 </header>
+ </list>
+ <xpos>0</xpos>
+ <xmag>266</xmag>
+ <ypos>1</ypos>
+ </arranger>
+ <sequencer>
+ <metronom>
+ <premeasures>2</premeasures>
+ <measurepitch>63</measurepitch>
+ <measurevelo>127</measurevelo>
+ <beatpitch>63</beatpitch>
+ <beatvelo>70</beatvelo>
+ <channel>9</channel>
+ <port>0</port>
+ <precountEnable>1</precountEnable>
+ <fromMastertrack>1</fromMastertrack>
+ <signatureZ>4</signatureZ>
+ <signatureN>4</signatureN>
+ <prerecord>0</prerecord>
+ <preroll>0</preroll>
+ <midiClickEnable>1</midiClickEnable>
+ <audioClickEnable>0</audioClickEnable>
+ </metronom>
+ <rcEnable>0</rcEnable>
+ <rcStop>28</rcStop>
+ <rcRecord>31</rcRecord>
+ <rcGotoLeft>33</rcGotoLeft>
+ <rcPlay>29</rcPlay>
+ <midiport idx="0">
+ <instrument>GM</instrument>
+ <name>TASCAM US-X2Y Port 0</name>
+ <record>1</record>
+ <channel idx="0">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="1">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="2">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="3">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="4">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="5">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="6">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="7">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="8">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="9">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="10">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="11">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="12">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="13">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="14">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="15">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ </midiport>
+ </sequencer>
+ <drumedit>
+ <quant>96</quant>
+ <raster>96</raster>
+ <width>600</width>
+ <height>400</height>
+ <dlistwidth>50</dlistwidth>
+ <dcanvaswidth>300</dcanvaswidth>
+ </drumedit>
+ <pianoroll>
+ <quant>96</quant>
+ <raster>96</raster>
+ <quantStrength>80</quantStrength>
+ <quantLimit>50</quantLimit>
+ <quantLen>0</quantLen>
+ <to>0</to>
+ <width>600</width>
+ <height>400</height>
+ <colormode>0</colormode>
+ </pianoroll>
+ <masteredit>
+ <raster>0</raster>
+ </masteredit>
+ <waveedit>
+ <bgcolor r="0" g="0" b="0"></bgcolor>
+ <width>600</width>
+ <height>400</height>
+ </waveedit>
+ </configuration>
+ <song>
+ <automation>0</automation>
+ <cpos>0</cpos>
+ <rpos>0</rpos>
+ <lpos>0</lpos>
+ <master>1</master>
+ <loop>0</loop>
+ <punchin>0</punchin>
+ <punchout>0</punchout>
+ <record>0</record>
+ <solo>0</solo>
+ <type>0</type>
+ <recmode>0</recmode>
+ <cycle>0</cycle>
+ <click>0</click>
+ <quantize>0</quantize>
+ <len>0</len>
+ <follow>1</follow>
+ <wavetrack>
+ <name>Track 1</name>
+ <record>1</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <auxSend idx=0>0.000000</auxSend>
+ <auxSend idx=1>0.000000</auxSend>
+ <controller id="0" cur="1.021645">
+ </controller>
+ <controller id="1" cur="0.000000">
+ </controller>
+ </wavetrack>
+ <AudioInput>
+ <name>Input 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>1</locked>
+ <selected>1</selected>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <auxSend idx=0>0.000000</auxSend>
+ <auxSend idx=1>0.000000</auxSend>
+ <controller id="0" cur="1.021645">
+ </controller>
+ <controller id="1" cur="0.000000">
+ </controller>
+ </AudioInput>
+ <AudioOutput>
+ <name>Out 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>1</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <controller id="0" cur="1.301517">
+ </controller>
+ <controller id="1" cur="0.000000">
+ </controller>
+ </AudioOutput>
+ <Route>
+ <srcNode>alsa_pcm:capture_1</srcNode>
+ <dstNode>1:Input 1</dstNode>
+ </Route>
+ <Route>
+ <srcNode>Input 1</srcNode>
+ <dstNode>Out 1</dstNode>
+ </Route>
+ <Route>
+ <srcNode>Input 1</srcNode>
+ <dstNode>Track 1</dstNode>
+ </Route>
+ <tempolist fix="500000">
+ <tempo at="21474837">
+ <tick>0</tick>
+ <val>500000</val>
+ </tempo>
+ </tempolist>
+ <siglist>
+ <sig at="21474836">
+ <tick>0</tick>
+ <nom>4</nom>
+ <denom>4</denom>
+ </sig>
+ </siglist>
+ <drummap>
+ </drummap>
+ </song>
+ <toplevels>
+ <audiomixer>
+ <topwin>
+ <geometry x="1216" y="30" w="180" h="503">
+ </geometry>
+ </topwin>
+ </audiomixer>
+ </toplevels>
+ </muse>
diff --git a/muse/share/templates/synti.med b/muse/share/templates/synti.med
new file mode 100644
index 00000000..d0dcc6d2
--- /dev/null
+++ b/muse/share/templates/synti.med
@@ -0,0 +1,806 @@
+<?xml version="1.0"?>
+<muse version="2.0">
+ <configuration>
+ <midiInputDevice>0</midiInputDevice>
+ <midiInputChannel>0</midiInputChannel>
+ <midiRecordType>0</midiRecordType>
+ <midiThruType>0</midiThruType>
+ <midiFilterCtrl1>0</midiFilterCtrl1>
+ <midiFilterCtrl2>0</midiFilterCtrl2>
+ <midiFilterCtrl3>0</midiFilterCtrl3>
+ <midiFilterCtrl4>0</midiFilterCtrl4>
+ <txDeviceId>127</txDeviceId>
+ <rxDeviceId>127</rxDeviceId>
+ <txSyncPort>1</txSyncPort>
+ <rxSyncPort>-1</rxSyncPort>
+ <mtctype>1</mtctype>
+ <mtcoffset>00:00:00:00:00</mtcoffset>
+ <extSync>0</extSync>
+ <genMTCSync>0</genMTCSync>
+ <genMCSync>0</genMCSync>
+ <genMMC>0</genMMC>
+ <acceptMTC>0</acceptMTC>
+ <acceptMMC>1</acceptMMC>
+ <acceptMC>1</acceptMC>
+ <bigtimeVisible>0</bigtimeVisible>
+ <arranger>
+ <info>0</info>
+ <split>298 296 </split>
+ <list>
+ <header> 7 6 5 4 3 2 1 0 </header>
+ </list>
+ <xpos>0</xpos>
+ <xmag>266</xmag>
+ <ypos>1</ypos>
+ </arranger>
+ <sequencer>
+ <metronom>
+ <premeasures>2</premeasures>
+ <measurepitch>63</measurepitch>
+ <measurevelo>127</measurevelo>
+ <beatpitch>63</beatpitch>
+ <beatvelo>70</beatvelo>
+ <channel>9</channel>
+ <port>0</port>
+ <precountEnable>1</precountEnable>
+ <fromMastertrack>1</fromMastertrack>
+ <signatureZ>4</signatureZ>
+ <signatureN>4</signatureN>
+ <prerecord>0</prerecord>
+ <preroll>0</preroll>
+ <midiClickEnable>1</midiClickEnable>
+ <audioClickEnable>0</audioClickEnable>
+ </metronom>
+ <rcEnable>0</rcEnable>
+ <rcStop>28</rcStop>
+ <rcRecord>31</rcRecord>
+ <rcGotoLeft>33</rcGotoLeft>
+ <rcPlay>29</rcPlay>
+ <midiport idx="0">
+ <instrument>organ-1</instrument>
+ <name>organ-1</name>
+ <record>0</record>
+ <channel idx="0">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="1">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="2">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="3">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="4">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="5">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="6">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="7">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="8">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="9">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="10">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="11">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="12">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="13">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="14">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="15">
+ <controller>1</controller>
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>11</controller>
+ <controller>64</controller>
+ <controller>91</controller>
+ <controller>93</controller>
+ <controller>120</controller>
+ <controller>121</controller>
+ <controller>123</controller>
+ <controller>262144</controller>
+ <controller>262145</controller>
+ </channel>
+ </midiport>
+ <midiport idx="1">
+ <instrument>fluid-1</instrument>
+ <name>fluid-1</name>
+ <record>0</record>
+ <channel idx="0">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="1">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="2">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="3">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="4">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="5">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="6">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="7">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="8">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="9">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="10">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="11">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="12">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="13">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="14">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="15">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ </midiport>
+ <midiport idx="2">
+ <instrument>s1-1</instrument>
+ <name>s1-1</name>
+ <record>0</record>
+ <channel idx="0">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="1">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="2">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="3">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="4">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="5">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="6">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="7">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="8">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="9">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="10">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="11">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="12">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="13">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="14">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="15">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ </midiport>
+ <midiport idx="3">
+ <instrument>vam-1</instrument>
+ <name>vam-1</name>
+ <record>0</record>
+ <channel idx="0">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="1">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="2">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="3">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="4">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="5">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="6">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="7">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="8">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="9">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="10">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="11">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="12">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="13">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="14">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ <channel idx="15">
+ <controller>7</controller>
+ <controller>10</controller>
+ <controller>262145</controller>
+ </channel>
+ </midiport>
+ </sequencer>
+ <drumedit>
+ <quant>96</quant>
+ <raster>96</raster>
+ <width>600</width>
+ <height>400</height>
+ <dlistwidth>50</dlistwidth>
+ <dcanvaswidth>300</dcanvaswidth>
+ </drumedit>
+ <pianoroll>
+ <quant>96</quant>
+ <raster>96</raster>
+ <quantStrength>80</quantStrength>
+ <quantLimit>50</quantLimit>
+ <quantLen>0</quantLen>
+ <to>0</to>
+ <width>600</width>
+ <height>400</height>
+ <colormode>0</colormode>
+ </pianoroll>
+ <masteredit>
+ <raster>0</raster>
+ </masteredit>
+ <waveedit>
+ <bgcolor r="169" g="181" b="223"></bgcolor>
+ <width>600</width>
+ <height>400</height>
+ </waveedit>
+ </configuration>
+ <song>
+ <automation>0</automation>
+ <cpos>12288</cpos>
+ <rpos>0</rpos>
+ <lpos>0</lpos>
+ <master>1</master>
+ <loop>0</loop>
+ <punchin>0</punchin>
+ <punchout>0</punchout>
+ <record>0</record>
+ <solo>0</solo>
+ <type>0</type>
+ <recmode>0</recmode>
+ <cycle>0</cycle>
+ <click>0</click>
+ <quantize>0</quantize>
+ <len>18432</len>
+ <follow>1</follow>
+ <miditrack>
+ <name>Track 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>0</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <device>0</device>
+ <channel>0</channel>
+ <inportMap>65535</inportMap>
+ <inchannelMap>65535</inchannelMap>
+ <locked>0</locked>
+ <transposition>0</transposition>
+ <velocity>0</velocity>
+ <delay>0</delay>
+ <len>100</len>
+ <compression>100</compression>
+ <midiThru>1</midiThru>
+ <part>
+ <name>Track 1</name>
+ <poslen tick="0" len="18432" />
+ <selected>1</selected>
+ <color>0</color>
+ </part>
+ </miditrack>
+ <AudioOutput>
+ <name>Out 1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>2</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <selected>1</selected>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <controller id="0" cur="1.021645">
+ </controller>
+ <controller id="1" cur="0.000000">
+ </controller>
+ </AudioOutput>
+ <SynthI>
+ <name>fluid-1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>1</off>
+ <channels>2</channels>
+ <height>20</height>
+ <locked>124</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>1</off>
+ <controller id="0" cur="1.410912">
+ </controller>
+ <controller id="1" cur="0.000000">
+ </controller>
+ <class>fluid</class>
+ <port>1</port>
+ <guiVisible>0</guiVisible>
+ <midistate>
+ <event type="2" datalen="30">
+ 7c 00 01 2f 68 6f 6d 65 2f 77 73 2f 73 66 6f 6e
+ 74 2f 46 6c 75 69 64 52 33 2e 53 46 32 00
+ </event>
+ </midistate>
+ </SynthI>
+ <SynthI>
+ <name>organ-1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>0</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>0</off>
+ <controller id="0" cur="1.021645">
+ </controller>
+ <controller id="1" cur="-0.040000">
+ </controller>
+ <class>organ</class>
+ <port>0</port>
+ <guiVisible>0</guiVisible>
+ <midistate>
+ <event type="2" datalen="136">
+ 00 00 03 00 ff 3f 00 00 01 00 03 00 ff 3f 00 00
+ 02 00 03 00 ff 3f 00 00 03 00 03 00 ff 3f 00 00
+ 04 00 03 00 ff 3f 00 00 05 00 03 00 ff 3f 00 00
+ 06 00 03 00 a2 00 00 00 07 00 03 00 00 00 00 00
+ 08 00 03 00 ff 3f 00 00 09 00 03 00 fe 1f 00 00
+ 0a 00 03 00 a2 00 00 00 0b 00 03 00 00 00 00 00
+ 0c 00 03 00 ff 3f 00 00 0d 00 03 00 fe 1f 00 00
+ 0e 00 03 00 01 00 00 00 0f 00 03 00 01 00 00 00
+ 10 00 03 00 01 00 00 00
+ </event>
+ </midistate>
+ </SynthI>
+ <SynthI>
+ <name>s1-1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>1</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>11</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>1</off>
+ <controller id="0" cur="0.000000">
+ </controller>
+ <controller id="1" cur="0.000000">
+ </controller>
+ <class>s1</class>
+ <port>2</port>
+ <guiVisible>0</guiVisible>
+ </SynthI>
+ <SynthI>
+ <name>vam-1</name>
+ <record>0</record>
+ <mute>0</mute>
+ <solo>0</solo>
+ <off>1</off>
+ <channels>1</channels>
+ <height>20</height>
+ <locked>0</locked>
+ <mute>0</mute>
+ <solo>0</solo>
+ <prefader>0</prefader>
+ <off>1</off>
+ <controller id="0" cur="0.000000">
+ </controller>
+ <controller id="1" cur="0.000000">
+ </controller>
+ <class>vam</class>
+ <port>3</port>
+ <guiVisible>0</guiVisible>
+ </SynthI>
+ <Route>
+ <srcNode>1:Out 1</srcNode>
+ <dstNode>alsa_pcm:playback_1</dstNode>
+ </Route>
+ <Route>
+ <srcNode>2:Out 1</srcNode>
+ <dstNode>alsa_pcm:playback_2</dstNode>
+ </Route>
+ <Route>
+ <srcNode>fluid-1</srcNode>
+ <dstNode>Out 1</dstNode>
+ </Route>
+ <Route>
+ <srcNode>organ-1</srcNode>
+ <dstNode>Out 1</dstNode>
+ </Route>
+ <Route>
+ <srcNode>s1-1</srcNode>
+ <dstNode>Out 1</dstNode>
+ </Route>
+ <Route>
+ <srcNode>vam-1</srcNode>
+ <dstNode>Out 1</dstNode>
+ </Route>
+ <tempolist fix="500000">
+ <tempo at="21474837">
+ <tick>0</tick>
+ <val>500000</val>
+ </tempo>
+ </tempolist>
+ <siglist>
+ <sig at="21474836">
+ <tick>0</tick>
+ <nom>4</nom>
+ <denom>4</denom>
+ </sig>
+ </siglist>
+ <drummap>
+ </drummap>
+ </song>
+ <toplevels>
+ <audiomixer>
+ <topwin>
+ </topwin>
+ </audiomixer>
+ <part>0:0</part>
+ <pianoroll>
+ <midieditor>
+ <topwin>
+ </topwin>
+ <quant>96</quant>
+ <raster>96</raster>
+ </midieditor>
+ <splitter>255 </splitter>
+ <steprec>0</steprec>
+ <midiin>0</midiin>
+ <tool>1</tool>
+ <quantStrength>80</quantStrength>
+ <quantLimit>50</quantLimit>
+ <quantLen>0</quantLen>
+ <playEvents>0</playEvents>
+ <xpos>0</xpos>
+ <xmag>346</xmag>
+ <ypos>390</ypos>
+ <ymag>286</ymag>
+ </pianoroll>
+ </toplevels>
+ </muse>
diff --git a/muse/share/wallpapers/CMakeLists.txt b/muse/share/wallpapers/CMakeLists.txt
new file mode 100644
index 00000000..28600ab3
--- /dev/null
+++ b/muse/share/wallpapers/CMakeLists.txt
@@ -0,0 +1,22 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+install_files ( /share/muse-1.0pre1/wallpapers .*\\.gif )
+install_files ( /share/muse-1.0pre1/wallpapers .*\\.jpg )
diff --git a/muse/share/wallpapers/gray.gif b/muse/share/wallpapers/gray.gif
new file mode 100644
index 00000000..cb30e856
--- /dev/null
+++ b/muse/share/wallpapers/gray.gif
Binary files differ
diff --git a/muse/share/wallpapers/gray_rock.gif b/muse/share/wallpapers/gray_rock.gif
new file mode 100644
index 00000000..dcf1a19b
--- /dev/null
+++ b/muse/share/wallpapers/gray_rock.gif
Binary files differ
diff --git a/muse/share/wallpapers/gray_stucco.gif b/muse/share/wallpapers/gray_stucco.gif
new file mode 100644
index 00000000..bcebdb02
--- /dev/null
+++ b/muse/share/wallpapers/gray_stucco.gif
Binary files differ
diff --git a/muse/share/wallpapers/paper1.jpg b/muse/share/wallpapers/paper1.jpg
new file mode 100644
index 00000000..1d4923e8
--- /dev/null
+++ b/muse/share/wallpapers/paper1.jpg
Binary files differ
diff --git a/muse/share/wallpapers/stone1.gif b/muse/share/wallpapers/stone1.gif
new file mode 100644
index 00000000..f45407cc
--- /dev/null
+++ b/muse/share/wallpapers/stone1.gif
Binary files differ
diff --git a/muse/synti/CMakeLists.txt b/muse/synti/CMakeLists.txt
new file mode 100644
index 00000000..3d02797c
--- /dev/null
+++ b/muse/synti/CMakeLists.txt
@@ -0,0 +1,32 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+include_directories(
+ .
+ ${CMAKE_CURRENT_BINARY}
+ ${PROJECT_SOURCE_DIR}
+ ${PROJECT_SOURCE_DIR}/muse
+ ${PROJECT_SOURCE_DIR}/muse/widgets
+ ${PROJECT_SOURCE_DIR}/synti
+ )
+
+subdirs(libsynti s1 organ fluid deicsonze fluidsynth simpledrums vam )
+
+
diff --git a/muse/synti/deicsonze/ARCH_ALIN b/muse/synti/deicsonze/ARCH_ALIN
new file mode 100644
index 00000000..87092d6f
--- /dev/null
+++ b/muse/synti/deicsonze/ARCH_ALIN
@@ -0,0 +1,24945 @@
+* TX81Z/DX11 Voice Archive
+* $Header: /cvsroot/lmuse/muse/synti/deicsonze/ARCH_ALIN,v 1.3 2005/07/14 10:25:45 a-lin Exp $
+* Copyright 1991 by Bryan Sutula. See README file for restrictions.
+
+
+--Bank 1
+
+* CATEGORY ORCHESTRA
+
+* SUBCATEGORY Orchestra
+
+** Name: EleOrchtra
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 03 03 04 0b 00 02 4e 00 02 18 03 03 05 08 00 02 51 08 00 11 07 03 07 0b
+00 05 63 04 06 09 10 03 05 0f 00 06 63 08 05 34 21 23 0f 00 12 18 05 04 00
+63 63 63 00 00 32 00 45 6c 65 4f 72 63 68 74 72 61 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EleOrchtra
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 03 03 04 0b 00 00 4e 00 02 18 03 03 05 08 00 00 51 08 00 11 07 03 07 0b
+00 00 63 04 06 09 10 03 05 0f 00 00 63 08 05 34 21 23 0f 00 12 18 05 04 00
+63 63 63 00 00 32 00 45 6c 65 4f 72 63 68 74 72 61 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Orchestra*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 1f 00 02 0f 00 01 4b 0a 08 07 1f 00 05 0f 0b 00 61 09 0e 0f 1f 00 05 0f
+00 01 63 0a 08 08 1f 00 05 0f 00 00 61 05 08 3e 21 21 07 00 32 05 02 04 00
+28 63 00 00 00 32 00 4f 72 63 68 65 73 74 72 61 2a 63 63 63 32 32 32 00 00
+00 12 00 00 00 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntOrkest
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 0c 03 04 0f 32 01 47 08 0d 10 0c 03 04 0f 32 02 3e 08 0a 0e 15 06 05 0f
+1e 05 5d 13 0a 1f 15 06 05 0f 1e 05 61 08 0e 24 20 2c 14 00 42 0c 0c 04 00
+63 32 32 00 00 32 00 4f 72 6e 74 4f 72 6b 65 73 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntOrkest
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 0c 03 04 0f 32 00 47 08 0d 10 0c 03 04 0f 32 00 3e 08 0a 0e 15 06 05 0f
+1e 00 5d 13 0a 1f 15 06 05 0f 1e 00 61 08 0e 24 20 2c 14 00 42 0c 0c 04 00
+63 32 32 00 00 32 00 4f 72 6e 74 4f 72 6b 65 73 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+* SUBCATEGORY Symphony
+
+** Name: Sympathy.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 03 0f 00 04 59 04 03 1f 1f 00 03 0f 00 04 5f 00 06 0f 1f 00 04 0f
+00 05 5b 08 02 0f 1f 00 04 0f 00 06 5f 08 06 2c 23 00 00 00 02 18 04 04 00
+28 32 00 00 00 32 00 53 79 6d 70 61 74 68 79 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sympathy.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 03 0f 00 03 52 04 03 1f 1f 00 03 0f 00 04 55 08 06 0f 1f 00 04 0f
+00 06 5b 08 02 0f 1f 00 04 0f 00 05 5e 08 06 2c 23 00 00 00 02 18 04 04 00
+28 32 00 00 00 32 00 53 79 6d 70 61 74 68 79 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sympho *
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 04 03 04 0e 16 00 4a 03 03 0d 04 00 05 0e 1d 00 52 04 06 0c 04 03 05 0e
+0e 00 63 03 03 07 04 03 05 0e 0c 00 63 04 00 3c 23 0e 0e 00 32 11 02 04 00
+28 63 00 00 00 32 00 53 79 6d 70 68 6f 20 20 20 2a 63 63 63 32 32 32 00 06
+00 18 00 06 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony *
+** Controls: KV, MW (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 04 00 01 0e 00 49 4d 04 03 11 17 03 04 0f 00 00 45 04 06 0c 08 03 05 0f
+00 78 63 04 03 0a 04 03 05 0e 00 78 63 03 00 3c 1f 0c 10 00 4e 05 02 04 00
+28 0c 07 00 00 32 19 53 79 6d 70 68 6f 6e 79 20 2a 63 63 63 32 32 32 00 08
+30 38 00 08 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 13 07 02 0e 0a 04 59 13 12 0e 09 00 05 0e 00 04 51 08 03 18 09 05 04 0e
+0a 04 4b 0d 0b 0c 0d 00 05 0d 00 05 63 08 03 64 26 18 0f 00 26 0c 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 31 63 63 63 32 32 32 00 10
+00 20 00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 13 07 02 0e 0a 02 59 13 12 0e 09 00 05 0e 00 01 51 08 03 18 09 05 04 0e
+0a 01 4b 0d 0b 0c 0d 00 05 0d 00 00 63 08 03 64 26 18 0f 00 26 0c 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 31 63 63 63 32 32 32 00 10
+00 20 00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 05 00 07 0e 41 01 51 08 05 19 13 06 04 0e 0a 03 4d 19 0a 0c 0a 00 07 0f
+0a 05 62 08 01 1f 0a 06 04 0b 00 02 4d 0d 00 34 22 18 0f 00 22 0c 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 32 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 05 00 07 0e 41 01 51 08 05 19 13 06 04 0e 0a 00 4d 19 0a 0c 0a 00 07 0f
+0a 00 62 08 01 1f 0a 06 04 0e 00 00 4d 0d 00 34 22 18 0f 00 22 0c 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 32 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 05 00 04 0e 29 03 4c 04 01 0f 0c 01 05 0e 0a 03 39 08 02 0d 0a 00 06 0e
+0a 03 5d 08 03 12 08 03 06 0d 00 06 58 08 01 2c 1e 00 06 00 32 0c 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 05 00 04 0e 29 00 4c 04 01 0f 0c 01 05 0e 0a 00 39 08 02 0d 0a 00 06 0e
+0a 00 5d 08 03 12 08 03 06 0d 00 00 58 08 01 2c 1e 00 06 00 32 0c 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 1a 05 07 0d 34 02 49 08 0c 17 0c 00 07 0f 0a 03 4b 13 05 15 0d 05 07 0e
+34 05 63 08 0b 0c 0a 00 05 0f 0a 03 63 08 01 74 1e 0b 09 00 32 00 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 34 63 63 63 32 32 32 00 30
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.4
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 1a 05 07 0d 34 00 49 08 0c 17 0d 00 07 0f 0a 00 3f 13 05 15 0d 05 07 0e
+34 00 63 08 0b 0c 0a 00 05 0f 0a 00 5a 08 01 74 1e 0b 09 00 32 00 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 34 63 63 63 32 32 32 00 30
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 03 06 05 0a 29 03 48 08 14 0c 0a 08 06 09 0a 00 4a 0d 0a 0d 0b 06 05 09
+1a 03 61 0a 04 0c 09 08 07 09 15 03 63 08 01 35 1e 1a 0c 00 22 00 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 35 63 63 63 32 32 32 00 40
+00 40 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.5
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 03 06 04 0f 29 00 48 08 14 0c 0a 01 05 0e 0a 00 4a 08 0a 0d 0b 06 04 0f
+1a 00 4f 0a 04 0c 09 00 04 0e 15 00 5e 08 01 35 1e 1a 0c 00 22 00 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 35 63 63 63 32 32 32 00 40
+00 10 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.6
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0a 02 05 05 00 40 4c 08 0a 1a 05 00 07 0e 0a 6d 50 19 04 0b 0a 03 05 0f
+00 40 56 08 10 17 0a 00 06 0f 14 44 5b 0d 05 24 1d 19 3d 25 26 0c 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 36 63 63 63 32 32 32 00 30
+00 20 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.6
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 0a 02 05 05 00 40 4c 08 0a 0a 05 00 07 0e 0a 41 35 13 04 13 08 02 05 0f
+00 40 56 08 10 10 0a 00 06 0f 14 40 5b 08 05 24 1c 00 2a 0b 26 0c 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 36 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.7
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0c 04 04 0e 49 03 51 04 08 12 0c 04 04 0e 0a 04 4d 08 0a 0e 10 00 07 0e
+49 03 5f 08 04 12 10 00 05 0e 00 04 51 08 01 2c 1c 00 0f 00 42 18 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 37 63 63 63 32 32 32 00 40
+00 10 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Symphony.7
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0c 04 04 0e 49 00 51 04 08 12 0c 04 04 0e 0a 00 4d 08 0a 0e 10 00 07 0e
+49 00 5f 08 04 12 10 00 05 0e 00 00 51 08 01 2c 1c 00 0f 00 42 18 04 04 00
+63 32 63 00 00 32 00 53 79 6d 70 68 6f 6e 79 2e 37 63 63 63 32 32 32 00 40
+00 10 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* CATEGORY WIND
+
+* SUBCATEGORY Brass
+
+** Name: AnlgBrass1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 07 00 07 0e 0f 04 55 08 0b 0d 1f 00 07 0f 0a 04 5f 04 03 0d 1f 00 08 0f
+00 04 5f 08 03 0d 1f 00 07 0f 0a 04 5f 04 03 2e 1f 0e 10 00 52 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 07 00 07 0e 0f 01 55 08 0b 0d 1f 00 07 0f 0a 00 5f 04 03 0d 1f 00 08 0f
+00 01 5f 08 03 0d 1f 00 07 0f 0a 00 5f 04 03 2e 1f 0e 10 00 52 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 04 03 07 0c 00 02 53 04 03 0f 05 01 08 0f 00 04 56 04 03 10 1f 00 09 0f
+00 06 55 04 03 0f 05 01 08 0f 00 06 5a 04 03 2d 1f 00 05 00 62 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 32 63 63 63 32 32 32 00 00
+00 20 00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 04 03 07 0c 00 02 53 04 03 0f 05 01 08 0f 00 00 56 04 03 10 1f 00 09 0f
+00 01 55 04 03 0f 05 01 08 0f 00 00 5a 04 03 2d 23 00 05 00 52 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 32 63 63 63 32 32 32 00 00
+00 20 00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 07 00 07 0e 00 04 4d 04 01 0d 1f 00 07 0f 0a 02 5f 04 04 0d 1f 00 08 0f
+00 05 5f 08 04 0f 1f 00 07 0f 0a 05 5f 08 06 3e 1f 0e 10 00 52 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 33 63 63 63 32 32 32 00 20
+00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 07 00 07 0e 00 01 4d 08 01 0d 1f 00 07 0f 0a 01 5f 04 04 0d 1f 00 08 0f
+00 01 5f 08 04 0d 1f 00 07 0f 0a 01 5f 08 06 3e 1f 0e 10 00 52 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 33 63 63 63 32 32 32 00 20
+00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 04 00 07 0f 00 05 53 04 0a 0f 03 04 08 01 00 03 55 04 06 10 1f 00 09 05
+00 05 55 04 04 0f 03 04 08 01 00 05 5a 04 06 2d 23 00 00 00 62 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 34 63 63 63 32 32 32 00 30
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 04 00 07 0f 00 01 53 04 0a 0f 03 04 08 01 00 00 55 04 06 10 1f 00 09 05
+00 01 55 04 04 0f 03 04 08 01 00 00 5a 04 06 2d 23 00 00 00 62 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 34 63 63 63 32 32 32 00 30
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 0a 06 07 0c 00 02 53 04 0b 15 10 06 07 09 00 03 49 04 06 16 07 06 08 0f
+00 03 63 04 03 10 1b 06 07 0c 00 03 62 04 06 34 23 00 05 00 32 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 35 63 63 63 32 32 32 00 00
+00 20 00 30 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 0a 06 07 0c 00 01 5b 04 0b 15 10 06 07 09 00 00 59 04 06 16 07 06 08 0f
+00 01 63 04 03 10 1b 06 07 0c 00 00 62 04 06 34 23 00 05 00 32 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 35 63 63 63 32 32 32 00 00
+00 20 00 30 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 0a 06 07 0c 00 02 53 04 09 15 09 06 06 0b 1e 02 52 04 0d 0f 07 06 08 0f
+00 06 4c 04 04 11 0a 05 07 0c 0f 05 62 04 06 23 1e 25 25 00 32 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 36 63 63 63 32 32 32 00 20
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 0a 06 07 0c 00 02 53 04 09 15 09 06 06 0b 1e 01 52 04 0d 16 07 06 08 0f
+00 01 4c 04 04 11 0a 05 07 0c 0f 00 62 04 06 23 28 25 02 00 32 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 36 63 63 63 32 32 32 00 20
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass7
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 0a 03 0d 0c 00 02 58 04 0c 10 1f 09 0e 0d 00 02 63 04 05 16 1f 05 0d 0e
+00 05 63 04 06 10 1f 06 0e 0d 00 05 62 04 06 25 22 24 0f 00 42 0c 02 05 00
+63 63 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 37 63 63 63 32 32 32 00 20
+00 40 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass7
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 0a 03 0d 0c 00 02 58 04 0c 0f 1f 09 0e 0d 00 00 63 04 05 16 1f 05 0d 0e
+00 00 63 04 06 10 1f 06 0e 0d 00 00 62 04 06 25 22 24 0f 00 42 0c 02 05 00
+63 63 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 37 63 63 63 32 32 32 00 20
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 06 0d 0f 00 01 61 00 0a 1f 0a 06 0d 0f 00 03 5e 00 04 1f 18 06 0d 0f
+00 03 5e 04 03 1f 18 06 0d 0f 00 03 5e 00 05 26 28 00 00 00 32 18 02 05 00
+63 63 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 38 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass8
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 06 0d 0f 00 01 61 00 0a 1f 0a 06 0d 0f 00 00 5e 00 04 1f 18 06 0d 0f
+00 00 5e 04 03 1f 18 06 0d 0f 00 00 5e 00 05 26 28 00 00 00 32 18 02 05 00
+63 63 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 38 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass9
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 06 0d 0f 00 01 51 04 0b 12 0c 02 0f 0a 0a 03 51 04 0e 1f 16 08 0f 0c
+00 04 63 04 06 1f 06 04 0d 0c 00 03 5e 04 03 3c 2b 00 00 00 32 0c 02 05 00
+63 63 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 39 63 63 63 32 32 32 00 00
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBrass9
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 06 0d 0f 00 01 51 04 0b 12 0c 02 0f 0a 0a 01 51 04 0e 1f 16 08 0f 0c
+00 00 63 04 06 1f 06 04 0d 0c 00 00 5e 04 03 3c 2b 00 00 00 32 0c 02 05 00
+63 63 00 00 00 32 00 41 6e 6c 67 42 72 61 73 73 39 63 63 63 32 32 32 00 00
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AtackBrass
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 6
+0f 1f 04 07 0f 00 02 53 05 0d 0f 0e 00 08 0e 00 01 5b 04 02 10 1f 00 09 0f
+00 04 61 05 05 10 05 00 07 0e 00 04 63 04 09 34 1c 15 06 00 52 11 04 04 00
+63 32 00 00 00 32 00 41 74 61 63 6b 42 72 61 73 73 63 63 63 32 32 32 00 01
+00 38 00 01 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Back Brass
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0d 1f 00 08 0f 00 00 43 04 03 0d 0e 00 0f 00 00 00 47 04 03 1f 1f 00 0f 0f
+00 00 00 04 03 0f 1f 00 08 0f 00 00 5a 04 03 3a 1e 00 00 00 52 0c 04 04 00
+63 32 00 00 00 32 00 42 61 63 6b 20 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BC1 Feed
+** Controls: KV, MW (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 03 00 0a 0e 00 3c 47 04 03 12 1f 00 0a 0f 00 04 4b 08 02 12 1f 00 0a 0f
+45 04 4f 08 03 12 1f 00 0a 0f 01 05 5f 08 03 3b 23 01 0a 00 62 0c 02 04 00
+63 32 00 00 00 32 63 42 43 31 20 46 65 65 64 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BC1 Horns
+** Controls: KV, MW (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 09 00 08 0e 00 3b 4a 04 0b 09 1f 00 08 0f 00 24 3d 04 03 0a 1f 00 0f 0f
+00 25 21 0b 03 0e 1f 00 09 0f 00 2e 63 04 0b 3a 20 05 03 00 62 0c 02 04 00
+63 63 00 00 00 32 63 42 43 31 20 48 6f 72 6e 73 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BC1 Horns
+** Controls: MW (LFO pitch), BC (EG amplitude)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0e 09 00 08 0e 00 00 4a 04 0b 0e 1f 00 08 0f 00 20 3d 04 03 0f 1f 00 0f 0f
+00 20 21 0b 03 12 1f 00 09 0f 00 28 63 04 0b 3a 20 05 03 00 62 0c 02 04 00
+63 63 00 00 00 32 63 42 43 31 20 48 6f 72 6e 73 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 9
+10 09 00 09 0a 00 01 50 04 09 10 0b 00 09 0a 00 01 52 04 0a 14 1f 00 0a 0f
+00 01 62 04 0a 13 1f 00 0a 0f 00 01 62 08 0c 3c 20 06 03 00 52 18 02 04 00
+28 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 09 00 09 0d 00 01 50 04 09 10 0b 00 09 0d 00 01 52 04 0d 14 1f 00 0a 0f
+00 01 62 04 0a 13 1f 00 0a 0f 00 01 62 08 0c 3c 20 06 03 00 52 18 02 04 00
+28 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 1
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0d 0d 00 07 0d 01 00 47 04 0e 0d 0d 00 0a 0f 2d 00 4f 04 0e 0d 0d 00 08 0b
+00 00 63 04 08 0d 0d 00 08 0b 00 00 63 04 09 3c 23 00 00 00 62 18 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 10
+11 0a 00 09 0a 00 02 53 04 0c 0a 08 00 08 0a 00 02 59 00 08 15 1f 00 0a 0f
+00 01 62 04 0e 12 1f 00 09 0f 00 01 63 00 0a 3c 20 06 03 00 52 18 02 04 00
+28 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+11 0d 00 09 0d 00 02 53 04 0c 0d 08 00 08 0d 00 02 59 00 08 15 1f 00 0a 0f
+00 01 62 04 0e 12 1f 00 09 0f 00 01 63 00 0a 3c 20 06 03 00 52 18 02 04 00
+28 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 2
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0c 07 03 04 0f 16 00 4e 00 06 0e 07 02 06 0e 21 00 54 00 06 17 0d 00 04 0f
+00 00 5c 00 08 16 0d 00 06 0f 00 00 5c 00 08 34 23 00 00 00 62 18 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 3
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+19 05 00 05 0e 0a 00 51 04 06 1f 04 00 05 0a 00 00 37 04 00 14 0b 0f 0a 0f
+00 00 50 04 06 14 1f 00 0a 0f 00 00 63 04 00 32 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 4
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0f 0a 00 05 0d 00 00 49 04 03 15 1f 00 0a 0f 00 00 5c 04 03 15 1f 00 0a 0f
+00 00 5c 04 03 15 1f 00 0a 0f 00 00 5c 04 03 3d 23 14 0a 00 62 0c 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 5
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+11 0e 00 05 0e 0a 00 4a 04 03 11 11 00 09 0c 00 00 46 04 03 1f 10 00 0f 05
+20 00 34 0b 0b 15 1f 00 0b 0f 00 00 60 04 0b 3a 23 1b 0a 00 62 0c 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 6
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 13 00 03 0b 00 00 55 04 03 1f 15 11 03 0c 1e 00 4f 10 03 1f 1f 00 03 0f
+1e 00 46 04 03 1f 1f 00 05 0f 00 00 5a 04 03 3b 23 0f 10 00 62 0c 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 7
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 11 13 0c 0b 0f 00 48 22 03 1f 0b 00 03 0f 1e 00 39 04 03 1f 11 00 03 0e
+1e 00 5d 04 03 19 1f 00 05 0f 00 00 5a 08 03 39 23 0f 10 00 62 0c 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 20 20 20 20 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 5th
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 06 06 08 0b 21 02 55 0a 02 13 05 06 08 0b 0a 04 4b 08 06 13 15 06 08 0b
+0a 06 63 0a 02 13 05 06 08 0b 0a 05 63 08 06 2c 26 21 00 47 12 0c 04 05 00
+28 32 00 00 00 32 00 42 72 61 73 73 20 35 74 68 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass 5th
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 06 06 08 0b 21 02 55 0a 02 13 05 06 08 0b 0a 02 4b 08 06 13 15 06 08 0b
+0a 01 63 0a 02 13 05 06 08 0b 0a 00 63 08 06 2c 26 21 00 47 12 0c 04 05 00
+28 32 00 00 00 32 00 42 72 61 73 73 20 35 74 68 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+08 07 06 08 0c 27 02 58 04 06 08 09 05 09 0e 47 03 60 04 04 14 08 06 08 0d
+00 05 5a 04 02 13 07 06 08 0c 00 04 5f 04 00 3c 1f 2d 01 00 42 18 04 05 00
+28 32 00 00 00 32 00 42 72 61 73 73 2e 2e 2e 2e 31 63 63 63 32 32 32 00 20
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+08 07 06 08 0c 27 02 58 04 06 08 09 05 09 0e 47 01 60 04 04 15 08 06 08 0d
+00 00 5a 04 02 15 07 06 08 0c 00 00 5f 04 00 3c 1f 2d 01 00 42 18 04 05 00
+28 32 00 00 00 32 00 42 72 61 73 73 2e 2e 2e 2e 31 63 63 63 32 32 32 00 20
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 1b 06 07 09 27 01 51 04 04 0e 0a 04 0a 00 00 05 4b 04 0c 0f 0a 06 07 0c
+00 06 4e 04 05 11 07 06 08 0c 00 06 63 04 0d 3b 23 2d 05 00 22 18 04 05 00
+28 32 00 00 00 32 00 42 72 61 73 73 2e 2e 2e 2e 32 63 63 63 32 32 32 00 50
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 1b 06 07 09 27 01 51 04 04 0e 0a 04 0a 00 00 01 4b 04 0c 0f 0a 06 07 0c
+00 02 4e 00 05 11 07 06 08 0c 00 01 63 04 0d 3b 23 2d 05 00 22 18 04 05 00
+28 32 00 00 00 32 00 42 72 61 73 73 2e 2e 2e 2e 32 63 63 63 32 32 32 00 50
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 1b 06 07 09 27 05 59 04 05 0c 0a 04 0a 00 00 05 43 04 08 0f 0a 06 07 0c
+00 05 49 04 04 10 07 06 08 0c 00 05 63 04 0c 33 23 0c 0f 00 32 18 04 05 00
+28 32 00 00 00 32 00 42 72 61 73 73 2e 2e 2e 2e 33 63 63 63 32 32 32 00 20
+00 40 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 1b 06 07 09 27 02 59 04 05 0c 0a 04 0a 00 00 01 43 04 08 0f 0a 06 07 0c
+00 01 49 04 04 10 07 06 08 0c 00 01 63 04 0c 33 23 0c 0f 00 32 18 04 05 00
+28 32 00 00 00 32 00 42 72 61 73 73 2e 2e 2e 2e 33 63 63 63 32 32 32 00 20
+00 40 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassChime
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+11 04 04 09 0f 00 03 50 04 0b 1f 06 06 05 0d 00 45 52 19 03 14 07 05 06 0e
+00 44 61 04 0b 1f 06 06 06 0d 00 46 53 0d 02 64 24 23 00 2b 06 18 04 04 00
+63 01 63 00 00 32 00 42 72 61 73 73 43 68 69 6d 65 63 63 63 32 32 32 00 10
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassChime
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+11 04 04 09 0f 00 01 50 04 0b 1f 06 06 05 0d 00 41 52 19 03 14 07 05 06 0e
+00 40 61 04 0b 1f 06 06 06 0d 00 41 53 0d 02 64 24 23 00 2b 06 18 04 04 00
+63 01 63 00 00 32 00 42 72 61 73 73 43 68 69 6d 65 63 63 63 32 32 32 00 10
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassEns.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 11 03 06 0f 00 02 47 00 0e 15 13 05 07 0f 3c 03 44 00 00 10 1f 04 06 0f
+00 04 61 00 02 0e 0c 07 06 0e 14 04 60 00 02 5c 0e 00 0d 00 12 18 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 45 6e 73 2e 31 63 63 63 32 32 32 00 00
+00 30 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassEns.1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 11 03 06 0f 00 00 47 00 0e 15 13 05 07 0f 3c 00 44 00 00 13 1f 04 06 0f
+00 00 61 00 02 14 0c 07 06 0e 14 00 60 00 02 5c 0e 00 0d 00 12 18 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 45 6e 73 2e 31 63 63 63 32 32 32 00 00
+00 30 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassEns.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 11 03 06 0f 00 01 4f 04 0d 0e 13 04 07 0f 2b 01 60 04 01 13 1f 04 06 0f
+00 45 62 04 01 14 0c 07 06 0e 14 04 63 04 05 35 26 00 00 26 16 18 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 45 6e 73 2e 32 63 63 63 32 32 32 00 30
+00 60 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassEns.2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 11 03 06 0f 00 01 4f 04 0d 0e 13 04 07 0f 2b 01 60 04 01 13 1f 04 06 0f
+00 40 62 04 01 14 0c 07 06 0e 14 01 63 04 05 35 26 00 00 26 16 18 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 45 6e 73 2e 32 63 63 63 32 32 32 00 30
+00 60 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassEns.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 05 03 04 0f 00 01 57 04 0a 0e 09 04 06 0f 00 02 45 04 00 0c 1f 04 06 0f
+00 04 5c 04 05 0f 0c 04 05 0e 00 05 60 04 05 64 20 33 0b 00 22 18 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 45 6e 73 2e 33 63 63 63 32 32 32 00 30
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassEns.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 05 03 04 0f 00 01 52 00 0b 16 09 04 06 0f 00 01 45 04 03 10 1f 04 06 0f
+00 00 5c 00 03 13 0c 04 05 0e 00 00 60 00 03 64 20 33 0b 00 22 18 04 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 45 6e 73 2e 33 63 63 63 32 32 32 00 40
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassEns.4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 03 09 0c 00 02 3a 04 09 14 08 04 09 0f 00 02 41 04 02 0c 0c 09 07 0f
+00 05 3f 04 05 11 05 04 07 0e 00 04 63 04 04 63 20 33 0b 00 32 18 02 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 45 6e 73 2e 34 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassEns.4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 03 09 0c 00 02 3a 04 09 1f 08 04 09 0f 00 02 41 04 02 1f 0c 09 07 0f
+00 01 3f 04 05 0f 05 04 07 0e 00 00 63 04 04 63 20 33 0b 00 32 18 02 04 00
+63 32 00 00 00 32 00 42 72 61 73 73 45 6e 73 2e 34 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrassSynth
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+0d 0a 00 06 0d 00 39 53 04 0c 09 05 00 05 0d 00 39 59 00 08 0e 16 00 07 0f
+00 01 62 04 0e 0e 16 00 06 0f 00 01 63 00 0a 3c 20 06 03 00 52 18 02 04 00
+28 32 00 00 00 32 00 42 72 61 73 73 53 79 6e 74 68 63 63 63 32 32 32 00 00
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass.Vibe
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 1f 06 07 09 00 02 54 04 06 10 0a 05 0a 00 00 03 52 04 03 0f 0a 06 07 0c
+5a 06 4d 04 03 11 07 06 08 0c 00 06 60 04 00 73 23 00 19 00 32 18 02 05 00
+63 32 00 32 00 32 00 42 72 61 73 73 2e 56 69 62 65 63 63 63 32 32 32 00 10
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brass.Vibe
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 1f 06 07 09 00 02 54 04 06 10 0a 05 0a 00 00 02 52 04 03 0f 0a 06 07 0c
+5a 00 4d 04 03 11 07 06 08 0c 00 01 60 04 00 73 23 00 19 00 32 18 02 05 00
+63 32 00 32 00 32 00 42 72 61 73 73 2e 56 69 62 65 63 63 63 32 32 32 00 10
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brassy *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 08 00 03 0f 19 01 51 04 06 0d 08 00 04 0f 27 00 4d 04 00 12 1f 00 06 0f
+09 00 63 04 06 10 0c 00 05 0f 0d 00 63 04 03 34 17 00 0b 00 52 05 02 04 00
+28 1e 00 00 00 32 00 42 72 61 73 73 79 20 20 20 2a 63 63 63 32 32 32 00 08
+00 08 00 08 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chariots
+** Controls: KV, MW (LFO amplitude)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+0e 0e 00 02 0f 00 40 4e 04 00 0d 0e 00 02 0f 00 00 32 00 06 0f 0c 00 04 0f
+00 42 63 08 08 0d 0e 00 04 0f 00 02 63 04 0e 3c 1d 00 00 08 0d 18 02 04 00
+28 32 0d 00 00 32 00 43 68 61 72 69 6f 74 73 20 20 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ChorusBras
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 4
+0e 08 00 06 0d 00 02 4e 05 06 0e 08 00 09 0d 00 02 57 04 00 0e 12 00 08 0f
+00 02 63 05 06 0e 12 00 08 0f 00 02 63 04 00 3c 1c 06 06 00 52 05 04 04 00
+63 32 00 00 00 32 00 43 68 6f 72 75 73 42 72 61 73 63 63 63 32 32 32 00 01
+00 38 00 01 00 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ensemble *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0c 00 02 0f 00 00 46 0a 00 0d 14 00 04 0f 2f 00 4e 09 06 0b 0b 00 05 0f
+00 02 63 09 06 0d 0b 00 05 0f 00 02 63 13 04 3c 1e 2d 0c 00 42 05 02 04 00
+28 63 00 00 00 32 00 45 6e 73 65 6d 62 6c 65 20 2a 63 63 63 32 32 32 00 30
+00 12 00 02 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ensemble 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 3
+14 06 00 04 0a 14 02 3d 1c 06 0b 04 02 04 07 14 01 52 13 00 0a 07 02 05 0a
+00 01 63 09 06 0f 06 01 05 0b 00 01 5e 0a 00 3c 21 08 0c 00 52 05 02 04 00
+63 32 00 00 00 32 00 45 6e 73 65 6d 62 6c 65 20 31 63 63 63 32 32 32 00 40
+00 30 00 22 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ensemble 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 06 00 04 0a 14 02 3d 1c 06 0b 04 02 04 07 14 01 52 13 00 0a 07 02 05 0d
+00 01 63 09 06 0f 06 01 05 0b 00 01 5e 0a 00 3c 21 08 0c 00 52 05 02 04 00
+63 32 00 00 00 32 00 45 6e 73 65 6d 62 6c 65 20 31 63 63 63 32 32 32 00 40
+00 30 00 22 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ensemble 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 4
+14 06 00 04 08 14 02 3d 1c 06 0b 04 02 04 08 14 01 50 13 00 0c 07 02 05 0b
+00 01 63 09 06 11 06 01 05 0b 00 01 5e 0a 00 3c 21 08 0c 00 52 05 02 04 00
+63 32 00 00 00 32 00 45 6e 73 65 6d 62 6c 65 20 32 63 63 63 32 32 32 00 50
+00 30 00 42 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Full Brass
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 2
+0f 1f 08 09 0f 00 03 4f 04 05 0f 1f 09 09 0f 00 02 63 04 03 10 1f 00 08 0f
+00 02 63 04 05 11 1f 00 08 0f 00 02 63 04 06 3d 1d 0f 08 00 52 0c 04 04 00
+63 32 00 00 00 32 00 46 75 6c 6c 20 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hard Brass
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+14 1f 00 0a 0f 00 00 47 04 03 1f 1f 00 0f 0f 00 00 3a 04 03 1f 1f 00 0f 0f
+00 00 34 04 03 19 1f 00 0a 0f 00 00 63 04 03 3a 23 00 00 00 62 18 07 04 00
+63 63 00 00 00 32 00 48 61 72 64 20 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 14
+0a 07 00 09 0e 0a 01 4d 00 0b 10 08 00 0a 0a 1c 02 43 00 0b 10 0f 00 0a 05
+09 03 40 06 0b 0f 18 00 0a 0f 00 02 63 00 0b 3a 1e 09 02 00 62 18 02 04 00
+28 13 00 00 00 32 00 48 6f 72 6e 20 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 20 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 07 00 09 0e 0d 01 4d 00 0b 10 08 00 0a 0a 1c 02 43 00 0b 10 0f 00 0a 05
+09 03 40 06 0b 0f 18 00 0a 0f 00 02 63 00 0b 3a 1e 09 02 00 62 18 02 04 00
+28 13 00 00 00 32 00 48 6f 72 6e 20 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 20 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+10 09 00 09 0d 0a 00 41 04 03 0f 0b 00 08 0e 00 00 3f 04 03 1f 11 00 0f 03
+0a 00 31 18 0b 12 1f 00 0a 0f 00 00 5a 04 03 3a 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 48 6f 72 6e 20 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 1f 0b 07 0f 00 02 55 04 04 0e 1f 00 08 0f 00 03 51 04 06 10 1f 00 09 0f
+00 05 5a 08 04 0f 1f 00 08 0f 00 05 5b 04 06 3d 23 00 00 00 62 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 20
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 1f 0b 07 0f 00 02 55 04 04 0e 1f 00 08 0f 00 01 51 04 06 10 1f 00 09 0f
+00 01 5a 08 04 0f 1f 00 08 0f 00 00 5b 04 06 3d 23 00 00 00 62 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 20
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0a 06 07 09 00 01 50 08 06 0f 08 06 08 0a 00 05 49 04 03 16 10 06 0a 00
+00 05 46 1a 14 10 07 06 09 0c 00 06 60 04 01 22 23 00 04 00 32 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 30
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0a 06 07 09 00 01 50 08 06 0f 08 06 08 0a 00 01 49 04 03 16 10 06 0a 00
+00 02 46 1a 14 10 07 06 09 0c 00 01 60 04 01 22 23 00 04 00 32 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 30
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 1f 06 07 0f 00 01 4e 04 05 0f 09 05 07 05 42 06 54 04 1a 0f 09 06 07 04
+00 04 49 04 14 10 06 04 08 0b 00 06 60 04 02 2b 23 00 08 00 42 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 10
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 1f 06 07 0f 00 01 4e 04 05 0f 09 05 07 05 42 01 54 04 1a 0f 09 06 07 04
+00 00 49 04 14 10 06 04 08 0b 00 01 60 04 02 2b 23 00 08 00 42 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 10
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 07 03 08 0c 00 03 51 04 06 10 0a 04 0a 0c 00 04 63 04 04 0f 0a 03 0a 0f
+00 04 63 04 02 12 16 02 0a 0b 00 06 61 04 04 2d 20 13 09 00 32 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 34 63 63 63 32 32 32 00 50
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 07 03 08 0c 00 03 51 04 06 10 0a 04 0a 0c 00 00 63 04 04 0f 0a 03 0a 0f
+00 01 63 04 02 12 16 02 0a 0b 00 00 61 04 04 2d 20 13 09 00 32 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 34 63 63 63 32 32 32 00 50
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 07 08 0a 0f 00 04 49 04 01 11 09 08 09 0d 00 03 53 04 0d 15 04 01 0c 0f
+1e 06 3c 04 01 11 06 05 09 0f 00 05 5a 03 05 63 23 00 00 00 32 11 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 35 63 63 63 32 32 32 00 08
+00 38 00 08 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 07 08 0a 0f 00 02 49 04 01 11 09 08 09 0d 00 01 53 04 0d 15 04 01 0c 0f
+1e 00 3c 04 01 11 06 05 09 0f 00 00 5a 03 05 63 23 00 00 00 32 11 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 35 63 63 63 32 32 32 00 08
+00 38 00 08 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 07 02 0a 0f 00 02 4f 08 06 11 08 06 09 0d 00 04 63 08 0c 15 04 01 0c 0f
+1e 06 57 0d 02 10 06 05 09 0f 00 05 63 04 04 75 23 00 08 00 42 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 07 02 0a 0f 00 02 4f 08 06 11 08 06 09 0d 00 00 63 08 0c 15 04 01 0c 0f
+1e 00 57 0d 02 10 06 05 09 0f 00 00 63 04 04 75 23 00 08 00 42 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 0a 06 07 09 00 01 4e 08 06 13 08 06 08 0a 00 04 47 04 03 0f 03 06 07 09
+55 06 3e 10 04 15 07 06 09 0c 00 05 62 04 01 2b 23 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horn.....7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 0a 06 07 09 00 01 4e 08 06 13 08 06 08 0a 00 00 47 04 03 0f 03 06 07 09
+55 01 3e 10 04 15 07 06 09 0c 00 01 62 04 01 2b 23 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 2e 2e 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horns
+** Controls: KV
+** Source: DX100 GLIB patch (Michael Kesti and others)
+0e 1f 08 07 0f 00 00 46 04 03 0e 1f 04 08 0f 00 07 4b 04 06 10 1f 05 09 0f
+00 00 56 04 03 0f 1f 13 08 0f 00 00 46 04 06 3d 23 00 00 00 62 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 73 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horns
+** Controls: KV
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 08 08 07 08 00 03 52 04 03 1f 0a 04 08 0f 00 03 48 04 06 1f 10 05 09 0f
+00 04 5b 08 03 1f 05 09 08 0f 00 04 63 08 03 3d 23 00 00 00 62 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 73 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horns
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0d 1f 0b 07 0f 00 00 46 04 03 0e 1f 00 08 0f 00 00 48 04 06 10 1f 00 09 0f
+00 00 5b 04 03 0f 1f 00 08 0f 00 00 5b 04 06 3d 23 00 00 00 62 0c 02 04 00
+63 63 00 00 00 32 00 48 6f 72 6e 73 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Horns BC
+** Controls: KV, BC (EG amplitude)
+** Source: Yamaha TX81Z factory preset, bank B, voice 8
+0e 09 00 07 0e 00 22 51 04 03 0f 1f 00 08 0f 00 22 52 05 06 11 1f 00 09 0f
+00 23 63 04 00 10 1f 00 09 0f 00 2a 60 04 00 3d 1d 00 00 00 52 05 04 04 00
+63 32 00 00 00 32 63 48 6f 72 6e 73 20 42 43 20 20 63 63 63 32 32 32 00 08
+00 01 00 08 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: JonesBrass
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0b 03 01 07 0d 1f 00 49 04 06 0b 03 01 07 0d 00 00 5d 04 0e 11 01 01 05 0d
+00 00 63 04 10 16 04 01 05 0d 00 00 3c 04 10 3c 23 00 00 00 62 0c 02 04 00
+63 32 00 32 00 32 00 4a 6f 6e 65 73 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LightBrass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 04 01 06 0d 00 00 3b 04 04 1d 12 13 06 0c 00 03 41 08 03 1d 0a 09 06 0c
+5a 05 42 04 03 10 03 01 09 0f 00 05 60 04 03 02 1c 0f 10 00 42 18 02 05 00
+63 32 00 32 00 32 00 4c 69 67 68 74 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LightBrass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 04 01 06 0d 00 00 3b 04 04 1d 12 13 06 0c 00 00 41 08 03 1d 0a 09 06 0c
+5a 00 42 04 03 10 03 01 09 0f 00 01 60 04 03 02 1c 0f 10 00 42 18 02 05 00
+63 32 00 32 00 32 00 4c 69 67 68 74 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+--Bank 2
+
+** Name: MelloBrass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 11 02 06 0d 00 02 53 04 00 0e 07 02 07 0c 00 05 5a 04 06 0f 0f 01 08 0f
+5a 06 63 04 00 10 12 00 07 0f 00 06 5f 04 05 34 1c 0f 0b 00 42 18 02 05 00
+63 32 00 32 00 32 00 4d 65 6c 6c 6f 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MelloBrass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 11 02 06 0d 00 02 53 04 00 0e 07 02 07 0c 00 02 5a 04 06 0f 0f 01 08 0f
+5a 01 63 04 00 10 12 00 07 0f 00 01 5f 04 05 34 1c 0f 0b 00 42 18 02 05 00
+63 32 00 32 00 32 00 4d 65 6c 6c 6f 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MufflBrass
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+16 0f 00 09 0d 00 02 52 04 0c 12 0a 00 08 0d 00 02 47 00 08 1a 1f 00 0a 0f
+00 01 63 04 0e 17 1f 00 09 0f 00 01 63 00 0a 3c 20 06 03 00 52 18 02 04 00
+28 32 00 00 00 32 00 4d 75 66 66 6c 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Brass
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 09 09 07 0d 3f 03 4b 08 0b 12 09 09 07 0d 0d 04 52 04 0b 0f 09 09 07 0d
+63 05 42 04 13 10 09 09 07 0d 23 06 63 04 0b 7a 20 3e 06 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 20 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Brass
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 09 09 07 0d 3f 00 4b 08 0b 12 09 09 07 0d 0d 00 52 04 0b 0f 09 09 07 0d
+63 00 42 04 13 10 09 09 07 0d 23 00 63 04 0b 7a 20 3e 06 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 20 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianoBrass
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 12 06 07 0f 0a 04 5d 04 0b 1b 06 06 07 08 00 06 56 04 0b 15 07 06 08 0f
+00 05 5c 04 02 1b 06 06 07 08 00 05 63 04 0d 64 23 00 00 00 22 0c 02 04 00
+28 02 00 00 00 32 00 50 69 61 6e 6f 42 72 61 73 73 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianoBrass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+08 1f 00 05 0f 10 04 4e 04 06 1f 05 00 0f 0b 63 06 46 0d 1b 0a 1f 00 09 0f
+63 03 63 04 1b 1f 06 04 06 0f 00 06 63 08 13 3c 23 34 03 00 62 0c 07 04 00
+63 32 63 32 00 32 00 50 69 61 6e 6f 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianoBrass
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 12 06 07 0f 0a 01 5d 04 0b 1b 06 06 07 08 00 01 56 04 0b 15 07 06 08 0f
+00 00 5c 04 02 1b 06 06 07 08 00 00 63 04 0d 64 23 00 00 00 22 0c 02 04 00
+28 02 00 00 00 32 00 50 69 61 6e 6f 42 72 61 73 73 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianoBrass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+08 1f 00 05 0f 10 01 4e 04 06 1f 05 00 0f 0b 63 02 46 0d 1b 0a 1f 00 09 0f
+63 00 63 04 1b 1f 06 04 06 0f 00 00 63 08 13 3c 23 34 03 00 62 0c 07 04 00
+63 32 63 32 00 32 00 50 69 61 6e 6f 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pianobrass
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0b 03 01 07 0d 1f 00 48 04 0e 16 0c 08 04 0b 34 00 35 2a 16 11 01 01 05 0d
+00 00 63 04 10 16 04 01 05 0d 00 00 63 04 10 3c 23 00 00 00 62 0c 02 04 00
+63 32 00 32 00 32 00 50 69 61 6e 6f 62 72 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: POWERBRASS
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+10 0f 00 03 0c 00 00 49 0a 06 1a 1f 00 03 0f 00 00 49 04 03 13 1f 00 05 0f
+00 00 48 04 03 1b 1f 00 0b 0f 00 00 63 04 03 38 20 14 1f 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 4f 57 45 52 42 52 41 53 53 63 63 63 32 32 32 00 30
+00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PowerBrass
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+10 0f 00 03 0c 00 00 49 0a 06 1a 1f 00 03 0f 00 00 49 04 03 13 1f 00 05 0f
+00 00 48 04 03 1b 1f 00 0b 0f 00 00 63 04 03 38 20 14 1f 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 6f 77 65 72 42 72 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SplatBrass
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 00 08 0f 63 02 5b 04 03 0c 0a 04 09 0a 00 05 54 04 0c 15 1f 00 0a 0b
+4c 05 45 0d 03 14 07 03 09 0c 00 05 62 04 03 73 23 01 0d 00 32 18 04 05 00
+28 32 00 00 00 32 00 53 70 6c 61 74 42 72 61 73 73 63 63 63 32 32 32 00 40
+00 20 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SplatBrass
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 00 08 0f 63 02 5b 04 03 0c 0a 04 09 0a 00 01 54 04 0c 15 1f 00 0a 0b
+4c 01 45 0d 03 14 07 03 09 0c 00 01 62 04 03 73 23 01 0d 00 32 18 04 05 00
+28 32 00 00 00 32 00 53 70 6c 61 74 42 72 61 73 73 63 63 63 32 32 32 00 40
+00 20 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpitBoneBC
+** Controls: KV, MW (LFO pitch), BC (EG amplitude)
+** Source: Yamaha TX81Z factory preset, bank B, voice 7
+0c 05 00 08 0e 00 2a 52 04 0b 10 1f 00 08 0f 00 1a 46 04 03 1f 0f 00 08 06
+23 23 48 0b 03 0f 1f 00 09 0f 00 2a 63 04 0c 3a 1f 19 07 00 52 0c 04 04 00
+63 32 00 00 00 32 63 53 70 69 74 42 6f 6e 65 42 43 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Brass 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 3
+12 0a 00 09 0e 00 01 53 04 08 12 0b 00 09 0e 00 01 52 04 0e 18 1f 00 0b 0f
+00 01 62 04 00 18 1f 00 0b 0f 00 01 62 04 06 3c 21 1e 04 00 62 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 42 72 61 73 73 20 31 63 5f 63 31 32 32 00 00
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Brass 2
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank A, voice 4
+12 0c 00 09 06 00 01 55 04 08 12 0c 00 09 06 00 01 5a 04 0e 18 1f 00 0b 0f
+00 01 62 04 00 18 1f 00 0b 0f 00 01 62 04 06 2c 21 00 00 00 62 0c 02 04 00
+28 32 00 00 00 32 00 53 79 2e 42 72 61 73 73 20 32 63 63 63 32 32 32 00 30
+00 30 00 70 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Brass 3
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank A, voice 5
+0f 08 00 04 0e 07 01 52 04 0b 12 0a 00 07 0b 00 00 2d 04 0b 0f 0b 00 05 0b
+00 00 4d 04 0b 11 1f 00 0a 0f 00 01 61 04 0b 3a 1f 00 00 00 62 0c 02 04 00
+28 32 00 00 00 32 00 53 79 2e 42 72 61 73 73 20 33 63 63 63 32 32 32 00 30
+00 60 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Brass 3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 08 00 04 0e 07 01 52 04 0b 12 0d 00 07 0b 00 00 2d 04 0b 0f 0b 00 05 0b
+00 00 4d 04 0b 11 1f 00 0a 0f 00 01 61 04 0b 3a 1f 00 00 00 62 0c 02 04 00
+28 32 00 00 00 32 00 53 79 2e 42 72 61 73 73 20 33 63 63 63 32 32 32 00 30
+00 60 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Brass 4
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 6
+0f 0f 00 01 0e 00 01 4c 04 06 0f 0f 00 01 0e 00 02 4c 04 00 11 09 00 0a 0c
+00 00 63 04 06 11 09 00 0a 0c 00 00 63 04 00 3c 1c 1c 0a 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 79 2e 42 72 61 73 73 20 34 63 60 63 30 32 32 00 10
+00 10 00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: TightBrass
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 06 03 09 0a 21 02 5b 04 0b 13 0e 09 0a 0a 00 04 53 08 0c 15 06 06 09 0b
+0a 06 63 04 0b 15 06 08 09 0c 00 05 61 04 1b 2c 22 21 00 10 32 18 04 05 00
+28 32 00 00 00 32 00 54 69 67 68 74 42 72 61 73 73 63 63 63 32 32 32 00 20
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: TightBrass
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 06 03 09 0a 21 02 5b 04 0b 13 0e 09 0a 0a 00 01 53 08 0c 15 06 06 09 0b
+0a 01 63 04 0b 15 06 08 09 0c 00 00 61 04 1b 2c 22 21 00 10 32 18 04 05 00
+28 32 00 00 00 32 00 54 69 67 68 74 42 72 61 73 73 63 63 63 32 32 32 00 20
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tpt.Sect.*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 0e 00 09 0e 00 01 54 04 03 15 0f 00 0a 0c 00 00 5f 08 0e 19 11 00 0a 0f
+00 00 63 04 01 17 0e 00 0a 0e 00 03 63 08 05 3c 23 00 00 00 52 0c 02 04 00
+28 63 00 00 00 32 00 54 70 74 2e 53 65 63 74 2e 2a 63 63 63 32 32 32 00 00
+00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tpt&Woodwd
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 02 05 0f 1b 42 4d 05 06 07 1f 02 05 0f 27 03 4f 04 00 11 1f 00 07 0f
+00 01 63 05 0e 0a 1f 00 04 0f 0c 01 60 04 08 3c 1f 0e 1c 00 32 11 04 05 00
+28 32 00 00 00 32 00 54 70 74 26 57 6f 6f 64 77 64 63 63 63 32 32 32 00 31
+00 38 00 11 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindEns..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 0d 03 09 0f 23 02 49 08 05 0f 10 06 07 09 00 02 41 0b 03 12 0c 05 08 0f
+45 05 4c 04 02 0c 07 05 07 0b 00 03 5f 04 02 2b 1d 1e 35 00 12 18 02 04 00
+63 32 00 00 01 32 00 57 69 6e 64 45 6e 73 2e 2e 31 63 63 63 32 32 32 00 20
+00 20 00 00 00 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindEns..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 0d 03 09 0f 23 02 49 08 05 0f 10 06 07 09 00 02 41 0b 03 12 0c 05 08 0f
+45 01 4c 04 02 15 07 05 07 0b 00 00 5f 04 02 2b 1d 1e 35 00 12 18 02 04 00
+63 32 00 00 01 32 00 57 69 6e 64 45 6e 73 2e 2e 31 63 63 63 32 32 32 00 20
+00 20 00 00 00 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindEns..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 03 09 0f 23 02 50 00 05 16 10 06 07 09 00 02 47 04 03 0d 0c 07 08 0f
+45 04 4c 00 02 0d 07 05 07 0b 00 04 5f 04 02 2b 1d 1e 35 00 12 18 02 04 00
+63 32 00 00 01 32 00 57 69 6e 64 45 6e 73 2e 2e 32 63 63 63 32 32 32 00 10
+00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindEns..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 03 09 0f 23 02 50 00 05 1f 10 06 07 09 00 01 47 04 03 14 0c 07 08 0f
+45 00 4c 00 02 0f 07 05 07 0b 00 00 5f 04 02 2b 1d 1e 35 00 12 18 02 04 00
+63 32 00 00 01 32 00 57 69 6e 64 45 6e 73 2e 2e 32 63 63 63 32 32 32 00 10
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wood Wind
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 18
+12 08 00 0a 0e 36 01 4c 08 08 1f 1f 00 07 0f 00 01 41 08 05 10 1f 00 0c 0f
+1a 03 56 04 01 0e 1f 00 0b 0f 00 03 63 08 0e 3c 20 06 04 00 52 0c 02 04 00
+28 32 00 00 00 32 00 57 6f 6f 64 20 57 69 6e 64 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 61 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wood Wind
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 08 00 0a 0e 36 01 4c 08 08 1f 1f 00 07 0f 00 01 41 08 05 10 1f 00 0c 0f
+1a 03 56 04 01 0e 1f 00 0b 0f 00 03 63 08 0e 3c 20 06 04 00 52 0c 02 04 00
+28 32 00 00 00 32 00 57 6f 6f 64 20 57 69 6e 64 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: pianohorn
+** Description: a horn sound
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+13 05 00 0e 0a 00 05 59 04 06 1f 09 00 0b 00 43 05 4d 04 13 1f 09 05 08 0e
+00 05 59 08 03 1f 12 08 08 0a 00 05 62 04 03 3c 1c 1d 10 00 52 18 01 04 00
+63 32 00 32 00 32 00 70 69 61 6e 6f 68 6f 72 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Accordion
+
+
+** Name: Accordion*
+** Controls: BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 04 03 0a 02 10 50 40 00 03 13 04 03 07 02 00 00 43 04 02 1f 04 03 07 02
+23 50 38 13 04 0f 04 03 0a 02 10 00 63 08 03 02 23 00 00 00 5a 18 02 04 00
+28 00 00 00 00 32 63 41 63 63 6f 72 64 69 6f 6e 2a 63 63 63 32 32 32 00 60
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Accordion
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank C, voice 32
+14 12 00 08 0f 00 02 54 04 08 1f 1f 00 08 0f 00 00 46 04 0e 0e 1f 00 08 0f
+0e 00 53 0a 08 0e 1f 00 08 0f 06 02 5c 08 0e 1c 1c 0a 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 41 63 63 6f 72 64 69 6f 6e 20 63 63 63 32 32 32 00 70
+00 10 00 10 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Accordion1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 05 03 07 0f 0a 02 3e 19 03 1f 04 00 05 0f 00 06 49 0d 00 12 05 03 0a 0d
+63 06 63 08 04 0e 1f 00 0a 0f 00 06 62 04 06 2c 12 00 03 00 62 18 02 04 00
+28 02 00 00 00 32 00 41 63 63 6f 72 64 69 6f 6e 31 63 63 63 32 32 32 00 20
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Accordion1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 03 07 0f 0a 01 3e 19 03 1f 04 00 05 0f 00 01 49 0d 00 12 05 03 0a 0d
+63 01 63 08 04 0e 1f 00 0a 0f 00 01 62 04 06 2c 12 00 03 00 62 18 02 04 00
+28 02 00 00 00 32 00 41 63 63 6f 72 64 69 6f 6e 31 63 63 63 32 32 32 00 20
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Accordion2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 06 00 05 0e 0a 01 41 0a 00 1f 04 00 05 0f 00 05 37 0d 00 1f 0b 00 0a 0f
+00 05 36 08 06 0e 1f 00 0a 0f 00 06 5d 04 06 3a 12 00 03 00 62 18 02 04 00
+28 02 00 00 00 32 00 41 63 63 6f 72 64 69 6f 6e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Accordion2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 06 00 05 0e 0a 01 41 0a 00 1f 04 00 05 0f 00 00 37 0d 00 1f 0b 00 0a 0f
+00 00 36 08 06 0e 1f 00 0a 0f 00 01 5d 04 06 3a 12 00 03 00 62 18 02 04 00
+28 02 00 00 00 32 00 41 63 63 6f 72 64 69 6f 6e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Accordion3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 06 00 05 0e 0a 03 3e 1c 00 1f 04 00 05 0f 00 04 37 0d 00 1f 0b 00 0a 0f
+00 04 36 0d 06 0e 1f 00 0a 0f 00 06 5c 04 06 3a 12 00 03 00 62 18 02 04 00
+28 02 00 00 00 32 00 41 63 63 6f 72 64 69 6f 6e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Accordion3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 06 00 05 0e 0a 02 3e 1c 00 1f 04 00 05 0f 00 00 37 0d 00 1f 0b 00 0a 0f
+00 00 36 0d 06 0e 1f 00 0a 0f 00 01 5c 04 06 3a 12 00 03 00 62 18 02 04 00
+28 02 00 00 00 32 00 41 63 63 6f 72 64 69 6f 6e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Accordion4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 06 00 05 0e 0a 02 3e 0d 00 1f 04 00 05 0f 00 06 3d 08 00 1f 0b 00 0a 0f
+00 05 36 08 06 0e 1f 00 0a 0f 00 06 5c 08 06 3a 12 00 03 00 62 18 02 04 00
+28 02 00 00 00 32 00 41 63 63 6f 72 64 69 6f 6e 34 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Accordion4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 06 00 05 0e 0a 02 3e 0d 00 1f 04 00 05 0f 00 01 3d 08 00 1f 0b 00 0a 0f
+00 00 36 08 06 0e 1f 00 0a 0f 00 01 5c 08 06 3a 12 00 03 00 62 18 02 04 00
+28 02 00 00 00 32 00 41 63 63 6f 72 64 69 6f 6e 34 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Squeezebox
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 32
+10 06 00 05 0e 0a 01 4a 0a 00 1f 04 00 05 0f 00 01 49 0d 00 1f 0b 00 0a 0f
+00 01 46 08 06 0e 1f 00 0a 0f 00 01 5a 04 06 39 19 00 03 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 71 75 65 65 7a 65 62 6f 78 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Bag Pipe
+
+
+** Name: Bag Pipe
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 0a 04 02 0c 00 05 57 0a 03 17 0a 04 02 0d 00 05 4e 04 03 13 07 06 0a 0c
+00 06 60 04 0b 13 07 06 0a 0f 00 06 63 0a 0b 24 26 3c 06 00 32 00 02 04 00
+63 32 00 32 00 32 00 20 42 61 67 20 50 69 70 65 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bag Pipe
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 0a 04 02 0c 00 01 57 0a 03 17 0a 04 02 0d 00 00 4e 04 03 13 07 06 0a 0c
+00 01 60 04 0b 13 07 06 0a 0f 00 01 63 0a 0b 24 26 3c 06 00 32 00 02 04 00
+63 32 00 32 00 32 00 20 42 61 67 20 50 69 70 65 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Bassoon
+
+
+** Name: Bassoon
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 13
+10 17 00 06 0f 00 41 44 00 03 19 1f 00 07 0f 35 42 4e 00 03 10 1f 00 01 0f
+00 42 4b 04 03 0f 1f 00 09 0f 00 02 5b 08 03 38 1f 08 07 0a 5e 0c 02 04 00
+63 23 1e 32 00 32 00 42 61 73 73 6f 6f 6e 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bassoon..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 00 03 0a 0d 47 05 50 00 03 12 0d 09 0a 0d 41 05 41 04 03 12 0d 09 0a 0d
+43 04 62 08 03 12 0d 09 0a 0e 00 05 63 04 04 1c 25 29 00 00 12 0c 02 04 00
+63 32 00 32 00 32 00 42 61 73 73 6f 6f 6e 2e 2e 31 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bassoon..1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 00 03 0a 0d 47 01 50 00 03 12 0d 09 0a 0d 41 00 41 04 03 12 0d 09 0a 0d
+43 00 62 08 03 12 0d 09 0a 0e 00 00 63 04 04 1c 25 29 00 00 12 0c 02 04 00
+63 32 00 32 00 32 00 42 61 73 73 6f 6f 6e 2e 2e 31 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bassoon..2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+11 16 00 06 0f 00 02 38 04 03 18 1f 00 08 0f 47 05 53 00 03 11 1f 00 01 0f
+00 04 45 04 03 0f 1f 00 08 0f 00 04 58 08 03 20 20 0c 06 00 52 0c 00 04 00
+63 32 00 32 00 32 00 42 61 73 73 6f 6f 6e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bassoon..2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+11 16 00 06 0f 00 00 38 04 03 18 1f 00 08 0f 47 01 53 00 03 11 1f 00 01 0f
+00 01 45 04 03 0f 1f 00 08 0f 00 00 58 08 03 20 20 0c 06 00 52 0c 00 04 00
+63 32 00 32 00 32 00 42 61 73 73 6f 6f 6e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bassoon..3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 18 06 04 0f 63 01 45 04 03 13 06 06 09 0f 47 03 63 0d 03 13 18 06 09 0f
+00 45 63 04 03 12 18 06 09 0f 00 03 63 08 03 35 27 21 00 26 36 0c 00 04 00
+63 32 00 32 00 32 00 42 61 73 73 6f 6f 6e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bassoon..3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 18 06 04 0f 63 01 45 04 03 13 06 06 09 0f 47 00 63 0d 03 13 18 06 09 0f
+00 40 63 04 03 12 18 06 09 0f 00 00 63 08 03 35 27 21 00 26 26 0c 00 04 00
+63 32 00 32 00 32 00 42 61 73 73 6f 6f 6e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bassoon..4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 06 03 0a 0e 63 01 4e 00 03 12 0c 06 0a 0d 47 03 49 08 0b 13 0d 09 0a 0e
+00 45 63 08 03 12 0c 06 0a 0e 00 05 63 04 0b 1c 27 21 00 26 26 0c 00 04 00
+63 32 00 32 00 32 00 42 61 73 73 6f 6f 6e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bassoon..4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 06 03 0a 0e 63 00 4e 00 03 12 0c 06 0a 0d 47 00 49 08 0b 13 0d 09 0a 0e
+00 40 63 08 03 12 0c 06 0a 0e 00 00 63 04 0b 1c 27 21 00 26 26 0c 00 04 00
+63 32 00 32 00 32 00 42 61 73 73 6f 6f 6e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassoonSyn
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 08 05 08 07 19 02 59 00 0e 16 10 00 04 0f 46 05 55 00 03 0f 06 00 0b 0f
+00 06 63 04 05 10 1f 00 0a 0f 00 05 60 0a 0b 0d 23 00 00 00 02 0c 07 04 01
+63 32 00 1e 0a 32 63 42 61 73 73 6f 6f 6e 53 79 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassoonSyn
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 08 05 08 07 19 00 59 00 0e 16 10 00 04 0f 46 00 55 00 03 0f 06 00 0b 0f
+00 00 63 04 05 10 1f 00 0a 0f 00 00 60 0a 0b 0d 23 00 00 00 02 0c 07 04 01
+63 32 00 1e 0a 32 63 42 61 73 73 6f 6f 6e 53 79 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Clarinet
+
+
+** Name: Bass Clair
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 12 00 09 0d 22 01 47 08 0c 1f 1b 06 04 0e 41 05 3f 08 03 1f 11 00 06 0c
+5a 04 52 0d 03 10 1f 00 0b 0f 00 45 55 04 0c 02 25 00 00 29 16 00 02 05 00
+63 32 00 32 00 32 00 42 61 73 73 20 43 6c 61 69 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Clair
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 12 00 09 0d 22 00 47 08 0c 1f 1b 06 04 0e 41 00 3f 08 03 1f 11 00 06 0c
+5a 00 52 0d 03 10 1f 00 0b 0f 00 40 55 04 0c 02 25 00 00 29 16 00 02 05 00
+63 32 00 32 00 32 00 42 61 73 73 20 43 6c 61 69 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clairnet.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 12 00 09 0d 22 01 4c 08 0b 0c 14 00 05 0e 3c 05 3b 04 03 1f 11 00 06 0c
+5a 45 4f 10 03 10 1f 00 0b 0f 00 05 55 04 03 3a 22 14 0a 18 5e 0c 02 04 00
+63 32 00 32 00 32 00 43 6c 61 69 72 6e 65 74 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clairnet.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 12 00 09 0d 22 01 4c 08 0b 0c 14 00 05 0e 3c 00 3b 04 03 1f 11 00 06 0c
+5a 40 4f 10 03 10 1f 00 0b 0f 00 00 55 04 03 3a 22 14 0a 18 5e 0c 02 04 00
+63 32 00 32 00 32 00 43 6c 61 69 72 6e 65 74 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clairnet.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 0c 0f 07 0f 41 01 33 0d 05 1f 06 04 06 0f 5c 02 46 0d 04 10 0c 0c 07 0e
+47 05 54 0d 03 0f 06 06 07 0e 28 05 63 08 0b 7c 24 27 00 00 12 00 0c 04 00
+63 32 32 00 00 32 00 43 6c 61 69 72 6e 65 74 2e 32 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clairnet.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 0f 07 0f 41 00 33 0d 05 1f 06 04 06 0f 5c 00 46 0d 04 1f 0c 0c 07 0e
+47 00 54 0d 03 0f 06 06 07 0e 28 00 63 08 0b 7c 24 27 00 00 12 00 0c 04 00
+63 32 32 00 00 32 00 43 6c 61 69 72 6e 65 74 2e 32 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clairnet.3
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 06 06 0f 36 01 51 04 03 1f 1f 04 06 0f 34 44 50 04 03 12 1f 05 09 0f
+0e 05 63 00 03 12 1f 05 07 0f 0e 45 63 00 0b 3e 24 02 1f 51 16 24 0c 04 00
+63 32 32 00 00 32 00 43 6c 61 69 72 6e 65 74 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clairnet.3
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 06 06 0f 36 01 51 04 03 1f 1f 04 06 0f 34 41 50 04 03 12 1f 05 09 0f
+0e 00 63 00 03 12 1f 05 07 0f 0e 40 63 00 0b 3e 24 02 1f 51 16 24 0c 04 00
+63 32 32 00 00 32 00 43 6c 61 69 72 6e 65 74 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ClaraPiano
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 07 07 08 07 00 03 47 13 0e 0b 06 07 04 07 00 04 4a 08 0b 13 06 07 03 07
+00 04 36 0d 0b 1f 07 07 04 07 00 45 62 04 0b 20 14 00 00 10 66 18 01 04 00
+63 00 00 32 00 32 00 43 6c 61 72 61 50 69 61 6e 6f 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ClaraPiano
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 07 07 08 07 00 01 47 13 0e 0b 06 07 04 07 00 01 4a 08 0b 13 06 07 03 07
+00 00 36 0d 0b 1f 07 07 04 07 00 40 62 04 0b 20 14 00 00 10 66 18 01 04 00
+63 00 00 32 00 32 00 43 6c 61 72 61 50 69 61 6e 6f 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clarinet
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: Yamaha TX81Z factory preset, bank B, voice 15
+12 02 00 09 0e 09 02 51 08 0b 0e 14 00 05 0e 00 02 48 08 0b 13 11 00 06 0b
+00 43 56 0a 0b 11 1f 00 09 0f 00 02 59 04 0b 02 1f 14 07 10 5e 0c 02 04 00
+63 32 1e 00 00 32 00 43 6c 61 72 69 6e 65 74 20 20 63 63 63 32 32 32 00 00
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clarinet 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 19
+15 0a 00 07 0e 2f 01 4b 08 03 15 0f 00 07 0a 1b 03 54 08 13 10 10 00 07 0e
+1f 03 41 10 0b 11 1f 00 0a 0f 00 02 5c 04 0b 3a 1e 0a 03 05 6e 18 02 04 00
+28 1a 0f 00 00 32 00 43 6c 61 72 69 6e 65 74 20 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clarinet 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 0d 00 07 0e 2f 01 4b 08 03 15 0f 00 07 0d 1b 03 54 08 13 10 10 00 07 0e
+1f 03 41 10 0b 11 1f 00 0a 0f 00 02 5c 04 0b 3a 1e 0a 03 05 6e 18 02 04 00
+28 1a 0f 00 00 32 00 43 6c 61 72 69 6e 65 74 20 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clarinet 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 20
+1f 1f 00 09 0f 0f 02 4b 08 03 0f 0f 00 09 0a 52 02 4c 08 13 12 12 00 09 0a
+3a 01 4a 0a 0b 11 1f 00 0b 0f 00 02 5e 04 0b 22 1e 0a 03 05 6e 0c 02 04 00
+28 1a 0f 00 00 32 00 43 6c 61 72 69 6e 65 74 20 32 63 63 63 32 32 32 00 00
+00 50 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clarinet 2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 09 0f 0f 02 4b 08 03 0f 0f 00 09 0d 52 02 4c 08 13 12 12 00 09 0d
+3a 01 4a 0a 0b 11 1f 00 0b 0f 00 02 5e 04 0b 22 1e 0a 03 05 6e 0c 02 04 00
+28 1a 0f 00 00 32 00 43 6c 61 72 69 6e 65 74 20 32 63 63 63 32 32 32 00 00
+00 50 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HolowClair
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0b 06 04 0d 22 02 47 04 0c 10 04 03 08 0d 3c 04 44 08 03 0f 10 03 07 0c
+04 04 5a 00 03 10 04 03 09 0f 00 05 5a 04 0c 2c 26 07 03 00 42 0c 02 04 00
+63 32 00 32 00 32 00 48 6f 6c 6f 77 43 6c 61 69 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HolowClair
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0b 06 04 0d 22 00 47 04 0c 10 04 03 08 0d 3c 01 44 13 03 0f 10 03 07 0c
+04 00 5a 00 03 10 04 03 09 0f 00 00 5a 04 0c 2c 26 07 03 00 42 0c 02 04 00
+63 32 00 32 00 32 00 48 6f 6c 6f 77 43 6c 61 69 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynClarnet
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 06 01 06 0f 21 02 37 08 15 0e 07 01 06 0c 1b 03 45 0d 0b 0e 05 01 06 0b
+10 02 4d 16 18 0f 08 00 06 0d 00 01 63 04 13 39 1d 00 00 00 52 18 02 04 00
+63 32 00 16 00 32 00 53 79 6e 43 6c 61 72 6e 65 74 63 63 63 32 32 32 00 70
+00 30 00 10 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY EnglishHorn
+
+
+** Name: English Hn
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 0a 04 02 0c 52 02 4b 08 03 1f 0a 04 02 0c 3a 26 47 08 03 10 0a 04 0a 0b
+5c 1e 63 08 03 12 07 06 0a 0d 0a 75 60 0a 03 14 1d 3c 00 24 26 0c 02 04 00
+63 32 00 00 00 32 00 45 6e 67 6c 69 73 68 20 48 6e 63 63 63 32 32 32 00 20
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: English Hn
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 0a 04 02 0c 52 02 4b 08 03 1f 0a 04 02 0c 3a 22 47 08 03 10 0a 04 0a 0b
+5c 18 63 08 03 12 07 06 0a 0d 0a 70 60 0a 03 14 1d 3c 00 24 26 0c 02 04 00
+63 32 00 00 00 32 00 45 6e 67 6c 69 73 68 20 48 6e 63 63 63 32 32 32 00 20
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY FlugelHorn
+
+
+** Name: Flugel *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 0a 00 07 0d 00 01 4d 04 0e 10 0a 00 0a 00 0d 01 3d 04 0b 15 11 00 07 06
+05 02 4f 09 0b 0e 07 01 08 0d 00 02 63 04 0b 3a 23 00 00 00 32 18 02 04 00
+28 63 00 00 00 32 00 46 6c 75 67 65 6c 20 20 20 2a 63 63 63 32 32 32 00 00
+00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FlugelHorn
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 05 00 08 00 00 01 51 04 0b 0f 1f 00 08 0f 00 04 3c 04 04 1f 0f 00 08 00
+00 06 37 07 04 10 1f 00 09 0f 00 06 5d 04 0c 2a 23 19 04 00 52 18 02 04 00
+63 63 00 00 00 32 00 46 6c 75 67 65 6c 48 6f 72 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FlugelHorn
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 05 00 08 00 00 01 51 04 0b 0f 1f 00 08 0f 00 00 3c 04 04 1f 0f 00 08 00
+00 00 37 07 04 10 1f 00 09 0f 00 01 5d 04 0c 2a 23 19 04 00 52 18 02 04 00
+63 63 00 00 00 32 00 46 6c 75 67 65 6c 48 6f 72 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flugelhorn
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 3
+0c 05 00 08 00 00 02 4a 04 0b 0f 1f 00 08 0f 00 02 3f 04 03 1f 0f 00 08 00
+23 03 44 0b 03 10 1f 00 09 0f 00 02 5e 04 0c 3a 1f 19 07 00 52 18 04 04 00
+63 32 00 00 00 32 00 46 6c 75 67 65 6c 68 6f 72 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 3
+
+* SUBCATEGORY Flute
+
+
+** Name: AdditivFlt
+** Controls: KV, MW (LFO pitch), BC (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+02 02 01 01 0f 00 52 3c 1a 01 05 06 01 02 0d 26 63 50 0a 00 04 05 01 01 0c
+12 6b 4d 09 06 0d 1f 00 04 0f 00 42 63 04 0b 03 1e 24 07 00 5a 11 02 04 00
+63 15 00 08 00 32 0e 41 64 64 69 74 69 76 46 6c 74 63 63 63 32 32 32 00 16
+00 30 00 32 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Alto Flute
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0f 05 06 0f 00 00 28 08 03 0c 13 07 07 0f 47 04 3c 04 03 16 1f 04 01 0f
+00 45 3d 04 03 0d 12 04 09 0f 00 04 53 04 03 2b 23 29 07 36 16 0c 02 04 00
+63 32 00 32 00 32 00 41 6c 74 6f 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Alto Flute
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0f 05 06 0f 00 00 28 08 03 0c 13 07 07 0f 47 00 3c 04 03 16 1f 04 01 0f
+00 40 3d 04 03 0d 12 04 09 0f 00 00 53 04 03 2b 23 29 07 36 16 0c 02 04 00
+63 32 00 32 00 32 00 41 6c 74 6f 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Alto Flute
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0f 0f 05 06 0f 00 00 28 08 03 0c 13 07 07 0f 47 00 3c 04 03 16 1f 04 00 0f
+00 40 3d 04 03 0d 12 04 09 0f 00 00 53 04 03 2b 23 29 07 36 16 0c 02 04 00
+63 32 00 32 00 32 00 41 6c 74 6f 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Flute
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0f 05 06 0f 00 03 32 04 03 0c 13 07 07 0f 47 04 3c 00 03 16 1f 04 01 0f
+00 44 41 00 03 0d 12 04 09 0f 00 05 5a 04 03 2b 23 29 07 36 16 0c 02 04 00
+63 32 00 32 00 32 00 42 61 73 73 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Flute
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0f 05 06 0f 00 00 32 04 03 0c 13 07 07 0f 47 00 3c 00 03 16 1f 04 01 0f
+00 40 41 04 03 0d 12 04 09 0f 00 00 5a 00 03 2b 23 29 07 36 16 0c 02 04 00
+63 32 00 32 00 32 00 42 61 73 73 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Flute
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0f 0f 05 06 0f 00 00 32 04 03 0c 13 07 07 0f 47 00 3c 00 03 16 1f 04 00 0f
+00 40 41 04 03 0d 12 04 09 0f 00 00 5a 00 03 2b 23 29 07 36 16 0c 02 04 00
+63 32 00 32 00 32 00 42 61 73 73 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute *
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 03 02 05 0f 19 03 4f 04 0e 1d 12 12 07 0e 00 06 47 05 0c 1d 0a 09 06 0d
+00 02 59 04 08 0f 03 01 09 0f 00 04 63 04 0a 02 1d 18 06 19 42 18 02 04 00
+28 31 00 29 12 32 00 46 6c 75 74 65 20 20 20 20 2a 63 63 63 32 32 32 00 00
+00 04 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 11
+10 16 00 06 07 00 42 49 07 03 19 1f 00 07 0f 0b 43 47 04 03 12 19 00 01 0f
+0d 42 3a 04 03 0f 1f 00 09 0f 00 42 5a 04 0b 3b 1e 07 07 0d 5e 24 02 04 00
+63 1e 40 32 00 32 00 46 6c 75 74 65 20 20 20 20 20 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 22
+11 0e 03 05 09 0e 47 39 04 0e 0b 04 00 05 0a 18 42 4d 08 16 11 10 02 05 0a
+1b 42 4c 0a 0b 0f 04 00 09 0f 00 43 5a 08 0b 3b 1f 08 20 02 4a 18 02 04 00
+28 63 00 00 00 32 00 46 6c 75 74 65 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+11 0e 03 05 09 0e 47 39 04 0e 0b 04 00 05 0d 18 42 4d 08 16 11 10 02 05 0a
+1b 42 4c 0d 0b 0f 04 00 09 0f 00 43 5a 08 0b 3b 1f 08 20 02 4a 18 02 04 00
+28 63 00 00 00 32 00 46 6c 75 74 65 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 23
+13 04 00 05 0e 03 41 35 13 10 13 04 00 05 0e 03 42 48 09 16 0f 00 00 09 0f
+00 43 63 0a 08 0f 00 00 09 0f 00 43 63 09 0e 3c 1f 08 20 02 4a 05 02 04 00
+28 32 00 00 00 32 00 46 6c 75 74 65 20 20 20 20 32 63 63 63 32 32 32 00 00
+00 02 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 19 00 01 0d 45 04 5d 08 03 16 15 12 01 0d 59 04 56 08 02 0b 00 03 09 0d
+46 05 35 08 04 11 00 03 09 0d 14 04 5a 08 03 2b 1e 14 2d 63 32 18 02 04 00
+63 32 00 00 01 32 00 46 6c 75 74 65 2e 2e 2e 2e 31 63 63 63 32 32 32 00 20
+00 30 00 00 00 20 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 19 00 01 0d 45 02 5d 04 03 16 15 12 01 0d 59 02 56 08 02 12 00 03 09 0d
+46 01 35 04 04 12 00 03 09 0d 14 00 5a 04 03 2b 23 14 07 63 32 18 02 04 00
+63 32 00 00 01 32 00 46 6c 75 74 65 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 19 00 01 0d 45 02 4b 04 03 12 15 12 01 0d 59 44 58 04 03 1f 00 03 09 0d
+46 45 3c 04 03 0f 00 03 09 0d 14 04 5b 04 03 02 1c 16 2a 00 36 24 02 04 00
+63 32 00 00 01 32 00 46 6c 75 74 65 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 19 00 01 0d 45 01 4b 04 03 12 15 12 01 0d 59 41 58 04 03 1f 00 03 09 0d
+46 42 3c 04 03 0f 00 03 09 0d 14 00 5b 04 03 02 1e 16 0c 00 36 24 02 04 00
+63 32 00 00 01 32 00 46 6c 75 74 65 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 19 00 01 0d 45 00 41 04 03 0f 0d 0f 09 0f 00 43 29 04 03 1f 00 03 09 0d
+46 45 33 04 03 0d 00 03 09 0d 14 05 5b 04 03 0a 20 14 35 00 16 24 02 04 00
+63 32 00 00 01 32 00 46 6c 75 74 65 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 19 00 01 0d 45 00 41 04 03 0f 0d 0f 09 0f 00 43 29 1f 03 1f 00 03 09 0d
+46 41 33 04 03 0d 00 03 09 0d 14 00 5b 04 03 0a 20 14 0a 00 16 24 02 04 00
+63 32 00 00 01 32 00 46 6c 75 74 65 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....4
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 12 00 09 0d 22 03 3b 08 08 1f 12 00 05 0e 2e 45 34 04 00 19 13 00 05 06
+00 45 53 07 06 10 1a 00 08 0f 00 04 5d 04 0e 3a 1f 09 0f 1e 5e 18 04 04 00
+63 32 00 32 00 32 00 46 6c 75 74 65 2e 2e 2e 2e 34 63 63 63 32 32 32 00 10
+00 10 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....4
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 12 00 09 0d 22 01 3b 0d 08 1f 12 00 05 0e 2e 42 34 0d 00 19 13 00 05 06
+00 41 53 12 06 10 1a 00 08 0f 00 00 5d 04 0e 3a 1f 09 0f 1e 5e 18 04 04 00
+63 32 00 32 00 32 00 46 6c 75 74 65 2e 2e 2e 2e 34 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....5
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 17 00 06 00 00 05 36 09 03 15 1f 00 07 0f 47 05 45 08 03 10 1f 00 01 0f
+00 04 3b 04 03 10 1f 00 09 0f 00 06 57 04 03 3b 23 04 07 00 52 18 02 04 00
+63 32 00 32 00 32 00 46 6c 75 74 65 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flute....5
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 17 00 06 00 00 01 36 09 03 15 1f 00 07 0f 47 01 45 08 03 10 1f 00 01 0f
+00 01 3b 04 03 10 1f 00 09 0f 00 00 57 04 03 3b 23 04 07 00 52 18 02 04 00
+63 32 00 32 00 32 00 46 6c 75 74 65 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Flute
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: Yamaha TX81Z factory preset, bank C, voice 24
+13 1e 00 09 0e 00 00 63 3f 0b 1f 14 00 05 0e 24 01 51 04 03 1f 14 00 0f 01
+00 41 4d 08 03 0f 1f 00 0b 0f 00 02 63 04 0b 3b 20 11 12 33 56 18 04 04 00
+63 37 0e 00 00 32 00 4a 61 7a 7a 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pan Floot
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: Yamaha TX81Z factory preset, bank B, voice 12
+1b 12 00 09 0d 14 02 42 0d 08 1f 14 00 05 0e 00 42 40 08 10 19 14 00 06 06
+00 03 50 12 06 10 1f 00 08 0f 00 02 5f 04 0e 02 1e 0d 08 1a 5e 18 04 04 00
+63 32 23 00 00 32 00 50 61 6e 20 46 6c 6f 6f 74 20 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pan Flute1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 15 0f 08 0f 2e 05 46 14 02 1f 06 03 07 09 00 04 3e 0a 04 12 06 03 08 0d
+00 06 3a 00 0a 10 06 02 09 0e 00 06 63 0a 06 7c 2e 0e 09 00 32 0c 02 04 00
+63 32 00 32 00 32 00 50 61 6e 20 46 6c 75 74 65 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pan Flute1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 15 0f 08 0f 2e 00 46 14 02 1f 06 03 07 09 00 00 3e 0a 04 12 06 03 08 0d
+00 01 3a 00 0a 10 06 02 09 0e 00 01 63 0a 06 7c 2e 0e 09 00 32 0c 02 04 00
+63 32 00 32 00 32 00 50 61 6e 20 46 6c 75 74 65 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pan Flute2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 12 00 09 0d 22 01 46 10 08 1f 14 00 05 0e 24 44 2e 08 00 19 14 00 06 07
+00 05 37 04 06 10 1f 00 08 0f 00 05 60 04 0e 3b 1f 0d 0e 1e 5e 18 04 04 00
+63 32 00 32 00 32 00 50 61 6e 20 46 6c 75 74 65 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pan Flute2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 12 00 09 0d 22 01 46 10 08 1f 14 00 05 0e 24 40 2e 08 00 19 14 00 06 07
+00 00 37 04 06 10 1f 00 08 0f 00 01 60 04 0e 3b 1f 0d 0e 1e 5e 18 04 04 00
+63 32 00 32 00 32 00 50 61 6e 20 46 6c 75 74 65 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pan Flute2
+** Controls: MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+11 17 01 01 06 00 40 63 0d 03 11 17 01 01 06 00 00 35 04 03 10 04 04 0a 07
+11 00 3b 04 1b 10 04 04 0a 07 11 00 63 04 02 04 63 00 14 37 47 24 04 04 00
+28 32 00 00 00 32 00 50 61 6e 20 46 6c 75 74 65 32 63 63 63 32 32 32 00 30
+00 30 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PanFlute *
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 19 07 0f 0f 3b 00 37 18 00 1f 1f 11 0f 0f 00 03 5a 0d 03 0c 19 0a 08 0f
+00 02 59 04 02 0f 1f 04 07 0f 00 01 63 04 03 04 63 00 0c 13 6f 18 02 04 00
+3b 1f 00 00 00 31 00 50 61 6e 46 6c 75 74 65 20 2a 63 63 63 32 32 32 00 02
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Perc Flute
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 12 09 0a 00 07 5a 10 05 1f 1f 1d 07 0f 47 05 48 04 04 15 1f 00 0a 0f
+00 46 63 04 03 13 15 15 09 0a 00 05 63 04 01 04 23 29 07 36 16 18 02 04 00
+63 32 00 32 00 32 00 50 65 72 63 20 46 6c 75 74 65 63 63 63 32 32 32 00 20
+00 40 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Perc Flute
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 12 09 0a 00 01 5a 10 05 1f 1f 1d 07 0f 47 00 48 04 04 15 1f 00 0a 0f
+00 41 63 04 03 13 15 15 09 0a 00 00 63 04 01 04 23 29 07 36 16 18 02 04 00
+63 32 00 32 00 32 00 50 65 72 63 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 40 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PercFlute
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 31
+1f 17 11 0a 0d 00 02 55 13 09 1f 19 00 01 0d 00 42 47 0a 00 1f 14 09 09 0b
+00 02 5d 09 06 10 08 00 06 0e 00 42 63 04 0b 43 1c 04 0b 00 5a 05 04 04 00
+63 32 00 00 00 32 00 50 65 72 63 46 6c 75 74 65 20 63 63 63 32 32 32 00 00
+00 00 00 02 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Soft Flute
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 17 00 06 00 00 03 34 07 03 0f 1f 00 07 0f 47 03 3b 08 03 10 1f 00 01 0f
+00 45 2c 04 03 0f 1f 00 09 0f 00 05 5e 08 03 2b 23 12 0a 35 16 18 02 04 00
+63 32 00 32 00 32 00 53 6f 66 74 20 46 6c 75 74 65 63 63 63 32 32 32 00 03
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Soft Flute
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 17 00 06 00 00 00 34 07 03 0f 1f 00 07 0f 47 00 3b 04 03 10 1f 00 01 0f
+00 40 2c 04 03 0f 1f 00 09 0f 00 02 5e 08 03 2b 23 12 0a 35 16 18 02 04 00
+63 32 00 32 00 32 00 53 6f 66 74 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Song Flute
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 12 15 01 0e 02 03 58 08 0b 15 1c 15 0a 0d 00 03 63 08 08 07 01 03 0a 0d
+00 05 63 04 0b 12 01 03 0a 0d 00 06 63 04 0b 2e 21 00 05 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 6f 6e 67 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Song Flute
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 12 15 01 0e 02 00 58 08 0b 15 1c 15 0a 0d 00 00 63 08 08 07 01 03 0a 0d
+00 00 63 04 0b 12 01 03 0a 0d 00 00 63 04 0b 2e 21 00 05 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 6f 6e 67 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Song Flute
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+18 12 15 00 0e 02 00 58 08 0b 15 1c 15 0a 0d 00 00 63 08 08 07 01 03 0a 0d
+00 00 63 04 0b 12 01 03 0a 0d 00 00 63 04 0b 2e 21 00 05 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 6f 6e 67 20 46 6c 75 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthFlute
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+12 18 01 02 0b 16 03 58 21 03 12 18 00 02 0d 00 02 4b 10 13 0d 0e 04 04 07
+00 04 63 16 13 0d 18 03 04 0e 00 01 5e 04 13 14 63 00 0c 00 33 18 02 04 00
+28 32 00 00 00 32 00 53 79 6e 74 68 46 6c 75 74 65 63 63 63 32 32 32 00 40
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY FrenchHorn
+
+
+** Name: Fr.Horn *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 08 03 04 0f 00 02 54 00 00 0a 08 05 07 0f 0a 02 5a 00 06 0e 1f 00 06 0f
+1d 01 63 04 06 16 0d 00 06 0f 00 00 63 00 00 34 16 00 00 00 32 18 02 04 00
+28 63 00 00 00 32 00 46 72 2e 48 6f 72 6e 20 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FrenchHorn
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: Yamaha TX81Z factory preset, bank B, voice 5
+08 05 00 06 00 00 42 47 04 08 0e 1f 00 06 0f 00 42 43 04 00 1f 0e 00 06 00
+0e 43 3b 0b 06 0c 1f 00 06 0f 00 42 61 04 0c 39 1a 19 08 0a 4a 0c 04 04 00
+63 32 1e 00 00 32 00 46 72 65 6e 63 68 48 6f 72 6e 63 63 63 32 32 32 00 00
+20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FrnchHorn1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 05 00 08 00 00 01 4b 04 0b 0f 1f 00 08 0f 00 03 36 04 04 0d 0f 00 08 00
+00 05 39 0b 04 12 1f 00 09 0f 00 06 62 04 0c 3a 25 00 04 00 22 18 02 04 00
+63 63 00 00 00 32 00 46 72 6e 63 68 48 6f 72 6e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FrnchHorn1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 05 00 08 00 00 01 4b 04 0b 0f 1f 00 08 0f 00 00 36 04 04 0d 0f 00 08 00
+00 00 39 0b 04 12 1f 00 09 0f 00 01 62 04 0c 3a 25 00 04 00 22 18 02 04 00
+63 63 00 00 00 32 00 46 72 6e 63 68 48 6f 72 6e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FrnchHorn2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 05 00 08 00 00 05 4e 04 0b 0f 1f 00 08 0f 00 04 48 04 03 0d 0f 00 08 00
+00 05 40 0d 03 12 1f 00 09 0f 00 05 5f 04 0b 1b 25 00 0a 00 32 18 02 04 00
+63 63 00 00 00 32 00 46 72 6e 63 68 48 6f 72 6e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FrnchHorn2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 05 00 08 00 00 02 4e 04 0b 0f 1f 00 08 0f 00 01 48 04 03 0d 0f 00 08 00
+00 00 40 0d 03 12 1f 00 09 0f 00 01 5f 04 0b 1b 25 00 0a 00 32 18 02 04 00
+63 63 00 00 00 32 00 46 72 6e 63 68 48 6f 72 6e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Harmonica
+
+
+** Name: Harmonic.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 0d 01 0a 0f 0a 03 4e 08 03 12 0c 06 09 0f 00 04 4f 04 0e 10 1f 04 0c 0f
+00 06 63 08 03 1d 1f 00 0d 0f 00 05 4e 04 03 64 29 00 00 00 22 0c 02 04 00
+28 02 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonic.1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 0d 01 0a 0f 0a 01 4e 08 03 12 0c 06 09 0f 00 01 4f 04 0e 10 1f 04 0c 0f
+00 00 63 08 03 1d 1f 00 0d 0f 00 00 4e 04 03 64 29 00 00 00 22 0c 02 04 00
+28 02 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonic.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 0d 01 0a 0f 0a 02 57 04 0b 12 0c 06 09 0f 00 05 56 00 0e 10 1f 04 0c 0f
+00 05 5a 04 0b 1d 1f 00 0d 0f 00 06 63 04 03 6c 29 00 00 00 22 18 02 04 00
+28 02 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonic.2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 0d 01 0a 0f 0a 02 57 04 0b 12 0c 06 09 0f 00 01 56 00 0e 10 1f 04 0c 0f
+00 00 5a 04 0b 1d 1f 00 0d 0f 00 00 63 04 03 6c 29 00 00 00 22 18 02 04 00
+28 02 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica*
+** Controls: KV, BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 0d 01 09 0d 00 01 42 00 03 0c 08 00 09 0c 00 00 3e 00 06 0e 09 01 09 0f
+00 60 3c 10 03 0d 05 01 09 0f 00 40 63 04 00 19 1f 21 00 25 3a 24 02 04 00
+28 63 00 00 00 32 29 48 61 72 6d 6f 6e 69 63 61 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 16
+10 09 02 06 0d 00 41 3e 04 15 0c 0b 02 03 0e 00 41 4f 04 12 0c 0e 02 08 0d
+00 42 4b 0a 1c 0d 0b 01 09 0e 00 03 63 0a 14 00 23 0f 02 1b 5e 18 04 05 00
+63 28 50 32 00 32 00 48 61 72 6d 6f 6e 69 63 61 20 63 63 63 32 32 32 00 50
+10 50 00 50 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 25
+0e 1f 00 09 0f 00 02 4b 0a 0b 0c 1f 00 09 0f 00 41 5f 04 0b 0c 1f 00 09 0f
+00 41 5c 04 0b 0a 1f 00 0a 0f 00 41 5a 04 0b 06 1d 04 01 27 56 18 02 04 00
+28 32 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 61 20 63 63 63 32 32 32 00 40
+00 50 00 30 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 1f 00 09 0f 00 02 4b 0a 0b 0c 1f 00 09 0f 00 41 5f 04 0b 0c 1f 00 09 0f
+00 41 5c 04 0b 0d 1f 00 0a 0f 00 41 5a 04 0b 06 1d 04 01 27 56 18 02 04 00
+28 32 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 61 20 63 63 63 32 32 32 00 40
+00 50 00 30 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 09 0f 00 79 29 17 00 1f 1f 00 03 0f 00 5b 3b 04 03 0f 10 09 09 0f
+00 5d 61 04 03 0d 1f 00 08 0f 00 7c 63 08 03 04 1f 00 0b 00 46 18 02 04 00
+63 32 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 61 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 09 0f 00 79 29 17 00 1f 1f 00 03 0f 00 59 3b 04 03 0f 10 09 09 0f
+00 59 61 04 03 0d 1f 00 08 0f 00 78 63 08 03 04 1f 00 0b 00 46 18 02 04 00
+63 32 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 61 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 1f 09 0a 00 3a 2f 2c 00 10 0a 05 0a 06 00 1c 4b 04 03 0f 10 09 09 0f
+00 1e 5b 04 03 0d 1f 00 08 0f 00 3d 63 04 03 04 1d 3c 04 00 00 18 02 04 00
+63 32 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 61 32 63 63 63 32 32 32 00 10
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 1f 09 0a 00 3a 2f 2c 00 10 0a 05 0a 06 00 19 4b 04 03 0f 10 09 09 0f
+00 19 5b 04 03 0d 1f 00 08 0f 00 38 63 04 03 04 1d 3c 04 00 10 18 02 04 00
+63 32 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 61 32 63 63 63 32 32 32 00 10
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 09 0f 00 7a 2a 08 00 1f 1f 00 07 0f 00 5a 3b 00 03 0f 10 09 09 0f
+00 5d 5a 08 03 0d 1f 00 08 0f 00 7d 63 04 03 06 1f 00 0b 00 46 18 02 04 00
+63 32 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 61 33 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harmonica3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 09 0f 00 7a 2a 08 00 1f 1f 00 07 0f 00 58 3b 00 03 0f 10 09 09 0f
+00 58 5a 08 03 0d 1f 00 08 0f 00 78 63 04 03 06 1f 00 0b 00 46 18 02 04 00
+63 32 00 00 00 32 00 48 61 72 6d 6f 6e 69 63 61 33 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Oboe
+
+
+** Name: BC1 Oboe
+** Controls: MW (LFO pitch), BC (LFO pitch), BC (LFO amplitude), BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 11 00 07 0f 63 40 63 00 1b 0f 0d 00 08 0f 12 40 40 00 1b 0e 18 00 08 0f
+63 78 50 0a 1b 09 0f 00 09 0f 00 78 54 08 1b 22 23 0b 08 0a 56 18 07 04 00
+63 32 00 18 1e 32 63 42 43 31 20 4f 62 6f 65 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0a 00 02 0c 23 43 33 04 00 1f 0a 00 02 0d 22 42 3a 08 06 10 07 00 0a 0f
+08 01 63 08 08 0f 07 00 0a 0f 09 01 63 0a 0e 04 22 14 19 1b 3a 18 02 04 00
+28 63 00 00 00 32 00 4f 62 6f 65 20 20 20 20 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: Yamaha TX81Z factory preset, bank B, voice 14
+10 12 00 09 0d 05 01 51 00 03 12 14 00 05 0e 23 41 5b 00 03 10 0a 00 06 0d
+30 02 4b 08 1b 0f 1a 00 0a 0e 06 03 59 08 0b 02 1f 11 08 0e 5e 24 02 04 00
+63 28 19 00 00 32 00 4f 62 6f 65 20 20 20 20 20 20 63 63 63 32 32 32 00 20
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 21
+14 12 00 07 0a 0a 02 53 0a 0b 1f 1f 00 03 0f 00 01 4e 04 0b 15 14 00 05 0a
+09 01 3c 08 0b 12 1f 00 0b 0f 06 03 5a 0a 0b 03 1f 0a 0f 00 52 18 02 04 00
+28 32 00 00 00 32 00 4f 62 6f 65 20 20 20 20 20 20 63 63 63 32 32 32 00 20
+00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 12 00 07 0d 0a 02 53 0a 0b 1f 1f 00 03 0f 00 01 4e 04 0b 15 14 00 05 0d
+09 01 3c 08 0b 12 1f 00 0b 0f 06 03 5a 0a 0b 03 1f 0a 0f 00 52 18 02 04 00
+28 32 00 00 00 32 00 4f 62 6f 65 20 20 20 20 20 20 63 63 63 32 32 32 00 20
+00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 04 06 07 0c 00 02 4d 08 0e 10 04 06 07 0c 00 03 4d 04 03 0f 04 06 07 0c
+00 04 50 10 04 10 04 06 07 0c 00 04 5b 04 02 0d 22 07 0c 43 52 0c 02 04 00
+63 63 00 00 00 32 00 4f 62 6f 65 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 04 06 07 0c 00 01 4d 08 0e 10 04 06 07 0c 00 00 4d 04 03 0f 04 06 07 0c
+00 00 50 10 04 10 04 06 07 0c 00 00 5b 04 02 0d 22 07 0c 43 52 0c 02 04 00
+63 63 00 00 00 32 00 4f 62 6f 65 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe.....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 04 06 07 0c 00 01 46 0d 0e 10 04 06 07 0c 00 04 45 04 03 0f 04 06 07 0c
+00 05 5f 08 04 10 04 06 07 0c 00 04 5f 08 02 34 22 07 0c 43 52 18 02 04 00
+63 63 00 00 00 32 00 4f 62 6f 65 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe.....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 04 06 07 0c 00 01 46 0d 0e 10 04 06 07 0c 00 00 45 04 03 0f 04 06 07 0c
+00 00 5f 08 04 10 04 06 07 0c 00 00 5f 0a 02 34 22 07 0c 43 52 18 02 04 00
+63 63 00 00 00 32 00 4f 62 6f 65 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe.....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 11 00 09 0f 63 41 55 00 0c 0f 0d 00 08 0f 12 43 47 00 1c 0d 18 00 08 00
+63 45 49 0a 1b 09 0f 00 09 0f 00 44 50 0a 1b 72 23 25 08 1e 56 18 02 05 00
+63 63 00 00 00 32 00 4f 62 6f 65 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oboe.....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 11 00 09 0f 63 41 55 00 0c 0f 0d 00 08 0f 12 40 47 00 1c 0e 18 00 08 00
+63 41 49 0a 1b 09 0f 00 09 0f 00 40 50 0a 1b 72 23 25 08 1e 56 18 02 05 00
+63 63 00 00 00 32 00 4f 62 6f 65 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Oboe
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 10 02 06 0b 1b 04 49 08 0b 14 08 07 07 0b 42 42 35 2a 0b 1e 0c 04 07 0b
+42 44 50 08 0b 16 06 01 09 0b 0a 04 60 0a 03 42 22 0a 11 1e 36 0c 04 04 00
+63 32 00 00 00 32 00 4f 72 6e 74 20 4f 62 6f 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Oboe
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 10 02 06 0b 1b 00 49 08 0b 14 08 07 07 0b 42 40 35 2a 0b 1e 0c 04 07 0b
+42 40 50 08 0b 16 06 01 09 0b 0a 00 60 0a 03 42 22 0a 11 1e 36 0c 04 04 00
+63 32 00 00 00 32 00 4f 72 6e 74 20 4f 62 6f 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Ocarina
+
+
+** Name: Ocarina
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 18 03 0f 00 04 63 0d 0b 13 03 0f 06 03 00 05 31 0d 12 13 1d 00 0a 0f
+00 06 5d 0d 0b 12 03 1f 09 0e 00 07 5a 0d 13 3c 2e 27 07 36 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 63 61 72 69 6e 61 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ocarina
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 18 03 0f 00 01 63 0d 0b 13 03 0f 06 03 00 00 31 0d 12 13 1d 00 0a 0f
+00 01 5d 0d 0b 12 03 1f 09 0e 00 01 5a 0d 13 3c 2e 27 07 36 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 63 61 72 69 6e 61 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Piccolo
+
+
+** Name: Piccolo *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 12 00 05 0f 2c 40 31 23 06 0c 12 00 05 0f 13 40 3c 13 06 0e 13 00 09 0f
+0a 02 63 12 08 10 13 00 09 0f 0b 01 63 13 09 3c 21 0d 0e 21 4a 11 02 04 00
+28 63 00 00 00 32 00 50 69 63 63 6f 6c 6f 20 20 2a 63 63 63 32 32 32 00 17
+00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Piccolo..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 15 04 0a 09 00 06 32 12 03 15 03 04 0a 08 47 06 63 08 03 0f 04 05 0a 09
+00 06 63 08 03 10 06 04 0a 09 00 05 63 08 03 06 28 29 00 00 12 18 02 04 00
+63 32 00 32 00 32 00 50 69 63 63 6f 6c 6f 2e 2e 31 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Piccolo..1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 15 04 0a 09 00 01 32 12 03 15 03 04 0a 08 47 01 63 04 03 15 04 05 0a 09
+00 00 63 04 03 15 06 04 0a 09 00 00 63 08 03 06 28 29 00 00 12 18 02 04 00
+63 32 00 32 00 32 00 50 69 63 63 6f 6c 6f 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Piccolo..2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 1f 0a 0e 00 00 2c 08 03 12 04 0c 0a 0e 47 04 63 08 03 12 09 09 0a 0e
+00 05 63 08 03 12 12 0f 0a 0e 00 05 63 08 03 06 28 22 07 00 22 18 02 04 00
+63 32 00 32 00 32 00 50 69 63 63 6f 6c 6f 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Piccolo..2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 1f 0a 0e 00 00 2c 04 03 12 04 0c 0a 0e 47 01 63 0d 03 12 09 09 0a 0e
+00 03 63 0d 03 12 12 0f 0a 0e 00 00 63 04 03 06 28 22 07 00 22 18 02 04 00
+63 32 00 32 00 32 00 50 69 63 63 6f 6c 6f 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Piccolo..3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 05 05 0a 0e 00 04 4a 19 03 12 05 05 0a 0e 00 04 50 0d 03 12 05 05 0a 0e
+00 04 52 0d 03 12 05 05 0a 0e 00 04 58 0d 03 06 28 29 00 00 12 18 02 04 00
+63 32 00 32 00 32 00 50 69 63 63 6f 6c 6f 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Piccolo..3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 05 05 0a 0e 00 01 4a 19 03 12 05 05 0a 0e 00 01 50 0d 03 12 05 05 0a 0e
+00 01 52 0d 03 12 05 05 0a 0e 00 00 58 0d 03 06 28 29 00 00 12 18 02 04 00
+63 32 00 32 00 32 00 50 69 63 63 6f 6c 6f 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+--Bank 4
+
+* SUBCATEGORY Recorder
+
+
+** Name: OrntRecord
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 18 00 09 0c 00 03 4e 16 03 12 16 12 0a 07 00 04 51 08 03 12 12 00 09 0d
+00 05 63 04 03 12 16 0f 09 06 00 05 5e 04 03 34 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 52 65 63 6f 72 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntRecord
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 18 00 09 0c 00 00 4e 16 03 12 16 12 0a 07 00 00 51 08 03 12 12 00 09 0d
+00 00 63 04 03 12 16 0f 09 06 00 00 5e 04 03 34 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 52 65 63 6f 72 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 24
+14 0a 00 0a 0a 00 44 36 08 06 14 00 00 03 0f 00 42 2d 0a 00 14 1f 0f 08 0f
+00 44 32 04 03 11 08 00 0b 0e 02 43 63 04 06 3a 1b 04 0f 06 46 18 02 04 00
+28 43 00 00 00 32 00 52 65 63 6f 72 64 65 72 20 20 63 63 63 31 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 0a 00 0a 0a 00 44 36 08 06 14 00 00 03 0f 00 42 2d 0d 00 14 1f 0f 08 0f
+00 44 32 04 03 11 08 00 0b 0e 02 43 63 04 06 3a 1b 04 0f 06 46 18 02 04 00
+28 43 00 00 00 32 00 52 65 63 6f 72 64 65 72 20 20 63 63 63 31 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 1f 16 01 0e 00 01 5d 08 1b 0f 00 03 0a 0d 00 44 61 04 0b 0f 00 03 0a 0d
+00 05 61 04 0b 0f 00 03 0a 0d 00 06 61 04 0b 2e 25 2a 26 36 16 18 02 04 00
+63 63 00 00 00 32 00 52 65 63 6f 72 64 65 72 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 1f 16 01 0e 00 01 5d 08 1b 0f 00 03 0a 0d 00 41 61 04 0b 0f 00 03 0a 0d
+00 01 61 04 0b 0f 00 03 0a 0d 00 01 61 04 0b 2e 25 2a 26 36 16 18 02 04 00
+63 63 00 00 00 32 00 52 65 63 6f 72 64 65 72 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 1f 10 01 0e 00 03 00 08 1b 0d 0a 06 0a 00 00 05 63 08 03 0d 15 07 09 0c
+00 45 63 08 03 0f 12 07 09 0c 00 05 5f 08 03 45 20 2a 15 43 26 18 02 04 00
+63 63 00 00 00 32 00 52 65 63 6f 72 64 65 72 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder.2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 1f 10 01 0e 00 00 00 08 1b 0d 0a 06 0a 00 00 00 63 08 03 0d 15 07 09 0c
+00 40 63 08 03 0f 12 07 09 0c 00 00 5f 08 03 45 20 2a 15 43 26 18 02 04 00
+63 63 00 00 00 32 00 52 65 63 6f 72 64 65 72 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder.2
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+18 1f 10 00 0e 00 00 00 08 1b 0d 0a 06 0a 00 00 00 63 08 03 0d 15 07 09 0c
+00 40 63 08 03 0f 12 07 09 0c 00 00 5f 08 03 45 20 2a 15 43 26 18 02 04 00
+63 63 00 00 00 32 00 52 65 63 6f 72 64 65 72 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 1c 15 0c 0e 00 01 3f 08 1b 13 1d 15 0c 0e 00 06 63 08 03 10 03 03 0a 0d
+00 45 63 04 0b 10 03 03 0a 0d 00 05 63 08 0b 76 20 2a 15 43 26 18 02 04 00
+63 63 00 00 00 32 00 52 65 63 6f 72 64 65 72 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 1c 15 0c 0e 00 01 3f 08 1b 13 1d 15 0c 0e 00 00 63 08 03 10 03 03 0a 0d
+00 41 63 04 0b 10 03 03 0a 0d 00 01 63 04 0b 76 20 2a 15 43 26 18 02 04 00
+63 63 00 00 00 32 00 52 65 63 6f 72 64 65 72 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder.4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 1c 15 0c 0e 00 01 3f 08 1b 13 1d 15 0c 0e 00 05 63 08 03 10 03 03 0a 0d
+00 46 63 04 0b 10 03 03 0a 0d 00 07 63 04 0b 76 20 2a 15 43 26 18 02 04 00
+63 63 00 00 00 32 00 52 65 63 6f 72 64 65 72 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Recorder.4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 1d 15 0a 0f 00 01 5e 08 13 10 0f 0a 0a 0f 00 01 62 04 0b 0f 09 0a 0c 04
+00 01 5e 04 0b 10 1f 03 09 0f 00 01 63 00 0b 2e 21 2a 00 00 12 18 02 04 00
+63 63 00 00 00 32 00 52 65 63 6f 72 64 65 72 2e 34 63 63 63 32 32 32 00 30
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Saxophone
+
+
+** Name: Alto Sax
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 00 08 0f 31 00 52 00 1b 0c 1f 00 09 0f 3a 03 44 08 1b 11 1f 00 08 0f
+00 01 37 12 03 0f 1f 00 08 0f 00 00 63 00 03 78 23 00 00 00 42 18 02 04 00
+63 32 00 00 00 32 00 41 6c 74 6f 20 53 61 78 20 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BC1 AltSax
+** Controls: KV, BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 00 08 0f 31 25 63 00 1c 0c 1f 00 08 0f 3a 25 49 00 1b 11 1f 00 08 0f
+00 1d 35 12 04 0f 1f 00 08 0f 00 3d 63 04 03 28 23 00 00 00 42 18 05 04 00
+63 32 00 0a 56 32 63 42 43 31 20 41 6c 74 53 61 78 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <BC1> Sax
+** Controls: BC (EG amplitude)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+10 1f 00 09 0f 00 20 44 00 03 10 1f 00 09 0f 2a 20 42 00 03 10 1f 00 09 0f
+00 18 30 12 06 10 1f 00 09 0f 00 38 63 04 03 3a 21 00 00 00 52 18 02 04 00
+63 32 00 00 00 32 63 3c 42 43 31 3e 20 53 61 78 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BCSexyPhon
+** Controls: KV, MW (LFO pitch), BC (EG amplitude)
+** Source: Yamaha TX81Z factory preset, bank C, voice 19
+1d 04 00 06 0e 00 01 51 04 09 1d 1f 00 03 0f 11 01 4b 04 08 1d 0f 00 08 0a
+00 01 46 27 0b 10 1f 00 0a 0f 00 3b 63 08 0b 3a 1e 17 0c 00 52 18 02 0d 0f
+63 32 01 00 00 32 63 42 43 53 65 78 79 50 68 6f 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ElectroSax
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 0a 00 09 0e 0d 39 52 00 0e 1f 0b 00 0a 0a 1c 1a 46 00 08 1f 12 00 0a 0d
+09 1a 4c 10 0b 16 1b 00 0a 0f 00 02 63 00 0b 3a 1e 09 02 00 62 18 02 04 00
+28 0b 00 00 00 32 00 45 6c 65 63 74 72 6f 53 61 78 63 63 63 32 32 32 00 20
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GreatDXled
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 00 0a 0f 0c 04 40 08 03 12 0c 06 09 0f 00 05 5c 04 06 1b 1f 04 0c 0f
+00 05 5c 04 03 18 1f 00 0c 0f 00 06 62 04 03 7c 29 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 47 72 65 61 74 44 58 6c 65 64 63 63 63 32 32 32 00 10
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GreatDXled
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 00 0a 0f 0c 01 40 08 03 12 0c 06 09 0f 00 01 5c 04 06 1b 1f 04 0c 0f
+00 00 5c 04 03 18 1f 00 0c 0f 00 00 62 04 03 7c 29 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 47 72 65 61 74 44 58 6c 65 64 63 63 63 32 32 32 00 10
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MelloTenor
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 9
+11 04 00 06 0e 33 01 4c 04 0b 0f 1f 00 03 0f 34 02 50 04 0b 10 0e 00 08 0c
+63 03 44 22 13 10 1f 00 0a 0f 00 02 63 08 0b 3a 1e 11 0b 00 52 0c 04 05 00
+63 32 02 32 00 32 00 4d 65 6c 6c 6f 54 65 6e 6f 72 63 63 63 32 32 32 30 30
+20 30 20 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RaspAlto
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 10
+10 1f 00 08 0f 00 42 4a 00 03 11 1f 00 08 0f 0a 43 51 00 03 11 09 00 08 0d
+00 42 2b 16 06 10 1f 00 09 0f 00 42 63 04 0b 3a 1e 09 09 00 5a 24 04 04 00
+63 32 31 00 00 32 00 52 61 73 70 41 6c 74 6f 20 20 63 63 63 32 32 32 00 10
+00 20 00 54 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sax 1
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank C, voice 16
+14 08 00 08 0a 17 03 49 04 0b 10 0c 00 09 0a 21 04 45 04 0b 12 13 00 06 0b
+1b 04 50 0a 0b 14 1f 00 0a 0f 00 01 5f 04 0b 32 20 00 00 00 52 0c 02 04 00
+28 32 00 00 00 32 00 53 61 78 20 20 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 10 00 60 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sax 1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 08 00 08 0d 17 03 49 04 0b 10 0c 00 09 0d 21 04 45 04 0b 12 13 00 06 0b
+1b 04 50 0a 0b 14 1f 00 0a 0f 00 01 5f 04 0b 32 20 00 00 00 52 0c 02 04 00
+28 32 00 00 00 32 00 53 61 78 20 20 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 10 00 60 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sax 2
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank C, voice 17
+10 08 00 08 0a 2c 03 49 04 0b 11 0f 00 09 0a 0f 04 4e 04 0b 15 13 00 06 09
+00 04 41 0e 0b 12 13 00 0a 0a 00 01 5f 08 0b 32 20 00 00 00 52 0c 02 04 00
+28 32 00 00 00 32 00 53 61 78 20 20 20 20 20 20 32 63 63 63 32 32 32 00 00
+00 10 00 60 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sax 2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 08 00 08 0d 2c 03 49 04 0b 11 0f 00 09 0d 0f 04 4e 04 0b 15 13 00 06 09
+00 04 41 0e 0b 12 13 00 0a 0d 00 01 5f 08 0b 32 20 00 00 00 52 0c 02 04 00
+28 32 00 00 00 32 00 53 61 78 20 20 20 20 20 20 32 63 63 63 32 32 32 00 00
+00 10 00 60 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sax Synth
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 06 12 04 03 31 03 63 00 0c 0a 1f 00 08 0f 3a 26 59 00 1b 0a 1f 00 08 0f
+00 1d 29 13 04 11 1f 00 08 0f 00 3e 63 04 03 28 23 00 00 00 42 18 05 04 01
+63 32 00 00 00 32 00 53 61 78 20 53 79 6e 74 68 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sax Synth
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 06 12 04 03 31 01 63 00 0c 0a 1f 00 08 0f 3a 21 59 00 1b 0a 1f 00 08 0f
+00 19 29 13 04 11 1f 00 08 0f 00 38 63 04 03 28 23 00 00 00 42 18 05 04 01
+63 32 00 00 00 32 00 53 61 78 20 53 79 6e 74 68 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone*
+** Controls: KV, MW (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 04 00 06 0e 1d 61 45 04 0b 0f 1f 00 03 0f 36 02 54 04 0b 0c 0e 00 08 0c
+0f 63 4d 22 0b 18 1f 00 0a 0f 00 02 63 08 0b 39 1e 11 0b 00 4a 0c 02 05 00
+63 32 04 00 00 32 23 53 61 78 6f 70 68 6f 6e 65 2a 63 63 63 32 32 32 00 30
+00 30 30 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 01 09 0f 00 01 37 00 03 12 07 04 09 0f 2a 22 4a 04 03 10 04 02 09 0f
+00 1d 3d 12 06 11 03 03 09 0f 00 3c 58 04 03 7b 22 0b 07 00 42 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 31 63 63 63 32 32 32 00 00
+00 20 00 44 00 10 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 01 09 0f 00 01 37 00 03 12 07 04 09 0f 2a 22 4a 00 03 1f 04 02 09 0f
+00 1a 3d 12 06 11 03 03 09 0f 00 38 58 04 03 7b 22 0b 07 00 42 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 31 63 63 63 32 32 32 00 00
+00 20 00 40 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 1e 00 08 0f 00 00 2e 03 03 0e 1f 00 09 0d 2a 22 4b 04 03 11 1f 00 09 0e
+00 1b 3b 12 06 11 05 00 08 0e 00 3b 5e 04 03 3b 21 00 00 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 32 63 63 63 32 32 32 00 00
+00 40 00 14 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 1e 00 08 0f 00 00 37 03 03 0e 1f 00 09 0d 2a 22 4b 00 03 11 1f 00 09 0e
+00 1b 3b 12 06 11 05 00 08 0e 00 38 5e 04 03 3b 21 00 00 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 32 63 63 63 32 32 32 00 00
+00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 03 01 08 0f 19 00 41 04 03 0f 1f 00 09 0d 4b 23 4f 04 03 1f 03 00 09 0e
+3d 1d 3d 0f 06 10 1e 00 08 0e 00 3d 63 04 03 3b 21 00 00 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 33 63 63 63 32 32 32 00 00
+00 10 00 43 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 03 01 08 0f 19 00 41 00 03 0f 1f 00 09 0d 4b 22 4f 00 03 1f 03 00 09 0e
+3d 1a 3d 15 06 10 1e 00 08 0e 00 39 63 04 03 3b 21 00 00 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 33 63 63 63 32 32 32 00 00
+00 10 00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 00 08 0f 31 02 52 04 1c 0c 1f 00 07 0f 3a 25 42 00 1b 11 1f 00 08 0f
+00 1c 3d 12 04 0f 1f 00 08 0f 00 3c 63 00 03 78 23 00 00 00 42 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 34 63 63 63 32 32 32 00 00
+00 30 00 04 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 00 08 0f 31 02 52 00 1c 0c 1f 00 07 0f 3a 22 42 04 1b 11 1f 00 08 0f
+00 19 3d 12 04 0f 1f 00 08 0f 00 38 63 04 03 78 23 00 00 00 42 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 34 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 0f 00 09 0f 0a 03 4f 00 03 11 1f 00 08 0e 14 04 4e 00 0b 11 0f 00 08 0e
+00 05 2f 17 03 11 1f 00 09 0f 00 04 63 04 03 32 1e 11 0a 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 35 63 63 63 32 32 32 00 10
+00 30 00 42 00 30 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 0f 00 09 0f 0a 01 4f 00 03 11 1f 00 08 0e 14 01 4e 00 0b 11 0f 00 08 0e
+00 03 2f 17 03 11 1f 00 09 0f 00 01 63 04 03 32 1e 11 0a 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 35 63 63 63 32 32 32 00 10
+00 30 00 42 00 30 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 1e 00 08 0f 00 03 46 04 03 0c 1f 00 09 0d 2a 24 4b 04 03 0f 1f 00 09 0e
+00 1c 39 10 03 11 1e 00 08 0e 00 3c 63 04 03 7b 21 05 09 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 36 63 63 63 32 32 32 00 40
+00 40 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saxophone6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 1e 00 08 0f 00 00 46 04 03 0c 1f 00 09 0d 2a 21 4b 00 03 0f 1f 00 09 0e
+00 19 39 04 03 11 1e 00 08 0e 00 38 63 04 03 7b 21 05 09 00 52 18 02 04 00
+63 32 00 00 00 32 00 53 61 78 6f 70 68 6f 6e 65 36 63 63 63 32 32 32 00 00
+00 30 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SopranoSax
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 1f 00 08 0f 0c 42 2c 04 03 13 1f 00 08 0f 26 42 58 00 03 11 09 00 08 08
+2d 42 1e 16 06 11 1f 00 09 0f 00 44 63 04 0b 02 1e 09 09 00 5a 24 04 04 00
+63 32 31 12 00 32 00 53 6f 70 72 61 6e 6f 53 61 78 63 63 63 32 32 32 00 00
+00 20 00 50 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Trombone
+
+
+** Name: Mute Trmbn
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 00 08 0f 00 01 4a 00 03 15 1f 00 08 0f 00 03 2c 00 03 16 19 12 09 0f
+01 05 54 00 0b 12 1f 00 08 0f 00 05 5e 04 03 3a 27 00 29 00 22 0c 06 04 00
+63 63 00 00 00 32 00 4d 75 74 65 20 54 72 6d 62 6e 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mute Trmbn
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 00 08 0f 00 01 4a 00 03 15 1f 00 08 0f 00 00 2c 00 03 16 19 12 09 0f
+01 01 54 00 0b 12 1f 00 08 0f 00 01 5e 04 03 3a 27 00 29 00 22 0c 06 04 00
+63 63 00 00 00 32 00 4d 75 74 65 20 54 72 6d 62 6e 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trombone *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 0a 00 08 0d 00 03 4e 04 0e 0c 0a 00 06 0d 00 02 53 04 0e 1f 08 00 08 0d
+14 03 2a 0a 0b 0e 07 00 08 0d 00 00 63 04 0b 3a 1d 00 00 00 52 0c 05 04 00
+28 63 00 00 00 32 00 54 72 6f 6d 62 6f 6e 65 20 2a 63 63 63 32 32 32 00 00
+00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trombone
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 13
+0e 0b 00 09 0e 0f 02 50 00 0b 10 0c 00 0a 0a 1c 02 47 00 0b 10 11 00 0a 05
+09 03 47 06 0b 0f 18 00 0b 0f 00 02 63 00 0b 3a 20 09 03 00 52 18 02 04 00
+28 32 00 00 00 32 00 54 72 6f 6d 62 6f 6e 65 20 20 63 52 63 2f 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trombone
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0f 1f 00 08 0f 00 00 42 04 03 0f 1f 00 08 0f 00 00 2e 04 03 1f 0e 00 08 00
+01 00 52 0b 13 13 1f 00 08 0f 00 00 5a 04 04 3a 23 00 00 00 62 0c 02 04 00
+63 63 00 00 00 32 00 54 72 6f 6d 62 6f 6e 65 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trombone.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 00 08 0f 00 01 52 04 03 15 1f 00 08 0f 00 04 36 04 03 14 0e 00 08 00
+01 05 57 08 13 12 1f 00 08 0f 00 06 5e 04 03 32 27 00 29 00 22 0c 06 04 00
+63 63 00 00 00 32 00 54 72 6f 6d 62 6f 6e 65 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trombone.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 00 08 0f 00 01 52 04 03 15 1f 00 08 0f 00 01 36 04 03 14 0e 00 08 00
+01 01 57 08 13 12 1f 00 08 0f 00 01 5e 04 03 32 27 00 29 00 22 0c 06 04 00
+63 63 00 00 00 32 00 54 72 6f 6d 62 6f 6e 65 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trombone.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 00 08 0f 00 01 4f 00 03 15 1f 00 08 0f 00 04 2b 04 03 0f 10 05 08 06
+01 06 50 0b 13 12 1f 00 08 0f 00 04 5d 04 03 3a 27 00 29 00 22 0c 06 04 00
+63 63 00 00 00 32 00 54 72 6f 6d 62 6f 6e 65 2e 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trombone.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 00 08 0f 00 01 4f 00 03 15 1f 00 08 0f 00 02 2b 04 03 0f 10 05 08 06
+01 00 50 0b 13 12 1f 00 08 0f 00 00 5d 04 03 3a 27 00 29 00 22 0c 06 04 00
+63 63 00 00 00 32 00 54 72 6f 6d 62 6f 6e 65 2e 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Trumpet
+
+
+** Name: 2 Trumpets
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 05 00 08 0b 0f 05 58 04 08 10 1f 00 07 0f 0f 05 54 05 0e 0f 10 00 0c 00
+1a 04 2d 0a 0c 10 1f 00 07 0f 00 07 60 04 0b 02 23 19 06 00 52 11 04 04 00
+63 1d 00 08 27 32 00 32 20 54 72 75 6d 70 65 74 73 63 63 63 32 32 32 00 38
+00 31 20 02 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BC1Trumpet
+** Controls: MW (LFO pitch), BC (EG amplitude)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+10 1f 00 08 0f 00 38 48 04 0b 0e 1f 00 08 0f 00 20 3c 04 03 10 1f 00 08 0f
+00 38 24 0b 03 12 1f 00 09 0f 00 20 63 04 0b 3a 23 13 04 00 62 18 02 04 00
+63 63 00 00 00 32 63 42 43 31 54 72 75 6d 70 65 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BC1 Trumpt
+** Controls: KV, MW (LFO pitch), BC (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 1f 00 08 0f 00 3d 49 04 0b 0e 1f 00 08 0f 00 25 42 04 03 10 1f 00 08 0f
+00 3d 20 0b 03 12 1f 00 09 0f 00 26 63 04 0b 2a 23 13 04 00 62 18 02 04 00
+63 63 00 03 03 32 63 42 43 31 20 54 72 75 6d 70 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FanfarTpts
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 29
+1f 06 06 04 0f 00 40 48 05 00 0c 08 07 05 0f 05 00 52 04 00 0f 07 03 07 0e
+08 03 63 04 06 0f 08 04 05 0f 00 03 63 04 06 7c 1f 00 06 00 4a 11 02 04 00
+63 32 00 00 00 32 00 46 61 6e 66 61 72 54 70 74 73 63 63 63 32 32 32 06 01
+00 38 00 08 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mute Trmpt
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0a 08 08 0d 00 01 4c 08 00 15 1b 07 08 0a 00 04 43 08 14 0f 10 07 07 09
+02 05 36 0a 14 12 07 09 09 0f 00 06 63 08 0c 1a 22 23 05 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4d 75 74 65 20 54 72 6d 70 74 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mute Trmpt
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0a 08 08 0d 00 01 4c 04 00 15 1b 07 08 0a 00 00 43 0a 14 0f 10 07 07 09
+02 00 36 0b 14 12 07 09 09 0f 00 00 63 0a 0c 1a 22 23 05 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4d 75 74 65 20 54 72 6d 70 74 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Trmpt
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+11 05 06 07 0d 00 02 32 04 03 12 10 06 07 0d 00 03 55 04 0b 13 16 06 07 09
+00 05 4a 04 13 12 10 06 07 0f 01 04 63 04 0b 7b 24 00 0c 00 52 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 20 54 72 6d 70 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Trmpt
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+11 05 06 07 0d 00 00 32 04 03 12 10 06 07 0d 00 00 55 04 0b 13 16 06 07 09
+00 00 4a 04 13 12 10 06 07 0f 01 00 63 04 0b 7b 24 00 0c 00 52 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 20 54 72 6d 70 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet *
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 09 00 07 0e 0a 53 52 04 10 15 1f 00 09 0f 00 2a 63 04 03 15 1f 00 09 0f
+00 2a 63 04 04 15 1f 00 09 0f 00 12 63 04 02 3d 63 00 0e 00 4a 18 02 04 00
+28 63 00 48 00 32 00 54 72 75 6d 70 65 74 20 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+0c 05 00 06 0f 00 02 49 04 03 19 1f 00 07 0f 0b 03 47 04 03 12 0b 00 01 0f
+0d 02 3a 04 03 10 1f 00 09 0f 00 42 5a 04 0c 02 1c 19 00 00 5e 18 04 04 00
+63 0b 00 00 19 32 63 54 72 75 6d 70 65 74 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+10 1f 00 08 0f 00 38 48 04 0b 0e 1f 00 08 0f 00 20 3c 04 03 10 1f 00 08 0f
+00 38 24 0b 03 12 1f 00 09 0f 00 20 63 04 0b 3a 23 13 04 00 62 18 02 04 00
+63 63 00 00 00 32 00 20 20 20 54 72 75 6d 70 65 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 11
+12 10 00 09 0a 0a 01 4e 04 0b 13 0e 00 0a 0a 1c 02 43 04 0b 10 0f 00 0a 05
+09 03 40 06 0b 14 18 00 0b 0f 00 02 63 04 0b 3a 1f 09 04 00 62 18 02 04 00
+28 13 00 00 00 32 00 54 72 75 6d 70 65 74 20 20 31 63 63 63 32 32 32 00 00
+00 30 00 30 00 50 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 10 00 09 0d 0d 01 4e 04 0b 13 0e 00 0a 0a 1c 02 43 04 0b 10 0f 00 0a 05
+09 03 40 06 0b 14 18 00 0b 0f 00 02 63 04 0b 3a 1f 09 04 00 62 18 02 04 00
+28 13 00 00 00 32 00 54 72 75 6d 70 65 74 20 20 31 63 63 63 32 32 32 00 00
+00 30 00 30 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 12
+10 0e 00 03 0e 00 01 4e 04 03 0c 0e 00 03 0e 28 01 40 04 03 0c 0c 00 09 00
+00 07 33 03 03 13 09 00 0a 0f 12 04 63 04 03 3a 20 14 1a 00 32 18 02 04 00
+63 3c 00 00 00 32 00 54 72 75 6d 70 65 74 20 20 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet 3
+** Description: A trumpet similar to DX11 factory preset 'Trumpet 2'
+** Controls: KV
+** Source: Art Hitzeman
+0e 0d 00 03 0e 00 01 4e 00 03 0a 0d 00 03 0e 28 01 40 04 03 0a 0b 00 09 00
+00 07 33 03 03 11 08 00 0a 0f 12 04 63 04 03 3a 20 14 1a 00 32 24 02 04 00
+63 00 00 00 00 32 00 54 72 75 6d 70 65 74 20 20 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0a 07 09 0f 00 02 50 04 0a 0f 0f 05 0a 00 00 06 46 07 13 0f 07 09 07 0b
+00 06 42 04 0b 12 07 05 0a 0d 00 07 63 04 04 7a 1d 1e 0f 00 42 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 31 63 63 63 32 32 32 00 00
+00 03 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0a 07 09 0f 00 02 50 04 0a 0f 0f 05 0a 00 00 01 46 07 13 0f 07 09 07 0b
+00 00 42 04 0b 12 07 05 0a 0d 00 01 63 04 04 7a 1d 1e 0f 00 42 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0a 07 09 0f 00 41 4e 04 0a 0f 0f 05 0a 00 00 04 41 04 13 0f 10 06 07 0e
+02 06 46 0b 0b 12 07 05 0a 0d 00 06 63 04 04 3a 23 1e 17 10 36 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0a 07 09 0f 00 41 4e 04 0a 0f 0f 05 0a 00 00 00 41 04 13 0f 10 06 07 0e
+02 00 46 0b 0b 12 07 05 0a 0d 00 01 63 04 04 3a 23 1e 17 10 36 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0a 06 08 0d 00 02 59 04 0a 15 1c 06 08 0c 00 04 4f 04 15 0f 10 06 09 0e
+02 06 49 0d 09 13 07 06 09 0d 00 06 63 04 04 2a 23 00 00 00 22 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0a 06 08 0d 00 02 59 04 0a 15 1c 06 08 0c 00 00 4f 04 15 0f 10 06 09 0e
+02 00 49 0d 09 13 07 06 09 0d 00 01 63 04 04 2a 23 00 00 00 22 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0a 06 08 0d 00 42 53 04 0a 15 1c 06 08 0c 00 03 4d 04 13 0f 03 06 07 09
+02 06 31 10 0a 13 07 06 09 0d 00 07 63 04 04 3a 22 00 08 2e 46 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 34 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0a 06 08 0d 00 42 53 04 0a 15 1c 06 08 0c 00 00 4d 04 13 0f 03 06 07 09
+02 00 31 10 0a 13 07 06 09 0d 00 01 63 04 04 3a 22 00 08 2e 46 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 34 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 0a 06 08 0d 00 02 4d 04 0a 15 1c 06 08 0c 00 05 46 04 13 0f 03 06 07 09
+02 06 34 07 0a 15 07 06 09 0d 00 06 63 04 04 2a 22 23 05 00 22 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 35 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet..5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 0a 06 08 0d 00 02 4d 04 0a 15 1c 06 08 0c 00 00 46 04 13 0f 03 06 07 09
+02 00 34 07 0a 15 07 06 09 0d 00 01 63 04 04 2a 22 23 05 00 22 0c 02 04 00
+63 63 00 00 00 32 00 54 72 75 6d 70 65 74 2e 2e 35 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet81Z
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 1
+0f 1f 04 08 0f 00 3a 51 04 0b 0e 1f 00 08 0f 00 22 4b 04 03 0f 1a 0b 08 0d
+00 3b 36 09 03 12 1f 00 08 0f 00 22 5d 04 0b 3a 1e 19 05 00 52 18 04 04 00
+63 32 00 00 00 32 00 54 72 75 6d 70 65 74 38 31 5a 63 63 63 32 32 32 00 00
+00 50 00 51 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: TrumptSolo
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 18
+13 00 00 04 0f 00 00 3a 0b 06 0f 1f 03 0a 0f 05 01 5d 05 00 11 0e 06 0a 09
+08 00 36 03 06 13 1f 01 08 0f 00 02 63 04 03 3b 1d 03 0f 01 42 11 07 04 00
+63 32 00 00 00 32 00 54 72 75 6d 70 74 53 6f 6c 6f 63 63 63 32 32 32 00 61
+00 11 00 06 00 08 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Trumpet V
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0f 1f 04 08 0f 00 3a 52 04 0b 0e 1f 00 08 0f 00 22 4b 04 03 10 1f 0b 08 0f
+00 3b 2f 0b 03 12 1f 00 09 0f 00 22 63 04 0b 3a 1e 13 04 00 42 18 02 04 00
+63 63 00 00 00 00 00 54 72 75 6d 70 65 74 20 56 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Tuba
+
+
+** Name: << Tuba >>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 05 06 0d 45 03 4c 00 03 14 0d 02 07 09 59 04 48 00 03 0f 10 03 07 09
+46 05 48 00 03 0e 0f 03 08 0f 14 06 63 04 03 2b 23 00 00 00 32 0c 02 04 00
+63 32 00 00 01 32 00 3c 3c 20 54 75 62 61 20 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 20 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: << Tuba >>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 05 06 0d 45 01 4c 00 03 14 0d 02 07 09 59 00 48 00 03 0f 10 03 07 09
+46 00 48 00 03 0e 0f 03 08 0f 14 01 63 04 03 2b 23 00 00 00 32 0c 02 04 00
+63 32 00 00 01 32 00 3c 3c 20 54 75 62 61 20 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 20 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tuba
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank C, voice 15
+0f 0f 00 09 09 15 01 52 00 03 10 0a 00 06 0a 00 01 47 00 03 10 0c 00 09 0b
+00 01 45 00 03 10 0a 00 0b 0a 0e 02 63 00 03 3a 1f 00 00 00 52 0c 02 04 00
+63 32 00 00 00 32 00 54 75 62 61 20 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tuba
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0f 00 09 09 15 01 52 00 03 10 0d 00 06 0a 00 01 47 00 03 10 0c 00 09 0b
+00 01 45 00 03 10 0d 00 0b 0d 0e 02 63 00 03 3a 1f 00 00 00 52 0c 02 04 00
+63 32 00 00 00 32 00 54 75 62 61 20 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Whistle
+
+
+** Name: Whistle *
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 00 00 08 03 0b 10 00 09 0e 00 00 63 08 02 0a 0f 1c 09 00
+00 00 63 08 00 0c 0f 00 09 0e 00 00 63 08 06 05 20 16 15 43 52 18 0c 04 00
+28 63 00 00 00 32 00 57 68 69 73 74 6c 65 20 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whistle..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 1c 15 03 0e 00 03 00 08 03 13 06 03 0a 0d 00 44 00 08 03 13 06 03 0a 0d
+00 45 00 08 03 13 06 03 0a 0d 00 06 63 08 03 3e 25 0b 26 63 36 18 04 04 00
+28 32 00 00 00 32 00 57 68 69 73 74 6c 65 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whistle..1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 1c 15 03 0e 00 00 00 08 03 13 06 03 0a 0d 00 40 00 08 03 13 06 03 0a 0d
+00 40 00 08 03 13 06 03 0a 0d 00 00 63 08 03 3e 25 0b 26 63 36 18 04 04 00
+28 32 00 00 00 32 00 57 68 69 73 74 6c 65 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whistle..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+08 1f 07 05 0f 47 05 62 0d 05 08 1f 02 05 0f 00 03 3e 0d 02 07 1f 02 05 0f
+4e 04 3c 0d 0b 07 1f 02 05 0f 00 04 63 0d 1b 57 22 00 14 00 32 0c 04 04 00
+28 32 00 00 00 32 00 57 68 69 73 74 6c 65 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whistle..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+08 1f 07 05 0f 47 01 62 0d 05 08 1f 02 05 0f 00 01 3e 0d 02 07 1f 02 05 0f
+4e 01 3c 0d 0b 07 1f 02 05 0f 00 00 63 0d 1b 57 22 00 14 00 32 0c 04 04 00
+28 32 00 00 00 32 00 57 68 69 73 74 6c 65 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whistle..3
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 00 08 00 00 03 42 08 03 19 10 00 09 08 00 04 42 04 03 0f 09 00 08 0f
+00 06 5d 08 03 0d 08 00 09 0e 1a 06 62 08 03 3c 23 09 0b 00 42 18 02 04 00
+63 32 00 00 00 33 00 57 68 69 73 74 6c 65 2e 2e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whistle..3
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 00 08 00 00 01 42 08 03 19 10 00 09 08 00 00 42 04 03 0f 09 00 08 0f
+00 01 5d 08 03 0d 08 00 09 0e 1a 01 62 08 03 3c 23 09 0b 00 42 18 02 04 00
+63 32 00 00 00 33 00 57 68 69 73 74 6c 65 2e 2e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whistling
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 20
+1f 0f 00 08 00 00 04 4e 07 03 19 10 00 09 08 00 00 38 01 03 0f 09 00 08 0f
+00 02 4e 08 03 0d 08 00 09 0e 1a 02 5e 08 03 3c 23 03 0f 00 62 18 02 04 00
+63 32 00 00 00 33 00 57 68 69 73 74 6c 69 6e 67 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 5
+
+* CATEGORY STRINGS
+
+* SUBCATEGORY Strings
+
+** Name: AnlgStr..1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 0a 00 07 0e 28 04 51 04 08 0e 05 12 08 0c 00 00 4f 04 04 0c 0a 00 07 0e
+07 05 63 04 00 0d 04 12 08 0c 14 04 5f 04 03 2c 26 21 20 47 12 0c 06 04 00
+63 32 00 32 00 32 00 41 6e 6c 67 53 74 72 2e 2e 31 63 63 63 32 32 32 00 40
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 0a 00 07 0e 28 01 51 04 08 0e 05 12 08 0c 00 00 4f 04 04 0c 0a 00 07 0e
+07 00 63 04 00 0d 04 12 08 0c 14 00 5f 04 03 2c 26 21 20 47 12 0c 06 04 00
+63 32 00 32 00 32 00 41 6e 6c 67 53 74 72 2e 2e 31 63 63 63 32 32 32 00 40
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 0a 00 07 0e 1e 02 49 04 08 0d 0c 01 07 0e 00 01 4d 04 04 0d 09 00 07 0f
+05 04 5b 04 00 0b 09 00 07 0e 14 03 5f 04 02 74 26 21 11 47 32 0c 06 04 00
+63 32 00 32 00 32 00 41 6e 6c 67 53 74 72 2e 2e 32 63 63 63 32 32 32 00 50
+00 30 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 0a 00 07 0e 1e 00 49 04 08 0d 0c 01 07 0e 00 00 4d 04 04 0d 09 00 07 0f
+05 00 5b 04 00 0b 09 00 07 0e 14 00 5f 04 02 74 26 21 11 47 32 0c 06 04 00
+63 32 00 32 00 32 00 41 6e 6c 67 53 74 72 2e 2e 32 63 63 63 32 32 32 00 50
+00 30 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 09 03 06 0e 28 02 39 0d 0b 0e 0a 01 04 0e 00 02 4b 08 04 0d 0a 02 05 0f
+0a 04 59 08 03 0b 0a 01 05 0d 14 04 5d 08 0b 2c 26 21 16 3b 22 0c 06 04 00
+63 32 00 32 00 32 00 41 6e 6c 67 53 74 72 2e 2e 33 63 63 63 32 32 32 00 20
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..3
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 09 03 06 0e 28 00 39 0d 0b 0e 0a 01 04 0e 00 00 4b 08 04 0d 0a 02 05 0f
+0a 00 59 08 03 0b 0a 01 05 0d 14 00 5d 08 0b 2c 26 21 16 3b 22 0c 06 04 00
+63 32 00 32 00 32 00 41 6e 6c 67 53 74 72 2e 2e 33 63 63 63 32 32 32 00 20
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 00 05 0e 00 42 44 0d 02 0d 07 0e 06 06 0e 44 57 08 04 0c 1f 00 06 0f
+52 05 53 0d 04 0b 1f 06 08 0f 0a 03 63 01 04 2d 22 0a 0a 08 26 0c 07 04 00
+63 63 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 34 63 63 63 32 32 32 00 30
+00 20 00 00 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..4
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 00 05 0e 00 40 44 0d 02 0d 07 0e 06 06 0e 40 57 08 04 0c 1f 00 06 0f
+52 00 53 0d 04 0b 1f 06 08 0f 0a 00 63 01 04 2d 22 0a 0a 08 36 0c 07 04 00
+63 63 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 34 63 63 63 32 32 32 00 30
+00 20 00 00 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 03 1e 05 04 56 04 48 04 06 0c 03 1e 05 04 23 01 49 0a 0d 09 1f 01 08 0f
+15 03 57 08 08 09 1f 00 05 0f 25 03 5b 04 02 54 20 0f 0a 00 52 0c 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 35 63 63 63 32 32 32 00 00
+00 40 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..5
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 03 1e 05 04 56 00 48 04 06 0c 03 1e 05 04 23 00 49 0a 0d 09 1f 01 08 0f
+15 00 57 08 08 09 1f 00 05 0f 25 00 5b 04 02 54 20 0f 0a 00 52 0c 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 35 63 63 63 32 32 32 00 00
+00 40 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 03 1e 05 04 56 04 41 1f 06 0d 03 1e 05 04 23 02 48 0d 0d 0a 1f 01 08 0f
+15 03 5b 08 08 0a 1f 00 05 0f 25 04 5d 08 01 54 20 0f 0a 00 52 0c 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 36 63 63 63 32 32 32 00 50
+00 20 00 30 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..6
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 03 1e 05 04 56 00 41 1f 06 0d 03 1e 05 04 23 00 48 0d 0d 0a 1f 01 08 0f
+15 00 5b 08 08 0a 1f 00 05 0f 25 00 5d 08 01 54 20 0f 0a 00 52 0c 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 36 63 63 63 32 32 32 00 50
+00 20 00 30 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..7
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0f 04 05 0d 56 04 3a 1f 06 0e 0b 01 05 0e 23 02 4b 08 05 0d 15 03 08 0f
+15 04 57 08 00 0b 04 00 05 0f 25 04 5b 08 01 6c 20 0f 0a 00 52 0c 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..7
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0f 04 05 0d 56 00 3a 1f 06 0e 0b 01 05 0e 23 00 4b 08 05 0d 15 03 08 0f
+15 00 57 08 00 0b 04 00 05 0f 25 00 5b 08 01 6c 20 0f 0a 00 52 0c 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..8
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 0b 05 05 0d 0a 42 44 08 11 0d 04 02 06 0d 0e 43 5c 08 02 0c 07 06 06 0f
+52 05 56 19 03 0a 03 06 08 0f 0a 04 63 08 00 2d 22 0e 0c 08 56 0c 07 04 00
+63 63 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 38 63 63 63 32 32 32 00 60
+00 30 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..8
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 0b 05 05 0d 0a 40 44 08 11 0d 04 02 06 0d 0e 40 5c 08 02 0c 07 06 06 0f
+52 00 56 19 03 0a 03 06 08 0f 0a 00 63 08 00 2d 22 0e 0c 08 56 0c 07 04 00
+63 63 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 38 63 63 63 32 32 32 00 60
+00 30 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..9
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 0b 05 05 0e 00 42 42 04 03 0d 0c 00 05 0e 0e 41 3c 08 0e 0a 09 06 06 0f
+52 04 5e 08 02 0a 03 00 06 0f 0a 04 5d 08 04 24 1e 0e 0c 08 56 00 07 04 00
+63 63 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 39 63 63 63 32 32 32 00 30
+00 50 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr..9
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 0b 05 05 0e 00 40 42 0d 03 0d 0c 00 05 0e 0e 40 3c 13 0e 0a 09 06 06 0f
+52 00 5e 04 02 0c 03 00 06 0f 0a 00 5d 08 04 24 22 0e 0c 08 56 00 07 04 00
+63 63 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 2e 39 63 63 63 32 32 32 00 30
+00 10 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr.10
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 03 1e 05 04 56 03 4c 04 00 0c 03 1e 05 04 23 02 48 04 0e 09 1f 01 08 0f
+15 04 5f 04 0e 09 1f 00 05 0f 25 03 60 04 06 54 17 13 29 00 32 0c 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 31 30 63 63 63 32 32 32 00 00
+00 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr.10
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 03 1e 05 04 56 00 4c 00 00 0c 03 1e 05 04 23 00 48 08 0e 09 1f 01 08 0f
+15 00 5f 00 0e 09 1f 00 05 0f 25 00 60 00 06 54 17 13 29 00 32 0c 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 31 30 63 63 63 32 32 32 00 00
+00 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr.11
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 0b 02 05 0c 23 03 49 04 08 10 03 1e 05 04 58 03 48 0d 00 0c 0b 01 07 0e
+26 05 5c 08 06 0c 1f 00 05 0f 25 03 60 04 03 24 21 19 0e 00 22 24 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 31 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgStr.11
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 0b 02 05 0c 23 00 49 04 08 10 03 1e 05 04 58 00 48 0d 00 0c 0b 01 07 0e
+26 00 5c 08 06 0c 1f 00 05 0f 25 00 60 04 03 24 21 19 0e 00 22 24 0c 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 53 74 72 2e 31 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BC1 String
+** Controls: KV, MW (LFO pitch), BC (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 03 1e 05 04 56 04 53 0d 06 0c 03 1e 05 04 23 3c 52 08 0d 09 1f 01 08 0f
+15 05 57 08 08 09 1f 00 05 0f 25 06 5b 04 01 64 20 0f 0a 00 52 0c 0c 04 00
+63 32 00 05 09 32 63 42 43 31 20 53 74 72 69 6e 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DualStr..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 03 02 04 08 2d 02 4a 08 08 17 0c 07 01 0f 3f 02 3d 0d 04 0c 0b 04 07 0f
+12 04 61 08 05 0c 08 00 06 0b 25 04 5b 08 06 2c 21 1e 0f 00 22 18 0c 04 00
+63 32 00 00 00 32 00 44 75 61 6c 53 74 72 2e 2e 31 63 63 63 32 32 32 00 00
+00 40 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DualStr..1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 03 02 04 08 2d 00 4a 08 08 1f 0c 07 01 0f 3f 00 3d 1c 04 09 10 04 07 0f
+12 00 61 08 05 0d 08 00 06 0b 25 00 5b 04 06 2c 21 1e 0f 00 22 18 0c 04 00
+63 32 00 00 00 32 00 44 75 61 6c 53 74 72 2e 2e 31 63 63 63 32 32 32 00 00
+00 40 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DualStr..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 03 02 04 08 2d 03 46 08 0b 16 0c 07 01 0f 3f 02 49 04 01 09 10 04 07 0f
+12 04 59 08 05 0a 08 00 06 0b 25 04 60 08 05 74 21 1e 0f 00 32 18 0c 04 00
+63 32 00 00 00 32 00 44 75 61 6c 53 74 72 2e 2e 32 63 63 63 32 32 32 00 00
+00 30 00 10 00 30 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DualStr..2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 03 02 04 08 2d 00 46 13 0b 16 0c 07 01 0f 3f 00 49 08 01 09 10 04 07 0f
+12 00 59 04 05 0a 08 00 06 0b 25 00 60 08 05 74 21 1e 0f 00 32 18 0c 04 00
+63 32 00 00 00 32 00 44 75 61 6c 53 74 72 2e 2e 32 63 63 63 32 32 32 00 00
+00 30 00 10 00 30 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DualStr..3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 05 01 05 08 2d 03 50 08 03 15 0a 01 05 0f 3f 03 38 13 00 0a 10 01 05 0f
+12 03 59 08 03 0a 07 01 05 0b 25 04 5b 08 06 2c 21 1e 0f 00 22 18 0c 04 00
+63 32 00 00 00 32 00 44 75 61 6c 53 74 72 2e 2e 33 63 63 63 32 32 32 00 10
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DualStr..3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 05 01 05 08 2d 00 50 08 03 15 0a 01 05 0f 3f 00 38 13 00 0a 10 01 05 0f
+12 00 59 08 03 0a 07 01 05 0b 25 00 5b 08 06 2c 21 1e 0f 00 22 18 0c 04 00
+63 32 00 00 00 32 00 44 75 61 6c 53 74 72 2e 2e 33 63 63 63 32 32 32 00 10
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ELKA Strg1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 16 03 04 0e 00 04 58 0d 02 18 03 03 05 08 00 04 5b 08 00 0f 04 03 07 0f
+00 04 63 0d 06 09 10 03 05 0f 00 07 5f 08 05 24 21 23 0f 00 12 00 05 04 00
+63 63 63 00 00 32 00 45 4c 4b 41 20 53 74 72 67 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ELKA Strg1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 16 03 04 0e 00 01 58 0d 02 18 03 03 05 08 00 01 5b 08 00 0f 04 03 07 0f
+00 00 63 0d 06 09 10 03 05 0f 00 01 5f 08 05 24 21 23 0f 00 12 00 05 04 00
+63 63 63 00 00 32 00 45 4c 4b 41 20 53 74 72 67 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ELKA Strg2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 16 03 04 0e 00 03 4b 08 0a 14 03 03 05 08 00 04 51 04 00 0b 04 03 07 0f
+00 05 63 08 06 0b 10 03 05 0f 00 06 63 04 0d 7c 23 19 14 00 42 18 05 04 00
+63 63 63 00 00 32 00 45 4c 4b 41 20 53 74 72 67 32 63 63 63 32 32 32 00 00
+00 30 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ELKA Strg2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 16 03 04 0e 00 01 4b 08 0a 14 03 03 05 08 00 01 51 04 00 0b 04 03 07 0f
+00 00 63 08 06 0b 10 03 05 0f 00 00 63 04 0d 7c 23 19 14 00 42 18 05 04 00
+63 63 63 00 00 32 00 45 4c 4b 41 20 53 74 72 67 32 63 63 63 32 32 32 00 00
+00 30 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HiString 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 21
+0b 04 00 04 0f 14 02 49 09 06 0a 07 00 04 0f 14 02 51 0a 00 08 1f 00 05 0f
+00 01 63 09 06 0a 1f 00 05 0f 00 01 63 0a 00 3c 1f 06 09 00 52 05 04 04 00
+63 32 00 00 00 32 00 48 69 53 74 72 69 6e 67 20 31 63 63 63 32 32 32 00 02
+00 30 00 32 00 10 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HiString 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 30
+17 04 00 04 0f 14 02 49 09 06 19 07 00 04 0f 14 02 51 0a 00 15 1f 00 05 0f
+00 01 63 09 06 14 1f 00 05 0f 00 01 63 0a 00 3c 1f 06 09 00 52 05 04 04 00
+63 32 00 00 00 32 00 48 69 53 74 72 69 6e 67 20 32 63 63 63 32 32 32 30 02
+20 30 00 32 00 10 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Kalimba *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 00 1f 01 00 00 00 3f 04 0e 1a 0d 1f 0f 00 00 00 32 08 1b 1a 0c 1f 05 00
+00 01 63 08 08 1e 12 1f 09 00 00 01 63 34 13 04 1c 00 00 00 42 18 02 04 00
+28 32 00 00 00 32 00 4b 61 6c 69 6d 62 61 20 20 2a 63 63 63 32 32 32 00 30
+00 00 00 00 09 1f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LowString
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 22
+0b 04 00 04 0f 14 02 49 05 06 0a 07 00 04 0f 14 02 55 04 00 09 1f 00 05 0f
+00 01 63 09 06 08 1f 00 05 0f 00 01 63 04 00 3c 1d 06 0a 00 52 05 04 04 00
+63 32 00 00 00 32 00 4c 6f 77 53 74 72 69 6e 67 20 63 63 63 32 32 32 00 01
+00 38 00 32 00 18 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntPluck1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 19 16 01 0d 00 02 52 19 03 1f 09 0a 07 0c 00 02 4e 00 03 1b 15 06 0c 0d
+00 05 36 16 03 1f 0a 04 06 0c 00 05 63 04 0b 7a 15 00 00 00 22 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 50 6c 75 63 6b 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntPluck1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 19 16 01 0d 00 00 52 19 03 1f 09 0a 07 0c 00 00 4e 00 03 1b 15 06 0c 0d
+00 00 36 16 03 1f 0a 04 06 0c 00 00 63 04 0b 7a 15 00 00 00 22 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 50 6c 75 63 6b 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntPluck1
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 19 16 00 0d 00 00 52 19 03 1f 09 0a 07 0c 00 00 4e 00 03 1b 15 06 0c 0d
+00 00 36 16 03 1f 0a 04 06 0c 00 00 63 04 0b 7a 15 00 00 00 22 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 50 6c 75 63 6b 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntPluck2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 07 19 07 0f 00 02 63 04 03 18 0c 0f 07 0c 00 03 41 2d 13 18 0c 0f 07 0c
+00 06 63 04 0b 16 0f 16 06 0c 00 04 63 04 0b 7c 15 00 00 00 22 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 50 6c 75 63 6b 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntPluck2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 07 19 07 0f 00 00 63 04 03 18 0c 0f 07 0c 00 00 41 2d 13 18 0c 0f 07 0c
+00 00 63 04 0b 16 0f 16 06 0c 00 00 63 04 0b 7c 15 00 00 00 22 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 50 6c 75 63 6b 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pizz. 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 25
+1f 1f 08 0a 0a 09 00 3c 04 03 1d 1d 11 0f 0a 00 01 63 04 03 1c 12 00 0b 00
+00 01 63 04 03 1f 11 0e 0f 09 00 01 5a 04 03 3e 23 00 0a 00 32 18 02 04 00
+63 32 00 00 00 32 00 50 69 7a 7a 2e 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pizz. 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 08 0a 0d 09 00 3c 04 03 1d 1d 11 0f 0a 00 01 63 04 03 1c 12 00 0b 00
+00 01 63 04 03 1f 11 0e 0f 09 00 01 5a 04 03 3e 23 00 0a 00 32 18 02 04 00
+63 32 00 00 00 32 00 50 69 7a 7a 2e 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pizz. 2
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 26
+1d 10 0a 09 0f 00 01 41 04 03 1f 1f 16 0a 0a 00 00 4a 04 03 1f 1f 1f 0f 00
+00 01 51 00 03 1f 13 11 0f 00 00 01 63 04 03 39 23 00 00 00 32 18 02 04 00
+63 32 00 00 00 32 00 50 69 7a 7a 2e 20 20 20 20 32 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pizz. 2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 10 0a 09 0f 00 01 41 04 03 1f 1f 16 0a 0d 00 00 4a 04 03 1f 1f 1f 0f 00
+00 01 51 00 03 1f 13 11 0f 00 00 01 63 04 03 39 23 00 00 00 32 18 02 04 00
+63 32 00 00 00 32 00 50 69 7a 7a 2e 20 20 20 20 32 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pizzicato*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 13 15 0f 00 2b 04 58 04 03 1f 1f 07 0a 0c 00 01 54 04 06 1f 0d 00 0a 00
+00 01 5b 04 00 1e 17 10 07 0b 00 02 63 04 03 01 23 00 00 00 32 18 02 04 00
+63 32 00 00 00 32 00 50 69 7a 7a 69 63 61 74 6f 2a 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pizzicato
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank B, voice 23
+1b 18 15 0f 0a 00 01 61 04 03 1f 1f 00 07 0c 00 01 54 04 06 1f 0d 00 08 00
+00 01 5b 04 03 1f 10 00 06 00 00 01 63 04 03 39 23 00 00 00 62 18 04 04 00
+63 32 00 00 00 32 00 50 69 7a 7a 69 63 61 74 6f 20 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ReverbStrg
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 25
+0b 04 00 04 0f 00 01 49 05 06 0a 07 00 04 0f 00 01 49 04 00 09 1f 00 05 0f
+00 01 63 09 06 09 1f 00 05 0f 00 01 63 0a 00 3c 1d 08 0a 00 52 05 04 04 00
+63 32 00 00 00 32 00 52 65 76 65 72 62 53 74 72 67 63 63 63 32 32 32 00 31
+00 28 00 32 00 30 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StrgPad A
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 04 00 04 0f 14 02 48 03 01 0a 07 00 04 0f 14 02 50 04 04 09 1f 00 05 0f
+00 01 63 03 01 09 1f 00 05 0f 00 01 63 04 04 3c 21 06 0c 00 52 05 04 04 00
+63 32 00 0c 00 32 00 53 74 72 67 50 61 64 20 41 20 63 63 63 32 32 32 00 16
+00 38 00 36 00 18 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StrgPad B
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 04 00 04 0f 14 02 47 05 02 0a 07 00 04 0f 14 02 4e 03 00 09 1f 00 05 0f
+00 01 63 04 06 08 1f 00 05 0f 00 01 63 03 00 3c 1f 06 13 00 52 05 04 04 00
+63 32 00 11 00 32 00 53 74 72 67 50 61 64 20 42 20 63 63 63 32 32 32 00 11
+00 36 00 38 00 16 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Stringed *
+** Controls: KV, MW (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 04 0e 0a 50 45 09 06 1f 00 00 04 0e 0a 40 4c 0a 00 09 07 00 06 0e
+00 02 63 09 10 09 07 00 06 0e 20 02 63 0a 16 3c 1c 00 0b 00 4a 05 02 04 00
+28 63 00 00 00 32 10 53 74 72 69 6e 67 65 64 20 2a 63 63 63 32 32 32 00 02
+00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 03 02 04 08 41 12 42 04 0b 0a 0c 07 03 0f 63 24 39 16 00 0b 10 04 07 0f
+12 1b 61 08 03 0b 07 05 05 0d 25 1b 5c 04 02 24 21 23 0c 00 22 18 0c 04 00
+63 32 00 00 00 32 00 53 74 72 69 6e 67 45 6e 73 31 63 63 63 32 32 32 00 30
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 03 02 04 08 41 00 42 04 0b 16 0c 07 03 0f 63 00 3f 19 00 0b 10 04 07 0f
+12 00 61 04 03 0b 07 05 05 0d 25 00 5c 08 02 24 21 23 0c 00 22 18 0c 04 00
+63 32 00 00 00 32 00 53 74 72 69 6e 67 45 6e 73 31 63 63 63 32 32 32 00 20
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 01 02 05 08 41 02 4f 08 0b 16 0c 07 06 0f 63 02 3b 08 00 09 10 04 06 0f
+12 03 60 0d 03 0b 08 05 06 0d 25 03 5e 08 02 2c 21 23 0c 00 22 0c 0c 04 00
+63 32 00 00 00 32 00 53 74 72 69 6e 67 45 6e 73 32 63 63 63 32 32 32 00 20
+00 60 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 01 02 05 08 41 00 4f 04 0b 16 0c 07 06 0f 63 00 3b 13 00 09 10 04 06 0f
+12 00 60 0d 03 0b 08 05 06 0d 25 00 5e 08 02 2c 21 23 0c 00 22 0c 0c 04 00
+63 32 00 00 00 32 00 53 74 72 69 6e 67 45 6e 73 32 63 63 63 32 32 32 00 00
+00 60 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 15 0a 07 0e 0a 02 4d 04 0e 0a 06 1a 08 05 28 02 34 08 0e 0f 09 07 06 0f
+1e 03 63 04 04 0a 06 1a 08 05 28 03 5f 08 0e 2c 21 2e 1e 09 21 18 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 33 63 63 63 32 32 32 00 40
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 15 0a 07 0e 0a 00 4d 04 0e 0a 06 1a 08 05 28 00 34 13 0e 0f 09 07 06 0f
+1e 00 63 04 04 0a 06 1a 08 05 28 00 5f 08 0e 2c 21 2e 1e 09 12 18 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 33 63 63 63 32 32 32 00 40
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 10 06 04 0e 39 01 50 08 00 13 09 00 04 0e 14 02 44 08 05 0b 10 00 05 0e
+14 04 63 08 03 0b 10 00 07 0e 14 04 5f 0d 05 2c 1c 00 0f 00 32 18 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 34 63 63 63 32 32 32 00 20
+00 30 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns4
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 10 06 04 0e 39 00 50 04 00 13 09 00 04 0e 14 00 44 08 05 0f 10 00 05 0e
+14 00 63 08 03 0f 10 00 07 0e 14 00 5f 08 05 2c 21 00 0f 00 32 18 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 0a 00 05 0d 39 03 44 04 06 0b 09 00 05 0e 0a 02 39 04 0b 0b 09 06 06 0c
+0c 04 5e 08 04 0b 0b 00 05 0e 0a 03 60 04 02 24 21 0a 0e 00 32 18 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 35 63 63 63 32 32 32 00 40
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns5
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 0f 00 05 0d 39 00 44 08 06 0b 09 00 05 0e 0a 00 39 04 0b 0f 09 06 06 0c
+0c 00 5e 08 04 0c 0b 00 05 0e 0a 00 60 08 02 24 21 0a 0e 00 32 18 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 35 63 63 63 32 32 32 00 40
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 0f 00 06 0d 39 01 50 08 06 15 0f 00 06 0d 0a 03 48 13 0b 0b 09 06 06 0c
+0c 02 62 08 04 0b 17 00 06 0e 0a 03 62 0d 02 2c 21 0a 09 00 22 0c 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 36 63 63 63 32 32 32 00 40
+00 10 00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns6
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 0f 00 06 0d 39 00 50 08 06 15 0f 00 06 0d 0a 00 48 13 0b 10 09 06 06 0c
+0c 00 62 08 04 10 17 00 06 0e 0a 00 62 0d 02 2c 21 0a 09 00 22 0c 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 36 63 63 63 32 32 32 00 40
+00 10 00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns7
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 0f 00 05 0d 28 01 53 00 00 15 0f 00 05 0d 0a 03 47 00 04 0c 09 06 06 0c
+06 03 61 00 00 0b 17 00 05 0e 05 04 62 00 05 24 21 0a 09 00 22 18 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 37 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns7
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 0f 00 05 0d 28 00 53 00 00 15 0f 00 05 0d 0a 00 47 00 04 0d 09 06 06 0c
+06 00 61 00 00 0d 17 00 05 0e 05 00 62 00 05 24 21 0a 09 00 22 18 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 37 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns8
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 04 09 09 0d 28 01 3e 08 08 0d 0f 00 05 0d 0a 03 44 08 04 0b 09 06 06 0c
+06 05 63 08 00 0b 17 00 05 0e 05 03 62 08 05 24 21 0a 09 00 22 00 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 38 63 63 63 32 32 32 00 20
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringEns8
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 04 09 09 0d 28 00 3e 13 08 0f 0f 00 05 0d 0a 00 44 19 04 0d 09 06 06 0c
+06 00 63 08 00 0e 17 00 05 0e 05 00 62 08 05 24 21 0a 09 00 22 00 0c 04 00
+63 32 32 00 00 32 00 53 74 72 69 6e 67 45 6e 73 38 63 63 63 32 32 32 00 20
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringLead
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0d 00 05 0e 0a 03 58 08 03 0a 02 00 07 09 00 05 5a 19 08 0f 15 06 05 0f
+00 05 62 08 08 0c 15 06 08 0e 00 05 5f 04 08 34 26 20 20 00 12 0c 02 04 00
+28 02 00 00 00 32 00 53 74 72 69 6e 67 4c 65 61 64 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StringLead
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0d 00 05 0e 0a 01 58 08 03 0a 02 00 07 09 00 02 5a 19 08 0f 15 06 05 0f
+00 00 62 08 08 0c 15 06 08 0e 00 00 5f 04 08 34 26 20 20 00 12 0c 02 04 00
+28 02 00 00 00 32 00 53 74 72 69 6e 67 4c 65 61 64 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Strings
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+11 0b 05 05 0a 17 00 43 04 0c 0c 1f 08 04 0f 22 00 35 13 09 07 1f 04 05 0f
+14 00 46 04 0b 0a 1f 05 06 0f 00 00 57 04 0b 3a 21 0e 2a 00 42 0c 02 04 00
+63 32 00 32 00 32 00 53 74 72 69 6e 67 73 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Strings
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+0a 00 05 05 0f 17 00 43 08 0c 0c 00 00 04 0f 22 00 34 13 09 0e 00 00 05 0f
+14 00 46 0a 0b 0c 00 06 06 0f 00 00 4c 0a 0b 3a 21 0e 2a 00 42 0c 02 04 00
+63 32 00 32 00 32 00 53 74 72 69 6e 67 73 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Strings 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 1
+1f 04 00 04 0f 1e 02 46 09 06 1f 04 00 04 0f 1e 02 46 0a 00 0c 1f 00 05 0f
+1e 01 63 09 06 0c 1f 00 05 0f 1e 01 63 0a 00 3c 1f 06 0a 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 74 72 69 6e 67 73 20 20 31 63 63 63 32 32 32 00 02
+00 00 00 32 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Strings 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 2
+14 05 00 04 09 14 02 3d 1c 06 0a 04 02 04 09 01 01 47 13 00 0c 05 02 05 0c
+00 01 63 09 06 0a 04 01 05 0c 00 01 63 0a 00 3c 1f 00 1a 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 74 72 69 6e 67 73 20 20 32 63 63 63 32 32 32 00 10
+00 20 00 32 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Strings 2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 05 00 04 09 14 02 3d 1c 06 0d 04 02 04 09 01 01 47 13 00 0c 05 02 05 0c
+00 01 63 09 06 0d 04 01 05 0c 00 01 63 0a 00 3c 1f 00 1a 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 74 72 69 6e 67 73 20 20 32 63 63 63 32 32 32 00 10
+00 20 00 32 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Strings 3
+** Description: A string sound with a little horn mixed in
+** Controls: KV, MW (LFO pitch)
+** Source: Art Hitzeman
+1f 04 00 04 0f 1e 02 46 09 06 1f 04 00 04 0f 1e 02 46 0a 00 0c 1f 00 05 0f
+1e 01 63 09 06 12 1f 00 05 0f 1e 01 63 0a 00 3c 1f 06 0a 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 74 72 69 6e 67 73 20 20 33 63 63 63 32 32 32 00 02
+00 00 00 32 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Syn.Str 1
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 1
+1f 1f 00 03 0f 00 00 46 0a 00 1f 1f 00 03 0f 00 00 44 09 06 0b 1f 00 05 0f
+1e 00 56 0a 00 0b 1f 00 05 0f 1e 00 56 0a 06 3c 23 00 2e 00 42 05 02 04 00
+63 32 00 00 00 32 00 53 79 6e 2e 53 74 72 20 20 31 63 63 63 32 32 32 00 30
+00 62 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Syn.Str 2
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 2
+1f 1f 00 03 0f 00 00 31 13 00 1f 1f 00 03 0f 00 00 3b 09 06 0c 1f 00 05 0f
+1e 00 5b 0a 00 0c 1f 00 05 0f 1e 00 53 0a 06 3c 20 00 4b 00 42 05 02 04 00
+63 32 00 00 00 32 00 53 79 6e 2e 53 74 72 20 20 32 63 63 63 32 32 32 00 70
+00 62 00 30 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynString
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 26
+1f 04 00 02 0f 0f 00 44 04 03 1f 09 03 02 0f 15 01 3a 08 00 1f 00 00 0b 0f
+0c 02 44 08 06 1a 0a 00 05 0f 05 01 5c 08 13 3a 1d 06 0f 00 52 0c 04 04 00
+63 32 00 00 00 32 00 53 79 6e 53 74 72 69 6e 67 20 63 63 63 32 32 32 20 00
+30 30 10 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: T Pluck..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 0d 0a 03 0d 00 3a 4f 0a 0a 1b 13 00 0c 07 00 1e 51 16 0b 1f 0a 0a 06 0c
+00 1c 63 04 08 1b 09 0a 07 0c 00 3d 63 04 0b 6c 15 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 54 20 50 6c 75 63 6b 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: T Pluck..1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0d 0a 03 0d 00 3a 4f 0a 0a 1b 13 00 0c 07 00 19 51 16 0b 1f 0a 0a 06 0c
+00 18 63 04 08 1b 09 0a 07 0c 00 38 63 04 0b 6c 15 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 54 20 50 6c 75 63 6b 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: T Pluck..2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 0d 0a 03 0d 00 3b 53 08 0a 1b 13 00 0c 07 00 1d 3b 00 0b 1f 0a 0a 06 0c
+00 1e 4f 16 08 1e 0a 09 06 0c 00 3d 63 04 13 72 15 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 54 20 50 6c 75 63 6b 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: T Pluck..2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0d 0a 03 0d 00 39 53 08 0a 1b 13 00 0c 07 00 1a 3b 00 0b 1f 0a 0a 06 0c
+00 19 4f 16 08 1e 0a 09 06 0c 00 38 63 04 13 72 15 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 54 20 50 6c 75 63 6b 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: T Pluck..3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 0f 09 04 0c 15 3b 53 0a 0e 15 0d 1f 03 0a 12 1d 4d 1f 19 1c 09 0f 05 0a
+19 1e 63 04 0a 13 07 09 05 0e 00 3d 63 00 13 6c 22 21 00 00 12 18 02 04 00
+63 32 00 00 00 32 00 54 20 50 6c 75 63 6b 2e 2e 33 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: T Pluck..3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 0f 09 04 0c 15 39 53 0a 0e 15 0d 1f 03 0a 12 19 4d 1f 19 1c 09 0f 05 0a
+19 18 63 04 0a 13 07 09 05 0e 00 38 63 00 13 6c 22 21 00 00 12 18 02 04 00
+63 32 00 00 00 32 00 54 20 50 6c 75 63 6b 2e 2e 33 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WarmString
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+0d 05 00 04 0f 14 00 40 05 06 0c 08 00 04 0f 14 00 49 04 00 0b 1f 00 05 0f
+00 03 63 09 06 0a 1f 00 05 0f 00 03 63 04 00 3c 1d 06 10 00 52 11 04 04 00
+63 32 00 00 00 32 00 57 61 72 6d 53 74 72 69 6e 67 63 63 63 32 32 32 00 01
+00 38 00 32 00 18 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindString
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 03 03 0f 56 03 63 0d 03 0d 04 02 04 0f 29 04 60 08 0b 06 00 00 04 0f
+4c 06 3d 08 13 0a 04 02 06 0f 5c 05 63 08 0b 7c 29 00 00 00 22 00 02 04 00
+28 02 00 00 00 32 00 57 69 6e 64 53 74 72 69 6e 67 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindString
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 03 03 0f 56 00 63 0d 03 0d 04 02 04 0f 29 02 60 08 0b 06 00 00 04 0f
+4c 00 3d 08 13 0a 04 02 06 0f 5c 00 63 08 0b 7c 29 00 00 00 22 00 02 04 00
+28 02 00 00 00 32 00 57 69 6e 64 53 74 72 69 6e 67 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: phantstrng
+** Description: a string voice
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+08 03 06 01 0b 00 03 58 0a 02 1f 02 04 03 0e 43 03 5b 04 10 1f 0c 02 04 0a
+00 03 4e 08 00 0b 09 04 06 0b 00 03 63 04 03 28 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 70 68 61 6e 74 73 74 72 6e 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Banjo
+
+
+** Name: Banjo *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 0c 00 04 0c 00 01 51 04 15 1f 12 00 01 0f 00 00 58 04 16 1f 0a 09 01 0a
+00 02 4e 19 18 1c 0b 0a 06 09 00 41 63 0a 13 7b 3a 00 00 00 09 18 02 04 00
+63 00 42 00 00 32 00 42 61 6e 6a 6f 20 20 20 20 2a 63 63 63 32 32 32 00 00
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Banjo
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 10
+1f 0b 08 01 0f 00 00 48 1c 15 1f 1f 00 01 0f 00 00 53 04 16 1f 07 11 01 0f
+00 00 40 08 16 1f 0e 0a 06 0a 00 0b 63 0a 10 3b 1d 00 10 00 32 18 02 04 00
+63 32 00 00 00 32 00 42 61 6e 6a 6f 20 20 20 20 20 63 63 63 32 32 32 00 70
+00 30 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Banjo....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 17 00 04 0c 00 02 5a 04 0d 1f 02 03 01 0f 00 05 5a 04 0e 1f 1b 08 01 0c
+00 06 42 08 0e 1f 0d 0b 06 09 00 06 63 04 10 2a 06 00 01 00 32 18 07 04 00
+63 32 00 00 00 32 00 42 61 6e 6a 6f 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Banjo....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 17 00 04 0c 00 02 5a 04 0d 1f 02 03 01 0f 00 01 5a 04 0e 1f 1b 08 01 0c
+00 01 42 08 0e 1f 0d 0b 06 09 00 01 63 04 10 2a 06 00 01 00 32 18 07 04 00
+63 32 00 00 00 32 00 42 61 6e 6a 6f 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Banjo....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 17 00 04 0c 00 02 5b 04 0d 16 09 03 05 00 00 06 4d 13 16 1f 1b 08 05 0c
+00 04 3e 08 0e 1f 0d 0b 06 09 00 05 63 04 10 2c 06 00 01 00 32 18 07 04 00
+63 32 00 00 00 32 00 42 61 6e 6a 6f 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Banjo....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 17 00 04 0c 00 02 5b 04 0d 16 09 03 05 00 00 02 4d 13 16 1f 1b 08 05 0c
+00 00 3e 08 0e 1f 0d 0b 06 09 00 00 63 04 10 2c 06 00 01 00 32 18 07 04 00
+63 32 00 00 00 32 00 42 61 6e 6a 6f 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Old Banjo
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 7
+1e 17 00 04 0c 00 01 5f 04 15 1f 0b 03 01 0f 00 00 5c 04 1e 1f 1b 08 01 0c
+00 02 45 19 1e 1f 0d 0b 06 09 00 03 63 0a 10 2a 23 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 4f 6c 64 20 42 61 6e 6a 6f 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+
+--Bank 6
+
+* SUBCATEGORY BassGuitar
+
+
+** Name: AnalogBass
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 13
+1f 0d 00 08 0c 1e 03 51 04 08 1f 09 00 09 0a 00 01 53 00 00 1f 0c 00 0a 0b
+00 01 4a 00 06 1f 1f 00 0c 0f 00 02 63 00 03 3a 23 00 00 00 62 0c 04 04 00
+63 32 00 32 00 32 00 41 6e 61 6c 6f 67 42 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 08 03 0a 0f 01 61 00 13 1f 0f 0b 03 0d 0c 01 4c 04 0b 15 15 08 05 0b
+2e 06 36 10 0b 1f 07 0a 09 0d 00 05 63 04 13 5a 22 35 0a 00 72 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 08 03 0a 0f 01 61 00 13 1f 0f 0b 03 0d 0c 01 4c 04 0b 15 15 08 05 0b
+2e 01 36 10 0b 1f 07 0a 09 0d 00 00 63 04 13 5a 22 35 0a 00 72 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 1b 0c 03 0c 0f 01 5f 00 03 1c 1b 11 03 0c 0c 02 4a 04 0b 18 09 0f 04 0d
+2e 05 32 04 0b 1f 0f 04 09 0f 00 05 63 04 13 1a 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 1b 0c 03 0c 0f 01 5f 00 03 1c 1b 11 03 0c 0c 01 4a 04 0b 18 09 0f 04 0d
+2e 00 32 04 0b 1f 0f 04 09 0f 00 00 63 04 13 1a 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 0c 0c 0c 0f 01 51 04 03 1f 15 12 05 0d 0c 42 57 04 0b 1f 0a 0a 03 04
+2e 45 46 08 0a 1f 07 05 0a 0f 00 06 5f 04 13 0a 26 1c 02 50 36 00 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 0c 0c 0c 0f 00 51 04 03 1f 15 12 05 0d 0c 40 57 04 0b 1f 0a 0a 03 04
+2e 40 46 08 0a 1f 07 05 0a 0f 00 00 5f 04 13 0a 26 1c 02 50 36 00 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 0c 0c 0c 00 01 5a 00 03 1f 15 12 05 0d 00 41 63 04 13 1f 0a 0a 03 04
+00 45 46 08 12 1f 07 09 0a 0f 00 04 63 04 0b 1a 26 1c 02 50 36 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 0c 0c 0c 00 01 5b 00 03 1f 15 12 05 0d 00 40 63 04 13 1f 0a 0a 03 04
+00 43 46 08 12 1f 07 09 0a 0f 00 06 63 04 0b 1a 26 1c 02 50 36 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 0c 0c 0c 00 01 5a 00 03 1f 15 12 05 0d 00 41 63 04 13 1f 0a 0a 03 04
+00 41 46 08 12 1f 07 09 0a 0f 00 00 63 04 0b 1a 26 1c 02 50 36 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 0c 0c 0c 00 01 5b 00 03 1f 15 12 05 0d 00 40 63 04 13 1f 0a 0a 03 04
+00 41 46 08 12 1f 07 09 0a 0f 00 00 63 04 0b 1a 26 1c 02 50 36 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1f 08 08 0f 0f 02 60 04 03 1c 1c 0a 04 09 0c 02 63 00 03 1b 0c 08 08 04
+2e 06 46 1c 03 1f 12 06 09 0f 00 05 63 00 03 1a 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1f 08 08 0f 0f 02 60 04 03 1c 1c 0a 04 09 0c 00 63 00 03 1b 0c 08 08 04
+2e 01 46 1c 03 1f 12 06 09 0f 00 00 63 00 03 1a 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1f 08 08 0c 0f 01 5a 04 03 1c 1f 0a 04 0f 0c 03 4c 00 03 1b 1f 08 08 0e
+2e 05 63 04 03 1f 1f 06 09 0f 00 05 63 00 03 3c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1f 08 08 0c 0f 01 5a 04 03 1c 1f 0a 04 0f 0c 01 4c 00 03 1b 1f 08 08 0e
+2e 00 63 04 03 1f 1f 06 09 0f 00 00 63 00 03 3c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1f 08 06 0c 0f 01 63 00 06 1c 1f 09 0a 0c 0c 02 63 00 02 1b 1f 07 09 0f
+2e 05 63 04 06 1f 1f 09 0a 0c 00 05 63 04 02 2c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.8
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1f 08 06 0c 0f 00 63 00 06 1c 1f 09 0a 0c 0c 00 63 00 02 1b 1f 07 09 0f
+2e 00 63 04 06 1f 1f 09 0a 0c 00 00 63 04 02 2c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.9
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 07 07 09 0f 00 01 52 00 06 1c 0c 08 0a 0f 00 01 61 00 02 1c 07 07 09 0f
+00 06 63 08 06 1c 07 07 09 0f 00 06 63 04 02 3c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass.9
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 07 07 09 0f 00 01 52 00 06 1c 0c 08 0a 0f 00 01 61 00 02 1c 07 07 09 0f
+00 00 63 08 06 1c 07 07 09 0f 00 00 63 04 02 3c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass10
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 1f 07 02 00 03 32 04 06 1c 0f 1f 07 02 00 03 5e 00 02 1c 1f 06 07 0f
+00 05 63 00 06 1c 1f 09 07 0f 00 05 63 00 02 3c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgBass10
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 1f 07 02 00 02 32 04 06 1c 0f 1f 07 02 00 01 5e 00 02 1c 1f 06 07 0f
+00 00 63 00 06 1c 1f 09 07 0f 00 00 63 00 02 3c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 41 6e 6c 67 42 61 73 73 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgCut.BS
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 12 07 08 04 00 02 61 19 1b 19 1b 09 04 0c 00 03 63 00 03 1d 0c 02 08 0d
+00 04 42 19 03 1d 12 06 09 0e 00 05 63 00 03 34 23 00 00 00 32 0c 02 04 00
+63 11 06 00 00 32 00 41 6e 6c 67 43 75 74 2e 42 53 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgCut.BS
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 12 07 08 04 00 01 61 19 1b 19 1b 09 04 0c 00 01 63 00 03 1d 0c 02 08 0d
+00 02 42 19 03 1d 12 06 09 0e 00 00 63 00 03 34 23 00 00 00 32 0c 02 04 00
+63 11 06 00 00 32 00 41 6e 6c 67 43 75 74 2e 42 53 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgFunkBS
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 02 05 06 14 03 5e 04 03 1f 1c 0f 07 04 19 03 5f 04 14 1f 1b 1f 07 0f
+00 07 5d 04 0b 1f 06 12 07 0c 00 06 5c 04 0b 75 08 00 0b 00 22 00 02 04 00
+63 11 06 00 00 32 00 41 6e 6c 67 46 75 6e 6b 42 53 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgFunkBS
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 08 02 05 06 14 01 5e 04 03 1f 1c 0f 07 04 19 01 5f 04 14 1f 1b 1f 07 0f
+00 02 5d 04 0b 1f 06 12 07 0c 00 00 5c 04 0b 75 08 00 0b 00 22 00 02 04 00
+63 11 06 00 00 32 00 41 6e 6c 67 46 75 6e 6b 42 53 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSplat
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 0c 01 09 0b 14 02 63 04 06 18 1f 1f 09 0f 19 04 61 04 06 0d 1f 08 09 0f
+00 05 62 08 0d 1c 0f 07 09 0c 00 06 63 04 01 65 08 00 0b 00 22 00 02 04 00
+63 11 06 00 00 32 00 41 6e 6c 67 53 70 6c 61 74 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSplat
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 0c 01 09 0b 14 01 63 04 06 18 1f 1f 09 0f 19 02 61 04 06 0d 1f 08 09 0f
+00 01 62 08 0d 1c 0f 07 09 0c 00 00 63 04 01 65 08 00 0b 00 22 00 02 04 00
+63 11 06 00 00 32 00 41 6e 6c 67 53 70 6c 61 74 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass 4
+** Description: Was called "Brass 4" but sounds more like a bass guitar
+** Controls: KV, MW (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 19 00 05 00 00 7b 63 19 03 15 0b 00 0a 09 00 47 57 0a 06 10 08 02 0a 05
+00 46 2a 03 03 1f 0b 06 0a 0e 00 47 63 04 03 39 1c 1a 03 13 66 0c 04 04 00
+63 32 00 00 00 32 00 42 61 73 73 20 20 20 20 20 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass 4
+** Description: Was called "Brass 4" but sounds more like a bass guitar
+** Controls: KV, MW (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 19 00 05 00 00 7b 4e 19 03 15 0b 00 0a 09 00 47 59 00 06 1f 08 02 0a 05
+00 42 4e 00 03 1f 0b 06 0a 0e 00 47 63 04 03 3b 1c 1a 03 13 66 0c 04 04 00
+63 32 00 00 00 32 00 42 61 73 73 20 20 20 20 20 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass 4
+** Description: Was called "Brass 4" but sounds more like a bass guitar
+** Controls: KV, MW (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 19 00 05 00 00 7b 5c 00 03 15 0b 00 0a 09 00 47 57 0a 06 1f 08 02 0a 05
+00 42 4e 00 03 1f 0b 06 0a 0e 00 47 63 04 03 3b 1c 1a 03 13 66 0c 04 04 00
+63 32 00 00 00 32 00 42 61 73 73 20 20 20 20 20 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass 4
+** Description: Was called "Brass 4" but sounds more like a bass guitar
+** Controls: KV, MW (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 19 00 05 00 00 7b 5c 00 03 15 0b 00 0a 09 00 47 57 0a 06 04 08 02 0a 05
+00 42 58 19 03 1f 0b 06 0a 0e 00 47 63 04 03 01 1c 1a 03 13 66 0c 04 04 00
+63 32 00 00 00 32 00 42 61 73 73 20 20 20 20 20 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass 4
+** Description: Was called "Brass 4" but sounds more like a bass guitar
+** Controls: KV
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 0f 07 09 0a 0f 07 4e 16 03 1f 1f 00 04 0f 00 03 47 00 03 1f 07 05 06 0a
+00 02 63 00 13 1f 07 05 06 0a 00 02 63 00 13 04 23 00 00 00 62 18 04 04 00
+63 32 00 00 00 32 00 42 61 73 73 20 20 20 20 20 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Pluck
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 16 06 08 0d 00 00 59 00 1b 1f 1f 1f 0f 0f 00 00 51 04 1b 1f 0d 0c 08 0a
+63 04 63 04 13 1f 1f 1f 0f 0f 00 05 63 04 1b 64 26 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 42 61 73 73 20 50 6c 75 63 6b 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Pluck
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 16 06 08 0d 00 00 59 00 1b 1f 1f 1f 0f 0f 00 00 51 04 1b 1f 0d 0c 08 0a
+63 00 63 04 13 1f 1f 1f 0f 0f 00 00 63 04 1b 64 26 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 42 61 73 73 20 50 6c 75 63 6b 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.0>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 1a 07 04 04 00 01 51 1c 1b 19 1c 09 04 09 00 00 63 00 13 1b 0c 02 04 04
+63 03 4f 10 13 1c 12 06 04 0e 0e 06 63 00 1b 33 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 30 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.0>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 1a 07 04 04 00 02 51 1c 1b 19 1c 09 04 09 00 00 63 00 13 1b 0c 02 04 04
+63 01 4f 10 13 1c 12 06 04 0e 0e 00 63 00 1b 33 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 30 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.1>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 09 06 05 00 00 01 4c 04 13 18 1f 0c 06 0f 00 01 4a 04 0b 15 18 06 08 0e
+63 03 63 04 0b 19 07 06 07 00 0e 43 62 00 13 7c 23 20 00 29 26 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 31 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.1>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 09 06 05 00 00 01 4c 04 13 18 1f 0c 06 0f 00 01 4a 04 0b 15 18 06 08 0e
+63 00 63 04 0b 19 07 06 07 00 0e 40 62 00 13 7c 23 20 00 29 26 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 31 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.2>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 06 02 05 0e 63 01 4a 0d 13 1e 09 04 08 00 63 01 4f 04 13 1a 09 0a 08 08
+63 03 4d 0d 13 19 12 06 06 0f 63 05 63 04 13 11 21 13 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 32 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.2>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 06 02 05 0e 63 01 4a 0d 13 1e 09 04 08 00 63 01 4f 04 13 1a 09 0a 08 08
+63 01 4d 0d 13 19 12 06 06 0f 63 00 63 04 13 11 21 13 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 32 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.3>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 06 01 05 0e 63 01 5a 04 16 19 0e 07 06 0f 63 01 46 04 10 18 06 08 08 0a
+63 05 41 0a 10 19 0e 07 06 0f 63 05 63 04 13 22 21 13 00 00 02 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 33 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.3>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 06 01 05 0e 63 01 5a 04 16 19 0e 07 06 0f 63 01 46 04 10 18 06 08 08 0a
+63 00 41 0a 10 19 0e 07 06 0f 63 00 63 04 13 22 21 13 00 00 02 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 33 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.4>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1a 07 07 04 00 41 3f 19 13 1f 1c 09 07 09 00 41 55 0d 13 1f 0c 02 07 04
+63 44 4e 00 13 1f 12 06 07 0e 0e 45 63 04 1b 2a 63 00 00 0f 06 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 34 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.4>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1a 07 07 04 00 41 3f 19 13 1f 1c 09 07 09 00 41 55 0d 13 1f 0c 02 07 04
+63 40 4e 00 13 1f 12 06 07 0e 0e 40 63 04 1b 2a 63 00 00 0f 06 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 34 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.5>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 16 06 08 0d 00 01 5f 04 1b 19 12 04 0a 0c 23 01 56 08 13 19 0f 06 09 0d
+63 03 63 08 13 19 0c 04 0a 0e 0e 05 63 04 13 64 26 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 35 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.5>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 16 06 08 0d 00 01 5f 04 1b 19 12 04 0a 0c 23 01 56 08 13 19 0f 06 09 0d
+63 00 63 08 13 19 0c 04 0a 0e 0e 00 63 04 13 64 26 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 35 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.6>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 06 01 05 0e 63 01 45 0a 16 1b 0d 02 05 0e 63 01 5b 04 10 1e 0a 0c 06 08
+63 02 49 0a 10 1a 0f 06 05 0e 63 05 63 04 13 23 21 13 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 36 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.6>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 06 01 05 0e 63 01 45 0a 16 1b 0d 02 05 0e 63 01 5b 04 10 1e 0a 0c 06 08
+63 00 49 0a 10 1a 0f 06 05 0e 63 00 63 04 13 23 21 13 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 3c 3c 42 61 73 73 2e 36 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.7>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 05 09 0c 0f 01 53 16 1d 1e 1b 01 09 0d 0c 01 41 04 01 1d 01 01 0c 00
+2e 04 55 04 14 1e 1c 05 09 0c 00 04 63 08 13 2a 23 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 3c 3c 42 61 73 73 2e 37 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.7>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 05 09 0c 0f 01 53 16 1d 1e 1b 01 09 0d 0c 01 41 04 01 1d 01 01 0c 00
+2e 00 55 04 14 1e 1c 05 09 0c 00 00 63 08 13 2a 23 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 3c 3c 42 61 73 73 2e 37 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.8>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 0a 09 0c 0f 02 63 04 05 12 0c 07 07 0a 0c 01 61 04 01 1d 01 01 0c 00
+2e 03 63 04 04 1e 1c 05 09 0c 00 05 63 08 03 1c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 3c 3c 42 61 73 73 2e 38 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.8>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 0a 09 0c 0f 02 63 04 05 12 0c 07 07 0a 0c 01 61 04 01 1d 01 01 0c 00
+2e 00 63 04 04 1e 1c 05 09 0c 00 00 63 08 03 1c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 3c 3c 42 61 73 73 2e 38 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.9>>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 06 09 0c 0f 01 3e 13 15 18 17 03 09 0d 0c 01 54 04 01 1d 01 03 0c 0a
+2e 03 4d 04 14 1e 1c 06 09 0c 00 05 63 04 13 1b 23 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 3c 3c 42 61 73 73 2e 39 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <<Bass.9>>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 06 09 0c 0f 01 3e 13 15 18 17 03 09 0d 0c 01 54 04 01 1d 01 03 0c 0a
+2e 00 4d 04 14 1e 1c 06 09 0c 00 00 63 04 13 1b 23 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 3c 3c 42 61 73 73 2e 39 3e 3e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass....FM
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 18 04 09 0f 00 02 4e 00 19 1f 12 12 08 0f 00 03 4b 1f 04 1f 0c 02 08 0f
+00 05 54 00 0d 1f 0c 0b 0a 0f 00 05 63 04 0a 68 23 00 19 00 32 0c 02 04 00
+63 32 00 00 00 32 00 42 61 73 73 2e 2e 2e 2e 46 4d 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass....FM
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 04 09 0f 00 02 4e 00 19 1f 12 12 08 0f 00 02 4b 1f 04 1f 0c 02 08 0f
+00 02 54 00 0d 1f 0c 0b 0a 0f 00 00 63 04 0a 68 23 00 19 00 32 0c 02 04 00
+63 32 00 00 00 32 00 42 61 73 73 2e 2e 2e 2e 46 4d 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BombBass
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 04 07 09 0e 00 07 53 0a 08 1f 05 01 0a 0e 3f 03 51 00 08 1f 06 02 09 0d
+32 03 63 00 0e 1f 1f 02 08 0f 00 07 63 04 03 3a 63 00 00 00 73 0c 04 04 00
+63 63 00 00 00 32 00 42 6f 6d 62 42 61 73 73 20 20 63 63 63 32 32 32 00 40
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: CutupBass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 12 07 08 04 00 01 56 19 0b 18 1c 09 04 09 63 01 57 1c 1c 1b 0c 09 07 0d
+00 04 3b 13 13 1f 12 06 07 0f 00 05 5f 00 03 1a 21 13 07 00 62 0c 02 04 00
+63 32 00 32 00 32 00 43 75 74 75 70 42 61 73 73 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: CutupBass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 12 07 08 04 00 01 56 19 0b 18 1c 09 04 09 63 01 57 1c 1c 1b 0c 09 07 0d
+00 01 3b 13 13 1f 12 06 07 0f 00 00 5f 00 03 1a 21 13 07 00 62 0c 02 04 00
+63 32 00 32 00 32 00 43 75 74 75 70 42 61 73 73 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Bass 1
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 27
+1f 01 00 08 04 00 03 4c 00 1b 1f 08 03 08 04 00 02 55 00 13 13 0a 05 08 04
+2b 06 3c 16 1b 1f 09 03 09 04 00 01 63 00 0b 3b 1c 00 00 00 52 0c 02 05 00
+63 4b 00 00 00 32 00 45 2e 42 61 73 73 20 20 20 31 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Bass 2
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 28
+1f 0f 10 07 0f 00 03 43 2d 03 1e 08 09 07 0f 23 02 52 00 03 1f 0b 0a 07 0f
+00 03 41 10 03 1d 0c 0a 09 0f 28 01 63 04 03 38 1e 00 00 00 52 0c 02 04 00
+28 32 00 00 00 32 00 45 2e 42 61 73 73 20 20 20 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Bass 3
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 29
+06 06 07 01 0a 06 42 56 00 1e 1f 05 06 01 0e 04 41 53 00 16 1f 05 06 01 0e
+04 40 33 08 1e 19 05 08 07 00 00 42 63 00 16 20 1a 10 14 15 46 0c 02 04 00
+28 32 00 00 00 32 00 45 2e 42 61 73 73 20 20 20 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Bass 3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+06 06 07 01 0d 06 42 56 00 1e 1f 05 06 01 0e 04 41 53 00 16 1f 05 06 01 0e
+04 40 33 08 1e 19 05 08 07 00 00 42 63 00 16 20 1a 10 14 15 46 0c 02 04 00
+28 32 00 00 00 32 00 45 2e 42 61 73 73 20 20 20 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ElecBass 1
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 9
+1f 01 00 08 04 00 03 3d 0a 1e 1f 01 00 08 00 00 00 43 00 10 1f 09 06 08 0c
+1b 07 46 1c 1e 1f 09 00 09 09 00 01 63 04 03 3a 1c 00 00 00 52 0c 04 05 00
+63 4b 00 00 00 32 00 45 6c 65 63 42 61 73 73 20 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ElecBass 2
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 12
+1f 0e 00 0f 02 31 03 4b 28 16 1f 06 00 07 02 3b 00 4d 00 06 1f 0a 00 0f 02
+3b 03 52 04 16 1f 06 00 08 02 00 02 63 00 00 3a 22 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 45 6c 65 63 42 61 73 73 20 32 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fat Lead.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 0a 07 09 0e 4d 05 54 00 03 12 1f 00 0a 0f 00 05 3e 08 03 12 1f 00 0a 0f
+4b 05 5f 08 03 12 1f 00 0a 0f 01 06 5f 04 03 3b 1e 05 0a 00 62 0c 02 04 00
+63 32 00 00 00 32 00 46 61 74 20 4c 65 61 64 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fat Lead.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 0a 07 09 0e 4d 03 54 00 03 12 1f 00 0a 0f 00 02 3e 08 03 12 1f 00 0a 0f
+4b 01 5f 08 03 12 1f 00 0a 0f 01 00 5f 04 03 3b 1e 05 0a 00 62 0c 02 04 00
+63 32 00 00 00 32 00 46 61 74 20 4c 65 61 64 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fat Lead.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 03 01 07 0d 27 04 53 13 0d 11 1f 06 05 0f 00 04 51 00 0d 16 04 00 0a 0d
+11 06 49 08 0b 16 1f 00 0a 0f 27 05 5a 00 03 62 24 00 04 00 42 0c 02 04 00
+63 63 00 00 00 32 00 46 61 74 20 4c 65 61 64 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fat Lead.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 03 01 07 0d 27 01 53 13 0d 11 1f 06 05 0f 00 01 51 00 0d 16 04 00 0a 0d
+11 00 49 08 0b 16 1f 00 0a 0f 27 00 5a 00 03 62 24 00 04 00 42 0c 02 04 00
+63 63 00 00 00 32 00 46 61 74 20 4c 65 61 64 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fat Lead.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 03 01 07 0d 27 04 3f 10 0d 11 1f 06 05 0f 00 04 56 04 0d 16 04 00 0a 0d
+11 05 4e 08 0b 16 1f 00 0a 0f 27 07 5a 04 03 61 24 00 04 00 42 0c 02 04 00
+63 63 00 00 00 32 00 46 61 74 20 4c 65 61 64 2e 33 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fat Lead.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 03 01 07 0d 27 01 3f 10 0d 11 1f 06 05 0f 00 01 56 04 0d 16 04 00 0a 0d
+11 00 4e 08 0b 16 1f 00 0a 0f 27 00 5a 04 03 61 24 00 04 00 42 0c 02 04 00
+63 63 00 00 00 32 00 46 61 74 20 4c 65 61 64 2e 33 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fat Lead.4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 03 01 07 0d 27 05 55 04 0d 11 1f 06 05 0f 00 04 63 00 0d 16 04 00 0a 0d
+11 07 4d 00 0b 16 1f 00 0a 0f 27 05 5a 00 03 63 24 26 34 00 42 0c 02 04 00
+63 63 00 00 00 32 00 46 61 74 20 4c 65 61 64 2e 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fat Lead.4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 03 01 07 0d 27 01 55 04 0d 11 1f 06 05 0f 00 02 63 00 0d 16 04 00 0a 0d
+11 01 4d 00 0b 16 1f 00 0a 0f 27 00 5a 00 03 63 24 26 34 00 42 0c 02 04 00
+63 63 00 00 00 32 00 46 61 74 20 4c 65 61 64 2e 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: filtrsweep
+** Description: a bass guitar with interesting decay
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 02 03 06 00 0e 03 54 08 1b 1f 0b 00 09 0c 00 00 4e 04 04 1f 06 00 09 01
+00 00 5f 04 03 1f 1c 04 09 0a 00 03 63 08 03 38 1e 09 04 00 62 0c 02 05 00
+63 32 00 32 00 32 00 66 69 6c 74 72 73 77 65 65 70 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FlangeBass
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 00 01 0e 00 01 52 04 04 1f 12 06 09 0e 00 02 52 04 1c 1f 0c 02 08 0e
+00 06 45 13 12 1f 12 06 09 0e 00 05 63 04 1a 12 21 13 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 46 6c 61 6e 67 65 42 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FlangeBass
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 00 01 0e 00 01 52 04 04 1f 12 06 09 0e 00 01 52 04 1c 1f 0c 02 08 0e
+00 01 45 13 12 1f 12 06 09 0e 00 00 63 04 1a 12 21 13 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 46 6c 61 6e 67 65 42 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fretless *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 08 02 07 0f 15 03 53 00 08 11 08 03 07 0f 00 00 63 00 0b 11 06 03 07 0f
+00 00 63 05 0e 11 06 03 07 0f 00 01 63 03 08 2d 17 21 09 00 52 05 02 04 00
+28 31 00 00 00 32 00 46 72 65 74 6c 65 73 73 20 2a 63 63 63 32 32 32 00 04
+00 04 00 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fretless.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+08 0c 0c 07 00 63 02 42 00 0b 1b 0d 02 08 0e 63 01 42 0a 16 1e 0d 0c 08 08
+63 04 4a 00 13 19 12 05 06 0f 63 05 60 00 13 3a 21 13 07 00 62 00 02 04 00
+63 32 00 32 00 32 00 46 72 65 74 6c 65 73 73 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fretless.1
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+08 0c 0c 07 00 63 00 42 00 0b 1b 0d 02 08 0e 63 00 42 0a 16 1e 0d 0c 08 08
+63 00 4a 00 13 19 12 05 06 0f 63 00 60 00 13 3a 21 13 07 00 62 00 02 04 00
+63 32 00 32 00 32 00 46 72 65 74 6c 65 73 73 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fretless.2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 00 01 00 00 02 40 08 1b 1b 0d 02 05 0e 63 03 46 04 16 1e 0d 0c 06 08
+63 05 3e 10 13 19 12 05 06 0f 63 07 60 0a 13 2a 21 13 07 00 62 00 02 04 00
+63 32 00 32 00 32 00 46 72 65 74 6c 65 73 73 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fretless.2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 00 01 00 00 00 40 08 1b 1b 0d 02 05 0e 63 00 46 04 16 1e 0d 0c 06 08
+63 00 3e 10 13 19 12 05 06 0f 63 00 60 0a 13 2a 21 13 07 00 62 00 02 04 00
+63 32 00 32 00 32 00 46 72 65 74 6c 65 73 73 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fretless.2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 06 00 00 00 00 00 40 08 1b 1b 0d 02 05 0e 63 00 46 04 16 1e 0d 0c 06 08
+63 00 3e 10 13 19 12 05 06 0f 63 00 60 0a 13 2a 21 13 07 00 62 00 02 04 00
+63 32 00 32 00 32 00 46 72 65 74 6c 65 73 73 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+--Bank 7
+
+** Name: FunkyBass1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 0a 09 0c 0f 01 4b 04 04 12 1f 02 07 0f 00 02 46 04 11 18 00 00 07 00
+00 05 47 0a 06 1f 13 09 0a 0c 00 05 63 04 04 2a 15 00 0b 00 00 00 02 04 00
+63 32 00 00 00 32 00 46 75 6e 6b 79 42 61 73 73 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FunkyBass1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 0a 09 0c 0f 00 4b 04 04 12 1f 02 07 0f 00 00 46 04 11 18 00 00 07 00
+00 00 47 0a 06 1f 13 09 0a 0c 00 00 63 04 04 2a 15 00 0b 00 00 00 02 04 00
+63 32 00 00 00 32 00 46 75 6e 6b 79 42 61 73 73 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FunkyBass2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 0a 09 0c 0f 00 50 08 05 12 1f 1f 07 0f 00 02 4b 04 11 12 1f 0c 07 0f
+00 05 40 0d 12 1f 13 09 0a 0c 00 04 63 04 04 32 23 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 46 75 6e 6b 79 42 61 73 73 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FunkyBass2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 0a 09 0c 0f 00 50 08 05 12 1f 1f 07 0f 00 00 4b 04 11 12 1f 0c 07 0f
+00 00 40 0d 12 1f 13 09 0a 0c 00 00 63 04 04 32 23 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 46 75 6e 6b 79 42 61 73 73 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jaco Bass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 14
+07 02 00 08 0f 00 00 43 04 03 10 0b 00 08 0c 00 00 50 00 0e 15 0b 0f 08 0b
+00 01 51 00 08 11 08 00 08 0b 00 01 63 00 03 38 19 08 06 00 62 0c 04 05 14
+63 32 00 32 00 32 00 4a 61 63 6f 20 42 61 73 73 20 63 63 63 32 32 32 00 60
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jaco Bass2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 05 08 02 00 01 46 08 03 0f 0a 00 08 0c 00 00 50 00 0e 12 0b 0f 08 0b
+00 01 51 00 08 0f 08 00 08 0b 00 01 63 00 03 09 19 08 06 00 62 0c 02 05 00
+63 32 00 32 00 00 00 4a 61 63 6f 20 42 61 73 73 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: JazzWalker
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 0a 00 08 04 00 03 46 08 1e 1f 01 00 08 00 00 00 4a 00 10 1f 11 06 08 0d
+1b 07 41 04 1e 1f 09 00 09 09 00 01 63 04 03 3b 1c 00 00 00 56 0c 04 05 00
+63 4b 00 00 00 32 00 4a 61 7a 7a 57 61 6c 6b 65 72 63 63 63 32 32 32 20 30
+30 30 30 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Kai Bass *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 13 0f 0f 00 05 63 13 13 1f 1f 00 0b 0f 00 00 44 00 10 1c 1f 0d 0f 0f
+34 07 46 1c 13 1f 14 0a 0a 0d 0d 01 63 04 0e 43 1b 00 00 00 52 0c 02 04 00
+28 63 00 00 00 32 00 4b 61 69 20 42 61 73 73 20 2a 63 63 63 32 32 32 00 00
+00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LatelyBass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 15
+1f 10 07 08 03 00 03 4f 04 03 1f 09 00 08 00 00 01 4a 00 0b 1f 11 00 08 00
+00 01 47 04 08 1f 09 00 08 00 00 00 63 00 0b 39 19 00 07 00 52 0c 02 04 00
+63 32 00 32 00 32 00 4c 61 74 65 6c 79 42 61 73 73 63 63 63 32 32 32 02 00
+00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MonophBass
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 16
+1f 01 00 08 0a 00 03 43 0a 1e 1f 01 00 08 07 00 00 46 00 10 1f 09 06 08 0f
+1b 07 4a 04 1e 1f 09 00 09 0f 00 01 63 04 03 3a 1c 00 00 00 52 0c 04 0d 00
+63 4b 00 00 00 32 00 4d 6f 6e 6f 70 68 42 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MoogerBass
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0a 07 08 03 00 06 4f 00 03 1f 09 00 08 0d 00 02 56 00 0b 1f 10 00 08 0a
+00 00 60 00 08 1f 09 00 08 0f 00 00 63 00 0e 3c 1d 00 07 00 52 0c 02 0c 00
+63 32 00 32 00 32 00 4d 6f 6f 67 65 72 42 61 73 73 63 63 63 32 32 32 02 70
+00 50 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntBass.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 03 0a 09 0d 2e 01 55 04 03 1c 10 0a 09 00 00 02 48 10 01 1c 10 0a 09 0a
+00 06 4f 04 03 1c 16 04 09 0e 00 03 62 04 04 42 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 42 61 73 73 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntBass.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 03 0a 09 0d 2e 00 55 04 03 1c 10 0a 09 00 00 00 48 10 01 1c 10 0a 09 0a
+00 00 4f 04 03 1c 16 04 09 0e 00 00 62 04 04 42 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 42 61 73 73 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntBass.2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0f 0a 07 06 2e 02 4d 16 03 1c 0f 0a 07 00 00 03 41 10 01 1c 15 0a 07 0a
+00 05 63 04 03 1c 13 0a 07 0e 00 05 62 04 04 44 2e 00 11 00 11 00 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 42 61 73 73 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntBass.2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0f 0a 07 06 2e 00 4d 16 03 1c 0f 0a 07 00 00 00 41 10 01 1c 15 0a 07 0a
+00 00 63 04 03 1c 13 0a 07 0e 00 00 62 04 04 44 2e 00 11 00 11 00 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 42 61 73 73 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Precision*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 0c 09 08 04 18 05 58 10 13 1f 1c 04 01 0d 00 00 53 00 18 18 15 0a 04 09
+00 03 4f 00 13 0f 1d 04 08 0e 14 00 63 00 1e 03 1d 00 00 00 52 0c 02 04 00
+28 53 00 00 00 32 00 50 72 65 63 69 73 69 6f 6e 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ResoMonoBs
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 07 08 03 00 03 4c 04 03 1f 09 00 08 0d 00 01 52 00 0b 1f 11 00 08 0b
+00 01 55 04 08 1f 09 00 08 0f 00 00 5e 00 0b 39 19 00 07 00 52 0c 02 0c 00
+63 32 00 32 00 32 00 52 65 73 6f 4d 6f 6e 6f 42 73 63 63 63 32 32 32 12 10
+00 10 00 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Roto Bass
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 07 04 04 00 01 5b 00 1b 1f 12 06 09 0e 00 01 49 00 1b 1f 0c 02 08 03
+63 04 58 13 13 1f 12 06 09 0e 0e 05 63 00 1b 22 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 52 6f 74 6f 20 42 61 73 73 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Roto Bass
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 07 04 04 00 01 5b 00 1b 1f 12 06 09 0e 00 01 49 00 1b 1f 0c 02 08 03
+63 01 58 13 13 1f 12 06 09 0e 0e 00 63 00 1b 22 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 52 6f 74 6f 20 42 61 73 73 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SUPER BASS
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 05 07 05 00 00 41 04 03 1f 05 05 07 0c 00 00 49 00 03 19 09 00 07 00
+00 40 47 08 00 1f 05 05 07 0c 00 00 63 00 03 39 19 00 09 00 52 0c 02 04 00
+28 32 00 00 00 32 00 53 55 50 45 52 20 42 41 53 53 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Science.BS
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 08 08 0a 0a 00 03 53 04 02 13 09 06 06 0c 00 03 57 04 03 14 02 0f 09 0d
+00 05 63 04 04 19 03 0f 0a 0e 00 05 63 08 03 3c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 53 63 69 65 6e 63 65 2e 42 53 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Science.BS
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 08 08 0a 0a 00 01 53 04 02 13 09 06 06 0c 00 01 57 04 03 14 02 0f 09 0d
+00 01 63 04 04 19 03 0f 0a 0e 00 00 63 08 03 3c 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 53 63 69 65 6e 63 65 2e 42 53 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SlapBass
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 0a 08 06 00 07 5a 18 1e 1f 01 00 08 00 00 00 48 00 10 1f 09 06 08 0c
+1b 06 4b 1c 1e 1f 09 00 09 09 00 01 63 04 03 00 1c 00 00 00 52 0c 04 05 00
+63 50 00 3c 00 32 00 53 6c 61 70 42 61 73 73 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SlapBass.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 00 0a 08 00 01 46 04 03 18 0c 1f 09 00 00 01 49 1f 13 1e 10 07 09 0c
+00 04 4c 0a 08 1e 10 07 09 0c 00 06 63 04 0b 3b 19 00 09 00 52 0c 02 04 00
+63 32 00 32 00 32 00 53 6c 61 70 42 61 73 73 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SlapBass.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 08 00 0a 08 00 01 46 04 03 18 0c 1f 09 00 00 01 49 1f 13 1e 10 07 09 0c
+00 01 4c 0a 08 1e 10 07 09 0c 00 00 63 04 0b 3b 19 00 09 00 52 0c 02 04 00
+63 32 00 32 00 32 00 53 6c 61 70 42 61 73 73 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SlapBass.2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 1c 09 09 0c 00 01 44 10 0b 16 00 00 0a 09 00 01 4b 04 13 14 0a 05 09 0f
+00 03 52 04 10 1e 10 07 09 0c 00 06 63 04 0b 2a 19 00 09 00 52 00 02 04 00
+63 32 00 32 00 32 00 53 6c 61 70 42 61 73 73 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SlapBass.2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 1c 09 09 0c 00 00 44 10 0b 16 00 00 0a 09 00 00 4b 04 13 14 0a 05 09 0f
+00 00 52 04 10 1e 10 07 09 0c 00 00 63 04 0b 2a 19 00 09 00 52 00 02 04 00
+63 32 00 32 00 32 00 53 6c 61 70 42 61 73 73 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SqncrBass
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 10
+1f 0f 0f 0e 08 00 03 4b 25 06 1f 0f 05 0b 0e 4e 03 5d 00 0b 1f 13 06 08 0b
+1c 03 60 00 10 1f 13 06 08 0e 00 04 63 04 0e 3b 1f 00 00 00 42 0c 02 04 00
+63 32 00 32 00 32 00 53 71 6e 63 72 42 61 73 73 20 63 63 63 32 32 32 03 60
+00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SqncrBass2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 0f 0e 08 00 03 42 25 06 1f 0f 05 0b 0f 39 03 61 00 0b 1f 13 06 08 0b
+1c 03 52 00 10 1f 13 06 08 0f 00 04 63 04 0e 3b 1f 00 00 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 71 6e 63 72 42 61 73 73 32 63 63 63 32 32 32 03 30
+10 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Bass 1
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank A, voice 16
+1f 03 10 06 00 34 01 49 04 15 1f 00 12 06 0f 5e 04 63 0a 0b 14 1f 17 06 0b
+3d 01 57 16 18 1f 1e 00 07 0f 00 01 5d 04 13 3a 23 00 00 00 62 00 02 04 00
+63 32 00 00 00 32 00 53 79 2e 42 61 73 73 20 20 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Bass 1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 10 06 00 34 01 49 04 15 1f 00 12 06 0f 5e 04 63 0d 0b 14 1f 17 06 0b
+3d 01 57 16 18 1f 1e 00 07 0f 00 01 5d 04 13 3a 23 00 00 00 62 00 02 04 00
+63 32 00 00 00 32 00 53 79 2e 42 61 73 73 20 20 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Bass 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 17
+1d 0e 00 06 09 00 02 51 04 0e 1f 0a 00 0a 00 00 00 61 00 01 1f 0a 00 0a 00
+00 00 61 00 06 1f 0a 00 0a 00 00 00 61 00 10 3d 1b 42 19 00 52 0c 02 04 00
+63 32 00 00 00 32 00 53 79 2e 42 61 73 73 20 20 32 63 63 63 32 32 32 00 10
+00 50 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Bass 3
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank A, voice 18
+1f 12 0c 02 07 00 02 59 10 13 1e 04 02 07 09 00 02 55 00 13 1f 0c 03 07 05
+00 02 46 00 16 1e 09 03 07 00 00 00 57 00 13 00 1f 00 00 00 62 0c 02 04 00
+28 32 00 00 00 32 00 53 79 2e 42 61 73 73 20 20 33 63 63 63 32 32 32 00 10
+00 10 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Bass 4
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank A, voice 19
+1a 0b 00 08 04 00 03 4e 00 13 1a 09 03 08 04 00 02 50 00 13 15 0b 05 08 04
+0a 05 58 00 1b 18 09 03 09 04 00 01 63 00 0b 3a 1c 00 00 00 52 0c 02 05 00
+63 4b 00 00 00 32 00 53 79 2e 42 61 73 73 20 20 34 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Bass 4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 0b 00 08 04 00 03 4e 00 13 1a 09 03 08 04 00 02 50 00 13 15 0b 05 08 04
+0d 05 58 00 1b 18 09 03 09 04 00 01 63 00 0b 3a 1c 00 00 00 52 0c 02 05 00
+63 4b 00 00 00 32 00 53 79 2e 42 61 73 73 20 20 34 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Bass 5
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank A, voice 20
+1f 12 08 02 0b 00 02 59 10 13 1e 06 02 07 09 00 04 56 00 13 1f 0c 03 07 05
+00 05 46 00 16 1e 05 03 07 09 00 02 5d 00 13 02 20 00 00 00 62 0c 02 04 00
+28 32 00 00 00 32 00 53 79 2e 42 61 73 73 20 20 35 63 63 63 32 32 32 00 10
+00 10 00 50 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Bass 6
+** Description: A clavier with bite, derived from DX11 factory preset
+** 'Sy.Bass 5'
+** Controls: KV
+** Source: Art Hitzeman
+1f 12 08 02 0b 00 02 59 10 13 1e 06 02 04 09 00 04 56 00 13 1f 0c 03 05 05
+00 05 46 00 16 1e 05 03 05 09 00 02 5d 00 13 02 20 00 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 42 61 73 73 20 20 36 63 63 63 32 32 32 00 10
+00 10 00 50 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Bass 7
+** Description: a milder version of Sy. Bass 6
+** Controls: KV
+** Source: Art Hitzeman
+1f 12 08 02 0b 00 02 46 1f 13 1e 06 02 04 09 00 04 56 00 13 1f 0c 03 05 05
+00 05 46 00 16 1e 05 03 05 09 00 02 5d 00 13 02 20 00 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 42 61 73 73 20 20 37 63 63 63 32 32 32 00 10
+00 10 00 50 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynFunkBas
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 11
+1f 0f 0f 0e 09 00 03 46 1d 16 1f 0f 05 0e 0e 0d 03 63 00 0b 1f 13 06 05 0d
+1c 03 63 00 00 1f 13 06 08 0f 00 04 63 04 06 3b 1f 00 00 00 42 0c 04 04 00
+63 32 00 32 00 32 00 53 79 6e 46 75 6e 6b 42 61 73 63 63 63 32 32 32 0d 6c
+00 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynFunkBs2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 19 08 06 00 03 3c 1d 16 1f 0f 05 07 0e 1a 03 63 00 0b 1f 13 06 05 0d
+2a 03 54 00 08 1f 13 06 08 0f 00 04 63 04 06 3b 1f 00 00 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 79 6e 46 75 6e 6b 42 73 32 63 63 63 32 32 32 0c 1c
+00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: TeknoBass*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 1e 13 05 0e 2d 03 53 2f 00 15 0b 09 05 0e 0a 02 55 00 06 19 1e 09 08 0e
+17 00 4a 08 00 15 02 07 06 0e 10 01 63 00 0b 02 23 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 54 65 6b 6e 6f 42 61 73 73 2a 63 63 63 32 32 32 00 04
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wood Bass
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 30
+17 15 0c 09 0b 2c 02 63 04 0b 1f 11 0b 04 0f 27 01 47 04 0b 1c 11 0b 02 0f
+31 01 4b 0a 0b 1a 15 0a 08 0f 00 01 63 04 0b 10 1f 00 00 00 52 00 02 04 00
+28 32 00 00 00 32 00 57 6f 6f 64 20 42 61 73 73 20 63 63 63 32 32 32 02 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WoodBass2
+** Description: A modified version of the DX11 factory preset 'Wood Bass'
+** Controls: KV
+** Source: Art Hitzeman
+17 15 0c 09 0b 2c 02 63 04 0b 1f 11 0b 04 0f 27 01 47 04 0b 1c 11 0b 02 0f
+31 01 4b 0a 0b 1a 15 0a 05 0f 00 01 63 04 0b 10 1f 00 00 00 52 0c 02 04 00
+28 32 00 00 00 32 00 57 6f 6f 64 42 61 73 73 32 20 63 63 63 32 32 32 02 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Cello
+
+
+** Name: BowCello
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 18
+1c 09 00 06 0e 35 00 50 04 00 0d 0a 00 06 0e 09 01 52 04 09 12 0b 00 08 09
+2c 02 49 10 0e 0c 0a 00 06 0f 00 01 63 04 0b 2a 1a 07 13 00 52 0c 04 04 00
+63 32 00 00 00 32 00 42 6f 77 43 65 6c 6c 6f 20 20 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BoxCello
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 19
+1c 04 00 06 0e 0f 00 48 04 06 15 09 03 04 0d 15 01 3a 08 00 11 10 00 0b 09
+0c 02 51 16 06 0b 0a 00 05 0f 05 01 63 08 13 32 1d 06 0f 00 52 0c 04 04 00
+63 32 00 00 00 32 00 42 6f 78 43 65 6c 6c 6f 20 20 63 63 63 32 32 32 00 10
+00 40 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BoxCello2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 04 00 06 0e 0f 00 48 04 06 0f 12 01 04 0d 15 01 3a 08 00 11 10 00 0b 09
+0c 02 51 16 06 0b 0a 00 05 0f 05 01 63 08 13 32 1d 06 0f 00 52 0c 04 04 00
+63 32 00 00 00 32 00 42 6f 78 43 65 6c 6c 6f 32 20 63 63 63 32 32 32 00 10
+00 40 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cello *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 05 0f 4d 00 48 08 0b 10 19 00 03 0e 2b 00 61 08 0b 0c 09 00 05 0d
+00 01 63 08 15 0c 05 00 06 0e 4d 01 5c 13 12 3c 1f 19 15 00 32 00 02 04 00
+28 63 00 00 00 32 00 43 65 6c 6c 6f 20 20 20 20 2a 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cello 1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 7
+16 07 00 06 0f 00 41 4c 00 0b 15 0b 00 03 0e 00 02 35 00 0b 19 08 00 08 0c
+10 05 5f 08 14 0e 0b 00 07 0e 00 02 63 00 0c 3a 1f 12 10 00 52 18 02 05 00
+63 28 50 32 00 32 00 43 65 6c 6c 6f 20 20 20 20 31 63 56 63 30 32 32 00 30
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cello 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 8
+1d 08 00 05 0a 12 01 4e 04 06 17 0c 00 05 0f 00 00 42 04 00 1e 0e 00 05 0f
+25 01 3e 10 00 0a 06 00 07 0f 00 02 63 04 06 32 1d 16 2c 00 32 0c 02 04 00
+63 32 00 00 00 32 00 43 65 6c 6c 6f 20 20 20 20 32 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cello 2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 08 00 05 0d 12 01 4e 04 06 17 0c 00 05 0f 00 00 42 04 00 1e 0e 00 05 0f
+25 01 3e 10 00 0d 06 00 07 0f 00 02 63 04 06 32 1d 16 2c 00 32 0c 02 04 00
+63 32 00 00 00 32 00 43 65 6c 6c 6f 20 20 20 20 32 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cello....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 15 0a 08 0d 19 02 4c 19 0c 15 10 07 07 0c 19 01 5d 04 03 11 15 06 08 0f
+3c 04 50 0a 0b 0c 09 04 06 0c 00 04 63 04 0a 5b 1b 1b 20 00 32 00 04 04 00
+63 01 63 00 00 32 00 43 65 6c 6c 6f 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cello....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 15 0a 08 0d 19 02 4c 2a 0c 1f 17 0a 07 0d 19 01 5d 04 03 10 15 0a 08 0d
+3c 01 58 0a 0b 0f 09 07 06 0d 00 00 63 04 0a 5b 22 00 14 00 32 00 04 04 00
+63 01 63 00 00 32 00 43 65 6c 6c 6f 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cello....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 09 04 03 0e 02 01 53 00 12 1e 04 10 05 08 52 01 49 00 0a 14 1f 0b 05 03
+52 05 63 00 0c 0b 03 1f 06 02 10 05 60 00 0c 32 1c 2e 1e 00 42 18 0c 04 00
+63 32 32 00 00 32 00 43 65 6c 6c 6f 2e 2e 2e 2e 32 63 63 63 32 32 32 00 10
+00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cello....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 09 04 03 0e 02 01 53 00 12 1e 04 10 05 08 52 01 49 00 0a 14 1f 0b 05 03
+52 01 63 00 0c 0c 03 1f 06 02 10 00 60 00 0c 32 1c 2e 1e 00 42 18 0c 04 00
+63 32 32 00 00 32 00 43 65 6c 6c 6f 2e 2e 2e 2e 32 63 63 63 32 32 32 00 10
+00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY DoubleBass
+
+
+** Name: ArcoBass *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 15 00 06 0d 13 01 56 04 08 1e 05 00 06 0e 33 02 63 04 0e 0f 09 00 06 0f
+00 01 63 04 06 0d 08 00 05 0e 00 05 63 04 08 3c 1e 17 0f 00 42 0c 02 04 00
+28 63 00 00 00 32 00 41 72 63 6f 42 61 73 73 20 2a 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassBeast
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 09 03 05 0a 22 02 63 00 04 0b 05 04 03 0f 00 02 4a 08 02 03 08 03 05 08
+38 42 5a 0d 0e 10 05 03 06 0d 00 00 61 00 01 62 1c 06 04 06 4e 18 02 04 00
+63 32 00 00 00 32 00 42 61 73 73 42 65 61 73 74 20 63 63 63 32 32 32 07 00
+11 50 00 30 01 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassPluck2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 16 06 08 0d 00 01 40 08 1b 15 16 06 08 0d 00 01 51 00 1b 1f 0d 0c 08 0a
+63 06 63 00 13 1f 0d 0c 08 0a 63 05 63 00 13 54 26 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 42 61 73 73 50 6c 75 63 6b 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassPluck2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 16 06 08 0d 00 00 40 08 1b 15 16 06 08 0d 00 00 51 00 1b 1f 0d 0c 08 0a
+63 00 63 00 13 1f 0d 0c 08 0a 63 00 63 00 13 54 26 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 42 61 73 73 50 6c 75 63 6b 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DoubleBass
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 17
+1c 02 00 04 0e 63 00 4e 04 03 0d 05 00 06 0e 63 01 56 0a 08 12 07 00 06 09
+63 02 47 1b 0e 0a 0a 00 05 0f 00 01 63 04 0b 32 1a 08 0d 00 52 0c 04 04 00
+63 32 00 00 00 32 00 44 6f 75 62 6c 65 42 61 73 73 63 63 63 32 32 32 00 10
+00 00 00 03 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 8
+
+* SUBCATEGORY Guitar
+
+
+** Name: 12 String1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0f 09 03 0c 39 02 4f 22 1c 0d 0f 09 02 0c 00 43 3c 0d 0a 16 1f 07 06 0f
+0a 45 58 08 08 1c 07 06 06 0c 00 46 5f 08 0e 0c 22 21 00 00 36 0c 00 04 00
+63 63 00 00 00 32 00 31 32 20 53 74 72 69 6e 67 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: 12 String1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0f 09 03 0c 39 01 4f 22 1c 0d 0f 09 02 0c 00 41 3c 0d 0a 16 1f 07 06 0f
+0a 40 58 08 08 1c 07 06 06 0c 00 40 5f 08 0e 0c 22 21 00 00 36 0c 00 04 00
+63 63 00 00 00 32 00 31 32 20 53 74 72 69 6e 67 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: 12 String2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 09 04 03 0c 2b 42 51 24 1c 1a 04 01 0d 0b 00 42 53 04 1a 1b 09 06 0e 0c
+0a 45 4e 04 10 1c 07 03 07 0e 00 44 63 04 16 14 23 46 00 01 3a 18 00 04 00
+63 63 00 00 00 32 00 31 32 20 53 74 72 69 6e 67 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: 12 String2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 09 04 03 0c 2b 41 51 24 1c 1a 04 01 0d 0b 00 41 53 04 1a 1b 09 06 0e 0c
+0a 40 4e 04 10 1c 07 03 07 0e 00 40 63 04 16 14 23 46 00 01 3a 18 00 04 00
+63 63 00 00 00 32 00 31 32 20 53 74 72 69 6e 67 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: 5th Lead.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 06 07 09 06 0f 03 58 08 0a 19 09 07 09 06 0c 05 61 0a 0d 19 0c 07 09 06
+2e 05 63 08 03 1f 15 07 09 0d 00 06 63 0a 02 2c 1e 17 00 00 22 0c 02 04 00
+63 32 00 00 00 32 00 35 74 68 20 4c 65 61 64 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: 5th Lead.1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 06 07 09 06 0f 01 58 08 0a 19 09 07 09 06 0c 01 61 0a 0d 19 0c 07 09 06
+2e 00 63 08 03 1f 15 07 09 0d 00 00 63 0a 02 2c 1e 17 00 00 22 0c 02 04 00
+63 32 00 00 00 32 00 35 74 68 20 4c 65 61 64 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: 5th Lead.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 00 09 0c 20 03 4c 08 0a 1f 09 09 09 0c 00 05 51 0a 05 1f 1f 00 09 0f
+40 05 63 08 03 1f 09 09 09 0c 00 05 63 0a 02 2c 1e 17 00 00 22 18 02 04 00
+63 32 00 00 00 32 00 35 74 68 20 4c 65 61 64 2e 32 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: 5th Lead.2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 00 09 0c 20 01 4c 08 0a 1f 09 09 09 0c 00 01 51 0a 05 1f 1f 00 09 0f
+40 00 63 08 03 1f 09 09 09 0c 00 00 63 0a 02 2c 1e 17 00 00 22 18 02 04 00
+63 32 00 00 00 32 00 35 74 68 20 4c 65 61 64 2e 32 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Guitar1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 05 04 03 0e 23 03 45 08 13 1f 0c 08 05 0f 43 05 42 04 03 1f 08 11 06 0f
+00 05 40 0a 03 1b 15 06 06 0e 23 04 63 08 13 31 23 00 00 00 52 0c 04 04 00
+63 32 00 00 00 32 00 41 43 20 47 75 69 74 61 72 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Guitar1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+17 05 04 03 0e 23 01 45 08 13 1f 0c 08 05 0f 43 01 42 04 03 1f 08 11 06 0f
+00 01 40 0a 03 1b 15 06 06 0e 23 00 63 08 13 31 23 00 00 00 52 0c 04 04 00
+63 32 00 00 00 32 00 41 43 20 47 75 69 74 61 72 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Guitar2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0e 04 03 0e 23 02 4b 0a 13 1f 1f 08 05 0f 43 03 42 04 03 1f 15 11 06 0f
+00 04 35 0a 03 1f 1f 06 0a 0e 00 03 63 04 0b 38 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 41 43 20 47 75 69 74 61 72 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Guitar2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 04 03 0e 23 01 4b 0a 13 1f 1f 08 05 0f 43 01 42 04 03 1f 15 11 06 0f
+00 00 35 0a 03 1f 1f 06 0a 0e 00 00 63 04 0b 38 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 41 43 20 47 75 69 74 61 72 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Guitar3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0e 00 0f 0f 23 03 4c 04 1b 1f 1f 00 0b 0f 43 03 51 0a 13 1f 1a 06 0d 0d
+00 04 63 04 03 1f 1f 08 0e 0f 00 04 57 08 0b 24 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 41 43 20 47 75 69 74 61 72 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Guitar3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 00 0f 0f 23 02 4c 04 1b 1f 1f 00 0b 0f 43 01 51 0a 13 1f 1a 06 0d 0d
+00 01 63 04 03 1f 1f 08 0e 0f 00 00 57 08 0b 24 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 41 43 20 47 75 69 74 61 72 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Guitar4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0f 0c 04 0f 23 41 53 04 13 1a 15 06 0b 0f 2b 41 4f 04 13 1d 0a 09 06 0f
+00 45 63 04 13 1c 04 04 0e 0f 00 45 63 04 0b 34 22 33 00 01 36 0c 04 04 00
+63 32 00 00 00 32 00 41 43 20 47 75 69 74 61 72 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Guitar4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0f 0c 04 0f 23 41 53 04 13 1a 15 06 0b 0f 2b 41 4f 04 13 1d 0a 09 06 0f
+00 40 63 04 13 1c 04 04 0e 0f 00 40 63 04 0b 34 22 33 00 01 36 0c 04 04 00
+63 32 00 00 00 32 00 41 43 20 47 75 69 74 61 72 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AllThatJaz
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 5
+1f 09 00 06 0c 27 04 48 1c 0b 1c 06 00 04 07 37 01 43 0a 00 1f 0a 00 02 06
+3d 00 45 0a 0e 1f 12 08 08 0f 00 05 63 04 0b 38 1f 00 03 00 52 0c 03 04 00
+63 32 01 32 00 32 00 41 6c 6c 54 68 61 74 4a 61 7a 63 63 63 32 32 32 00 30
+00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: A.Guitar
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 8
+1f 1f 06 06 0a 28 03 4b 04 0a 1c 0a 07 07 0a 28 02 3d 0a 0a 1f 0b 07 07 0b
+28 02 45 1f 0b 1b 0c 08 09 0a 00 02 62 04 0c 3a 1e 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 41 2e 47 75 69 74 61 72 20 20 63 63 63 32 32 32 00 00
+00 20 00 40 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: A.Guitar
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 06 06 0d 28 03 4b 04 0a 1c 0a 07 07 0d 28 02 3d 0d 0a 1f 0b 07 07 0b
+28 02 45 1f 0b 1b 0c 08 09 0d 00 02 62 04 0c 3a 1e 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 41 2e 47 75 69 74 61 72 20 20 63 63 63 32 32 32 00 00
+00 20 00 40 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Guitar
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 11
+1f 1f 04 03 0f 0c 01 46 0a 16 1f 1f 03 03 0f 08 00 56 04 0a 1f 1f 04 03 0f
+08 01 53 00 04 18 1f 05 0b 0f 00 02 55 04 00 3a 23 1c 08 00 42 18 02 04 00
+28 63 00 00 00 32 00 45 2e 47 75 69 74 61 72 20 20 63 63 63 32 32 32 00 00
+00 20 00 60 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Guitar
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 04 03 0f 0c 01 46 0d 16 1f 1f 03 03 0f 08 00 56 04 0a 1f 1f 04 03 0f
+08 01 53 00 04 18 1f 05 0b 0f 00 02 55 04 00 3a 23 1c 08 00 42 18 02 04 00
+28 63 00 00 00 32 00 45 2e 47 75 69 74 61 72 20 20 63 63 63 32 32 32 00 00
+00 20 00 60 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Echo Lead
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 09 03 0d 00 06 57 08 0e 1f 16 00 05 0e 00 05 63 04 03 1f 16 00 08 0e
+00 05 63 04 0b 1f 16 00 05 0e 00 05 63 04 03 75 25 00 00 00 32 18 04 04 00
+63 01 63 00 00 32 00 45 63 68 6f 20 4c 65 61 64 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Echo Lead
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 09 03 0d 00 02 57 08 0e 1f 16 00 05 0e 00 00 63 04 03 1f 16 00 08 0e
+00 00 63 04 0b 1f 16 00 05 0e 00 00 63 04 03 75 25 00 00 00 32 18 04 04 00
+63 01 63 00 00 32 00 45 63 68 6f 20 4c 65 61 64 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: F.Guitar
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 9
+1f 1f 05 06 0f 28 03 4f 04 0a 1a 09 07 07 0a 28 02 49 0a 0a 1f 0b 04 07 0b
+28 02 45 1f 0b 1a 0c 06 08 0a 00 02 62 04 0c 3a 1e 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 46 2e 47 75 69 74 61 72 20 20 63 63 63 32 32 32 00 00
+00 10 00 70 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: F.Guitar
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 05 06 0f 28 03 4f 04 0a 1a 09 07 07 0d 28 02 49 0d 0a 1f 0b 04 07 0b
+28 02 45 1f 0b 1a 0c 06 08 0d 00 02 62 04 0c 3a 1e 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 46 2e 47 75 69 74 61 72 20 20 63 63 63 32 32 32 00 00
+00 10 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flamenco
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 7
+18 0b 0a 07 0a 28 02 52 0a 0b 1f 12 00 05 0f 07 02 40 04 0b 17 0f 0e 06 09
+11 06 52 0a 0b 17 13 09 08 0e 00 01 63 04 0b 31 1e 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 46 6c 61 6d 65 6e 63 6f 20 20 63 63 63 32 32 32 00 30
+00 00 00 10 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flamenco
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 0b 0a 07 0d 28 02 52 0a 0b 1f 12 00 05 0f 07 02 40 04 0b 17 0f 0e 06 09
+11 06 52 0a 0b 17 13 09 08 0e 00 01 63 04 0b 31 1e 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 46 6c 61 6d 65 6e 63 6f 20 20 63 63 63 32 32 32 00 30
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Funkfifth*
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 00 06 0c 00 00 4a 04 00 1f 0a 00 02 0b 00 00 58 04 06 1b 1f 00 09 0f
+00 00 63 04 06 1b 1e 00 09 0f 11 00 54 04 00 3c 23 00 00 00 42 0c 02 04 00
+28 63 00 00 00 32 00 46 75 6e 6b 66 69 66 74 68 2a 63 63 63 32 32 32 00 00
+00 78 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Funky Pick
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 4
+1f 19 08 0a 03 00 03 63 10 18 1f 0c 05 0b 05 00 03 52 00 0b 1f 19 06 0b 05
+00 03 63 0a 16 1f 0f 11 09 07 00 04 63 04 03 3a 14 00 00 00 42 18 02 04 00
+63 32 00 32 00 32 00 46 75 6e 6b 79 20 50 69 63 6b 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FuzzyLead
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 05 06 07 0d 00 43 63 00 08 1c 0a 04 03 0c 00 44 58 04 10 1f 0c 02 07 0d
+00 45 62 00 16 1d 0a 06 07 0d 15 46 63 04 16 2c 23 00 00 01 06 0c 02 04 00
+28 02 00 00 00 32 00 46 75 7a 7a 79 4c 65 61 64 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FuzzyLead
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 06 07 0d 00 42 63 00 08 1c 0a 04 03 0c 00 41 58 04 10 1f 0c 02 07 0d
+00 40 62 00 16 1d 0a 06 07 0d 15 40 63 04 16 2c 23 00 00 01 06 0c 02 04 00
+28 02 00 00 00 32 00 46 75 7a 7a 79 4c 65 61 64 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Guitar
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 1f 0b 06 0a 63 03 37 08 0a 1a 0b 04 05 07 3c 01 43 0a 0a 1a 0b 04 05 07
+00 01 32 1d 08 1f 0b 0b 06 0b 1e 02 63 04 0c 32 19 00 00 00 32 0c 02 04 00
+28 63 00 00 00 32 00 47 75 69 74 61 72 20 20 20 20 63 63 63 32 32 32 00 00
+00 30 00 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Guitar #1
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 2
+1f 0e 0e 0f 0f 00 03 48 2d 06 1f 0f 04 0f 0f 25 03 5b 00 00 1f 12 06 0c 0e
+1c 03 55 00 10 1f 13 07 08 0e 06 04 62 04 0e 3b 14 00 00 00 42 18 02 04 00
+63 32 00 32 00 32 00 47 75 69 74 61 72 20 23 31 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HardHabits
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 04 0c 08 00 2f 3c 4b 04 0b 1c 15 06 08 0c 00 1f 52 24 13 1c 04 00 08 0c
+1e 1c 63 04 0b 1c 07 07 08 0b 00 3f 63 04 0b 04 22 21 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 48 61 72 64 48 61 62 69 74 73 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HardHabits
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 04 0c 08 00 2f 39 4b 04 0b 1c 15 06 08 0c 00 1a 52 24 13 1c 04 00 08 0c
+1e 18 63 04 0b 1c 07 07 08 0b 00 38 63 04 0b 04 22 21 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 48 61 72 64 48 61 62 69 74 73 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HawaiiGitr
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 00 06 00 27 02 38 22 0b 13 06 00 08 00 37 02 3b 0a 03 13 0a 00 09 00
+3d 02 45 0a 0e 13 12 08 08 0f 00 03 61 04 0b 32 1f 00 03 00 52 0c 03 04 00
+63 32 01 32 00 32 00 48 61 77 61 69 69 47 69 74 72 63 63 63 32 32 32 00 10
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HeavyLead
+** Controls: MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 25
+11 06 08 0f 0a 2f 00 4d 04 03 1f 1f 00 0f 0f 00 00 50 00 03 1f 0c 00 0f 0d
+00 00 4e 00 03 1f 1f 00 0f 0f 00 00 5a 00 03 30 20 27 06 00 62 18 07 04 00
+63 32 00 00 00 32 00 48 65 61 76 79 4c 65 61 64 20 63 63 63 32 32 32 00 00
+00 10 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HeavyMetal
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 6
+1f 08 00 03 0f 20 01 58 00 06 1f 03 00 02 0f 1b 01 4c 0d 02 15 05 04 03 0f
+1b 00 5b 0a 05 1f 0f 00 08 0f 00 00 5c 04 03 3a 1f 16 05 00 62 18 07 04 00
+63 32 00 00 00 32 00 48 65 61 76 79 4d 65 74 61 6c 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HollowLead
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 1f 00 07 0f 00 04 47 08 06 12 0c 06 09 0f 00 04 5a 04 0e 14 1f 00 09 0f
+00 05 62 04 06 18 1f 00 0d 0f 00 05 56 04 03 74 29 00 00 00 22 18 05 04 00
+63 63 63 00 00 32 00 48 6f 6c 6c 6f 77 4c 65 61 64 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HollowLead
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 1f 00 07 0f 00 01 47 08 06 12 0c 06 09 0f 00 01 5a 04 0e 14 1f 00 09 0f
+00 00 62 04 06 18 1f 00 0d 0f 00 00 56 04 03 74 29 00 00 00 22 18 05 04 00
+63 63 63 00 00 32 00 48 6f 6c 6c 6f 77 4c 65 61 64 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Guit1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 09 07 07 0b 55 43 5f 0a 13 1b 09 07 07 0b 63 45 5b 0a 0b 18 09 07 07 0d
+63 45 63 04 1b 16 09 07 07 09 0a 46 5f 04 03 04 19 00 01 03 16 18 00 04 00
+63 63 00 00 00 32 00 4a 61 7a 7a 20 47 75 69 74 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Guit1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 09 07 07 0b 55 41 5f 0a 13 1b 09 07 07 0b 63 42 5b 0a 0b 18 09 07 07 0d
+63 40 63 04 1b 16 09 07 07 09 0a 40 5f 04 03 04 19 00 01 03 16 18 00 04 00
+63 63 00 00 00 32 00 4a 61 7a 7a 20 47 75 69 74 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Guit2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 11 1f 0f 00 2e 03 60 31 03 1c 07 0c 09 0e 00 03 4a 08 0b 17 1a 07 07 0d
+4f 05 51 04 00 16 1a 09 09 0e 00 04 63 04 0b 04 23 00 05 00 22 0c 03 04 00
+63 63 00 00 00 32 00 4a 61 7a 7a 20 47 75 69 74 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Guit2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 11 1f 0f 00 2e 02 60 31 03 1c 07 0c 09 0e 00 01 4a 08 0b 17 1a 07 07 0d
+4f 00 51 04 00 16 1a 09 09 0e 00 00 63 04 0b 04 23 00 05 00 22 0c 03 04 00
+63 63 00 00 00 32 00 4a 61 7a 7a 20 47 75 69 74 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Guit3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 19 08 0f 0d 2e 04 5e 2a 1b 1b 11 0c 09 0c 00 03 48 08 0b 18 19 07 07 0d
+4f 04 51 04 00 16 19 09 09 0e 00 06 63 04 0b 04 23 00 05 00 22 0c 03 04 00
+63 63 00 00 00 32 00 4a 61 7a 7a 20 47 75 69 74 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Guit3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 19 08 0f 0d 2e 01 5e 2a 1b 1b 11 0c 09 0c 00 01 48 08 0b 18 19 07 07 0d
+4f 00 51 04 00 16 19 09 09 0e 00 00 63 04 0b 04 23 00 05 00 22 0c 03 04 00
+63 63 00 00 00 32 00 4a 61 7a 7a 20 47 75 69 74 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Guit4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 1f 0f 00 63 44 5b 2a 03 1b 09 07 07 0b 49 45 5c 0a 0b 18 09 07 07 0d
+2d 44 63 0a 1b 16 09 07 07 09 0a 46 5f 04 03 3c 23 00 01 04 3a 18 00 04 00
+63 63 00 00 00 32 00 4a 61 7a 7a 20 47 75 69 74 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Guit4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 1f 0f 00 63 42 5b 2a 03 1b 09 07 07 0b 49 42 5c 0a 0b 18 09 07 07 0d
+2d 40 63 0a 1b 16 09 07 07 09 0a 40 5f 04 03 3c 23 00 01 04 3a 18 00 04 00
+63 63 00 00 00 32 00 4a 61 7a 7a 20 47 75 69 74 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: JonesLead
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0a 04 07 0f 00 03 53 04 13 1b 0a 04 07 0c 00 04 4b 10 13 1b 18 06 07 0f
+00 06 62 04 12 1b 18 06 07 0f 00 05 63 04 13 7c 2d 00 00 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4a 6f 6e 65 73 4c 65 61 64 20 63 63 63 32 32 32 00 00
+00 40 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: JonesLead
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0a 04 07 0f 00 01 53 04 13 1b 0a 04 07 0c 00 01 4b 10 13 1b 18 06 07 0f
+00 00 62 04 12 1b 18 06 07 0f 00 00 63 04 13 7c 2d 00 00 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4a 6f 6e 65 73 4c 65 61 64 20 63 63 63 32 32 32 00 00
+00 40 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: KickLead
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 0f 07 07 0e 19 04 52 04 10 0d 01 06 08 0c 19 06 58 04 10 1f 15 07 07 0e
+00 05 63 04 08 0e 03 02 06 0e 00 46 63 04 0e 3c 0f 1d 23 3d 26 0c 04 05 00
+28 32 00 00 00 32 00 4b 69 63 6b 4c 65 61 64 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: KickLead
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 0f 07 07 0e 19 01 52 04 10 0d 01 06 08 0c 19 01 58 04 10 1f 15 07 07 0e
+00 00 63 04 08 0e 03 02 06 0e 00 40 63 04 0e 3c 0f 1d 23 3d 26 0c 04 05 00
+28 32 00 00 00 32 00 4b 69 63 6b 4c 65 61 64 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mute Gtr
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 12
+1f 14 1f 03 0e 0a 02 4e 13 0b 1f 16 0a 08 0e 1e 00 52 04 1b 1f 10 09 09 0e
+00 01 63 04 1b 1f 11 09 08 0e 00 01 63 04 1b 7c 1c 00 16 00 32 0c 02 04 00
+28 32 00 00 00 32 00 4d 75 74 65 20 47 74 72 20 20 63 63 63 32 32 32 00 50
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mute Gtr
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 14 1f 03 0e 0d 02 4e 13 0b 1f 16 0d 08 0e 1e 00 52 04 1b 1f 10 09 09 0e
+00 01 63 04 1b 1f 11 09 08 0e 00 01 63 04 1b 7c 1c 00 16 00 32 0c 02 04 00
+28 32 00 00 00 32 00 4d 75 74 65 20 47 74 72 20 20 63 63 63 32 32 32 00 50
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: NastyLead1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 0d 09 08 0f 00 04 61 04 08 0f 04 11 08 0c 00 04 5f 04 09 1f 15 08 08 0f
+00 05 63 04 08 0f 15 06 08 0c 00 05 63 04 0e 6c 23 00 00 00 02 18 05 04 00
+63 63 63 00 00 32 00 4e 61 73 74 79 4c 65 61 64 31 63 63 63 32 32 32 00 00
+00 40 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: NastyLead1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 0d 09 08 0f 00 02 61 04 08 0f 04 11 08 0c 00 01 5f 04 09 1f 15 08 08 0f
+00 00 63 04 08 0f 15 06 08 0c 00 00 63 04 0e 6c 23 00 00 00 02 18 05 04 00
+63 63 63 00 00 32 00 4e 61 73 74 79 4c 65 61 64 31 63 63 63 32 32 32 00 00
+00 40 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: NastyLead2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 0d 09 08 0f 00 04 62 08 00 0f 0e 05 08 07 00 05 62 04 01 1f 15 08 08 0f
+00 05 63 08 00 0f 16 06 08 0e 00 05 63 10 06 6c 26 00 03 00 42 18 05 04 00
+63 63 63 00 00 32 00 4e 61 73 74 79 4c 65 61 64 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: NastyLead2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 0d 09 08 0f 00 02 62 08 00 0f 0e 05 08 07 00 02 62 04 01 1f 15 08 08 0f
+00 00 63 08 00 0f 16 06 08 0e 00 00 63 10 06 6c 26 00 03 00 42 18 05 04 00
+63 63 63 00 00 32 00 4e 61 73 74 79 4c 65 61 64 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Nuln Guit3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0a 04 0c 09 63 01 48 1f 0b 19 1e 09 09 09 00 03 51 0d 1c 1d 0a 04 0c 03
+00 05 5d 0d 1b 15 03 06 09 0f 0a 05 5c 04 0b 3c 23 00 1b 00 22 00 04 04 00
+63 32 00 00 00 32 00 4e 75 6c 6e 20 47 75 69 74 33 63 63 63 32 32 32 00 00
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Nuln Guit3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0a 04 0c 09 63 01 48 1f 0b 19 1e 09 09 09 00 01 51 0d 1c 1d 0a 04 0c 03
+00 00 5d 0d 1b 15 03 06 09 0f 0a 00 5c 04 0b 3c 23 00 1b 00 22 00 04 04 00
+63 32 00 00 00 32 00 4e 75 6c 6e 20 47 75 69 74 33 63 63 63 32 32 32 00 00
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Nyln Guit1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0f 0c 06 0b 23 02 4a 1c 13 14 15 03 07 0f 27 02 4a 04 13 15 0a 09 06 0f
+00 04 43 16 03 18 04 04 06 0e 00 04 63 04 0b 3c 23 00 1b 00 22 0c 04 04 00
+63 32 00 00 00 32 00 4e 79 6c 6e 20 47 75 69 74 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Nyln Guit1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0f 0c 06 0b 23 02 4a 1c 13 14 15 03 07 0f 27 01 4a 04 13 15 0a 09 06 0f
+00 00 43 16 03 18 04 04 06 0e 00 00 63 04 0b 3c 23 00 1b 00 22 0c 04 04 00
+63 32 00 00 00 32 00 4e 79 6c 6e 20 47 75 69 74 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Nyln Guit2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0f 0c 06 05 23 02 4f 10 13 1c 1e 03 07 04 00 05 42 3f 14 1f 19 03 07 04
+00 05 60 04 1b 18 04 03 07 04 00 04 5f 04 0b 21 23 00 1b 00 22 0c 04 04 00
+63 32 00 00 00 32 00 4e 79 6c 6e 20 47 75 69 74 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Nyln Guit2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0f 0c 06 05 23 02 4f 10 13 1c 1e 03 07 04 00 01 42 3f 14 1f 19 03 07 04
+00 01 60 04 1b 18 04 03 07 04 00 00 5f 04 0b 21 23 00 1b 00 22 0c 04 04 00
+63 32 00 00 00 32 00 4e 79 6c 6e 20 47 75 69 74 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Nylon *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 08 04 0b 2f 03 4d 0d 13 1c 1f 03 05 0f 2c 02 36 03 09 1b 05 07 04 0a
+29 04 4c 0d 16 15 13 08 05 0e 11 03 63 04 0a 3b 1f 00 00 00 32 11 02 04 00
+28 63 00 00 00 32 00 4e 79 6c 6f 6e 20 20 20 20 2a 63 63 63 32 32 32 00 08
+00 06 00 08 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: NylonGuit
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 1
+1f 09 00 06 00 27 02 51 19 0b 1c 06 00 08 00 37 02 47 0a 03 1f 0a 00 09 00
+3d 02 4d 0a 0e 1f 12 08 08 0f 00 03 61 04 0b 28 1f 00 03 00 52 0c 03 04 00
+63 32 01 32 00 32 00 4e 79 6c 6f 6e 47 75 69 74 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntGuitar
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0c 07 0a 0d 63 02 50 19 1b 1b 0c 07 0a 0d 63 02 4f 00 1b 1b 12 07 0a 0d
+00 05 5b 1f 13 1b 12 07 0a 0d 00 05 62 08 15 04 23 00 00 00 62 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 47 75 69 74 61 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntGuitar
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0c 07 0a 0d 63 00 50 19 1b 1b 0c 07 0a 0d 63 00 4f 00 1b 1b 12 07 0a 0d
+00 00 5b 1f 13 1b 12 07 0a 0d 00 00 62 08 15 04 23 00 00 00 62 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 47 75 69 74 61 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ped Stl..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 0f 09 06 0e 39 02 51 04 06 1c 09 0a 08 0e 00 03 59 0a 01 1f 09 09 08 0f
+00 01 63 08 05 18 0c 09 07 0f 00 04 63 04 02 76 22 00 00 00 22 18 03 04 00
+63 63 00 00 00 32 00 50 65 64 20 53 74 6c 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ped Stl..1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 0f 09 06 0e 39 02 51 04 06 1c 09 0a 08 0e 00 00 59 0a 01 1f 09 09 08 0f
+00 00 63 08 05 18 0c 09 07 0f 00 00 63 04 02 76 22 00 00 00 22 18 03 04 00
+63 63 00 00 00 32 00 50 65 64 20 53 74 6c 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ped Stl..2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 0f 09 06 0e 39 03 45 13 06 1c 09 0a 08 0e 00 02 63 08 01 1f 09 09 08 0f
+00 05 63 04 05 0e 0c 07 08 0f 00 04 63 04 0a 76 22 00 00 00 22 18 03 04 00
+63 63 00 00 00 32 00 50 65 64 20 53 74 6c 2e 2e 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ped Stl..2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 0f 09 06 0e 39 02 45 13 06 1c 09 0a 08 0e 00 00 63 08 01 1f 09 09 08 0f
+00 00 63 04 05 0e 0c 07 08 0f 00 00 63 04 0a 76 22 00 00 00 22 18 03 04 00
+63 63 00 00 00 32 00 50 65 64 20 53 74 6c 2e 2e 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ped Stl..3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 0f 09 06 0e 39 02 3c 08 06 1c 09 0a 08 0e 00 03 63 08 01 1f 09 09 08 0f
+00 03 63 04 05 0e 0c 07 08 0f 00 06 63 04 0a 7d 22 00 00 00 22 18 03 04 00
+63 63 00 00 00 32 00 50 65 64 20 53 74 6c 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ped Stl..3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 0f 09 06 0e 39 00 3c 08 06 1c 09 0a 08 0e 00 00 63 08 01 1f 09 09 08 0f
+00 00 63 04 05 0e 0c 07 08 0f 00 00 63 04 0a 7d 22 00 00 00 22 18 03 04 00
+63 63 00 00 00 32 00 50 65 64 20 53 74 6c 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PedalSteel
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 10 00 0c 00 27 02 3c 24 0b 1f 10 02 0a 0e 37 02 5d 04 0c 1b 06 05 0b 0d
+3d 02 5a 0a 0b 1b 09 06 0b 0d 00 06 63 04 0b 03 1d 16 09 00 52 18 02 04 00
+63 19 00 0a 00 32 00 50 65 64 61 6c 53 74 65 65 6c 63 63 63 32 32 32 00 40
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PercLead.1
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 0d 00 0a 0b 06 44 55 08 1b 1f 08 00 0d 0c 05 06 40 00 0b 1f 1f 00 0d 0f
+0d 06 53 04 1b 1f 1f 00 0d 0f 00 45 5e 04 03 11 23 35 00 10 46 18 0c 04 00
+63 32 32 00 00 32 00 50 65 72 63 4c 65 61 64 2e 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PercLead.1
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 0d 00 0a 0b 06 41 55 08 1b 1f 08 00 0d 0c 05 01 40 00 0b 1f 1f 00 0d 0f
+0d 01 53 04 1b 1f 1f 00 0d 0f 00 40 5e 04 03 11 23 35 00 10 46 18 0c 04 00
+63 32 32 00 00 32 00 50 65 72 63 4c 65 61 64 2e 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PercLead.2
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 0d 00 0a 0b 06 46 63 04 1b 1f 08 00 0d 0c 05 04 5e 0a 0b 1f 1f 00 0d 0f
+0d 06 52 04 1b 1f 1f 00 0d 0f 00 44 57 04 03 25 23 35 00 10 46 18 0c 04 00
+63 32 32 00 00 32 00 50 65 72 63 4c 65 61 64 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PercLead.2
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 0d 00 0a 0b 06 42 63 04 1b 1f 08 00 0d 0c 05 00 5e 0a 0b 1f 1f 00 0d 0f
+0d 00 52 04 1b 1f 1f 00 0d 0f 00 40 57 04 03 25 23 35 00 10 46 18 0c 04 00
+63 32 32 00 00 32 00 50 65 72 63 4c 65 61 64 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PhasedGuit
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 0e 0e 0f 0f 00 03 42 2d 06 16 0f 04 0f 0f 20 03 60 00 00 1c 12 06 0c 0e
+14 03 5a 00 08 1f 13 07 08 0e 06 04 62 04 0e 3b 1d 00 00 00 42 18 02 04 00
+63 32 00 32 00 32 00 50 68 61 73 65 64 47 75 69 74 63 63 63 32 32 32 10 30
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Piknylon *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 1e 1f 07 00 00 03 5a 28 03 1d 08 1f 05 0a 21 02 43 0a 08 1d 0d 08 02 0c
+18 02 53 0a 15 1d 0a 0c 05 0a 00 03 63 04 04 02 1e 0a 09 00 32 18 02 04 00
+28 63 00 00 00 32 00 50 69 6b 6e 79 6c 6f 6e 20 2a 63 63 63 32 32 32 0a 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Power Lead
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 07 00 01 00 2e 03 5c 08 13 1f 0c 06 09 0f 4b 06 4d 00 13 1f 0d 03 09 04
+46 05 51 1c 0b 1f 12 06 09 0e 0e 05 63 04 0b 2a 23 00 00 00 02 0c 02 04 00
+28 02 00 00 00 32 00 50 6f 77 65 72 20 4c 65 61 64 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Power Lead
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 07 00 01 00 2e 01 5c 08 13 1f 0c 06 09 0f 4b 01 4d 00 13 1f 0d 03 09 04
+46 01 51 1c 0b 1f 12 06 09 0e 0e 00 63 04 0b 2a 23 00 00 00 02 0c 02 04 00
+28 02 00 00 00 32 00 50 6f 77 65 72 20 4c 65 61 64 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PowerChord
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 08 00 03 07 20 01 52 00 06 1c 03 00 02 0a 1b 01 4c 00 02 15 05 04 03 0a
+1b 00 46 0a 05 17 0f 00 08 0f 00 40 50 04 03 3a 1e 16 02 32 46 18 07 04 00
+63 32 00 00 00 32 00 50 6f 77 65 72 43 68 6f 72 64 63 63 63 32 32 32 00 00
+00 50 00 50 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RecLead
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 1f 00 06 0f 5c 01 48 0d 03 16 02 06 03 0d 00 01 5c 0d 06 15 09 09 0c 0d
+00 05 63 0d 0b 12 09 09 08 0d 00 05 5f 0d 0b 0c 00 02 00 00 22 00 02 04 00
+28 02 00 00 00 32 00 52 65 63 4c 65 61 64 20 20 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RecLead
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 1f 00 06 0f 5c 01 48 0d 03 16 02 06 03 0d 00 01 5c 0d 06 15 09 09 0c 0d
+00 00 63 0d 0b 12 09 09 08 0d 00 00 5f 0d 0b 0c 00 02 00 00 22 00 02 04 00
+28 02 00 00 00 32 00 52 65 63 4c 65 61 64 20 20 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 09 03 0d 0e 63 02 54 04 0e 1c 0a 02 0c 0b 00 03 41 1c 1c 1c 07 01 07 0e
+00 05 5d 04 1b 1c 05 02 0a 0b 0a 05 5c 04 0d 03 23 20 00 00 32 00 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 09 03 0d 0e 63 01 54 04 0e 1c 0a 02 0c 0b 00 01 41 1c 1c 1c 07 01 07 0e
+00 01 5d 04 1b 1c 05 02 0a 0b 0a 00 5c 04 0d 03 23 20 00 00 32 00 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 03 00 0a 0e 13 02 41 04 03 12 1f 00 0a 0f 00 03 46 08 02 12 1f 00 0a 0f
+45 05 60 08 03 12 1f 00 0a 0f 01 05 60 08 03 1b 23 01 0a 00 62 0c 02 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 32 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 03 00 0a 0e 13 02 41 04 03 12 1f 00 0a 0f 00 01 46 08 02 12 1f 00 0a 0f
+45 01 60 08 03 12 1f 00 0a 0f 01 00 60 08 03 1b 23 01 0a 00 62 0c 02 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 32 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0f 01 0c 0e 07 03 4e 00 1e 1c 1f 06 0f 0f 00 04 54 04 0c 1c 09 03 0f 0f
+00 06 4e 04 03 1c 07 07 09 0b 0a 05 56 04 0d 29 23 20 00 00 32 18 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0f 01 0c 0e 07 01 4e 00 1e 1c 1f 06 0f 0f 00 01 54 04 0c 1c 09 03 0f 0f
+00 01 4e 04 03 1c 07 07 09 0b 0a 00 56 04 0d 29 23 20 00 00 32 18 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0f 0a 0c 0e 00 03 41 1c 16 1c 1f 06 0f 0f 00 04 5b 00 0c 1c 09 03 0f 0f
+00 05 4e 04 03 1c 07 07 09 0b 0a 05 60 04 0d 2c 23 20 00 00 32 18 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0f 0a 0c 0e 00 01 41 1c 16 1c 1f 06 0f 0f 00 01 5b 00 0c 1c 09 03 0f 0f
+00 00 4e 04 03 1c 07 07 09 0b 0a 00 60 04 0d 2c 23 20 00 00 32 18 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 0f 06 07 0c 00 03 57 04 13 1c 1f 06 0f 0f 00 03 55 08 0c 1c 09 07 07 0c
+00 05 5f 0a 0a 1c 07 07 09 0b 0a 05 5f 04 0d 2c 23 20 00 00 32 18 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 35 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 0f 06 07 0c 00 01 57 04 13 1c 1f 06 0f 0f 00 01 55 08 0c 1c 09 07 07 0c
+00 00 5f 0a 0a 1c 07 07 09 0b 0a 00 5f 04 0d 2c 23 20 00 00 32 18 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 35 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 1f 04 07 0f 00 02 50 04 13 10 15 04 0f 0d 00 03 56 00 0c 10 1f 04 07 0f
+00 05 63 0a 0a 18 04 03 09 0b 0a 05 63 04 15 24 23 20 00 00 32 18 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rock Guit6
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 1f 04 07 0f 00 00 50 04 13 10 15 04 0f 0d 00 00 56 00 0c 10 1f 04 07 0f
+00 00 63 0a 0a 18 04 03 09 0b 0a 00 63 04 15 24 23 20 00 00 32 18 04 04 00
+63 32 00 00 00 32 00 52 6f 63 6b 20 47 75 69 74 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StadiumSol
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 17
+1f 08 00 03 0f 20 01 4e 00 06 1f 03 00 02 0f 1b 01 48 0d 02 1f 05 04 03 0f
+1b 00 3c 2a 05 1e 0f 00 09 0f 00 00 5c 04 03 3a 1f 16 05 00 62 18 07 0c 00
+63 32 00 00 00 32 00 53 74 61 64 69 75 6d 53 6f 6c 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Solo 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 23
+17 0f 00 0a 0c 00 00 35 0a 06 18 0e 00 0a 0c 00 00 3f 04 06 16 00 00 0a 0f
+05 00 53 04 06 18 05 01 0a 0a 00 04 5c 04 00 3b 20 14 0a 00 42 0c 02 04 00
+28 46 00 00 00 32 00 53 79 2e 53 6f 6c 6f 20 20 31 63 63 63 32 32 32 00 60
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Solo 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+17 0f 00 0a 0c 00 00 35 0d 06 18 0e 00 0a 0c 00 00 3f 04 06 16 00 00 0a 0f
+05 00 53 04 06 18 05 01 0a 0d 00 04 5c 04 00 3b 20 14 0a 00 42 0c 02 04 00
+28 46 00 00 00 32 00 53 79 2e 53 6f 6c 6f 20 20 31 63 63 63 32 32 32 00 60
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Solo 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 24
+1f 19 00 08 0b 00 00 49 04 06 1b 0a 00 0c 0c 00 02 63 08 00 1b 04 00 0c 0a
+00 02 63 04 06 1f 04 00 0c 0e 00 02 63 04 06 3d 26 28 14 00 42 18 02 04 00
+28 4b 00 00 00 32 00 53 79 2e 53 6f 6c 6f 20 20 32 63 63 63 32 32 32 00 20
+00 50 00 40 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Solo 2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 19 00 08 0b 00 00 49 04 06 1b 0a 00 0c 0c 00 02 63 08 00 1b 04 00 0c 0d
+00 02 63 04 06 1f 04 00 0c 0e 00 02 63 04 06 3d 26 28 14 00 42 18 02 04 00
+28 4b 00 00 00 32 00 53 79 2e 53 6f 6c 6f 20 20 32 63 63 63 32 32 32 00 20
+00 50 00 40 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Solo 3
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank A, voice 25
+1f 0a 00 04 0a 07 01 4f 04 0b 1f 0a 00 07 0b 00 00 2d 04 0b 1f 0b 00 05 0b
+00 00 4d 04 0b 16 1f 00 0a 0f 00 01 61 04 0b 3a 20 00 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 53 6f 6c 6f 20 20 33 63 63 63 32 32 32 00 30
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Solo 3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 00 04 0d 07 01 4f 04 0b 1f 0d 00 07 0b 00 00 2d 04 0b 1f 0b 00 05 0b
+00 00 4d 04 0b 16 1f 00 0a 0f 00 01 61 04 0b 3a 20 00 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 53 6f 6c 6f 20 20 33 63 63 63 32 32 32 00 30
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Solo 4
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank A, voice 26
+1f 0a 00 04 0a 07 01 4d 08 0b 1f 0a 00 07 0b 00 00 35 08 0b 1f 0b 00 05 0b
+00 00 45 04 0b 17 1f 00 0a 0f 00 01 61 04 0b 3a 20 00 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 53 6f 6c 6f 20 20 34 63 63 63 32 32 32 00 30
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Solo 4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 00 04 0d 07 01 4d 08 0b 1f 0d 00 07 0b 00 00 35 08 0b 1f 0b 00 05 0b
+00 00 45 04 0b 17 1f 00 0a 0f 00 01 61 04 0b 3a 20 00 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 53 6f 6c 6f 20 20 34 63 63 63 32 32 32 00 30
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sync Lead
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 22
+13 12 00 09 0d 22 00 51 00 0b 1f 14 00 05 08 24 40 5c 00 03 1f 11 00 06 0c
+2c 00 53 09 00 10 1f 00 0b 0f 00 00 5c 0a 0e 3a 22 11 0e 1e 5e 18 07 04 00
+63 32 00 32 00 32 00 53 79 6e 63 20 4c 65 61 64 20 63 63 63 32 32 32 00 70
+00 40 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: TwangGuitr
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1a 00 03 01 00 04 52 2f 16 1f 05 00 08 00 00 02 50 04 10 1f 0f 06 09 0a
+00 02 3e 35 10 1f 09 07 09 0d 00 05 63 10 0b 32 1e 09 02 00 52 0c 04 04 00
+63 19 00 10 00 32 00 54 77 61 6e 67 47 75 69 74 72 63 63 63 32 32 32 10 54
+15 50 10 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: TwelveStrg
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 3
+1f 0d 08 0a 08 00 03 42 24 06 1f 1f 05 0b 0b 36 03 63 07 0e 1f 0f 06 0b 0f
+13 03 63 00 10 1f 13 07 09 0e 00 04 63 04 0e 3b 14 00 00 00 42 18 02 04 00
+63 32 00 32 00 32 00 54 77 65 6c 76 65 53 74 72 67 63 63 63 32 32 32 00 00
+00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: slowtacky
+** Description: a biting electric guitar sound
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1f 0a 06 0b 02 00 05 5f 08 02 1f 02 03 0b 0e 43 05 5f 00 10 1f 12 06 08 0e
+00 05 5f 00 00 16 04 08 08 0c 00 05 5f 04 03 33 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 73 6c 6f 77 74 61 63 6b 79 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: slowtacky+
+** Description: 'slowtacky' (from GLIB) with added sustain
+** Controls: KV
+** Source: Art Hitzeman, based on a voice from GLIB (Michael Kesti and others)
+1f 0a 06 07 02 00 05 5f 08 02 1f 02 03 07 0e 43 05 5f 00 10 1f 12 06 07 0e
+00 05 5f 00 00 16 04 08 06 0c 00 05 5f 04 03 33 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 73 6c 6f 77 74 61 63 6b 79 2b 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+--Bank 9
+
+* SUBCATEGORY Harp
+
+
+** Name: Dbl Harp.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0f 09 04 0b 27 04 5f 0a 04 1c 0f 02 01 00 2d 04 5a 08 02 1c 0a 09 06 0a
+1d 04 63 04 01 11 1f 04 03 0c 00 05 63 04 1d 6c 22 21 00 00 12 18 02 04 00
+63 32 00 00 01 32 00 44 62 6c 20 48 61 72 70 2e 31 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Dbl Harp.1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0f 09 04 0b 27 01 5f 0a 04 1c 0f 02 01 00 2d 01 5a 08 02 1c 0a 09 06 0a
+1d 00 63 04 01 11 1f 04 03 0c 00 01 63 04 1d 6c 22 21 00 00 12 18 02 04 00
+63 32 00 00 01 32 00 44 62 6c 20 48 61 72 70 2e 31 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Dbl Harp.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 1b 07 06 00 63 05 5d 13 0c 1f 12 0c 04 0f 5a 04 53 0d 0a 1c 0a 07 05 00
+00 04 4c 08 01 18 12 09 05 0f 00 05 5d 04 0d 38 1b 29 01 00 32 18 02 04 00
+63 32 00 00 01 32 00 44 62 6c 20 48 61 72 70 2e 32 63 63 63 32 32 32 00 10
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Dbl Harp.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 1b 07 06 00 63 01 5d 13 0c 1f 12 0c 04 0f 5a 01 53 0d 0a 1c 0a 07 05 00
+00 00 4c 08 01 13 12 09 05 0f 00 00 5d 04 0d 38 1b 29 01 00 32 18 02 04 00
+63 32 00 00 01 32 00 44 62 6c 20 48 61 72 70 2e 32 63 63 63 32 32 32 00 10
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 00 01 00 07 02 50 08 0e 1f 12 00 05 00 00 03 4d 0a 10 1e 08 00 04 00
+0b 03 63 04 10 1b 08 00 04 00 10 03 63 04 16 34 23 00 00 00 32 18 02 04 00
+28 62 00 00 00 32 00 48 61 72 70 20 20 20 20 20 2a 63 63 63 32 32 32 00 30
+00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank B, voice 24
+10 13 0f 04 0a 00 03 3b 14 14 1f 0e 08 07 09 00 02 42 05 0e 18 13 0d 09 0c
+00 02 3c 13 08 1f 11 07 04 0f 00 42 63 04 10 3a 1b 00 00 00 52 1d 04 04 00
+63 32 00 00 00 32 00 48 61 72 70 20 20 20 20 20 20 63 63 63 32 32 32 08 00
+00 21 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 13
+17 0e 0a 03 0e 00 04 56 04 08 17 0e 0a 03 0e 00 04 56 04 0e 1f 0c 07 05 0e
+00 03 63 04 08 1f 0c 07 05 0e 00 03 63 04 0e 04 1b 15 0a 01 32 18 02 04 00
+63 63 00 00 00 32 00 48 61 72 70 20 20 20 20 20 31 63 63 63 32 32 32 00 30
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+17 0e 0a 03 0e 00 04 56 04 08 17 0e 0a 03 0e 00 04 56 04 0e 1f 0c 07 05 0e
+00 03 63 04 08 1f 0c 07 05 0e 00 03 63 04 0e 04 1b 15 0d 01 32 18 02 04 00
+63 63 00 00 00 32 00 48 61 72 70 20 20 20 20 20 31 63 63 63 32 32 32 00 30
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 14
+17 0b 0b 01 06 0a 42 3b 04 00 1c 13 00 01 00 0a 41 49 08 06 1f 13 00 01 00
+00 42 43 16 06 19 0f 0b 05 0e 00 43 63 04 08 3a 14 00 06 08 4a 18 02 04 00
+28 55 00 00 00 32 00 48 61 72 70 20 20 20 20 20 32 63 63 63 32 32 32 00 00
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+07 05 0a 07 0e 00 02 56 13 0c 1f 09 05 03 00 52 02 53 08 0b 1f 13 07 06 00
+36 05 4b 10 03 19 07 00 04 00 1d 04 5c 04 0e 3b 1b 00 02 00 32 18 02 04 00
+63 32 00 00 01 32 00 48 61 72 70 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 30 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 05 0a 07 0e 00 00 56 13 0c 1f 09 05 03 00 52 00 53 08 0b 1f 13 07 06 00
+36 02 4b 10 03 19 07 00 04 00 1d 01 5c 04 0e 3b 1b 00 02 00 32 18 02 04 00
+63 32 00 00 01 32 00 48 61 72 70 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 30 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp.....2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0f 09 03 0b 2d 03 53 0a 1c 1c 0d 0d 03 0a 2d 04 4d 04 0a 1c 0a 0a 04 0a
+32 04 47 0a 09 1c 09 0d 04 0a 00 04 62 04 0d 58 22 21 00 00 12 18 02 04 00
+63 32 00 00 01 32 00 48 61 72 70 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 40
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp.....2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0f 09 03 0b 2d 00 53 0a 1c 1c 0d 0d 03 0a 2d 01 4d 04 0a 1c 0a 0a 04 0a
+32 01 47 0a 09 1c 09 0d 04 0a 00 00 62 04 0d 58 22 21 00 00 12 18 02 04 00
+63 32 00 00 01 32 00 48 61 72 70 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 40
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp....FM
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 10 06 06 00 63 01 5a 08 0b 1a 18 06 06 0f 5a 04 5b 04 00 1c 1f 1f 06 0f
+00 04 4c 04 0d 13 06 00 06 0f 00 04 63 04 02 25 1b 23 0b 00 42 18 02 04 00
+63 32 00 00 01 32 00 48 61 72 70 2e 2e 2e 2e 46 4d 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harp....FM
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 10 06 06 00 63 01 5a 08 0b 1a 18 06 06 0f 5a 01 5b 04 00 1c 1f 1f 06 0f
+00 00 4c 04 0d 13 06 00 06 0f 00 00 63 04 02 25 1b 23 0b 00 42 18 02 04 00
+63 32 00 00 01 32 00 48 61 72 70 2e 2e 2e 2e 46 4d 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Koto
+
+
+** Name: Fuzzy Koto
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 8
+16 02 00 04 06 09 01 4f 08 00 19 0e 01 04 00 20 01 43 19 00 1f 12 10 06 07
+00 00 54 3d 03 16 0d 06 06 02 1e 03 61 08 0e 3a 20 01 14 00 42 0c 02 04 02
+63 63 63 00 00 32 00 46 75 7a 7a 79 20 4b 6f 74 6f 63 63 63 32 32 32 00 00
+00 00 0b 50 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Koto *
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 15 00 05 00 0f 02 56 0d 13 1c 04 03 03 0b 0d 01 4f 04 1e 1c 07 09 05 0d
+23 01 53 0d 18 1a 14 08 04 0d 00 03 63 04 10 02 1a 08 1d 00 32 18 02 04 00
+28 63 00 00 00 36 00 4b 6f 74 6f 20 20 20 20 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Koto
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 17
+1f 12 0c 06 0b 1c 03 57 16 0b 1f 1f 08 01 0f 0b 01 47 04 0b 1f 1f 06 04 0f
+25 01 4b 0a 0b 19 1f 0a 06 0f 00 02 5a 08 0b 00 1e 00 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 4b 6f 74 6f 20 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Koto
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 0c 06 0b 1c 03 57 16 0b 1f 1f 08 01 0f 0b 01 47 04 0b 1f 1f 06 04 0f
+25 01 4b 0a 0b 19 1f 0a 06 0f 00 02 5a 08 0b 00 1e 00 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 4b 6f 74 6f 20 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Koto.....1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 09 07 0c 11 02 52 0d 16 1b 1f 1d 05 0d 00 02 63 04 10 1c 0d 05 05 0c
+19 05 63 04 16 1f 11 08 05 0f 00 46 5a 00 10 1c 1f 00 00 00 62 18 02 04 00
+63 32 00 32 00 32 00 4b 6f 74 6f 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Koto.....1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 09 07 0c 11 00 52 0d 16 1b 1f 1d 05 0d 00 00 63 04 10 1c 0d 05 05 0c
+19 00 63 04 16 1f 11 08 05 0f 00 40 5a 00 10 1c 1f 00 00 00 62 18 02 04 00
+63 32 00 32 00 32 00 4b 6f 74 6f 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Koto.....2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 09 07 0c 11 41 47 0d 13 1b 1f 1d 05 0d 00 43 63 0a 13 1c 0d 05 05 0c
+19 45 63 04 13 1f 11 08 05 0f 00 45 5a 04 13 5c 1e 00 11 14 26 18 02 04 00
+63 32 00 32 00 32 00 4b 6f 74 6f 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Koto.....2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 09 07 0c 11 40 47 0d 13 1b 1f 1d 05 0d 00 40 63 0a 13 1c 0d 05 05 0c
+19 40 63 04 13 1f 11 08 05 0f 00 40 5a 04 13 5c 1e 00 11 14 26 18 02 04 00
+63 32 00 32 00 32 00 4b 6f 74 6f 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Koto.....3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 09 07 0c 11 42 47 0d 13 1f 0a 09 07 0c 11 43 4a 0d 13 1c 0d 05 05 0c
+19 45 63 04 13 1c 0d 05 05 0c 19 47 5a 04 13 5c 1e 00 11 14 26 18 02 04 00
+63 32 00 32 00 32 00 4b 6f 74 6f 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Koto.....3
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 09 07 0c 11 40 47 0d 13 1f 0a 09 07 0c 11 40 4a 0d 13 1c 0d 05 05 0c
+19 40 63 04 13 1c 0d 05 05 0c 19 40 5a 04 13 5c 1e 00 11 14 26 18 02 04 00
+63 32 00 32 00 32 00 4b 6f 74 6f 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Lute
+
+
+** Name: OrntLute.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 07 04 05 08 00 04 52 08 0b 0c 07 1f 04 07 00 42 3e 00 0c 19 07 1f 04 07
+00 04 63 04 0c 18 07 09 05 0e 00 45 63 04 0b 74 34 00 00 0a 06 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 4c 75 74 65 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntLute.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 07 04 05 08 00 00 52 08 0b 0c 07 1f 04 07 00 40 3e 00 0c 19 07 1f 04 07
+00 00 63 04 0c 18 07 09 05 0e 00 40 63 04 0b 74 34 00 00 0a 06 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 4c 75 74 65 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntLute.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 03 00 05 0f 00 42 59 00 0b 1f 0c 1f 05 08 00 43 46 00 0a 0c 0c 1f 04 07
+00 44 63 00 0c 15 0c 09 05 0c 00 46 61 04 0b 6c 34 00 00 0a 06 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 4c 75 74 65 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntLute.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 03 00 05 0f 00 40 59 00 0b 1f 0c 1f 05 08 00 40 46 00 0a 0c 0c 1f 04 07
+00 40 63 00 0c 15 0c 09 05 0c 00 40 61 04 0b 6c 34 00 00 0a 06 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 4c 75 74 65 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Mandolin
+
+
+** Name: Mandolin.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 19 0d 05 0c 02 04 62 2d 1b 1f 09 06 02 0b 00 04 45 0a 0b 17 0c 09 07 00
+00 06 63 04 0a 16 0c 09 07 0b 00 05 63 04 1c 74 2c 63 04 00 22 18 02 04 00
+63 32 00 32 00 32 00 4d 61 6e 64 6f 6c 69 6e 2e 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mandolin.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 19 0d 05 0c 02 02 62 2d 1b 1f 09 06 02 0b 00 02 45 0a 0b 17 0c 09 07 00
+00 00 63 04 0a 16 0c 09 07 0b 00 00 63 04 1c 74 2c 63 04 00 22 18 02 04 00
+63 32 00 32 00 32 00 4d 61 6e 64 6f 6c 69 6e 2e 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mandolin.2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 18 0d 05 0c 02 02 3f 2d 1b 1f 0c 06 04 0b 00 05 37 0a 0b 1f 0d 07 05 0f
+00 05 5f 04 0a 16 0c 09 05 0b 00 05 5e 04 1c 3c 46 10 01 00 20 18 02 04 00
+63 32 00 32 00 32 00 4d 61 6e 64 6f 6c 69 6e 2e 32 63 63 63 32 32 32 00 40
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mandolin.2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 0d 05 0c 02 01 3f 2d 1b 1f 0c 06 04 0b 00 01 37 0a 0b 1f 0d 07 05 0f
+00 00 5f 04 0a 16 0c 09 05 0b 00 00 5e 04 1c 3c 46 10 01 00 20 18 02 04 00
+63 32 00 32 00 32 00 4d 61 6e 64 6f 6c 69 6e 2e 32 63 63 63 32 32 32 00 40
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Sitar
+
+
+** Name: Sitar *
+** Controls: KV, BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 00 00 04 03 1e 0c 0b 01 0f 00 02 55 16 09 11 15 00 02 0f
+00 03 5b 04 08 1f 18 06 04 0f 00 01 63 04 0b 03 1d 00 00 00 62 18 01 04 00
+28 0d 00 00 00 33 00 53 69 74 61 72 20 20 20 20 2a 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sitar
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 29
+17 0e 09 01 0e 02 00 47 04 1b 1f 06 03 01 05 00 00 4b 08 16 1f 06 04 01 07
+00 00 5e 04 16 1f 05 08 01 07 00 01 5f 08 18 3b 21 00 05 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 69 74 61 72 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sitar....1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 07 06 01 0d 52 03 51 16 0a 1f 0c 09 01 0e 27 02 58 04 0b 1f 06 06 04 0e
+11 06 5b 04 13 1f 18 09 04 0e 00 05 49 37 0b 04 1c 00 00 00 22 18 01 04 00
+63 00 63 00 00 32 00 53 69 74 61 72 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sitar....1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 07 06 01 0d 52 00 51 16 0a 1f 0c 09 01 0e 27 00 58 04 0b 1f 06 06 04 0e
+11 00 5b 04 13 1f 18 09 04 0e 00 00 49 37 0b 04 1c 00 00 00 22 18 01 04 00
+63 00 63 00 00 32 00 53 69 74 61 72 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sitar....2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 0e 09 04 0e 02 01 43 13 13 1f 06 03 03 05 00 02 3b 1c 16 1f 06 04 02 07
+00 05 52 04 16 1f 05 08 01 07 00 05 60 00 18 13 21 00 05 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 69 74 61 72 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sitar....2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+17 0e 09 04 0e 02 00 43 13 13 1f 06 03 03 05 00 00 3b 1c 16 1f 06 04 02 07
+00 00 52 04 16 1f 05 08 01 07 00 00 60 00 18 13 21 00 05 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 69 74 61 72 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sitar....3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 12 07 02 05 02 02 43 19 0c 1b 1c 0a 04 08 00 02 5b 1c 02 0f 0c 0a 02 0e
+00 05 52 13 1c 1f 12 06 05 0f 00 05 60 00 0b 5a 2c 63 04 00 22 18 02 04 00
+63 32 00 32 00 32 00 53 69 74 61 72 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sitar....3
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 12 07 02 05 02 00 43 19 0c 1b 1c 0a 04 08 00 00 5b 1c 02 0f 0c 0a 02 0e
+00 00 52 13 1c 1f 12 06 05 0f 00 00 60 00 0b 5a 2c 63 04 00 22 18 02 04 00
+63 32 00 32 00 32 00 53 69 74 61 72 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sitar.Vib
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 12 07 04 04 02 03 43 13 0b 1b 1d 09 03 09 00 02 3b 1c 06 0f 0c 09 05 0c
+00 05 52 04 1e 1f 12 05 05 0f 00 07 60 00 00 13 21 00 05 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 69 74 61 72 2e 56 69 62 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sitar.Vib
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 12 07 04 04 02 00 43 13 0b 1b 1d 09 03 09 00 00 3b 1c 06 0f 0c 09 05 0c
+00 00 52 04 1e 1f 12 05 05 0f 00 00 60 00 00 13 21 00 05 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 69 74 61 72 2e 56 69 62 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Sitar
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 31
+1e 12 1f 03 09 00 00 41 3c 03 1d 0f 02 01 0f 00 00 5b 00 03 1e 0f 1f 02 0f
+3b 01 57 02 03 1e 1f 0c 04 0f 00 02 5d 10 03 3a 17 00 03 00 5a 18 02 04 00
+63 32 00 00 00 32 00 53 79 2e 53 69 74 61 72 20 20 63 63 63 32 32 32 00 10
+00 00 00 76 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Viola
+
+
+** Name: Viola 5th
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 06 00 06 0f 0a 01 4c 0a 15 0f 07 00 06 0e 32 04 4e 08 0b 0b 07 06 07 0f
+0a 06 57 13 0c 0d 06 06 08 0d 00 03 5f 08 03 74 22 23 0b 00 12 18 04 04 00
+63 32 63 00 00 32 00 56 69 6f 6c 61 20 35 74 68 20 63 63 63 32 32 32 00 40
+00 20 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Viola 5th
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 06 00 06 0f 0a 01 54 0a 15 10 07 00 06 0e 32 01 4e 0d 0b 0a 07 06 07 0f
+0a 00 60 0a 0c 0d 06 06 08 0d 00 00 5f 04 03 74 22 23 0b 00 12 18 04 04 00
+63 32 63 00 00 32 00 56 69 6f 6c 61 20 35 74 68 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Viola....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 06 03 08 0e 00 41 4c 08 0d 1b 0d 07 07 0d 0a 44 43 19 04 0d 06 01 07 0f
+00 45 60 08 03 0f 06 09 09 0d 00 45 60 08 04 7c 20 38 32 00 26 0c 04 04 00
+63 32 63 00 00 32 00 56 69 6f 6c 61 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 40 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Viola....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 06 03 08 0e 00 41 4c 08 0d 1f 0d 07 07 0d 0a 41 43 19 04 0d 06 01 07 0f
+00 40 60 08 03 0d 06 09 09 0d 00 41 60 13 04 7c 20 38 0e 00 26 0c 04 04 00
+63 32 63 00 00 32 00 56 69 6f 6c 61 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Viola....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 04 06 07 0d 00 42 4e 04 03 0e 09 0d 07 03 0a 45 4f 08 14 0c 07 05 06 04
+00 46 5c 04 03 0d 06 06 05 0d 00 43 63 04 04 35 1e 2e 26 00 36 0c 04 04 00
+63 32 63 00 00 32 00 56 69 6f 6c 61 2e 2e 2e 2e 32 63 63 63 32 32 32 00 10
+00 10 00 40 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Viola....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 04 06 07 0d 00 42 53 04 03 0e 09 0d 07 03 0a 41 4f 0d 14 0f 15 07 06 0d
+00 40 63 04 03 0f 06 06 05 0d 00 41 63 04 04 34 1c 2e 1e 00 36 0c 04 04 00
+63 32 63 00 00 32 00 56 69 6f 6c 61 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ViolaSynth
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 06 02 07 0f 00 03 4a 04 0b 0f 07 09 07 07 00 03 63 00 03 0e 09 10 0d 07
+00 06 5c 04 03 0f 07 09 07 07 00 05 63 04 03 7d 23 0f 0b 00 42 18 02 04 00
+63 63 00 00 00 32 00 56 69 6f 6c 61 53 79 6e 74 68 63 63 63 32 32 32 00 00
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ViolaSynth
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 06 02 07 0f 00 01 4a 04 0b 0f 07 09 07 07 00 00 63 00 03 0e 09 10 0d 07
+00 00 5c 04 03 0f 07 09 07 07 00 00 63 04 03 7d 23 0f 0b 00 42 18 02 04 00
+63 63 00 00 00 32 00 56 69 6f 6c 61 53 79 6e 74 68 63 63 63 32 32 32 00 00
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 10
+
+* SUBCATEGORY Violin
+
+
+** Name: SoloViolin
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 20
+1b 05 00 07 0e 0c 01 4e 08 04 19 0b 06 06 0f 49 02 3b 0d 03 1c 11 10 0d 07
+00 03 4b 35 03 0b 0a 00 06 0f 02 02 63 08 13 3a 1e 06 06 00 52 0c 04 04 00
+63 32 00 00 00 32 00 53 6f 6c 6f 56 69 6f 6c 69 6e 63 63 63 32 32 32 00 00
+00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sradiv. *
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 0f 09 0f 2a 05 31 20 05 12 09 02 06 0f 10 00 51 08 0b 1f 0e 07 03 0a
+14 02 4d 19 08 0e 05 05 09 0e 00 06 63 08 0a 00 20 00 0e 00 42 0c 02 04 00
+28 63 00 00 00 31 00 53 72 61 64 69 76 2e 20 20 2a 63 63 63 32 32 32 0c 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin 1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 5
+16 07 00 06 0e 00 41 4e 04 0b 15 08 00 03 0b 00 02 3a 04 0b 19 08 00 08 0c
+10 05 5f 0a 14 0e 0e 00 08 0a 00 02 60 08 0b 3a 20 0a 08 00 62 18 02 05 00
+63 0a 50 32 00 32 00 56 69 6f 6c 69 6e 20 20 20 31 63 62 63 30 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin 1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 07 00 06 0e 00 41 4e 04 0b 15 08 00 03 0b 00 02 3a 04 0b 19 08 00 08 0c
+10 05 5f 0a 14 0e 0e 00 08 0d 00 02 60 08 0b 3a 20 0a 08 00 62 18 02 05 00
+63 0a 50 32 00 32 00 56 69 6f 6c 69 6e 20 20 20 31 63 62 63 30 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 6
+1f 02 00 04 0e 0f 00 45 04 0b 0f 0a 00 04 0a 00 02 62 04 0b 0a 04 00 07 0f
+09 02 5c 08 0b 0c 09 00 08 0a 08 02 58 0a 0b 3c 1f 13 3d 00 42 18 02 04 00
+63 32 00 00 00 32 00 56 69 6f 6c 69 6e 20 20 20 32 63 54 63 2e 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin 2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 02 00 04 0e 0f 00 45 04 0b 0f 0a 00 04 0d 00 02 62 04 0b 0d 04 00 07 0f
+09 02 5c 08 0b 0c 09 00 08 0d 08 02 58 0d 0b 3c 1f 13 3d 00 42 18 02 04 00
+63 32 00 00 00 32 00 56 69 6f 6c 69 6e 20 20 20 32 63 54 63 2e 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 06 03 02 0f 0a 42 4e 04 10 0c 00 00 07 0e 00 7c 4b 04 04 0b 03 06 05 0e
+0a 45 61 04 0d 0c 00 00 07 0e 00 7f 63 04 06 6c 1e 14 18 00 36 18 04 04 00
+63 32 63 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 30 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 06 03 02 0f 0a 40 4c 04 16 15 00 00 06 0f 0a 43 55 04 05 0e 05 06 05 0e
+0a 40 63 04 0b 0f 00 00 06 0e 00 40 63 08 03 6c 1c 00 18 00 36 18 04 04 00
+63 32 63 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 03 00 03 0e 00 28 50 04 05 0b 0d 00 03 0e 00 3d 49 0a 14 0a 08 03 07 0f
+13 34 63 04 0b 0a 0c 03 06 0f 13 3f 63 04 09 24 1c 15 0e 00 42 18 02 04 00
+63 15 27 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 32 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 05 00 03 0e 00 00 50 08 06 0f 02 00 03 0e 00 01 3b 19 14 0c 04 03 07 0f
+13 01 63 08 08 0a 01 03 06 0f 13 01 63 00 0b 2c 25 2c 0e 00 22 0c 02 04 00
+63 15 27 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 06 07 01 0a 14 01 4e 04 15 0d 08 05 02 08 14 07 44 04 1c 0b 08 08 04 06
+0a 03 60 08 0a 0c 03 03 04 0f 0a 05 63 04 0b 6c 1f 1c 13 12 42 18 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 33 63 63 63 32 32 32 00 20
+00 20 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 04 02 01 0e 14 02 5c 08 05 1f 0f 08 02 0d 14 01 42 19 04 0d 06 03 02 0d
+0a 00 60 08 0a 10 05 03 08 0e 0a 02 63 08 0b 64 23 00 07 00 32 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 50 00 00 00 20 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 04 05 06 07 2a 02 58 04 08 0a 04 10 05 0d 14 06 37 08 0d 08 04 09 05 06
+00 07 63 04 13 0a 06 06 07 0e 0a 05 63 04 0a 6c 1f 19 2e 00 32 18 04 04 00
+63 32 00 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 34 63 63 63 32 32 32 00 20
+02 10 00 00 06 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...4
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+11 00 00 04 0e 2a 01 53 08 08 10 04 10 05 0d 14 01 37 19 0d 0c 07 06 04 0f
+00 00 63 08 13 0d 06 06 07 0e 0a 00 63 04 0a 6c 23 00 0b 00 12 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+02 10 00 00 06 10 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 05 04 06 0f 14 05 50 08 00 11 0c 07 06 0a 14 04 50 08 14 0a 04 04 07 0f
+00 04 63 08 14 0c 07 04 07 0f 00 03 63 08 13 6c 22 27 34 32 12 0c 04 04 00
+63 32 00 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 10 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 04 06 0f 14 02 53 08 00 1f 0d 07 06 0f 14 02 50 08 14 0c 04 04 07 0f
+00 01 63 13 14 0c 04 04 07 0f 00 00 63 13 13 74 24 27 00 00 12 0c 06 04 00
+63 32 63 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...6
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 05 04 06 0f 14 04 53 08 00 11 0d 05 06 0f 14 03 53 08 14 0a 0b 04 07 0b
+00 04 63 08 12 0a 0a 03 07 0f 00 04 63 08 16 6c 1a 27 19 19 42 0c 06 04 00
+63 32 63 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 36 63 63 63 32 32 32 00 30
+00 20 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 04 06 0f 14 02 53 08 00 1f 0d 07 06 0f 14 01 53 13 14 0c 04 04 07 0f
+00 00 63 13 14 0c 04 04 07 0f 00 00 63 0d 13 74 24 27 00 00 12 0c 06 04 00
+63 32 63 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 05 0e 2a 01 50 08 0b 0e 04 04 05 08 14 03 55 08 0a 0c 07 06 07 0f
+00 04 62 08 0c 0a 08 09 08 0a 0a 04 63 08 04 6c 24 27 00 00 22 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 37 63 63 63 32 32 32 00 30
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 05 0e 2a 01 57 08 0e 1f 0c 05 05 0d 14 01 4b 19 0c 0c 07 06 07 0f
+00 00 62 0d 0c 0f 06 06 08 06 0a 00 63 08 03 6c 24 27 00 00 12 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 37 63 63 63 32 32 32 00 30
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 05 04 06 07 2a 01 52 08 0e 15 07 07 05 05 14 01 51 08 03 0c 06 08 07 0a
+0a 00 63 08 0d 0a 05 0a 08 07 0a 01 63 08 02 24 23 27 00 00 12 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 38 63 63 63 32 32 32 00 20
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...8
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 04 06 0f 2a 01 5b 08 0e 1f 0d 10 06 0e 14 01 51 19 03 0c 06 06 08 0e
+0a 00 63 0d 0b 0f 05 06 08 0c 0a 01 63 08 02 24 23 27 00 00 12 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...9
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 05 00 06 0f 32 02 57 08 0e 1f 0c 0c 0a 0e 14 03 49 0d 05 0c 06 06 08 0e
+0a 00 60 08 04 0c 06 06 08 0e 0a 06 63 08 04 6c 1d 17 40 00 22 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 39 63 63 63 32 32 32 00 30
+00 20 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin...9
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 00 06 0f 32 02 5e 08 0e 1f 0c 0c 0a 0e 14 01 4a 13 05 0c 06 06 08 0e
+0a 00 60 08 04 0c 06 06 08 0e 0a 01 5b 19 04 6c 24 27 00 00 22 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 2e 39 63 63 63 32 32 32 00 30
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..10
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 03 00 04 0c 2a 01 50 08 0c 11 02 19 05 08 14 01 57 08 0d 0b 09 06 06 0f
+00 06 51 08 0b 0b 05 06 08 06 0a 05 61 08 0b 7c 1b 08 1f 00 32 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 30 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..10
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0a 03 00 04 0c 2a 01 50 08 0c 10 02 19 05 08 14 01 57 08 0d 0a 09 06 06 0f
+00 00 5f 08 0b 0e 05 06 08 06 0a 00 61 08 0b 7c 20 08 0c 00 32 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..11
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 05 00 03 0e 32 01 4f 08 0d 0e 06 00 05 01 14 06 32 0d 05 0a 06 06 07 0e
+00 00 61 08 0a 0b 05 00 08 0d 0a 06 60 08 04 3c 20 2c 05 00 32 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 31 63 63 63 32 32 32 00 00
+00 40 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..11
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 05 00 03 0e 32 01 4f 08 0d 12 06 00 05 01 14 01 3e 0a 05 0a 06 06 07 0e
+00 00 61 08 0a 10 07 00 08 0d 0a 00 60 08 04 3c 20 2c 05 00 32 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..12
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+11 05 04 05 0e 32 02 4a 08 0b 16 0a 06 08 0e 0a 02 41 08 03 0a 06 05 09 0e
+00 04 63 08 0c 0f 08 02 08 0e 0a 04 63 08 05 6c 21 27 38 02 12 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 32 63 63 63 32 32 32 00 20
+00 50 00 10 00 40 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..12
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 04 05 0e 32 02 52 08 0b 18 0a 06 08 0e 0a 02 4d 08 03 0f 06 05 09 0e
+00 00 63 13 0c 10 08 02 08 0e 0a 00 63 08 05 6c 24 27 00 00 12 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 20 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..13
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 06 02 06 0e 0c 02 42 08 0d 16 07 08 06 0f 49 03 4c 08 0d 11 11 0e 06 07
+00 03 3c 19 0b 0b 0d 00 06 0f 02 03 5a 08 11 3a 21 27 07 00 52 0c 02 04 00
+63 63 00 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 33 63 63 63 32 32 32 00 00
+00 50 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..13
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 06 02 06 0e 0c 01 53 08 0c 16 07 08 06 0f 49 01 4c 0d 0b 1a 11 0e 06 07
+00 00 5b 1f 0b 0c 0d 00 06 0f 02 00 5a 08 13 22 21 27 07 00 52 0c 02 04 00
+63 63 00 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 33 63 63 63 32 32 32 00 00
+00 50 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..14
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 06 04 06 0e 01 01 58 08 05 13 0d 10 07 0e 14 01 4d 08 04 0d 06 03 07 0e
+0a 04 53 08 0a 0b 05 06 08 0c 0a 05 63 08 03 5c 23 27 05 00 32 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 34 63 63 63 32 32 32 00 60
+00 20 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..14
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 04 06 0e 01 01 59 08 05 1f 0d 10 07 0e 14 01 4a 08 04 0e 06 03 07 0e
+0a 00 63 08 0a 0f 05 06 08 0c 0a 00 63 08 03 6c 23 27 05 00 32 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 34 63 63 63 32 32 32 00 40
+00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..15
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 06 04 06 0e 01 01 4e 08 06 12 11 10 06 0e 14 04 4e 19 04 0d 06 03 07 0e
+0a 04 60 08 0a 0b 04 05 07 0d 0a 04 5f 0d 03 6c 21 12 0f 00 42 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 35 63 63 63 32 32 32 00 20
+00 20 00 00 00 30 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..15
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 04 06 0e 01 01 4e 08 06 1d 11 10 06 0e 14 01 4e 19 04 0e 06 03 07 0e
+0a 00 60 08 0a 10 04 05 07 0d 0a 01 5f 0d 03 6c 23 00 09 00 42 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 30 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..16
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 06 02 06 0e 0c 01 54 08 04 16 07 08 06 0f 49 02 2e 1f 06 1a 11 0e 06 07
+00 05 46 08 03 0b 0a 03 05 0e 00 05 56 08 0c 2a 21 27 07 00 52 0c 02 04 00
+63 63 00 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 36 63 63 63 32 32 32 00 00
+0a 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..16
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 06 02 06 0e 0c 01 54 08 04 16 07 08 06 0f 49 02 2e 1f 06 1a 11 0e 06 07
+00 00 46 08 03 0b 0a 03 05 0e 00 00 56 08 0c 2a 21 27 07 00 52 0c 02 04 00
+63 63 00 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 36 63 63 63 32 32 32 00 00
+0a 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..17
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 06 00 03 0e 00 01 48 08 0e 0d 05 00 03 0e 00 01 44 08 0e 0a 08 03 07 0f
+13 05 5b 08 0b 0c 04 03 07 0f 13 06 63 08 0b 64 2c 0a 08 00 32 0c 02 04 00
+63 15 27 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 37 63 63 63 32 32 32 00 10
+00 30 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..17
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 06 00 03 0e 00 01 48 08 0e 0d 05 00 03 0e 00 01 44 0a 0e 0a 04 03 07 0f
+13 00 5b 0d 0b 0c 04 03 07 0f 13 00 63 08 0b 64 2c 0a 08 00 32 0c 02 04 00
+63 15 27 00 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 37 63 63 63 32 32 32 00 10
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..18
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 00 00 06 0e 2a 04 4f 08 0c 19 0f 10 06 0d 0a 01 4e 08 0b 0d 07 06 07 0f
+00 04 5e 08 0b 0e 06 06 08 0e 0a 05 60 08 04 74 20 1a 1b 00 21 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 38 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..18
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 06 0e 2a 01 4f 0d 0c 1f 0f 10 06 0d 0a 01 4e 08 0b 0d 07 06 07 0f
+00 00 5e 0d 0b 10 06 06 08 0e 0a 01 60 08 04 74 23 00 0b 00 22 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 38 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..19
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 06 05 06 0e 1e 02 51 08 14 18 03 07 06 08 14 03 51 08 04 0f 06 06 09 0f
+0a 04 47 13 0b 0c 05 06 08 0c 0a 0c 5f 08 03 52 21 27 21 00 21 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 39 63 63 63 32 32 32 00 30
+00 20 00 20 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violin..19
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 05 06 0e 1e 02 51 08 14 1f 0d 10 06 0e 14 01 51 08 04 0f 06 06 09 0f
+0a 00 47 13 0b 0f 05 06 08 0c 0a 01 5f 08 03 52 24 27 01 00 22 0c 06 04 00
+63 32 00 32 00 32 00 56 69 6f 6c 69 6e 2e 2e 31 39 63 63 63 32 32 32 00 00
+00 30 00 10 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: VIOLINS
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 00 00 04 0e 42 02 44 08 00 16 08 05 07 0d 19 03 49 08 0b 0f 08 10 07 0b
+01 04 4d 08 0e 0b 03 02 08 0f 13 05 5a 08 0a 68 20 19 2e 00 32 0c 0c 04 00
+63 32 32 00 00 32 00 20 56 49 4f 4c 49 4e 53 20 20 63 63 63 32 32 32 00 40
+00 20 00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: VIOLINS
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 04 0e 42 00 47 08 00 1e 08 05 07 0d 19 00 53 08 0b 1f 0f 10 07 0e
+01 04 49 19 0e 0f 03 02 08 0f 13 00 51 08 0a 68 23 00 0b 00 32 0c 0c 04 00
+63 32 32 00 00 32 00 20 56 49 4f 4c 49 4e 53 20 20 63 63 63 32 32 32 00 00
+00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violins..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 00 00 04 06 3c 01 4c 08 01 12 0f 06 06 06 09 02 40 0d 04 0b 07 06 06 06
+14 04 63 08 02 0b 09 00 05 06 28 04 62 08 03 2c 1e 18 3b 00 32 0c 0c 04 00
+63 32 32 00 00 32 00 56 69 6f 6c 69 6e 73 2e 2e 31 63 63 63 32 32 32 00 10
+00 40 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violins..1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 00 00 04 06 3c 00 4c 08 01 0f 0f 06 06 06 09 00 40 19 04 0c 07 06 06 06
+14 00 63 08 02 12 09 00 05 06 28 00 62 08 03 2c 21 0a 0f 00 32 00 0c 04 00
+63 32 32 00 00 32 00 56 69 6f 6c 69 6e 73 2e 2e 31 63 63 63 32 32 32 00 10
+00 40 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violins..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 06 00 07 0d 21 02 4e 08 05 13 0c 0c 05 0d 32 02 45 0d 04 0b 06 06 07 0e
+14 03 5d 08 04 0b 07 00 07 0d 1e 05 61 08 04 2c 20 2c 14 00 42 0c 0c 04 00
+63 32 32 00 00 32 00 56 69 6f 6c 69 6e 73 2e 2e 32 63 63 63 32 32 32 00 10
+00 40 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violins..2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 06 00 07 0d 21 00 4e 08 05 13 0c 0c 05 0d 32 00 45 19 04 0f 06 06 07 0e
+14 00 5d 08 04 0e 07 00 07 0d 1e 00 61 08 04 2c 20 2c 14 00 42 0c 0c 04 00
+63 32 32 00 00 32 00 56 69 6f 6c 69 6e 73 2e 2e 32 63 63 63 32 32 32 00 20
+00 20 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violins..3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 06 00 07 0d 21 01 46 08 05 12 0c 0c 05 0d 32 02 43 0d 04 0b 06 06 06 0e
+28 05 59 08 03 0b 07 00 07 0d 1e 04 61 08 04 6c 1e 27 34 00 32 0c 0c 04 00
+63 32 32 00 00 32 00 56 69 6f 6c 69 6e 73 2e 2e 33 63 63 63 32 32 32 00 00
+00 40 00 20 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violins..3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 06 00 07 0d 21 00 46 08 05 1f 0c 0c 05 0d 32 00 43 13 04 0c 06 06 06 0e
+28 00 59 08 03 10 07 00 07 0d 1e 00 61 08 04 6c 23 27 0c 00 32 0c 0c 04 00
+63 32 32 00 00 32 00 56 69 6f 6c 69 6e 73 2e 2e 33 63 63 63 32 32 32 00 00
+00 40 00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violins..4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 07 05 05 0e 41 01 50 08 05 0f 0c 0c 04 0c 33 02 57 19 05 0a 06 00 06 0e
+14 04 5b 08 01 0b 05 01 07 0e 11 04 52 08 00 6c 1f 1c 25 00 32 0c 03 04 01
+63 32 32 00 00 32 00 56 69 6f 6c 69 6e 73 2e 2e 34 63 63 63 32 32 32 00 40
+00 30 00 00 00 20 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Violins..4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 04 00 03 0e 41 01 57 08 05 0f 0c 0c 04 0c 33 02 57 19 05 0a 06 00 06 0e
+14 00 5b 08 01 0d 05 01 07 0e 11 00 52 08 00 6c 25 14 0f 00 32 0c 03 04 01
+63 32 32 00 00 32 00 56 69 6f 6c 69 6e 73 2e 2e 34 63 63 63 32 32 32 00 30
+00 30 00 00 00 20 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Other
+
+
+** Name: 8 Stringer
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 00 01 0e 00 01 3f 04 03 1f 0c 06 09 0e 00 02 56 0a 1b 1f 0c 02 08 0e
+00 05 41 1c 0b 1f 05 06 09 0e 00 04 63 04 13 22 21 13 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 38 20 53 74 72 69 6e 67 65 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: 8 Stringer
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 00 01 0e 00 01 3f 04 03 1f 0c 06 09 0e 00 01 56 0a 1b 1f 0c 02 08 0e
+00 01 41 1c 0b 1f 05 06 09 0e 00 00 63 04 13 22 21 13 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 38 20 53 74 72 69 6e 67 65 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0f 09 03 0c 2e 03 63 24 1a 1c 0f 09 06 0c 00 03 4c 13 0c 1c 0a 06 04 0c
+00 04 59 08 0a 0d 1c 06 06 0c 00 05 5d 0d 14 4d 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0f 09 03 0c 2e 00 63 24 1a 1c 0f 09 06 0c 00 00 4c 13 0c 1c 0a 06 04 0c
+00 00 59 08 0a 0d 1c 06 06 0c 00 00 5d 0d 14 4d 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 18 15 05 0d 2e 03 57 13 1b 1c 09 09 04 0d 00 03 55 04 09 1c 09 09 05 0d
+00 05 53 0d 0e 1c 0d 0f 05 0d 00 06 62 04 0c 75 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 18 15 05 0d 2e 00 57 13 1b 1c 09 09 04 0d 00 00 55 04 09 1c 09 09 05 0d
+00 00 53 0d 0e 1c 0d 0f 05 0d 00 00 62 04 0c 75 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 09 03 04 0c 00 04 3a 19 1b 1c 1c 09 04 0f 00 04 52 04 0b 1c 09 03 06 0c
+00 05 53 04 16 1c 1f 09 05 0f 00 06 62 04 14 65 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 09 03 04 0c 00 00 3a 19 1b 1c 1c 09 04 0f 00 00 52 04 0b 1c 09 03 06 0c
+00 00 53 04 16 1c 1f 09 05 0f 00 00 62 04 14 65 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 16 08 0d 00 03 63 0f 13 1f 0a 0a 07 0e 00 03 3e 04 0b 1b 13 06 0c 07
+00 06 47 16 0b 1f 0a 06 06 0d 00 05 5d 04 0b 4a 1f 00 00 00 12 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 16 08 0d 00 00 63 0f 13 1f 0a 0a 07 0e 00 00 3e 04 0b 1b 13 06 0c 07
+00 00 47 16 0b 1f 0a 06 06 0d 00 00 5d 04 0b 4a 1f 00 00 00 12 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.5
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 0c 09 05 0c 00 04 3d 1f 08 10 0c 03 09 0c 00 03 3e 08 0a 1f 15 06 05 0d
+00 46 63 13 08 1f 15 06 05 0d 00 06 63 04 0e 1c 15 21 11 27 26 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.5
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 0c 09 05 0c 00 00 3d 1f 08 10 0c 03 09 0c 00 00 3e 08 0a 1f 15 06 05 0d
+00 40 63 13 08 1f 15 06 05 0d 00 00 63 04 0e 1c 15 21 11 27 26 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.6
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 10 0d 03 0a 00 04 3b 0d 08 0f 0f 0d 03 0a 00 44 3c 0d 0a 1c 05 03 07 0d
+00 05 47 08 08 1c 05 03 07 0d 00 07 5d 08 0e 5c 23 3c 40 60 16 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.6
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 10 0d 03 0a 00 00 3b 0d 08 0f 0f 0d 03 0a 00 40 3c 0d 0a 1c 05 03 07 0d
+00 00 47 08 08 1c 05 03 07 0d 00 00 5d 08 0e 5c 23 3c 40 60 16 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.7
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 04 02 0d 00 43 4c 04 00 13 0c 12 09 0f 00 43 3c 04 02 15 12 1f 09 0f
+00 45 63 04 00 10 05 06 09 0e 00 45 5d 04 06 25 23 5a 01 02 46 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.7
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 04 02 0d 00 40 4c 04 00 13 0c 12 09 0f 00 40 3c 04 02 15 12 1f 09 0f
+00 40 63 04 00 10 05 06 09 0e 00 40 5d 04 06 25 23 5a 01 02 46 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 09 06 08 00 03 63 04 03 1c 1e 00 07 08 00 04 54 04 0b 1b 15 09 04 08
+00 05 5d 08 0b 1c 19 09 05 08 00 06 63 08 0b 7a 1f 00 00 00 12 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.8
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 09 06 08 00 00 63 04 03 1c 1e 00 07 08 00 00 54 04 0b 1b 15 09 04 08
+00 00 5d 08 0b 1c 19 09 05 08 00 00 63 08 0b 7a 1f 00 00 00 12 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.9
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 16 09 0f 0b 00 43 63 04 15 1c 09 06 03 0b 00 44 54 04 11 1f 09 04 0f 0e
+00 45 5a 08 13 1c 13 09 06 0b 00 47 63 08 0b 6c 19 2e 42 0f 36 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst.9
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 16 09 0f 0b 00 40 63 04 15 1c 09 06 03 0b 00 40 54 04 11 1f 09 04 0f 0e
+00 40 5a 08 13 1c 13 09 06 0b 00 40 63 08 0b 6c 19 2e 42 0f 36 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst10
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 16 18 0c 0b 00 41 47 0d 03 0f 0f 0d 06 0b 00 44 3c 0d 03 0d 0c 07 04 0d
+00 44 48 00 03 1c 12 07 07 0e 00 46 63 04 03 5a 19 2e 42 0f 36 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst10
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 16 18 0c 0b 00 40 47 0d 03 0f 0f 0d 06 0b 00 40 3c 0d 03 0d 0c 07 04 0d
+00 40 48 00 03 1c 12 07 07 0e 00 40 63 04 03 5a 19 2e 42 0f 36 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst11
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 18 0f 08 06 00 02 63 1c 03 1c 0c 1f 09 0a 00 42 4f 08 13 1f 06 0f 08 0f
+00 44 5c 04 08 1c 0a 09 09 0a 00 05 63 04 0e 2c 28 00 00 3f 26 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 31 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntInst11
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 0f 08 06 00 00 63 1c 03 1c 0c 1f 09 0a 00 40 4f 08 13 1f 06 0f 08 0f
+00 40 5c 04 08 1c 0a 09 09 0a 00 00 63 04 0e 2c 28 00 00 3f 26 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 49 6e 73 74 31 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Syamisen
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 18
+1a 0e 0f 06 06 0a 04 54 0a 13 17 12 12 07 0c 0a 04 59 10 13 18 06 00 04 0e
+00 02 40 04 13 17 0f 09 06 0a 00 03 63 08 13 5b 18 02 20 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 79 61 6d 69 73 65 6e 20 20 63 61 63 31 32 32 00 20
+00 30 00 70 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Syamisen
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 0e 0f 06 06 0a 04 54 0a 13 17 12 12 07 0c 0a 04 59 10 13 18 06 00 04 0e
+00 02 40 04 13 17 0f 09 06 0d 00 03 63 08 13 5b 18 02 20 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 79 61 6d 69 73 65 6e 20 20 63 61 63 31 32 32 00 20
+00 30 00 70 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Zither
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 8
+1f 0b 06 0a 0d 1e 01 57 10 0b 1f 1f 00 03 0f 22 01 51 04 03 1f 0c 03 0a 0a
+14 01 36 08 03 1f 18 06 08 0f 00 02 63 04 03 30 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 5a 69 74 68 65 72 20 20 20 20 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 11
+
+* CATEGORY KEYBOARDS
+
+
+* SUBCATEGORY Clavichord
+
+
+** Name: Clav Lead
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 00 09 0c 0f 03 4b 24 15 1e 1b 00 09 0d 0c 05 56 00 01 1d 01 00 0c 00
+2e 04 53 00 14 1e 1c 00 09 0c 00 04 63 00 15 3a 23 00 08 00 22 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 20 4c 65 61 64 20 63 63 63 32 32 32 00 00
+00 40 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav Lead
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 00 09 0c 0f 01 4b 24 15 1e 1b 00 09 0d 0c 01 56 00 01 1d 01 00 0c 00
+2e 01 53 00 14 1e 1c 00 09 0c 00 00 63 00 15 3a 23 00 08 00 22 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 20 4c 65 61 64 20 63 63 63 32 32 32 00 00
+00 40 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav Perc
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 0f 04 09 0c 0f 03 5b 00 0a 1a 0f 04 09 0d 0c 04 63 00 13 1f 0a 04 0c 00
+2e 06 58 00 0e 19 0f 05 09 0c 00 05 63 04 10 3a 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 20 50 65 72 63 20 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav Perc
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 0f 04 09 0c 0f 01 5b 00 0a 1a 0f 04 09 0d 0c 01 63 00 13 1f 0a 04 0c 00
+2e 01 58 00 0e 19 0f 05 09 0c 00 00 63 04 10 3a 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 20 50 65 72 63 20 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav Synth
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 04 09 0c 0f 03 5e 0d 16 1e 04 04 09 0d 0c 04 5f 00 03 1e 03 04 0c 00
+2e 04 55 00 13 1e 15 05 09 0c 00 06 63 0d 13 3a 23 1a 0f 00 32 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 20 53 79 6e 74 68 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav Synth
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 04 09 0c 0f 01 5e 0d 16 1e 04 04 09 0d 0c 01 5f 00 03 1e 03 04 0c 00
+2e 01 55 00 13 1e 15 05 09 0c 00 00 63 0d 13 3a 23 1a 0f 00 32 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 20 53 79 6e 74 68 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0b 08 0f 09 10 01 42 13 0b 1f 0c 08 05 0f 00 04 5c 00 03 1f 10 05 06 0f
+5e 04 52 00 13 1c 14 08 0c 0e 00 03 63 04 0b 28 23 00 00 00 62 18 02 04 00
+63 32 00 32 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0b 08 0f 09 10 01 42 13 0b 1f 0c 08 05 0f 00 02 5c 00 03 1f 10 05 06 0f
+5e 02 52 00 13 1c 14 08 0c 0e 00 00 63 04 0b 28 23 00 00 00 62 18 02 04 00
+63 32 00 32 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 05 09 0c 0f 01 43 0d 15 1e 1b 01 09 0d 0c 03 5f 00 01 1d 01 01 0c 00
+2e 04 51 16 14 1e 1c 05 09 0c 00 03 63 00 13 1b 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 05 09 0c 0f 01 43 0d 15 1e 1b 01 09 0d 0c 01 5f 00 01 1d 01 01 0c 00
+2e 01 51 16 14 1e 1c 05 09 0c 00 00 63 00 13 1b 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 05 01 0c 20 01 54 04 15 17 1a 01 01 0d 09 03 54 04 04 1d 01 01 01 00
+32 03 44 1f 0c 18 1b 05 07 0c 02 03 63 08 13 3a 23 00 00 00 02 18 05 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 10
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 05 01 0c 20 01 54 04 15 17 1a 01 01 0d 09 01 54 04 04 1d 01 01 01 00
+32 01 44 1f 0c 18 1b 05 07 0c 02 00 63 08 13 3a 23 00 00 00 02 18 05 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 10
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 15 0a 01 00 20 01 61 00 15 17 09 0f 01 00 09 04 53 00 02 1d 01 0b 01 00
+32 03 3e 1f 16 19 1b 06 09 0e 02 04 62 08 09 3a 23 00 00 00 02 18 02 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 15 0a 01 00 20 01 61 00 15 17 09 0f 01 00 09 02 53 00 02 1d 01 0b 01 00
+32 01 3e 1f 16 19 1b 06 09 0e 02 00 62 08 09 3a 23 00 00 00 02 18 02 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 10 07 08 0c 00 01 51 16 1d 19 19 06 09 0e 00 03 57 00 0a 1c 10 07 08 0c
+00 03 63 00 1b 19 19 06 09 0e 00 03 62 08 09 3c 1e 00 00 00 22 18 02 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 10 07 08 0c 00 01 51 16 1d 19 19 06 09 0e 00 01 57 00 0a 1c 10 07 08 0c
+00 01 63 00 1b 19 19 06 09 0e 00 00 62 08 09 3c 1e 00 00 00 22 18 02 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 10 07 05 0c 00 01 4e 39 1d 19 19 06 09 0e 00 03 5a 00 0a 1c 05 07 05 0c
+00 03 5d 0d 1b 19 19 06 09 0e 00 06 62 08 09 3c 1e 00 00 00 22 18 02 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 10 07 05 0c 00 01 4e 39 1d 19 19 06 09 0e 00 01 5a 00 0a 1c 05 07 05 0c
+00 01 5d 0d 1b 19 19 06 09 0e 00 00 62 08 09 3c 1e 00 00 00 22 18 02 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 01 02 04 07 35 00 35 24 0d 17 09 0f 01 00 09 04 53 00 02 1d 01 0b 01 00
+32 04 39 08 16 19 1b 06 09 0e 02 06 63 00 09 02 23 00 00 00 02 18 02 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 40 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 01 02 04 07 35 00 35 24 0d 17 09 0f 01 00 09 01 53 00 02 1d 01 0b 01 00
+32 00 39 08 16 19 1b 06 09 0e 02 01 63 00 09 02 23 00 00 00 02 18 02 04 00
+63 32 32 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 40 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 05 09 0c 0f 01 4c 16 15 1e 1b 01 09 0d 0c 05 53 00 01 1d 01 01 0c 00
+2e 05 59 00 14 1e 1c 05 09 0c 00 05 63 08 13 1a 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....8
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 05 09 0c 0f 01 4c 16 15 1e 1b 01 09 0d 0c 01 53 00 01 1d 01 01 0c 00
+2e 01 59 00 14 1e 1c 05 09 0c 00 00 63 08 13 1a 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....9
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 05 09 0c 0f 03 52 0d 15 1e 1b 01 09 0d 0c 05 63 04 01 1d 01 01 0c 00
+2e 04 62 04 14 1e 1c 05 09 0c 00 05 63 04 13 1c 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 39 63 63 63 32 32 32 00 00
+00 40 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clav.....9
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 05 09 0c 0f 00 52 0d 15 1e 1b 01 09 0d 0c 01 63 04 01 1d 01 01 0c 00
+2e 01 62 04 14 1e 1c 05 09 0c 00 01 63 04 13 1c 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 43 6c 61 76 2e 2e 2e 2e 2e 39 63 63 63 32 32 32 00 00
+00 40 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clavi
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 16
+1f 01 00 0f 00 00 04 4d 13 10 1f 0c 01 01 0a 00 02 54 00 09 1f 06 01 01 0e
+23 03 4f 10 0e 1f 00 0a 0f 0f 00 03 58 08 0a 3a 1c 00 00 00 52 18 02 04 00
+63 32 00 32 00 32 00 43 6c 61 76 69 20 20 20 20 20 63 63 63 32 32 32 00 20
+00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Clavi
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 01 00 0f 00 00 04 4d 13 10 1f 0c 01 01 0d 00 02 54 00 09 1f 06 01 01 0e
+23 03 4f 10 0e 1f 00 0a 0f 0f 00 03 58 08 0d 3a 1c 00 00 00 52 18 02 04 00
+63 32 00 32 00 32 00 43 6c 61 76 69 20 20 20 20 20 63 63 63 32 32 32 00 20
+00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EZ Clav
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 26
+1f 0b 08 0f 09 10 04 42 2d 13 1f 09 08 05 0f 00 02 49 00 03 1f 12 05 06 0f
+10 03 46 10 03 1f 14 08 0c 0e 00 02 63 04 0b 30 1b 00 00 00 52 18 04 04 00
+63 32 00 00 00 32 00 45 5a 20 43 6c 61 76 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fuzz Clavi
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 27
+1e 1c 05 09 0c 0f 01 56 24 15 1e 1b 01 09 0d 0c 04 61 00 01 1d 01 01 0c 00
+2e 02 4d 0d 14 1e 1c 05 09 0c 00 01 63 0a 13 33 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 46 75 7a 7a 20 43 6c 61 76 69 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Klavinet *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 06 06 06 0e 00 00 52 04 0e 1d 07 09 07 0e 00 04 4d 04 00 1d 09 06 06 0e
+10 02 50 1f 16 1b 0a 07 0a 0e 00 02 63 08 0b 02 23 00 00 00 32 0c 02 04 00
+28 63 00 00 00 32 00 4b 6c 61 76 69 6e 65 74 20 2a 63 63 63 32 32 32 00 30
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Clav
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1c 05 01 0c 20 02 4e 2a 15 17 1a 01 01 0d 09 02 4b 04 04 1d 01 01 01 00
+32 04 39 04 0c 18 1b 05 07 0c 02 05 63 08 13 3a 23 00 00 00 02 18 05 04 00
+63 32 32 00 00 32 00 4f 72 6e 74 20 43 6c 61 76 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Clav
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1c 05 01 0c 20 00 4e 2a 15 17 1a 01 01 0d 09 00 4b 04 04 1d 01 01 01 00
+32 00 39 04 0c 18 1b 05 07 0c 02 00 63 08 13 3a 23 00 00 00 02 18 05 04 00
+63 32 32 00 00 32 00 4f 72 6e 74 20 43 6c 61 76 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Clav
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1e 1c 05 00 0c 20 00 4e 2a 15 17 1a 01 00 0d 09 00 4b 04 04 1d 01 01 00 00
+32 00 39 04 0c 18 1b 05 07 0c 02 00 63 08 13 3a 23 00 00 00 02 18 05 04 00
+63 32 32 00 00 32 00 4f 72 6e 74 20 43 6c 61 76 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rimbaclav
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 10 00 05 00 00 00 4c 28 03 1f 12 00 04 00 00 00 43 16 03 1f 0d 00 05 00
+00 00 45 16 03 1f 07 00 06 08 00 00 63 04 03 03 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 52 69 6d 62 61 63 6c 61 76 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SplashClav
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 21
+13 18 14 0a 0c 00 00 61 04 03 10 02 01 0a 0c 00 00 5c 1c 03 1c 0b 04 0a 0c
+00 00 41 28 03 1b 0e 10 0a 0c 00 03 63 04 03 3a 55 00 39 00 42 0c 04 04 00
+28 32 00 00 00 32 00 53 70 6c 61 73 68 43 6c 61 76 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synclav. *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 09 07 05 0f 00 02 51 0d 0b 1f 0c 06 02 00 00 00 57 10 0e 17 06 05 05 0d
+00 00 63 04 08 1f 09 0f 06 00 00 03 5a 19 0e 2c 23 00 00 00 32 0c 02 04 00
+28 63 00 00 00 32 00 53 79 6e 63 6c 61 76 2e 20 2a 63 63 63 32 32 32 00 40
+00 00 00 30 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Thin Clav
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 25
+1f 0b 07 0f 09 00 04 49 13 13 1f 08 07 05 0e 00 02 58 00 0c 1f 06 04 06 0f
+23 03 46 10 0a 1f 07 08 0c 0d 00 02 63 08 0b 02 1c 00 00 00 52 18 04 04 00
+63 32 00 32 00 32 00 54 68 69 6e 20 43 6c 61 76 20 63 63 63 32 32 32 00 70
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Harpsichord
+
+
+** Name: Harpschrd2
+** Description: DX11 factory preset 'Harpsichrd' with slower decay
+** Source: Art Hitzeman
+1a 13 00 01 0d 0a 00 5b 0a 11 0f 10 00 01 0d 00 00 5d 00 1d 17 08 06 04 0c
+00 00 4c 04 16 17 08 06 05 0c 00 00 58 0d 14 1c 1f 00 00 00 52 18 02 04 00
+63 32 32 00 00 32 00 48 61 72 70 73 63 68 72 64 32 63 63 63 32 32 32 00 40
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harpschrd3
+** Description: 'Harpschrd2' with minor changes
+** Source: Art Hitzeman
+1a 13 00 01 0d 0a 00 5b 05 11 0f 10 00 01 0d 00 00 5d 00 1d 17 08 06 04 0c
+00 00 4c 00 16 17 08 06 05 0c 00 00 58 0d 14 1c 1f 00 00 00 52 18 02 04 00
+63 32 32 00 00 32 00 48 61 72 70 73 63 68 72 64 33 63 63 63 32 32 32 00 41
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harpsichrd
+** Source: Yamaha DX11 factory preset, bank B, voice 15
+1a 13 00 01 0a 0a 00 5b 0a 11 0f 10 00 01 0a 00 00 5d 00 1d 17 08 06 07 0c
+00 00 4c 04 16 17 08 06 07 0c 00 00 58 0a 14 1c 1f 00 00 00 52 18 02 04 00
+63 32 32 00 00 32 00 48 61 72 70 73 69 63 68 72 64 63 63 63 32 32 32 00 40
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harpsichrd
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 13 00 01 0d 0a 00 5b 0a 11 0f 10 00 01 0d 00 00 5d 00 1d 17 08 06 07 0c
+00 00 4c 04 16 17 08 06 07 0c 00 00 58 0d 14 1c 1f 00 00 00 52 18 02 04 00
+63 32 32 00 00 32 00 48 61 72 70 73 69 63 68 72 64 63 63 63 32 32 32 00 40
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hrpsicord1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1d 01 06 0c 29 00 57 04 1b 1f 19 03 04 0d 00 03 5b 04 03 1f 1f 05 09 0d
+00 06 3f 0d 13 1f 1a 01 07 0d 00 05 63 0d 1b 32 23 00 00 00 62 18 00 04 00
+63 32 00 00 00 32 00 48 72 70 73 69 63 6f 72 64 31 63 63 63 32 32 32 00 20
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hrpsicord1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1d 01 06 0c 29 01 57 04 1b 1f 19 03 04 0d 00 00 5b 04 03 1f 1f 05 09 0d
+00 00 3f 0d 13 1f 1a 01 07 0d 00 02 63 0d 1b 32 23 00 00 00 62 18 00 04 00
+63 32 00 00 00 32 00 48 72 70 73 69 63 6f 72 64 31 63 63 63 32 32 32 00 20
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hrpsicord2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 11 00 01 0d 00 00 5b 04 1c 1c 18 00 01 0d 00 00 5b 00 0c 17 08 05 06 0c
+00 05 60 00 11 1c 18 05 06 0d 00 04 60 0d 12 0c 23 00 00 00 02 24 00 04 00
+63 32 00 00 00 32 00 48 72 70 73 69 63 6f 72 64 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hrpsicord2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 11 00 01 0d 00 00 5b 04 1c 1c 18 00 01 0d 00 00 5b 00 0c 17 08 05 06 0c
+00 01 60 00 11 1c 18 05 06 0d 00 01 60 0d 12 0c 23 00 00 00 02 24 00 04 00
+63 32 00 00 00 32 00 48 72 70 73 69 63 6f 72 64 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hrpsicord3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1d 01 01 0d 0f 02 5a 00 1b 1f 17 03 01 0d 00 02 57 04 03 1f 1c 05 09 0d
+00 05 42 13 0b 1f 1c 01 05 0d 00 06 63 0d 1b 2a 23 00 00 00 62 18 00 04 00
+63 32 00 00 00 32 00 48 72 70 73 69 63 6f 72 64 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hrpsicord3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1d 01 01 0d 0f 02 5a 00 1b 1f 17 03 01 0d 00 00 57 04 03 1f 1c 05 09 0d
+00 00 42 13 0b 1f 1c 01 05 0d 00 01 63 0d 1b 2a 23 00 00 00 62 18 00 04 00
+63 32 00 00 00 32 00 48 72 70 73 69 63 6f 72 64 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LiteHarpsi
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 28
+1f 1d 00 01 0c 00 00 54 04 1b 1f 13 01 01 0f 00 01 4c 04 03 1f 1f 01 09 0f
+21 01 4d 19 13 1f 1e 06 07 0d 00 00 5d 0d 13 32 1c 00 00 00 62 18 02 04 00
+63 32 00 00 00 32 00 4c 69 74 65 48 61 72 70 73 69 63 63 63 32 32 32 00 00
+30 00 30 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RichHarpsi
+** Source: Yamaha TX81Z factory preset, bank A, voice 29
+1a 13 00 01 0d 00 00 5b 0a 11 0f 10 00 01 0d 00 00 5d 00 1d 17 08 06 05 0c
+00 00 5e 04 16 17 08 06 05 0c 00 00 56 0d 14 1c 23 00 00 00 02 18 04 04 00
+63 32 32 00 00 32 00 52 69 63 68 48 61 72 70 73 69 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 12
+
+* SUBCATEGORY Organ1
+
+
+** Name: 16 8 4 2 F
+** Source: Yamaha TX81Z factory preset, bank A, voice 18
+1f 1f 00 0f 0f 00 00 5a 19 06 1f 1f 00 0f 0f 00 00 5a 08 03 1f 1f 00 0f 0f
+00 00 5a 0d 04 1f 1f 00 0f 0f 00 00 5a 04 00 07 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 31 36 20 38 20 34 20 32 20 46 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <6 Tease>
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 20
+1f 00 00 0a 0f 1b 00 3f 0d 03 1f 00 00 0a 0f 00 00 63 08 03 1f 00 00 0a 0f
+00 00 5e 0d 03 1f 00 00 0a 0f 00 00 63 04 03 3e 23 00 27 00 42 0c 07 04 00
+63 63 00 63 00 32 00 3c 36 20 54 65 61 73 65 3e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnalogOrgn
+** Controls: MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 24
+1f 1b 00 0f 0d 09 00 57 05 06 1f 1c 00 0f 0d 09 00 57 04 01 1e 01 00 0f 0d
+0a 00 5f 05 06 1e 01 00 0f 0d 0a 00 5f 04 01 04 1c 15 07 00 52 05 04 04 00
+63 32 00 00 00 32 00 41 6e 61 6c 6f 67 4f 72 67 6e 63 63 63 32 32 32 00 01
+00 08 00 01 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: B3 Organ.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 06 0d 0f 00 03 55 2a 04 1f 13 06 0d 0f 00 05 63 08 04 1f 18 06 0d 0f
+00 04 62 0d 04 1f 06 06 0d 0f 00 05 63 00 04 07 28 00 0a 2c 12 0c 07 04 00
+63 63 00 00 00 32 00 42 33 20 4f 72 67 61 6e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: B3 Organ.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 06 0d 0f 00 00 55 2a 04 1f 13 06 0d 0f 00 01 63 08 04 1f 18 06 0d 0f
+00 01 62 0d 04 1f 06 06 0d 0f 00 01 63 00 04 07 28 00 0a 2c 12 0c 07 04 00
+63 63 00 00 00 32 00 42 33 20 4f 72 67 61 6e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: B3 Organ.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 16 05 0d 0f 00 02 3e 08 04 1f 1f 1f 0d 0f 00 04 63 0d 04 1f 1f 02 0d 0f
+00 05 63 04 04 1f 1f 07 0d 0f 00 03 63 08 04 04 28 00 0a 2c 22 18 07 04 00
+63 63 00 00 00 32 00 42 33 20 4f 72 67 61 6e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: B3 Organ.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 16 05 0d 0f 00 00 3e 08 04 1f 1f 1f 0d 0f 00 00 63 0d 04 1f 1f 02 0d 0f
+00 01 63 04 04 1f 1f 07 0d 0f 00 00 63 08 04 04 28 00 0a 2c 22 18 07 04 00
+63 63 00 00 00 32 00 42 33 20 4f 72 67 61 6e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: B3 Organ.3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 10 04 0d 0f 00 02 52 08 04 1f 1f 04 0d 0f 00 04 63 08 04 1f 1f 03 0d 0f
+0a 03 63 08 14 1f 1f 03 0d 0f 00 04 63 04 04 06 21 00 00 00 22 0c 07 04 00
+63 63 00 00 00 32 00 42 33 20 4f 72 67 61 6e 2e 33 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: B3 Organ.3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 10 04 0d 0f 00 00 52 08 04 1f 1f 04 0d 0f 00 01 63 08 04 1f 1f 03 0d 0f
+0a 01 63 08 14 1f 1f 03 0d 0f 00 01 63 04 04 06 21 00 00 00 22 0c 07 04 00
+63 63 00 00 00 32 00 42 33 20 4f 72 67 61 6e 2e 33 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Big Church
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 23
+16 00 00 0a 0f 00 01 47 1f 03 18 00 00 05 0f 5b 02 61 00 10 0f 00 00 08 0f
+00 00 63 08 10 0c 00 00 05 0f 00 00 63 00 16 3c 1d 00 00 00 42 0c 04 04 00
+63 32 00 00 00 32 00 42 69 67 20 43 68 75 72 63 68 63 63 63 32 32 32 00 00
+00 70 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ChurchOrg*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 1f 00 0a 0f 00 42 47 1f 0e 10 1f 00 08 0f 00 40 60 0d 0e 10 1f 00 07 0f
+00 40 63 08 08 0b 1f 00 05 0f 14 40 63 04 10 3e 0c 0f 00 00 3a 0c 02 04 00
+28 00 1b 00 00 32 00 43 68 75 72 63 68 4f 72 67 2a 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ClosedFlut
+** Description: A Closed Flute organ stop
+** Source: Art Hitzeman
+12 1f 00 07 0f 19 00 59 04 03 10 1f 00 06 0f 19 00 43 10 03 17 1f 00 07 0f
+19 00 5a 0a 03 0e 1f 00 06 0f 19 00 20 16 03 07 23 01 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 43 6c 6f 73 65 64 46 6c 75 74 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cornopean
+** Description: An organ stop
+** Controls: MW (LFO pitch)
+** Source: Art Hitzeman
+12 1f 00 07 0f 19 00 58 00 03 10 1f 00 06 0f 19 00 5a 04 03 17 1f 00 07 0f
+19 00 5a 04 03 0e 1f 00 06 0f 19 00 5a 04 03 47 23 01 06 00 41 18 02 04 00
+28 32 00 00 00 32 00 43 6f 72 6e 6f 70 65 61 6e 20 63 63 63 32 32 32 00 00
+00 40 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DistortOrg
+** Controls: KV, MW (LFO pitch), BC (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 00 08 0f 00 27 42 03 1a 10 1b 00 08 06 0f 00 51 08 10 15 0a 00 08 0f
+1b 1b 52 04 1e 12 1b 00 0b 0e 00 02 63 05 00 3b 23 00 01 00 52 11 02 05 00
+63 32 00 05 00 32 3c 44 69 73 74 6f 72 74 4f 72 67 63 63 63 32 32 32 20 26
+10 04 10 78 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Drawbar1 *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 1f 00 09 0f 32 40 5a 19 03 17 1f 00 09 0f 1e 40 63 0a 03 17 1f 00 09 0f
+28 40 51 0d 03 17 1f 00 09 0f 14 40 5d 00 03 07 23 00 00 00 1a 18 02 04 00
+28 63 30 00 00 32 00 44 72 61 77 62 61 72 31 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Drawbar2 *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 1f 00 09 0f 2f 40 4b 13 03 17 1f 00 09 0f 19 40 53 08 03 17 1f 00 09 0f
+2c 40 51 10 03 17 1f 00 09 0f 0a 40 63 04 03 07 23 00 00 00 1a 18 02 04 00
+28 63 30 00 00 32 00 44 72 61 77 62 61 72 32 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Dyno *
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0e 0f 0e 09 00 05 49 2b 08 1f 0f 05 07 0f 18 42 5a 00 06 1f 12 06 08 0d
+00 02 63 00 06 1f 12 06 08 0f 00 02 63 04 00 34 14 00 01 02 4e 18 02 04 00
+63 32 00 32 00 32 00 44 79 6e 6f 20 20 20 20 20 2a 63 63 63 32 32 32 00 70
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DynoWurlie
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 14
+1f 1c 04 07 0a 00 03 4e 25 1e 16 07 03 07 0b 00 03 52 0d 10 1f 13 08 06 08
+00 02 5c 3c 0e 1f 04 03 07 0e 00 02 63 04 13 7c 18 03 10 0c 32 0c 02 04 00
+63 32 00 00 00 32 00 44 79 6e 6f 57 75 72 6c 69 65 63 63 63 32 32 32 1b 70
+00 00 09 0f 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 1f 03 0f 0f 26 05 49 04 03 1f 1f 03 0f 0f 14 05 5a 08 03 1f 1f 03 0f 0f
+50 05 59 0a 03 1f 1f 03 0f 0f 19 04 5b 00 03 76 23 0e 16 00 22 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 31 63 63 63 32 32 32 00 20
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 1f 03 0f 0f 26 00 49 04 03 1f 1f 03 0f 0f 14 00 5a 08 03 1f 1f 03 0f 0f
+50 00 59 0a 03 1f 1f 03 0f 0f 19 00 5b 00 03 76 23 0e 16 00 22 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 31 63 63 63 32 32 32 00 20
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 1f 03 0f 0f 26 05 2a 19 02 1f 1f 03 0f 0f 14 05 5a 0d 04 1f 1f 03 0f 0f
+50 05 59 0d 01 1f 1f 03 0f 0f 19 05 63 0d 02 75 1c 00 19 00 22 00 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 1f 03 0f 0f 26 00 2a 19 02 1f 1f 03 0f 0f 14 00 5a 0d 04 1f 1f 03 0f 0f
+50 00 59 0d 01 1f 1f 03 0f 0f 19 00 63 0d 02 75 1c 00 19 00 22 00 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 16 03 08 0f 00 06 4c 0d 02 1f 1f 03 0c 0f 14 05 5c 0d 04 1f 1f 1f 0c 0f
+00 05 63 04 01 1f 1f 02 0c 0f 19 05 63 04 02 06 23 00 0e 00 32 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 16 03 08 0f 00 00 4c 0d 02 1f 1f 03 0c 0f 14 00 5c 0d 04 1f 1f 1f 0c 0f
+00 00 63 04 01 1f 1f 02 0c 0f 19 00 63 04 02 06 23 00 0e 00 32 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 16 00 08 0f 00 44 55 08 03 1f 1f 00 0c 0f 14 03 5c 0a 00 1f 1f 00 0c 0f
+00 06 50 08 06 1f 1f 00 0c 0f 19 05 63 00 06 46 0e 00 47 4e 16 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 34 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 16 00 08 0f 00 40 55 08 03 1f 1f 00 0c 0f 14 00 5c 0a 00 1f 1f 00 0c 0f
+00 00 50 08 06 1f 1f 00 0c 0f 19 00 63 00 06 46 0e 00 47 4e 16 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 34 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 16 00 08 0f 00 05 5a 04 0e 1b 1f 00 0c 0f 14 02 56 08 00 1f 1f 00 0c 0f
+00 06 57 08 03 17 1f 00 0c 0f 19 05 63 00 06 47 0e 00 47 00 22 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 35 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..5
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 16 00 08 0f 00 00 5a 04 0e 1b 1f 00 0c 0f 14 00 56 08 00 1f 1f 00 0c 0f
+00 00 57 08 03 17 1f 00 0c 0f 19 00 63 00 06 47 0e 00 47 00 22 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 35 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0c 0f 00 04 41 08 0b 1f 1f 07 0c 0f 14 05 5c 08 03 1b 12 1f 0c 0f
+00 05 50 0d 03 1c 1f 00 0c 0f 19 05 63 00 03 05 00 00 00 00 02 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..6
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 0c 0f 00 00 41 08 0b 1f 1f 07 0c 0f 14 00 5c 08 03 1b 12 1f 0c 0f
+00 00 50 0d 03 1c 1f 00 0c 0f 19 00 63 00 03 05 00 00 00 00 02 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 03 0d 0f 00 03 51 00 08 1f 18 15 0a 0f 14 03 63 04 05 1b 12 06 0c 0f
+00 06 63 08 06 1c 1f 06 0c 0f 19 05 63 04 06 07 21 00 0d 00 32 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 37 63 63 63 32 32 32 00 00
+00 20 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..7
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 03 0d 0f 00 00 51 00 08 1f 18 15 0a 0f 14 00 63 04 05 1b 12 06 0c 0f
+00 00 63 08 06 1c 1f 06 0c 0f 19 00 63 04 06 07 21 00 0d 00 32 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 37 63 63 63 32 32 32 00 00
+00 20 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 03 0d 0f 63 05 63 13 0b 1f 18 15 0a 0f 14 05 63 04 03 1b 12 06 0c 0f
+00 04 63 04 03 1c 1f 06 0c 0f 19 05 63 00 03 07 27 00 0d 00 42 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..8
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 03 0d 0f 63 00 63 13 0b 1f 18 15 0a 0f 14 00 63 04 03 1b 12 06 0c 0f
+00 00 63 04 03 1c 1f 06 0c 0f 19 00 63 00 03 07 27 00 0d 00 42 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..9
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 00 09 0f 00 03 41 16 03 1f 1f 00 0a 0f 00 05 47 04 03 1f 1f 00 09 0f
+00 05 14 0a 03 1f 1f 00 09 0f 00 05 5a 04 03 40 23 00 06 00 52 18 04 04 00
+28 32 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 39 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ..9
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 00 09 0f 00 00 41 16 03 1f 1f 00 0a 0f 00 00 47 04 03 1f 1f 00 09 0f
+00 00 14 0a 03 1f 1f 00 09 0f 00 00 5a 04 03 40 23 00 06 00 52 18 04 04 00
+28 32 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 2e 39 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ.10
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 04 0d 0f 63 03 46 0a 03 1f 1f 04 0c 0f 00 05 63 08 03 1f 1f 03 0d 0f
+63 05 63 04 03 1f 1f 01 0d 0f 00 05 63 04 03 2d 2e 00 22 00 12 0c 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 31 30 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ.10
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 04 0d 0f 63 00 46 0a 03 1f 1f 04 0c 0f 00 00 63 08 03 1f 1f 03 0d 0f
+63 00 63 04 03 1f 1f 01 0d 0f 00 00 63 04 03 2d 2e 00 22 00 12 0c 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 31 30 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ.11
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 00 09 0f 63 03 4d 04 03 1f 1f 00 0a 0f 10 06 41 04 02 1f 1f 00 09 0f
+00 05 35 04 03 1f 1f 00 09 0f 01 05 5a 04 04 43 23 00 06 00 52 18 04 04 00
+28 32 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 31 31 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ.11
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 00 09 0f 63 00 4d 04 03 1f 1f 00 0a 0f 10 00 41 04 02 1f 1f 00 09 0f
+00 00 35 04 03 1f 1f 00 09 0f 01 00 5a 04 04 43 23 00 06 00 52 18 04 04 00
+28 32 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 31 31 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ.12
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 03 0d 0f 63 04 44 0a 0b 04 15 03 07 0f 14 05 63 00 03 1b 12 06 0c 0f
+00 05 63 04 03 19 15 0a 09 0f 19 05 5d 04 04 44 1d 00 0d 00 32 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 31 32 63 63 63 32 32 32 00 00
+00 10 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ.12
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 03 0d 0f 63 00 44 0a 0b 04 15 03 07 0f 14 00 63 00 03 1b 12 06 0c 0f
+00 00 63 04 03 19 15 0a 09 0f 19 00 5d 04 04 44 1d 00 0d 00 32 18 00 04 00
+63 00 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 31 32 63 63 63 32 32 32 00 00
+00 10 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ.13
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 00 09 0f 00 04 2d 08 03 1f 1f 00 0a 0f 00 05 47 00 03 1a 1f 02 09 0f
+00 05 2a 0a 03 1a 1f 02 09 0f 00 05 5f 04 03 42 23 00 06 00 42 18 04 04 00
+28 32 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 31 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Organ.13
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 00 09 0f 00 00 2d 08 03 1f 1f 00 0a 0f 00 00 47 00 03 1a 1f 02 09 0f
+00 00 2a 0a 03 1a 1f 02 09 0f 00 00 5f 04 03 42 23 00 06 00 42 18 04 04 00
+28 32 00 00 00 32 00 45 20 4f 72 67 61 6e 2e 31 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Organ 1
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 26
+1f 0b 01 0f 08 18 40 5f 0a 0e 1f 1f 00 0e 0f 00 40 5f 04 06 1f 1f 00 0e 0f
+00 40 63 05 00 1f 1f 00 0e 0f 00 40 5f 00 08 1f 20 00 03 00 5a 18 02 04 00
+63 32 32 00 00 32 00 45 2e 4f 72 67 61 6e 20 20 31 63 63 63 32 32 32 00 00
+00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Organ 2
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 27
+1f 0a 00 0b 0a 20 40 43 04 03 1f 1f 00 0c 0f 1a 00 5f 08 06 1f 09 00 0c 0f
+08 00 5d 04 03 1f 1f 00 0c 0f 00 00 5f 0a 00 26 23 00 01 2a 42 0c 02 04 00
+28 32 00 00 00 32 00 45 2e 4f 72 67 61 6e 20 20 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Organ 2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 00 0b 0d 20 40 43 04 03 1f 1f 00 0c 0f 1a 00 5f 08 06 1f 09 00 0c 0f
+08 00 5d 04 03 1f 1f 00 0c 0f 00 00 5f 0a 00 26 23 00 01 2a 42 0c 02 04 00
+28 32 00 00 00 32 00 45 2e 4f 72 67 61 6e 20 20 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Organ 3
+** Source: Yamaha DX11 factory preset, bank C, voice 28
+1f 14 00 0f 0a 00 40 5e 0a 01 1f 1f 00 0f 0a 00 40 5c 04 00 1f 1f 00 0f 0a
+00 40 63 08 05 1f 1f 00 0f 0a 00 40 63 04 06 2f 21 00 00 15 4a 18 02 04 00
+28 32 00 00 00 32 00 45 2e 4f 72 67 61 6e 20 20 33 63 63 63 32 32 32 00 00
+00 00 00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Organ 3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 14 00 0f 0d 00 40 5e 0a 01 1f 1f 00 0f 0d 00 40 5c 04 00 1f 1f 00 0f 0d
+00 40 63 08 05 1f 1f 00 0f 0d 00 40 63 04 06 2f 21 00 00 15 4a 18 02 04 00
+28 32 00 00 00 32 00 45 2e 4f 72 67 61 6e 20 20 33 63 63 63 32 32 32 00 00
+00 00 00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Organ 4
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank C, voice 29
+14 00 00 06 0f 1b 00 55 08 00 15 00 00 06 0f 00 00 56 08 06 18 01 00 07 0f
+00 00 5c 08 00 17 01 00 06 0f 00 00 63 04 06 3f 23 00 19 00 52 0c 02 04 00
+63 32 00 63 00 32 00 45 2e 4f 72 67 61 6e 20 20 34 63 63 63 32 32 32 00 00
+00 40 00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Farcheeza
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 21
+1f 00 00 0b 0f 1b 00 5a 13 03 1f 00 00 0b 0f 00 00 63 08 03 1f 00 00 0b 0f
+00 00 63 0d 03 1f 00 00 0b 0f 00 00 63 04 03 3f 23 00 12 00 42 0c 07 04 00
+63 32 00 63 00 32 00 46 61 72 63 68 65 65 7a 61 20 63 63 63 32 32 32 00 40
+00 50 00 50 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond *
+** Controls: MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 00 0c 00 1c 40 61 0e 03 1c 19 00 0b 0f 14 40 63 04 06 1c 10 00 0c 0f
+15 40 63 08 00 1c 06 00 0c 0f 14 40 63 00 03 2f 25 00 03 0b 3a 11 02 04 00
+28 0b 40 00 00 32 00 48 61 6d 6d 6f 6e 64 20 20 2a 63 63 63 32 32 32 00 03
+00 08 00 04 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+--Bank 13
+
+** Name: Hammond..1
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+02 04 10 0a 05 00 22 52 04 13 1f 08 00 0d 0c 12 26 3d 0d 03 04 1f 00 0d 0f
+0d 5d 46 04 1b 16 1f 00 0d 0f 00 7c 5f 04 03 41 23 0e 10 10 46 18 05 04 00
+63 63 63 00 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..1
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+02 04 10 0a 05 00 22 52 04 13 1f 08 00 0d 0c 12 21 3d 0d 03 04 1f 00 0d 0f
+0d 59 46 04 1b 16 1f 00 0d 0f 00 78 5f 04 03 41 23 0e 10 10 46 18 05 04 00
+63 63 63 00 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 1f 00 0a 0b 19 03 4a 04 03 1f 1a 00 0d 0c 52 03 46 04 1a 1f 1f 00 0d 0f
+19 06 46 04 12 1b 1e 00 09 0f 63 05 5b 08 03 03 25 00 07 00 31 0c 02 04 00
+63 32 00 00 01 32 00 48 61 6d 6d 6f 6e 64 2e 2e 32 63 63 63 32 32 32 00 20
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 1f 00 0a 0b 19 00 4a 04 03 1f 1a 00 0d 0c 52 00 46 04 1a 1f 1f 00 0d 0f
+19 00 46 04 12 1b 1e 00 09 0f 63 00 5b 08 03 03 25 00 07 00 31 0c 02 04 00
+63 32 00 00 01 32 00 48 61 6d 6d 6f 6e 64 2e 2e 32 63 63 63 32 32 32 00 20
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0e 05 08 06 00 03 47 04 03 1f 1f 04 07 0e 00 04 5b 08 01 19 1f 00 07 0f
+00 05 4e 0a 05 1f 1f 00 07 0e 00 45 63 04 04 0d 0e 00 14 18 3a 0c 02 04 00
+63 32 00 32 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..3
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 05 08 06 00 00 47 04 03 1f 1f 04 07 0e 00 00 5b 08 01 19 1f 00 07 0f
+00 00 4e 0a 05 1f 1f 00 07 0e 00 40 63 04 04 0d 0e 00 14 18 3a 0c 02 04 00
+63 32 00 32 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..4
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 05 01 03 0d 2d 03 53 0a 13 1f 05 00 05 0b 2d 04 47 04 13 1f 08 00 03 0c
+43 06 5c 19 1b 1c 06 04 04 07 00 05 63 04 13 3f 23 00 23 00 32 0c 06 04 00
+63 32 00 32 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..4
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 01 03 0d 2d 00 53 0a 13 1f 05 00 05 0b 2d 01 47 04 13 1f 08 00 03 0c
+43 01 5c 19 1b 1c 06 04 04 07 00 00 63 04 13 3f 23 00 23 00 32 0c 06 04 00
+63 32 00 32 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 00 10 04 00 00 45 32 04 03 1d 0c 00 0f 0f 01 45 40 04 03 1a 17 00 0f 0f
+51 05 56 08 0b 1e 12 00 0f 0f 10 04 63 08 0b 0c 1d 00 47 55 36 0c 0c 04 00
+63 32 00 00 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..5
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0a 00 10 04 00 00 40 32 04 03 1d 0c 00 0f 0f 01 40 40 04 03 1a 17 00 0f 0f
+51 00 56 08 0b 1e 12 00 0f 0f 10 00 63 08 0b 0c 1d 00 47 55 36 0c 0c 04 00
+63 32 00 00 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 1f 00 0a 0b 19 03 54 04 13 1f 1a 00 0d 0c 52 05 50 04 0a 1f 1f 00 0d 0f
+19 05 43 0a 1a 1b 1e 00 09 0f 63 05 63 04 03 0b 1f 00 0f 00 32 0c 02 04 00
+63 32 00 00 01 32 00 48 61 6d 6d 6f 6e 64 2e 2e 36 63 63 63 32 32 32 00 30
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..6
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 1f 00 0a 0b 19 00 54 04 13 1f 1a 00 0d 0c 52 00 50 04 0a 1f 1f 00 0d 0f
+19 00 43 0a 1a 1b 1e 00 09 0f 63 00 63 04 03 0b 1f 00 0f 00 32 0c 02 04 00
+63 32 00 00 01 32 00 48 61 6d 6d 6f 6e 64 2e 2e 36 63 63 63 32 32 32 00 30
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..7
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 0d 10 04 00 00 45 46 0a 03 1d 0c 00 0f 0f 01 45 40 08 03 1a 17 00 0f 0f
+51 04 55 0d 0b 1e 12 00 0f 0f 10 05 63 04 0b 04 21 00 15 23 26 0c 0c 04 00
+63 32 00 00 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hammond..7
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+17 0d 10 04 00 00 40 46 0a 03 1d 0c 00 0f 0f 01 40 40 08 03 1a 17 00 0f 0f
+51 00 55 0d 0b 1e 12 00 0f 0f 10 00 63 04 0b 04 21 00 15 23 26 0c 0c 04 00
+63 32 00 00 00 32 00 48 61 6d 6d 6f 6e 64 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HamondLead
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 16 04 0a 0f 00 04 58 00 00 12 15 04 0a 0f 00 05 63 00 08 12 15 04 0a 0f
+00 06 63 00 0e 12 15 04 0a 0f 00 04 63 00 0b 06 24 0f 35 00 32 18 02 04 00
+63 63 00 00 00 32 00 48 61 6d 6f 6e 64 4c 65 61 64 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HamondLead
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 16 04 0a 0f 00 01 58 00 00 12 15 04 0a 0f 00 00 63 00 08 12 15 04 0a 0f
+00 00 63 00 0e 12 15 04 0a 0f 00 00 63 00 0b 06 24 0f 35 00 32 18 02 04 00
+63 63 00 00 00 32 00 48 61 6d 6f 6e 64 4c 65 61 64 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hmnd LS f1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 09 07 0f 0f 00 03 63 0a 05 1b 18 10 0f 0f 00 44 63 08 01 1c 18 07 0f 0f
+0a 03 63 08 05 1c 18 07 0f 0f 00 05 63 04 02 2f 30 00 34 63 16 0c 07 04 00
+63 63 00 00 00 32 00 48 6d 6e 64 20 4c 53 20 66 31 63 63 63 32 32 32 00 00
+00 40 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hmnd LS f1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 09 07 0f 0f 00 00 63 0a 05 1b 18 10 0f 0f 00 40 63 08 01 1c 18 07 0f 0f
+0a 00 63 08 05 1c 18 07 0f 0f 00 00 63 04 02 2f 30 00 34 63 16 0c 07 04 00
+63 63 00 00 00 32 00 48 6d 6e 64 20 4c 53 20 66 31 63 63 63 32 32 32 00 00
+00 40 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hmnd LS f2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 18 07 0d 0f 00 03 63 04 05 1b 07 07 0d 0f 00 04 60 04 01 1c 18 07 0d 0f
+0a 04 5f 04 05 1c 18 07 0d 0f 00 05 60 00 02 07 1b 00 0f 63 36 18 07 04 00
+63 63 00 00 00 32 00 48 6d 6e 64 20 4c 53 20 66 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hmnd LS f2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 18 07 0d 0f 00 00 63 04 05 1b 07 07 0d 0f 00 00 60 04 01 1c 18 07 0d 0f
+0a 00 5f 04 05 1c 18 07 0d 0f 00 00 60 00 02 07 1b 00 0f 63 36 18 07 04 00
+63 63 00 00 00 32 00 48 6d 6e 64 20 4c 53 20 66 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hmnd LS s1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 07 01 0d 0f 00 05 5c 04 05 1b 07 07 0d 0f 00 05 5f 08 01 1c 18 07 0d 0f
+0a 05 5f 08 05 1c 18 07 0d 0f 00 05 5f 04 02 27 30 00 0e 00 22 18 07 04 00
+63 63 00 00 00 32 00 48 6d 6e 64 20 4c 53 20 73 31 63 63 63 32 32 32 00 20
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hmnd LS s1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 07 01 0d 0f 00 00 5c 04 05 1b 07 07 0d 0f 00 00 5f 08 01 1c 18 07 0d 0f
+0a 00 5f 08 05 1c 18 07 0d 0f 00 00 5f 04 02 27 30 00 0e 00 22 18 07 04 00
+63 63 00 00 00 32 00 48 6d 6e 64 20 4c 53 20 73 31 63 63 63 32 32 32 00 20
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hornopean
+** Description: A loud, obnoxious organ stop
+** Controls: MW (LFO pitch)
+** Source: Art Hitzeman
+12 1f 00 07 0f 19 00 58 00 03 10 1f 00 06 0f 19 00 5a 04 03 17 1f 00 07 0f
+19 00 5a 04 03 0e 1f 00 06 0f 19 00 5a 04 03 45 00 01 04 00 62 18 02 04 00
+28 32 00 00 00 32 00 48 6f 72 6e 6f 70 65 61 6e 20 63 63 63 32 32 32 00 00
+00 70 00 60 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jazz Organ
+** Description: An organ with jazz potential
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 0a 00 0b 0f 00 00 52 0a 06 1f 1f 00 0a 0f 00 00 5b 04 00 1f 12 0e 0a 0f
+00 00 58 13 06 1f 1f 00 0a 0f 00 40 4f 04 06 1f 23 00 02 00 4e 0c 07 04 00
+63 32 32 32 00 32 00 4a 61 7a 7a 20 4f 72 67 61 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Leslie *
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 1f 07 0c 0f 42 40 59 33 03 1b 1f 00 0b 0f 00 40 63 0a 00 1b 1f 00 0b 0f
+00 40 56 1c 06 1b 1f 00 0b 0f 00 40 5c 04 06 1f 22 00 05 17 66 05 02 04 00
+28 00 37 00 00 32 00 4c 65 73 6c 69 65 20 20 20 2a 63 63 63 32 32 32 00 07
+00 10 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Organ 1
+** Description: An electric organ
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: GLIB (Michael Kesti and others)
+1f 0a 01 0b 00 00 7d 5f 0a 06 1f 1f 01 0a 0f 00 7f 63 08 00 1f 1f 01 0a 0f
+00 7f 63 0a 06 1f 1f 01 0a 0f 00 7e 63 04 06 1f 27 00 14 1c 36 0c 04 04 00
+63 32 32 00 00 32 00 4f 72 67 61 6e 20 20 20 20 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Organ 2
+** Description: An electric organ
+** Source: GLIB (Michael Kesti and others)
+1f 0f 00 06 0f 00 00 40 00 03 1f 0f 00 09 0f 00 00 46 04 03 1f 0f 00 06 0f
+00 00 5a 00 03 1f 0f 00 09 0f 00 00 5a 04 03 04 00 00 00 00 02 18 00 04 00
+63 32 32 32 00 32 00 4f 72 67 61 6e 20 32 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Organ 3
+** Description: An electric organ
+** Source: GLIB (Michael Kesti and others)
+1f 0f 00 06 0f 4e 00 50 00 03 1f 0f 00 09 0f 36 00 46 04 03 1f 0f 00 06 0f
+00 00 5a 00 03 1f 0f 00 09 0f 00 00 5a 04 03 04 00 00 00 00 02 18 00 04 00
+63 32 32 32 00 32 00 4f 72 67 61 6e 20 33 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 10 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Organ
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 06 07 00 00 03 4f 3d 0b 1d 07 07 08 0b 00 02 63 04 0b 1d 07 07 08 0b
+00 05 63 04 0e 1d 07 07 08 0b 00 04 5a 04 0b 2e 63 21 00 00 40 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 20 4f 72 67 61 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Organ
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 06 07 00 00 00 4f 3d 0b 1d 07 07 08 0b 00 00 63 04 0b 1d 07 07 08 0b
+00 00 63 04 0e 1d 07 07 08 0b 00 00 5a 04 0b 2e 63 21 00 00 40 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 20 4f 72 67 61 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+* SUBCATEGORY Organ2
+
+
+** Name: P Organ..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 1f 00 06 0f 00 0d 63 13 03 1a 1f 00 06 0f 00 0d 63 08 03 1a 1f 00 06 0f
+00 0d 63 0a 03 1a 1f 00 06 0f 00 0d 63 04 03 2f 21 19 1d 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 1f 00 06 0f 00 08 63 13 03 1a 1f 00 06 0f 00 08 63 08 03 1a 1f 00 06 0f
+00 08 63 0a 03 1a 1f 00 06 0f 00 08 63 04 03 2f 21 19 1d 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 1f 00 06 0f 00 04 45 19 03 1a 1f 00 06 0f 00 06 50 04 03 1a 1f 00 06 0f
+00 05 63 04 03 1a 1f 00 06 0f 00 05 63 00 03 34 21 19 1d 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 1f 00 06 0f 00 01 45 19 03 1a 1f 00 06 0f 00 01 50 04 03 1a 1f 00 06 0f
+00 00 63 04 03 1a 1f 00 06 0f 00 00 63 00 03 34 21 19 1d 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 1f 13 08 0e 00 03 43 19 03 1a 1f 00 06 0f 00 03 44 04 03 10 07 07 09 0f
+00 05 63 08 03 1a 1f 00 06 0f 00 05 63 08 03 34 21 19 1d 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 33 63 63 63 32 32 32 00 30
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 1f 13 08 0e 00 00 43 19 03 1a 1f 00 06 0f 00 00 44 04 03 10 07 07 09 0f
+00 00 63 08 03 1a 1f 00 06 0f 00 00 63 08 03 34 21 19 1d 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 33 63 63 63 32 32 32 00 30
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 1f 00 08 0f 00 05 50 00 03 16 1f 00 07 0f 00 06 4f 04 03 0d 1f 00 06 0f
+00 06 63 0d 03 15 1f 00 07 0f 00 05 63 04 03 04 23 41 00 00 12 18 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 34 63 63 63 32 32 32 00 60
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 1f 00 08 0f 00 01 50 00 03 16 1f 00 07 0f 00 01 4f 04 03 0d 1f 00 06 0f
+00 01 63 0d 03 15 1f 00 07 0f 00 00 63 04 03 04 23 41 00 00 12 18 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 34 63 63 63 32 32 32 00 60
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 05 06 0f 00 02 4c 0d 03 1d 1f 05 08 0f 00 04 5a 04 02 13 1f 07 07 0f
+00 05 63 08 03 18 07 06 0a 0f 00 05 63 08 04 04 23 41 00 00 12 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 35 63 63 63 32 32 32 00 40
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 05 06 0f 00 01 4c 0d 03 1d 1f 05 08 0f 00 01 5a 04 02 13 1f 07 07 0f
+00 00 63 08 03 18 07 06 0a 0f 00 00 63 08 04 04 23 41 00 00 12 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 35 63 63 63 32 32 32 00 40
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 06 03 06 0f 00 05 4c 1f 03 12 03 03 08 0f 00 05 63 08 02 12 07 04 07 0f
+00 05 63 08 03 16 03 04 0a 0f 00 05 63 04 04 2e 23 41 00 00 12 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 36 63 63 63 32 32 32 00 10
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..6
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 06 03 06 0f 00 00 4c 1f 03 12 03 03 08 0f 00 00 63 08 02 12 07 04 07 0f
+00 00 63 08 03 16 03 04 0a 0f 00 00 63 04 04 2e 23 41 00 00 12 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 36 63 63 63 32 32 32 00 10
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 07 03 07 0f 00 05 4a 1f 03 1f 05 03 09 0f 00 06 54 00 02 12 05 04 08 0f
+00 06 63 08 03 0d 05 04 0a 0f 00 05 63 00 04 04 23 41 00 00 12 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 37 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 07 03 07 0f 00 01 4a 1f 03 1f 05 03 09 0f 00 01 54 00 02 12 05 04 08 0f
+00 00 63 08 03 0d 05 04 0a 0f 00 00 63 00 04 04 23 41 00 00 12 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 37 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..8
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 1f 00 09 0f 00 06 4c 2a 0b 1a 1f 00 06 0f 00 06 5b 00 04 13 1f 00 0a 0f
+00 05 63 08 03 10 1f 00 06 0f 00 45 63 00 04 24 21 19 16 23 46 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 38 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..8
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 1f 00 09 0f 00 01 4c 2a 0b 1a 1f 00 06 0f 00 01 5b 00 04 13 1f 00 0a 0f
+00 00 63 08 03 10 1f 00 06 0f 00 40 63 00 04 24 21 19 16 23 46 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 38 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..9
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 06 03 07 0f 00 06 44 13 03 12 03 03 08 0f 00 06 57 08 02 12 07 04 09 0f
+00 05 63 0d 03 10 03 04 0a 0f 00 05 63 04 04 2c 23 41 00 00 12 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 39 63 63 63 32 32 32 00 00
+00 20 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ..9
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 06 03 07 0f 00 01 44 13 03 12 03 03 08 0f 00 01 57 08 02 12 07 04 09 0f
+00 00 63 0d 03 10 03 04 0a 0f 00 00 63 04 04 2c 23 41 00 00 12 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 2e 39 63 63 63 32 32 32 00 00
+00 20 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.10
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 00 00 0a 0f 3e 46 4e 0d 06 10 00 00 0a 0f 63 05 63 08 06 18 00 00 0a 0f
+00 06 63 08 06 15 00 00 0a 0f 00 05 63 04 01 06 23 00 00 38 16 18 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 30 63 63 63 32 32 32 00 00
+00 00 00 60 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.10
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 00 00 0a 0f 3e 41 4e 0d 06 10 00 00 0a 0f 63 00 63 08 06 18 00 00 0a 0f
+00 01 63 08 06 15 00 00 0a 0f 00 00 63 04 01 06 23 00 00 38 16 18 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 30 63 63 63 32 32 32 00 00
+00 00 00 60 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.11
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 00 00 0a 0f 00 03 47 08 02 18 00 00 05 0f 5b 04 63 00 00 0f 00 00 08 0f
+00 05 63 08 10 0e 00 00 05 0f 00 05 63 00 16 3c 23 00 00 00 02 0c 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 31 63 63 63 32 32 32 00 00
+00 70 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.11
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 00 00 0a 0f 00 01 47 08 02 18 00 00 05 0f 5b 01 63 00 00 0f 00 00 08 0f
+00 00 63 08 10 0e 00 00 05 0f 00 00 63 00 16 3c 23 00 00 00 02 0c 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 31 63 63 63 32 32 32 00 00
+00 70 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.12
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 07 01 0a 0f 00 03 56 13 05 1b 07 01 07 0f 5b 05 4f 04 02 12 07 01 09 0f
+00 03 61 08 12 0d 07 07 05 0f 00 05 63 00 14 2c 23 00 00 00 02 0c 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.12
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 07 01 0a 0f 00 01 56 13 05 1b 07 01 07 0f 5b 00 4f 04 02 12 07 01 09 0f
+00 00 61 08 12 0d 07 07 05 0f 00 00 63 00 14 2c 23 00 00 00 02 0c 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.13
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 07 00 0a 0f 43 03 4f 13 05 1f 07 00 07 03 5b 04 52 04 02 12 07 01 09 0f
+2e 05 5f 08 02 0d 07 00 05 0f 00 05 63 00 04 2c 23 00 00 00 02 0c 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.13
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 07 00 0a 0f 43 01 4f 13 05 1f 07 00 07 03 5b 01 52 04 02 12 07 01 09 0f
+2e 00 5f 08 02 0d 07 00 05 0f 00 00 63 00 04 2c 23 00 00 00 02 0c 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.14
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 07 00 07 0f 43 04 59 0d 05 15 04 00 08 0f 15 06 57 00 02 12 07 01 08 0f
+2e 04 62 04 02 11 03 00 06 0f 00 05 63 00 04 2c 23 00 16 00 22 18 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 34 63 63 63 32 32 32 00 00
+00 50 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.14
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 07 00 07 0f 43 00 59 0d 05 15 04 00 08 0f 15 01 57 00 02 12 07 01 08 0f
+2e 00 62 04 02 11 03 00 06 0f 00 00 63 00 04 2c 23 00 16 00 22 18 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 34 63 63 63 32 32 32 00 00
+00 50 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.15
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 04 00 07 0f 43 03 58 19 0c 12 04 00 08 0f 5b 04 5c 04 0a 0f 04 00 08 0f
+2e 05 63 08 02 0f 04 00 06 0f 00 05 63 00 03 2c 23 00 00 00 02 18 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 35 63 63 63 32 32 32 00 30
+00 30 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.15
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 04 00 07 0f 43 01 58 19 0c 12 04 00 08 0f 5b 01 5c 04 0a 0f 04 00 08 0f
+2e 00 63 08 02 0f 04 00 06 0f 00 00 63 00 03 2c 23 00 00 00 02 18 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 35 63 63 63 32 32 32 00 30
+00 30 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.16
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 04 00 07 0f 43 04 47 19 0c 12 04 00 08 0f 5b 03 4d 04 0a 0f 04 00 08 0f
+2e 06 63 0d 02 0f 04 00 06 0f 00 05 63 00 03 2e 23 00 00 00 02 18 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.16
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 04 00 07 0f 43 00 47 19 0c 12 04 00 08 0f 5b 00 4d 04 0a 0f 04 00 08 0f
+2e 00 63 0d 02 0f 04 00 06 0f 00 00 63 00 03 2e 23 00 00 00 02 18 00 04 00
+63 00 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.17
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 1f 00 06 0f 00 06 51 13 03 1a 1f 00 06 0f 00 06 45 08 03 1a 1f 00 06 0f
+00 07 50 0a 03 1a 1f 00 06 0f 00 05 63 04 03 29 21 19 1d 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 37 63 63 63 32 32 32 00 00
+00 10 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P Organ.17
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 1f 00 06 0f 00 01 51 13 03 1a 1f 00 06 0f 00 01 45 08 03 1a 1f 00 06 0f
+00 02 50 0a 03 1a 1f 00 06 0f 00 00 63 04 03 29 21 19 1d 00 52 0c 07 04 00
+63 63 00 00 00 32 00 50 20 4f 72 67 61 6e 2e 31 37 63 63 63 32 32 32 00 00
+00 10 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.Organ 1
+** Source: Yamaha DX11 factory preset, bank C, voice 30
+1e 1f 00 06 0f 0a 00 4c 00 0b 0a 1f 00 0a 0f 19 00 4c 10 0e 14 1f 00 0a 0f
+00 00 5a 04 0b 13 1f 00 0a 0f 19 00 4c 0a 08 16 46 00 00 00 22 18 02 04 00
+28 32 00 00 00 32 00 50 2e 4f 72 67 61 6e 20 20 31 63 63 63 32 32 32 00 20
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.Organ 1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1f 00 06 0f 0a 00 4c 00 0b 0d 1f 00 0a 0f 19 00 4c 10 0e 14 1f 00 0a 0f
+00 00 5a 04 0b 13 1f 00 0a 0f 19 00 4c 0a 08 16 46 00 00 00 22 18 02 04 00
+28 32 00 00 00 32 00 50 2e 4f 72 67 61 6e 20 20 31 63 63 63 32 32 32 00 20
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.Organ 2
+** Source: Yamaha DX11 factory preset, bank C, voice 31
+12 1f 00 09 0f 00 00 5e 04 03 10 1f 00 08 0f 00 00 60 08 05 17 1f 00 09 0f
+00 00 5f 0a 06 0e 1f 00 08 0f 00 00 5e 00 00 37 23 01 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 50 2e 4f 72 67 61 6e 20 20 32 63 63 63 32 32 32 00 20
+00 30 00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.Organ 2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 1f 00 09 0f 00 00 5e 04 03 10 1f 00 08 0f 00 00 60 08 05 17 1f 00 09 0f
+00 00 5f 0d 06 0e 1f 00 08 0f 00 00 5e 00 00 37 23 01 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 50 2e 4f 72 67 61 6e 20 20 32 63 63 63 32 32 32 00 20
+00 30 00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.Organ 1'
+** Description: DX11 factory preset 'P.Organ 1' with slower decay
+** Source: Art Hitzeman
+1e 1f 00 05 0f 0a 00 4c 00 0b 0a 1f 00 06 0f 19 00 4c 10 0e 14 1f 00 06 0f
+00 00 5a 04 0b 13 1f 00 05 0f 19 00 4c 0a 08 16 46 00 00 00 22 18 02 04 00
+28 32 00 00 00 32 00 50 2e 4f 72 67 61 6e 20 31 27 63 63 63 32 32 32 00 20
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.Organ 2'
+** Description: DX11 factory preset 'P.Organ 2' with slower decay
+** Source: Art Hitzeman
+12 1f 00 07 0f 00 00 5e 04 03 10 1f 00 06 0f 00 00 60 08 05 17 1f 00 07 0f
+00 00 5f 0d 06 0e 1f 00 06 0f 00 00 5e 00 00 37 23 01 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 50 2e 4f 72 67 61 6e 20 32 27 63 63 63 32 32 32 00 20
+00 30 00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.Organ 3
+** Description: A pipe organ
+** Source: Art Hitzeman
+12 1f 00 06 0f 00 00 5e 04 03 10 1f 00 05 0f 09 00 60 08 15 17 1f 00 07 0f
+40 00 5f 0a 0e 0e 1f 00 05 0f 00 00 5e 00 10 37 23 01 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 50 2e 4f 72 67 61 6e 20 33 20 63 63 63 32 32 32 00 30
+00 40 00 00 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.Organ 4
+** Description: Another pipe organ
+** Source: Art Hitzeman
+12 1f 00 07 0f 00 00 54 04 03 10 1f 00 06 0f 63 00 63 04 03 17 1f 00 07 0f
+00 00 55 08 06 0e 1f 00 06 0f 00 00 55 00 00 2f 23 01 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 50 2e 4f 72 67 61 6e 20 34 20 63 63 63 32 32 32 00 10
+00 10 00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.Organ 5
+** Description: Yet another pipe organ
+** Source: Art Hitzeman
+12 1f 00 07 0f 00 00 5e 00 03 10 1f 00 06 0f 00 00 60 04 05 17 1f 00 07 0f
+00 00 5f 08 06 0e 1f 00 06 0f 00 00 5e 00 00 37 23 01 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 50 2e 4f 72 67 61 6e 20 35 20 63 63 63 32 32 32 00 00
+00 40 00 40 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PercOrgan
+** Controls: MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 17
+1f 0b 01 0b 08 18 40 5f 0a 0e 1f 1f 00 0a 0f 00 40 5f 04 00 1f 1f 00 0a 0f
+00 40 63 05 06 1f 1f 00 0a 0f 00 40 5f 00 08 1f 20 00 03 00 5a 18 04 04 00
+63 32 32 00 00 32 00 50 65 72 63 4f 72 67 61 6e 20 63 63 63 32 32 32 00 00
+00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pipe Organ
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+16 00 00 0a 0f 00 00 63 19 03 11 00 00 0a 0f 00 00 63 0d 03 17 00 00 0a 0f
+00 00 63 04 03 17 00 00 0a 0f 00 00 63 00 03 07 1e 00 00 00 42 18 04 04 00
+28 32 00 00 00 32 00 50 69 70 65 20 4f 72 67 61 6e 63 63 63 32 32 32 00 70
+00 70 00 40 00 50 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PumpOrgan
+** Controls: MW (LFO amplitude)
+** Source: Yamaha TX81Z factory preset, bank A, voice 19
+1f 1f 00 06 0f 1e 00 4d 17 03 1f 1f 00 05 0f 00 00 50 05 04 1f 1f 00 05 0f
+00 00 23 04 06 0d 1f 00 09 0f 00 40 5a 04 03 38 14 00 00 0e 3e 11 04 04 00
+63 32 0a 00 00 32 00 50 75 6d 70 4f 72 67 61 6e 20 63 63 63 32 32 32 00 25
+00 31 00 18 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RevrbOrgan
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 03 00 05 0e 23 03 4e 05 05 0e 03 00 05 0e 23 03 4e 04 03 0b 1f 00 05 0f
+00 01 63 05 06 0c 1f 00 05 0f 00 01 63 04 02 04 19 06 04 00 52 05 02 04 00
+63 0f 00 0c 00 32 00 52 65 76 72 62 4f 72 67 61 6e 63 63 63 32 32 32 00 01
+00 08 00 01 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Small Pipe
+** Source: Yamaha TX81Z factory preset, bank A, voice 22
+16 00 00 0a 0f 3e 00 4b 19 06 11 00 00 0a 0f 63 00 57 0d 06 17 00 00 0a 0f
+00 00 58 04 06 17 00 00 0a 0f 00 00 63 00 01 07 1e 00 00 00 42 18 04 04 00
+63 63 00 00 00 32 00 53 6d 61 6c 6c 20 50 69 70 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Organ 1
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: Yamaha DX11 factory preset, bank A, voice 21
+1f 12 00 07 0a 14 02 50 0a 0b 1f 14 00 09 0e 00 42 55 08 13 1f 14 00 09 06
+00 03 63 0a 03 1f 1f 00 08 0f 00 02 63 04 0b 06 1e 0a 11 1a 5e 18 02 04 00
+63 32 23 00 00 32 00 53 79 2e 4f 72 67 61 6e 20 31 63 63 63 32 32 32 00 00
+00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Organ 1
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 00 07 0d 14 02 50 0d 0b 1f 14 00 09 0e 00 42 55 08 13 1f 14 00 09 06
+00 03 63 0d 03 1f 1f 00 08 0f 00 02 63 04 0b 06 1e 0d 11 1a 5e 18 02 04 00
+63 32 23 00 00 32 00 53 79 2e 4f 72 67 61 6e 20 31 63 63 63 32 32 32 00 00
+00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Organ 2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 22
+1b 00 00 0f 0f 1b 00 24 0a 03 1e 1c 00 04 01 00 00 44 08 02 1f 00 00 0a 0b
+00 00 49 0a 04 1f 06 00 09 0f 00 00 53 04 04 3a 23 00 27 00 42 18 02 04 00
+63 63 00 63 00 32 00 53 79 2e 4f 72 67 61 6e 20 32 63 63 63 32 32 32 00 00
+00 20 00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Organ 2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 00 00 0f 0f 1b 00 24 0d 03 1e 1c 00 04 01 00 00 44 08 02 1f 00 00 0a 0b
+00 00 49 0d 04 1f 06 00 09 0f 00 00 53 04 04 3a 23 00 27 00 42 18 02 04 00
+63 63 00 63 00 32 00 53 79 2e 4f 72 67 61 6e 20 32 63 63 63 32 32 32 00 00
+00 20 00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tocc Organ
+** Description: A pipe organ intended for Bach's Toccata & Fugue in D Minor
+** (the piece the villian always plays in those horror movies)
+** Source: Art Hitzeman
+12 1f 00 06 0f 3c 00 5e 04 03 10 1f 00 06 0f 32 00 60 08 05 17 1f 00 07 0f
+32 00 5f 0d 06 0e 1f 00 06 0f 3c 00 5e 00 00 37 23 01 00 00 62 0c 02 04 00
+28 32 00 00 00 32 00 54 6f 63 63 20 4f 72 67 61 6e 63 63 63 32 32 32 00 20
+00 30 00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: VelocOrgan
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 07 00 0f 0d 32 07 2b 11 00 1c 08 00 0f 0d 41 07 49 12 04 19 08 00 0f 0d
+41 07 5d 05 06 1c 1f 00 0a 0e 00 03 63 04 09 03 1d 15 05 00 52 05 02 04 00
+63 23 00 00 00 32 00 56 65 6c 6f 63 4f 72 67 61 6e 63 63 63 32 32 32 00 08
+00 04 00 11 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wirlitzer*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 07 06 07 0e 12 06 4a 08 08 1d 07 06 07 0e 00 06 54 00 0b 1d 06 06 07 0e
+00 00 63 00 0e 1d 06 06 07 0e 00 02 63 04 08 34 23 00 00 00 32 18 02 04 00
+28 63 00 00 00 32 00 57 69 72 6c 69 74 7a 65 72 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 14
+
+* SUBCATEGORY Piano1
+
+
+** Name: AC Piano.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 03 02 04 04 63 06 58 0a 13 16 09 06 06 0d 00 04 4d 04 0b 1b 06 01 04 04
+63 06 63 04 0b 16 09 06 06 0d 00 07 62 04 0b 2c 23 00 00 00 02 0c 02 04 00
+63 32 00 32 00 32 00 41 43 20 50 69 61 6e 6f 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 03 02 04 04 63 01 58 0a 13 16 09 06 06 0d 00 01 4d 04 0b 1b 06 01 04 04
+63 00 63 04 0b 16 09 06 06 0d 00 00 62 04 0b 2c 23 00 00 00 02 0c 02 04 00
+63 32 00 32 00 32 00 41 43 20 50 69 61 6e 6f 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 05 02 04 04 63 04 3b 19 13 14 05 04 06 0d 00 05 50 04 1b 14 02 02 06 0d
+00 05 3d 10 0b 15 07 06 06 0c 00 06 63 04 0b 22 23 00 00 00 02 0c 02 04 00
+63 32 00 32 00 32 00 41 43 20 50 69 61 6e 6f 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 05 02 04 04 63 01 3b 19 13 14 05 04 06 0d 00 01 50 04 1b 14 02 02 06 0d
+00 01 3d 10 0b 15 07 06 06 0c 00 00 63 04 0b 22 23 00 00 00 02 0c 02 04 00
+63 32 00 32 00 32 00 41 43 20 50 69 61 6e 6f 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 01 01 03 00 1b 05 49 04 0d 14 06 05 04 09 42 06 53 04 0d 12 06 0b 03 00
+42 05 44 10 09 18 06 05 05 09 01 46 60 04 0a 1a 23 0a 00 06 56 18 04 04 00
+63 32 00 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 01 01 03 00 1b 02 49 04 0d 14 06 05 04 09 42 01 53 04 0d 12 06 0b 03 00
+42 01 44 10 09 18 06 05 05 09 01 40 60 04 0a 1a 23 0a 00 06 56 18 04 04 00
+63 32 00 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 01 01 05 00 32 44 4c 04 0d 19 09 09 05 0f 01 04 53 04 06 18 06 05 06 09
+16 45 62 04 09 19 09 09 05 0f 01 45 63 04 00 2c 19 00 00 00 66 18 01 04 00
+63 00 63 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 34 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 01 01 05 00 32 41 4c 04 0d 19 09 09 05 0f 01 01 53 04 06 18 06 05 06 09
+16 40 62 04 09 19 09 09 05 0f 01 40 63 04 00 2c 19 00 00 00 66 18 01 04 00
+63 00 63 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 34 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 07 00 07 00 00 04 49 00 08 19 1f 00 06 0f 00 05 4b 00 06 18 09 00 07 00
+00 05 43 00 00 1a 05 06 05 0a 01 06 63 04 0e 03 00 00 00 00 62 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 07 00 07 00 00 01 49 00 08 19 1f 00 06 0f 00 01 4b 00 06 18 09 00 07 00
+00 00 43 00 00 1a 05 06 05 0a 01 01 63 04 0e 03 00 00 00 00 62 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 03 05 0d 2d 05 49 04 03 1f 05 01 05 0f 63 05 4c 0a 03 1f 04 02 05 0e
+63 05 47 04 0b 1c 1e 06 06 0f 00 06 5d 04 13 3a 23 00 00 00 62 0c 00 04 00
+63 00 00 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 08 03 05 0d 2d 01 49 04 03 1f 05 01 05 0f 63 01 4c 0a 03 1f 04 02 05 0e
+63 01 47 04 0b 1c 1e 06 06 0f 00 00 5d 04 13 3a 23 00 00 00 62 0c 00 04 00
+63 00 00 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.7
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 08 00 03 00 00 04 3a 08 0c 14 06 07 04 09 23 05 48 04 15 14 07 00 03 00
+00 06 36 0a 02 18 08 06 05 09 0f 06 5d 04 0b 7a 21 3c 0a 00 32 18 06 04 00
+63 32 00 32 00 32 00 41 43 20 50 69 61 6e 6f 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.7
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 08 00 03 00 00 00 3a 08 0c 14 06 07 04 09 23 00 48 04 15 14 07 00 03 00
+00 00 36 0a 02 18 08 06 05 09 0f 00 5d 04 0b 7a 21 3c 0a 00 32 18 06 04 00
+63 32 00 32 00 32 00 41 43 20 50 69 61 6e 6f 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 09 01 03 0e 32 43 4f 0a 11 16 09 01 03 0e 32 1d 5d 04 16 18 07 05 05 0d
+00 45 63 04 0b 18 07 05 05 0d 00 75 60 04 0b 24 19 00 00 00 66 18 01 04 00
+63 00 63 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.8
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 09 01 03 0e 32 41 4f 0a 11 16 09 01 03 0e 32 01 5d 04 16 18 07 05 05 0d
+00 40 63 04 0b 18 07 05 05 0d 00 40 60 04 0b 24 19 00 00 00 66 18 01 04 00
+63 00 63 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.9
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 09 07 07 0d 00 45 3a 10 0b 1c 09 07 07 0d 00 05 4a 0a 0c 1c 09 07 07 0d
+00 43 4b 04 0a 1c 09 07 07 0d 00 45 63 04 0b 23 19 00 00 00 66 18 01 04 00
+63 00 63 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 39 63 63 63 32 32 32 00 20
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano.9
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 09 07 07 0d 00 42 3a 10 0b 1c 09 07 07 0d 00 02 4a 0a 0c 1c 09 07 07 0d
+00 40 4b 04 0a 1c 09 07 07 0d 00 41 63 04 0b 23 19 00 00 00 66 18 01 04 00
+63 00 63 00 00 32 00 41 43 20 50 69 61 6e 6f 2e 39 63 63 63 32 32 32 00 20
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano10
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 01 01 03 00 34 04 4b 04 0d 16 01 01 04 0c 42 04 52 00 0b 18 05 01 03 00
+63 06 45 16 10 14 08 01 06 0c 00 05 63 04 13 32 23 00 00 00 02 18 00 04 00
+63 32 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano10
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 01 01 03 00 34 01 4b 04 0d 16 01 01 04 0c 42 01 52 00 0b 18 05 01 03 00
+63 01 45 16 10 14 08 01 06 0c 00 00 63 04 13 32 23 00 00 00 02 18 00 04 00
+63 32 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano11
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 03 05 0d 00 04 49 04 0d 1f 04 02 05 0e 63 04 4a 0a 01 1f 05 04 05 0d
+63 06 50 10 04 1c 1e 04 06 0f 00 05 5c 04 13 2a 23 00 00 00 62 0c 00 04 00
+63 00 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano11
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 08 03 05 0d 00 01 49 04 0d 1f 04 02 05 0e 63 01 4a 0a 01 1f 05 04 05 0d
+63 01 50 10 04 1c 1e 04 06 0f 00 00 5c 04 13 2a 23 00 00 00 62 0c 00 04 00
+63 00 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano12
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 0c 09 09 06 52 45 46 0d 03 1b 05 06 09 07 27 04 41 04 13 1c 06 06 07 0c
+11 45 4e 04 0b 1c 07 07 07 09 00 46 60 04 0b 1b 19 00 00 00 66 18 01 04 00
+63 00 63 00 00 32 00 41 43 20 50 69 61 6e 6f 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano12
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 0c 09 09 06 52 42 46 0d 03 1b 05 06 09 07 27 01 41 04 13 1c 06 06 07 0c
+11 40 4e 04 0b 1c 07 07 07 09 00 40 60 04 0b 1b 19 00 00 00 66 18 01 04 00
+63 00 63 00 00 32 00 41 43 20 50 69 61 6e 6f 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano13
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 09 00 07 0d 00 04 46 0a 0b 19 09 00 06 0d 00 04 49 04 0c 18 09 00 07 0d
+00 06 4c 04 0b 1a 09 09 07 0d 00 05 63 04 0b 2a 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 33 63 63 63 32 32 32 00 20
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano13
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 09 00 07 0d 00 01 46 0a 0b 19 09 00 06 0d 00 01 49 04 0c 18 09 00 07 0d
+00 01 4c 04 0b 1a 09 09 07 0d 00 00 63 04 0b 2a 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 33 63 63 63 32 32 32 00 20
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano14
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 09 06 07 0d 00 02 38 0a 0b 1b 09 06 07 0d 00 04 46 10 0c 1b 09 06 07 0d
+00 05 4c 04 0b 1b 09 06 07 0d 00 05 5d 04 0b 2a 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 34 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano14
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 09 06 07 0d 00 01 38 0a 0b 1b 09 06 07 0d 00 02 46 10 0c 1b 09 06 07 0d
+00 01 4c 04 0b 1b 09 06 07 0d 00 00 5d 04 0b 2a 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 34 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano15
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 06 00 06 0e 00 05 2f 19 0e 13 04 04 06 0d 00 05 43 04 0a 13 04 04 06 0d
+00 07 3e 0d 0c 15 07 06 06 0c 00 06 63 04 0b 2a 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano15
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 06 00 06 0e 00 01 2f 19 0e 13 04 04 06 0d 00 01 43 04 0a 13 04 04 06 0d
+00 01 3e 0d 0c 15 07 06 06 0c 00 01 63 04 0b 2a 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano16
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 0d 05 07 0d 00 04 4c 0a 0c 13 04 03 06 0d 13 04 4e 04 0a 13 04 04 06 0d
+2b 06 2d 1c 0b 15 07 06 06 0c 00 05 5d 04 0c 2a 00 00 00 00 02 0c 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano16
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 0d 05 07 0d 00 01 4c 0a 0c 13 04 03 06 0d 13 01 4e 04 0a 13 04 04 06 0d
+2b 01 2d 1c 0b 15 07 06 06 0c 00 00 5d 04 0c 2a 00 00 00 00 02 0c 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano17
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 18 05 01 0a 01 05 47 16 0a 1f 0c 01 04 0d 13 05 4e 04 0b 1f 0c 01 04 0d
+13 06 50 04 0c 17 07 06 08 0d 00 06 5e 04 0b 28 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 37 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano17
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 18 05 01 0a 01 01 47 16 0a 1f 0c 01 04 0d 13 01 4e 04 0b 1f 0c 01 04 0d
+13 01 50 04 0c 17 07 06 08 0d 00 00 5e 04 0b 28 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 37 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano18
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 05 05 0c 01 02 51 0a 0d 19 06 15 09 0a 13 05 41 04 0a 19 08 05 05 09
+00 06 46 10 0c 19 07 05 05 09 00 06 5d 04 0c 02 00 00 00 00 02 0c 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 38 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano18
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 05 05 0c 01 01 51 0a 0d 19 06 15 09 0a 13 01 41 04 0a 19 08 05 05 09
+00 01 46 10 0c 19 07 05 05 09 00 00 5d 04 0c 02 00 00 00 00 02 0c 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 38 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano19
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 09 06 0c 01 05 43 16 05 19 06 06 09 0a 13 06 50 04 04 19 06 06 09 0a
+13 05 4e 04 02 19 09 06 07 0d 00 06 5f 04 0a 22 00 00 00 00 02 0c 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano19
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 09 06 0c 01 01 43 16 05 19 06 06 09 0a 13 02 50 04 04 19 06 06 09 0a
+13 01 4e 04 02 19 09 06 07 0d 00 00 5f 04 0a 22 00 00 00 00 02 0c 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 31 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano20
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 09 09 07 0d 01 05 3d 04 0b 19 09 09 07 0d 01 05 4b 0a 04 19 09 09 07 0d
+01 05 41 10 03 19 09 06 07 0d 01 06 5f 04 0b 2a 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 32 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano20
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 09 09 07 0d 01 01 3d 04 0b 19 09 09 07 0d 01 01 4b 0a 04 19 09 09 07 0d
+01 01 41 10 03 19 09 06 07 0d 01 00 5f 04 0b 2a 00 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 41 43 20 50 69 61 6e 6f 32 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano21
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 01 01 03 00 1b 05 47 04 0d 14 06 05 04 09 42 05 48 13 0d 12 06 0b 03 00
+42 05 4b 0d 09 18 06 05 05 09 0a 44 60 04 0a 1a 23 0a 00 06 56 18 04 04 00
+63 32 00 00 00 32 00 41 43 20 50 69 61 6e 6f 32 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AC Piano21
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 01 01 03 00 1b 01 47 04 0d 14 06 05 04 09 42 01 48 13 0d 12 06 0b 03 00
+42 01 4b 0d 09 18 06 05 05 09 0a 40 60 04 0a 1a 23 0a 00 06 56 18 04 04 00
+63 32 00 00 00 32 00 41 43 20 50 69 61 6e 6f 32 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BabyGrand*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 10 06 07 0e 00 01 44 04 0c 1e 0c 06 03 0e 2b 02 4c 04 0c 1e 09 07 06 0e
+11 03 4f 10 09 1c 0a 06 07 0e 00 02 63 04 08 1a 23 00 00 00 62 0c 02 04 00
+28 32 00 00 00 32 00 42 61 62 79 47 72 61 6e 64 2a 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bad Road *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 0f 18 07 02 11 02 38 1e 03 17 06 06 0a 0f 0c 05 57 04 0e 18 07 0d 0a 03
+0e 45 63 04 06 17 06 06 07 0f 00 43 63 04 08 04 23 00 00 00 0e 0c 02 04 00
+28 00 19 00 00 32 00 42 61 64 20 52 6f 61 64 20 2a 63 63 63 32 32 32 00 18
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bel/Piano*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 1f 04 00 00 02 58 09 05 1c 09 1f 04 00 00 05 57 05 06 1c 09 1f 04 00
+00 42 63 04 0b 1c 09 1f 04 00 00 43 63 00 08 04 17 00 08 0c 3a 11 02 04 00
+28 63 00 00 00 32 00 42 65 6c 2f 50 69 61 6e 6f 2a 63 63 63 32 32 32 00 32
+00 01 00 08 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BellPiano1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 0a 05 0a 00 03 63 2d 13 1f 1b 0a 06 0f 00 05 51 08 03 1f 09 07 05 0f
+00 05 63 08 03 1f 09 0c 04 0f 00 46 5e 04 03 3c 18 52 00 51 26 0c 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 50 69 61 6e 6f 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BellPiano1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 0a 05 0a 00 01 63 2d 13 1f 1b 0a 06 0f 00 01 51 08 03 1f 09 07 05 0f
+00 00 63 08 03 1f 09 0c 04 0f 00 40 5e 04 03 3c 18 52 00 51 26 0c 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 50 69 61 6e 6f 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BellPiano2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 0a 05 0a 00 04 63 08 13 1f 1b 0a 06 0f 00 04 63 19 03 1f 09 07 05 0f
+00 05 63 08 03 1f 09 0c 04 0f 00 47 5e 08 03 3e 18 52 00 51 26 0c 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 50 69 61 6e 6f 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BellPiano2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 0a 05 0a 00 02 63 08 13 1f 1b 0a 06 0f 00 00 63 19 03 1f 09 07 05 0f
+00 00 63 08 03 1f 09 0c 04 0f 00 40 5e 08 03 3e 18 52 00 51 26 0c 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 50 69 61 6e 6f 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BritePiano
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1d 04 0c 04 00 34 01 4d 04 0d 1f 07 03 04 0c 5e 03 4d 0d 0b 18 05 03 04 00
+3d 03 4e 16 18 1f 08 03 04 0d 00 02 63 04 13 3a 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 42 72 69 74 65 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Buz'dPiano
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 04 0c 06 00 34 01 4f 04 0d 1f 07 03 06 0c 5e 04 4d 0d 13 18 05 03 06 00
+3d 01 47 16 18 1f 08 03 06 0d 00 01 63 04 13 3a 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 42 75 7a 27 64 50 69 61 6e 6f 63 63 63 32 32 32 00 10
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ChibyPiano
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 15 0c 06 00 21 02 49 16 15 1f 07 03 06 0c 1b 04 47 0d 0b 18 05 03 06 00
+10 02 4a 16 18 1f 08 03 06 0d 00 02 63 04 13 3a 1d 00 00 00 52 0c 02 04 00
+63 32 00 00 00 32 00 43 68 69 62 79 50 69 61 6e 6f 63 63 63 32 32 32 00 70
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ChorusMeEP
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 0e 0f 0e 09 00 03 53 2a 0e 1f 00 00 07 0a 30 43 55 00 08 1f 12 06 08 0d
+00 03 53 04 00 1c 04 00 07 0a 00 02 63 04 16 34 14 00 01 02 26 18 02 05 00
+63 32 00 32 00 32 00 43 68 6f 72 75 73 4d 65 45 50 63 63 63 32 32 32 00 70
+00 10 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: CrsPopPno
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 08 08 0b 63 03 4f 04 10 1f 1f 08 08 0b 63 03 4f 05 16 1f 19 05 06 0f
+00 05 63 04 10 1f 19 05 06 0f 00 05 62 05 16 04 1a 12 00 00 4a 05 02 04 00
+62 32 00 25 00 32 00 43 72 73 50 6f 70 50 6e 6f 20 63 63 63 32 32 32 16 48
+14 41 00 58 00 51 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DX7 EP
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 1
+1f 0f 00 0a 07 00 44 49 2d 06 1e 06 00 06 00 10 43 59 04 00 1b 07 0a 09 07
+14 43 4f 04 03 1e 07 00 09 00 14 42 63 04 06 1c 16 00 04 0a 4e 18 02 04 00
+28 32 00 00 00 32 00 44 58 37 20 45 50 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Deep Grd
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 3
+18 01 01 03 00 15 03 47 04 0d 16 01 01 05 0c 46 03 5b 00 13 18 05 01 03 00
+4a 04 36 10 08 14 08 01 05 0c 01 03 63 04 13 32 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 44 65 65 70 20 47 72 64 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DirtoyPno
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 0c 05 0c 1c 04 4e 13 13 1f 06 01 05 0e 00 46 55 30 0b 16 17 08 04 0d
+00 04 63 00 0b 1f 09 09 05 0f 00 05 49 19 08 04 1d 11 05 00 4e 18 02 04 00
+63 32 33 1e 33 32 00 44 69 72 74 6f 79 50 6e 6f 20 63 63 63 32 32 32 0e 70
+04 2d 00 60 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DynomiteEP
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 13
+1f 0e 0f 0e 09 00 03 43 2d 0e 1f 0f 05 07 0f 16 43 5a 00 00 1f 12 06 08 0d
+00 03 63 04 00 1f 12 06 08 0f 00 02 63 04 06 34 14 00 01 02 4e 18 02 04 00
+63 32 00 32 00 32 00 44 79 6e 6f 6d 69 74 65 45 50 63 63 63 32 32 32 00 70
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Piano2
+
+
+** Name: E. Piano 3
+** Description: An electric piano
+** Controls: KV, MW (LFO pitch)
+** Source: Art Hitzeman
+16 1d 12 03 0c 00 42 42 16 04 1c 0e 03 03 0f 14 43 4f 04 16 1b 13 01 01 0f
+4d 45 39 19 10 19 07 04 05 05 0a 42 63 04 13 19 1e 00 06 02 42 18 02 04 00
+28 32 00 00 00 32 00 45 2e 20 50 69 61 6e 6f 20 33 63 63 63 32 32 32 03 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 00 05 00 28 02 53 04 0b 1f 08 00 07 00 00 06 4e 0a 03 19 07 00 0f 00
+00 04 5f 04 08 19 05 15 08 00 00 06 5f 04 10 2c 19 00 03 00 62 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 00 05 00 28 01 53 04 0b 1f 08 00 07 00 00 01 4e 0a 03 19 07 00 0f 00
+00 00 5f 04 08 19 05 15 08 00 00 00 5f 04 10 2c 19 00 03 00 62 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 12 05 00 00 03 4e 16 0c 1f 07 0a 06 00 00 05 3d 1c 0a 1f 06 00 05 00
+00 06 5f 04 08 1b 06 0a 06 00 00 05 5c 04 0e 2c 14 00 05 00 62 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 32 63 63 63 32 32 32 00 10
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 12 05 00 00 02 4e 16 0c 1f 07 0a 06 00 00 02 3d 1c 0a 1f 06 00 05 00
+00 00 5f 04 08 1b 06 0a 06 00 00 00 5c 04 0e 2c 14 00 05 00 62 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 32 63 63 63 32 32 32 00 10
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 09 03 09 0f 63 05 59 0a 03 1a 08 02 05 0c 29 04 55 08 0b 1f 0b 09 06 0f
+00 04 5d 08 13 1d 08 06 08 0f 01 07 5f 04 0b 34 14 00 03 00 52 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 33 63 63 63 32 32 32 00 20
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 09 03 09 0f 63 02 59 0a 03 1a 08 02 05 0c 29 01 55 08 0b 1f 0b 09 06 0f
+00 00 5d 08 13 1d 08 06 08 0f 01 00 5f 04 0b 34 14 00 03 00 52 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 33 63 63 63 32 32 32 00 20
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..4
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 09 03 07 0f 63 04 56 04 03 1a 08 02 03 0c 29 05 57 0a 0b 1f 0b 09 04 0f
+00 06 5b 04 13 1d 08 06 06 0f 01 06 61 08 0b 2c 14 00 03 00 52 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 34 63 63 63 32 32 32 00 20
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..4
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 09 03 07 0f 63 01 56 04 03 1a 08 02 03 0c 29 01 57 0a 0b 1f 0b 09 04 0f
+00 00 5b 04 13 1d 08 06 06 0f 01 00 61 08 0b 2c 14 00 03 00 52 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 34 63 63 63 32 32 32 00 20
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 09 05 05 0e 63 04 4a 19 13 19 07 04 09 00 00 04 4b 0a 06 1f 08 05 05 00
+19 06 60 00 00 1d 08 01 06 0f 19 45 5c 00 02 0c 0f 00 00 20 66 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 35 63 63 63 32 32 32 00 10
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 09 05 05 0e 63 01 4a 19 13 19 07 04 09 00 00 01 4b 0a 06 1f 08 05 05 00
+19 00 60 00 00 1d 08 01 06 0f 19 40 5c 00 02 0c 0f 00 00 20 66 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 35 63 63 63 32 32 32 00 10
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 09 06 09 0d 39 04 56 04 0e 1c 0f 06 0c 0c 23 46 5d 04 1a 1c 06 06 0f 0d
+1e 45 60 04 00 1c 07 07 0b 0c 0b 46 62 04 06 2c 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 2e 36 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 09 06 09 0d 39 01 56 04 0e 1c 0f 06 0c 0c 23 42 5d 04 1a 1c 06 06 0f 0d
+1e 40 60 04 00 1c 07 07 0b 0c 0b 40 62 04 06 2c 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 2e 36 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0f 07 0c 0f 63 04 55 04 0d 18 0c 0d 07 0c 30 04 4d 0a 0d 1f 06 06 06 0f
+00 46 63 04 09 1f 0a 06 07 0f 01 06 5f 04 0c 24 17 00 00 27 0a 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 37 63 63 63 32 32 32 00 00
+00 30 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0f 07 0c 0f 63 01 55 04 0d 18 0c 0d 07 0c 30 01 4d 0a 0d 1f 06 06 06 0f
+00 41 63 04 09 1f 0a 06 07 0f 01 00 5f 04 0c 24 17 00 00 27 0a 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 37 63 63 63 32 32 32 00 00
+00 30 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 07 06 07 18 04 5b 04 03 1f 0a 07 06 0a 0c 04 63 04 0c 1f 06 0d 06 07
+0e 46 63 04 0b 1f 04 0f 06 09 0a 06 63 04 0b 0d 1f 00 00 20 0a 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 38 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..8
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 07 06 07 18 01 5b 04 03 1f 0a 07 06 0a 0c 00 63 04 0c 1f 06 0d 06 07
+0e 40 63 04 0b 1f 04 0f 06 09 0a 00 63 04 0b 0d 1f 00 00 20 0a 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 38 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..9
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 06 06 07 0e 63 06 46 10 04 1f 0f 06 03 0f 28 04 4c 04 0e 18 09 06 06 0e
+00 05 63 04 03 1c 0f 06 06 0f 0a 07 5e 04 05 2c 63 00 00 00 02 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 39 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano..9
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 06 06 07 0e 63 01 46 10 04 1f 0f 06 03 0f 28 01 4c 04 0e 18 09 06 06 0e
+00 00 63 04 03 1c 0f 06 06 0f 0a 00 5e 04 05 2c 63 00 00 00 02 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 2e 39 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.10
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 09 05 0d 1e 04 58 04 04 18 16 0d 08 0e 28 04 3c 22 06 18 09 06 07 0e
+00 06 63 04 03 1c 0f 06 06 0f 0a 06 62 04 05 2c 63 00 00 00 02 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.10
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 09 05 0d 1e 01 58 04 04 18 16 0d 08 0e 28 01 3c 22 06 18 09 06 07 0e
+00 01 63 04 03 1c 0f 06 06 0f 0a 00 62 04 05 2c 63 00 00 00 02 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.11
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 06 03 07 0b 4b 05 4f 04 1b 1b 19 06 06 0d 63 06 51 2a 1b 16 09 06 06 0e
+00 05 61 04 03 1c 0f 04 06 0f 0a 06 5d 04 03 3c 63 00 00 00 02 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 31 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.11
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 06 03 07 0b 4b 01 4f 04 1b 1b 19 06 06 0d 63 01 51 2a 1b 16 09 06 06 0e
+00 01 61 04 03 1c 0f 04 06 0f 0a 00 5d 04 03 3c 63 00 00 00 02 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 31 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.12
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 01 09 09 03 4b 05 52 10 1c 1c 18 06 02 0a 63 05 63 08 13 1b 14 09 04 0e
+00 05 5a 04 05 1c 0f 06 06 0f 0a 06 62 00 03 24 00 00 00 00 02 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 31 32 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.12
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 01 09 09 03 4b 01 52 10 1c 1c 18 06 02 0a 63 01 63 08 13 1b 14 09 04 0e
+00 00 5a 04 05 1c 0f 06 06 0f 0a 00 62 00 03 24 00 00 00 00 02 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 31 32 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.13
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 07 03 07 0d 63 46 52 04 1e 1e 16 0a 05 0b 63 45 58 24 0a 1c 06 06 0f 0d
+1e 44 5c 04 08 1c 07 07 0b 0c 0b 05 63 04 06 3c 22 00 00 1a 0a 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.13
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 07 03 07 0d 63 42 52 04 1e 1e 16 0a 05 0b 63 41 58 24 0a 1c 06 06 0f 0d
+1e 40 5c 04 08 1c 07 07 0b 0c 0b 01 63 04 06 3c 22 00 00 1a 0a 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.14
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 09 07 07 0b 2c 44 41 1f 0b 1e 09 07 07 0b 63 46 5a 2a 13 18 09 07 07 0d
+00 44 61 04 03 1b 09 07 07 09 0a 06 62 04 0b 0c 22 00 00 1a 0a 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.14
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 09 07 07 0b 2c 42 41 1f 0b 1e 09 07 07 0b 63 42 5a 2a 13 18 09 07 07 0d
+00 41 61 04 03 1b 09 07 07 09 0a 01 62 04 0b 0c 22 00 00 1a 0a 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.15
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 09 07 07 0b 55 45 39 04 13 1e 09 07 07 0b 63 45 47 1f 13 1f 18 07 07 0d
+63 44 4f 08 1b 1b 09 07 07 09 0a 06 62 04 03 32 22 00 00 1a 0a 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 35 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.15
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 09 07 07 0b 55 42 39 04 13 1e 09 07 07 0b 63 41 47 1f 13 1f 18 07 07 0d
+63 41 4f 08 1b 1b 09 07 07 09 0a 01 62 04 03 32 22 00 00 1a 0a 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 35 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.16
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 11 07 07 0b 55 04 34 16 13 1e 09 07 07 0b 63 05 35 08 13 1f 09 07 07 0d
+63 04 32 08 13 1b 07 07 07 0b 0a 45 5a 04 03 70 22 00 00 27 06 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 36 63 63 63 32 32 32 00 10
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.16
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 11 07 07 0b 55 00 34 16 13 1e 09 07 07 0b 63 00 35 08 13 1f 09 07 07 0d
+63 00 32 08 13 1b 07 07 07 0b 0a 40 5a 04 03 70 22 00 00 27 06 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 36 63 63 63 32 32 32 00 10
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.17
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 06 08 0d 14 06 57 16 15 1c 0f 06 0c 0c 23 46 5a 04 09 1c 06 06 0f 0d
+1e 46 63 04 01 1c 04 04 0b 02 0b 45 5f 04 05 2c 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.17
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 06 08 0d 14 04 57 16 15 1c 0f 06 0c 0c 23 41 5a 04 09 1c 06 06 0f 0d
+1e 41 63 04 01 1c 04 04 0b 02 0b 40 5f 04 05 2c 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.18
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 06 04 01 0b 14 04 50 19 1d 16 0f 06 0c 0c 2d 44 44 04 01 18 06 06 0f 0d
+1e 46 63 08 01 19 07 07 0b 0c 0b 45 60 04 05 0c 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 38 63 63 63 32 32 32 00 00
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.18
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 06 04 01 0b 14 01 50 19 1d 16 0f 06 0c 0c 2d 41 44 04 01 18 06 06 0f 0d
+1e 41 63 08 01 19 07 07 0b 0c 0b 40 60 04 05 0c 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 38 63 63 63 32 32 32 00 00
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.19
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 06 07 0f 32 04 37 2a 15 18 09 06 0a 0f 24 46 58 04 15 1f 09 06 09 0f
+1e 46 63 04 05 1f 0c 06 07 0f 0b 46 61 00 03 04 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 39 63 63 63 32 32 32 00 30
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.19
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 06 07 0f 32 01 37 2a 15 18 09 06 0a 0f 24 41 58 04 15 1f 09 06 09 0f
+1e 41 63 04 05 1f 0c 06 07 0f 0b 40 61 00 03 04 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 31 39 63 63 63 32 32 32 00 30
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.20
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 06 07 0f 32 07 39 1f 15 18 09 06 0a 0f 24 44 51 04 15 1f 09 06 09 0f
+1e 45 5f 08 05 1f 0c 06 07 0f 0b 46 5f 04 03 0e 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 32 30 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.20
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 06 07 0f 32 02 39 1f 15 18 09 06 0a 0f 24 40 51 04 15 1f 09 06 09 0f
+1e 40 5f 08 05 1f 0c 06 07 0f 0b 40 5f 04 03 0e 22 21 00 00 36 18 00 04 00
+63 63 00 00 00 32 00 45 20 50 69 61 6e 6f 2e 32 30 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.21
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 08 00 07 00 0d 01 3b 2a 0b 1f 08 00 07 00 00 01 59 04 03 1f 08 00 0a 00
+00 00 60 04 00 1f 08 11 07 00 00 00 5e 04 00 64 18 00 04 00 62 0c 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 32 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.22
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 00 06 00 0d 01 46 16 0b 1f 08 00 07 00 2d 01 5a 04 0b 1f 11 00 0f 00
+00 04 63 08 00 1f 08 15 08 01 00 04 63 04 08 1c 1b 00 04 00 52 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 32 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E Piano.22
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 00 06 00 0d 01 46 16 0b 1f 08 00 07 00 2d 01 5a 04 0b 1f 11 00 0f 00
+00 00 63 08 00 1f 08 15 08 01 00 00 63 04 08 1c 1b 00 04 00 52 18 01 04 00
+63 32 00 32 00 32 00 45 20 50 69 61 6e 6f 2e 32 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Piano 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 3
+1f 1f 11 0f 0f 00 46 43 31 10 1d 0b 12 06 0e 00 42 2a 28 12 1d 04 01 06 0e
+00 44 45 04 0c 1d 0c 04 08 0e 14 43 63 04 16 03 10 00 08 19 5a 18 02 04 00
+28 32 00 00 00 32 00 45 2e 50 69 61 6e 6f 20 20 31 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Piano 2
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 4
+1f 13 0a 09 04 00 06 49 0f 03 1f 1f 00 07 0f 0b 01 49 00 03 1f 0a 08 07 0c
+0c 02 31 04 03 18 1f 09 09 0f 06 02 60 00 03 02 23 00 00 00 62 24 02 04 00
+28 32 00 00 00 32 00 45 2e 50 69 61 6e 6f 20 20 32 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: E.Piano 2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 0d 09 04 00 06 49 0f 03 1f 1f 00 07 0f 0b 01 49 00 03 1f 0d 08 07 0c
+0c 02 31 04 03 18 1f 09 09 0f 06 02 60 00 03 02 23 00 00 00 62 24 02 04 00
+28 32 00 00 00 32 00 45 2e 50 69 61 6e 6f 20 20 32 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: El.Piano *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 06 07 0e 14 03 50 04 0e 1f 0f 0a 0b 0b 00 03 42 2d 0b 1f 1e 06 07 0e
+00 02 63 03 08 1f 07 07 0a 0b 00 02 63 04 0b 04 15 00 0a 00 32 05 02 04 00
+28 63 00 00 00 32 00 45 6c 2e 50 69 61 6e 6f 20 2a 63 63 63 32 32 32 00 18
+00 08 00 06 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Elec Grand
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 5
+1f 08 03 05 0d 00 02 44 04 0e 1f 04 02 05 0e 63 02 52 0a 00 1f 05 04 05 0d
+63 02 42 10 05 1c 1e 06 06 0f 00 03 63 04 13 3a 23 00 00 00 62 0c 02 04 00
+63 00 00 00 00 32 00 45 6c 65 63 20 47 72 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ElecPiano4
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+16 0d 12 07 00 00 42 25 22 04 1c 1f 03 05 0f 14 43 51 04 16 1b 13 01 02 0f
+63 45 3b 19 18 19 07 04 06 05 0d 42 63 04 13 02 1e 00 06 02 42 18 02 04 00
+28 32 00 00 00 32 00 45 6c 65 63 50 69 61 6e 6f 34 63 63 63 32 32 32 03 50
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ElecPiano5
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 0f 00 09 07 00 41 47 2d 06 0f 06 00 05 00 00 40 3e 04 00 1b 07 0a 08 07
+00 42 63 04 03 1e 07 00 08 00 00 42 63 09 06 3c 17 00 00 1d 3a 18 02 04 00
+28 32 00 00 00 32 00 45 6c 65 63 50 69 61 6e 6f 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 02 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ElecPiano6
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 0f 00 09 07 00 41 52 2d 00 1f 0f 00 09 07 00 40 37 24 06 1b 07 0a 08 07
+00 42 63 03 00 1b 07 0a 08 07 00 42 63 02 06 3c 17 00 00 1d 3a 18 02 04 00
+28 32 00 00 00 32 00 45 6c 65 63 50 69 61 6e 6f 36 63 63 63 32 32 32 00 00
+00 00 00 01 00 02 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Electracou
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+18 0b 0a 0f 0d 28 02 4a 0a 0b 1a 12 00 0a 0f 07 00 4e 04 0b 17 0f 0e 05 09
+11 01 4e 0a 0b 1b 13 09 06 0e 00 00 63 04 0b 36 1e 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 45 6c 65 63 74 72 61 63 6f 75 63 63 63 32 32 32 00 30
+00 00 00 70 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ElectroPno
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 11
+1f 06 04 07 0c 00 04 36 2a 10 1f 04 03 04 0d 00 03 54 04 16 1f 0d 08 07 0c
+00 44 63 04 0e 18 04 03 06 0d 00 43 63 04 13 04 14 08 02 1b 6a 0c 02 04 00
+63 32 00 00 00 32 00 45 6c 65 63 74 72 6f 50 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FadePiano
+** Description: Grand 2 with slowly fading sustain
+** Controls: KV
+** Source: Art Hitzeman
+1f 0e 04 03 09 29 07 4c 04 00 16 04 02 03 0d 63 02 4c 09 16 1f 10 03 03 0a
+63 02 4a 1c 15 17 04 01 05 0f 00 03 63 04 16 3a 1f 08 20 02 02 18 02 04 00
+28 63 00 00 00 32 00 46 61 64 65 50 69 61 6e 6f 20 63 63 63 32 32 32 00 00
+00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FingersGo!
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 01 04 03 00 1a 01 48 04 1d 16 07 03 04 0b 4c 04 52 0d 13 18 05 03 03 00
+41 02 47 1c 18 1a 06 03 06 0b 00 02 61 04 13 3a 23 00 00 00 02 18 02 04 00
+63 32 00 00 00 32 00 46 69 6e 67 65 72 73 47 6f 21 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FlatFlange
+** Description: a fuzzy, twangy electric piano
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1f 0e 0f 0e 09 00 07 57 10 06 1f 11 03 0b 0a 43 02 53 08 13 1f 02 05 08 0e
+00 04 63 0a 03 1f 1f 08 08 0a 00 00 5a 04 03 00 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 46 6c 61 74 46 6c 61 6e 67 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fuzz Piano
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 6
+1f 11 0b 0f 00 00 04 63 15 16 1f 0b 00 0b 0f 58 07 51 04 06 1f 09 04 09 0a
+5f 07 47 2a 05 1f 07 04 0a 0d 00 03 63 04 00 5a 1b 32 02 00 62 0c 04 04 00
+63 16 00 00 00 32 00 46 75 7a 7a 20 50 69 61 6e 6f 63 63 63 32 32 32 08 70
+30 50 00 40 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FuzzPiano
+** Description: an electric piano with guitarish twang
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1f 0e 0f 0e 09 00 03 4b 24 06 1f 11 03 0b 0e 43 03 51 08 13 1f 09 05 08 0e
+00 03 59 0a 03 1f 12 08 08 0a 00 03 62 04 03 31 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 46 75 7a 7a 50 69 61 6e 6f 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GaragePno
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 15 1f 03 0b 00 05 53 1e 03 1f 09 04 04 0c 0f 06 47 03 16 1f 04 09 04 0c
+0f 06 47 05 10 1f 1f 0a 06 0f 00 05 63 00 0b 03 1d 00 03 00 52 18 02 04 00
+63 1e 00 00 00 32 00 47 61 72 61 67 65 50 6e 6f 20 63 63 63 32 32 32 08 0d
+00 56 00 51 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GlassPiano
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 05 0f 00 03 4b 04 02 1f 1f 00 0f 0f 00 05 42 24 06 0c 09 05 05 0f
+00 43 63 04 03 0c 0f 08 07 07 00 06 58 2a 04 6c 26 56 00 12 17 18 04 04 00
+28 32 00 00 00 32 00 47 6c 61 73 73 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Grand 2
+** Description: DX11 factory preset 'Grand PF' with slower decay
+** Controls: KV, MW (LFO pitch)
+** Source: Art Hitzeman
+1f 07 01 03 0e 2b 03 4c 04 08 16 03 02 04 0c 63 02 4c 09 16 1f 07 03 04 0a
+63 02 4a 1c 15 17 16 06 04 0e 00 03 63 04 16 3a 1f 00 04 00 42 18 02 04 00
+28 32 00 00 00 32 00 47 72 61 6e 64 20 32 20 20 20 63 63 63 32 32 32 00 00
+00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Grand 3
+** Description: 'Grand 2' with more treble
+** Controls: KV, MW (LFO pitch)
+** Source: Art Hitzeman
+1f 07 01 03 0e 21 03 4c 04 08 16 03 02 04 0c 46 02 4c 09 16 1f 07 03 04 0a
+46 02 4a 1c 15 17 16 06 04 0e 00 03 63 04 16 3a 1f 00 04 00 42 18 02 04 00
+28 32 00 00 00 32 00 47 72 61 6e 64 20 33 20 20 20 63 63 63 32 32 32 00 00
+00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Grand Low
+** Description: Grand 2 an octave lower
+** Controls: KV, MW (LFO pitch)
+** Source: Art Hitzeman
+1f 07 01 03 0e 2b 03 4c 04 08 16 03 02 04 0c 63 02 4c 09 16 1f 07 03 04 0a
+63 02 4a 1c 15 17 16 06 04 0e 00 03 63 04 16 3a 1f 00 04 00 42 0c 02 04 00
+28 32 00 00 00 32 00 47 72 61 6e 64 20 4c 6f 77 20 63 63 63 32 32 32 00 00
+00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Grand PF
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 5
+1f 07 01 06 0e 2b 03 4c 04 08 16 03 02 06 0c 63 02 4c 09 16 1f 07 03 07 0a
+63 02 4a 1c 15 17 16 06 08 0e 00 03 63 04 16 3a 1f 00 04 00 42 18 02 04 00
+28 32 00 00 00 32 00 47 72 61 6e 64 20 50 46 20 20 63 63 63 32 32 32 00 00
+00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GrandLow2
+** Description: (similar to Grand low)
+** Controls: KV, MW (LFO pitch)
+** Source: Art Hitzeman
+1f 07 01 03 0e 2b 03 4c 04 08 16 03 02 04 0c 63 02 4c 09 16 1f 07 03 04 0a
+63 02 4a 1c 15 17 06 03 04 0e 00 03 63 04 16 3a 1f 00 04 00 42 0c 02 04 00
+28 32 00 00 00 32 00 47 72 61 6e 64 4c 6f 77 32 20 63 63 63 32 32 32 00 00
+00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GrandLow3
+** Description: Grand Low with slower decay
+** Controls: KV, MW (LFO pitch)
+** Source: Art Hitzeman
+1f 07 01 03 0e 2b 03 4c 04 08 16 03 02 04 0c 63 02 4c 0e 16 1f 07 03 04 0a
+63 02 4a 28 15 17 16 06 04 0e 00 03 63 04 16 3a 1f 00 04 00 42 05 02 04 00
+28 32 00 00 00 32 00 47 72 61 6e 64 4c 6f 77 33 20 63 63 63 32 32 32 00 08
+00 03 00 08 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GrandPiano
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 1
+1d 04 0c 06 00 34 01 4d 04 0d 1f 07 03 06 0c 5e 04 4d 0d 0b 18 05 03 06 00
+3d 01 4a 16 18 1f 08 03 06 0d 00 01 63 04 13 3a 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 47 72 61 6e 64 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HappyPiano
+** Description: a cute electric piano
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1f 0e 0f 0e 09 00 03 4b 24 06 1f 11 03 0b 0e 43 03 51 08 13 1f 12 05 08 0e
+00 03 59 0a 03 1f 12 08 08 0a 00 03 62 04 03 34 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 48 61 70 70 79 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HarpsPiano
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 03 19 06 00 13 02 43 04 13 1f 00 0c 06 0f 25 04 55 1f 0b 14 1f 1f 06 0b
+21 02 3d 16 1b 1f 1e 00 07 0f 00 02 63 04 13 62 20 00 00 00 42 18 02 04 00
+63 0e 00 00 00 32 00 48 61 72 70 73 50 69 61 6e 6f 63 63 63 32 32 32 00 60
+00 50 00 10 00 30 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hi-LowBell
+** Description: yet another electric piano
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 1b 0f 0e 0a 00 03 4e 1f 06 1f 09 00 0b 00 43 03 4d 04 13 1f 09 05 08 0e
+00 03 59 08 03 1f 12 08 08 0a 00 03 62 00 03 3c 1c 1d 10 00 62 18 01 04 00
+63 32 00 32 00 32 00 48 69 2d 4c 6f 77 42 65 6c 6c 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: High&Long$
+** Description: a synthetic electric piano sound
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 0a 00 0e 09 00 03 58 24 06 1f 0e 03 0b 0e 43 03 55 04 13 1f 12 06 08 0e
+00 02 4b 04 03 1f 12 05 08 0a 00 03 62 04 03 04 1c 14 06 54 66 18 01 04 00
+63 32 00 32 00 32 00 48 69 67 68 26 4c 6f 6e 67 24 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HonkeyTonk
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 4
+18 01 01 03 00 00 02 30 17 0e 16 03 01 04 0c 3a 02 4e 05 16 18 1b 04 03 0d
+00 03 3d 1d 0d 14 08 01 05 0c 00 03 63 03 10 20 23 00 00 00 02 11 02 04 00
+63 32 00 00 00 32 00 48 6f 6e 6b 65 79 54 6f 6e 6b 63 63 63 32 32 32 00 42
+00 01 00 0b 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ivory *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 03 05 0d 00 02 48 04 16 1f 04 02 05 0e 42 05 47 0a 08 1f 05 04 05 0d
+51 02 48 10 0d 16 1e 06 06 0f 00 03 63 04 13 02 19 00 00 00 22 0c 02 04 00
+63 00 00 00 00 32 00 49 76 6f 72 79 20 20 20 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: JazzyPiano
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 07 01 06 0e 2b 03 35 04 08 16 03 02 06 0c 4b 02 59 09 16 1f 07 03 07 0a
+5b 01 4d 19 15 17 16 06 08 0e 00 03 63 04 16 3a 1f 00 04 00 42 18 02 04 00
+28 32 00 00 00 32 00 4a 61 7a 7a 79 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MetalWhip
+** Description: electric piano / electric guitar mix
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1f 0e 0f 0e 09 00 03 62 10 06 1f 11 03 0b 0e 43 03 51 08 13 1f 09 05 08 0e
+00 03 59 0a 03 1f 12 08 08 0a 00 03 62 04 03 31 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 4d 65 74 61 6c 57 68 69 70 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: NewElectro
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 12
+1f 0e 0f 0e 09 00 03 29 2d 06 1f 0f 05 0b 0e 4e 02 5a 04 0b 1f 12 06 08 0e
+00 03 60 04 03 1f 12 06 08 0e 00 04 63 04 0b 34 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 4e 65 77 45 6c 65 63 74 72 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: NewElectro
+** Description: still another electric piano
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1f 0e 0f 0e 09 00 06 4b 24 06 1f 0e 03 0b 0e 43 02 55 04 13 1f 12 06 08 0e
+00 04 4e 04 03 1f 12 08 08 0a 00 03 62 04 03 34 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 4e 65 77 45 6c 65 63 74 72 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: NewElectro
+** Controls: KV
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 0e 0f 0e 09 00 07 4b 24 06 1f 0e 03 0b 0e 43 07 55 04 13 1f 12 06 08 0e
+00 07 4e 04 03 1f 12 08 08 0a 00 07 62 04 03 34 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 4e 65 77 45 6c 65 63 74 72 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Old Rose
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 2
+19 12 05 09 0a 25 41 54 04 05 19 0a 0a 09 0c 25 04 45 08 13 1f 13 00 09 03
+00 05 56 02 03 1a 1f 05 09 0f 00 43 60 04 09 32 19 00 00 00 5e 18 02 04 00
+28 09 0f 00 00 32 00 4f 6c 64 20 52 6f 73 65 20 20 63 63 63 32 32 32 00 30
+00 50 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Old Rose
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 12 05 09 0d 25 41 54 04 05 19 0d 0a 09 0c 25 04 45 08 13 1f 13 00 09 03
+00 05 56 02 03 1a 1f 05 09 0f 00 43 60 04 09 32 19 00 00 00 5e 18 02 04 00
+28 09 0f 00 00 32 00 4f 6c 64 20 52 6f 73 65 20 20 63 63 63 32 32 32 00 30
+00 50 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrganPiano
+** Description: Doesn't sound like either
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 1b 0f 0e 0a 00 02 4e 0a 06 1f 09 00 0b 00 43 02 4d 04 13 1f 09 05 08 0e
+00 02 59 08 03 1f 12 08 08 0a 00 02 62 04 03 3c 1c 1d 10 00 62 18 01 04 00
+63 32 00 32 00 32 00 4f 72 67 61 6e 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrganPiano
+** Description: a meek, organ-like electric piano
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 1b 0f 0e 0a 00 03 4e 0a 06 1f 09 00 0b 00 43 03 4d 04 13 1f 09 05 08 0e
+00 02 59 08 03 1f 12 08 08 0a 00 02 62 04 03 3c 1c 1d 10 00 62 18 01 04 00
+63 32 00 32 00 32 00 4f 72 67 61 6e 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Piano
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 09 00 04 0a 00 02 47 04 05 19 09 04 07 06 00 02 3b 0d 03 1e 16 02 06 0f
+00 05 63 08 04 1e 15 08 05 0d 00 05 5a 3e 0a 2c 1e 17 00 00 22 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 20 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Piano
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 09 00 04 0a 00 00 47 04 05 19 09 04 07 06 00 00 3b 0d 03 1e 16 02 06 0f
+00 00 63 08 04 1e 15 08 05 0d 00 00 5a 3e 0a 2c 1e 17 00 00 22 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 20 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PetalPiano
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 08 07 06 06 57 07 43 04 05 13 06 07 06 0a 00 00 3b 00 09 1d 08 07 06 0a
+00 00 57 00 00 13 05 07 06 03 00 02 63 00 0d 01 1c 08 04 00 32 24 02 04 00
+63 32 00 00 00 32 00 50 65 74 61 6c 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PhaseGrand
+** Description: another electric piano
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1d 17 02 0f 0a 52 00 47 0a 16 15 03 00 07 0e 35 04 4e 04 16 16 0f 00 02 0f
+4f 03 56 04 10 13 1d 01 03 0a 0c 05 63 04 1b 33 23 00 00 00 62 18 02 04 00
+63 32 00 32 00 32 00 50 68 61 73 65 47 72 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianGuitar
+** Description: Cross between a piano and a guitar, sort of
+** Controls: KV
+** Source: Art Hitzeman
+1f 12 08 02 0b 39 02 4e 04 0b 1e 06 02 04 09 22 04 56 09 13 1f 0c 03 05 05
+27 05 46 1c 16 1e 05 03 05 09 00 02 5d 04 13 02 20 00 00 00 62 18 02 04 00
+28 32 00 00 00 32 00 50 69 61 6e 47 75 69 74 61 72 63 63 63 32 32 32 00 00
+00 02 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rag Piano
+** Description: A piano for those Scott Joplin pieces
+** Controls: KV, MW (LFO pitch)
+** Source: Art Hitzeman
+1f 07 01 03 0e 2b 03 4c 04 08 16 03 02 04 0c 63 02 4c 09 16 1f 07 03 04 0a
+63 02 4a 23 15 17 16 06 04 0e 19 03 63 04 16 0a 1f 00 04 00 42 13 02 04 00
+28 32 00 00 00 32 00 52 61 67 20 50 69 61 6e 6f 20 63 63 63 33 33 33 00 05
+00 0c 00 05 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RatRhodes
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 08 08 0a 2b 47 63 00 06 1f 18 02 06 0c 00 01 59 2c 0b 1f 19 04 05 0f
+04 46 63 00 13 1f 15 0a 05 0d 07 07 57 0f 10 04 14 16 07 0c 4a 18 02 04 00
+63 32 33 2f 27 32 00 52 61 74 52 68 6f 64 65 73 20 63 63 63 32 32 32 00 30
+0c 58 00 00 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Reed Piano
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 16
+1f 0d 10 0d 0c 00 04 27 08 13 1f 1f 00 09 0f 24 43 42 04 16 1f 06 07 0a 0d
+17 03 57 08 10 1f 09 02 07 0e 00 03 63 04 13 3b 17 00 00 11 5e 0c 04 04 00
+63 32 00 32 00 32 00 52 65 65 64 20 50 69 61 6e 6f 63 63 63 32 32 32 00 03
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Piano3
+
+** Name: Rhodes...1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 0f 04 0f 00 01 2b 3f 06 1f 12 05 07 0e 4e 03 58 04 0b 1f 12 06 08 0e
+52 05 4a 08 0b 1f 12 06 08 0e 00 44 63 04 0b 38 14 00 00 10 66 0c 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 0f 04 0f 00 01 2b 3f 06 1f 12 05 07 0e 4e 02 58 04 0b 1f 12 06 08 0e
+52 01 4a 08 0b 1f 12 06 08 0e 00 40 63 04 0b 38 14 00 00 10 66 0c 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 04 00 08 0c 00 01 57 04 1b 1c 09 06 08 0c 4e 01 37 2a 0b 1c 04 00 08 0c
+52 05 60 08 13 1c 07 07 08 0b 00 05 63 04 03 04 22 21 00 00 02 18 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 04 00 08 0c 00 01 57 04 1b 1c 09 06 08 0c 4e 01 37 2a 0b 1c 04 00 08 0c
+52 00 60 08 13 1c 07 07 08 0b 00 00 63 04 03 04 22 21 00 00 02 18 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 04 00 08 0c 00 02 47 04 03 1c 15 0c 08 0c 4e 03 63 31 0b 1c 04 00 08 0c
+00 05 5f 08 03 1c 1f 07 04 0b 00 05 62 04 0b 34 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 04 00 08 0c 00 02 47 04 03 1c 15 0c 08 0c 4e 01 63 31 0b 1c 04 00 08 0c
+00 01 5f 08 03 1c 1f 07 04 0b 00 00 62 04 0b 34 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 04 00 08 0c 00 03 48 08 03 1c 15 0c 08 0c 4e 03 58 31 0b 1c 04 00 08 0c
+00 05 5a 08 03 1c 1f 07 04 0b 00 04 62 08 0b 36 14 00 00 00 62 0c 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 04 00 08 0c 00 03 48 08 03 1c 15 0c 08 0c 4e 01 58 31 0b 1c 04 00 08 0c
+00 00 5a 08 03 1c 1f 07 04 0b 00 00 62 08 0b 36 14 00 00 00 62 0c 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 09 06 07 05 00 43 52 04 0e 1c 09 05 0b 0a 4e 45 61 2a 0b 1c 06 06 07 0c
+00 44 5f 04 08 1c 07 07 07 0b 00 45 63 04 0e 34 13 00 00 24 66 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 09 06 07 05 00 42 52 04 0e 1c 09 05 0b 0a 4e 45 61 2a 0b 1c 06 06 07 0c
+00 40 5f 04 08 1c 07 07 07 0b 00 42 63 04 0e 34 13 00 00 24 66 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 03 02 0d 00 43 51 04 1b 1f 0d 0a 06 0d 4e 43 55 24 0b 1f 06 08 07 0d
+00 45 5a 04 03 1f 0f 09 07 0d 00 45 61 04 0b 26 13 00 00 24 66 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 03 02 0d 00 41 51 04 1b 1f 0d 0a 06 0d 4e 41 55 24 0b 1f 06 08 07 0d
+00 40 5a 04 03 1f 0f 09 07 0d 00 40 61 04 0b 26 13 00 00 24 66 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...7
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 0a 09 05 01 00 01 3d 13 16 19 0a 09 05 02 00 02 63 00 0c 19 07 09 05 07
+13 04 63 0d 0e 19 07 09 05 07 13 44 63 04 0b 7e 14 0a 00 39 06 0c 02 04 00
+63 15 27 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...7
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 0a 09 05 01 00 01 3d 13 16 19 0a 09 05 02 00 00 63 00 0c 19 07 09 05 07
+13 00 63 0d 0e 19 07 09 05 07 13 40 63 04 0b 7e 14 0a 00 39 06 0c 02 04 00
+63 15 27 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...8
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 09 00 07 0d 00 02 4c 04 1e 1c 0f 0a 05 0b 5c 03 5f 24 14 1c 06 06 07 0d
+13 05 5b 04 06 1c 0f 09 07 0b 13 45 5f 04 03 7e 14 0a 00 39 06 0c 02 04 00
+63 15 27 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...8
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 09 00 07 0d 00 00 4c 04 1e 1c 0f 0a 05 0b 5c 01 5f 24 14 1c 06 06 07 0d
+13 00 5b 04 06 1c 0f 09 07 0b 13 40 5f 04 03 7e 14 0a 00 39 06 0c 02 04 00
+63 15 27 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...9
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 04 00 08 0c 00 01 54 04 1b 1c 09 06 08 0c 4e 03 42 2a 0b 1c 04 00 08 0c
+52 06 63 04 13 1c 07 07 08 0b 00 46 63 04 03 06 19 21 00 2c 06 18 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes...9
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 04 00 08 0c 00 01 54 04 1b 1c 09 06 08 0c 4e 00 42 2a 0b 1c 04 00 08 0c
+52 00 63 04 13 1c 07 07 08 0b 00 40 63 04 03 06 19 21 00 2c 06 18 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes..10
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 04 00 08 0c 00 02 5b 04 1b 1c 09 06 08 0c 4e 03 57 24 1b 1c 04 00 08 0c
+52 04 63 04 13 1c 07 07 08 0b 00 44 63 04 03 07 19 21 00 2c 06 18 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 31 30 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes..10
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 04 00 08 0c 00 02 5b 04 1b 1c 09 06 08 0c 4e 00 57 24 1b 1c 04 00 08 0c
+52 00 63 04 13 1c 07 07 08 0b 00 40 63 04 03 07 19 21 00 2c 06 18 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 31 30 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes..11
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 0f 04 0f 00 03 34 0d 0e 1f 12 05 0b 0e 4e 05 45 19 03 1f 12 06 08 0e
+52 04 45 04 03 1f 12 06 08 0e 00 06 63 04 03 3c 22 21 00 00 02 0c 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 31 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes..11
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 0f 04 0f 00 01 34 0d 0e 1f 12 05 0b 0e 4e 01 45 19 03 1f 12 06 08 0e
+52 00 45 04 03 1f 12 06 08 0e 00 00 63 04 03 3c 22 21 00 00 02 0c 00 04 00
+63 00 00 00 00 32 00 52 68 6f 64 65 73 2e 2e 31 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes..12
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 04 00 08 0c 00 44 59 08 06 1a 15 0c 08 0c 4e 45 62 24 0b 1a 04 00 08 0c
+00 44 63 04 00 1a 1f 07 04 0b 00 46 62 04 0b 37 13 00 00 24 66 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes..12
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 04 00 08 0c 00 41 59 08 06 1a 15 0c 08 0c 4e 40 62 24 0b 1a 04 00 08 0c
+00 40 63 04 00 1a 1f 07 04 0b 00 40 62 04 0b 37 13 00 00 24 66 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes..13
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 02 02 0d 00 44 3d 22 1b 1f 0d 07 06 0d 32 46 45 1f 13 1f 06 04 07 0d
+00 45 36 04 03 1f 0f 05 07 0d 00 45 5f 04 03 03 13 00 00 24 66 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 31 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rhodes..13
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 02 02 0d 00 41 3d 22 1b 1f 0d 07 06 0d 32 41 45 1f 13 1f 06 04 07 0d
+00 41 36 04 03 1f 0f 05 07 0d 00 40 5f 04 03 03 13 00 00 24 66 18 01 04 00
+63 32 00 32 00 32 00 52 68 6f 64 65 73 2e 2e 31 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SkoolPiano
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 7
+1d 01 04 03 00 1a 01 48 04 0d 16 01 03 04 0c 63 04 4e 0d 13 18 04 03 03 00
+56 01 44 16 18 1a 07 03 06 0d 00 01 61 04 13 3a 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 53 6b 6f 6f 6c 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpacePiano
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 06 02 07 0d 00 05 3a 3a 13 1b 19 03 08 0b 00 45 63 2b 13 16 06 04 0c 0d
+00 44 62 04 0b 15 09 04 07 00 00 45 61 04 13 2c 19 00 00 51 66 18 04 04 00
+28 32 00 00 00 32 00 53 70 61 63 65 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SquareFlat
+** Description: a buzzy electric piano
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1f 1f 00 0e 0f 00 03 5c 04 06 1f 0e 03 0b 0e 43 03 55 04 13 1f 12 06 08 0e
+00 03 58 04 00 1f 12 08 08 0a 00 03 63 04 03 34 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 53 71 75 61 72 65 46 6c 61 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sus Piano
+** Description: Grand 2 with infinitely long sustain
+** Controls: KV
+** Source: Art Hitzeman
+1f 0e 03 03 09 29 07 4c 04 00 16 04 01 03 0d 63 02 4c 09 16 1f 10 02 03 0a
+63 02 4a 1c 15 17 04 00 05 0f 00 03 63 04 16 3a 1f 08 20 02 02 18 02 04 00
+28 63 00 00 00 32 00 53 75 73 20 50 69 61 6e 6f 20 63 63 63 32 32 32 00 00
+00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Thump Pno
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 8
+1f 11 0b 0f 00 00 03 41 05 16 1f 0b 04 04 0f 55 02 55 04 16 1f 09 04 09 0e
+3f 02 45 10 15 1f 09 07 07 0c 00 03 63 04 08 52 1d 13 00 00 52 0c 02 04 00
+63 16 00 00 00 32 00 54 68 75 6d 70 20 50 6e 6f 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Toy Piano
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 24
+1f 0f 0a 07 0c 27 02 50 0a 00 1f 0e 0a 09 0a 1a 02 4f 15 06 1d 10 0e 07 0e
+00 05 54 10 08 1d 10 0a 08 0a 00 01 60 08 0e 14 1a 00 00 00 62 24 02 04 00
+28 32 00 00 00 32 00 54 6f 79 20 50 69 61 6e 6f 20 63 63 63 32 32 32 00 07
+00 07 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Toy Piano
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 0d 07 0c 27 02 50 0a 00 1f 0e 0a 09 0d 1a 02 4f 15 06 1d 10 0e 07 0e
+00 05 54 10 08 1d 10 0d 08 0d 00 01 60 08 0e 14 1a 00 00 00 62 24 02 04 00
+28 32 00 00 00 32 00 54 6f 79 20 50 69 61 6e 6f 20 63 63 63 32 32 32 00 07
+00 07 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Upright *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 14 0a 0f 00 00 02 5e 0c 1b 17 0b 0a 0b 00 58 03 4e 0a 1c 1b 0a 10 01 00
+5e 01 50 00 0b 16 08 0a 06 00 1f 02 63 05 13 03 19 19 3c 00 42 05 02 04 00
+28 63 00 00 00 32 00 55 70 72 69 67 68 74 20 20 2a 63 63 63 32 32 32 08 7b
+00 00 00 14 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Upright
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 6
+16 1d 12 07 0c 00 42 42 07 04 1c 0e 03 05 0f 14 43 4f 04 16 1b 13 01 02 0f
+63 45 39 19 18 19 07 04 06 05 0a 42 63 04 13 1a 1e 00 06 02 42 18 02 04 00
+28 32 00 00 00 32 00 55 70 72 69 67 68 74 20 20 20 63 63 63 32 32 32 0b 02
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Upright
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 1d 12 07 0c 00 42 42 07 04 1c 0e 03 05 0f 14 43 4f 04 16 1b 13 01 02 0f
+63 45 39 19 18 19 07 04 06 05 0d 42 63 04 13 1a 1e 00 06 02 42 18 02 04 00
+28 32 00 00 00 32 00 55 70 72 69 67 68 74 20 20 20 63 63 63 32 32 32 0b 02
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: UprightBas
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 01 00 08 0d 16 02 4c 00 10 1f 08 05 07 0d 00 03 55 00 0e 1f 1c 03 07 0e
+13 02 50 00 10 1f 0e 05 06 0d 00 03 63 00 0b 3a 1b 0f 0a 00 52 0c 04 05 00
+63 4b 00 12 00 32 00 55 70 72 69 67 68 74 42 61 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Uprt piano
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 2
+13 02 01 04 0c 48 04 41 10 19 13 02 01 04 0c 45 03 59 04 10 13 02 01 04 0c
+48 03 4a 10 1d 13 02 01 04 0c 00 05 63 04 1b 3a 23 00 00 00 12 18 04 04 00
+63 32 00 00 00 32 00 55 70 72 74 20 70 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WiredPiano
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 04 03 09 1a 01 4a 04 1d 17 07 03 04 0b 0a 04 45 0d 13 19 05 03 03 0a
+41 02 46 22 18 1a 06 03 06 0b 00 02 61 04 13 3a 23 00 00 00 02 0c 02 04 00
+63 32 00 00 00 32 00 57 69 72 65 64 50 69 61 6e 6f 63 63 63 32 32 32 10 00
+00 00 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wood Piano
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 15
+1f 0c 07 08 03 00 04 4d 04 03 1f 05 07 08 0f 00 04 50 04 0b 1f 09 00 08 00
+00 04 63 00 08 1f 09 00 08 00 00 03 63 00 0b 34 19 00 07 00 52 24 01 04 00
+63 32 00 32 00 32 00 57 6f 6f 64 20 50 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: britegrand
+** Description: another electric piano
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1d 17 02 0f 0a 07 00 4e 0a 16 15 03 00 07 0e 35 04 4e 04 16 16 0f 00 02 0f
+4f 03 56 04 10 13 1d 01 03 0a 0c 05 63 04 1b 33 23 00 00 00 62 18 02 04 00
+63 32 00 32 00 32 00 62 72 69 74 65 67 72 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: callipiano
+** Description: an electric piano with tremolo sustain
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 11 0f 0e 0a 00 03 52 0a 06 1f 01 00 0b 00 43 03 5a 04 13 1f 03 05 08 0f
+00 03 5a 0a 03 1f 12 08 08 0a 00 03 63 04 03 14 1c 1d 07 00 62 18 01 04 00
+63 32 00 32 00 32 00 63 61 6c 6c 69 70 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: flatfunk
+** Description: a percussive electric piano sound
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 11 0f 0e 0a 00 04 52 13 06 1f 01 00 0b 00 43 04 5a 04 13 1f 05 05 08 0e
+00 04 5a 00 03 1f 12 08 08 0a 00 04 63 04 03 10 1c 1d 10 00 62 18 01 04 00
+63 32 00 32 00 32 00 66 6c 61 74 66 75 6e 6b 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: fuzzbass
+** Description: a very fuzzy bass electric piano
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 05 00 0e 0a 00 03 59 00 06 1f 09 00 0b 00 43 03 4d 04 13 1f 09 05 08 0e
+00 03 5c 04 03 1f 12 08 08 0a 00 03 62 04 03 3c 1c 1d 10 00 52 18 01 04 00
+63 32 00 32 00 32 00 66 75 7a 7a 62 61 73 73 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: metlmarimb
+** Description: a metallic electric piano
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 0e 01 0e 0c 00 03 5a 0a 06 1f 09 00 0b 00 43 03 4d 04 13 1f 09 05 08 0e
+00 03 59 08 03 1f 12 08 08 0a 00 03 62 00 03 3c 1c 1d 06 00 62 18 01 04 00
+63 32 00 32 00 32 00 6d 65 74 6c 6d 61 72 69 6d 62 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: mildfilter
+** Description: a variation on SquareFlat
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 02 03 06 00 0e 03 54 08 1b 1f 0b 00 09 0c 00 00 3c 04 04 1f 06 00 09 01
+00 00 4b 04 03 1f 1c 04 09 0a 00 03 63 08 03 38 1e 09 04 00 62 0c 02 05 00
+63 32 00 32 00 32 00 6d 69 6c 64 66 69 6c 74 65 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: phaseharp
+** Description: yet another electric piano
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 07 00 0e 0a 00 07 62 0a 06 1f 09 00 0b 00 43 07 4d 04 13 1f 09 05 08 0e
+00 01 59 08 03 1f 12 08 08 0a 00 00 62 04 03 3c 1c 1d 10 00 52 18 01 04 00
+63 32 00 32 00 32 00 70 68 61 73 65 68 61 72 70 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: pizzapiano
+** Description: yet another electric piano
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+13 10 00 0e 0a 00 03 54 08 06 1f 09 00 0b 00 43 03 4d 04 13 1f 09 05 08 0e
+00 03 59 08 03 1f 12 08 08 0a 00 03 62 04 03 3c 1c 1d 10 00 52 18 01 04 00
+63 32 00 32 00 32 00 70 69 7a 7a 61 70 69 61 6e 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: stringback
+** Description: an electric piano with interesting decay
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+06 05 00 0e 0a 00 03 52 08 06 19 02 00 0b 00 43 03 57 0a 13 1f 09 05 08 0e
+00 03 59 08 03 1f 12 08 08 0a 00 03 62 04 03 3c 1c 1d 10 00 52 18 01 04 00
+63 32 00 32 00 32 00 73 74 72 69 6e 67 62 61 63 6b 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 17
+
+* SUBCATEGORY Synthesizer1
+
+
+** Name: AnlgSynt.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+05 06 07 04 0a 23 04 52 08 0b 06 03 0c 06 0d 00 05 44 10 0c 12 01 06 06 0e
+00 05 63 04 05 06 06 09 06 0b 00 05 60 04 02 74 2a 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+05 06 07 04 0a 23 00 52 08 0b 06 03 0c 06 0d 00 00 44 10 0c 12 01 06 06 0e
+00 00 63 04 05 06 06 09 06 0b 00 00 60 04 02 74 2a 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 02 07 0c 04 5c 06 56 04 03 0f 03 03 08 0e 00 04 5f 04 06 1f 1f 00 0f 0f
+00 06 5f 04 03 1f 12 01 09 0e 00 05 5f 04 03 7c 2a 00 00 00 32 00 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 32 63 63 63 32 32 32 00 20
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 02 07 0c 04 5c 01 56 04 03 0f 03 03 08 0e 00 01 5f 04 06 1f 1f 00 0f 0f
+00 00 5f 04 03 1f 12 01 09 0e 00 00 5f 04 03 7c 2a 00 00 00 32 00 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 32 63 63 63 32 32 32 00 20
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 02 07 0c 04 5c 03 59 04 03 0f 03 03 08 0e 00 05 63 04 06 1f 1f 00 0f 0f
+00 07 63 04 03 1f 12 01 09 0e 00 06 5f 04 03 74 2a 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 33 63 63 63 32 32 32 00 10
+00 10 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 02 07 0c 04 5c 01 59 04 03 0f 03 03 08 0e 00 02 63 04 06 1f 1f 00 0f 0f
+00 00 63 04 03 1f 12 01 09 0e 00 00 5f 04 03 74 2a 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 33 63 63 63 32 32 32 00 10
+00 10 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 09 07 09 0a 5c 04 51 08 05 12 04 03 09 0c 00 05 51 08 00 1f 12 07 09 0e
+00 05 63 04 05 1b 09 0c 09 0a 00 06 54 04 00 7c 2a 00 00 00 42 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 34 63 63 63 32 32 32 00 10
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 09 07 09 0a 5c 01 51 08 05 12 04 03 09 0c 00 01 51 08 00 1f 12 07 09 0e
+00 00 63 04 05 1b 09 0c 09 0a 00 00 54 04 00 7c 2a 00 00 00 42 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 34 63 63 63 32 32 32 00 10
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0f 0f 09 0d 00 04 52 08 02 1e 04 06 0c 09 00 06 4d 0a 03 1f 09 07 09 0e
+00 05 61 04 04 1e 09 07 0a 0e 00 06 60 04 03 34 23 00 02 00 32 0c 02 04 00
+63 63 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 35 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0f 0f 09 0d 00 01 52 08 02 1e 04 06 0c 09 00 01 4d 0a 03 1f 09 07 09 0e
+00 00 61 04 04 1e 09 07 0a 0e 00 00 60 04 03 34 23 00 02 00 32 0c 02 04 00
+63 63 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 35 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 02 07 0c 04 5c 05 53 04 03 1f 0f 03 08 0f 00 04 54 04 05 1f 1f 00 0f 0f
+00 06 63 04 03 1f 09 01 09 09 00 05 5f 04 01 6c 23 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 36 63 63 63 32 32 32 00 00
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 02 07 0c 04 5c 02 53 04 03 1f 0f 03 08 0f 00 01 54 04 05 1f 1f 00 0f 0f
+00 00 63 04 03 1f 09 01 09 09 00 00 5f 04 01 6c 23 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 36 63 63 63 32 32 32 00 00
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 03 08 05 5c 05 5d 04 00 1f 0a 06 08 07 00 05 52 04 06 18 07 04 08 05
+00 05 63 04 00 1f 15 06 08 0e 00 46 62 04 08 2c 20 00 00 47 36 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 37 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 03 08 05 5c 02 5d 04 00 1f 0a 06 08 07 00 01 52 04 06 18 07 04 08 05
+00 00 63 04 00 1f 15 06 08 0e 00 40 62 04 08 2c 20 00 00 47 36 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 37 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 0c 07 09 07 00 04 58 08 06 12 0c 07 09 0a 00 06 5b 04 03 1f 16 00 09 0d
+00 06 56 04 06 1f 16 00 09 0d 00 06 62 08 03 2c 20 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.8
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 0c 07 09 07 00 01 58 08 06 12 0c 07 09 0a 00 01 5b 04 03 1f 16 00 09 0d
+00 00 56 04 06 1f 16 00 09 0d 00 00 62 08 03 2c 20 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.9
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0c 09 03 0c 00 03 5a 08 06 0f 0c 09 04 0c 00 04 59 04 02 1f 15 05 03 0d
+00 05 56 04 0e 1f 15 05 05 0d 00 47 62 04 0e 2c 26 21 11 00 22 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 39 63 63 63 32 32 32 00 40
+00 20 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt.9
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0c 09 03 0c 00 01 5a 08 06 0f 0c 09 04 0c 00 01 59 04 02 1f 15 05 03 0d
+00 00 56 04 0e 1f 15 05 05 0d 00 40 62 04 0e 2c 26 21 11 00 22 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 2e 39 63 63 63 32 32 32 00 40
+00 20 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt10
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0d 12 03 06 00 03 52 04 00 0f 04 12 09 0c 00 06 4a 10 0a 0f 15 06 03 0e
+00 05 63 04 08 1f 15 06 05 0d 00 45 62 04 0e 3c 26 21 20 00 52 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 30 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt10
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0d 12 03 06 00 01 52 04 00 0f 04 12 09 0c 00 01 4a 10 0a 0f 15 06 03 0e
+00 00 63 04 08 1f 15 06 05 0d 00 40 62 04 0e 3c 26 21 20 00 52 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 30 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt11
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 03 12 07 06 00 04 50 04 00 10 0d 12 07 06 00 05 56 04 02 11 06 06 08 0e
+00 06 63 04 08 10 15 06 08 0e 00 06 62 04 0e 3c 26 1c 20 00 42 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 31 63 63 63 32 32 32 00 00
+00 40 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt11
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 03 12 07 06 00 02 50 04 00 10 0d 12 07 06 00 01 56 04 02 11 06 06 08 0e
+00 00 63 04 08 10 15 06 08 0e 00 00 62 04 0e 3c 26 1c 20 00 42 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 31 63 63 63 32 32 32 00 00
+00 40 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt12
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 03 12 07 06 00 04 57 08 00 07 04 04 07 0d 00 04 56 0d 02 10 05 06 08 0e
+00 07 63 08 08 19 04 03 07 0f 00 06 62 04 04 2c 26 21 20 00 22 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt12
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 03 12 07 06 00 02 57 08 00 07 04 04 07 0d 00 03 56 0d 02 10 05 06 08 0e
+00 00 63 08 08 19 04 03 07 0f 00 00 62 04 04 2c 26 21 20 00 22 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt13
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 06 0a 0f 00 03 59 00 0b 1f 0c 06 0a 0b 00 04 63 00 02 1f 0c 05 0a 0b
+00 04 63 00 04 1f 16 02 0a 0f 00 06 62 00 02 2d 25 00 00 00 32 18 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 33 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt13
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 06 0a 0f 00 01 59 00 0b 1f 0c 06 0a 0b 00 00 63 00 02 1f 0c 05 0a 0b
+00 00 63 00 04 1f 16 02 0a 0f 00 00 62 00 02 2d 25 00 00 00 32 18 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 33 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt14
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 00 06 07 1b 03 58 04 09 1f 06 00 04 09 13 04 54 0d 0d 1f 07 00 07 07
+0b 05 63 08 09 1f 06 00 04 09 00 05 62 04 0d 2c 1c 00 05 00 22 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt14
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 00 06 07 1b 01 58 04 09 1f 06 00 04 09 13 02 54 0d 0d 1f 07 00 07 07
+0b 00 63 08 09 1f 06 00 04 09 00 00 62 04 0d 2c 1c 00 05 00 22 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt15
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 01 08 03 1b 03 63 00 09 1f 15 06 09 0f 00 05 57 04 01 1f 15 06 09 0f
+00 04 63 04 01 1f 15 06 09 0f 00 06 62 00 01 2c 1c 00 05 00 22 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AnlgSynt15
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 01 08 03 1b 01 63 00 09 1f 15 06 09 0f 00 01 57 04 01 1f 15 06 09 0f
+00 00 63 04 01 1f 15 06 09 0f 00 00 62 00 01 2c 1c 00 05 00 22 0c 02 04 00
+28 02 00 00 00 32 00 41 6e 6c 67 53 79 6e 74 31 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ariesynth1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 01 05 09 00 03 55 00 03 1f 03 00 05 06 2d 03 59 0d 0b 1f 08 00 04 0c
+43 05 63 13 0b 1c 06 04 04 07 00 05 63 08 0b 6d 21 00 38 00 22 0c 06 04 00
+63 32 00 32 00 32 00 41 72 69 65 73 79 6e 74 68 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ariesynth1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 08 01 05 09 00 01 55 00 03 1f 03 00 05 06 2d 02 59 0d 0b 1f 08 00 04 0c
+43 00 63 13 0b 1c 06 04 04 07 00 00 63 08 0b 6d 21 00 38 00 22 0c 06 04 00
+63 32 00 32 00 32 00 41 72 69 65 73 79 6e 74 68 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ariesynth2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 01 05 09 00 03 53 00 03 1f 03 00 05 06 2d 05 52 00 13 1f 08 00 04 0c
+43 05 55 00 0b 1c 06 04 05 07 00 07 63 04 0b 7a 21 00 38 00 22 0c 06 04 00
+63 32 00 32 00 32 00 41 72 69 65 73 79 6e 74 68 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ariesynth2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 08 01 05 09 00 01 53 00 03 1f 03 00 05 06 2d 01 52 00 13 1f 08 00 04 0c
+43 00 55 00 0b 1c 06 04 05 07 00 00 63 04 0b 7a 21 00 38 00 22 0c 06 04 00
+63 32 00 32 00 32 00 41 72 69 65 73 79 6e 74 68 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: A.R.P. *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 08 06 0d 00 00 4c 04 03 1f 07 00 04 0c 00 00 42 04 03 1f 04 00 02 0d
+00 00 42 04 03 1a 0c 00 08 0e 00 00 63 04 03 3a 21 00 00 00 52 0c 02 0d 1f
+28 63 00 00 00 32 00 20 20 41 2e 52 2e 50 2e 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP 2500
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 16 00 05 0e 0a 04 62 00 01 1f 0d 10 05 00 0e 05 3f 10 12 1f 0d 10 05 00
+0c 04 3a 0d 15 10 1f 00 0b 0f 00 0d 63 04 04 6d 14 00 36 00 22 18 04 04 01
+63 19 33 00 00 32 00 41 52 50 20 32 35 30 30 20 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP 2500
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 16 00 05 0e 0a 01 62 00 01 1f 0d 10 05 00 0e 01 3f 10 12 1f 0d 10 05 00
+0c 01 3a 0d 15 10 1f 00 0b 0f 00 00 63 04 04 6d 14 00 36 00 22 18 04 04 01
+63 19 33 00 00 32 00 41 52 50 20 32 35 30 30 20 20 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP 2600.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 08 02 03 03 00 05 60 04 04 10 05 06 08 03 00 25 63 0a 03 10 05 05 08 03
+00 1d 63 0a 04 10 05 05 08 03 00 3d 63 08 03 2d 23 00 00 00 42 0c 05 04 01
+63 32 00 00 00 32 00 41 52 50 20 32 36 30 30 2e 31 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP 2600.1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 08 02 03 03 00 02 60 04 04 10 05 06 08 03 00 20 63 0a 03 10 05 05 08 03
+00 18 63 0a 04 10 05 05 08 03 00 38 63 08 03 2d 23 00 00 00 42 0c 05 04 01
+63 32 00 00 00 32 00 41 52 50 20 32 36 30 30 2e 31 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP 2600.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 16 00 05 0e 0a 03 63 04 01 1f 0d 10 05 00 0e 05 3c 10 12 1f 0d 10 05 00
+0c 05 35 13 15 10 1f 00 0b 0f 00 05 63 04 04 7f 14 00 36 00 22 18 04 04 00
+63 19 33 00 00 32 00 41 52 50 20 32 36 30 30 2e 32 63 63 63 32 32 32 00 50
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP 2600.2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 16 00 05 0e 0a 00 63 04 01 1f 0d 10 05 00 0e 00 3c 10 12 1f 0d 10 05 00
+0c 00 35 13 15 10 1f 00 0b 0f 00 00 63 04 04 7f 14 00 36 00 22 18 04 04 00
+63 19 33 00 00 32 00 41 52 50 20 32 36 30 30 2e 32 63 63 63 32 32 32 00 50
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP Axxe.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 08 00 05 0f 14 04 5c 00 11 18 08 00 05 0f 14 03 5c 04 11 18 08 00 05 0f
+14 06 61 00 15 18 08 00 05 0f 14 05 63 04 15 6c 22 00 0b 00 62 0c 07 0d 01
+63 63 63 32 00 32 00 41 52 50 20 41 78 78 65 2e 31 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP Axxe.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 08 00 05 0f 14 01 5c 00 11 18 08 00 05 0f 14 01 5c 04 11 18 08 00 05 0f
+14 00 61 00 15 18 08 00 05 0f 14 00 63 04 15 6c 22 00 0b 00 62 0c 07 0d 01
+63 63 63 32 00 32 00 41 52 50 20 41 78 78 65 2e 31 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP Axxe.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 05 02 07 09 00 05 59 08 03 15 12 03 04 0d 00 04 54 08 01 18 07 05 07 0d
+00 05 63 04 06 0f 04 03 07 0d 00 06 63 04 06 64 1a 00 00 00 12 0c 06 0d 02
+28 32 00 00 00 32 00 41 52 50 20 41 78 78 65 2e 32 63 63 63 32 32 32 00 00
+00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP Axxe.2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 05 02 07 09 00 02 59 08 03 15 12 03 04 0d 00 02 54 08 01 18 07 05 07 0d
+00 00 63 04 06 0f 04 03 07 0d 00 00 63 04 06 64 1a 00 00 00 12 0c 06 0d 02
+28 32 00 00 00 32 00 41 52 50 20 41 78 78 65 2e 32 63 63 63 32 32 32 00 00
+00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP Omni.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 00 05 0e 00 44 4e 08 02 0d 07 0e 06 06 0e 45 63 0d 04 0c 1f 00 06 0f
+52 46 63 19 04 0b 1f 06 08 0f 0a 46 63 08 03 35 23 08 10 06 56 0c 07 04 00
+63 63 00 00 00 32 00 41 52 50 20 4f 6d 6e 69 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP Omni.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 00 05 0e 00 42 4e 08 02 0d 07 0e 06 06 0e 42 63 0d 04 0c 1f 00 06 0f
+52 40 63 19 04 0b 1f 06 08 0f 0a 40 63 08 03 35 23 08 10 06 56 0c 07 04 00
+63 63 00 00 00 32 00 41 52 50 20 4f 6d 6e 69 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP Omni.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 03 1e 05 04 56 05 50 0d 06 0b 03 1e 05 04 23 03 4b 08 0d 0a 1f 01 08 0f
+15 05 57 08 08 0a 1f 00 05 0f 25 06 5b 08 01 54 22 05 0c 00 52 0c 0c 04 00
+63 32 00 00 00 32 00 41 52 50 20 4f 6d 6e 69 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ARP Omni.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 03 1e 05 04 56 01 50 0d 06 0b 03 1e 05 04 23 01 4b 08 0d 0a 1f 01 08 0f
+15 00 57 08 08 0a 1f 00 05 0f 25 00 5b 08 01 54 22 05 0c 00 52 0c 0c 04 00
+63 32 00 00 00 32 00 41 52 50 20 4f 6d 6e 69 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Axel F
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+19 05 01 04 03 2c 00 48 04 0b 11 01 05 04 0c 3c 02 42 08 0b 19 04 05 05 0a
+20 01 48 1c 0c 11 13 05 04 0f 00 02 63 04 13 3a 1f 00 04 00 42 18 02 04 00
+28 32 00 00 00 32 00 41 78 65 6c 20 46 20 20 20 20 63 63 63 32 32 32 00 00
+00 40 00 00 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Axel F...1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 0d 02 06 0e 00 04 58 04 00 15 04 14 06 0c 00 05 5f 04 0a 13 15 03 06 0e
+00 05 63 04 08 15 15 06 06 0d 00 05 62 04 0e 34 26 21 20 47 12 0c 00 04 00
+63 32 00 32 00 32 00 41 78 65 6c 20 46 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Axel F...1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 0d 02 06 0e 00 01 58 04 00 15 04 14 06 0c 00 01 5f 04 0a 13 15 03 06 0e
+00 00 63 04 08 15 15 06 06 0d 00 00 62 04 0e 34 26 21 20 47 12 0c 00 04 00
+63 32 00 32 00 32 00 41 78 65 6c 20 46 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Axel F...2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 15 02 06 0e 00 03 5a 04 08 15 04 14 06 0c 00 04 5f 04 0a 15 15 03 06 0e
+00 06 63 04 08 15 15 06 06 0d 00 46 62 04 0e 2c 26 21 20 2b 16 0c 00 04 00
+63 32 00 32 00 32 00 41 78 65 6c 20 46 2e 2e 2e 32 63 63 63 32 32 32 00 10
+00 20 00 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Axel F...2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 15 02 06 0e 00 01 5a 04 08 15 04 14 06 0c 00 01 5f 04 0a 15 15 03 06 0e
+00 00 63 04 08 15 15 06 06 0d 00 40 62 04 0e 2c 26 21 20 2b 16 0c 00 04 00
+63 32 00 32 00 32 00 41 78 65 6c 20 46 2e 2e 2e 32 63 63 63 32 32 32 00 10
+00 20 00 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BadSample*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 15 00 01 00 00 00 43 3d 00 14 1f 00 01 0d 00 00 4a 0a 00 1f 0b 00 01 00
+00 00 46 13 06 14 1b 0b 07 0f 00 01 63 04 0b 00 63 00 17 63 7f 0c 02 04 00
+28 63 00 00 00 32 00 42 61 64 53 61 6d 70 6c 65 2a 63 63 63 32 32 32 09 40
+00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Beta.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+05 09 00 07 0d 20 45 54 08 0a 0d 08 01 05 0d 00 46 4e 00 0a 1c 00 00 04 0f
+00 46 2f 19 04 10 05 00 05 0f 00 45 54 08 0c 3a 23 00 05 30 62 00 05 04 00
+63 32 00 00 00 32 00 42 65 74 61 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Beta.....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 09 00 07 0d 20 43 58 08 0a 0d 03 00 05 07 00 44 56 04 02 1c 00 00 04 0f
+00 46 45 0d 04 10 04 00 05 07 00 45 56 08 04 2b 23 00 05 30 62 00 05 04 00
+63 32 00 00 00 32 00 42 65 74 61 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BigWash
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 0e 05 00 18 02 54 13 10 1f 19 08 0a 0c 00 03 5c 13 0c 1f 05 00 02 00
+5e 04 52 24 11 1f 10 08 07 0e 00 04 63 0d 0b 02 1a 16 03 00 52 00 02 04 00
+63 28 00 1e 00 32 00 42 69 67 57 61 73 68 20 20 20 63 63 63 32 32 32 00 20
+20 30 10 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chroma...1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 1f 07 09 00 03 44 2a 03 15 16 03 04 0d 00 06 55 0d 01 18 19 07 07 0d
+00 03 63 04 06 0f 04 03 07 0d 00 05 63 04 06 64 1a 00 00 00 12 0c 04 04 00
+28 32 00 00 00 32 00 43 68 72 6f 6d 61 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chroma...2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 00 09 0a 00 02 5c 08 04 1f 13 1f 01 07 00 03 55 10 03 13 15 06 09 0d
+00 06 59 04 03 1f 09 0b 06 0c 00 04 63 04 0b 2c 21 17 02 0d 32 18 04 04 00
+28 32 00 00 00 32 00 43 68 72 6f 6d 61 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chroma...3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 06 03 08 0f 00 04 54 04 13 1f 0a 00 09 07 00 04 41 2a 1b 15 06 03 09 0f
+00 04 5c 04 13 1f 0a 00 09 0d 00 05 63 04 0b 34 23 00 00 00 12 18 04 04 00
+28 32 00 00 00 32 00 43 68 72 6f 6d 61 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Crazy 6502
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 09 04 07 0f 00 43 48 0a 08 10 09 04 07 0f 00 44 63 0d 0e 10 09 04 07 0f
+00 45 63 04 08 0f 03 01 07 0f 00 45 63 04 08 05 2c 00 63 63 37 24 04 04 00
+63 01 63 00 00 32 00 43 72 61 7a 79 20 36 35 30 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Crazy 6502
+** Controls: MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 09 04 07 0f 00 40 48 0a 08 10 09 04 07 0f 00 40 63 0d 0e 10 09 04 07 0f
+00 40 63 04 08 0f 03 01 07 0f 00 40 63 04 08 05 2c 00 63 63 37 24 04 04 00
+63 01 63 00 00 32 00 43 72 61 7a 79 20 36 35 30 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DigiAnnie
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 32
+1f 0c 05 05 0c 17 02 53 0a 08 1f 11 02 05 0d 1e 02 45 04 00 1f 13 0e 05 0d
+32 01 3f 1f 06 1f 1f 08 06 0f 00 02 61 04 16 39 1d 00 00 00 52 0c 04 04 00
+63 32 00 00 00 32 00 44 69 67 69 41 6e 6e 69 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <> DS 1 <>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 1f 00 02 0f 00 05 58 04 1e 17 1f 01 02 0f 0a 04 49 0d 03 19 1f 00 03 0f
+08 06 63 00 16 12 1f 00 01 0f 14 06 63 00 1b 34 00 00 00 00 02 0c 07 04 00
+63 63 00 32 00 32 00 3c 3e 20 44 53 20 31 20 3c 3e 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <> DS 1 <>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 1f 00 02 0f 00 02 58 04 1e 17 1f 01 02 0f 0a 01 49 0d 03 19 1f 00 03 0f
+08 00 63 00 16 12 1f 00 01 0f 14 00 63 00 1b 34 00 00 00 00 02 0c 07 04 00
+63 63 00 32 00 32 00 3c 3e 20 44 53 20 31 20 3c 3e 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: < DS 11 >
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 1f 00 02 0f 00 04 4f 04 1e 17 1f 01 02 0f 0a 04 3b 04 03 19 1f 00 03 0f
+08 04 63 00 16 12 1f 00 01 0f 14 07 63 10 1b 34 20 00 0a 00 02 0c 07 04 00
+63 63 00 32 00 32 00 3c 20 44 53 20 31 31 20 3e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: < DS 11 >
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 1f 00 02 0f 00 00 4f 04 1e 17 1f 01 02 0f 0a 00 3b 04 03 19 1f 00 03 0f
+08 00 63 00 16 12 1f 00 01 0f 14 00 63 10 1b 34 20 00 0a 00 02 0c 07 04 00
+63 63 00 32 00 32 00 3c 20 44 53 20 31 31 20 3e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EML Synth1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 00 01 04 07 00 05 56 04 0e 0f 07 01 05 0b 00 06 52 04 08 13 07 00 06 0e
+00 04 60 00 03 13 05 00 06 0e 00 06 62 04 0b 7c 19 00 0c 00 42 18 07 04 00
+63 32 63 32 00 32 00 45 4d 4c 20 53 79 6e 74 68 31 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EML Synth1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 00 01 04 07 00 02 56 04 0e 0f 07 01 05 0b 00 02 52 04 08 13 07 00 06 0e
+00 00 60 00 03 13 05 00 06 0e 00 00 62 04 0b 7c 19 00 0c 00 42 18 07 04 00
+63 32 63 32 00 32 00 45 4d 4c 20 53 79 6e 74 68 31 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EML Synth2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 00 01 04 07 00 03 54 04 0e 0f 07 01 05 0b 00 02 5b 08 10 13 07 00 06 0e
+00 05 60 00 03 13 05 00 06 0e 00 05 62 08 0b 7c 19 00 0c 00 42 18 07 04 00
+63 32 63 32 00 32 00 45 4d 4c 20 53 79 6e 74 68 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EML Synth2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 00 01 04 07 00 02 54 04 0e 0f 07 01 05 0b 00 01 5b 08 10 13 07 00 06 0e
+00 00 60 00 03 13 05 00 06 0e 00 00 62 08 0b 7c 19 00 0c 00 42 18 07 04 00
+63 32 63 32 00 32 00 45 4d 4c 20 53 79 6e 74 68 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Explorer.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 09 07 07 0d 00 02 5a 00 09 0f 00 03 06 0d 00 03 63 04 05 15 09 07 07 0d
+00 07 63 04 0a 0f 00 03 06 0d 00 06 63 08 09 7e 23 30 00 00 22 18 04 04 00
+63 01 63 00 00 32 00 45 78 70 6c 6f 72 65 72 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Explorer.1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 09 07 07 0d 00 02 5a 00 09 0f 00 03 06 0d 00 00 63 04 05 15 09 07 07 0d
+00 00 63 04 0a 0f 00 03 06 0d 00 00 63 08 09 7e 23 30 00 00 22 18 04 04 00
+63 01 63 00 00 32 00 45 78 70 6c 6f 72 65 72 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Explorer.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 09 07 07 0d 00 05 63 19 09 0f 00 03 06 0d 00 04 52 08 00 15 09 07 07 0d
+00 06 41 00 0e 13 00 03 06 0d 00 05 63 04 0b 77 17 00 0b 00 22 18 04 04 00
+63 01 63 00 00 32 00 45 78 70 6c 6f 72 65 72 2e 32 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Explorer.2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 09 07 07 0d 00 00 63 19 09 0f 00 03 06 0d 00 00 52 08 00 15 09 07 07 0d
+00 00 41 00 0e 13 00 03 06 0d 00 00 63 04 0b 77 17 00 0b 00 22 18 04 04 00
+63 01 63 00 00 32 00 45 78 70 6c 6f 72 65 72 2e 32 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Explorer.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 09 07 07 0d 00 02 51 08 0c 0f 00 04 06 0d 00 04 63 08 0a 15 09 07 07 0d
+00 04 63 04 0d 0f 00 04 06 0d 00 06 63 0d 08 7e 17 00 0b 00 22 18 04 04 00
+63 01 63 00 00 32 00 45 78 70 6c 6f 72 65 72 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Explorer.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 09 07 07 0d 00 02 51 08 0c 0f 00 04 06 0d 00 00 63 08 0a 15 09 07 07 0d
+00 00 63 04 0d 0f 00 04 06 0d 00 00 63 0d 08 7e 17 00 0b 00 22 18 04 04 00
+63 01 63 00 00 32 00 45 78 70 6c 6f 72 65 72 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FMMelodica
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0c 00 0a 0d 20 44 50 0a 09 11 0c 00 0a 0d 20 44 50 0a 03 11 05 00 0a 0f
+00 43 63 04 01 11 05 00 09 0f 00 43 63 04 0b 44 21 15 03 05 5e 11 04 04 00
+63 1e 55 00 00 32 00 46 4d 4d 65 6c 6f 64 69 63 61 63 63 63 32 32 32 00 40
+00 40 00 28 00 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gamma....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 06 00 02 0e 14 03 5c 04 06 08 1f 00 02 0f 00 44 47 08 13 06 1f 00 04 0f
+4e 04 3c 0d 03 10 06 00 05 0e 00 06 5f 08 0b 72 21 1d 0e 1a 56 0c 08 04 00
+63 32 00 00 00 32 00 47 61 6d 6d 61 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gamma....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 06 00 02 0e 14 05 52 08 06 0c 1f 00 02 0f 00 45 3b 08 13 0a 1f 00 04 0f
+4e 05 4c 10 03 10 06 00 05 0e 00 06 5f 04 0b 6a 21 1d 0e 1a 56 0c 08 04 01
+63 32 00 00 00 32 00 47 61 6d 6d 61 2e 2e 2e 2e 32 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+--Bank 18
+
+** Name: GleeSynth
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 03 09 06 0e 0a 03 52 08 14 0c 04 07 06 0c 00 04 42 19 08 15 04 02 05 0e
+00 05 63 08 06 0b 15 0c 06 0f 00 45 5e 19 08 2c 26 21 08 47 26 00 02 04 00
+28 02 00 00 00 32 00 47 6c 65 65 53 79 6e 74 68 20 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GleeSynth
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 03 09 06 0e 0a 01 52 08 14 0c 04 07 06 0c 00 01 42 19 08 15 04 02 05 0e
+00 00 63 08 06 0b 15 0c 06 0f 00 40 5e 19 08 2c 26 21 08 47 26 00 02 04 00
+28 02 00 00 00 32 00 47 6c 65 65 53 79 6e 74 68 20 63 63 63 32 32 32 00 10
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HardSync
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+11 00 00 05 0c 00 00 44 05 06 1b 05 00 0a 0e 00 01 4f 0a 0a 18 07 00 08 0e
+3b 02 43 20 09 15 0a 00 0b 0f 00 01 63 04 0b 72 1d 08 00 00 52 05 04 04 01
+63 41 00 00 00 32 00 48 61 72 64 53 79 6e 63 20 20 63 63 63 32 32 32 00 51
+00 50 00 71 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Helix....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+08 1f 00 03 0f 63 04 58 08 03 08 0e 00 05 01 00 04 63 04 02 07 04 0c 06 07
+3c 05 61 0d 0c 08 1f 01 05 0f 00 07 62 00 13 75 22 00 14 00 32 0c 04 04 00
+63 01 63 00 00 32 00 48 65 6c 69 78 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Helix....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+08 1f 00 03 0f 63 02 58 08 03 08 0e 00 05 01 00 00 63 04 02 07 04 0c 06 07
+3c 00 61 0d 0c 08 1f 01 05 0f 00 00 62 00 13 75 22 00 14 00 32 0c 04 04 00
+63 01 63 00 00 32 00 48 65 6c 69 78 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Helix....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+08 1f 00 03 0f 63 05 5f 08 03 08 07 00 05 08 00 06 53 00 02 07 04 0c 06 07
+3c 05 61 0d 0c 08 1f 01 05 0f 00 06 63 04 13 6c 22 00 14 00 32 0c 04 04 00
+63 01 63 00 00 32 00 48 65 6c 69 78 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Helix....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+08 1f 00 03 0f 63 02 5f 08 03 08 07 00 05 08 00 01 53 00 02 07 04 0c 06 07
+3c 00 61 0d 0c 08 1f 01 05 0f 00 00 63 04 13 6c 22 00 14 00 32 0c 04 04 00
+63 01 63 00 00 32 00 48 65 6c 69 78 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: \ ISAO \
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 17 1b 01 0e 00 42 39 04 0b 0f 00 03 05 0d 00 03 2e 08 0b 0f 00 03 05 0d
+00 45 63 08 0b 10 00 03 05 0d 00 06 63 04 0b 2c 1b 00 3c 63 26 18 02 04 01
+63 32 00 32 00 32 00 20 5c 20 49 53 41 4f 20 5c 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: \ ISAO \
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 17 1b 01 0e 00 40 39 04 0b 0f 00 03 05 0d 00 00 2e 08 0b 0f 00 03 05 0d
+00 40 63 08 0b 10 00 03 05 0d 00 00 63 04 0b 2c 1b 00 3c 63 26 18 02 04 01
+63 32 00 32 00 32 00 20 5c 20 49 53 41 4f 20 5c 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: \ ISAO \
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+18 17 1b 00 0e 00 40 39 04 0b 0f 00 03 05 0d 00 00 2e 08 0b 0f 00 03 05 0d
+00 40 63 08 0b 10 00 03 05 0d 00 00 63 04 0b 2c 1b 00 3c 63 26 18 02 04 01
+63 32 00 32 00 32 00 20 5c 20 49 53 41 4f 20 5c 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: JP 4.....1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 05 01 05 08 00 04 51 0a 03 18 09 00 05 0b 2d 04 60 00 13 14 08 00 03 0c
+43 05 63 04 1b 18 08 04 04 07 00 06 63 04 13 7c 21 00 38 00 22 0c 06 04 00
+63 32 00 32 00 32 00 4a 50 20 34 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: JP 4.....1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+17 05 01 05 08 00 01 51 0a 03 18 09 00 05 0b 2d 01 60 00 13 14 08 00 03 0c
+43 00 63 04 1b 18 08 04 04 07 00 00 63 04 13 7c 21 00 38 00 22 0c 06 04 00
+63 32 00 32 00 32 00 4a 50 20 34 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: JP 4.....2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 08 03 05 0f 00 03 54 04 06 16 0a 0a 05 0d 00 05 54 0d 03 16 09 01 06 0f
+00 07 63 04 00 16 15 01 06 0d 00 07 59 00 05 3c 25 49 0f 00 32 0c 0c 04 00
+63 00 00 00 00 32 00 4a 50 20 34 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: JP 4.....2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 08 03 05 0f 00 01 54 04 06 16 0a 0a 05 0d 00 03 54 0d 03 16 09 01 06 0f
+00 04 63 04 00 16 15 01 06 0d 00 00 59 00 05 3c 25 49 0f 00 32 0c 0c 04 00
+63 00 00 00 00 32 00 4a 50 20 34 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Juno Juice
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+06 0a 05 03 0f 00 02 4e 03 02 1f 0e 00 03 0f 00 01 50 05 01 15 0e 00 07 0f
+00 02 63 03 01 16 0e 00 07 0f 00 02 63 05 06 3c 20 00 00 00 52 05 02 04 00
+63 32 00 00 00 32 00 4a 75 6e 6f 20 4a 75 69 63 65 63 63 63 32 32 32 00 06
+00 31 00 56 00 11 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Juno Who?
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 00 03 0f 00 01 4a 03 02 1f 0e 00 03 0f 00 01 50 05 01 15 0e 00 07 0f
+00 02 63 03 01 16 0e 00 07 0f 00 02 63 05 06 3c 20 00 00 00 52 05 02 04 00
+63 32 00 00 00 32 00 4a 75 6e 6f 20 57 68 6f 3f 20 63 63 63 32 32 32 00 26
+00 31 00 56 00 11 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jupiter *
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 04 0f 35 00 3d 22 02 1f 00 00 04 0f 19 00 41 0d 05 1f 00 00 04 0f
+3b 00 41 18 06 0c 0a 00 05 0e 00 40 63 0d 0c 01 1e 0c 0f 05 56 00 02 04 00
+28 63 00 00 00 32 00 4a 75 70 69 74 65 72 20 20 2a 63 63 63 32 32 32 00 0f
+00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: \ Kitaro.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 1f 04 07 0f 00 02 4f 00 06 17 0c 06 09 0f 00 01 5a 00 16 14 1f 04 09 0f
+00 06 63 04 06 18 1f 00 0d 0f 00 06 56 04 03 7c 29 00 05 00 22 18 05 04 00
+63 63 63 00 00 32 00 5c 20 4b 69 74 61 72 6f 2e 31 63 63 63 32 32 32 00 00
+00 30 00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: \ Kitaro.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 1f 04 07 0f 00 02 4f 00 06 17 0c 06 09 0f 00 01 5a 00 16 14 1f 04 09 0f
+00 00 63 04 06 18 1f 00 0d 0f 00 00 56 04 03 7c 29 00 05 00 22 18 05 04 00
+63 63 63 00 00 32 00 5c 20 4b 69 74 61 72 6f 2e 31 63 63 63 32 32 32 00 00
+00 30 00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: \ Kitaro.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 09 09 0f 00 3c 52 0a 02 08 04 03 09 0f 00 1d 55 04 02 1f 0f 09 09 0f
+00 1d 63 04 04 1f 0f 09 09 0f 00 3e 63 04 04 64 1f 1c 14 00 32 18 02 04 00
+63 32 00 00 00 32 00 5c 20 4b 69 74 61 72 6f 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: \ Kitaro.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 09 09 0f 00 3a 52 0a 02 08 04 03 09 0f 00 1a 55 04 02 1f 0f 09 09 0f
+00 18 63 04 04 1f 0f 09 09 0f 00 38 63 04 04 64 1f 1c 14 00 32 18 02 04 00
+63 32 00 00 00 32 00 5c 20 4b 69 74 61 72 6f 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Korg 770.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 07 02 0f 47 04 35 04 05 0a 1f 02 02 0f 00 45 43 04 02 0a 1f 02 04 0f
+4e 05 55 04 0c 0a 1f 02 05 0f 00 06 60 08 1b 63 21 1d 0e 1a 56 0c 08 04 0a
+63 32 00 00 00 32 00 4b 6f 72 67 20 37 37 30 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Korg 770.1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 07 02 0f 47 00 35 04 05 0a 1f 02 02 0f 00 40 43 04 02 0a 1f 02 04 0f
+4e 00 55 04 0c 0a 1f 02 05 0f 00 00 60 08 1b 63 21 1d 0e 1a 56 0c 08 04 0a
+63 32 00 00 00 32 00 4b 6f 72 67 20 37 37 30 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Korg 770.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 07 02 0f 47 03 48 04 05 0f 1f 00 08 0f 00 46 62 04 02 0f 1f 00 08 0f
+00 05 63 04 04 0f 1f 00 08 0f 00 04 60 08 03 7d 21 1d 0e 1a 56 0c 06 0d 02
+63 32 00 00 00 32 00 4b 6f 72 67 20 37 37 30 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Korg 770.2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 07 02 0f 47 00 48 04 05 0f 1f 00 08 0f 00 40 62 04 02 0f 1f 00 08 0f
+00 00 63 04 04 0f 1f 00 08 0f 00 00 60 08 03 7d 21 1d 0e 1a 56 0c 06 0d 02
+63 32 00 00 00 32 00 4b 6f 72 67 20 37 37 30 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Korg 770.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 0a 07 09 0e 4d 03 4f 04 03 12 1f 00 0a 0f 00 05 39 04 03 12 1f 00 0a 0f
+4b 05 38 04 03 12 1f 00 0a 0f 01 07 5f 04 03 3b 1e 05 0a 00 62 0c 02 04 00
+63 32 00 00 00 32 00 4b 6f 72 67 20 37 37 30 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Korg 770.3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 0a 07 09 0e 4d 00 4f 04 03 12 1f 00 0a 0f 00 00 39 04 03 12 1f 00 0a 0f
+4b 00 38 04 03 12 1f 00 0a 0f 01 00 5f 04 03 3b 1e 05 0a 00 62 0c 02 04 00
+63 32 00 00 00 32 00 4b 6f 72 67 20 37 37 30 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+* SUBCATEGORY Synthesizer2
+
+** Name: Lambda...1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 06 04 04 0f 00 04 41 08 01 1f 0e 05 05 09 00 07 4a 13 04 09 06 00 05 0f
+00 06 5f 08 06 1f 11 08 05 0f 00 06 61 04 00 44 23 2f 19 00 32 18 07 04 00
+63 32 63 32 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lambda...1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 06 04 04 0f 00 01 41 08 01 1f 0e 05 05 09 00 02 4a 13 04 09 06 00 05 0f
+00 00 5f 08 06 1f 11 08 05 0f 00 00 61 04 00 44 23 2f 19 00 32 18 07 04 00
+63 32 63 32 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lambda...2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 0c 09 05 0d 00 03 45 10 03 1f 0b 0a 08 0c 00 04 54 04 03 0b 0c 09 05 0d
+00 06 5f 04 03 1f 04 09 08 0f 00 06 5f 00 03 74 23 00 00 00 32 18 07 04 00
+63 32 63 32 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lambda...2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 0c 09 05 0d 00 01 45 10 03 1f 0b 0a 08 0c 00 01 54 04 03 0b 0c 09 05 0d
+00 00 5f 04 03 1f 04 09 08 0f 00 00 5f 00 03 74 23 00 00 00 32 18 07 04 00
+63 32 63 32 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lambda...3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+07 10 03 09 0f 00 05 47 0d 00 1f 14 05 05 09 00 04 4d 13 16 07 10 03 09 0f
+00 05 5c 0d 03 1f 14 08 05 0f 00 05 63 04 02 44 23 2f 19 00 32 18 07 04 00
+63 32 63 32 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 33 63 63 63 32 32 32 00 40
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lambda...3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 10 03 09 0f 00 02 47 0d 00 1f 14 05 05 09 00 01 4d 13 16 07 10 03 09 0f
+00 00 5c 0d 03 1f 14 08 05 0f 00 00 63 04 02 44 23 2f 19 00 32 18 07 04 00
+63 32 63 32 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 33 63 63 63 32 32 32 00 40
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lambda...4
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+07 10 03 0d 0f 00 03 4c 08 00 1f 14 05 04 09 00 03 4d 0d 16 07 10 03 0e 0f
+00 06 5c 08 03 1f 14 08 04 0f 00 03 63 08 02 44 23 2f 19 00 32 18 07 04 00
+63 32 63 32 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lambda...4
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 10 03 0d 0f 00 01 4c 08 00 1f 14 05 04 09 00 01 4d 0d 16 07 10 03 0e 0f
+00 00 5c 08 03 1f 14 08 04 0f 00 00 63 08 02 44 23 2f 19 00 32 18 07 04 00
+63 32 63 32 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lambda...5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+05 03 03 05 08 00 03 55 08 00 18 06 09 05 09 00 04 51 04 06 05 10 03 05 0f
+00 07 63 08 03 18 06 09 05 09 00 06 63 04 03 24 21 23 0f 00 12 18 05 04 00
+63 63 63 00 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 35 63 63 63 32 32 32 00 20
+00 10 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lambda...5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+05 03 03 05 08 00 02 55 08 00 18 06 09 05 09 00 01 51 04 06 05 10 03 05 0f
+00 00 63 08 03 18 06 09 05 09 00 00 63 04 03 24 21 23 0f 00 12 18 05 04 00
+63 63 63 00 00 32 00 4c 61 6d 62 64 61 2e 2e 2e 35 63 63 63 32 32 32 00 20
+00 10 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 07 0f 00 03 54 08 03 07 0d 04 0a 0f 00 04 59 0a 03 1f 03 03 09 0c
+00 06 62 0a 03 0f 0d 05 0f 0f 00 05 63 0a 03 34 23 15 05 63 26 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 07 0f 00 01 54 08 03 07 0d 04 0a 0f 00 01 59 0a 03 1f 03 03 09 0c
+00 00 62 0a 03 0f 0d 05 0f 0f 00 00 63 0a 03 34 23 15 05 63 26 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 15 06 0a 0e 00 04 4b 28 0b 1b 0a 09 0f 0e 00 04 5c 04 0b 1f 03 0a 09 0c
+00 06 62 08 13 18 09 06 0a 0e 00 05 63 04 03 2c 23 15 05 63 26 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 32 63 63 63 32 32 32 00 00
+00 50 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 15 06 0a 0e 00 01 4b 28 0b 1b 0a 09 0f 0e 00 01 5c 04 0b 1f 03 0a 09 0c
+00 00 62 08 13 18 09 06 0a 0e 00 00 63 04 03 2c 23 15 05 63 26 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 32 63 63 63 32 32 32 00 00
+00 50 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 07 0f 0f 00 03 45 04 06 1f 1f 0a 0f 0f 00 04 5b 00 0c 1f 04 00 0f 0f
+00 06 5f 04 03 1f 1f 00 0f 0f 00 05 63 04 05 6c 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 07 0f 0f 00 01 45 04 06 1f 1f 0a 0f 0f 00 02 5b 00 0c 1f 04 00 0f 0f
+00 00 5f 04 03 1f 1f 00 0f 0f 00 00 63 04 05 6c 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 07 0f 0f 2e 03 5a 04 06 1c 1f 03 0f 0f 2c 04 5b 00 0c 1f 04 00 0f 0f
+00 05 5f 04 03 16 1f 00 0f 0f 00 06 63 04 05 6c 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 07 0f 0f 2e 01 5a 04 06 1c 1f 03 0f 0f 2c 01 5b 00 0c 1f 04 00 0f 0f
+00 00 5f 04 03 16 1f 00 0f 0f 00 00 63 04 05 6c 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 15 06 0a 0e 2a 03 4a 22 06 1b 09 09 0f 0d 3a 04 63 04 0c 18 09 04 0a 0e
+00 06 63 04 03 18 09 06 0a 0e 01 06 5e 0d 12 6c 23 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 15 06 0a 0e 2a 01 4a 22 06 1b 09 09 0f 0d 3a 00 63 04 0c 18 09 04 0a 0e
+00 00 63 04 03 18 09 06 0a 0e 01 00 5e 0d 12 6c 23 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 09 03 06 07 2a 05 62 04 03 18 10 06 07 0b 3a 05 63 04 0b 15 1f 1c 0f 00
+00 05 63 04 03 15 06 06 0a 0c 01 05 63 04 03 6c 23 00 00 00 42 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 09 03 06 07 2a 01 62 04 03 18 10 06 07 0b 3a 00 63 04 0b 15 1f 1c 0f 00
+00 00 63 04 03 15 06 06 0a 0c 01 00 63 04 03 6c 23 00 00 00 42 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 0f 07 06 09 42 03 57 0d 02 18 0b 09 07 0b 32 06 63 04 03 18 1f 00 0f 0f
+00 05 63 04 05 1f 06 06 0a 0c 01 05 63 04 03 5c 23 00 00 00 42 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 37 63 63 63 32 32 32 00 00
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 0f 07 06 09 42 01 57 0d 02 18 0b 09 07 0b 32 01 63 04 03 18 1f 00 0f 0f
+00 01 63 04 05 1f 06 06 0a 0c 01 00 63 04 03 5c 23 00 00 00 42 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 37 63 63 63 32 32 32 00 00
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 07 05 09 0f 42 03 56 08 06 1f 16 00 08 0e 00 05 63 04 03 1f 16 00 08 0e
+00 04 63 04 03 1f 16 00 08 0e 00 06 63 04 03 6d 25 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 38 63 63 63 32 32 32 00 20
+00 20 00 00 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LeadSynth8
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 07 05 09 0f 42 02 56 08 06 1f 16 00 08 0e 00 00 63 04 03 1f 16 00 08 0e
+00 00 63 04 03 1f 16 00 08 0e 00 00 63 04 03 6d 25 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 4c 65 61 64 53 79 6e 74 68 38 63 63 63 32 32 32 00 20
+00 20 00 00 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Luna.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+05 07 00 05 0e 00 44 4c 04 00 05 07 00 05 0e 0e 45 52 04 06 0c 1f 00 06 0f
+00 05 63 04 00 0c 1f 00 07 0f 0a 06 63 08 06 34 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 4c 75 6e 61 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 10
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Luna.....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+08 07 00 05 0e 00 04 51 00 00 0c 03 00 05 08 0e 04 40 13 06 0c 1f 00 06 0f
+00 05 60 04 00 0c 1f 00 07 0f 0a 06 5e 00 06 2c 22 00 0f 00 42 18 07 04 00
+63 63 00 00 00 32 00 4c 75 6e 61 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Luna.....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+05 07 00 05 0e 00 44 4b 08 00 0c 07 00 05 0e 0e 45 52 0a 06 05 1f 00 06 0f
+00 05 63 08 00 0c 1f 00 07 0f 0a 06 4b 0a 06 34 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 4c 75 6e 61 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lyrisyn
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 20
+10 06 00 05 0e 00 01 50 0a 04 1f 04 00 05 0f 00 01 51 04 02 1f 0b 00 0a 0f
+00 01 35 08 03 10 1f 00 0a 0f 00 02 63 04 03 30 1e 00 00 00 52 18 04 04 00
+63 32 00 00 00 32 00 4c 79 72 69 73 79 6e 20 20 20 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MaxiKorg.1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 07 0f 63 00 53 04 06 1f 1f 00 07 0f 00 00 63 00 02 1f 1f 00 07 0f
+3c 00 61 08 04 1f 1f 00 07 0f 00 00 62 04 03 75 22 00 14 00 32 0c 06 0d 01
+63 01 63 00 00 32 00 4d 61 78 69 4b 6f 72 67 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MaxiKorg.2
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 08 0f 00 03 54 00 06 17 1f 00 07 0f 00 06 4b 04 02 1f 1f 00 08 0f
+00 04 61 08 04 15 1f 00 08 0f 00 45 62 08 03 74 1e 00 0e 35 56 18 06 05 00
+63 01 63 00 00 32 00 4d 61 78 69 4b 6f 72 67 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MaxiKorg.2
+** Controls: MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 08 0f 00 00 54 00 06 17 1f 00 07 0f 00 00 4b 04 02 1f 1f 00 08 0f
+00 00 61 08 04 15 1f 00 08 0f 00 40 62 08 03 74 1e 00 0e 35 56 18 06 05 00
+63 01 63 00 00 32 00 4d 61 78 69 4b 6f 72 67 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MicroMoog1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 03 01 07 0d 27 05 4b 0a 0d 14 05 01 05 0f 00 05 56 04 0c 15 04 00 0a 0d
+11 06 50 08 09 17 05 00 0a 02 27 06 5a 08 05 61 24 00 04 00 42 0c 02 0d 11
+63 63 00 00 00 32 00 4d 69 63 72 6f 4d 6f 6f 67 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MicroMoog1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 03 01 07 0d 27 02 4b 0a 0d 14 05 01 05 0f 00 02 56 04 0c 15 04 00 0a 0d
+11 00 50 08 09 17 05 00 0a 02 27 00 5a 08 05 61 24 00 04 00 42 0c 02 0d 11
+63 63 00 00 00 32 00 4d 69 63 72 6f 4d 6f 6f 67 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MicroMoog2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 01 01 05 0d 27 02 4d 00 03 14 02 01 05 0f 00 04 4e 00 03 15 01 00 05 0d
+11 05 58 08 03 17 02 00 05 02 27 07 63 08 03 78 24 00 04 00 42 0c 02 0c 11
+63 63 00 00 00 32 00 4d 69 63 72 6f 4d 6f 6f 67 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MicroMoog2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 01 01 05 0d 27 01 4d 00 03 14 02 01 05 0f 00 01 4e 00 03 15 01 00 05 0d
+11 01 58 08 03 17 02 00 05 02 27 01 63 08 03 78 24 00 04 00 42 0c 02 0c 11
+63 63 00 00 00 32 00 4d 69 63 72 6f 4d 6f 6f 67 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MiniMoog *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 09 00 01 0d 00 00 4d 04 06 0f 0d 00 01 0b 00 00 45 04 00 0b 04 00 01 0d
+00 00 44 04 03 0f 0c 00 07 0e 00 00 63 04 03 3a 21 00 00 00 52 11 02 04 00
+28 63 00 00 00 32 00 4d 69 6e 69 4d 6f 6f 67 20 2a 63 63 63 32 32 32 00 08
+00 08 00 08 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MiniMoog.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 1b 06 0f 0f 00 01 5c 00 02 1f 0a 03 0f 0e 00 02 41 04 0c 1f 09 04 0f 0f
+00 06 62 04 14 1c 10 04 0c 0e 00 05 63 04 0b 6c 23 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 4d 69 6e 69 4d 6f 6f 67 2e 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MiniMoog.1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 1b 06 0f 0f 00 01 5c 00 02 1f 0a 03 0f 0e 00 01 41 04 0c 1f 09 04 0f 0f
+00 00 62 04 14 1c 10 04 0c 0e 00 00 63 04 0b 6c 23 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 4d 69 6e 69 4d 6f 6f 67 2e 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MiniMoog.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0a 03 0f 0e 00 06 58 08 14 1c 1b 06 0f 0f 00 04 5c 08 0e 1c 10 04 0c 0f
+00 07 62 04 0b 1f 09 09 0f 0f 00 05 63 04 14 74 23 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 4d 69 6e 69 4d 6f 6f 67 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MiniMoog.2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0a 03 0f 0e 00 01 58 08 14 1c 1b 06 0f 0f 00 01 5c 08 0e 1c 10 04 0c 0f
+00 00 62 04 0b 1f 09 09 0f 0f 00 00 63 04 14 74 23 00 00 00 32 0c 02 04 00
+63 63 00 00 00 32 00 4d 69 6e 69 4d 6f 6f 67 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MiniMoog.3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0a 03 0f 0e 00 03 5e 08 14 1b 0a 03 0f 07 00 05 60 00 06 1c 10 04 0c 0f
+00 05 62 04 0b 1c 10 04 0c 0f 00 06 63 04 0c 6c 23 00 00 00 32 0c 02 04 04
+63 63 00 00 00 32 00 4d 69 6e 69 4d 6f 6f 67 2e 33 63 63 63 32 32 32 00 20
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MiniMoog.3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 0a 03 0f 0e 00 03 5e 08 14 1b 0a 03 0f 07 00 01 60 00 06 1c 10 04 0c 0f
+00 00 62 04 0b 1c 10 04 0c 0f 00 00 63 04 0c 6c 23 00 00 00 32 0c 02 04 04
+63 63 00 00 00 32 00 4d 69 6e 69 4d 6f 6f 67 2e 33 63 63 63 32 32 32 00 20
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mirage *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 08 00 05 0f 45 01 45 08 0b 1f 00 00 04 0f 30 00 4d 08 00 11 08 03 05 0f
+26 07 5b 13 16 10 0a 08 06 0f 00 02 63 08 0b 03 1e 00 0a 00 32 00 02 04 00
+28 63 00 00 00 32 00 4d 69 72 61 67 65 20 20 20 2a 63 63 63 32 32 32 00 20
+00 70 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MoogBass *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 00 06 0c 00 00 4e 05 06 1f 18 00 04 0c 0f 00 50 03 00 1f 04 00 02 0d
+23 00 48 04 06 17 0c 00 08 0e 19 00 63 04 03 3a 21 00 00 00 52 0c 02 0c 00
+28 63 00 00 00 32 00 4d 6f 6f 67 42 61 73 73 20 2a 63 63 63 32 32 32 00 11
+00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MultiMoog1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 07 00 05 0e 00 04 56 00 00 1f 03 00 05 08 0e 04 42 13 06 1f 1f 00 06 0f
+00 07 56 04 00 1f 1f 00 07 0f 0a 06 5e 00 06 33 22 00 0f 00 42 18 07 04 00
+63 63 00 00 00 32 00 4d 75 6c 74 69 4d 6f 6f 67 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MultiMoog1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 07 00 05 0e 00 02 56 00 00 1f 03 00 05 08 0e 01 42 13 06 1f 1f 00 06 0f
+00 01 56 04 00 1f 1f 00 07 0f 0a 00 5e 00 06 33 22 00 0f 00 42 18 07 04 00
+63 63 00 00 00 32 00 4d 75 6c 74 69 4d 6f 6f 67 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MultiMoog2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 07 00 05 0e 00 45 53 08 00 1f 07 00 05 0e 0e 46 44 0a 06 1f 1f 00 06 0f
+00 04 54 08 00 1f 1f 00 07 0f 0a 06 63 0a 06 32 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 4d 75 6c 74 69 4d 6f 6f 67 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MultiMoog2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 07 00 05 0e 00 42 53 08 00 1f 07 00 05 0e 0e 42 44 0a 06 1f 1f 00 06 0f
+00 01 54 08 00 1f 1f 00 07 0f 0a 00 63 0a 06 32 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 4d 75 6c 74 69 4d 6f 6f 67 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: No!NotJump
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0a 00 03 0f 29 00 44 03 02 0f 0e 00 03 0f 42 01 5f 05 01 1d 0e 00 07 0f
+00 02 63 03 04 13 0e 00 07 0f 00 02 63 05 06 3c 20 00 00 00 52 05 02 04 00
+63 32 00 00 00 32 00 4e 6f 21 4e 6f 74 4a 75 6d 70 63 63 63 32 32 32 00 56
+00 31 00 46 00 11 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <> OB 1 <>
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 1f 00 02 0f 00 04 56 00 1e 17 1f 01 02 0f 0a 04 45 04 03 19 1f 00 03 0f
+08 06 58 08 16 12 1f 00 01 0f 14 05 5b 04 1b 2a 00 00 00 00 02 0c 07 0c 01
+63 63 00 32 00 32 00 3c 3e 20 4f 42 20 31 20 3c 3e 63 63 63 32 32 32 00 30
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: <> OB 1 <>
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 1f 00 02 0f 00 01 56 00 1e 17 1f 01 02 0f 0a 01 45 04 03 19 1f 00 03 0f
+08 01 58 08 16 12 1f 00 01 0f 14 00 5b 04 1b 2a 00 00 00 00 02 0c 07 0c 01
+63 63 00 32 00 32 00 3c 3e 20 4f 42 20 31 20 3c 3e 63 63 63 32 32 32 00 30
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OB-8 *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 08 00 06 0e 0c 40 49 03 06 12 08 00 03 0e 00 00 4d 04 03 11 1f 00 06 0f
+0a 00 63 03 0e 0c 1f 00 07 0f 00 00 63 04 0b 3c 23 00 00 00 5a 05 02 04 00
+28 63 00 00 00 32 63 20 20 4f 42 2d 38 20 20 20 2a 63 63 63 32 32 32 00 06
+00 08 00 06 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oberheim.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 0f 0f 00 04 5c 00 16 1d 0c 04 0f 0e 00 04 5e 00 02 1f 0c 04 0f 0e
+00 05 63 00 04 1f 0c 04 0f 0e 00 05 63 04 03 2c 00 00 13 00 42 18 02 04 00
+28 02 00 00 00 32 00 4f 62 65 72 68 65 69 6d 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oberheim.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 0f 0f 00 01 5c 00 16 1d 0c 04 0f 0e 00 01 5e 00 02 1f 0c 04 0f 0e
+00 00 63 00 04 1f 0c 04 0f 0e 00 00 63 04 03 2c 00 00 13 00 42 18 02 04 00
+28 02 00 00 00 32 00 4f 62 65 72 68 65 69 6d 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oberheim.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 02 04 04 0e 05 03 58 00 06 12 09 04 04 0f 00 04 4c 00 00 0b 0c 04 04 0e
+00 05 63 00 03 11 0b 03 06 0f 00 05 63 00 03 2c 23 00 13 00 42 18 02 04 00
+28 02 00 00 00 32 00 4f 62 65 72 68 65 69 6d 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oberheim.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 02 04 04 0e 05 02 58 00 06 12 09 04 04 0f 00 01 4c 00 00 0b 0c 04 04 0e
+00 00 63 00 03 11 0b 03 06 0f 00 00 63 00 03 2c 23 00 13 00 42 18 02 04 00
+28 02 00 00 00 32 00 4f 62 65 72 68 65 69 6d 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oberheim.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 0c 04 05 0e 05 03 57 00 00 0c 0c 04 04 0e 05 04 52 00 06 0a 0c 04 05 0e
+00 05 63 04 06 0a 1f 00 05 0f 00 05 63 00 06 3c 17 00 20 00 42 18 02 04 00
+28 02 00 00 00 32 00 4f 62 65 72 68 65 69 6d 2e 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Oberheim.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 0c 04 05 0e 05 02 57 00 00 0c 0c 04 04 0e 05 01 52 00 06 0a 0c 04 05 0e
+00 00 63 04 06 0a 1f 00 05 0f 00 00 63 00 06 3c 17 00 20 00 42 18 02 04 00
+28 02 00 00 00 32 00 4f 62 65 72 68 65 69 6d 2e 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+* SUBCATEGORY Synthesizer3
+
+
+** Name: Odyssey..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 1f 04 09 0f 00 04 5c 00 0d 19 03 01 09 00 00 06 53 00 04 1f 16 03 09 0d
+00 04 63 00 0a 19 06 06 09 06 00 05 63 00 0b 6c 1e 00 0a 00 32 18 04 04 00
+63 01 63 00 00 32 00 4f 64 79 73 73 65 79 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Odyssey..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 1f 04 09 0f 00 01 5c 00 0d 19 03 01 09 00 00 02 53 00 04 1f 16 03 09 0d
+00 00 63 00 0a 19 06 06 09 06 00 00 63 00 0b 6c 1e 00 0a 00 32 18 04 04 00
+63 01 63 00 00 32 00 4f 64 79 73 73 65 79 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Odyssey..2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 02 01 05 0f 00 3b 5b 00 00 1b 13 01 0d 0a 00 1d 63 00 03 1f 05 06 05 0f
+00 1d 63 00 00 1f 04 03 0c 0f 00 3e 63 00 0b 2c 00 00 00 00 32 18 02 04 00
+63 32 00 00 00 32 00 4f 64 79 73 73 65 79 2e 2e 32 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Odyssey..2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 02 01 05 0f 00 39 5b 00 00 1b 13 01 0d 0a 00 1a 63 00 03 1f 05 06 05 0f
+00 18 63 00 00 1f 04 03 0c 0f 00 38 63 00 0b 2c 00 00 00 00 32 18 02 04 00
+63 32 00 00 00 32 00 4f 64 79 73 73 65 79 2e 2e 32 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Odyssey..3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 05 04 06 0e 1e 3d 56 0a 0d 1f 09 00 06 00 00 1d 5d 00 05 1b 02 04 06 0e
+1e 1d 63 00 0b 1f 00 00 07 0f 00 3d 63 00 0c 2c 1d 00 00 00 42 18 02 04 00
+63 32 00 00 00 32 00 4f 64 79 73 73 65 79 2e 2e 33 63 63 63 32 32 32 00 20
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Odyssey..3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 05 04 06 0e 1e 3a 56 0a 0d 1f 09 00 06 00 00 19 5d 00 05 1b 02 04 06 0e
+1e 18 63 00 0b 1f 00 00 07 0f 00 38 63 00 0c 2c 1d 00 00 00 42 18 02 04 00
+63 32 00 00 00 32 00 4f 64 79 73 73 65 79 2e 2e 33 63 63 63 32 32 32 00 20
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OhB1Kanobe
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 1f 00 0a 0f 00 04 55 00 0b 10 1f 00 0a 0f 00 05 55 00 0b 12 0d 09 0a 0e
+15 07 62 08 0a 12 0d 09 0a 0e 15 05 63 08 0b 5c 25 00 4b 00 12 0c 02 04 00
+28 02 00 00 00 32 00 4f 68 42 31 4b 61 6e 6f 62 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OhB1Kanobe
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 1f 00 0a 0f 00 01 55 00 0b 10 1f 00 0a 0f 00 01 55 00 0b 12 0d 09 0a 0e
+15 00 62 08 0a 12 0d 09 0a 0e 15 00 63 08 0b 5c 25 00 4b 00 12 0c 02 04 00
+28 02 00 00 00 32 00 4f 68 42 31 4b 61 6e 6f 62 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Omega....1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+08 09 10 05 08 00 03 52 10 03 1f 05 00 05 0b 2d 04 4e 08 13 1f 08 00 03 0c
+43 06 47 10 1b 1c 06 04 04 07 00 06 63 04 13 7a 21 00 38 00 22 0c 06 04 00
+63 32 00 32 00 32 00 4f 6d 65 67 61 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Omega....2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 00 0a 09 37 04 5a 08 0c 1f 1f 0d 0a 0f 39 46 63 08 01 18 04 1c 0a 0a
+63 05 63 0d 02 1f 1f 00 0a 0f 00 06 62 04 06 15 46 28 0a 1a 56 0c 07 04 00
+63 19 00 32 00 32 00 4f 6d 65 67 61 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PCM Duck *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 07 00 0f 0d 00 00 5c 00 08 0d 1f 00 06 0f 16 00 57 00 15 0b 06 03 0f 0e
+0e 07 46 1c 10 1c 14 08 0d 0e 00 02 63 04 03 03 23 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 50 43 4d 20 44 75 63 6b 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianoSynth
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+06 02 07 04 0c 1f 0a 46 04 0a 12 1f 00 03 0f 63 04 61 04 13 03 06 16 03 03
+63 05 5a 0a 13 14 05 12 03 03 00 05 5e 08 0d 7b 23 0f 0e 00 42 0c 02 04 00
+63 32 00 00 00 32 00 50 69 61 6e 6f 53 79 6e 74 68 63 63 63 32 32 32 00 20
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianoSynth
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+06 02 07 04 0c 1f 0a 46 04 0a 12 1f 00 03 0f 63 01 61 04 13 03 06 16 03 03
+63 01 5a 0a 13 14 05 12 03 03 00 00 5e 08 0d 7b 23 0f 0e 00 42 0c 02 04 00
+63 32 00 00 00 32 00 50 69 61 6e 6f 53 79 6e 74 68 63 63 63 32 32 32 00 20
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PlkAnalog
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 14 02 01 06 00 06 51 0a 0e 10 1f 02 05 0f 00 04 63 03 08 0b 1f 00 08 0f
+00 03 63 05 0e 1a 1f 00 05 0f 00 04 60 04 0b 3d 1f 0e 00 00 46 11 02 04 00
+28 32 00 12 00 32 00 50 6c 6b 41 6e 61 6c 6f 67 20 63 63 63 32 32 32 04 30
+00 56 00 31 07 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Poly 61
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 07 03 04 07 0a 04 5a 08 03 1f 03 0c 06 00 00 05 60 08 0b 12 10 0c 06 0e
+00 05 61 08 01 12 12 0c 06 0e 00 45 5f 08 0b 35 1f 0b 11 1b 26 18 02 04 00
+28 02 00 00 00 32 00 50 6f 6c 79 20 36 31 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Poly 61
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 07 03 04 07 0a 02 5a 08 03 1f 03 0c 06 00 00 00 60 08 0b 12 10 0c 06 0e
+00 00 61 08 01 12 12 0c 06 0e 00 40 5f 08 0b 35 1f 0b 11 1b 26 18 02 04 00
+28 02 00 00 00 32 00 50 6f 6c 79 20 36 31 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PolyFusion
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 07 00 05 0e 00 44 56 04 00 08 07 00 05 0e 0e 44 51 04 06 0e 1f 00 06 0f
+00 04 63 04 00 0c 1f 00 07 0f 0a 06 63 08 06 34 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 50 6f 6c 79 46 75 73 69 6f 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PolyFusion
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0a 07 00 05 0e 00 41 56 04 00 08 07 00 05 0e 0e 41 51 04 06 0e 1f 00 06 0f
+00 00 63 04 00 0c 1f 00 07 0f 0a 00 63 08 06 34 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 50 6f 6c 79 46 75 73 69 6f 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PolyMoog.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 02 04 01 0a 05 59 08 0b 1f 0a 0c 06 00 00 44 50 19 13 10 03 03 06 0e
+00 06 63 0d 01 12 03 01 06 0f 00 45 63 08 0b 2c 1f 0b 11 1b 26 0c 02 04 00
+28 02 00 00 00 32 00 50 6f 6c 79 4d 6f 6f 67 2e 31 63 63 63 32 32 32 00 20
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PolyMoog.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 02 04 01 0a 02 59 08 0b 1f 0a 0c 06 00 00 41 50 19 13 10 03 03 06 0e
+00 01 63 0d 01 12 03 01 06 0f 00 40 63 08 0b 2c 1f 0b 11 1b 26 0c 02 04 00
+28 02 00 00 00 32 00 50 6f 6c 79 4d 6f 6f 67 2e 31 63 63 63 32 32 32 00 20
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PolyMoog.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 1f 00 03 0f 63 03 59 08 0e 0e 1f 01 05 0f 00 04 63 08 0c 0a 04 0c 06 07
+3c 06 63 0d 12 0e 1f 01 05 0f 00 05 63 04 0a 75 22 00 14 00 32 00 04 04 00
+63 01 63 00 00 32 00 50 6f 6c 79 4d 6f 6f 67 2e 32 63 63 63 32 32 32 00 20
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PolyMoog.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 1f 00 03 0f 63 01 59 08 0e 0e 1f 01 05 0f 00 00 63 08 0c 0a 04 0c 06 07
+3c 00 63 0d 12 0e 1f 01 05 0f 00 00 63 04 0a 75 22 00 14 00 32 00 04 04 00
+63 01 63 00 00 32 00 50 6f 6c 79 4d 6f 6f 67 2e 32 63 63 63 32 32 32 00 20
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: P.P.G *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 05 07 0f 22 03 4c 07 02 12 04 02 04 0d 08 00 59 00 05 1d 10 06 01 0d
+0c 00 2f 3d 06 1f 0a 00 07 0f 09 02 63 04 03 02 29 00 1f 00 32 0c 02 04 00
+28 63 00 00 00 32 00 20 50 2e 50 2e 47 20 20 20 2a 63 63 63 32 32 32 00 07
+00 00 00 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Prophet *
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 0a 00 05 0b 00 00 4f 03 00 1f 0b 00 01 0a 00 00 4a 03 05 1b 16 00 05 0d
+00 00 63 03 06 1c 16 00 06 0d 00 00 63 05 00 34 1f 00 06 00 32 05 02 04 00
+28 63 00 00 00 32 00 50 72 6f 70 68 65 74 20 20 2a 63 63 63 32 32 32 00 06
+00 06 00 06 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Prophet..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 03 04 0a 06 00 04 4b 04 00 13 07 04 0a 0c 00 04 46 04 06 16 07 04 0a 0c
+00 05 22 16 03 17 07 04 0a 0c 00 06 63 04 03 2b 22 21 00 00 32 18 04 05 00
+28 32 00 00 00 32 00 50 72 6f 70 68 65 74 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Prophet..1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 03 04 0a 06 00 02 4b 04 00 13 07 04 0a 0c 00 01 46 04 06 16 07 04 0a 0c
+00 01 22 16 03 17 07 04 0a 0c 00 00 63 04 03 2b 22 21 00 00 32 18 04 05 00
+28 32 00 00 00 32 00 50 72 6f 70 68 65 74 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Prophet..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 03 02 07 0f 00 04 4e 04 00 1b 0c 0f 07 0f 19 06 49 0d 03 1b 06 04 07 0d
+00 05 63 04 0b 1b 03 03 07 0d 00 07 63 04 15 74 23 00 12 00 12 18 04 05 00
+28 32 00 00 00 32 00 50 72 6f 70 68 65 74 2e 2e 32 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Prophet..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 03 02 07 0f 00 02 4e 04 00 1b 0c 0f 07 0f 19 02 49 0d 03 1b 06 04 07 0d
+00 00 63 04 0b 1b 03 03 07 0d 00 00 63 04 15 74 23 00 12 00 12 18 04 05 00
+28 32 00 00 00 32 00 50 72 6f 70 68 65 74 2e 2e 32 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Prophet..3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 04 12 08 0c 19 05 4f 04 00 0e 04 12 08 0c 19 06 4c 04 03 10 03 06 08 0e
+00 06 63 04 0b 10 03 04 08 0e 00 06 63 04 0d 3c 26 1d 23 00 22 18 04 05 00
+28 32 00 00 00 32 00 50 72 6f 70 68 65 74 2e 2e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Prophet..3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 04 12 08 0c 19 01 4f 04 00 0e 04 12 08 0c 19 01 4c 04 03 10 03 06 08 0e
+00 00 63 04 0b 10 03 04 08 0e 00 00 63 04 0d 3c 26 1d 23 00 22 18 04 05 00
+28 32 00 00 00 32 00 50 72 6f 70 68 65 74 2e 2e 33 63 63 63 32 32 32 00 00
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PS 3100..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+08 1f 07 02 0f 47 04 54 0d 05 08 1f 02 02 0f 00 44 53 08 02 07 1f 02 04 0f
+4e 06 4a 00 0c 07 1f 02 05 0f 00 05 5f 08 1b 63 21 1d 0e 1a 56 0c 08 04 0a
+63 32 00 00 00 32 00 50 53 20 33 31 30 30 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PS 3100..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+08 1f 07 02 0f 47 01 54 0d 05 08 1f 02 02 0f 00 41 53 08 02 07 1f 02 04 0f
+4e 01 4a 00 0c 07 1f 02 05 0f 00 00 5f 08 1b 63 21 1d 0e 1a 56 0c 08 04 0a
+63 32 00 00 00 32 00 50 53 20 33 31 30 30 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PS 3100..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 1f 07 02 0f 47 04 53 0a 06 07 1f 02 02 0f 00 44 4e 04 04 0d 1f 02 04 0f
+4e 06 48 0d 0a 07 1f 02 05 0f 00 05 62 04 19 61 21 1d 0e 1a 56 0c 08 04 0f
+63 32 00 00 00 32 00 50 53 20 33 31 30 30 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PS 3100..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 1f 07 02 0f 47 01 53 0a 06 07 1f 02 02 0f 00 41 4e 04 04 0d 1f 02 04 0f
+4e 01 48 0d 0a 07 1f 02 05 0f 00 00 62 04 19 61 21 1d 0e 1a 56 0c 08 04 0f
+63 32 00 00 00 32 00 50 53 20 33 31 30 30 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PS 3300..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 07 01 02 0f 47 03 54 08 05 0c 08 01 02 0f 00 44 50 08 02 0b 07 01 04 0f
+4e 06 4f 00 0c 0c 06 02 05 0f 00 06 5f 08 0b 63 21 1d 0e 1a 56 0c 08 04 0a
+63 32 00 00 00 32 00 50 53 20 33 33 30 30 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PS 3300..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 07 01 02 0f 47 01 54 08 05 0c 08 01 02 0f 00 41 50 08 02 0b 07 01 04 0f
+4e 01 4f 00 0c 0c 06 02 05 0f 00 00 5f 08 0b 63 21 1d 0e 1a 56 0c 08 04 0a
+63 32 00 00 00 32 00 50 53 20 33 33 30 30 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PS 3300..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 05 01 02 0d 47 03 4d 08 06 0f 05 00 02 0f 00 43 4a 04 04 07 06 01 04 0f
+4e 04 4e 08 02 07 04 01 05 0d 00 05 62 00 09 61 21 1d 0e 1a 56 0c 08 04 0f
+63 32 00 00 00 32 00 50 53 20 33 33 30 30 2e 2e 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PS 3300..2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 05 01 02 0d 47 00 4d 08 06 0f 05 00 02 0f 00 40 4a 04 04 07 06 01 04 0f
+4e 00 4e 08 02 07 04 01 05 0d 00 00 62 00 09 61 21 1d 0e 1a 56 0c 08 04 0f
+63 32 00 00 00 32 00 50 53 20 33 33 30 30 2e 2e 32 63 63 63 32 32 32 00 00
+00 30 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Quadra...1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 07 03 05 0f 00 05 3c 13 06 15 09 04 04 0f 00 04 4a 08 00 13 1f 00 06 0f
+00 05 5f 00 06 13 0c 07 06 0f 00 05 61 00 03 6c 17 00 0e 00 42 18 07 04 00
+63 32 63 32 00 32 00 51 75 61 64 72 61 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Quadra...2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 09 04 04 0f 00 04 4c 0a 00 0f 07 02 05 0e 00 06 50 00 06 13 0c 07 06 0f
+00 04 5f 00 03 13 1f 00 06 0f 00 05 61 08 06 74 17 00 0b 00 22 18 07 04 00
+63 32 63 32 00 32 00 51 75 61 64 72 61 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ResoSynth1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 1f 00 02 0f 00 03 51 08 1e 17 1f 01 02 0f 0a 04 43 04 03 19 1f 00 03 0f
+08 06 55 08 16 12 1f 00 01 0f 14 05 5b 04 1b 2a 00 00 00 00 02 0c 07 04 00
+63 63 00 32 00 32 00 52 65 73 6f 53 79 6e 74 68 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ResoSynth2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 1f 00 02 0f 00 03 50 00 1e 17 1f 01 02 0f 0a 04 41 04 03 19 1f 00 03 0f
+08 04 63 00 16 12 1f 00 01 0f 14 05 63 04 1b 3c 00 00 00 00 02 18 07 04 00
+63 63 00 32 00 32 00 52 65 73 6f 53 79 6e 74 68 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RMI......1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 09 03 07 0d 00 04 4e 08 0b 18 07 03 08 0d 00 05 59 04 0b 19 07 03 08 0c
+00 06 62 04 13 1b 08 04 08 0e 00 06 63 04 0b 24 20 00 00 00 02 18 04 04 00
+28 32 00 00 00 32 00 52 4d 49 2e 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RMI......2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 09 03 07 0d 00 03 51 08 0b 18 07 03 08 0d 00 04 52 08 13 19 07 03 08 0c
+00 06 62 04 13 1b 08 04 08 0e 00 06 62 00 0b 24 20 00 00 00 02 18 04 04 00
+28 32 00 00 00 32 00 52 4d 49 2e 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SH 7.....1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 08 00 04 07 00 0c 57 00 09 17 1f 01 04 0f 0a 0b 3e 10 01 19 1f 00 04 0f
+08 05 61 00 15 12 1f 00 04 0f 14 05 63 04 1d 2c 02 00 0a 00 02 0c 07 0d 05
+63 63 63 32 00 32 00 53 48 20 37 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SH 7.....1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 08 00 04 07 00 08 57 00 09 17 1f 01 04 0f 0a 08 3e 10 01 19 1f 00 04 0f
+08 00 61 00 15 12 1f 00 04 0f 14 00 63 04 1d 2c 02 00 0a 00 02 0c 07 0d 05
+63 63 63 32 00 32 00 53 48 20 37 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SH 7.....2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 08 00 05 07 00 05 57 00 11 17 1f 01 05 0f 0a 04 5c 00 11 19 1f 00 05 0f
+08 04 61 04 15 12 1f 00 05 0f 14 07 63 04 15 2c 02 00 0a 00 02 0c 07 0d 01
+63 63 63 32 00 32 00 53 48 20 37 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SH 7.....2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 08 00 05 07 00 02 57 00 11 17 1f 01 05 0f 0a 01 5c 00 11 19 1f 00 05 0f
+08 00 61 04 15 12 1f 00 05 0f 14 00 63 04 15 2c 02 00 0a 00 02 0c 07 0d 01
+63 63 63 32 00 32 00 53 48 20 37 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sigma....1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 10 05 08 00 04 4e 10 03 1f 05 00 05 0b 2d 06 5a 04 13 1f 08 00 03 0c
+43 04 55 0d 1b 1c 06 04 04 07 00 07 63 04 14 7c 21 00 38 00 22 0c 06 04 00
+63 32 00 32 00 32 00 53 69 67 6d 61 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sigma....2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 08 03 05 0f 00 03 57 04 06 16 0a 0a 05 0d 00 07 4b 3f 03 16 09 01 06 0f
+00 06 63 04 00 16 15 01 06 0d 00 06 59 13 05 34 25 49 0f 00 32 00 0c 04 00
+63 00 00 00 00 32 00 53 69 67 6d 61 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sigma....3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 10 05 08 00 03 5a 08 03 1f 03 00 05 06 2d 06 41 13 13 1f 08 00 03 0c
+43 04 55 08 1b 1c 06 04 04 07 00 05 63 08 13 6c 21 00 38 00 22 0c 06 04 00
+63 32 00 32 00 32 00 53 69 67 6d 61 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Soft Synth
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 08 00 06 09 00 3a 27 12 06 18 08 00 06 0b 63 02 54 13 00 1b 10 00 06 0b
+00 01 63 09 06 1f 0a 00 06 0a 23 01 63 0a 00 05 1f 06 09 00 42 05 02 04 00
+63 63 00 00 00 32 00 53 6f 66 74 20 53 79 6e 74 68 63 63 63 32 32 32 00 54
+00 30 00 32 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Softsynth*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 00 03 0d 00 03 54 09 00 1f 0f 06 04 0c 18 00 5c 2d 0d 0f 1f 06 05 0f
+00 00 63 09 00 0f 1f 06 05 0f 00 00 63 0a 05 3d 23 00 00 00 62 05 02 04 00
+28 32 00 00 00 32 00 53 6f 66 74 73 79 6e 74 68 2a 63 63 63 32 32 32 00 02
+00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SoloSynth
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 1f 05 03 0e 28 03 50 08 0a 1f 1d 07 04 0c 11 02 50 00 0a 1f 1d 0c 04 0c
+28 02 41 00 0b 1a 01 01 05 0d 00 01 62 00 0c 01 1e 00 00 00 52 24 02 04 00
+28 32 00 00 00 32 00 53 6f 6c 6f 53 79 6e 74 68 20 63 52 63 32 32 32 00 00
+00 10 00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpiralSynt
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 09 06 01 0e 00 03 60 00 13 16 0c 06 05 0e 03 05 51 04 0c 16 0f 06 07 0e
+00 05 62 04 0c 16 09 06 07 0f 00 05 63 04 0a 64 23 00 00 00 02 18 04 04 00
+63 01 63 00 00 32 00 53 70 69 72 61 6c 53 79 6e 74 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpiralSynt
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 09 06 01 0e 00 01 60 00 13 16 0c 06 05 0e 03 01 51 04 0c 16 0f 06 07 0e
+00 00 62 04 0c 16 09 06 07 0f 00 00 63 04 0a 64 23 00 00 00 02 18 04 04 00
+63 01 63 00 00 32 00 53 70 69 72 61 6c 53 79 6e 74 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sweeper
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 00 0a 0b 00 3b 5b 00 0d 1f 16 00 0a 0d 00 1d 46 00 03 1f 16 00 0a 0d
+00 1d 63 00 03 1f 16 00 0a 0d 00 3d 63 00 03 35 25 00 00 00 22 18 02 04 00
+63 32 00 00 00 32 00 53 77 65 65 70 65 72 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sweeper
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 00 0a 0b 00 3a 5b 00 0d 1f 16 00 0a 0d 00 19 46 00 03 1f 16 00 0a 0d
+00 18 63 00 03 1f 16 00 0a 0d 00 38 63 00 03 35 25 00 00 00 22 18 02 04 00
+63 32 00 00 00 32 00 53 77 65 65 70 65 72 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SweepSynt*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 11 0d 01 09 00 04 4e 0a 04 05 03 00 01 0d 00 02 50 04 02 11 11 00 07 09
+00 01 5b 08 06 0e 07 00 04 0d 00 02 63 04 08 34 1f 00 00 00 32 18 02 04 00
+28 63 00 00 00 32 00 53 77 65 65 70 53 79 6e 74 2a 63 63 63 32 32 32 00 03
+00 40 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SweetSynth
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+14 09 00 03 0f 29 00 12 08 02 0d 0d 00 03 0f 42 01 2d 13 01 1b 0d 00 07 0f
+00 02 33 04 04 11 0d 00 07 0f 00 02 63 13 06 00 20 00 00 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 77 65 65 74 53 79 6e 74 68 63 63 63 32 32 32 00 50
+00 30 00 58 00 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.AftrTch
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 32
+1f 1f 00 03 0f 00 28 46 0a 00 1f 1f 00 03 0f 00 28 44 09 06 0b 1f 00 05 0f
+1e 08 56 0a 00 0b 1f 00 05 0f 1e 08 56 0a 06 3c 23 00 2e 00 42 05 02 04 00
+63 32 00 00 00 32 00 53 79 2e 41 66 74 72 54 63 68 63 63 63 32 32 32 00 30
+00 62 00 10 00 30 00 00 00 00 00 00 32 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.AftrTch
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 03 0f 00 28 46 0a 00 1f 1f 00 03 0f 00 28 44 09 06 0b 1f 00 05 0f
+1e 08 56 0a 00 0b 1f 00 05 0f 1e 08 56 0a 06 3c 23 00 2e 00 42 05 02 04 00
+63 32 00 00 00 32 00 53 79 2e 41 66 74 72 54 63 68 63 63 63 32 32 32 00 30
+00 62 00 10 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Decay 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 29
+1f 08 00 04 09 14 02 49 12 06 18 08 00 04 0b 14 02 51 13 00 1b 10 00 04 0b
+00 01 60 09 06 1f 0a 00 04 0a 00 01 60 0a 00 3d 1f 06 09 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 79 2e 44 65 63 61 79 20 31 63 63 63 32 32 32 00 54
+00 30 00 32 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Decay 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 30
+1f 0c 08 0f 0c 22 02 3e 35 11 1f 11 01 04 0e 1a 04 4e 05 16 1f 0b 07 0a 0c
+00 43 57 04 0e 1f 07 04 08 0e 00 43 60 05 11 3b 1c 08 02 1b 56 11 02 04 00
+63 32 00 00 00 32 00 53 79 2e 44 65 63 61 79 20 32 63 63 63 32 32 32 00 7f
+00 01 00 18 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Decay 2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 08 0f 0c 22 02 3e 35 11 1f 11 01 04 0e 1a 04 4e 05 16 1f 0b 07 0d 0c
+00 43 57 04 0e 1f 07 04 08 0e 00 43 60 05 11 3b 1c 08 02 1b 56 11 02 04 00
+63 32 00 00 00 32 00 53 79 2e 44 65 63 61 79 20 32 63 63 63 32 32 32 00 7f
+00 01 00 18 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synballs
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank D, voice 31
+1f 1f 00 01 0e 00 41 62 36 03 19 16 00 01 0b 00 41 5f 05 0b 15 1c 06 01 0b
+00 41 58 39 13 1f 1f 05 02 08 00 41 63 18 13 29 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 53 79 6e 62 61 6c 6c 73 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 20
+
+** Name: Synth....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 16 07 05 0d 00 04 4b 2d 0b 17 0f 00 06 0d 00 05 57 04 03 16 13 07 06 0d
+01 05 63 04 13 0d 09 06 06 0d 00 06 63 04 0b 74 26 21 09 00 42 18 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 16 07 05 0d 00 01 4b 2d 0b 17 0f 00 06 0d 00 01 57 04 03 16 13 07 06 0d
+01 00 63 04 13 0d 09 06 06 0d 00 00 63 04 0b 74 26 21 09 00 42 18 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 09 03 0d 00 42 50 22 02 1f 0f 00 06 0d 00 44 4e 08 08 0c 0a 07 04 0d
+01 45 63 04 12 1f 0a 06 05 0d 00 46 63 08 08 5c 26 23 06 1b 36 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 09 03 0d 00 43 50 22 02 1f 0f 00 06 0d 00 41 4e 08 08 0c 0a 07 04 0d
+01 40 63 04 12 1f 0a 06 05 0d 00 40 63 08 08 5c 26 23 06 1b 36 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 0a 07 09 0e 00 43 59 08 06 0d 0a 07 09 0e 00 44 52 04 00 1f 1d 07 09 0e
+00 46 63 04 03 1f 1d 07 09 0e 00 45 62 04 03 24 24 32 13 02 36 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 0a 07 09 0e 00 41 59 08 06 0d 0a 07 09 0e 00 41 52 04 00 1f 1d 07 09 0e
+00 40 63 04 03 1f 1d 07 09 0e 00 40 62 04 03 24 24 32 13 02 36 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 0f 01 0f 00 05 50 3f 03 1f 06 07 0f 0e 00 05 4d 04 00 18 10 0f 0e 0c
+00 06 53 04 03 1f 06 07 0f 0e 00 06 5d 04 03 22 28 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 0f 01 0f 00 02 50 3f 03 1f 06 07 0f 0e 00 02 4d 04 00 18 10 0f 0e 0c
+00 01 53 04 03 1f 06 07 0f 0e 00 00 5d 04 03 22 28 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 14 08 0f 00 00 43 63 10 13 1b 03 06 08 0e 00 44 4c 04 02 1f 15 07 0f 00
+00 45 5f 0d 06 0e 03 06 08 09 00 45 63 04 0e 34 26 21 20 2a 16 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 14 08 0f 00 00 40 63 10 13 1b 03 06 08 0e 00 41 4c 04 02 1f 15 07 0f 00
+00 40 5f 0d 06 0e 03 06 08 09 00 40 63 04 0e 34 26 21 20 2a 16 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 0c 07 0c 0a 00 04 55 04 03 1e 0c 07 07 0a 00 05 55 04 03 1f 16 00 0f 0d
+00 05 63 04 03 1f 16 07 07 0d 00 06 62 04 0b 34 26 00 00 00 22 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 10 00 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 0c 07 0c 0a 00 01 55 04 03 1e 0c 07 07 0a 00 01 55 04 03 1f 16 00 0f 0d
+00 00 63 04 03 1f 16 07 07 0d 00 00 62 04 0b 34 26 00 00 00 22 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 10 00 30 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 09 06 04 00 04 5e 00 05 1f 0c 09 06 0e 00 04 5b 00 02 1f 0c 09 06 0e
+00 04 63 00 04 1f 0c 09 06 0e 00 05 63 04 02 2c 25 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synth....7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 09 06 04 00 01 5e 00 05 1f 0c 09 06 0e 00 01 5b 00 02 1f 0c 09 06 0e
+00 00 63 00 04 1f 0c 09 06 0e 00 00 63 04 02 2c 25 00 00 00 32 0c 02 04 00
+28 02 00 00 00 32 00 53 79 6e 74 68 2e 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Synthish *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 08 00 01 0c 00 01 52 08 06 03 0d 00 01 0f 00 01 49 05 18 10 08 00 04 0d
+00 01 63 08 0e 0b 0a 00 04 0e 00 00 63 05 08 34 20 05 19 0f 32 08 02 04 00
+28 32 00 00 00 32 00 53 79 6e 74 68 69 73 68 20 2a 63 63 63 32 32 32 00 09
+00 0d 00 09 00 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthRise1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 03 0f 00 03 51 00 06 1f 1f 00 03 0f 00 05 5e 00 08 0f 1f 00 04 0f
+00 05 5d 08 06 0f 1f 00 05 0f 00 05 5c 08 00 7c 23 00 00 00 02 18 05 04 00
+63 63 63 00 00 32 00 53 79 6e 74 68 52 69 73 65 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthRise1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 03 0f 00 01 51 00 06 1f 1f 00 03 0f 00 01 5e 00 08 0f 1f 00 04 0f
+00 00 5d 08 06 0f 1f 00 05 0f 00 00 5c 08 00 7c 23 00 00 00 02 18 05 04 00
+63 63 63 00 00 32 00 53 79 6e 74 68 52 69 73 65 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthRise2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 00 04 0d 00 05 5f 00 06 1f 1f 00 04 0f 00 05 61 00 08 0f 1f 00 05 0f
+00 06 5f 08 06 0f 1f 00 05 0f 00 05 58 08 00 74 23 00 00 00 02 18 05 04 00
+63 63 63 00 00 32 00 53 79 6e 74 68 52 69 73 65 32 63 63 63 32 32 32 00 20
+00 40 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthRise2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 00 04 0d 00 01 5f 00 06 1f 1f 00 04 0f 00 02 61 00 08 0f 1f 00 05 0f
+00 00 5f 08 06 0f 1f 00 05 0f 00 00 58 08 00 74 23 00 00 00 02 18 05 04 00
+63 63 63 00 00 32 00 53 79 6e 74 68 52 69 73 65 32 63 63 63 32 32 32 00 20
+00 40 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthyPad1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+11 11 06 07 0f 1d 02 62 03 06 0b 08 07 07 0f 16 41 62 05 04 11 07 08 07 0f
+1d 02 62 05 00 0e 08 04 05 0f 14 43 63 03 02 7f 22 00 0f 00 36 05 02 04 03
+63 32 00 00 00 32 00 53 79 6e 74 68 79 50 61 64 31 63 63 63 32 32 32 00 16
+00 51 00 11 00 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System 15
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 09 04 09 0e 00 05 54 08 06 16 09 04 09 0e 00 04 5a 00 06 16 09 04 09 0e
+00 06 5c 04 03 16 09 04 09 0e 00 05 63 00 03 74 22 00 06 00 32 0c 02 04 00
+28 02 00 00 00 32 00 53 79 73 74 65 6d 20 31 35 20 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System 15
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 09 04 09 0e 00 01 54 08 06 16 09 04 09 0e 00 01 5a 00 06 16 09 04 09 0e
+00 00 5c 04 03 16 09 04 09 0e 00 00 63 00 03 74 22 00 06 00 32 0c 02 04 00
+28 02 00 00 00 32 00 53 79 73 74 65 6d 20 31 35 20 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System35.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+07 01 00 04 0c 00 04 5f 00 09 0b 07 00 04 0f 00 04 50 00 04 0e 03 01 04 0f
+00 05 63 04 0b 13 02 00 04 0f 00 05 63 04 06 54 17 00 0b 00 32 18 04 04 00
+63 01 63 00 00 32 00 53 79 73 74 65 6d 33 35 2e 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System35.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 01 00 04 0c 00 01 5f 00 09 0b 07 00 04 0f 00 01 50 00 04 0e 03 01 04 0f
+00 00 63 04 0b 13 02 00 04 0f 00 00 63 04 06 54 17 00 0b 00 32 18 04 04 00
+63 01 63 00 00 32 00 53 79 73 74 65 6d 33 35 2e 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System35.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 04 03 08 0d 00 04 50 04 01 15 04 03 08 0d 00 04 4c 08 03 12 04 03 08 0d
+00 04 62 08 03 0a 04 03 08 0d 00 05 5d 08 06 7c 17 00 0b 00 32 0c 04 04 00
+63 01 63 00 00 32 00 53 79 73 74 65 6d 33 35 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System35.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 04 03 08 0d 00 02 50 04 01 15 04 03 08 0d 00 01 4c 08 03 12 04 03 08 0d
+00 00 62 08 03 0a 04 03 08 0d 00 00 5d 08 06 7c 17 00 0b 00 32 0c 04 04 00
+63 01 63 00 00 32 00 53 79 73 74 65 6d 33 35 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System35.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 01 00 06 0c 00 02 51 00 09 15 04 00 07 0f 00 04 4e 00 06 13 0c 02 06 0f
+00 06 63 00 0b 13 03 01 06 0f 00 05 63 00 16 74 17 00 0b 00 32 18 04 04 00
+63 01 63 00 00 32 00 53 79 73 74 65 6d 33 35 2e 33 63 63 63 32 32 32 00 00
+00 40 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System35.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 01 00 06 0c 00 01 51 00 09 15 04 00 07 0f 00 02 4e 00 06 13 0c 02 06 0f
+00 00 63 00 0b 13 03 01 06 0f 00 00 63 00 16 74 17 00 0b 00 32 18 04 04 00
+63 01 63 00 00 32 00 53 79 73 74 65 6d 33 35 2e 33 63 63 63 32 32 32 00 00
+00 40 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System55.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 09 00 05 0f 00 03 5b 00 00 15 03 00 06 05 00 05 60 00 0e 13 1f 00 06 0f
+00 06 63 04 03 13 0c 00 06 0e 00 05 63 04 03 6c 17 00 0b 00 22 18 05 04 00
+63 63 63 00 00 32 00 53 79 73 74 65 6d 35 35 2e 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System55.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 09 00 05 0f 00 01 5b 00 00 15 03 00 06 05 00 01 60 00 0e 13 1f 00 06 0f
+00 00 63 04 03 13 0c 00 06 0e 00 00 63 04 03 6c 17 00 0b 00 22 18 05 04 00
+63 63 63 00 00 32 00 53 79 73 74 65 6d 35 35 2e 31 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System55.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 09 00 05 0f 00 02 5c 00 06 15 03 00 06 05 00 05 58 08 0e 13 1f 00 06 0f
+00 04 63 00 02 13 0c 00 06 0e 00 05 63 00 02 74 17 00 0b 00 22 18 05 04 00
+63 63 63 00 00 32 00 53 79 73 74 65 6d 35 35 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: System55.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 09 00 05 0f 00 02 5c 00 06 15 03 00 06 05 00 01 58 08 0e 13 1f 00 06 0f
+00 00 63 00 02 13 0c 00 06 0e 00 00 63 00 02 74 17 00 0b 00 22 18 05 04 00
+63 63 63 00 00 32 00 53 79 73 74 65 6d 35 35 2e 32 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tamboura *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 07 07 01 00 00 00 49 0a 0b 1f 1f 02 03 0f 00 01 56 00 0b 07 08 04 03 00
+00 01 45 24 0b 1e 0d 05 04 0d 00 01 63 04 0b 3b 23 00 00 00 32 18 02 04 00
+28 63 00 00 00 32 00 54 61 6d 62 6f 75 72 61 20 2a 63 63 63 32 32 32 00 20
+00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tamboura.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 1f 00 03 0f 00 01 50 00 03 1f 1f 00 02 0f 00 03 5f 04 03 19 18 00 02 0f
+00 05 45 05 03 1f 1f 00 03 0f 00 06 5a 04 03 7d 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 54 61 6d 62 6f 75 72 61 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tamboura.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 1f 00 03 0f 00 00 50 00 03 1f 1f 00 02 0f 00 00 5f 04 03 19 18 00 02 0f
+00 00 45 05 03 1f 1f 00 03 0f 00 00 5a 04 03 7d 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 54 61 6d 62 6f 75 72 61 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tamboura.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 11 07 03 0f 00 02 54 00 03 1f 1f 00 04 0f 00 03 63 00 03 19 18 00 03 0f
+00 05 45 04 03 1f 1f 00 04 0f 00 05 5b 04 03 45 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 54 61 6d 62 6f 75 72 61 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tamboura.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 11 07 03 0f 00 00 54 00 03 1f 1f 00 04 0f 00 00 63 00 03 19 18 00 03 0f
+00 00 45 04 03 1f 1f 00 04 0f 00 00 5b 04 03 45 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 54 61 6d 62 6f 75 72 61 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tamboura.3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 1f 00 03 0f 00 02 47 00 03 1f 1f 00 03 0f 00 02 43 00 03 19 18 00 03 0f
+00 03 5b 04 03 1f 1f 00 03 0f 00 06 5b 04 03 6c 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 54 61 6d 62 6f 75 72 61 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tamboura.3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 1f 00 03 0f 00 00 47 00 03 1f 1f 00 03 0f 00 00 43 00 03 19 18 00 03 0f
+00 00 5b 04 03 1f 1f 00 03 0f 00 00 5b 04 03 6c 23 00 00 00 32 18 02 04 00
+63 63 00 00 00 32 00 54 61 6d 62 6f 75 72 61 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Time X *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+06 00 00 01 00 08 00 5a 00 06 1f 00 00 01 00 00 00 48 00 05 1f 00 00 01 00
+00 02 58 00 01 12 06 00 03 00 00 00 63 00 0b 02 23 00 00 00 32 24 02 04 00
+28 63 00 00 00 32 00 54 69 6d 65 20 58 20 20 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: TrdrpSynth
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+17 04 00 06 09 00 3a 1e 12 06 10 04 00 06 0b 63 02 54 1c 00 13 0c 00 06 0b
+00 01 63 09 06 17 06 00 06 0a 23 01 63 13 00 05 1f 06 09 00 42 05 02 04 00
+63 63 00 00 00 32 00 54 72 64 72 70 53 79 6e 74 68 63 63 63 32 32 32 00 54
+00 30 00 32 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Voyage *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 09 00 01 00 19 00 5b 00 08 17 05 00 03 00 00 00 5c 00 0e 15 07 00 04 00
+07 02 63 04 08 15 07 00 04 00 06 01 63 03 0b 14 20 00 1c 00 42 11 02 04 00
+28 63 00 00 00 32 00 56 6f 79 61 67 65 20 20 20 2a 63 63 63 32 32 32 00 44
+00 04 00 08 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Walt/Wendy
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 09 07 04 0e 00 04 47 16 03 1e 0f 00 05 0d 00 05 4d 08 09 0a 09 07 04 0e
+00 04 62 04 0b 09 10 03 04 0f 00 05 63 08 0e 74 26 00 02 00 63 0c 02 04 00
+63 63 00 00 00 32 00 57 61 6c 74 2f 57 65 6e 64 79 63 63 63 32 32 32 00 00
+00 30 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Walt/Wendy
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0a 09 07 04 0e 00 01 47 16 03 1e 0f 00 05 0d 00 02 4d 08 09 0a 09 07 04 0e
+00 00 62 04 0b 09 10 03 04 0f 00 00 63 08 0e 74 26 00 02 00 63 0c 02 04 00
+63 63 00 00 00 32 00 57 61 6c 74 2f 57 65 6e 64 79 63 63 63 32 32 32 00 00
+00 30 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wapper...1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 1c 15 01 0e 00 04 52 0a 13 10 00 03 08 0d 00 06 58 04 0b 10 00 03 09 0d
+00 06 5f 0a 08 10 00 03 08 0d 00 05 63 08 0b 34 25 29 26 63 12 0c 04 04 00
+63 01 63 00 00 32 00 57 61 70 70 65 72 2e 2e 2e 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wapper...1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 1c 15 01 0e 00 01 52 0a 13 10 00 03 08 0d 00 02 58 04 0b 10 00 03 09 0d
+00 00 5f 0a 08 10 00 03 08 0d 00 00 63 08 0b 34 25 29 26 63 12 0c 04 04 00
+63 01 63 00 00 32 00 57 61 70 70 65 72 2e 2e 2e 31 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wapper...2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 1c 0a 01 0e 00 05 49 2a 0b 10 00 03 08 0d 00 05 3e 10 0b 10 00 03 09 0d
+00 05 5f 04 08 10 00 03 08 0d 00 05 63 04 0b 2c 25 2a 26 63 12 18 04 04 00
+63 01 63 00 00 32 00 57 61 70 70 65 72 2e 2e 2e 32 63 63 63 32 32 32 00 30
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wapper...2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 1c 0a 01 0e 00 01 49 2a 0b 10 00 03 08 0d 00 01 3e 10 0b 10 00 03 09 0d
+00 00 5f 04 08 10 00 03 08 0d 00 00 63 04 0b 2c 25 2a 26 63 12 18 04 04 00
+63 01 63 00 00 32 00 57 61 70 70 65 72 2e 2e 2e 32 63 63 63 32 32 32 00 30
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WarmSquare
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 21
+1f 06 00 03 0f 00 01 4f 03 06 1f 0e 00 03 0f 00 01 50 05 00 12 0e 00 07 0f
+00 02 63 03 00 16 0e 00 07 0f 00 02 63 05 06 34 20 00 00 00 52 05 07 0c 00
+63 32 00 00 00 32 00 57 61 72 6d 53 71 75 61 72 65 63 63 63 32 32 32 00 26
+00 51 00 06 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wendy :
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 0a 06 08 0c 00 03 53 04 03 10 07 06 0a 00 00 05 51 04 03 12 07 06 09 0c
+00 05 63 04 13 12 09 04 07 0e 00 06 63 04 03 24 23 00 05 00 42 0c 02 04 00
+28 02 00 00 00 32 00 20 57 65 6e 64 79 20 20 3a 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wendy :
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 0a 06 08 0c 00 01 53 04 03 10 07 06 0a 00 00 01 51 04 03 12 07 06 09 0c
+00 00 63 04 13 12 09 04 07 0e 00 00 63 04 03 24 23 00 05 00 42 0c 02 04 00
+28 02 00 00 00 32 00 20 57 65 6e 64 79 20 20 3a 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wendy C
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 09 04 04 0f 00 04 31 1f 06 08 00 00 04 0f 00 04 44 08 0b 0e 09 04 04 0f
+00 06 62 08 02 08 00 00 05 0f 00 06 62 08 0b 74 2b 00 0b 00 32 0c 02 04 00
+28 02 00 00 00 32 00 57 65 6e 64 79 20 43 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wendy C
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 09 04 04 0f 00 01 31 1f 06 08 00 00 04 0f 00 01 44 08 0b 0e 09 04 04 0f
+00 00 62 08 02 08 00 00 05 0f 00 00 62 08 0b 74 2b 00 0b 00 32 0c 02 04 00
+28 02 00 00 00 32 00 57 65 6e 64 79 20 43 20 20 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whos Upset
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 43 58 04 03 1f 1f 00 0f 0f 00 43 63 04 03 1f 1f 00 0f 0f
+00 45 63 04 03 1f 1f 00 0f 0f 00 47 63 04 03 5d 2e 3a 45 63 77 18 04 04 00
+63 01 63 00 00 32 00 57 68 6f 73 20 55 70 73 65 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whos Upset
+** Controls: MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 0f 0f 00 40 58 04 03 1f 1f 00 0f 0f 00 40 63 04 03 1f 1f 00 0f 0f
+00 40 63 04 03 1f 1f 00 0f 0f 00 40 63 04 03 5d 2e 3a 45 63 77 18 04 04 00
+63 01 63 00 00 32 00 57 68 6f 73 20 55 70 73 65 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: X-Pander *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 08 00 06 0d 00 03 52 03 03 0e 08 00 01 0f 00 00 43 04 03 15 0e 00 06 0f
+00 00 63 03 0b 0b 1f 00 06 0f 00 00 63 04 0b 3c 21 00 00 00 52 05 02 04 00
+28 32 00 00 00 32 00 58 2d 50 61 6e 64 65 72 20 2a 63 63 63 32 32 32 00 06
+00 08 00 06 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xuereb *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 08 00 03 0f 00 00 46 3f 1d 1f 00 00 04 0f 00 00 48 08 00 11 07 12 02 00
+00 07 4a 3f 1e 0f 04 09 06 0f 00 02 63 08 0e 33 20 00 14 00 32 00 02 04 00
+28 63 00 00 00 32 00 58 75 65 72 65 62 20 20 20 2a 63 63 63 32 32 32 00 0f
+00 00 00 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 21
+
+* CATEGORY VOICES
+
+* SUBCATEGORY Breath
+
+** Name: BaadBreath
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 1
+1f 00 00 04 0f 00 40 63 3c 00 0b 08 07 07 0f 05 00 63 04 06 0f 05 03 07 0f
+08 00 3b 05 06 0e 08 04 05 0f 00 03 63 03 00 7e 1d 06 0f 00 4a 11 00 04 00
+63 32 00 00 00 32 00 42 61 61 64 42 72 65 61 74 68 63 63 63 32 32 32 06 30
+00 38 00 01 00 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BaadBreath
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 04 0f 00 41 63 3c 00 0c 09 04 07 0f 3e 03 63 06 06 10 07 03 06 0f
+0c 03 4d 05 01 0f 08 04 05 0f 33 04 63 05 00 7e 1d 06 0f 29 4e 11 00 04 00
+63 32 00 00 00 32 00 42 61 61 64 42 72 65 61 74 68 63 63 63 32 32 32 0e 30
+00 30 00 42 01 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BaadBreath
+** Controls: KV, MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 00 00 04 0f 00 40 63 3c 00 0c 09 04 07 0f 3e 00 63 06 06 10 07 03 06 0f
+0c 01 4d 05 01 0f 08 04 05 0f 33 01 63 05 00 7e 1d 06 0f 29 4e 11 00 04 00
+63 32 00 00 00 32 00 42 61 61 64 42 72 65 61 74 68 63 63 63 32 32 32 0e 30
+00 30 00 42 01 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BadBreath2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 04 0f 00 40 63 3c 00 0a 08 07 07 0f 15 00 63 04 06 0a 05 03 07 0f
+13 00 32 05 06 0a 08 04 05 0f 19 03 63 03 00 7e 1d 06 0f 00 4a 11 00 04 02
+63 32 00 00 00 32 00 42 61 64 42 72 65 61 74 68 32 63 63 63 32 32 32 06 10
+00 38 00 71 00 46 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BreathOrgn
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 32
+0d 0b 00 01 0c 00 02 2c 3d 03 0d 07 00 01 0c 00 02 1f 3c 03 0d 1f 00 05 0f
+00 02 63 05 06 0d 1f 00 05 0f 00 02 63 04 00 3c 63 00 2f 00 53 11 04 04 00
+63 32 00 00 00 32 00 42 72 65 61 74 68 4f 72 67 6e 63 63 63 32 32 32 04 30
+05 50 00 11 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BreathyEns
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 00 00 03 0f 00 40 63 3c 00 0b 08 07 06 0f 05 00 63 08 06 0f 05 03 06 0f
+08 00 2b 08 06 10 04 04 09 0f 00 03 63 08 00 7e 1d 06 0f 00 4a 0c 01 04 00
+63 32 00 00 00 32 00 42 72 65 61 74 68 79 45 6e 73 63 63 63 32 32 32 06 30
+00 10 00 71 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+* SUBCATEGORY Choir
+
+** Name: ChoiChoir*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 19 00 01 0f 08 00 46 04 06 1f 19 00 01 0f 4a 02 4d 04 06 0b 1f 00 06 0f
+00 00 63 08 00 09 19 00 07 0f 17 01 4d 20 00 04 1e 1f 3f 00 42 0c 02 04 00
+28 32 00 00 00 32 00 43 68 6f 69 43 68 6f 69 72 2a 63 63 63 32 32 32 00 00
+00 20 00 00 0c 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 0b 0c 0c 0d 00 00 37 0a 03 0c 03 09 09 0f 00 07 32 08 04 0c 06 00 09 0f
+00 07 45 08 01 08 08 09 07 0d 00 07 60 04 00 4a 20 21 35 00 22 18 07 04 00
+63 32 63 32 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 31 63 63 63 32 32 32 20 00
+10 10 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....1
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 0b 0c 0c 0d 00 00 37 0a 03 0c 03 09 09 0f 00 00 32 08 04 0c 06 00 09 0f
+00 00 45 08 01 08 08 09 07 0d 00 00 60 04 00 4a 20 21 35 00 22 18 07 04 00
+63 32 63 32 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 31 63 63 63 32 32 32 20 00
+10 10 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 08 0c 0c 0d 00 03 35 0a 03 0c 1f 09 09 0f 00 06 35 08 03 0c 06 00 09 0f
+00 05 63 08 03 0c 08 09 07 0d 00 05 60 04 00 4c 20 21 35 00 22 18 07 04 00
+63 32 63 32 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 08 0c 0c 0d 00 00 35 0a 03 0c 1f 09 09 0f 00 00 35 08 03 0c 06 00 09 0f
+00 00 63 08 03 0c 08 09 07 0d 00 00 60 04 00 4c 20 21 35 00 22 18 07 04 00
+63 32 63 32 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 15 1f 07 0f 00 02 3a 0d 02 10 16 09 07 0f 00 06 44 08 04 0b 16 09 07 0f
+00 06 5f 08 01 0f 0f 04 07 0f 00 05 5f 04 02 44 1f 23 21 00 22 0c 07 04 00
+63 32 63 32 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 15 1f 07 0f 00 00 3a 0d 02 10 16 09 07 0f 00 01 44 08 04 0b 16 09 07 0f
+00 00 5f 08 01 0f 0f 04 07 0f 00 00 5f 04 02 44 1f 23 21 00 22 0c 07 04 00
+63 32 63 32 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+07 00 04 04 0a 61 00 39 19 03 09 1f 03 07 0f 63 04 3a 04 00 07 00 06 06 09
+58 05 34 13 03 09 1f 01 06 0f 29 45 58 04 06 21 20 2d 00 00 06 24 02 04 00
+63 32 00 00 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 00 04 04 0a 61 00 39 19 03 09 1f 03 07 0f 63 00 3a 04 00 07 00 06 06 09
+58 00 34 13 03 09 1f 01 06 0f 29 40 58 04 06 21 20 2d 00 00 06 24 02 04 00
+63 32 00 00 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 12 04 04 0a 3a 03 36 19 06 0b 1f 03 0a 0f 56 05 44 04 00 15 0e 06 0a 09
+63 06 3b 16 00 0e 1f 01 09 0f 00 06 61 04 06 29 21 13 09 00 62 18 02 04 00
+63 32 00 00 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....5
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 12 04 04 0a 3a 00 36 19 06 0b 1f 03 0a 0f 56 00 44 04 00 15 0e 06 0a 09
+63 00 3b 16 00 0e 1f 01 09 0f 00 00 61 04 06 29 21 13 09 00 62 18 02 04 00
+63 32 00 00 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 15 04 04 0a 3a 03 33 10 06 0c 1f 03 0a 0f 56 04 39 04 00 0d 0e 06 0a 09
+63 06 48 08 00 0c 1f 01 09 0f 00 05 57 04 06 51 21 16 08 00 62 18 02 04 00
+63 32 00 00 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 36 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choir....6
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 15 04 04 0a 3a 00 33 10 06 0c 1f 03 0a 0f 56 00 39 04 00 0d 0e 06 0a 09
+63 00 48 08 00 0c 1f 01 09 0f 00 00 57 04 06 51 21 16 08 00 62 18 02 04 00
+63 32 00 00 00 32 00 43 68 6f 69 72 2e 2e 2e 2e 36 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choral
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+0b 0d 00 02 0f 0a 40 32 04 00 0a 0d 00 02 0f 0a 40 32 00 06 0c 0b 00 04 0f
+1e 42 63 08 00 0a 0d 00 04 0f 14 42 63 04 06 3c 1e 0a 11 04 4a 18 02 04 00
+28 32 00 00 00 32 00 43 68 6f 72 61 6c 20 20 20 20 63 56 63 29 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus
+** Controls: MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+0d 0e 00 02 0f 28 00 32 00 03 0d 0e 00 02 0f 00 00 4e 00 0b 0d 0e 00 04 0f
+00 00 63 04 0b 0d 0e 00 04 0f 58 00 63 08 0b 06 1d 00 17 00 22 18 05 04 00
+28 32 0d 00 00 32 00 43 68 6f 72 75 73 20 20 20 20 63 47 63 2f 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...1
+** Controls: KV, MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 16 02 02 0f 23 42 2f 04 04 06 07 04 04 07 32 46 40 04 03 0a 06 09 09 0f
+45 45 39 04 02 0a 06 07 06 0f 0a 46 5d 04 00 2b 23 23 0b 02 46 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 31 63 63 63 32 32 32 0b 09
+00 10 00 00 00 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...1
+** Controls: MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 16 02 02 0f 23 40 2f 04 04 06 07 04 04 07 32 40 40 04 03 0a 06 09 09 0f
+45 40 39 04 02 0a 06 07 06 0f 0a 40 5d 04 00 2b 23 23 0b 02 46 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 31 63 63 63 32 32 32 0b 09
+00 10 00 00 00 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...2
+** Controls: KV, MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 16 05 02 0f 23 43 3a 0d 05 07 07 07 04 07 32 45 43 04 03 09 06 08 09 0f
+45 45 40 04 02 0f 06 07 09 0f 0a 45 5f 04 00 3b 23 23 0b 02 46 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...2
+** Controls: MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 16 05 02 0f 23 40 3a 0d 05 07 07 07 04 07 32 40 43 04 03 09 06 08 09 0f
+45 40 40 04 02 0f 06 07 09 0f 0a 40 5f 04 00 3b 23 23 0b 02 46 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...3
+** Controls: KV, MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 09 05 05 0f 23 44 49 08 05 06 07 07 04 07 32 46 4d 08 04 0d 06 08 09 0f
+45 45 57 08 02 0d 07 07 09 0f 0a 45 5f 04 00 2e 23 23 0b 02 46 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...3
+** Controls: KV, MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 09 05 05 0f 23 41 49 08 05 06 07 07 04 07 32 40 4d 08 04 0d 06 08 09 0f
+45 40 57 08 02 0d 07 07 09 0f 0a 40 5f 04 00 2e 23 23 0b 02 46 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...4
+** Controls: KV, MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+07 05 0a 07 0e 2d 43 51 04 0b 0a 04 05 05 09 3c 45 5b 04 05 0d 06 08 09 0f
+59 46 60 04 04 0a 05 08 07 0e 0a 46 61 04 0e 06 1b 0f 48 22 16 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 34 63 63 63 32 32 32 00 10
+00 10 00 10 00 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...4
+** Controls: MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 05 0a 07 0e 2d 40 51 04 0b 0a 04 05 05 09 3c 40 5b 04 05 0d 06 08 09 0f
+59 40 60 04 04 0a 05 08 07 0e 0a 40 61 04 0e 06 1b 0f 48 22 16 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 34 63 63 63 32 32 32 00 10
+00 10 00 10 00 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...5
+** Controls: KV, MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 07 08 08 0d 2d 44 41 08 04 0c 08 04 06 0b 3c 46 63 04 04 0a 07 05 08 0f
+59 46 63 00 01 09 04 08 07 0f 0a 47 61 04 05 0e 1b 0f 4f 26 16 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...5
+** Controls: MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 07 08 08 0d 2d 40 41 08 04 0c 08 04 06 0b 3c 40 63 04 04 0a 07 05 08 0f
+59 40 63 00 01 09 04 08 07 0f 0a 40 61 04 05 0e 1b 0f 4f 26 16 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 30 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...6
+** Controls: KV, MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 0a 06 08 0d 3e 45 4b 04 03 0c 06 05 07 0d 32 45 63 08 03 0a 0a 03 07 0f
+43 45 63 0a 0b 0c 07 06 08 0f 0a 46 63 04 03 0e 1b 0f 4f 3d 16 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 36 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...6
+** Controls: MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 0a 06 08 0d 3e 40 4b 04 03 0c 06 05 07 0d 32 40 63 08 03 0a 0a 03 07 0f
+43 40 63 0a 0b 0c 07 06 08 0f 0a 40 63 04 03 0e 1b 0f 4f 3d 16 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 36 63 63 63 32 32 32 00 20
+00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...7
+** Controls: MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+06 07 05 07 0d 17 40 42 04 03 09 03 04 07 0d 32 40 55 0a 03 08 05 04 07 0f
+2a 40 5b 08 06 08 08 05 07 0f 1e 40 5b 04 05 1e 1b 0f 4f 3d 36 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...8
+** Controls: KV, MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+06 05 06 06 0c 17 40 39 0a 03 09 05 03 07 0e 32 45 5b 04 03 09 04 06 06 0d
+2a 47 5f 04 03 09 06 02 09 0d 1e 46 5d 0a 03 0e 1b 0f 4f 3d 16 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 38 63 63 63 32 32 32 00 10
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chorus...8
+** Controls: MW (LFO pitch), BC (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+06 05 06 06 0c 17 40 39 0a 03 09 05 03 07 0e 32 40 5b 04 03 09 04 06 06 0d
+2a 40 5f 04 03 09 06 02 09 0d 1e 40 5d 0a 03 0e 1b 0f 4f 3d 16 18 02 04 00
+63 32 00 00 01 32 00 43 68 6f 72 75 73 2e 2e 2e 38 63 63 63 32 32 32 00 10
+00 30 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+* SUBCATEGORY FVoice
+
+** Name: F Voice..1
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 04 05 0a 00 46 52 04 01 15 18 18 07 0c 00 06 4b 04 02 0c 08 04 09 0e
+00 46 5b 04 06 0c 08 04 09 0e 00 06 5e 04 00 74 27 1b 30 08 26 18 07 04 00
+63 32 63 32 00 32 00 46 20 56 6f 69 63 65 2e 2e 31 63 63 63 32 32 32 00 30
+00 30 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: F Voice..1
+** Controls: MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 04 05 0a 00 40 52 04 01 15 18 18 07 0c 00 00 4b 04 02 0c 08 04 09 0e
+00 40 5b 04 06 0c 08 04 09 0e 00 00 5e 04 00 74 27 1b 30 08 26 18 07 04 00
+63 32 63 32 00 32 00 46 20 56 6f 69 63 65 2e 2e 31 63 63 63 32 32 32 00 30
+00 30 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: F Voice..2
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 16 0f 03 0e 00 45 32 3d 01 06 07 0f 03 09 00 04 44 04 03 0c 06 0a 07 0e
+00 45 1a 04 06 0e 08 04 09 0e 00 06 57 04 00 23 27 22 5b 02 16 18 07 04 00
+63 32 63 32 00 32 00 46 20 56 6f 69 63 65 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: F Voice..2
+** Controls: MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 16 0f 03 0e 00 40 32 3d 01 06 07 0f 03 09 00 00 44 04 03 0c 06 0a 07 0e
+00 40 1a 04 06 0e 08 04 09 0e 00 00 57 04 00 23 27 22 5b 02 16 18 07 04 00
+63 32 63 32 00 32 00 46 20 56 6f 69 63 65 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: F Voice..3
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 1f 0e 06 0f 28 05 63 04 00 0c 19 06 07 0f 3c 06 63 08 05 0d 0c 0a 07 0f
+0f 06 63 08 06 0d 19 06 07 0f 00 46 61 04 01 27 23 00 15 28 16 18 07 04 00
+63 32 63 32 00 32 00 46 20 56 6f 69 63 65 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: F Voice..3
+** Controls: MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 1f 0e 06 0f 28 00 63 04 00 0c 19 06 07 0f 3c 00 63 08 05 0d 0c 0a 07 0f
+0f 00 63 08 06 0d 19 06 07 0f 00 40 61 04 01 27 23 00 15 28 16 18 07 04 00
+63 32 63 32 00 32 00 46 20 56 6f 69 63 65 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: F Voice..4
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 15 03 05 0f 01 44 47 00 03 0f 06 06 07 0e 00 40 43 04 04 12 15 04 05 0f
+00 46 37 08 03 12 06 04 09 0f 00 45 58 04 04 3c 23 3a 0a 02 46 24 07 04 00
+63 32 63 32 00 32 00 46 20 56 6f 69 63 65 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: F Voice..4
+** Controls: MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 15 03 05 0f 01 40 47 00 03 0f 06 06 07 0e 00 40 43 04 04 12 15 04 05 0f
+00 40 37 08 03 12 06 04 09 0f 00 40 58 04 04 3c 23 3a 0a 02 46 24 07 04 00
+63 32 63 32 00 32 00 46 20 56 6f 69 63 65 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Fem.Voice*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 17 00 07 0f 00 00 2d 0d 06 0e 17 00 06 0f 00 00 2f 04 00 0b 0d 00 07 0a
+00 02 63 08 00 13 0f 00 07 0f 00 02 63 04 06 24 1e 03 25 00 52 18 02 04 00
+28 63 00 00 00 32 00 46 65 6d 2e 56 6f 69 63 65 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+* SUBCATEGORY MVoice
+
+** Name: M Voice..1
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 18 03 04 0e 00 45 49 04 0a 0d 05 02 07 0f 00 46 3d 10 0a 0c 06 04 07 0f
+00 46 63 08 0a 0d 18 02 07 0f 00 46 5f 08 04 04 1e 21 33 26 16 0c 04 04 00
+63 01 63 00 00 32 00 4d 20 56 6f 69 63 65 2e 2e 31 63 63 63 32 32 32 00 00
+00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: M Voice..1
+** Controls: MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 03 04 0e 00 40 49 04 0a 0d 05 02 07 0f 00 40 3d 10 0a 0c 06 04 07 0f
+00 40 63 08 0a 0d 18 02 07 0f 00 40 5f 08 04 04 1e 21 33 26 16 0c 04 04 00
+63 01 63 00 00 32 00 4d 20 56 6f 69 63 65 2e 2e 31 63 63 63 32 32 32 00 00
+00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: M Voice..2
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 18 03 04 0f 00 05 47 04 0b 1f 18 03 04 0f 00 06 4a 04 01 0f 18 03 07 0f
+00 46 60 08 0b 0f 18 03 07 0f 00 46 63 08 04 24 1d 0c 29 26 26 0c 04 04 00
+63 01 63 00 00 32 00 4d 20 56 6f 69 63 65 2e 2e 32 63 63 63 32 32 32 00 10
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: M Voice..2
+** Controls: MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 03 04 0f 00 00 47 04 0b 1f 18 03 04 0f 00 00 4a 04 01 0f 18 03 07 0f
+00 40 60 08 0b 0f 18 03 07 0f 00 40 63 08 04 24 1d 0c 29 26 26 0c 04 04 00
+63 01 63 00 00 32 00 4d 20 56 6f 69 63 65 2e 2e 32 63 63 63 32 32 32 00 10
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: M Voice..3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 18 02 04 0a 00 45 5a 04 0c 12 07 0f 04 03 0a 45 2a 14 0b 09 03 0f 07 09
+00 45 58 04 0c 08 00 0f 08 0c 0a 46 5f 0a 0d 24 1e 21 21 0c 16 0c 04 04 00
+63 32 00 00 00 32 00 4d 20 56 6f 69 63 65 2e 2e 33 63 63 63 32 32 32 10 10
+2b 07 00 10 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: M Voice..3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 02 04 0a 00 40 5a 04 0c 12 07 0f 04 03 0a 41 2a 14 0b 09 03 0f 07 09
+00 40 58 04 0c 08 00 0f 08 0c 0a 41 5f 0a 0d 24 1e 21 21 0c 16 0c 04 04 00
+63 32 00 00 00 32 00 4d 20 56 6f 69 63 65 2e 2e 33 63 63 63 32 32 32 10 10
+2b 07 00 10 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: M Voice..4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 05 07 02 03 00 06 46 04 0c 0d 0c 06 05 0f 0a 06 34 19 0c 0c 06 0f 07 0d
+00 06 5c 04 0e 0a 00 0f 08 0c 0a 05 5a 04 09 54 21 14 38 00 22 0c 04 04 00
+63 32 00 00 00 32 00 4d 20 56 6f 69 63 65 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: M Voice..4
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 05 07 02 03 00 00 46 04 0c 0d 0c 06 05 0f 0a 00 34 19 0c 0c 06 0f 07 0d
+00 00 5c 04 0e 0a 00 0f 08 0c 0a 00 5a 04 09 54 21 14 38 00 22 0c 04 04 00
+63 32 00 00 00 32 00 4d 20 56 6f 69 63 65 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mal.Voice*
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 19 00 04 0f 13 00 4d 04 06 12 06 00 02 0f 00 00 47 04 05 0b 19 00 07 0f
+00 00 63 08 00 0a 19 00 07 0f 00 00 4e 28 03 04 20 00 30 26 42 0c 02 04 00
+28 63 00 00 00 32 00 4d 61 6c 2e 56 6f 69 63 65 2a 63 63 63 32 32 32 00 00
+00 00 00 00 0c 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Male Voice
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 04 0f 2c 00 32 3f 03 0b 02 03 01 0f 0d 00 3c 10 00 0f 02 04 01 0f
+23 00 3b 00 06 0e 00 01 06 0f 08 03 5f 0d 03 4b 0a 07 05 01 62 0c 05 04 00
+63 03 00 00 00 32 00 4d 61 6c 65 20 56 6f 69 63 65 63 63 63 32 32 32 00 1f
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MaleVoices
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 04 0f 2c 00 32 1c 03 0b 02 03 01 0f 0d 00 3c 05 00 0f 02 04 01 0f
+23 00 3b 00 06 0e 00 01 06 0f 08 03 5f 04 03 4b 1a 00 05 01 62 11 00 04 00
+63 32 00 00 00 32 00 4d 61 6c 65 56 6f 69 63 65 73 63 63 63 32 32 32 00 11
+00 31 00 04 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+* SUBCATEGORY Other
+
+** Name: Quartet..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+05 07 00 05 0e 00 45 52 00 00 0c 07 00 05 0e 0e 45 56 08 06 0c 1f 00 06 0f
+00 05 63 04 00 0c 1f 00 07 0f 0a 06 63 08 06 2c 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 51 75 61 72 74 65 74 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Quartet..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+05 07 00 05 0e 00 41 52 00 00 0c 07 00 05 0e 0e 41 56 08 06 0c 1f 00 06 0f
+00 00 63 04 00 0c 1f 00 07 0f 0a 00 63 08 06 2c 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 51 75 61 72 74 65 74 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Quartet..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 07 00 05 0e 00 44 51 00 00 0e 07 00 05 0e 0e 45 55 04 06 0e 1f 00 06 0f
+00 06 63 08 00 0c 1f 00 07 0f 0a 06 63 08 06 34 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 51 75 61 72 74 65 74 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Quartet..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 07 00 05 0e 00 41 51 00 00 0e 07 00 05 0e 0e 41 55 04 06 0e 1f 00 06 0f
+00 00 63 08 00 0c 1f 00 07 0f 0a 00 63 08 06 34 22 0e 13 08 56 18 07 04 00
+63 63 00 00 00 32 00 51 75 61 72 74 65 74 2e 2e 32 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Ensem.1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 7
+14 06 00 04 07 14 02 49 12 06 0e 08 02 04 09 14 02 59 13 00 0e 09 02 04 0b
+00 01 63 09 06 0e 09 02 04 0a 00 01 5e 0a 00 3d 21 08 0c 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 79 2e 45 6e 73 65 6d 2e 31 63 63 63 32 32 32 00 54
+00 30 00 32 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Ensem.2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 8
+1f 17 09 03 0c 14 02 48 3b 03 0a 04 02 05 07 14 01 63 13 06 1f 07 02 05 0b
+00 01 63 13 06 0a 03 01 05 0b 00 01 63 0a 00 3e 21 0c 16 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 79 2e 45 6e 73 65 6d 2e 32 63 63 63 32 32 32 00 60
+00 10 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Ensem.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 17 09 03 0c 14 02 48 3b 03 0d 04 02 05 07 14 01 63 13 06 1f 07 02 05 0b
+00 01 63 13 06 0d 03 01 05 0b 00 01 63 0a 00 3e 21 0c 16 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 79 2e 45 6e 73 65 6d 2e 32 63 63 63 32 32 32 00 60
+00 10 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Ensem.3
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 9
+1f 1f 05 02 0f 27 02 50 0a 06 1f 1f 05 02 0f 00 02 43 0a 00 1a 1f 07 04 0f
+00 06 56 10 06 1a 1f 07 04 0f 00 01 5e 04 00 14 63 00 0c 00 63 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 45 6e 73 65 6d 2e 33 63 63 63 32 32 32 00 00
+00 30 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Ensem.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 05 02 0f 27 02 50 0a 06 1f 1f 05 02 0f 00 02 43 0d 00 1a 1f 07 04 0f
+00 06 56 10 06 1a 1f 07 04 0f 00 01 5e 04 00 14 63 00 0c 00 63 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 45 6e 73 65 6d 2e 33 63 63 63 32 32 32 00 00
+00 30 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Ensem.4
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 10
+08 04 00 04 0f 14 01 3e 13 06 07 07 00 04 0f 14 01 51 0a 02 10 1f 00 04 0f
+14 01 63 09 04 1b 09 00 04 0b 14 01 5f 13 00 3c 1f 01 14 00 52 05 02 04 00
+63 32 00 00 00 32 00 53 79 2e 45 6e 73 65 6d 2e 34 63 63 63 32 32 32 00 00
+00 30 00 32 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Ensem.5
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 11
+0e 02 00 01 0a 13 00 44 04 03 0b 06 00 05 0e 00 03 63 00 06 0e 06 00 05 0e
+00 03 5b 08 00 0e 06 00 05 0e 00 03 63 04 00 35 1c 0b 1b 00 32 18 02 04 00
+28 63 00 00 00 32 00 53 79 2e 45 6e 73 65 6d 2e 35 63 63 63 32 32 32 00 50
+00 10 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Ensem.5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 02 00 01 0d 13 00 44 04 03 0b 06 00 05 0e 00 03 63 00 06 0e 06 00 05 0e
+00 03 5b 08 00 0e 06 00 05 0e 00 03 63 04 00 35 1c 0b 1b 00 32 18 02 04 00
+28 63 00 00 00 32 00 53 79 2e 45 6e 73 65 6d 2e 35 63 63 63 32 32 32 00 50
+00 10 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Voice 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 27
+0c 0e 00 04 0f 0a 40 41 04 06 0a 0e 00 04 0f 0a 40 41 04 00 0a 0c 00 06 0f
+0a 42 63 04 06 0a 0e 00 06 0f 0a 42 63 08 00 2c 1e 0a 50 04 4a 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 56 6f 69 63 65 20 31 63 56 63 2e 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Voice 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 0e 00 04 0f 0a 40 41 04 06 0d 0e 00 04 0f 0a 40 41 04 00 0d 0c 00 06 0f
+0a 42 63 04 06 0d 0e 00 06 0f 0a 42 63 08 00 2c 1e 0a 50 04 4a 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 56 6f 69 63 65 20 31 63 56 63 2e 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Voice 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 28
+12 02 01 04 0f 00 00 37 04 0c 0f 02 01 02 0b 00 00 31 04 0b 0e 02 01 05 0a
+0f 02 63 04 0b 0e 02 01 05 0a 0f 02 63 08 08 34 1e 12 2c 00 42 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 56 6f 69 63 65 20 32 63 3e 63 2f 32 32 00 00
+00 20 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Voice 2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 02 01 04 0f 00 00 37 04 0c 0f 02 01 02 0b 00 00 31 04 0b 0e 02 01 05 0d
+0f 02 63 04 0b 0e 02 01 05 0d 0f 02 63 08 08 34 1e 12 2c 00 42 18 02 04 00
+28 32 00 00 00 32 00 53 79 2e 56 6f 69 63 65 20 32 63 3e 63 2f 32 32 00 00
+00 20 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Syntvoice*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 00 00 22 03 0b 17 00 06 0f 00 01 52 04 01 0c 0d 00 07 0b
+00 02 42 08 06 11 0f 00 07 0f 00 01 63 04 03 3b 1e 0b 21 00 42 18 02 04 00
+28 63 00 00 00 32 00 53 79 6e 74 76 6f 69 63 65 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: VocalNuts
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 2
+1f 00 00 04 0f 00 40 47 2f 00 0e 08 07 07 0f 05 00 4c 00 06 13 1c 0d 0c 06
+08 00 63 05 06 14 11 0d 0b 00 00 03 63 04 00 7a 10 00 51 00 68 17 00 04 00
+63 32 00 00 00 32 00 56 6f 63 61 6c 4e 75 74 73 20 63 63 63 32 32 32 06 30
+00 30 00 01 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: > Voices <
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0e 00 07 0f 63 03 45 04 04 0a 1f 00 03 0f 00 01 42 04 04 09 1f 00 07 0f
+00 06 44 1f 02 08 0e 00 06 0f 00 46 63 04 05 3c 23 2a 23 00 36 18 02 04 00
+28 41 00 00 00 32 00 3e 20 56 6f 69 63 65 73 20 3c 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: > Voices <
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0e 00 07 0f 63 00 45 04 04 0a 1f 00 03 0f 00 00 42 04 04 09 1f 00 07 0f
+00 00 44 1f 02 08 0e 00 06 0f 00 40 63 04 05 3c 23 2a 23 00 36 18 02 04 00
+28 41 00 00 00 32 00 3e 20 56 6f 69 63 65 73 20 3c 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Voices
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 27
+1f 00 00 04 0f 00 00 39 20 03 0b 02 03 01 0f 05 00 40 05 00 0f 02 04 01 0f
+08 00 35 03 06 0e 00 01 06 0f 00 03 63 04 03 7b 1a 00 05 01 62 11 00 04 00
+63 32 00 00 00 32 00 56 6f 69 63 65 73 20 20 20 20 63 63 63 32 32 32 00 01
+00 01 00 06 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Whisper
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 00 01 0e 00 40 5c 39 00 0b 08 00 04 0d 26 02 63 05 04 10 0a 00 06 0c
+00 03 41 3e 06 0b 08 00 04 0d 00 02 61 03 08 3e 4f 00 44 63 30 11 04 04 00
+63 15 00 00 00 32 00 57 68 69 73 70 65 72 20 20 20 63 63 63 32 32 32 00 2f
+00 31 00 60 00 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wind Voice
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 24
+06 1d 01 02 0f 00 01 06 17 00 00 00 0c 02 0f 2e 01 53 19 0e 17 01 00 02 0a
+00 02 4b 08 08 0b 01 06 05 0f 01 02 5c 08 0e 01 63 00 52 00 53 18 07 04 00
+63 63 00 00 00 32 00 57 69 6e 64 20 56 6f 69 63 65 63 63 63 32 32 32 00 34
+00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 22
+
+* CATEGORY PERCUSSION
+
+
+* SUBCATEGORY Bell
+
+
+** Name: Agogo *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 07 0f 00 01 49 08 06 1f 1f 00 07 0f 00 00 41 0c 00 1a 0f 00 07 00
+00 02 63 04 06 1a 0f 00 07 00 00 03 63 04 00 44 12 00 00 00 32 24 02 04 00
+28 63 00 00 00 32 00 41 67 6f 67 6f 20 20 20 20 2a 63 63 63 32 32 32 00 4f
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Agogo Bell
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 11
+1f 12 19 03 0c 06 02 57 16 0c 1f 13 19 04 0c 11 02 59 3c 09 1f 11 10 06 0e
+00 01 63 08 0a 1f 11 0f 06 0a 00 02 63 08 0a 7c 13 00 06 00 62 18 04 04 00
+63 32 00 00 00 32 00 41 67 6f 67 6f 20 42 65 6c 6c 63 63 63 32 32 32 00 20
+0a 1d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Agogo Bell
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 19 03 0c 06 02 57 16 0c 1f 13 19 04 0c 11 02 59 3c 09 1f 11 10 06 0e
+00 01 63 08 0d 1f 11 0f 06 0d 00 02 63 08 0a 7c 13 00 06 00 62 18 04 04 00
+63 32 00 00 00 32 00 41 67 6f 67 6f 20 42 65 6c 6c 63 63 63 32 32 32 00 20
+0d 1d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Analobell*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 0a 00 04 00 38 00 54 10 0d 1f 03 08 03 00 4c 00 51 09 08 17 06 08 03 00
+14 05 63 10 0b 1d 0a 08 03 00 0e 02 63 0a 0e 04 23 00 00 00 32 02 02 04 00
+28 63 00 00 00 32 00 41 6e 61 6c 6f 62 65 6c 6c 2a 63 63 63 32 32 32 00 04
+00 18 00 04 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bangkok
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 1a 00 05 07 00 01 58 09 08 1e 10 00 03 04 00 03 57 08 15 1c 08 05 05 0b
+00 00 62 04 0e 1a 0c 05 04 04 00 00 60 0a 00 0c 1e 00 00 00 42 1a 03 04 00
+63 32 26 2a 00 32 00 42 61 6e 67 6b 6f 6b 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Bells
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 05 00 02 07 00 01 50 00 1b 1f 10 0c 03 0f 00 01 4e 10 0b 1f 0b 00 05 0e
+00 05 62 04 03 1b 0f 0c 03 0f 00 05 4f 04 0c 2c 18 00 00 00 22 0c 04 04 00
+28 32 00 00 00 32 00 42 61 73 73 20 42 65 6c 6c 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Bells
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 00 02 07 00 00 50 00 1b 1f 10 0c 03 0f 00 00 4e 10 0b 1f 0b 00 05 0e
+00 00 62 04 03 1b 0f 0c 03 0f 00 00 4f 04 0c 2c 18 00 00 00 22 0c 04 04 00
+28 32 00 00 00 32 00 42 61 73 73 20 42 65 6c 6c 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 31
+1f 16 07 03 0a 00 01 4c 16 06 1f 10 0a 04 08 00 01 44 0a 00 19 09 00 04 00
+00 03 60 04 06 18 09 00 06 00 00 02 5f 00 00 3c 1e 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 20 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 16 07 03 0a 00 01 4c 16 06 1f 10 0a 04 08 00 01 44 0d 00 19 09 00 04 00
+00 03 60 04 06 18 09 00 06 00 00 02 5f 00 00 3c 1e 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 20 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell Ensem
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 05 00 04 04 50 04 51 20 0e 1e 0a 01 04 02 50 04 53 1f 08 1e 1d 0a 04 0f
+00 02 5c 05 0e 1f 1f 0a 04 0f 00 03 5c 04 08 04 1a 00 00 00 52 1d 02 04 00
+63 32 00 32 00 32 00 42 65 6c 6c 20 45 6e 73 65 6d 63 63 63 32 32 32 00 30
+00 46 00 01 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell Pad
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 30
+12 0b 0f 04 07 00 40 43 1c 00 1f 08 07 07 0f 05 00 63 05 00 0e 07 02 07 0f
+08 03 5c 00 06 15 08 04 05 0f 00 03 63 03 06 7e 1f 00 06 00 4a 1d 02 04 00
+63 32 00 00 00 32 00 42 65 6c 6c 20 50 61 64 20 20 63 63 63 32 32 32 06 30
+00 51 00 04 00 56 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 04 01 02 0d 00 01 52 0d 03 1b 0f 00 03 0e 58 04 57 0d 08 1d 0f 03 03 0e
+57 05 63 08 03 1e 02 03 03 0e 00 03 63 08 0e 34 0c 00 06 00 42 00 02 04 00
+63 11 06 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 04 01 02 0d 00 01 52 0d 03 1b 0f 00 03 0e 58 02 57 0d 08 1d 0f 03 03 0e
+57 01 63 08 03 1e 02 03 03 0e 00 00 63 08 0e 34 0c 00 06 00 42 00 02 04 00
+63 11 06 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 04 00 05 00 62 04 38 2a 16 1f 07 00 04 01 00 02 4a 2a 00 1f 07 00 05 00
+00 06 63 04 0b 1f 08 00 05 00 00 05 60 0d 08 3c 14 00 00 00 62 0c 02 04 00
+63 32 00 32 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 04 00 05 00 62 01 38 2a 16 1f 07 00 04 01 00 01 4a 2a 00 1f 07 00 05 00
+00 00 63 04 0b 1f 08 00 05 00 00 00 60 0d 08 3c 14 00 00 00 62 0c 02 04 00
+63 32 00 32 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 10 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 04 01 01 0b 16 02 4e 05 03 15 0e 00 01 0d 00 03 54 10 16 1c 06 04 02 07
+00 04 63 08 16 18 18 03 01 0e 00 04 62 04 10 24 09 00 04 00 42 24 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 30
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 04 01 01 0b 16 01 4e 05 03 15 0e 00 01 0d 00 01 54 10 16 1c 06 04 02 07
+00 00 63 08 16 18 18 03 01 0e 00 01 62 04 10 24 09 00 04 00 42 24 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 30
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....4
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 0a 17 05 01 00 02 4e 2d 06 19 0a 1f 03 02 00 03 41 2d 04 19 07 12 04 07
+13 05 63 0a 06 19 07 0f 03 07 13 47 63 0a 03 7c 14 0a 00 39 06 0c 02 04 00
+63 15 27 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....4
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 0a 17 05 01 00 01 4e 2d 06 19 0a 1f 03 02 00 01 41 2d 04 19 07 12 04 07
+13 01 63 0a 06 19 07 0f 03 07 13 40 63 0a 03 7c 14 0a 00 39 06 0c 02 04 00
+63 15 27 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....5
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 0a 02 03 01 00 04 51 2d 06 19 0a 1f 05 02 00 03 48 08 04 19 07 12 04 07
+13 06 62 0d 06 19 07 07 04 07 13 45 63 04 03 76 14 0a 00 39 06 0c 02 04 00
+63 15 27 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....5
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 0a 02 03 01 00 01 51 2d 06 19 0a 1f 05 02 00 01 48 08 04 19 07 12 04 07
+13 01 62 0d 06 19 07 07 04 07 13 40 63 04 03 76 14 0a 00 39 06 0c 02 04 00
+63 15 27 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1a 0e 04 00 00 05 4e 2d 13 1f 0a 00 05 00 00 04 49 08 0b 1f 1f 00 04 0f
+00 05 49 0d 0b 1f 06 00 04 00 00 06 63 04 03 41 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1a 0e 04 00 00 01 4e 2d 13 1f 0a 00 05 00 00 01 49 08 0b 1f 1f 00 04 0f
+00 01 49 0d 0b 1f 06 00 04 00 00 00 63 04 03 41 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1a 0e 04 00 00 04 4e 28 03 1f 0a 00 05 00 00 04 49 16 03 1f 1f 00 04 0f
+00 04 49 16 03 1f 06 00 06 00 00 06 63 04 03 42 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1a 0e 04 00 00 01 4e 28 03 1f 0a 00 05 00 00 02 49 16 03 1f 1f 00 04 0f
+00 01 49 16 03 1f 06 00 06 00 00 00 63 04 03 42 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....8
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 1f 04 00 00 05 4b 19 03 1f 00 00 02 0f 00 04 4d 16 1b 1f 0d 1f 04 00
+00 06 63 04 03 1f 0a 07 04 00 00 05 63 04 03 7c 5c 00 01 63 32 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....8
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 1f 04 00 00 01 4b 19 03 1f 00 00 02 0f 00 01 4d 16 1b 1f 0d 1f 04 00
+00 01 63 04 03 1f 0a 07 04 00 00 01 63 04 03 7c 5c 00 01 63 32 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....9
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 15 09 03 0a 00 03 63 34 13 12 1f 0a 05 0f 00 43 63 0d 03 12 1f 0a 05 0f
+00 45 63 19 03 12 08 0a 05 0f 00 46 63 04 03 45 1a 00 00 39 66 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 39 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell.....9
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 15 09 03 0a 00 00 63 34 13 12 1f 0a 05 0f 00 40 63 0d 03 12 1f 0a 05 0f
+00 40 63 19 03 12 08 0a 05 0f 00 40 63 04 03 45 1a 00 00 39 66 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 2e 39 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell....10
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 06 04 0a 00 04 3f 24 13 1f 0c 06 03 0f 00 04 3f 16 03 1f 06 07 03 0c
+00 45 48 0d 03 18 04 09 04 0c 00 06 63 08 03 43 1a 00 00 1c 66 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 31 30 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell....10
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 06 04 0a 00 01 3f 24 13 1f 0c 06 03 0f 00 01 3f 16 03 1f 06 07 03 0c
+00 41 48 0d 03 18 04 09 04 0c 00 01 63 08 03 43 1a 00 00 1c 66 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 31 30 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell....11
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 05 0e 04 0f 00 02 48 1c 03 1f 0b 00 05 0a 00 04 5c 24 1b 1f 08 00 04 0a
+00 05 5d 08 03 1f 10 00 04 0b 00 05 63 08 03 7e 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 31 31 63 63 63 32 32 32 00 00
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bell....11
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 0e 04 0f 00 02 48 1c 03 1f 0b 00 05 0a 00 00 5c 24 1b 1f 08 00 04 0a
+00 00 5d 08 03 1f 10 00 04 0b 00 00 63 08 03 7e 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 42 65 6c 6c 2e 2e 2e 2e 31 31 63 63 63 32 32 32 00 00
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BelleBell*
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 08 06 02 0d 16 02 5c 07 0e 18 08 06 02 0d 15 02 5b 08 08 1f 0a 08 03 0e
+0d 01 61 00 00 1c 0a 08 04 0e 0b 01 63 00 06 04 19 00 24 00 32 1d 01 04 00
+28 63 00 00 00 30 00 42 65 6c 6c 65 42 65 6c 6c 2a 63 63 63 32 32 32 00 09
+00 0b 00 04 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bells
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0c 0d 04 05 00 00 57 11 03 1f 0c 0d 04 05 00 40 5f 04 03 1f 0c 0d 04 05
+00 38 61 36 03 1f 0c 0d 04 05 00 00 63 14 03 47 1d 00 03 13 5e 30 04 04 00
+63 32 00 00 00 32 00 42 65 6c 6c 73 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BellyStuff
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 0b 0f 04 07 00 40 43 1c 00 13 0c 07 07 0b 05 00 58 05 00 1f 07 02 07 0f
+08 03 5c 00 06 13 0c 04 05 0a 00 03 57 03 06 7e 1f 00 06 00 4a 1d 02 04 00
+63 32 00 00 00 32 00 42 65 6c 6c 79 53 74 75 66 66 63 63 63 32 32 32 06 70
+00 61 00 04 00 66 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Big Bell.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 04 01 02 0d 00 03 51 0c 03 1b 0f 00 03 0e 58 03 55 1a 08 1d 0f 03 03 0e
+57 07 63 00 03 1e 02 03 03 0e 00 06 63 04 0e 74 0c 00 06 00 63 00 02 04 00
+63 11 06 00 00 32 00 42 69 67 20 42 65 6c 6c 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Big Bell.1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 04 01 02 0d 00 01 51 0c 03 1b 0f 00 03 0e 58 03 55 1a 08 1d 0f 03 03 0e
+57 04 63 00 03 1e 02 03 03 0e 00 00 63 04 0e 74 0c 00 06 00 63 00 02 04 00
+63 11 06 00 00 32 00 42 69 67 20 42 65 6c 6c 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Big Bell.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 04 01 02 0d 00 04 52 15 03 1b 0f 00 03 0e 58 04 57 12 08 1d 0f 03 03 0e
+57 05 63 0d 03 1e 02 03 03 0e 00 05 63 04 0e 74 0c 00 06 00 63 00 02 04 00
+63 11 06 00 00 32 00 42 69 67 20 42 65 6c 6c 2e 32 63 63 63 32 32 32 00 20
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Big Bell.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 04 01 02 0d 00 01 52 15 03 1b 0f 00 03 0e 58 02 57 12 08 1d 0f 03 03 0e
+57 02 63 0d 03 1e 02 03 03 0e 00 00 63 04 0e 74 0c 00 06 00 63 00 02 04 00
+63 11 06 00 00 32 00 42 69 67 20 42 65 6c 6c 2e 32 63 63 63 32 32 32 00 20
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Big Bell.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 04 01 02 0d 00 01 51 18 03 1b 0f 00 03 0e 58 03 5a 00 08 1d 0f 03 03 0e
+57 06 63 08 03 1e 02 03 03 0e 00 05 63 00 0e 74 0c 00 06 00 63 00 02 04 00
+63 11 06 00 00 32 00 42 69 67 20 42 65 6c 6c 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Big Bell.3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 04 01 02 0d 00 01 51 18 03 1b 0f 00 03 0e 58 03 5a 00 08 1d 0f 03 03 0e
+57 04 63 08 03 1e 02 03 03 0e 00 00 63 00 0e 74 0c 00 06 00 63 00 02 04 00
+63 11 06 00 00 32 00 42 69 67 20 42 65 6c 6c 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BowedBell
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 6
+0b 04 05 04 0f 00 42 55 22 06 0a 07 04 04 0f 00 02 47 0a 00 0b 1f 02 04 0f
+00 02 63 0d 06 0b 1f 02 05 0f 00 02 62 04 00 1c 1e 06 11 09 5a 0c 04 04 00
+63 28 00 00 00 32 00 42 6f 77 65 64 42 65 6c 6c 20 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrightBell
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 0e 05 02 0d 27 02 63 16 06 1f 0e 05 02 0e 1a 02 58 16 00 1a 1f 07 04 0f
+00 06 60 08 0e 1a 1f 07 04 0f 00 01 5e 08 08 14 1a 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 42 72 69 67 68 74 42 65 6c 6c 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Brthbells
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 16
+1c 08 00 03 0e 00 01 55 12 03 1c 07 00 01 0e 2e 01 58 27 0b 0e 04 00 02 0a
+00 02 63 04 0a 0d 09 00 02 0c 01 02 63 10 0b 04 54 00 47 00 53 18 07 04 00
+63 32 00 00 00 32 00 42 72 74 68 62 65 6c 6c 73 20 63 63 63 32 32 32 00 04
+00 40 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Carnival!
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 19
+1f 1f 01 0f 0f 22 00 2f 04 08 18 10 1c 0e 01 24 40 40 05 06 1f 04 10 0f 0b
+2c 00 2b 00 00 17 1f 09 08 0f 00 00 54 04 0e 3a 63 3f 31 2c 5e 0c 07 04 00
+63 63 00 32 00 32 00 43 61 72 6e 69 76 61 6c 21 20 63 63 63 32 32 32 00 00
+00 10 00 07 00 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ChurchBell
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 09 1f 03 04 00 01 5b 3d 03 1c 09 1f 04 04 00 04 53 05 00 1c 09 1f 04 04
+00 07 5a 04 03 1c 09 1f 03 04 00 07 63 04 03 2c 19 2a 0e 00 10 18 04 04 00
+28 32 00 00 00 32 00 43 68 75 72 63 68 42 65 6c 6c 63 63 63 32 32 32 08 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ChurchBell
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 09 1f 03 04 00 01 5b 3d 03 1c 09 1f 04 04 00 01 53 05 00 1c 09 1f 04 04
+00 00 5a 04 03 1c 09 1f 03 04 00 00 63 04 03 2c 19 2a 0e 00 10 18 04 04 00
+28 32 00 00 00 32 00 43 68 75 72 63 68 42 65 6c 6c 63 63 63 32 32 32 08 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ClickChime
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 16 00 03 07 00 01 43 00 03 18 18 03 03 03 22 00 60 00 0c 16 07 06 03 06
+00 01 3c 08 03 1a 05 07 03 00 00 01 63 04 0b 39 23 00 08 00 42 18 04 04 00
+63 32 00 00 00 32 00 43 6c 69 63 6b 43 68 69 6d 65 63 63 63 32 32 32 00 31
+00 03 00 11 00 01 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cloches *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 04 1f 04 00 00 00 4b 0f 0a 1f 05 1b 04 00 00 00 49 10 0c 1e 09 16 03 00
+00 00 63 03 08 1f 09 0a 03 00 00 00 63 04 0e 04 23 00 00 00 62 11 02 04 00
+28 32 00 00 00 32 00 43 6c 6f 63 68 65 73 20 20 2a 63 63 63 32 32 32 00 06
+00 04 00 06 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cow Bell
+** Source: Yamaha DX11 factory preset, bank D, voice 10
+1f 0a 1f 03 0c 00 00 43 20 03 1f 16 00 04 0b 00 00 4f 24 03 1f 12 10 08 07
+00 00 5f 34 03 1f 12 12 08 0f 00 00 63 38 03 3c 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 43 6f 77 20 42 65 6c 6c 20 20 63 63 63 32 32 32 0b 07
+0c 04 0b 0e 09 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cow-Belle*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 17 1f 09 00 00 00 51 38 03 1f 14 1f 0a 00 00 00 47 10 03 1a 0e 1f 09 00
+00 03 63 04 13 1a 10 1f 08 00 00 02 63 04 0b 04 23 00 00 00 62 18 01 04 00
+28 32 00 00 00 32 00 43 6f 77 2d 42 65 6c 6c 65 2a 63 63 63 32 32 32 0b 23
+00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gong.....1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 07 06 05 02 1f 04 41 04 0b 1f 1f 04 04 0f 00 05 4a 1c 0b 16 07 06 05 02
+1f 06 51 0c 0b 1f 1f 04 04 0f 00 06 63 04 0b 6a 23 00 00 00 52 0c 04 04 00
+63 32 00 00 00 32 00 47 6f 6e 67 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gong.....1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 07 06 05 02 1f 01 41 04 0b 1f 1f 04 04 0f 00 01 4a 1c 0b 16 07 06 05 02
+1f 01 51 0c 0b 1f 1f 04 04 0f 00 00 63 04 0b 6a 23 00 00 00 52 0c 04 04 00
+63 32 00 00 00 32 00 47 6f 6e 67 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gong.....2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+02 0c 06 03 0c 1f 05 3b 2b 0b 0c 09 0e 03 03 00 03 4d 1c 0b 18 09 07 03 03
+1f 07 50 0c 0b 18 09 05 06 0e 00 45 63 04 0b 72 19 00 00 40 56 0c 04 04 00
+63 32 00 00 00 32 00 47 6f 6e 67 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gong.....2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+02 0c 06 03 0c 1f 01 3b 2b 0b 0c 09 0e 03 03 00 01 4d 1c 0b 18 09 07 03 03
+1f 01 50 0c 0b 18 09 05 06 0e 00 40 63 04 0b 72 19 00 00 40 56 0c 04 04 00
+63 32 00 00 00 32 00 47 6f 6e 67 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gong.....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 1f 02 02 0f 1f 04 35 03 0b 07 1f 02 02 0f 00 04 46 02 0b 13 1f 02 02 0f
+1f 06 4a 03 0b 1f 1f 03 03 0e 00 45 63 00 0b 72 0b 00 0d 40 66 0c 04 04 00
+63 32 00 00 00 32 00 47 6f 6e 67 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gong.....3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 1f 02 02 0f 1f 00 35 03 0b 07 1f 02 02 0f 00 00 46 02 0b 13 1f 02 02 0f
+1f 00 4a 03 0b 1f 1f 03 03 0e 00 40 63 00 0b 72 0b 00 0d 40 56 0c 04 04 00
+63 32 00 00 00 32 00 47 6f 6e 67 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gong Ageng
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 04 01 01 0b 16 04 43 05 03 07 04 00 01 0d 00 04 47 05 16 10 06 04 02 07
+00 03 63 04 16 18 18 03 01 0e 00 03 5e 04 10 04 52 00 07 00 62 18 04 04 00
+28 32 00 00 00 32 00 47 6f 6e 67 20 41 67 65 6e 67 63 63 63 32 32 32 00 0a
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gongs *
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 04 0f 00 03 53 05 0b 1f 1f 00 03 0f 00 00 55 01 0b 1f 0d 00 02 0a
+00 01 45 0a 0b 16 09 0f 03 0e 00 02 5a 00 0b 6b 63 20 50 00 73 18 03 04 00
+28 63 00 00 00 29 00 47 6f 6e 67 73 20 20 20 20 2a 63 63 63 32 32 32 00 70
+00 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HiTine81Z
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 10
+1f 0d 09 0f 0c 27 02 3d 35 10 1f 12 02 04 0e 19 04 56 05 16 1f 0c 08 0d 0c
+00 43 60 04 0e 1f 08 04 07 0e 00 43 63 05 10 3c 14 08 02 1b 56 11 02 04 00
+63 32 00 00 00 32 00 48 69 54 69 6e 65 38 31 5a 20 63 63 63 32 32 32 00 7f
+00 01 00 18 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HumorBells
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 06 0a 04 0d 00 03 44 16 03 1f 06 06 04 0d 00 04 56 19 0b 13 06 06 05 0d
+00 06 62 04 0b 1f 06 06 04 0d 00 05 57 04 0a 7d 24 23 00 00 02 0c 02 04 00
+63 63 00 00 00 32 00 48 75 6d 6f 72 42 65 6c 6c 73 63 63 63 32 32 32 00 10
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HumorBells
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 06 0a 04 0d 00 01 44 16 03 1f 06 06 04 0d 00 00 56 19 0b 13 06 06 05 0d
+00 00 62 04 0b 1f 06 06 04 0d 00 00 57 04 0a 7d 24 23 00 00 02 0c 02 04 00
+63 63 00 00 00 32 00 48 75 6d 6f 72 42 65 6c 6c 73 63 63 63 32 32 32 00 10
+00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: KeyBell
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 0d 04 09 00 43 3f 2d 06 1f 0e 0d 04 09 00 43 3f 2d 00 1f 09 08 04 0d
+00 04 5f 05 0e 1f 09 08 04 0d 00 04 63 04 08 04 1f 0b 04 1a 5d 1d 02 04 00
+63 0a 50 00 00 32 00 4b 65 79 42 65 6c 6c 20 20 20 63 63 63 32 32 32 00 70
+00 60 00 01 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Large Ben
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 04 01 02 0d 00 04 54 0c 03 1b 0f 00 03 0e 58 06 63 1f 08 1d 0f 03 03 0e
+57 06 63 0c 03 1e 02 03 03 0e 00 05 63 05 0e 74 0c 00 06 00 63 00 02 04 00
+63 11 06 00 00 32 00 4c 61 72 67 65 20 42 65 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Large Ben
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 04 01 02 0d 00 01 54 0c 03 1b 0f 00 03 0e 58 03 63 1f 08 1d 0f 03 03 0e
+57 04 63 0c 03 1e 02 03 03 0e 00 00 63 05 0e 74 0c 00 06 00 63 00 02 04 00
+63 11 06 00 00 32 00 4c 61 72 67 65 20 42 65 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LastTwango
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 0a 07 08 03 00 03 58 16 03 13 1c 09 04 09 00 03 63 00 1b 16 0c 02 08 04
+00 04 63 00 1b 13 09 06 09 0e 00 05 63 0d 1b 12 23 00 00 00 02 18 04 04 00
+63 01 63 00 00 32 00 4c 61 73 74 54 77 61 6e 67 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: LastTwango
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 0a 07 08 03 00 00 58 16 03 13 1c 09 04 09 00 00 63 00 1b 16 0c 02 08 04
+00 00 63 00 1b 13 09 06 09 0e 00 00 63 0d 1b 12 23 00 00 00 02 18 04 04 00
+63 01 63 00 00 32 00 4c 61 73 74 54 77 61 6e 67 6f 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+--Bank 23
+
+** Name: LoTine81Z
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank A, voice 9
+1f 09 09 0f 0c 27 02 35 37 10 1f 04 03 04 0d 19 04 56 05 16 1f 0f 08 0d 0c
+00 43 60 04 0e 1f 0c 03 07 0e 00 43 63 05 10 3c 14 08 02 1b 56 05 02 04 00
+63 32 00 00 00 32 00 4c 6f 54 69 6e 65 38 31 5a 20 63 63 63 32 32 32 00 7f
+00 01 00 18 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MellowSqar
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 23
+1f 06 00 03 0f 00 02 4f 09 00 1f 0e 00 03 0f 00 02 55 0a 06 15 12 00 07 0f
+00 01 63 05 06 14 0e 00 07 0f 00 01 63 04 00 34 20 00 00 00 52 05 07 0c 00
+63 32 00 00 00 32 00 4d 65 6c 6c 6f 77 53 71 61 72 63 63 63 32 32 32 00 02
+00 00 00 01 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Moooo Bell
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 10 12 06 05 00 03 4a 05 13 1f 10 12 06 05 00 05 47 0d 03 1f 10 12 06 05
+00 05 63 08 03 1f 10 12 08 05 00 06 63 0a 03 2c 23 00 00 00 62 18 05 04 00
+63 32 00 00 00 32 00 4d 6f 6f 6f 6f 20 42 65 6c 6c 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Moooo Bell
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 10 12 06 05 00 00 4a 05 13 1f 10 12 06 05 00 00 47 0d 03 1f 10 12 06 05
+00 00 63 08 03 1f 10 12 08 05 00 00 63 0a 03 2c 23 00 00 00 62 18 05 04 00
+63 32 00 00 00 32 00 4d 6f 6f 6f 6f 20 42 65 6c 6c 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mr.Rogers
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 0f 00 06 01 06 04 50 18 0b 1f 0d 00 06 01 03 04 4f 1b 09 1f 0a 00 05 01
+00 02 63 04 0e 1f 0c 06 04 0b 00 03 63 04 00 04 19 00 00 00 52 23 02 04 00
+63 32 00 32 00 32 00 4d 72 2e 52 6f 67 65 72 73 20 63 63 63 32 32 32 00 00
+00 13 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OhMy!Bells
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 03 0f 00 40 49 10 08 1f 1f 00 03 0f 00 40 49 10 0e 11 1f 05 03 0f
+63 00 63 13 10 11 1f 05 03 0f 63 00 63 13 16 04 0c 00 00 0f 00 0c 02 04 00
+63 32 00 00 00 32 00 4f 68 4d 79 21 42 65 6c 6c 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntCowBel
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 10 12 06 05 00 02 4f 17 13 1f 10 12 06 05 00 02 46 08 03 1f 10 12 06 05
+00 05 49 04 03 1f 10 12 08 05 00 04 63 04 03 28 23 00 00 00 62 18 05 04 00
+63 32 00 00 00 32 00 4f 72 6e 74 43 6f 77 42 65 6c 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntCowBel
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 10 12 06 05 00 00 4f 17 13 1f 10 12 06 05 00 00 46 08 03 1f 10 12 06 05
+00 00 49 04 03 1f 10 12 08 05 00 00 63 04 03 28 23 00 00 00 62 18 05 04 00
+63 32 00 00 00 32 00 4f 72 6e 74 43 6f 77 42 65 6c 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PluckBell
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 07 04 0d 00 43 63 35 08 1f 16 0f 07 0e 00 04 63 00 0e 1f 1f 0f 07 0e
+00 05 63 10 0e 1f 16 0a 06 0e 00 03 63 00 08 04 43 00 04 29 6f 18 04 04 00
+63 00 00 00 00 32 00 50 6c 75 63 6b 42 65 6c 6c 20 63 63 63 32 32 32 26 60
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpaceBell1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 03 03 0f 0a 03 63 0d 03 1f 11 0c 04 0f 00 05 55 08 0b 1f 00 00 04 0f
+00 05 51 08 13 09 0d 09 06 0f 00 06 63 08 0b 46 1f 00 0e 00 02 00 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 42 65 6c 6c 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpaceBell1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 03 03 0f 0a 00 63 0d 03 1f 11 0c 04 0f 00 00 55 08 0b 1f 00 00 04 0f
+00 00 51 08 13 09 0d 09 06 0f 00 00 63 08 0b 46 1f 00 0e 00 02 00 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 42 65 6c 6c 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpaceBell2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 07 01 09 0a 43 55 04 03 19 1f 0a 06 0f 00 44 63 3d 0b 1f 1f 0a 06 0f
+00 45 63 38 13 18 0f 0a 06 0f 00 45 63 2a 0b 65 16 00 09 04 36 00 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 42 65 6c 6c 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpaceBell2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 07 01 09 0a 40 55 04 03 19 1f 0a 06 0f 00 40 63 3d 0b 1f 1f 0a 06 0f
+00 40 63 38 13 18 0f 0a 06 0f 00 40 63 2a 0b 65 16 00 09 04 36 00 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 42 65 6c 6c 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpaceBell2
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 0f 07 00 09 0a 40 55 04 03 19 1f 0a 06 0f 00 40 63 3d 0b 1f 1f 0a 06 0f
+00 40 63 38 13 18 0f 0a 06 0f 00 40 63 2a 0b 65 16 00 09 04 36 00 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 42 65 6c 6c 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SundayBell
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 04 01 01 0b 16 04 4f 22 01 15 0e 00 01 0d 00 06 53 05 13 1c 06 04 02 07
+00 06 63 16 11 18 18 03 01 0e 00 05 5e 04 12 24 07 00 04 00 62 0c 04 04 00
+28 32 00 00 00 32 00 53 75 6e 64 61 79 42 65 6c 6c 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SundayBell
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 04 01 01 0b 16 01 4f 22 01 15 0e 00 01 0d 00 01 53 05 13 1c 06 04 02 07
+00 01 63 16 11 18 18 03 01 0e 00 00 5e 04 12 24 07 00 04 00 62 0c 04 04 00
+28 32 00 00 00 32 00 53 75 6e 64 61 79 42 65 6c 6c 63 63 63 32 32 32 00 00
+00 00 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Perc. 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 12
+1f 11 06 01 08 46 01 4d 3f 03 1f 15 05 01 0c 1e 01 4c 3c 03 1f 0b 06 05 08
+00 01 63 0a 06 1f 0f 06 05 0a 00 01 63 04 00 3c 22 00 0a 00 52 11 02 04 00
+63 32 00 00 00 32 00 53 79 2e 50 65 72 63 2e 20 31 63 63 63 32 32 32 00 30
+00 20 00 00 00 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Perc. 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank A, voice 13
+1f 08 00 01 00 00 00 32 13 05 1f 07 00 01 00 00 00 39 28 01 1a 08 00 04 00
+00 02 5c 00 05 1b 09 00 05 00 00 02 5f 08 01 3c 20 00 12 00 42 18 02 04 00
+63 32 00 00 00 32 00 53 79 2e 50 65 72 63 2e 20 32 63 63 63 32 32 32 00 10
+00 10 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Perc. 3
+** Source: Yamaha DX11 factory preset, bank A, voice 14
+1f 14 00 04 00 1e 00 4d 08 00 1f 1a 08 01 04 00 00 3c 04 06 1a 16 0c 09 0c
+00 00 5b 04 10 16 15 07 07 0e 00 40 5e 04 16 3c 1f 00 00 00 52 18 02 04 00
+63 32 00 32 00 32 00 53 79 2e 50 65 72 63 2e 20 33 63 63 63 30 32 32 00 00
+00 60 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sy.Perc. 4
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank A, voice 15
+1f 05 00 05 04 1e 04 51 20 0e 1e 0a 01 05 02 1e 04 53 1f 08 1e 1d 0a 05 0f
+00 02 5c 05 0e 1f 1f 0a 05 0f 00 03 5c 04 08 04 1a 00 00 00 52 1d 02 04 00
+63 32 00 32 00 32 00 53 79 2e 50 65 72 63 2e 20 34 63 63 63 32 32 32 00 30
+00 46 00 01 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthBell
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 06 04 0e 00 05 54 0d 06 1f 06 06 04 0e 00 05 63 08 04 1f 06 06 04 0e
+00 05 5b 08 02 1f 06 06 04 0e 00 05 63 00 03 05 23 00 00 00 03 00 04 04 00
+63 01 63 00 00 32 00 53 79 6e 74 68 42 65 6c 6c 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthBell
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 06 04 0e 00 02 54 0d 06 1f 06 06 04 0e 00 00 63 08 04 1f 06 06 04 0e
+00 00 5b 08 02 1f 06 06 04 0e 00 00 63 00 03 05 23 00 00 00 03 00 04 04 00
+63 01 63 00 00 32 00 53 79 6e 74 68 42 65 6c 6c 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tube Bell
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 23
+1f 0e 05 02 0a 27 02 50 16 06 1f 0e 05 02 0e 1a 02 43 16 00 1a 1f 07 04 0f
+00 06 60 08 0e 1a 1f 07 04 0f 00 01 5e 08 08 14 1a 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 54 75 62 65 20 42 65 6c 6c 20 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tube Bell
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 05 02 0d 27 02 50 16 06 1f 0e 05 02 0e 1a 02 43 16 00 1a 1f 07 04 0f
+00 06 60 08 0e 1a 1f 07 04 0f 00 01 5e 08 08 14 1a 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 54 75 62 65 20 42 65 6c 6c 20 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tube Bells
+** Controls: MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 26
+1a 04 01 01 0b 16 00 47 05 03 15 0e 00 01 0d 00 00 4c 05 16 1c 06 04 02 07
+00 00 63 04 16 18 18 03 01 0e 00 00 5e 04 10 24 07 00 04 00 62 24 04 04 00
+63 32 00 00 00 32 00 54 75 62 65 20 42 65 6c 6c 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Block
+
+
+** Name: "Air"imba
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 20
+1f 03 1a 0f 0f 00 00 3e 3d 05 1f 00 1f 03 00 00 01 40 05 00 1f 13 0b 03 0b
+00 01 51 28 06 1f 11 0a 06 0f 00 00 5c 2c 06 3a 63 00 63 00 63 0e 07 04 00
+63 32 00 00 00 32 00 22 41 69 72 22 69 6d 62 61 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: "Air"imba
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 1a 0f 0f 00 00 3e 3d 05 1f 00 1f 03 00 00 01 40 05 00 1f 13 0b 03 0b
+00 01 51 28 06 1f 11 0d 06 0f 00 00 5c 2c 06 3a 63 00 63 00 63 0e 07 04 00
+63 32 00 00 00 32 00 22 41 69 72 22 69 6d 62 61 20 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Balafon *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 17 18 0c 03 22 07 4e 18 03 1d 12 1a 08 04 23 04 4f 0e 00 1c 08 09 04 09
+24 02 63 03 11 1f 0b 18 06 00 14 02 63 04 10 04 23 00 00 00 32 11 02 04 00
+28 00 00 00 00 32 00 42 61 6c 61 66 6f 6e 20 20 2a 63 63 63 32 32 32 0c 08
+00 09 00 06 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboBlock
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 22
+17 19 15 08 0c 02 00 57 07 0c 1f 17 15 0a 0b 02 00 55 0c 02 1a 12 16 0a 0b
+01 00 5c 04 0a 1f 10 10 09 0a 00 00 5a 04 04 34 52 00 07 00 62 18 04 04 00
+28 32 00 00 00 32 00 42 61 6d 62 6f 42 6c 6f 63 6b 63 63 63 32 32 32 00 01
+00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboBlock
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+17 19 15 08 0c 02 00 57 07 0c 1f 17 15 0a 0b 02 00 55 0c 02 1a 12 16 0a 0b
+01 00 5c 04 0a 1f 10 10 09 0d 00 00 5a 04 04 34 52 00 07 00 62 18 04 04 00
+28 32 00 00 00 32 00 42 61 6d 62 6f 42 6c 6f 63 6b 63 63 63 32 32 32 00 01
+00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboChiff
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 12 0f 0f 0c 52 03 51 16 0a 12 1f 12 0f 0f 27 02 5e 22 0b 12 0f 0c 0f 0c
+11 07 5b 08 13 13 1f 09 0f 0f 00 06 63 04 03 44 23 00 02 00 12 18 01 04 00
+63 00 63 00 00 32 00 42 61 6d 62 6f 43 68 69 66 66 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboChiff
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 12 0f 0f 0c 52 00 51 16 0a 12 1f 12 0f 0f 27 00 5e 22 0b 12 0f 0c 0f 0c
+11 00 5b 08 13 13 1f 09 0f 0f 00 00 63 04 03 44 23 00 02 00 12 18 01 04 00
+63 00 63 00 00 32 00 42 61 6d 62 6f 43 68 69 66 66 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboMar.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 07 0f 00 02 02 4c 19 1c 12 12 06 05 09 00 02 4d 22 1a 1f 0a 06 06 0c
+00 04 63 13 1c 12 0a 07 06 00 00 05 63 0a 1b 5c 2c 63 04 00 22 00 02 04 00
+63 32 00 32 00 32 00 42 61 6d 62 6f 4d 61 72 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboMar.1
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 07 0f 00 02 00 4c 19 1c 12 12 06 05 09 00 00 4d 22 1a 1f 0a 06 06 0c
+00 00 63 13 1c 12 0a 07 06 00 00 00 63 0a 1b 5c 2c 63 04 00 22 00 02 04 00
+63 32 00 32 00 32 00 42 61 6d 62 6f 4d 61 72 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboMar.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 0d 0a 0a 0c 02 04 4d 10 1c 12 12 06 05 09 00 05 46 16 12 1b 0a 0a 06 0c
+00 05 63 04 1c 12 0a 07 06 00 00 05 63 04 1b 5c 15 00 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 42 61 6d 62 6f 4d 61 72 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboMar.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0d 0a 0a 0c 02 00 4d 10 1c 12 12 06 05 09 00 00 46 16 12 1b 0a 0a 06 0c
+00 00 63 04 1c 12 0a 07 06 00 00 00 63 04 1b 5c 15 00 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 42 61 6d 62 6f 4d 61 72 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboMar.3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 0d 0a 0a 0c 02 01 48 19 1c 12 12 06 05 09 00 04 46 16 1a 1b 0a 0a 06 0c
+00 05 63 04 1c 12 0a 07 06 00 00 05 63 04 1b 7c 15 00 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 42 61 6d 62 6f 4d 61 72 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BamboMar.3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0d 0a 0a 0c 02 00 48 19 1c 12 12 06 05 09 00 00 46 16 1a 1b 0a 0a 06 0c
+00 00 63 04 1c 12 0a 07 06 00 00 00 63 04 1b 7c 15 00 00 00 02 00 02 04 00
+63 32 00 32 00 32 00 42 61 6d 62 6f 4d 61 72 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bamboo *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 06 1f 03 00 46 02 3c 00 10 1c 12 0f 05 04 00 00 5b 01 13 17 1b 0f 05 04
+00 03 50 04 13 1a 0a 1f 05 00 00 02 63 00 0d 2a 17 0c 31 00 32 0c 02 04 00
+28 63 00 00 00 32 00 42 61 6d 62 6f 6f 20 20 20 2a 63 63 63 32 32 32 00 10
+00 14 00 71 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Castanet
+** Source: Yamaha DX11 factory preset, bank D, voice 13
+19 16 1f 03 00 00 00 52 20 06 18 16 1f 03 00 00 00 52 27 00 1f 15 00 0c 00
+00 00 63 00 00 1f 15 15 0c 00 00 00 63 00 06 1c 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 43 61 73 74 61 6e 65 74 20 20 63 63 63 32 32 32 0c 18
+0c 00 08 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Claves *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 00 00 04 03 1f 1d 0d 07 08 00 01 3d 00 03 1f 16 0f 0b 07
+00 01 46 0d 03 1f 1c 11 08 0f 00 01 63 04 03 03 23 00 00 00 32 24 02 04 00
+28 63 00 00 00 32 00 43 6c 61 76 65 73 20 20 20 2a 63 63 63 32 32 32 00 00
+0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MarimbLead
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 18 10 01 0c 63 44 62 22 0b 1f 18 10 01 0c 63 45 59 04 0b 1f 06 06 07 0c
+0e 46 5e 04 0b 1f 06 06 07 0c 0e 45 5e 04 0b 7c 32 23 00 52 40 18 04 04 00
+63 01 63 00 00 32 00 4d 61 72 69 6d 62 4c 65 61 64 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MarimbLead
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 10 01 0c 63 42 62 22 0b 1f 18 10 01 0c 63 41 59 04 0b 1f 06 06 07 0c
+0e 40 5e 04 0b 1f 06 06 07 0c 0e 40 5e 04 0b 7c 32 23 00 52 40 18 04 04 00
+63 01 63 00 00 32 00 4d 61 72 69 6d 62 4c 65 61 64 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 12 09 0f 00 03 47 10 06 1f 00 15 05 0f 00 00 3f 08 00 1f 0f 00 05 00
+00 01 60 04 08 1f 0d 00 06 00 00 05 63 04 0e 3c 23 00 00 00 62 18 04 04 00
+00 32 00 00 00 32 00 4d 61 72 69 6d 62 61 20 20 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 19
+1f 16 0e 07 05 15 06 52 0f 0b 1a 18 0c 07 05 0c 02 52 0a 0b 17 1f 0a 07 0f
+00 02 62 08 0b 16 1f 0a 05 0f 00 01 62 00 0b 04 23 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 4d 61 72 69 6d 62 61 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 16 0e 07 05 15 06 52 0f 0b 1a 18 0c 07 05 0c 02 52 0a 0b 17 1f 0d 07 0f
+00 02 62 08 0b 16 1f 0a 05 0f 00 01 62 00 0b 04 23 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 4d 61 72 69 6d 62 61 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 0e 07 0f 48 04 49 17 1b 1f 0f 10 06 08 63 05 4f 1a 13 1f 1f 12 07 0f
+3b 05 4b 34 1b 1f 1f 0a 06 0f 00 04 63 0d 13 02 1e 09 00 00 52 00 04 04 00
+63 28 00 00 00 32 00 4d 61 72 69 6d 62 61 20 20 20 63 63 63 32 32 32 00 0b
+00 03 08 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 00 06 00 00 05 63 28 03 1f 12 00 06 00 00 05 45 13 03 1f 0d 00 06 00
+00 05 44 16 03 1f 0c 00 06 00 00 06 63 04 03 02 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 4d 61 72 69 6d 62 61 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 00 06 00 00 03 63 28 03 1f 12 00 06 00 00 03 45 13 03 1f 0d 00 06 00
+00 02 44 16 03 1f 0c 00 06 00 00 00 63 04 03 02 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 4d 61 72 69 6d 62 61 2e 2e 31 63 63 63 32 32 32 00 00
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 19 00 07 00 00 05 5b 1f 08 1f 11 00 07 00 00 04 50 13 0e 1f 0a 00 07 00
+11 06 63 04 0e 1f 0a 00 07 00 11 05 63 04 00 2c 15 00 00 00 52 0c 02 05 00
+63 32 00 32 00 32 00 4d 61 72 69 6d 62 61 2e 2e 32 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 19 00 07 00 00 03 5b 1f 08 1f 11 00 07 00 00 02 50 13 0e 1f 0a 00 07 00
+11 00 63 04 0e 1f 0a 00 07 00 11 00 63 04 00 2c 15 00 00 00 52 0c 02 05 00
+63 32 00 32 00 32 00 4d 61 72 69 6d 62 61 2e 2e 32 63 63 63 32 32 32 00 30
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 19 00 07 00 00 04 4c 19 08 1f 11 00 07 00 00 03 49 16 0e 1f 0a 00 07 00
+11 06 63 04 0e 1f 0a 00 07 00 11 06 62 04 00 2c 15 00 00 00 52 00 02 05 00
+63 32 00 32 00 32 00 4d 61 72 69 6d 62 61 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 19 00 07 00 00 00 4c 19 08 1f 11 00 07 00 00 00 49 16 0e 1f 0a 00 07 00
+11 00 63 04 0e 1f 0a 00 07 00 11 00 62 04 00 2c 15 00 00 00 52 00 02 05 00
+63 32 00 32 00 32 00 4d 61 72 69 6d 62 61 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 0d 05 03 00 00 04 58 0a 18 1f 11 00 07 00 00 04 50 10 0e 1f 0a 00 07 00
+11 05 63 04 0e 1f 0a 00 07 00 11 06 62 04 00 2c 15 00 00 00 52 0c 02 05 00
+63 32 00 32 00 32 00 4d 61 72 69 6d 62 61 2e 2e 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0d 05 03 00 00 02 58 0a 18 1f 11 00 07 00 00 01 50 10 0e 1f 0a 00 07 00
+11 00 63 04 0e 1f 0a 00 07 00 11 00 62 04 00 2c 15 00 00 00 52 0c 02 05 00
+63 32 00 32 00 32 00 4d 61 72 69 6d 62 61 2e 2e 34 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 00 06 00 00 05 5d 28 03 1f 12 00 06 00 00 05 4d 00 03 1f 0d 00 06 00
+00 07 46 10 03 1f 0c 00 06 00 00 07 61 00 03 02 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 4d 61 72 69 6d 62 61 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 00 06 00 00 02 5d 28 03 1f 12 00 06 00 00 02 4d 00 03 1f 0d 00 06 00
+00 04 46 10 03 1f 0c 00 06 00 00 01 61 00 03 02 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 4d 61 72 69 6d 62 61 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 02 06 04 00 05 62 19 03 1f 12 00 06 00 00 05 4b 04 03 1f 0d 00 06 00
+00 06 44 16 03 1f 0c 00 06 00 00 06 63 04 03 02 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 4d 61 72 69 6d 62 61 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..6
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 02 06 04 00 02 62 19 03 1f 12 00 06 00 00 01 4b 04 03 1f 0d 00 06 00
+00 01 44 16 03 1f 0c 00 06 00 00 00 63 04 03 02 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 4d 61 72 69 6d 62 61 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 02 06 03 00 05 63 19 03 1f 12 00 06 00 00 03 4f 0a 03 1f 0d 00 06 00
+00 06 42 04 03 1f 0c 00 06 00 00 05 63 08 03 03 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 4d 61 72 69 6d 62 61 2e 2e 37 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Marimba..7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 02 06 03 00 02 63 19 03 1f 12 00 06 00 00 01 4f 0a 03 1f 0d 00 06 00
+00 01 42 04 03 1f 0c 00 06 00 00 00 63 08 03 03 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 4d 61 72 69 6d 62 61 2e 2e 37 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Block
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 0c 0f 0c 00 41 51 0a 1b 1f 10 09 07 0d 2e 42 40 04 13 1f 10 09 04 0d
+00 44 63 04 1b 1f 10 12 05 0d 01 46 62 04 13 7e 1e 28 24 0f 27 18 07 04 00
+63 32 00 00 00 32 00 4f 72 6e 74 20 42 6c 6f 63 6b 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Block
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 0c 0f 0c 00 40 51 0a 1b 1f 10 09 07 0d 2e 40 40 04 13 1f 10 09 04 0d
+00 40 63 04 1b 1f 10 12 05 0d 01 40 62 04 13 7e 1e 28 24 0f 27 18 07 04 00
+63 32 00 00 00 32 00 4f 72 6e 74 20 42 6c 6f 63 6b 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynGameran
+** Source: Yamaha DX11 factory preset, bank D, voice 17
+0a 14 00 01 0b 00 40 2d 11 03 14 03 00 0f 0e 2e 00 41 27 0c 1f 1b 11 05 0a
+00 40 3f 0a 0a 1f 0f 00 0b 00 01 00 5a 10 0b 38 3a 00 63 50 5f 0b 05 04 00
+63 00 00 00 00 32 00 53 79 6e 47 61 6d 65 72 61 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynGameran
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 14 00 01 0b 00 40 2d 11 03 14 03 00 0f 0e 2e 00 41 27 0c 1f 1b 11 05 0a
+00 40 3f 0d 0a 1f 0f 00 0b 00 01 00 5a 10 0b 38 3a 00 63 50 5f 0b 05 04 00
+63 00 00 00 00 32 00 53 79 6e 47 61 6d 65 72 61 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthMarib
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 18 10 01 0c 63 43 5d 38 0b 0a 01 07 07 0f 00 45 52 00 03 1f 09 0f 07 0c
+0e 45 63 04 0b 0f 02 07 07 0e 00 46 63 04 03 7c 32 23 00 52 40 18 04 04 00
+63 01 63 00 00 32 00 53 79 6e 74 68 4d 61 72 69 62 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthMarib
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 10 01 0c 63 41 5d 38 0b 0a 01 07 07 0f 00 41 52 00 03 1f 09 0f 07 0c
+0e 40 63 04 0b 0f 02 07 07 0e 00 41 63 04 03 7c 32 23 00 52 40 18 04 04 00
+63 01 63 00 00 32 00 53 79 6e 74 68 4d 61 72 69 62 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tablas *
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 1c 17 09 0a 00 03 63 0d 0b 19 1f 1b 09 06 00 00 63 00 0b 1f 05 00 09 0f
+00 00 63 3c 0b 13 10 11 06 0a 00 03 63 00 0b 02 18 00 26 00 32 18 0c 04 00
+28 63 00 00 00 13 00 54 61 62 6c 61 73 20 20 20 2a 63 63 63 32 32 32 00 06
+00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wood Block
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 12
+1f 18 01 08 00 00 02 55 07 0b 1f 18 12 0a 0c 00 02 55 0a 0b 1f 15 13 0a 0a
+00 01 63 04 0b 1f 12 13 09 00 00 01 63 04 0b 2c 52 00 07 00 62 24 04 04 00
+28 32 00 00 00 32 00 57 6f 6f 64 20 42 6c 6f 63 6b 63 63 63 32 32 32 00 11
+00 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wood Block
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 01 08 00 00 02 55 07 0b 1f 18 12 0a 0c 00 02 55 0a 0b 1f 15 13 0a 0d
+00 01 63 04 0b 1f 12 13 09 00 00 01 63 04 0b 2c 52 00 07 00 62 24 04 04 00
+28 32 00 00 00 32 00 57 6f 6f 64 20 42 6c 6f 63 6b 63 63 63 32 32 32 00 11
+00 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WoodBlock*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 17 00 08 00 00 00 4b 0b 0b 1f 1f 16 07 0f 20 03 49 0f 0b 1a 0f 00 07 00
+00 02 63 03 0b 1f 1f 0c 06 0f 00 01 63 05 13 44 0e 00 63 00 42 11 02 04 00
+28 63 00 00 00 32 00 57 6f 6f 64 42 6c 6f 63 6b 2a 63 63 63 32 32 32 00 0a
+00 49 00 06 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WoodBlock1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 0f 0c 0a 00 00 4d 0c 13 1f 10 12 09 0d 00 00 45 04 0b 1f 16 10 08 0c
+00 05 63 04 13 1f 10 12 09 0d 00 05 63 04 0b 44 30 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 57 6f 6f 64 42 6c 6f 63 6b 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WoodBlock1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 0f 0c 0a 00 00 4d 0c 13 1f 10 12 09 0d 00 00 45 04 0b 1f 16 10 08 0c
+00 00 63 04 13 1f 10 12 09 0d 00 00 63 04 0b 44 30 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 57 6f 6f 64 42 6c 6f 63 6b 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WoodBlock2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 0f 0c 0a 00 01 4d 0c 13 1f 10 12 09 0d 00 02 37 04 0b 1f 16 10 08 0c
+00 04 42 04 13 1f 10 12 09 0d 00 05 63 04 0b 42 30 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 57 6f 6f 64 42 6c 6f 63 6b 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WoodBlock2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 0f 0c 0a 00 00 4d 0c 13 1f 10 12 09 0d 00 00 37 04 0b 1f 16 10 08 0c
+00 00 42 04 13 1f 10 12 09 0d 00 00 63 04 0b 42 30 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 57 6f 6f 64 42 6c 6f 63 6b 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WoodBlock3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 0f 0c 0a 00 00 44 0c 13 1f 10 12 09 0d 00 01 4b 05 0b 1f 16 10 08 0c
+00 05 48 07 13 1f 10 12 09 0d 00 05 63 04 0b 42 30 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 57 6f 6f 64 42 6c 6f 63 6b 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WoodBlock3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 0f 0c 0a 00 00 44 0c 13 1f 10 12 09 0d 00 00 4b 05 0b 1f 16 10 08 0c
+00 00 48 07 13 1f 10 12 09 0d 00 00 63 04 0b 42 30 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 57 6f 6f 64 42 6c 6f 63 6b 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 24
+
+* SUBCATEGORY Chime
+
+
+** Name: BriteCelst
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 31
+1f 0c 00 06 01 0a 04 50 20 0e 1f 0c 00 06 01 0a 04 50 1f 08 1f 0b 09 05 0e
+00 02 63 05 0e 1f 0b 09 05 0e 00 03 63 04 08 04 1a 00 00 00 52 1d 02 04 00
+63 32 00 32 00 32 00 42 72 69 74 65 43 65 6c 73 74 63 63 63 32 32 32 00 20
+00 26 00 01 00 08 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Celeste
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank A, voice 30
+19 1c 00 06 01 00 04 52 07 08 1f 10 00 06 01 00 04 46 16 0e 1f 0a 00 06 01
+00 02 63 04 0e 1f 0d 00 04 01 00 03 63 04 00 04 19 00 00 00 52 24 02 04 00
+63 32 00 32 00 32 00 43 65 6c 65 73 74 65 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Celeste..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 1c 00 06 01 00 03 51 2e 10 1f 10 00 06 01 00 05 3c 19 0e 1f 0a 00 06 01
+00 05 63 04 0e 1f 0d 00 04 01 00 05 63 04 00 04 19 00 00 00 52 24 00 04 00
+63 32 00 32 00 32 00 43 65 6c 65 73 74 65 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Celeste..1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 1c 00 06 01 00 01 51 2e 10 1f 10 00 06 01 00 01 3c 19 0e 1f 0a 00 06 01
+00 01 63 04 0e 1f 0d 00 04 01 00 01 63 04 00 04 19 00 00 00 52 24 00 04 00
+63 32 00 32 00 32 00 43 65 6c 65 73 74 65 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Celeste..2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 15 12 06 00 00 01 3b 1f 10 1f 10 00 06 01 00 05 3b 08 0e 1f 0a 00 06 01
+00 04 63 0d 0e 1f 0d 00 04 01 00 06 63 04 00 04 19 00 00 00 52 24 00 04 00
+63 32 00 32 00 32 00 43 65 6c 65 73 74 65 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Celeste..2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 15 12 06 00 00 01 3b 1f 10 1f 10 00 06 01 00 02 3b 08 0e 1f 0a 00 06 01
+00 01 63 0d 0e 1f 0d 00 04 01 00 01 63 04 00 04 19 00 00 00 52 24 00 04 00
+63 32 00 32 00 32 00 43 65 6c 65 73 74 65 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chimes *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 07 02 0d 12 02 5c 10 09 1f 1f 09 02 0d 11 01 56 11 09 19 1f 07 03 0d
+00 42 53 08 0c 17 1f 07 03 0d 00 40 63 08 0d 6c 29 00 00 00 0b 24 02 04 00
+28 00 36 00 00 32 00 43 68 69 6d 65 73 20 20 20 2a 63 63 63 32 32 32 00 00
+00 30 00 08 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chiming
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 02 01 00 00 43 3d 2d 03 1f 05 07 02 0d 00 43 4d 16 06 1f 18 00 02 00
+00 07 4c 3d 03 1f 08 0a 05 0d 00 04 63 04 0b 02 19 02 01 16 5a 11 02 04 00
+63 28 00 00 00 32 00 43 68 69 6d 69 6e 67 20 20 20 63 63 63 32 32 32 00 60
+10 07 00 40 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Glocken
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank B, voice 22
+1f 1d 00 06 00 00 07 63 0a 03 1f 0a 00 06 00 0a 07 63 1f 03 1f 0c 00 05 00
+0f 07 63 08 03 1f 0e 01 06 00 00 07 5b 2d 03 3d 21 00 0a 00 32 18 02 04 00
+28 32 00 00 00 32 00 47 6c 6f 63 6b 65 6e 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Glocken
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1d 00 06 00 00 07 63 0a 03 1f 0d 00 06 00 0a 07 63 1f 03 1f 0c 00 05 00
+0f 07 63 08 03 1f 0e 01 06 00 00 07 5b 2d 03 3d 21 00 0d 00 32 18 02 04 00
+28 32 00 00 00 32 00 47 6c 6f 63 6b 65 6e 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Glocken..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 04 05 0a 23 02 4d 2a 06 1f 0e 05 02 09 00 04 3d 04 00 18 11 08 05 0f
+0a 05 63 04 0e 1f 11 08 05 0f 05 43 63 0d 00 26 23 00 00 00 3e 18 05 04 00
+63 63 28 00 00 32 00 47 6c 6f 63 6b 65 6e 2e 2e 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Glocken..1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 04 05 0a 23 02 4d 2a 06 1f 0e 05 02 09 00 01 3d 04 00 18 11 08 05 0f
+0a 01 63 04 0e 1f 11 08 05 0f 05 41 63 0d 00 26 23 00 00 00 3e 18 05 04 00
+63 63 28 00 00 32 00 47 6c 6f 63 6b 65 6e 2e 2e 31 63 63 63 32 32 32 00 00
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Glocken..2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 04 05 0a 23 02 4c 2d 0e 1f 0e 05 02 09 00 06 39 19 00 1e 12 0a 05 0c
+0a 05 63 04 0e 1f 11 08 05 0f 05 46 63 04 00 24 23 00 00 00 3e 24 05 04 00
+63 63 28 00 00 32 00 47 6c 6f 63 6b 65 6e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Glocken..2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 04 05 0a 23 02 4c 2d 0e 1f 0e 05 02 09 00 01 39 19 00 1e 12 0a 05 0c
+0a 01 63 04 0e 1f 11 08 05 0f 05 41 63 04 00 24 23 00 00 00 3e 24 05 04 00
+63 63 28 00 00 32 00 47 6c 6f 63 6b 65 6e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GoodVibes*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 0f 07 0d 00 47 3a 2a 16 19 1a 0c 07 0d 00 44 41 0a 10 14 1a 07 07 0d
+00 41 63 04 08 14 1a 07 07 0d 00 41 63 04 0e 04 1a 00 08 00 0e 18 02 04 00
+28 17 3b 00 00 32 00 47 6f 6f 64 56 69 62 65 73 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GreatVibes
+** Controls: KV, MW (LFO amplitude)
+** Source: Yamaha TX81Z factory preset, bank C, voice 28
+1f 14 07 07 0d 00 43 63 04 06 1f 10 15 06 00 00 43 63 2a 0e 1f 14 0b 07 0d
+00 43 63 0d 06 1f 14 07 07 0d 00 43 63 04 00 07 16 00 00 2a 66 0c 02 04 00
+63 08 32 00 00 32 00 47 72 65 61 74 56 69 62 65 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mod Chime
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 08 0f 00 00 45 5b 3f 03 0f 08 0d 06 09 00 44 63 0d 01 1f 1f 0b 06 0f
+00 46 63 3e 03 0e 08 0d 06 09 00 45 63 08 05 5e 19 13 07 5c 36 00 0c 04 00
+63 00 00 00 00 32 00 4d 6f 64 20 43 68 69 6d 65 20 63 63 63 32 32 32 00 20
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mod Chime
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0f 08 0f 00 00 42 5b 3f 03 0f 08 0d 06 09 00 42 63 0d 01 1f 1f 0b 06 0f
+00 42 63 3e 03 0e 08 0d 06 09 00 40 63 08 05 5e 19 13 07 5c 36 00 0c 04 00
+63 00 00 00 00 32 00 4d 6f 64 20 43 68 69 6d 65 20 63 63 63 32 32 32 00 20
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthChime
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+00 1f 10 04 0d 0a 44 63 0d 0d 0d 0a 1f 03 01 0a 45 4c 08 09 1f 09 08 04 02
+0a 45 60 1f 0c 10 05 09 06 03 0a 45 63 08 0c 4c 23 00 03 0a 4a 0c 04 04 00
+63 32 00 00 00 32 00 53 79 6e 74 68 43 68 69 6d 65 63 63 63 32 32 32 00 20
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthChime
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+00 1f 10 04 0d 0a 41 63 0d 0d 0d 0a 1f 03 01 0a 42 4c 08 09 1f 09 08 04 02
+0a 40 60 1f 0c 10 05 09 06 03 0a 40 63 08 0c 4c 23 00 03 0a 4a 0c 04 04 00
+63 32 00 00 00 32 00 53 79 6e 74 68 43 68 69 6d 65 63 63 63 32 32 32 00 20
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Triangle.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 0c 04 0e 00 05 39 22 13 1f 1f 0c 04 0e 00 03 40 08 03 1f 1f 0c 04 0f
+00 05 63 2f 03 1f 1f 0c 04 0f 00 05 63 08 03 45 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 54 72 69 61 6e 67 6c 65 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Triangle.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 0c 04 0e 00 00 39 22 13 1f 1f 0c 04 0e 00 00 40 08 03 1f 1f 0c 04 0f
+00 00 63 2f 03 1f 1f 0c 04 0f 00 00 63 08 03 45 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 54 72 69 61 6e 67 6c 65 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Triangle.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 0c 04 0e 00 03 30 22 13 1f 0d 1f 04 00 00 04 61 13 03 1f 1f 0c 04 0f
+00 06 63 2a 03 1f 1f 0c 04 0f 00 06 63 08 03 46 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 54 72 69 61 6e 67 6c 65 2e 32 63 63 63 32 32 32 0a 00
+08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Triangle.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 0c 04 0e 00 00 30 22 13 1f 0d 1f 04 00 00 00 61 13 03 1f 1f 0c 04 0f
+00 00 63 2a 03 1f 1f 0c 04 0f 00 00 63 08 03 46 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 54 72 69 61 6e 67 6c 65 2e 32 63 63 63 32 32 32 0a 00
+08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vib Lead.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 03 07 09 0e 00 04 51 08 1b 16 0a 07 09 0f 00 04 63 04 1b 17 0a 07 09 0f
+00 07 63 08 1b 18 16 07 09 0f 00 05 63 04 1b 2d 27 00 00 00 42 18 04 04 00
+28 32 00 00 00 32 00 56 69 62 20 4c 65 61 64 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vib Lead.1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 03 07 09 0e 00 02 51 08 1b 16 0a 07 09 0f 00 01 63 04 1b 17 0a 07 09 0f
+00 00 63 08 1b 18 16 07 09 0f 00 00 63 04 1b 2d 27 00 00 00 42 18 04 04 00
+28 32 00 00 00 32 00 56 69 62 20 4c 65 61 64 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vib Lead.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 03 07 09 0e 00 04 51 08 0b 1f 0f 0a 0c 0b 00 05 3e 2a 13 17 0a 07 09 0f
+00 05 63 04 1b 1f 07 07 0a 0e 00 06 63 04 0b 2c 27 00 00 00 42 18 04 04 00
+28 32 00 00 00 32 00 56 69 62 20 4c 65 61 64 2e 32 63 63 63 32 32 32 00 20
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vib Lead.2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 03 07 09 0e 00 01 51 08 0b 1f 0f 0a 0c 0b 00 01 3e 2a 13 17 0a 07 09 0f
+00 00 63 04 1b 1f 07 07 0a 0e 00 00 63 04 0b 2c 27 00 00 00 42 18 04 04 00
+28 32 00 00 00 32 00 56 69 62 20 4c 65 61 64 2e 32 63 63 63 32 32 32 00 20
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.
+** Controls: KV, MW (LFO amplitude)
+** Source: Yamaha DX11 factory preset, bank B, voice 21
+1f 0f 0e 0a 0a 00 02 36 24 00 1f 0e 08 06 09 00 02 36 10 06 1f 11 05 04 0f
+00 02 61 04 16 1f 11 05 04 0f 00 42 61 04 10 04 1f 00 00 1f 3e 18 02 04 00
+63 32 1e 00 00 32 00 56 69 62 65 2e 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 0d 0a 0a 0d 00 03 3b 19 12 1b 16 00 0c 07 00 05 57 16 13 1f 0a 0a 0d 0c
+00 02 60 04 0b 1f 09 07 06 0c 00 05 5e 04 0b 7c 15 00 00 00 22 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0d 0a 0a 0d 00 01 3b 19 12 1b 16 00 0c 07 00 01 57 16 13 1f 0a 0a 0d 0c
+00 00 60 04 0b 1f 09 07 06 0c 00 00 5e 04 0b 7c 15 00 00 00 22 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....2
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 14 07 07 0d 00 44 63 08 06 1f 10 15 06 00 00 45 63 24 0e 1f 14 0b 07 0d
+00 44 63 0d 06 1f 14 07 07 0d 00 47 63 04 00 07 16 00 00 2a 66 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....2
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 14 07 07 0d 00 40 63 08 06 1f 10 15 06 00 00 40 63 24 0e 1f 14 0b 07 0d
+00 40 63 0d 06 1f 14 07 07 0d 00 40 63 04 00 07 16 00 00 2a 66 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....3
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 14 07 07 0d 00 42 63 0d 16 1f 10 15 06 00 00 44 63 16 0e 1f 14 0b 07 0d
+00 45 63 04 06 1f 14 07 07 0d 00 47 63 04 00 07 16 00 00 2a 66 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....3
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 14 07 07 0d 00 40 63 0d 16 1f 10 15 06 00 00 40 63 16 0e 1f 14 0b 07 0d
+00 40 63 04 06 1f 14 07 07 0d 00 40 63 04 00 07 16 00 00 2a 66 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 06 1f 09 04 00 43 3a 24 16 1b 09 03 06 0d 00 45 63 0d 0e 1b 09 03 06 0d
+00 44 63 04 0e 1f 15 06 08 0c 00 47 63 04 00 6d 21 00 00 63 02 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 06 1f 09 04 00 41 3a 24 16 1b 09 03 06 0d 00 42 63 0d 0e 1b 09 03 06 0d
+00 41 63 04 0e 1f 15 06 08 0c 00 40 63 04 00 6d 21 00 00 63 02 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 06 1f 09 04 00 43 39 10 1e 1b 09 03 06 0d 00 44 5b 16 1e 1b 09 03 06 0d
+00 44 63 04 1e 1f 15 06 08 0c 00 46 63 04 08 6d 21 00 00 63 02 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....5
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 06 1f 09 04 00 41 39 10 1e 1b 09 03 06 0d 00 40 5b 16 1e 1b 09 03 06 0d
+00 40 63 04 1e 1f 15 06 08 0c 00 40 63 04 08 6d 21 00 00 63 02 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....6
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 14 07 07 0d 00 44 63 0d 06 1f 10 15 06 00 00 45 63 24 0e 1f 14 0b 07 0d
+00 45 63 0d 06 1f 14 07 07 0d 00 47 63 08 00 07 16 00 00 2a 66 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 36 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibe.....6
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 14 07 07 0d 00 41 63 0d 06 1f 10 15 06 00 00 41 63 24 0e 1f 14 0b 07 0d
+00 41 63 0d 06 1f 14 07 07 0d 00 41 63 08 00 07 16 00 00 2a 66 0c 02 04 00
+63 08 32 00 00 32 00 56 69 62 65 2e 2e 2e 2e 2e 36 63 63 63 32 32 32 00 20
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Vibesyn *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 0a 1f 05 00 15 05 54 0a 0b 1f 14 12 01 00 00 07 59 13 0c 1c 1b 0b 06 0e
+0b 00 63 04 16 1b 1a 0a 05 0e 0b 03 63 04 10 3c 23 00 00 00 42 0c 02 04 00
+28 63 00 00 00 32 00 56 69 62 65 73 79 6e 20 20 2a 63 63 63 32 32 32 00 10
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindChime1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 09 03 0b 00 43 52 2d 03 06 0f 09 02 0b 00 44 63 22 03 1f 12 09 02 0b
+00 44 63 22 03 1f 12 09 04 0b 00 47 62 22 03 06 2d 00 05 06 37 18 04 04 00
+28 32 00 00 00 32 00 57 69 6e 64 43 68 69 6d 65 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindChime1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 09 03 0b 00 40 52 2d 03 06 0f 09 02 0b 00 40 63 22 03 1f 12 09 02 0b
+00 40 63 22 03 1f 12 09 04 0b 00 40 62 22 03 06 2d 00 05 06 37 18 04 04 00
+28 32 00 00 00 32 00 57 69 6e 64 43 68 69 6d 65 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindChime2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0c 00 03 0e 00 02 50 19 03 1c 12 00 02 0e 2e 03 50 27 0b 0e 10 00 02 0a
+00 05 59 09 0a 11 0d 00 03 0c 01 06 62 22 0b 0e 4e 00 38 00 53 0c 07 04 00
+63 32 00 00 00 32 00 57 69 6e 64 43 68 69 6d 65 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WindChime2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0c 00 03 0e 00 00 50 19 03 1c 12 00 02 0e 2e 00 50 27 0b 0e 10 00 02 0a
+00 00 59 09 0a 11 0d 00 03 0c 01 00 62 22 0b 0e 4e 00 38 00 53 0c 07 04 00
+63 32 00 00 00 32 00 57 69 6e 64 43 68 69 6d 65 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone*
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0e 0e 06 0e 11 01 4b 10 16 1f 12 0d 05 0e 00 41 5a 04 13 19 10 0e 05 0d
+20 42 4b 08 16 1f 11 0c 05 0e 00 41 63 04 10 75 29 2c 00 36 09 18 02 04 00
+28 00 31 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank C, voice 27
+1f 16 00 09 05 00 01 5a 08 03 1f 17 10 05 05 00 01 56 10 13 1f 1f 12 07 0f
+00 01 63 04 03 1f 1f 0f 07 0f 00 02 63 04 03 2a 23 00 00 00 62 18 04 04 00
+63 32 00 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 20 63 63 63 32 32 32 00 00
+00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 20
+1f 1f 16 09 0f 26 02 41 1f 13 1f 1f 16 09 0f 00 03 50 19 0b 1f 1f 0f 07 0f
+00 01 62 04 0b 1f 1f 0f 07 0f 00 02 62 0a 13 04 23 00 00 00 62 24 02 04 00
+28 32 00 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 16 09 0f 26 02 41 1f 13 1f 1f 16 09 0f 00 03 50 19 0b 1f 1f 0f 07 0f
+00 01 62 04 0b 1f 1f 0f 07 0f 00 02 62 0d 13 04 23 00 00 00 62 24 02 04 00
+28 32 00 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 07 07 0e 00 04 53 13 1e 1b 10 06 06 0e 00 05 56 04 16 1f 0d 07 07 0e
+00 07 63 0c 1b 1b 10 06 06 0e 00 05 63 00 0b 75 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone1
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 07 07 0e 00 01 53 13 1e 1b 10 06 06 0e 00 02 56 04 16 1f 0d 07 07 0e
+00 04 63 0c 1b 1b 10 06 06 0e 00 00 63 00 0b 75 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 07 07 0d 14 03 4f 0d 12 1f 12 07 04 0d 19 05 5d 08 1e 1f 0c 06 07 0d
+00 07 63 04 09 1f 0a 06 07 0d 00 05 63 04 0b 74 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone2
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 07 07 0d 14 01 4f 0d 12 1f 12 07 04 0d 19 03 5d 08 1e 1f 0c 06 07 0d
+00 04 63 04 09 1f 0a 06 07 0d 00 00 63 04 0b 74 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 0d 05 05 0c 14 03 4f 0d 12 1d 16 00 0c 07 19 03 5b 2a 1e 1f 0c 06 07 0d
+00 07 63 04 11 1f 09 07 06 0c 00 06 63 04 0b 74 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 33 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone3
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0d 05 05 0c 14 01 4f 0d 12 1d 16 00 0c 07 19 01 5b 2a 1e 1f 0c 06 07 0d
+00 04 63 04 11 1f 09 07 06 0c 00 00 63 04 0b 74 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 33 63 63 63 32 32 32 00 10
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 07 04 0e 00 04 40 08 1e 1b 10 06 05 0e 00 06 54 08 0e 1f 0d 07 05 0e
+00 07 63 0c 1b 1b 10 06 05 0e 00 06 63 00 0b 75 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone4
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 07 04 0e 00 01 40 08 1e 1b 10 06 05 0e 00 03 54 08 0e 1f 0d 07 05 0e
+00 04 63 0c 1b 1b 10 06 05 0e 00 00 63 00 0b 75 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 04 05 0a 00 04 41 28 01 1f 0e 05 05 09 00 04 43 13 0c 1f 1f 00 08 0f
+00 05 3e 00 05 1f 11 08 05 0f 00 05 63 04 0a 4d 23 00 19 00 32 24 02 04 00
+63 32 00 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 35 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 04 05 0a 00 01 41 28 01 1f 0e 05 05 09 00 01 43 13 0c 1f 1f 00 08 0f
+00 01 3e 00 05 1f 11 08 05 0f 00 00 63 04 0a 4d 23 00 19 00 32 24 02 04 00
+63 32 00 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 35 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0e 09 07 0a 00 03 52 30 19 1f 0e 05 06 09 00 04 42 08 0c 1f 1f 00 09 0f
+00 04 3b 0d 0d 1f 11 08 06 0f 00 04 63 04 0a 4d 23 00 19 00 32 24 02 04 00
+63 32 00 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone6
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 09 07 0a 00 01 52 30 19 1f 0e 05 06 09 00 01 42 08 0c 1f 1f 00 09 0f
+00 00 3b 0d 0d 1f 11 08 06 0f 00 00 63 04 0a 4d 23 00 19 00 32 24 02 04 00
+63 32 00 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0e 09 07 0a 00 05 55 13 19 12 12 05 06 09 00 06 5b 04 1c 1f 1f 00 09 0f
+00 04 5f 04 1d 1f 11 08 06 0f 00 07 63 00 0a 4c 23 00 00 00 32 24 02 04 00
+63 32 00 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone7
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0e 09 07 0a 00 01 55 13 19 12 12 05 06 09 00 01 5b 04 1c 1f 1f 00 09 0f
+00 01 5f 04 1d 1f 11 08 06 0f 00 00 63 00 0a 4c 23 00 00 00 32 24 02 04 00
+63 32 00 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+16 0d 05 05 0d 00 04 4f 13 12 1f 15 00 0c 07 00 05 63 2a 0e 1f 0a 05 06 0c
+00 07 63 04 0b 1c 0f 06 06 0c 00 06 63 04 13 74 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Xylophone8
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0d 05 05 0d 00 01 4f 13 12 1f 15 00 0c 07 00 03 63 2a 0e 1f 0a 05 06 0c
+00 04 63 04 0b 1c 0f 06 06 0c 00 00 63 04 13 74 23 00 00 00 32 24 02 04 00
+63 11 06 00 00 32 00 58 79 6c 6f 70 68 6f 6e 65 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Cymbal
+
+
+** Name: Chin.Cymb*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 01 00 0b 00 44 04 00 1e 00 01 01 00 1f 41 4e 0a 00 1f 00 00 01 00
+00 01 56 14 06 1d 0b 1f 04 00 0a 04 63 00 06 7b 1f 0d 0e 1e 0e 18 0c 04 00
+63 32 00 32 00 32 00 43 68 69 6e 2e 43 79 6d 62 2a 63 63 63 32 32 32 01 73
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cymbal...1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0e 00 40 59 35 03 19 16 00 01 0b 00 40 4e 03 0b 15 1c 06 01 0b
+00 40 57 3b 13 1f 1f 05 02 08 00 45 63 1b 13 31 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 43 79 6d 62 61 6c 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cymbal...1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0e 00 40 59 36 03 19 16 00 01 0b 00 40 4e 03 0b 15 1c 06 01 0b
+00 40 57 3b 13 1f 1f 05 02 08 00 40 63 1b 13 31 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 43 79 6d 62 61 6c 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cymbal...1
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0e 00 40 59 36 03 19 16 00 01 0b 00 40 4e 03 0b 15 1c 06 00 0b
+00 40 57 3b 13 1f 1f 05 02 08 00 40 63 1b 13 31 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 43 79 6d 62 61 6c 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cymbal...2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0e 00 40 59 24 03 19 16 00 01 0b 00 40 55 1e 0b 15 1c 06 01 0b
+00 40 56 19 13 1f 1f 05 02 08 00 44 63 1b 13 31 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 43 79 6d 62 61 6c 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cymbal...2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0e 00 40 59 24 03 19 16 00 01 0b 00 40 55 1e 0b 15 1c 06 01 0b
+00 40 56 16 13 1f 1f 05 02 08 00 40 63 1b 13 31 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 43 79 6d 62 61 6c 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cymbal...2
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0e 00 40 59 24 03 19 16 00 01 0b 00 40 55 1e 0b 15 1c 06 00 0b
+00 40 56 16 13 1f 1f 05 02 08 00 40 63 1b 13 31 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 43 79 6d 62 61 6c 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cymbal...3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0e 00 40 5b 37 03 19 16 00 01 0b 00 41 55 17 0b 15 1c 06 01 0b
+00 40 5b 20 13 1f 1f 05 02 08 00 44 63 15 13 33 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 43 79 6d 62 61 6c 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cymbal...3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0e 00 40 5b 37 03 19 16 00 01 0b 00 40 55 17 0b 15 1c 06 01 0b
+00 40 5b 20 13 1f 1f 05 02 08 00 40 63 15 13 33 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 43 79 6d 62 61 6c 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cymbal...3
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0e 00 40 5b 37 03 19 16 00 01 0b 00 40 55 17 0b 15 1c 06 00 0b
+00 40 5b 20 13 1f 1f 05 02 08 00 40 63 15 13 33 00 02 00 03 52 12 05 04 00
+63 32 00 00 00 32 00 43 79 6d 62 61 6c 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 25
+
+* SUBCATEGORY Drum1
+
+
+** Name: Bass/Snare
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 05 0f 00 00 63 32 03 1f 12 00 05 07 00 00 4d 00 03 1f 1f 10 07 0f
+63 05 63 28 13 1f 1f 0b 08 0f 00 05 63 00 03 34 23 00 00 00 62 00 04 04 00
+63 32 00 00 00 32 00 42 61 73 73 2f 53 6e 61 72 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass/Snare
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 05 0f 00 00 63 32 03 1f 12 00 05 07 00 00 4d 00 03 1f 1f 10 07 0f
+63 00 63 28 13 1f 1f 0b 08 0f 00 00 63 00 03 34 23 00 00 00 62 00 04 04 00
+63 32 00 00 00 32 00 42 61 73 73 2f 53 6e 61 72 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Drum
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank D, voice 25
+1f 1f 13 03 00 00 00 5f 2d 06 1f 12 13 02 00 00 01 52 00 02 1f 14 13 03 00
+00 02 56 1c 05 1e 14 13 0f 00 00 00 63 00 03 3b 63 00 00 00 03 0d 07 04 00
+63 32 00 00 00 32 00 42 61 73 73 20 44 72 75 6d 20 63 63 63 32 32 32 08 00
+00 00 08 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Drum1
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 1
+1f 0f 1f 07 00 00 00 4e 08 03 1f 18 00 06 08 00 00 5f 04 03 1f 15 08 07 0a
+00 00 49 01 03 1f 0b 12 0c 0e 00 00 5b 08 03 03 50 00 4a 00 72 00 04 04 00
+28 32 00 00 00 32 00 42 61 73 73 20 44 72 75 6d 31 63 63 63 32 32 32 00 00
+00 00 00 00 08 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Drum2
+** Source: Yamaha DX11 factory preset, bank D, voice 2
+1f 19 07 07 0b 00 00 46 20 01 1f 18 00 0b 0a 00 00 47 04 01 1f 15 00 0c 0a
+00 00 45 00 05 1f 0a 15 0a 0f 00 00 63 15 05 31 23 00 00 00 62 00 04 04 00
+28 32 00 00 00 32 00 42 61 73 73 20 44 72 75 6d 32 63 63 63 32 32 32 09 03
+08 05 08 05 08 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bass Drum2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 19 07 07 0b 00 00 46 20 01 1f 18 00 0b 0d 00 00 47 04 01 1f 15 00 0c 0d
+00 00 45 00 05 1f 0d 15 0a 0f 00 00 63 15 05 31 23 00 00 00 62 00 04 04 00
+28 32 00 00 00 32 00 42 61 73 73 20 44 72 75 6d 32 63 63 63 32 32 32 09 03
+08 05 08 05 08 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassDrum.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 19 0f 0e 00 00 55 03 03 18 10 19 0c 0d 00 01 63 03 13 1b 12 10 08 0e
+00 06 63 00 13 1f 0f 12 09 0f 00 05 63 02 13 35 00 00 00 00 02 0c 06 04 00
+63 32 00 32 00 32 00 42 61 73 73 44 72 75 6d 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassDrum.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 19 0f 0e 00 00 55 03 03 18 10 19 0c 0d 00 00 63 03 13 1b 12 10 08 0e
+00 00 63 00 13 1f 0f 12 09 0f 00 00 63 02 13 35 00 00 00 00 02 0c 06 04 00
+63 32 00 32 00 32 00 42 61 73 73 44 72 75 6d 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassDrum.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 19 0f 0e 00 00 4e 03 03 18 1b 19 0c 0d 00 02 46 03 13 1b 12 10 08 0e
+00 05 63 00 13 1f 0f 12 09 0f 00 03 63 00 13 34 00 00 00 00 02 0c 06 04 00
+63 32 00 32 00 32 00 42 61 73 73 44 72 75 6d 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassDrum.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 19 0f 0e 00 00 4e 03 03 18 1b 19 0c 0d 00 00 46 03 13 1b 12 10 08 0e
+00 00 63 00 13 1f 0f 12 09 0f 00 00 63 00 13 34 00 00 00 00 02 0c 06 04 00
+63 32 00 32 00 32 00 42 61 73 73 44 72 75 6d 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassDrum.3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 19 0f 0e 00 00 48 04 03 18 1b 19 0c 0d 00 01 4e 00 13 1b 12 10 08 0e
+00 02 55 02 13 1f 0f 12 09 0f 00 03 63 00 13 32 00 00 00 00 02 0c 06 04 00
+63 32 00 32 00 32 00 42 61 73 73 44 72 75 6d 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BassDrum.3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 19 0f 0e 00 00 48 04 03 18 1b 19 0c 0d 00 00 4e 00 13 1b 12 10 08 0e
+00 00 55 02 13 1f 0f 12 09 0f 00 00 63 00 13 32 00 00 00 00 02 0c 06 04 00
+63 32 00 32 00 32 00 42 61 73 73 44 72 75 6d 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BoConga
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank D, voice 15
+19 15 1f 0e 00 05 03 52 00 00 18 11 09 06 04 1e 02 42 04 16 18 0f 00 07 00
+02 00 63 04 10 1c 0c 14 06 0b 00 00 63 01 13 04 23 00 00 00 62 1d 04 04 00
+28 32 00 00 00 32 00 42 6f 43 6f 6e 67 61 20 20 20 63 11 2a 32 32 32 00 02
+00 57 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Congas *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 1d 17 09 09 00 03 63 00 0b 19 1f 1b 09 06 00 00 63 00 0b 1f 05 00 09 0b
+00 00 63 28 0b 13 10 11 06 0a 00 03 63 00 0b 02 18 00 26 00 32 18 02 04 00
+28 63 00 00 00 32 00 43 6f 6e 67 61 73 20 20 20 2a 63 63 63 32 32 32 00 06
+00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DrmSpring1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 19 12 0f 0b 2e 03 4c 04 1a 1f 1b 1f 0f 0b 00 04 63 08 10 1f 1b 1f 0f 0b
+00 05 63 08 0a 1f 18 07 07 0f 00 06 63 04 0b 32 22 0a 09 00 02 0c 02 04 00
+63 32 00 32 00 32 00 44 72 6d 53 70 72 69 6e 67 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DrmSpring1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 19 12 0f 0b 2e 00 4c 04 1a 1f 1b 1f 0f 0b 00 00 63 08 10 1f 1b 1f 0f 0b
+00 00 63 08 0a 1f 18 07 07 0f 00 00 63 04 0b 32 22 0a 09 00 02 0c 02 04 00
+63 32 00 32 00 32 00 44 72 6d 53 70 72 69 6e 67 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DrmSpring2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 19 12 0f 0b 2e 03 63 02 1a 1f 1b 1f 0f 0b 00 05 60 07 10 1f 1b 1f 0f 0b
+00 06 60 09 0a 1f 18 07 07 0f 00 07 63 02 0b 3a 22 0a 19 00 02 0c 02 04 00
+63 32 00 32 00 32 00 44 72 6d 53 70 72 69 6e 67 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DrmSpring2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 19 12 0f 0b 2e 00 63 02 1a 1f 1b 1f 0f 0b 00 00 60 07 10 1f 1b 1f 0f 0b
+00 00 60 09 0a 1f 18 07 07 0f 00 00 63 02 0b 3a 22 0a 19 00 02 0c 02 04 00
+63 32 00 32 00 32 00 44 72 6d 53 70 72 69 6e 67 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DrumString
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+06 08 01 04 0d 63 02 51 1e 05 1f 0a 03 06 0d 00 03 52 08 0b 15 0a 04 07 0d
+00 06 62 09 04 1f 04 08 07 00 00 05 63 08 06 2c 21 23 0f 00 12 00 04 04 00
+28 32 00 00 00 32 00 44 72 75 6d 53 74 72 69 6e 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: DrumString
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+06 08 01 04 0d 63 00 51 1e 05 1f 0a 03 06 0d 00 00 52 08 0b 15 0a 04 07 0d
+00 00 62 09 04 1f 04 08 07 00 00 00 63 08 06 2c 21 23 0f 00 12 00 04 04 00
+28 32 00 00 00 32 00 44 72 75 6d 53 74 72 69 6e 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Efem Toms
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 32
+1f 12 13 03 05 00 00 5f 3d 06 1f 10 0b 02 05 00 01 52 05 02 1f 0f 0e 03 06
+00 01 56 28 05 1e 09 0d 06 09 00 00 63 06 03 3c 63 00 63 00 63 20 07 04 00
+63 32 00 00 00 32 00 45 66 65 6d 20 54 6f 6d 73 20 63 63 63 32 32 32 08 00
+00 00 08 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: El.Snare *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0e 08 02 00 00 01 57 0d 0b 1f 03 00 01 00 00 00 5f 00 0b 1b 04 0a 01 07
+00 01 54 18 0b 1f 0e 04 07 00 00 00 63 00 0b 03 23 00 00 00 32 00 02 04 00
+28 63 00 00 00 32 00 45 6c 2e 53 6e 61 72 65 20 2a 63 63 63 32 32 32 00 00
+08 00 08 04 08 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: El.Snare2*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0e 02 05 00 00 00 57 0c 0b 1f 03 00 03 07 00 00 44 04 0b 1f 02 01 01 00
+00 00 51 20 0b 1f 10 00 08 00 00 01 63 0a 0b 13 23 00 00 00 32 00 02 04 00
+28 63 00 00 00 32 00 45 6c 2e 53 6e 61 72 65 32 2a 63 63 63 32 32 32 00 01
+08 10 08 54 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FM Hi-Hats
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank D, voice 24
+1f 0c 00 05 0f 00 00 63 3b 03 1f 09 00 04 0f 00 38 4b 16 03 1f 0c 00 06 0f
+00 00 56 16 03 1f 0d 1f 0f 04 00 02 63 08 03 3b 00 00 00 00 62 18 0c 04 00
+63 32 00 00 00 32 00 46 4d 20 48 69 2d 48 61 74 73 63 63 63 32 32 32 00 70
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hand Drum
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 30
+1f 16 00 03 07 00 01 50 00 03 1f 18 03 03 03 22 00 63 00 14 1d 07 06 03 06
+00 01 3c 08 03 1f 05 07 03 00 00 01 63 04 1b 39 23 00 08 00 42 18 04 04 00
+63 32 00 00 00 32 00 48 61 6e 64 20 44 72 75 6d 20 63 63 63 32 32 32 00 01
+00 03 00 01 00 01 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hand Drum1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 15 00 07 09 00 00 53 01 13 1f 18 03 04 0d 00 01 3b 03 13 1d 1a 06 04 04
+00 06 41 09 03 1f 00 07 03 0f 00 03 63 03 1b 29 23 00 00 00 62 18 05 04 00
+63 00 00 00 00 32 00 48 61 6e 64 20 44 72 75 6d 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hand Drum1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 15 00 07 09 00 00 53 01 13 1f 18 03 04 0d 00 00 3b 03 13 1d 1a 06 04 04
+00 00 41 09 03 1f 00 07 03 0f 00 00 63 03 1b 29 23 00 00 00 62 18 05 04 00
+63 00 00 00 00 32 00 48 61 6e 64 20 44 72 75 6d 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hand Drum2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 15 00 07 09 00 00 57 01 13 1f 18 03 04 0d 00 00 3b 04 13 1d 1a 06 04 04
+00 00 41 01 03 1f 00 07 08 0f 00 05 63 01 1b 29 23 00 00 00 62 18 05 04 00
+63 00 00 00 00 32 00 48 61 6e 64 20 44 72 75 6d 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hand Drum2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 15 00 07 09 00 00 57 01 13 1f 18 03 04 0d 00 00 3b 04 13 1d 1a 06 04 04
+00 00 41 01 03 1f 00 07 08 0f 00 00 63 01 1b 29 23 00 00 00 62 18 05 04 00
+63 00 00 00 00 32 00 48 61 6e 64 20 44 72 75 6d 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: "Hi!" Hat!
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 9
+1f 06 06 0f 0f 00 00 63 20 1b 1f 09 1f 0f 0f 00 00 63 24 1b 1f 0a 00 0f 00
+00 00 63 20 1b 1f 0a 00 0f 00 00 00 59 30 1b 3c 63 00 55 46 62 18 04 04 00
+28 32 00 00 00 32 00 22 48 69 21 22 20 48 61 74 21 63 63 63 32 32 32 0e 0f
+0e 08 0e 0c 0b 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hi-Hat *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0c 00 05 0f 00 00 63 3b 03 1f 09 00 04 0f 00 38 4e 16 03 1f 0c 00 06 0f
+00 00 5e 16 03 1f 13 1f 0f 00 00 02 63 08 03 3b 00 00 00 00 62 18 0c 04 00
+63 32 00 00 00 32 00 48 69 2d 48 61 74 20 20 20 2a 63 63 63 32 32 32 00 70
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Java Jive
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 26
+15 13 0d 03 0d 1e 02 50 18 0e 15 14 09 04 0c 1e 02 56 11 08 1b 1f 0f 07 0f
+00 01 63 04 06 1a 1f 0e 06 0f 00 02 63 04 00 7c 0b 00 08 00 62 18 04 04 00
+63 32 00 00 00 32 00 4a 61 76 61 20 4a 69 76 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: KickDrum *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 16 00 05 03 00 00 5f 02 03 1f 11 01 08 00 00 00 53 04 13 1f 19 13 05 04
+00 02 5f 00 1b 1f 1d 10 08 0f 00 00 63 10 0b 38 23 00 00 00 62 0c 04 0c 00
+63 32 00 00 00 32 00 4b 69 63 6b 44 72 75 6d 20 2a 63 63 63 32 32 32 0d 30
+08 00 08 20 08 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Log Drum.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 18 0f 06 04 00 41 1d 08 1b 1f 18 0c 05 00 00 41 51 00 03 18 06 0f 06 04
+00 45 63 00 13 1b 0f 0d 06 00 00 44 63 00 0b 2c 24 00 00 50 02 18 04 04 00
+28 32 00 00 00 32 00 4c 6f 67 20 44 72 75 6d 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Log Drum.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 18 0f 06 04 00 40 1d 08 1b 1f 18 0c 05 00 00 40 51 00 03 18 06 0f 06 04
+00 40 63 00 13 1b 0f 0d 06 00 00 40 63 00 0b 2c 24 00 00 50 02 18 04 04 00
+28 32 00 00 00 32 00 4c 6f 67 20 44 72 75 6d 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Log Drum.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 18 0f 06 04 00 40 5d 05 1b 1f 18 0c 05 00 00 41 49 03 0b 18 06 0f 06 04
+00 44 63 01 13 1b 0f 0d 06 00 00 44 63 01 0b 2c 24 00 00 50 02 18 04 04 00
+28 32 00 00 00 32 00 4c 6f 67 20 44 72 75 6d 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Log Drum.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 18 0f 06 04 00 40 5d 05 1b 1f 18 0c 05 00 00 40 49 03 0b 18 06 0f 06 04
+00 40 63 01 13 1b 0f 0d 06 00 00 40 63 01 0b 2c 24 00 00 50 02 18 04 04 00
+28 32 00 00 00 32 00 4c 6f 67 20 44 72 75 6d 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MiamiToms*
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 00 03 00 21 01 48 07 0b 1f 0a 00 02 00 04 00 46 02 0b 1f 02 00 04 00
+00 01 40 00 0b 1f 0d 0f 06 0d 00 02 63 00 0b 68 04 00 45 00 62 18 02 04 00
+28 63 00 00 00 2a 00 4d 69 61 6d 69 54 6f 6d 73 2a 63 63 63 32 32 32 00 30
+00 52 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 19 18 0d 0d 00 02 62 03 0b 18 0f 0c 09 00 00 02 5a 08 13 1d 15 15 0f 0f
+00 03 63 07 03 19 0f 18 07 04 00 05 62 04 0b 7c 23 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 19 18 0d 0d 00 00 62 03 0b 18 0f 0c 09 00 00 00 5a 08 13 1d 15 15 0f 0f
+00 00 63 07 03 19 0f 18 07 04 00 00 62 04 0b 7c 23 00 00 00 02 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 01 07 04 00 00 02 49 02 0b 1f 16 00 03 00 00 42 56 00 0c 1f 09 06 04 0b
+00 03 63 00 13 1f 0c 1f 06 00 00 05 62 00 13 2c 28 00 10 2e 26 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 01 07 04 00 00 00 49 02 0b 1f 16 00 03 00 00 40 56 00 0c 1f 09 06 04 0b
+00 00 63 00 13 1f 0c 1f 06 00 00 00 62 00 13 2c 28 00 10 2e 26 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 01 07 04 00 00 04 48 02 0b 1f 16 00 03 00 00 04 55 00 0c 1f 09 06 04 0b
+00 04 3e 03 13 1f 0c 1f 06 00 00 05 62 00 13 2c 0b 00 10 00 22 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 01 07 04 00 00 00 48 02 0b 1f 16 00 03 00 00 00 55 00 0c 1f 09 06 04 0b
+00 00 3e 03 13 1f 0c 1f 06 00 00 00 62 00 13 2c 0b 00 10 00 22 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 09 06 00 00 02 4b 01 0b 1f 16 00 03 00 00 03 38 20 0c 1f 0b 09 06 0b
+00 05 59 01 13 1f 0c 1f 06 00 00 06 62 08 13 2c 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..4
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 09 06 00 00 00 4b 01 0b 1f 16 00 03 00 00 00 38 20 0c 1f 0b 09 06 0b
+00 00 59 01 13 1f 0c 1f 06 00 00 00 62 08 13 2c 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..5
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 12 07 0e 00 03 43 31 1b 1f 10 0c 06 0e 00 03 48 08 0c 1f 09 16 0a 0d
+00 04 61 04 0b 1b 0c 0c 06 0d 00 04 62 04 0b 2c 0b 00 10 00 22 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..5
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0d 12 07 0e 00 00 43 31 1b 1f 10 0c 06 0e 00 00 48 08 0c 1f 09 16 0a 0d
+00 00 61 04 0b 1b 0c 0c 06 0d 00 00 62 04 0b 2c 0b 00 10 00 22 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0a 05 05 0c 00 03 4d 04 1b 00 0f 00 01 09 00 02 61 09 03 1c 09 09 07 0d
+00 04 63 00 13 1c 09 09 07 0c 00 07 62 00 0b 4c 23 00 00 00 22 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..6
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 0a 05 05 0c 00 00 4d 04 1b 00 0f 00 01 09 00 00 61 09 03 1c 09 09 07 0d
+00 00 63 00 13 1c 09 09 07 0c 00 00 62 00 0b 4c 23 00 00 00 22 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..6
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+0f 0a 05 05 0c 00 00 4d 04 1b 00 0f 00 00 09 00 00 61 09 03 1c 09 09 07 0d
+00 00 63 00 13 1c 09 09 07 0c 00 00 62 00 0b 4c 23 00 00 00 22 18 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..7
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 09 06 00 00 05 48 02 13 1f 16 00 03 00 00 03 53 01 12 1f 0b 09 06 0b
+00 03 57 03 13 1f 0c 1f 06 00 00 05 62 00 13 2c 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..7
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 09 06 00 00 00 48 02 13 1f 16 00 03 00 00 00 53 01 12 1f 0b 09 06 0b
+00 00 57 03 13 1f 0c 1f 06 00 00 00 62 00 13 2c 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..8
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 09 06 00 00 02 48 02 13 1f 16 00 03 00 00 03 53 01 12 1f 0b 09 06 0b
+00 06 57 05 13 1f 0c 1f 06 00 00 04 62 00 13 32 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..8
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 09 06 00 00 00 48 02 13 1f 16 00 03 00 00 00 53 01 12 1f 0b 09 06 0b
+00 00 57 05 13 1f 0c 1f 06 00 00 00 62 00 13 32 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..9
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0b 09 06 00 00 03 30 08 1b 1f 16 00 03 00 00 02 44 01 12 1f 1a 09 06 0b
+00 05 5f 05 13 1f 0c 1f 06 00 00 04 62 00 13 32 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm..9
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0b 09 06 00 00 00 30 08 1b 1f 16 00 03 00 00 00 44 01 12 1f 1a 09 06 0b
+00 00 5f 05 13 1f 0c 1f 06 00 00 00 62 00 13 32 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm.10
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0b 09 06 00 00 03 30 03 1b 18 0f 18 07 05 00 04 44 09 12 1f 1a 09 06 0b
+00 03 37 07 13 18 0f 0c 08 00 00 06 62 01 13 33 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntDrm.10
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0b 09 06 00 00 00 30 03 1b 18 0f 18 07 05 00 00 44 09 12 1f 1a 09 06 0b
+00 00 37 07 13 18 0f 0c 08 00 00 00 62 01 13 33 0b 00 10 00 22 0c 02 04 00
+63 63 00 00 00 32 00 4f 72 6e 74 44 72 6d 2e 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntEchoDr
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 18 0f 06 0f 63 02 5b 08 1b 0f 0a 03 07 0d 00 04 48 00 03 19 06 0f 06 04
+00 06 63 00 13 1c 05 03 07 0d 00 05 5d 00 0b 2c 26 1c 0e 00 70 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 45 63 68 6f 44 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntEchoDr
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 18 0f 06 0f 63 00 5b 08 1b 0f 0a 03 07 0d 00 00 48 00 03 19 06 0f 06 04
+00 00 63 00 13 1c 05 03 07 0d 00 00 5d 00 0b 2c 26 1c 0e 00 70 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 45 63 68 6f 44 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Percussive
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 05 04 0f 00 00 5a 0b 03 1f 12 0c 05 08 46 00 5f 03 03 1f 12 09 06 0a
+00 05 4e 00 03 1f 1f 0c 06 0f 00 05 5a 07 0b 3c 23 00 00 00 62 18 04 04 00
+63 32 00 00 00 32 00 50 65 72 63 75 73 73 69 76 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Percussive
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 05 04 0f 00 00 5a 0b 03 1f 12 0c 05 08 46 00 5f 01 03 1f 12 09 06 0a
+00 00 4e 00 03 1f 1f 0c 06 0f 00 00 5a 07 0b 3c 23 00 00 00 62 18 04 04 00
+63 32 00 00 00 32 00 50 65 72 63 75 73 73 69 76 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Simmons1 *
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 00 02 00 00 00 63 01 03 1f 00 00 02 00 00 00 42 00 03 1f 09 00 04 00
+00 00 53 0c 03 1f 10 00 07 00 00 00 63 00 0b 41 02 00 5f 00 72 18 02 04 00
+28 63 00 00 00 32 00 53 69 6d 6d 6f 6e 73 31 20 2a 63 63 63 32 32 32 00 01
+00 23 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Simmons2 *
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0d 00 02 00 00 00 63 01 03 1f 00 00 05 00 00 00 3c 00 03 1f 09 00 01 00
+00 00 4b 0c 03 1f 0f 00 06 00 00 00 63 00 0b 41 02 00 5f 00 72 18 02 04 00
+28 63 00 00 00 32 00 53 69 6d 6d 6f 6e 73 32 20 2a 63 63 63 32 32 32 00 01
+00 23 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Skankin'
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 19 08 0a 03 00 03 63 0b 10 1f 13 05 0b 05 00 03 58 00 0b 1f 19 06 0b 05
+00 03 63 0a 0e 1f 0f 11 09 07 00 04 63 04 03 3a 14 00 00 00 42 18 02 04 00
+63 32 00 32 00 32 00 53 6b 61 6e 6b 69 6e 27 20 20 63 63 63 32 32 32 00 30
+20 30 00 20 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 01 00 00 00 63 32 03 1f 0e 00 01 00 00 00 59 08 13 1f 00 00 01 00
+00 00 54 08 1b 1f 1a 10 08 0f 00 00 63 14 0b 3a 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 20 20 20 20 2a 63 63 63 32 32 32 0e 30
+08 0a 00 20 08 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare 1
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 3
+1f 18 00 01 0f 00 00 5a 38 06 1f 15 09 03 0b 00 00 63 00 00 1f 0a 12 08 0e
+00 02 63 00 00 1f 0f 10 08 0a 00 02 63 3c 06 7c 63 00 63 00 73 18 04 04 00
+28 32 00 00 00 32 00 53 6e 61 72 65 20 20 20 20 31 63 63 63 32 32 32 0f 0e
+01 07 08 00 09 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare 1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 18 00 01 0f 00 00 5a 38 06 1f 15 09 03 0b 00 00 63 00 00 1f 0d 12 08 0e
+00 02 63 00 00 1f 0f 10 08 0d 00 02 63 3c 06 7c 63 00 63 00 73 18 04 04 00
+28 32 00 00 00 32 00 53 6e 61 72 65 20 20 20 20 31 63 63 63 32 32 32 0f 0e
+01 07 08 00 09 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare 2
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 4
+1f 1a 00 05 0f 00 40 61 3c 1e 1f 15 09 04 0b 00 44 4e 2c 18 1b 13 13 09 0e
+00 42 63 30 00 1f 13 13 07 0e 00 42 63 2c 06 7c 63 00 30 0f 6a 0c 04 04 00
+28 32 00 00 00 32 00 53 6e 61 72 65 20 20 20 20 32 63 63 63 32 32 32 0c 09
+08 01 08 0c 08 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare 1
+** Source: Yamaha TX81Z factory preset, bank D, voice 28
+1f 1f 00 05 0f 00 00 62 32 03 1f 14 08 05 08 00 00 5f 00 0b 1f 1f 10 08 0f
+0c 00 63 0b 1b 1f 1f 0f 08 0f 00 00 63 05 0b 3b 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 20 31 20 20 20 63 63 63 32 32 32 08 00
+00 02 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare 2
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank D, voice 29
+1f 00 00 05 0f 00 00 63 32 03 1f 14 08 05 08 00 01 63 02 0b 1f 04 10 08 0f
+00 00 63 0b 0b 1f 1f 0f 08 0f 00 00 63 05 0b 3c 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 20 32 20 20 20 63 63 63 32 32 32 07 60
+00 00 00 70 08 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 00 00 60 0b 00 1f 1a 0a 05 0a 00 00 58 06 03 13 1f 11 08 0f
+00 05 5e 04 03 1f 1f 10 07 0f 00 04 57 00 03 3c 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 00 00 60 0b 00 1f 1a 0a 05 0a 00 00 58 06 03 13 1f 11 08 0f
+00 00 5e 04 03 1f 1f 10 07 0f 00 00 57 00 03 3c 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....1
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0f 00 00 60 0b 00 1f 1a 0a 05 0a 00 00 58 06 03 13 1f 11 08 0f
+00 00 5e 04 03 1f 1f 10 07 0f 00 00 57 00 03 3c 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 00 00 63 3f 03 1f 1a 0a 05 0a 00 00 4f 06 03 13 16 11 08 0d
+00 05 63 06 03 1f 1f 10 08 0f 00 05 63 02 03 28 23 00 00 00 52 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 00 00 63 3f 03 1f 1a 0a 05 0a 00 00 4f 06 03 13 16 11 08 0d
+00 00 63 06 03 1f 1f 10 08 0f 00 00 63 02 03 28 23 00 00 00 52 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....2
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0f 00 00 63 3f 03 1f 1a 0a 05 0a 00 00 4f 06 03 13 16 11 08 0d
+00 00 63 06 03 1f 1f 10 08 0f 00 00 63 02 03 28 23 00 00 00 52 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 05 0f 00 00 63 32 03 1f 15 0f 05 09 14 00 21 06 03 1f 1f 12 08 0f
+00 04 53 00 0b 1f 1f 10 08 0f 00 04 63 01 03 3b 23 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 05 0f 00 00 63 32 03 1f 15 0f 05 09 14 00 21 06 03 1f 1f 12 08 0f
+00 00 53 00 0b 1f 1f 10 08 0f 00 00 63 01 03 3b 23 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 05 0f 00 01 63 32 03 1f 13 10 05 05 14 01 47 3f 13 1f 1f 12 08 0f
+00 06 63 00 0b 1f 1f 0f 08 0f 00 05 43 3f 03 3c 23 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare....4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 05 0f 00 00 63 32 03 1f 13 10 05 05 14 00 47 3f 13 1f 1f 12 08 0f
+00 00 63 00 0b 1f 1f 0f 08 0f 00 00 43 3f 03 3c 23 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SnareDrm.*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 1a 00 01 0f 00 00 63 1c 03 1f 14 00 01 00 00 00 51 1c 03 1f 1f 0e 07 0f
+00 02 63 00 0b 1f 12 0f 06 00 00 02 63 24 03 3c 23 00 00 00 62 24 02 04 00
+28 32 00 00 00 32 00 53 6e 61 72 65 44 72 6d 2e 2a 63 63 63 32 32 32 08 0e
+08 0d 08 02 09 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Snare&Tom
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 05 0f 00 00 63 32 03 1f 10 08 05 08 00 01 63 02 0b 1f 04 10 08 0f
+00 00 63 0b 0b 1f 1f 0f 00 0f 2e 00 63 05 0b 3c 23 24 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 53 6e 61 72 65 26 54 6f 6d 20 63 63 63 32 32 32 07 30
+00 00 00 70 08 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Steel Drum
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank B, voice 32
+14 10 10 06 0a 1a 03 27 30 03 13 08 00 04 0a 1a 01 42 04 01 15 0c 0e 06 0c
+00 02 4c 0b 03 18 0c 0f 05 0f 00 01 5f 04 0a 01 20 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 53 74 65 65 6c 20 44 72 75 6d 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Steel Drum
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 10 10 06 0a 1a 03 27 30 03 13 08 00 04 0d 1a 01 42 04 01 15 0c 0e 06 0c
+00 02 4c 0b 03 18 0c 0f 05 0f 00 01 5f 04 0d 01 20 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 53 74 65 65 6c 20 44 72 75 6d 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelDrum
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 04 03 0a 1a 07 44 05 08 0d 08 0c 05 0b 32 06 40 13 0b 0e 05 03 04 0a
+00 04 28 1a 0e 15 08 0c 06 0c 00 05 63 08 0c 02 10 00 09 00 52 0c 02 04 00
+63 32 00 00 00 32 00 53 74 65 65 6c 44 72 75 6d 20 63 63 63 32 32 32 10 37
+00 10 00 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelDrum1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 09 03 0e 00 03 54 0a 11 1b 0a 0d 06 0e 2d 03 63 04 15 1b 0a 0d 06 0e
+43 06 5f 04 15 1f 0c 0d 06 0e 00 05 63 04 0e 66 23 00 00 00 32 0c 06 04 00
+63 32 00 32 00 32 00 53 74 65 65 6c 44 72 75 6d 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelDrum1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 09 03 0e 00 00 54 0a 11 1b 0a 0d 06 0e 2d 00 63 04 15 1b 0a 0d 06 0e
+43 00 5f 04 15 1f 0c 0d 06 0e 00 00 63 04 0e 66 23 00 00 00 32 0c 06 04 00
+63 32 00 32 00 32 00 53 74 65 65 6c 44 72 75 6d 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelDrum2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 09 03 0e 00 42 54 07 11 1b 0a 0d 06 0e 2d 43 63 08 15 1b 0a 0d 06 0e
+43 46 5f 04 15 1f 0c 0d 06 0e 00 44 63 04 0e 2c 19 00 0a 15 26 0c 06 04 00
+63 32 00 32 00 32 00 53 74 65 65 6c 44 72 75 6d 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelDrum2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 09 03 0e 00 40 54 07 11 1b 0a 0d 06 0e 2d 40 63 08 15 1b 0a 0d 06 0e
+43 40 5f 04 15 1f 0c 0d 06 0e 00 40 63 04 0e 2c 19 00 0a 15 26 0c 06 04 00
+63 32 00 32 00 32 00 53 74 65 65 6c 44 72 75 6d 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelDrum3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 10 00 03 00 00 01 49 0b 0b 14 0a 00 04 00 00 03 3c 06 03 14 0a 00 04 00
+00 05 3f 04 03 14 0a 00 06 00 00 05 63 04 03 3a 23 00 00 00 62 18 05 04 00
+63 63 00 00 00 32 00 53 74 65 65 6c 44 72 75 6d 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelDrum3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 10 00 03 00 00 00 49 0b 0b 14 0a 00 04 00 00 00 3c 06 03 14 0a 00 04 00
+00 00 3f 04 03 14 0a 00 06 00 00 00 63 04 03 3a 23 00 00 00 62 18 05 04 00
+63 63 00 00 00 32 00 53 74 65 65 6c 44 72 75 6d 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelDrum4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 10 00 03 00 00 02 42 0b 03 14 0a 00 04 00 00 03 42 06 03 14 0a 00 04 00
+00 06 2f 06 03 14 0a 00 06 00 00 06 63 04 03 3a 23 00 00 00 62 18 05 04 00
+63 63 00 00 00 32 00 53 74 65 65 6c 44 72 75 6d 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelDrum4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 10 00 03 00 00 00 42 0b 03 14 0a 00 04 00 00 00 42 06 03 14 0a 00 04 00
+00 00 2f 06 03 14 0a 00 06 00 00 00 63 04 03 3a 23 00 00 00 62 18 05 04 00
+63 63 00 00 00 32 00 53 74 65 65 6c 44 72 75 6d 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SyBon
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank D, voice 14
+19 15 1f 02 00 4b 04 5f 00 1e 18 11 09 06 04 1e 04 5d 00 11 17 0b 04 04 0a
+32 00 59 04 18 1b 12 0a 05 0a 00 00 5d 00 16 03 23 00 00 00 62 0c 04 04 00
+28 32 00 00 00 32 00 53 79 42 6f 6e 20 20 20 20 20 63 19 19 32 15 15 00 02
+00 07 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SyBon
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 15 1f 02 00 4b 04 5f 00 1e 18 11 09 06 04 1e 04 5d 00 11 17 0b 04 04 0d
+32 00 59 04 18 1b 12 0d 05 0d 00 00 5d 00 16 03 23 00 00 00 62 0c 04 04 00
+28 32 00 00 00 32 00 53 79 42 6f 6e 20 20 20 20 20 63 19 19 32 15 15 00 02
+00 07 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+* SUBCATEGORY Drum2
+
+
+** Name: SynthDrm.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 02 3c 0f 03 18 18 16 0b 04 2d 03 55 04 05 15 15 0c 0a 00
+43 05 63 13 03 15 13 0c 0b 00 00 04 63 08 03 7c 3f 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.1
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 3c 0f 03 18 18 16 0b 04 2d 00 55 04 05 15 15 0c 0a 00
+43 00 63 13 03 15 13 0c 0b 00 00 00 63 08 03 7c 3f 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 01 5d 3f 03 18 18 16 0b 04 2d 01 55 04 15 15 15 0c 0a 00
+43 04 63 09 0b 15 13 0c 0b 00 00 05 63 00 0b 7c 3f 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 5d 3f 03 18 18 16 0b 04 2d 00 55 04 15 15 15 0c 0a 00
+43 00 63 09 0b 15 13 0c 0b 00 00 00 63 00 0b 7c 3f 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.3
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 02 63 04 03 1f 18 16 0b 04 2d 00 55 04 15 15 15 0c 0a 00
+43 03 63 04 0b 1c 13 0c 0b 00 00 05 63 00 0b 7c 3f 00 63 00 60 18 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.3
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 63 04 03 1f 18 16 0b 04 2d 00 55 04 15 15 15 0c 0a 00
+43 00 63 04 0b 1c 13 0c 0b 00 00 00 63 00 0b 7c 3f 00 63 00 60 18 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 01 63 30 03 19 0c 07 04 0f 2d 01 63 01 03 15 15 0c 0a 00
+43 05 63 04 0b 1f 12 09 07 00 00 06 63 00 03 24 1e 63 00 00 73 18 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 63 30 03 19 0c 07 04 0f 2d 00 63 01 03 15 15 0c 0a 00
+43 00 63 04 0b 1f 12 09 07 00 00 00 63 00 03 24 1e 63 00 00 73 18 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 03 63 2c 1b 1f 1f 07 05 0f 2d 03 5c 00 0b 1f 1f 00 0f 0f
+43 04 63 00 0b 1f 11 09 05 00 00 06 63 00 03 24 1e 63 00 00 73 18 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.5
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 63 2c 1b 1f 1f 07 05 0f 2d 00 5c 00 0b 1f 1f 00 0f 0f
+43 00 63 00 0b 1f 11 09 05 00 00 00 63 00 03 24 1e 63 00 00 73 18 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.6
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 02 5d 01 03 18 18 16 0b 04 2d 03 55 01 15 15 15 0c 0a 00
+43 05 63 00 0b 15 13 0c 0b 00 00 45 63 00 0b 5a 17 00 00 2a 66 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.6
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 5d 01 03 18 18 16 0b 04 2d 00 55 01 15 15 15 0c 0a 00
+43 00 63 00 0b 15 13 0c 0b 00 00 40 63 00 0b 5a 17 00 00 2a 66 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.7
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 02 5d 3f 03 18 18 16 0b 04 2d 03 55 01 15 15 15 0c 0a 00
+43 05 63 04 0b 1c 13 0c 0b 00 00 45 63 04 0b 5b 17 00 00 2a 66 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.7
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 5d 3f 03 18 18 16 0b 04 2d 00 55 01 15 15 15 0c 0a 00
+43 00 63 04 0b 1c 13 0c 0b 00 00 40 63 04 0b 5b 17 00 00 2a 66 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 37 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.8
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 07 02 00 00 02 19 3f 03 19 19 09 07 00 2d 02 63 04 15 1f 1f 06 06 0c
+43 03 63 07 0b 10 10 12 09 0c 00 45 63 00 0b 5a 17 00 00 2a 66 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.8
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 07 02 00 00 00 19 3f 03 19 19 09 07 00 2d 00 63 04 15 1f 1f 06 06 0c
+43 00 63 07 0b 10 10 12 09 0c 00 40 63 00 0b 5a 17 00 00 2a 66 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 38 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.9
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 1f 02 0a 00 01 39 3d 03 1f 13 1f 06 00 2d 02 63 04 13 1f 0c 00 06 00
+43 03 63 00 0b 1f 10 1f 09 06 00 45 63 00 0b 5c 17 00 00 2a 66 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm.9
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 1f 02 0a 00 00 39 3d 03 1f 13 1f 06 00 2d 00 63 04 13 1f 0c 00 06 00
+43 00 63 00 0b 1f 10 1f 09 06 00 40 63 00 0b 5c 17 00 00 2a 66 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 2e 39 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm10
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 1f 02 0a 00 01 39 3a 03 1f 13 1f 06 00 2d 02 63 01 13 1f 0c 00 06 00
+43 05 63 01 0b 1f 10 1f 09 06 00 06 63 05 0b 64 08 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm10
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 1f 02 0a 00 00 39 3a 03 1f 13 1f 06 00 2d 00 63 01 13 1f 0c 00 06 00
+43 00 63 01 0b 1f 10 1f 09 06 00 00 63 05 0b 64 08 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 30 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm11
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 15 00 07 09 00 02 4a 00 13 1f 1f 10 04 0a 00 03 54 01 13 1d 1a 06 07 04
+00 05 63 05 03 1f 10 1f 05 00 00 05 63 00 0b 2c 23 00 00 00 62 18 05 04 00
+63 00 00 00 00 32 00 53 79 6e 74 68 44 72 6d 31 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm11
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 15 00 07 09 00 00 4a 00 13 1f 1f 10 04 0a 00 00 54 01 13 1d 1a 06 07 04
+00 00 63 05 03 1f 10 1f 05 00 00 00 63 00 0b 2c 23 00 00 00 62 18 05 04 00
+63 00 00 00 00 32 00 53 79 6e 74 68 44 72 6d 31 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm12
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 1f 19 06 0f 00 02 2d 34 1b 1f 14 1f 06 00 2d 02 63 04 13 1f 0b 00 06 00
+43 44 63 00 0b 1f 10 1f 09 06 00 46 63 07 0b 5c 24 1c 02 4d 76 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm12
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 1f 19 06 0f 00 00 2d 34 1b 1f 14 1f 06 00 2d 00 63 04 13 1f 0b 00 06 00
+43 40 63 00 0b 1f 10 1f 09 06 00 40 63 07 0b 5c 24 1c 02 4d 76 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm13
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 04 61 3f 03 18 18 16 0b 04 2d 04 5f 06 05 15 15 0c 0a 00
+43 04 63 07 03 15 13 0c 0b 00 00 06 63 01 03 7c 3f 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm13
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 61 3f 03 18 18 16 0b 04 2d 00 5f 06 05 15 15 0c 0a 00
+43 00 63 07 03 15 13 0c 0b 00 00 00 63 01 03 7c 3f 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm14
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 03 61 3f 03 18 18 16 0b 04 2d 03 56 01 05 15 15 0c 0a 00
+43 03 42 07 03 15 13 0c 0b 00 00 04 63 01 03 78 3f 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm14
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 61 3f 03 18 18 16 0b 04 2d 00 56 01 05 15 15 0c 0a 00
+43 00 42 07 03 15 13 0c 0b 00 00 00 63 01 03 78 3f 00 63 00 60 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm15
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 18 1f 0a 0f 00 03 63 08 03 13 18 0e 0b 0a 2d 03 35 00 05 1f 18 0d 0a 09
+43 04 5e 04 03 15 11 0c 0b 00 00 05 63 00 03 7b 23 00 00 00 32 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm15
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 18 1f 0a 0f 00 00 63 08 03 13 18 0e 0b 0a 2d 00 35 00 05 1f 18 0d 0a 09
+43 00 5e 04 03 15 11 0c 0b 00 00 00 63 00 03 7b 23 00 00 00 32 0c 06 04 00
+63 32 00 32 00 32 00 53 79 6e 74 68 44 72 6d 31 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm16
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 1e 08 01 00 63 02 63 0a 0b 14 07 16 0f 00 00 02 51 00 1b 1f 0c 1f 06 00
+00 05 61 01 03 1c 0f 07 07 07 3e 04 63 03 0b 7c 00 00 00 00 73 0c 02 04 00
+63 62 00 00 00 32 00 53 79 6e 74 68 44 72 6d 31 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SynthDrm16
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 1e 08 01 00 63 00 63 0a 0b 14 07 16 0f 00 00 00 51 00 1b 1f 0c 1f 06 00
+00 00 61 01 03 1c 0f 07 07 07 3e 00 63 03 0b 7c 00 00 00 00 73 0c 02 04 00
+63 62 00 00 00 32 00 53 79 6e 74 68 44 72 6d 31 36 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tibet Drum
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0f 09 01 0c 32 02 59 0a 15 1c 0f 1f 02 0a 1e 03 34 10 0a 1c 09 0d 02 0a
+32 05 5d 04 0a 1c 09 0d 02 0a 1e 06 61 04 0e 24 20 2c 14 00 42 0c 0c 04 00
+63 32 32 00 00 32 00 54 69 62 65 74 20 44 72 75 6d 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tibet Drum
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0f 09 01 0c 32 00 59 0a 15 1c 0f 1f 02 0a 1e 00 34 10 0a 1c 09 0d 02 0a
+32 00 5d 04 0a 1c 09 0d 02 0a 1e 00 61 04 0e 24 20 2c 14 00 42 0c 0c 04 00
+63 32 32 00 00 32 00 54 69 62 65 74 20 44 72 75 6d 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timbale..1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 07 03 05 0f 00 00 37 02 06 15 09 04 04 0f 00 00 47 01 00 13 1f 00 06 0f
+00 04 5f 03 06 1f 0c 07 06 00 00 04 63 00 13 3c 0b 00 10 00 22 18 07 04 00
+63 32 63 32 00 32 00 54 69 6d 62 61 6c 65 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timbale..1
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 07 03 05 0f 00 00 37 02 06 15 09 04 04 0f 00 00 47 01 00 13 1f 00 06 0f
+00 00 5f 03 06 1f 0c 07 06 00 00 00 63 00 13 3c 0b 00 10 00 22 18 07 04 00
+63 32 63 32 00 32 00 54 69 6d 62 61 6c 65 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timbale..2
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 01 07 04 00 00 00 3d 02 06 1f 18 09 03 0a 00 00 53 01 08 1f 09 06 04 0b
+00 05 57 03 06 1f 0c 07 06 00 00 05 63 00 13 2c 0b 00 10 00 22 18 07 04 00
+63 32 63 32 00 32 00 54 69 6d 62 61 6c 65 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timbale..2
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 01 07 04 00 00 00 3d 02 06 1f 18 09 03 0a 00 00 53 01 08 1f 09 06 04 0b
+00 00 57 03 06 1f 0c 07 06 00 00 00 63 00 13 2c 0b 00 10 00 22 18 07 04 00
+63 32 63 32 00 32 00 54 69 6d 62 61 6c 65 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timbales *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 02 00 13 00 50 04 0b 1f 0d 00 07 00 0c 00 55 01 03 1f 11 00 09 00
+32 00 3c 2b 03 1f 0e 00 06 00 00 06 63 08 03 41 02 00 5f 00 72 00 02 04 00
+28 63 00 00 00 32 00 54 69 6d 62 61 6c 65 73 20 2a 63 63 63 32 32 32 00 1a
+00 22 03 04 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timpani *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 08 03 00 00 07 4f 00 00 1f 11 06 03 0b 36 02 4b 00 08 1f 12 0c 04 0f
+00 05 4f 01 0e 1d 0b 00 04 00 00 00 63 00 0b 02 07 00 00 00 62 18 0c 04 00
+28 50 00 00 00 32 00 54 69 6d 70 61 6e 69 20 20 2a 63 63 63 32 32 32 00 32
+00 02 10 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timpani
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 23
+1d 12 00 03 00 00 00 41 3c 03 1f 0f 07 04 0f 00 00 3c 00 03 1f 0f 11 03 0c
+3b 01 52 02 03 1f 11 0c 04 0f 00 02 63 00 03 3a 15 00 03 00 6a 0c 07 04 00
+63 32 00 00 00 32 00 54 69 6d 70 61 6e 69 20 20 20 63 63 63 32 32 32 08 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timpani..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 12 00 03 00 00 00 37 00 03 1f 13 0c 04 0b 00 00 48 00 03 1f 07 04 02 0c
+3b 05 3f 02 03 1f 0c 0c 04 0f 00 06 63 00 03 2a 15 00 03 00 6a 0c 07 04 00
+63 32 00 00 00 32 00 54 69 6d 70 61 6e 69 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timpani..1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 12 00 03 00 00 00 37 00 03 1f 13 0c 04 0b 00 00 48 00 03 1f 07 04 02 0c
+3b 00 3f 02 03 1f 0c 0c 04 0f 00 00 63 00 03 2a 15 00 03 00 6a 0c 07 04 00
+63 32 00 00 00 32 00 54 69 6d 70 61 6e 69 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timpani..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 12 00 02 00 00 00 3d 02 0b 1f 1f 08 04 0f 00 00 37 00 03 1f 0f 07 03 0c
+3b 05 4f 00 03 1f 1f 0c 04 0f 00 05 63 02 0b 3a 15 00 03 00 6a 00 07 04 00
+63 32 00 00 00 32 00 54 69 6d 70 61 6e 69 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Timpani..2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 12 00 02 00 00 00 3d 02 0b 1f 1f 08 04 0f 00 00 37 00 03 1f 0f 07 03 0c
+3b 00 4f 00 03 1f 1f 0c 04 0f 00 00 63 02 0b 3a 15 00 03 00 6a 00 07 04 00
+63 32 00 00 00 32 00 54 69 6d 70 61 6e 69 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom 1
+** Source: Yamaha DX11 factory preset, bank D, voice 5
+1f 05 0a 08 0e 00 00 5d 08 03 1f 0c 10 07 04 00 00 34 18 03 1f 0e 0a 06 00
+00 00 51 20 03 1f 10 0a 07 0f 00 00 5e 04 03 01 23 00 00 00 62 00 04 04 00
+28 32 00 00 00 32 00 54 6f 6d 20 20 20 20 20 20 31 63 17 23 32 2e 2e 08 05
+08 04 09 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom 1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 05 0d 08 0e 00 00 5d 08 03 1f 0c 10 07 04 00 00 34 18 03 1f 0e 0a 06 00
+00 00 51 20 03 1f 10 0d 07 0f 00 00 5e 04 03 01 23 00 00 00 62 00 04 04 00
+28 32 00 00 00 32 00 54 6f 6d 20 20 20 20 20 20 31 63 17 23 32 2e 2e 08 05
+08 04 09 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom 2
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank D, voice 6
+1f 1f 00 01 0f 00 00 63 00 03 1f 1f 00 01 0f 13 01 37 04 0b 1f 18 11 03 06
+00 01 5e 04 0b 1f 1f 0b 06 0f 00 01 63 00 0b 3b 23 00 00 00 62 18 04 04 00
+28 32 00 00 00 32 00 54 6f 6d 20 20 20 20 20 20 32 63 25 26 32 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom 3
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 7
+1f 1f 00 01 0f 00 00 46 1b 03 1f 1f 00 01 0f 13 01 37 04 0b 1f 18 05 03 06
+00 01 5e 03 0b 1f 14 0b 06 0e 00 01 63 00 0b 3b 63 00 63 00 63 18 04 04 00
+28 32 00 00 00 32 00 54 6f 6d 20 20 20 20 20 20 33 63 25 26 32 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom 4
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 8
+1f 1f 00 01 0f 00 00 46 06 03 1f 1f 00 01 0f 13 01 37 00 0b 1f 18 05 03 06
+00 01 5e 00 0b 1f 0b 1f 0a 0a 00 01 63 00 0b 23 63 00 63 00 63 18 04 04 00
+28 32 00 00 00 32 00 54 6f 6d 20 20 20 20 20 20 34 63 25 26 32 2c 2c 00 00
+00 02 00 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom 4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 00 00 46 06 03 1f 1f 00 01 0f 13 01 37 00 0b 1f 18 05 03 06
+00 01 5e 00 0b 1f 0b 1f 0a 0d 00 01 63 00 0b 23 63 00 63 00 63 18 04 04 00
+28 32 00 00 00 32 00 54 6f 6d 20 20 20 20 20 20 34 63 25 26 32 2c 2c 00 00
+00 02 00 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom Tom..1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 1f 17 0f 0f 00 00 00 04 03 15 1f 1b 0f 0f 00 00 5d 02 06 18 1f 10 0f 0f
+00 06 00 04 06 13 16 0d 0a 0f 00 04 63 00 08 03 23 00 00 00 62 18 0c 04 00
+63 32 00 00 00 32 00 54 6f 6d 20 54 6f 6d 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom Tom..1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 1f 17 0f 0f 00 00 00 04 03 15 1f 1b 0f 0f 00 00 5d 02 06 18 1f 10 0f 0f
+00 00 00 04 06 13 16 0d 0a 0f 00 00 63 00 08 03 23 00 00 00 62 18 0c 04 00
+63 32 00 00 00 32 00 54 6f 6d 20 54 6f 6d 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom Tom..2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 1f 1a 0f 0f 00 00 63 07 03 15 1f 1b 0f 0f 00 00 5d 02 06 18 1f 10 0f 0f
+00 05 47 02 06 13 16 0d 0a 0f 00 05 63 00 08 03 23 00 00 00 62 18 0c 04 00
+63 32 00 00 00 32 00 54 6f 6d 20 54 6f 6d 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom Tom..2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 1f 1a 0f 0f 00 00 63 07 03 15 1f 1b 0f 0f 00 00 5d 02 06 18 1f 10 0f 0f
+00 00 47 02 06 13 16 0d 0a 0f 00 00 63 00 08 03 23 00 00 00 62 18 0c 04 00
+63 32 00 00 00 32 00 54 6f 6d 20 54 6f 6d 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom Tom..3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+18 1f 1a 0f 0f 00 00 63 01 03 15 1f 1b 0f 0f 00 00 63 01 16 18 1f 10 0f 0f
+00 05 63 02 06 13 16 0d 0a 0f 00 05 63 01 10 04 23 00 00 00 62 18 0c 04 00
+63 32 00 00 00 32 00 54 6f 6d 20 54 6f 6d 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom Tom..3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 1f 1a 0f 0f 00 00 63 01 03 15 1f 1b 0f 0f 00 00 63 01 16 18 1f 10 0f 0f
+00 00 63 02 06 13 16 0d 0a 0f 00 00 63 01 10 04 23 00 00 00 62 18 0c 04 00
+63 32 00 00 00 32 00 54 6f 6d 20 54 6f 6d 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom Tom..4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 0c 0a 0a 00 00 4d 0a 00 1f 13 0a 05 0d 32 00 4e 0c 03 1f 0d 0c 0a 0d
+1f 05 59 10 03 1f 1c 0f 07 0f 00 05 63 0a 03 2c 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 54 6f 6d 20 54 6f 6d 2e 2e 34 63 63 63 32 32 32 00 00
+00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom Tom..4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 0c 0a 0a 00 00 4d 02 00 1f 13 0a 05 0d 32 00 4e 0c 03 1f 0d 0c 0a 0d
+1f 00 59 0e 03 1f 1c 0f 07 0f 00 00 63 09 03 2c 23 00 00 00 62 0c 04 04 00
+63 32 00 00 00 32 00 54 6f 6d 20 54 6f 6d 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tom-Pany
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 16
+1f 10 00 01 00 35 00 50 00 00 1f 16 04 03 09 36 00 63 00 00 13 0b 03 02 09
+3b 00 3c 03 06 1d 0c 00 06 00 00 00 5a 00 06 1a 07 00 51 00 52 0c 04 04 00
+28 32 00 00 00 32 00 54 6f 6d 2d 50 61 6e 79 20 20 63 40 43 32 18 16 00 50
+00 03 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wood Drum
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 1f 07 0f 00 00 63 3f 03 18 1f 1f 07 0f 46 01 63 00 03 1f 1f 1f 06 0f
+00 06 63 00 03 1b 1f 0f 06 0f 00 04 63 00 03 04 23 00 00 00 62 18 04 04 00
+63 32 00 00 00 32 00 57 6f 6f 64 20 44 72 75 6d 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wood Drum
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 1f 07 0f 00 00 63 3f 03 18 1f 1f 07 0f 46 00 63 00 03 1f 1f 1f 06 0f
+00 00 63 00 03 1b 1f 0f 06 0f 00 00 63 00 03 04 23 00 00 00 62 18 04 04 00
+63 32 00 00 00 32 00 57 6f 6f 64 20 44 72 75 6d 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: XyloSpring
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 16 15 0f 05 2e 04 63 04 06 10 0c 0c 03 09 00 03 3f 01 01 1f 16 0f 06 03
+00 06 63 08 03 1f 09 09 06 0c 00 06 62 00 02 7c 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 58 79 6c 6f 53 70 72 69 6e 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: XyloSpring
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 16 15 0f 05 2e 00 63 04 06 10 0c 0c 03 09 00 00 3f 01 01 1f 16 0f 06 03
+00 00 63 08 03 1f 09 09 06 0c 00 00 62 00 02 7c 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 58 79 6c 6f 53 70 72 69 6e 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Other
+
+
+** Name: Cabassa *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 15 00 0f 00 00 00 63 1c 03 1f 0d 00 07 00 00 41 63 24 03 1f 0d 00 07 00
+00 42 63 38 03 1f 0d 00 06 00 00 42 63 24 03 7d 51 00 00 63 7f 30 02 04 00
+28 63 00 00 00 32 00 43 61 62 61 73 73 61 20 20 2a 63 63 63 32 32 32 0d 00
+0d 50 0c 00 0d 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Maracas *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 15 00 09 00 00 00 62 1c 03 1f 0d 00 07 00 00 41 63 3c 03 1f 0d 00 06 00
+00 42 63 24 03 1f 0d 00 07 00 00 42 63 3c 03 7d 59 00 00 63 7f 30 02 04 00
+28 63 00 00 00 32 00 4d 61 72 61 63 61 73 20 20 2a 63 63 63 32 32 32 0e 00
+0d 43 0e 00 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Metalimba
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank D, voice 4
+1f 17 00 05 05 1c 02 55 28 0b 1f 10 00 04 08 0a 02 4d 15 0e 1f 0b 00 05 08
+0c 02 4d 16 08 1f 0e 00 06 00 00 01 63 04 0b 02 23 00 00 00 62 0c 07 04 00
+63 63 00 00 00 32 00 4d 65 74 61 6c 69 6d 62 61 20 63 63 63 32 32 32 00 60
+00 01 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tambourin*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 00 0f 00 00 01 63 04 03 1f 00 00 01 0f 00 01 59 24 03 1f 12 00 01 0f
+00 00 45 04 03 18 10 1f 07 00 00 03 63 18 03 32 23 00 00 00 32 00 02 04 00
+28 63 00 00 00 32 00 54 61 6d 62 6f 75 72 69 6e 2a 63 63 63 32 32 32 0b 05
+0e 09 08 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 27
+
+* CATEGORY NOISES
+
+* SUBCATEGORY Noises1
+
+** Name: Airplane.1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 04 02 08 0f 00 45 4d 04 03 13 12 11 03 0c 03 45 63 00 03 0f 04 03 08 0f
+00 46 63 04 03 0c 12 03 03 0f 02 46 5f 00 03 0c 63 00 00 63 27 18 02 04 00
+63 63 00 00 00 32 00 41 69 72 70 6c 61 6e 65 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Airplane.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 04 02 08 0f 00 40 4d 04 03 13 12 11 03 0c 03 40 63 00 03 0f 04 03 08 0f
+00 40 63 04 03 0c 12 03 03 0f 02 40 5f 00 03 0c 63 00 00 63 27 18 02 04 00
+63 63 00 00 00 32 00 41 69 72 70 6c 61 6e 65 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Airplane.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 04 02 08 0f 00 44 56 09 03 13 12 11 03 0c 03 44 63 09 03 0f 04 03 08 0f
+00 44 63 04 03 0c 12 03 03 0f 02 47 5f 00 03 0c 63 00 00 63 27 18 02 04 00
+63 63 00 00 00 32 00 41 69 72 70 6c 61 6e 65 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Airplane.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 04 02 08 0f 00 40 56 09 03 13 12 11 03 0c 03 40 63 09 03 0f 04 03 08 0f
+00 40 63 04 03 0c 12 03 03 0f 02 40 5f 00 03 0c 63 00 00 63 27 18 02 04 00
+63 63 00 00 00 32 00 41 69 72 70 6c 61 6e 65 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Alarm Call
+** Controls: MW (LFO amplitude)
+** Source: Yamaha TX81Z factory preset, bank D, voice 18
+1f 1f 00 03 0f 00 00 2e 3f 00 1f 1f 00 04 0f 00 00 47 11 06 1f 1f 00 06 0f
+00 40 3a 0b 00 1f 1f 00 06 0f 00 40 5c 3f 06 22 37 00 00 28 6d 18 04 04 00
+63 01 63 00 00 32 00 41 6c 61 72 6d 20 43 61 6c 6c 63 63 63 32 32 32 00 40
+0e 50 00 00 0a 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Alien 3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 05 02 04 0e 00 00 4d 08 01 19 07 04 05 0f 08 00 4c 06 00 0f 0a 00 07 0e
+06 02 63 05 05 14 15 03 05 0e 00 01 62 06 00 24 26 03 05 00 46 05 03 04 00
+63 2b 00 00 00 32 00 41 6c 69 65 6e 20 33 20 20 20 63 63 63 32 32 32 01 31
+00 21 00 23 00 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Alien Chat
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 0c 01 06 0e 00 43 28 04 05 16 10 1f 05 0d 00 44 2c 04 02 16 0f 1f 06 0d
+00 45 46 0a 06 15 04 1f 06 0e 00 45 63 08 03 42 32 00 00 63 05 18 02 04 00
+28 02 00 00 00 32 00 41 6c 69 65 6e 20 43 68 61 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Alien Chat
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0a 0c 01 06 0e 00 40 28 04 05 16 10 1f 05 0d 00 40 2c 04 02 16 0f 1f 06 0d
+00 40 46 0a 06 15 04 1f 06 0e 00 40 63 08 03 42 32 00 00 63 05 18 02 04 00
+28 02 00 00 00 32 00 41 6c 69 65 6e 20 43 68 61 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Artofnoiz*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 0a 08 02 07 00 05 5e 0d 0b 1f 03 00 01 00 00 00 63 00 0b 1b 04 0a 01 07
+00 03 57 18 0b 1f 13 04 06 0f 00 00 63 00 13 03 23 00 00 00 32 00 02 04 00
+28 63 00 00 00 32 00 41 72 74 6f 66 6e 6f 69 7a 2a 63 63 63 32 32 32 00 00
+08 00 08 04 08 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AutoDecent
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+07 1b 0d 0d 0f 00 03 63 11 00 0c 1b 0d 0d 0f 00 04 63 13 03 0a 1b 0d 0d 0f
+00 04 63 12 06 1f 1b 0d 0d 0f 00 06 63 19 03 47 25 00 00 00 32 00 02 04 00
+28 02 00 00 00 32 00 41 75 74 6f 44 65 63 65 6e 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AutoDecent
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 1b 0d 0d 0f 00 00 63 11 00 0c 1b 0d 0d 0f 00 00 63 13 03 0a 1b 0d 0d 0f
+00 00 63 12 06 1f 1b 0d 0d 0f 00 00 63 19 03 47 25 00 00 00 32 00 02 04 00
+28 02 00 00 00 32 00 41 75 74 6f 44 65 63 65 6e 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AutoStorm1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 07 01 03 05 00 03 30 0a 00 14 0b 04 01 09 00 04 4d 15 00 14 06 01 03 05
+00 04 53 00 00 0f 09 00 01 0c 00 05 63 00 00 2b 63 00 40 00 73 00 05 04 00
+63 63 63 00 00 32 00 41 75 74 6f 53 74 6f 72 6d 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AutoStorm1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 07 01 03 05 00 00 30 0a 00 14 0b 04 01 09 00 00 4d 15 00 14 06 01 03 05
+00 00 53 00 00 0f 09 00 01 0c 00 00 63 00 00 2b 63 00 40 00 73 00 05 04 00
+63 63 63 00 00 32 00 41 75 74 6f 53 74 6f 72 6d 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AutoStorm2
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 07 09 03 05 00 43 33 0d 00 12 0b 09 01 09 00 43 4d 15 00 18 06 09 03 05
+00 44 53 00 00 13 09 09 01 0c 00 45 63 00 00 5b 50 00 63 11 77 00 05 04 00
+63 63 63 00 00 32 00 41 75 74 6f 53 74 6f 72 6d 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: AutoStorm2
+** Controls: MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 07 09 03 05 00 40 33 0d 00 12 0b 09 01 09 00 40 4d 15 00 18 06 09 03 05
+00 40 53 00 00 13 09 09 01 0c 00 40 63 00 00 5b 50 00 63 11 77 00 05 04 00
+63 63 63 00 00 32 00 41 75 74 6f 53 74 6f 72 6d 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Big Belch
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 0c 0b 0b 00 44 42 0d 03 1f 1b 07 09 0c 00 43 54 0d 1b 1f 1c 0c 0b 0c
+00 44 63 0d 03 1f 1b 07 09 0f 00 45 63 00 1b 74 59 00 63 23 75 0c 07 04 00
+63 32 01 32 00 32 00 42 69 67 20 42 65 6c 63 68 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Big Belch
+** Controls: MW (LFO pitch), MW (LFO amplitude), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 0c 0b 0b 00 40 42 0d 03 1f 1b 07 09 0c 00 40 54 0d 1b 1f 1c 0c 0b 0c
+00 40 63 0d 03 1f 1b 07 09 0f 00 40 63 00 1b 74 59 00 63 23 75 0c 07 04 00
+63 32 01 32 00 32 00 42 69 67 20 42 65 6c 63 68 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Birds *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 0f 0f 00 00 00 0c 03 1c 00 00 01 0f 00 00 55 20 03 1b 12 00 01 0f
+00 00 63 00 03 10 15 00 09 0e 00 03 63 00 03 02 23 00 00 00 32 00 02 04 00
+28 63 00 00 00 32 00 42 69 72 64 73 20 20 20 20 2a 63 63 63 32 32 32 0f 09
+0e 09 08 01 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Birds
+** Controls: MW (LFO pitch), MW (LFO amplitude), BC (voice pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 12
+1f 1f 00 07 0f 28 00 51 01 03 1f 1f 00 0f 0f 28 00 4b 01 03 13 1f 00 0e 0f
+0a 40 63 3f 03 1f 1f 00 0f 0f 0a 40 63 3f 03 04 22 00 50 5e 6e 0c 0c 04 00
+63 63 63 00 00 33 00 42 69 72 64 73 20 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BlendOrgan
+** Description: Strange, loud, obnoxious sound
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 00 00 0a 0f 09 00 45 0e 03 19 00 00 08 0f 23 00 61 07 08 13 00 00 08 0f
+00 00 5f 0b 01 12 00 00 05 0f 00 00 63 02 0d 3c 1f 00 23 00 42 0c 06 04 00
+63 3d 00 1d 00 32 00 42 6c 65 6e 64 4f 72 67 61 6e 63 63 63 32 32 32 00 00
+00 20 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Blow Up
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 04 04 06 02 00 3b 62 00 03 0f 06 04 06 0d 00 1d 63 00 1b 13 15 15 06 09
+00 1a 63 04 1b 0f 04 04 09 0c 00 3f 63 0d 03 3a 00 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 42 6c 6f 77 20 55 70 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Blow Up
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 04 04 06 02 00 38 62 00 03 0f 06 04 06 0d 00 18 63 00 1b 13 15 15 06 09
+00 18 63 04 1b 0f 04 04 09 0c 00 38 63 0d 03 3a 00 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 42 6c 6f 77 20 55 70 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Boingggggg
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 1b 03 00 00 42 4b 1d 15 1f 07 0c 04 00 00 44 32 16 15 1f 07 1c 03 00
+00 44 3a 38 13 1f 07 0c 0d 00 00 45 63 08 10 2b 11 00 49 5a 74 00 02 04 00
+63 63 00 00 00 32 00 42 6f 69 6e 67 67 67 67 67 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Boingggggg
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 1b 03 00 00 40 4b 1d 15 1f 07 0c 04 00 00 40 32 16 15 1f 07 1c 03 00
+00 40 3a 38 13 1f 07 0c 0d 00 00 40 63 08 10 2b 11 00 49 5a 74 00 02 04 00
+63 63 00 00 00 32 00 42 6f 69 6e 67 67 67 67 67 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrokWindow
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 06 06 06 00 03 3f 10 03 1f 0d 00 05 0b 00 03 50 31 03 1f 1f 00 08 0f
+00 05 39 3f 03 1f 1f 0f 07 0f 00 06 63 10 03 2a 34 00 37 49 73 1a 05 04 00
+63 32 00 00 00 32 00 42 72 6f 6b 57 69 6e 64 6f 77 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BrokWindow
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 06 06 06 00 00 3f 10 03 1f 0d 00 05 0b 00 00 50 31 03 1f 1f 00 08 0f
+00 00 39 3f 03 1f 1f 0f 07 0f 00 00 63 10 03 2a 34 00 37 49 73 1a 05 04 00
+63 32 00 00 00 32 00 42 72 6f 6b 57 69 6e 64 6f 77 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bubbly
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+17 06 00 04 0e 0a 04 3a 01 00 1f 1f 1f 0f 0f 00 04 00 04 00 1f 1f 1f 0f 0f
+00 43 41 01 0b 18 0d 0d 06 00 00 45 63 0a 13 7b 32 00 63 43 39 18 02 04 00
+28 02 00 00 00 32 00 42 75 62 62 6c 79 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Bubbly
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+17 06 00 04 0e 0a 00 3a 01 00 1f 1f 1f 0f 0f 00 00 00 04 00 1f 1f 1f 0f 0f
+00 40 41 01 0b 18 0d 0d 06 00 00 40 63 0a 13 7b 32 00 63 43 39 18 02 04 00
+28 02 00 00 00 32 00 42 75 62 62 6c 79 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Busy *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 00 00 04 03 1f 1f 00 0f 0f 00 40 5f 34 03 1f 1f 00 0f 0f
+00 40 3a 20 03 1f 1f 00 0f 0f 00 40 63 2c 03 46 13 46 00 63 4d 18 04 04 00
+28 32 00 00 00 32 00 42 75 73 79 20 20 20 20 20 2a 63 63 63 32 32 32 00 00
+09 0a 09 07 09 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Busy.....1
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 05 0f 00 43 32 04 08 1f 1f 00 05 0f 00 43 34 00 0e 1f 1f 00 05 0f
+00 46 40 08 08 1f 1f 00 05 0f 00 45 63 00 0e 02 0f 00 00 5a 0d 18 04 04 00
+63 01 63 00 00 32 00 42 75 73 79 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Busy.....1
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 05 0f 00 40 32 04 08 1f 1f 00 05 0f 00 40 34 00 0e 1f 1f 00 05 0f
+00 40 40 08 08 1f 1f 00 05 0f 00 40 63 00 0e 02 0f 00 00 5a 0d 18 04 04 00
+63 01 63 00 00 32 00 42 75 73 79 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Busy.....2
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 05 0f 00 40 63 04 08 1f 1f 00 05 0f 00 40 63 00 0e 1f 1f 00 05 0f
+00 40 63 08 08 1f 1f 00 05 0f 00 40 63 00 0e 07 0f 00 00 63 0d 18 04 04 00
+63 01 63 00 00 32 00 42 75 73 79 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choo Choo
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 10 11 08 0f 00 03 48 04 15 1c 1f 1f 06 0f 00 04 63 18 1d 1c 10 03 06 0f
+00 05 63 08 1b 10 0c 03 09 0f 00 46 63 03 10 7a 63 00 10 54 06 18 02 04 00
+63 63 00 00 00 32 00 43 68 6f 6f 20 43 68 6f 6f 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Choo Choo
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 10 11 08 0f 00 00 48 04 15 1c 1f 1f 06 0f 00 00 63 18 1d 1c 10 03 06 0f
+00 00 63 08 1b 10 0c 03 09 0f 00 40 63 03 10 7a 63 00 10 54 06 18 02 04 00
+63 63 00 00 00 32 00 43 68 6f 6f 20 43 68 6f 6f 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chopper..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 0a 43 63 3f 03 1f 1f 00 01 0f 00 43 63 29 03 1f 1f 00 03 0f
+00 45 63 35 03 0b 0b 00 07 0f 00 45 63 00 03 38 2a 00 42 5a 64 18 02 04 00
+28 02 00 00 00 32 00 43 68 6f 70 70 65 72 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chopper..1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 0a 40 63 3f 03 1f 1f 00 01 0f 00 40 63 29 03 1f 1f 00 03 0f
+00 40 63 35 03 0b 0b 00 07 0f 00 40 63 00 03 38 2a 00 42 5a 64 18 02 04 00
+28 02 00 00 00 32 00 43 68 6f 70 70 65 72 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chopper..1
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0f 0a 40 63 3f 03 1f 1f 00 00 0f 00 40 63 29 03 1f 1f 00 03 0f
+00 40 63 35 03 0b 0b 00 07 0f 00 40 63 00 03 38 2a 00 42 5a 64 18 02 04 00
+28 02 00 00 00 32 00 43 68 6f 70 70 65 72 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chopper..2
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 02 0f 00 44 50 0a 04 1f 1f 00 03 0f 00 46 56 05 02 1f 1f 00 03 0f
+00 44 4e 08 04 1f 1f 00 03 0f 00 46 5f 02 04 6b 33 00 00 63 7c 0c 07 04 00
+63 32 01 32 00 32 00 43 68 6f 70 70 65 72 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Chopper..2
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 02 0f 00 40 50 0a 04 1f 1f 00 03 0f 00 40 56 05 02 1f 1f 00 03 0f
+00 40 4e 08 04 1f 1f 00 03 0f 00 40 5f 02 04 6b 33 00 00 63 7c 0c 07 04 00
+63 32 01 32 00 32 00 43 68 6f 70 70 65 72 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cricket *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 00 00 5a 2c 03 1f 1f 00 01 0f 00 00 5a 28 03 1c 1f 00 04 0f
+00 40 52 30 03 1d 1f 00 04 0f 00 40 52 34 03 24 20 00 00 63 0d 18 04 04 00
+28 32 00 00 00 32 00 43 72 69 63 6b 65 74 20 20 2a 63 63 63 32 32 32 08 0a
+08 02 0d 0f 0d 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Diving Fly
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0d 1f 00 08 0f 00 44 36 06 03 0d 1f 00 03 0f 00 44 63 04 03 0d 1f 00 04 0f
+00 46 63 05 03 0d 1f 00 03 0f 00 47 63 04 03 4d 63 00 00 31 7e 24 05 04 00
+63 63 63 00 00 32 00 44 69 76 69 6e 67 20 46 6c 79 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Diving Fly
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0d 1f 00 08 0f 00 40 36 06 03 0d 1f 00 03 0f 00 40 63 04 03 0d 1f 00 04 0f
+00 40 63 05 03 0d 1f 00 03 0f 00 40 63 04 03 4d 63 00 00 31 7e 24 05 04 00
+63 63 63 00 00 32 00 44 69 76 69 6e 67 20 46 6c 79 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Dynamite
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 09 02 05 00 3c 4f 04 03 1f 03 0d 04 00 00 1c 38 04 03 1b 0a 0d 03 0f
+00 1d 49 3f 03 1f 03 0d 04 00 00 3e 5a 04 03 3a 55 00 2d 00 72 00 02 04 00
+63 32 00 00 00 32 00 44 79 6e 61 6d 69 74 65 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Dynamite
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 08 09 02 05 00 38 4f 04 03 1f 03 0d 04 00 00 18 38 04 03 1b 0a 0d 03 0f
+00 18 49 3f 03 1f 03 0d 04 00 00 38 5a 04 03 3a 55 00 2d 00 72 00 02 04 00
+63 32 00 00 00 32 00 44 79 6e 61 6d 69 74 65 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EarthQuake
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 02 09 05 00 00 3c 56 00 00 0f 06 12 03 0c 00 1c 3a 04 1b 13 15 15 03 09
+00 1c 3e 00 1b 0f 04 0a 07 0e 00 3f 5d 04 03 3a 00 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 45 61 72 74 68 51 75 61 6b 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EarthQuake
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 02 09 05 00 00 38 56 00 00 0f 06 12 03 0c 00 18 3a 04 1b 13 15 15 03 09
+00 18 3e 00 1b 0f 04 0a 07 0e 00 38 5d 04 03 3a 00 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 45 61 72 74 68 51 75 61 6b 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Earthquake
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 28
+17 0c 05 01 0e 03 43 4c 0a 0b 15 06 06 01 0e 00 40 56 07 0b 10 0b 05 01 0a
+00 40 4c 0a 03 17 07 06 04 0f 00 41 5d 00 0b 38 63 00 0c 00 67 00 04 04 00
+28 32 00 00 00 32 00 45 61 72 74 68 71 75 61 6b 65 63 63 12 32 32 00 00 0a
+00 01 00 03 00 00 00 00 00 00 00 26 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Earthquake
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+17 0c 05 01 0e 03 43 4c 0d 0b 15 06 06 01 0e 00 40 56 07 0b 10 0b 05 01 0d
+00 40 4c 0a 03 17 07 06 04 0f 00 41 5d 00 0b 38 63 00 0c 00 67 00 04 04 00
+28 32 00 00 00 32 00 45 61 72 74 68 71 75 61 6b 65 63 63 12 32 32 00 00 0d
+00 01 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Eng Siren
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 05 0f 23 04 2b 08 03 1f 1f 00 02 0f 00 04 4d 08 03 1f 1f 00 05 0f
+0a 05 5d 04 0b 15 1f 00 05 0f 05 06 63 04 03 04 0d 00 63 00 61 18 05 04 00
+63 63 28 00 00 32 00 45 6e 67 20 53 69 72 65 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Eng Siren
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 05 0f 23 00 2b 08 03 1f 1f 00 02 0f 00 00 4d 08 03 1f 1f 00 05 0f
+0a 00 5d 04 0b 15 1f 00 05 0f 05 00 63 04 03 04 0d 00 63 00 61 18 05 04 00
+63 63 28 00 00 32 00 45 6e 67 20 53 69 72 65 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Excuse Me
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1b 03 07 04 0e 4d 04 5b 04 03 12 1f 09 0a 0f 00 04 43 08 03 12 1f 0b 0a 0f
+4b 05 55 08 03 12 1f 08 0a 0f 01 05 5f 04 03 23 00 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 45 78 63 75 73 65 20 4d 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Excuse Me
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1b 03 07 04 0e 4d 00 5b 04 03 12 1f 09 0a 0f 00 00 43 08 03 12 1f 0b 0a 0f
+4b 00 55 08 03 12 1f 08 0a 0f 01 00 5f 04 03 23 00 00 00 00 02 00 02 04 00
+63 32 00 00 00 32 00 45 78 63 75 73 65 20 4d 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Exo/Bird *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 00 00 04 03 13 08 08 04 0f 00 00 51 0a 03 0d 03 01 04 0f
+00 00 5b 04 03 11 0d 1f 07 00 00 00 63 00 03 00 23 00 00 00 62 0e 04 04 00
+28 32 00 00 00 32 00 45 78 6f 2f 42 69 72 64 20 2a 63 63 63 32 32 32 00 00
+00 00 08 02 08 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Explosion
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 09 04 07 0f 00 43 5f 10 08 10 09 04 07 0f 00 44 63 0d 0e 10 09 04 07 0f
+00 43 4e 06 08 10 09 04 07 0f 00 46 2c 04 08 05 47 00 63 63 37 18 04 04 00
+63 01 63 00 00 32 00 45 78 70 6c 6f 73 69 6f 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Explosion
+** Controls: MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 09 04 07 0f 00 40 5f 10 08 10 09 04 07 0f 00 40 63 0d 0e 10 09 04 07 0f
+00 40 4e 06 08 10 09 04 07 0f 00 40 2c 04 08 05 47 00 63 63 37 18 04 04 00
+63 01 63 00 00 32 00 45 78 70 6c 6f 73 69 6f 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FaucetDrip
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 08 1f 05 0d 0a 05 39 00 03 1f 0a 1f 0a 0f 00 06 63 04 03 1f 09 1f 0a 0f
+00 02 63 08 03 1f 0e 1f 0a 0d 00 05 63 04 03 7d 39 00 63 00 70 18 02 04 00
+28 02 00 00 00 32 00 46 61 75 63 65 74 44 72 69 70 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FaucetDrip
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 08 1f 05 0d 0a 00 39 00 03 1f 0a 1f 0a 0f 00 00 63 04 03 1f 09 1f 0a 0f
+00 00 63 08 03 1f 0e 1f 0a 0d 00 00 63 04 03 7d 39 00 63 00 70 18 02 04 00
+28 02 00 00 00 32 00 46 61 75 63 65 74 44 72 69 70 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Feedback *
+** Description: A raspy sound
+** Controls: MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 00 07 0f 30 00 40 13 01 1f 14 05 08 0b 00 00 61 04 00 1f 1f 00 07 0f
+05 00 49 04 04 1c 1f 01 08 0e 00 00 63 13 06 39 1d 14 06 00 62 24 0c 04 00
+28 32 00 00 00 36 00 46 65 65 64 62 61 63 6b 20 2a 63 63 63 32 32 32 00 00
+00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Flight Sim
+** Source: Yamaha TX81Z factory preset, bank D, voice 15
+1f 1f 00 04 0f 00 00 49 04 03 1f 1f 00 01 0f 32 00 59 04 03 1f 1f 00 05 0f
+3b 40 43 10 03 0e 1f 00 06 0f 00 00 5c 0d 03 3a 39 00 00 63 6a 00 0c 0c 63
+63 32 00 00 00 32 00 46 6c 69 67 68 74 20 53 69 6d 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 2d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gizmo *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 0d 05 06 0f 1e 01 3f 10 06 1a 1a 05 05 0a 36 01 63 07 0e 0f 1a 04 05 0f
+13 01 63 00 10 1f 13 07 07 0f 00 01 63 04 0e 3b 14 00 00 00 42 18 02 04 00
+63 32 00 32 00 32 00 47 69 7a 6d 6f 20 20 20 20 2a 63 63 63 32 32 32 00 00
+00 27 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GrandPrix*
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 00 00 43 04 00 1f 1f 00 01 0f 00 00 4b 04 00 1f 1f 00 01 0f
+00 00 4e 04 06 1f 1f 00 07 0f 00 00 63 04 03 00 63 00 63 00 73 00 0c 0c 00
+28 63 00 00 00 32 00 47 72 61 6e 64 50 72 69 78 2a 63 63 63 32 32 32 00 0c
+00 20 00 04 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GuiRoach::
+** Controls: KV
+** Source: Yamaha DX11 factory preset, bank D, voice 25
+0f 00 0b 0a 0a 00 40 5b 2d 03 1f 00 00 03 0f 00 40 61 00 03 1f 00 00 03 0f
+00 40 4c 2d 03 0e 0b 0a 0f 0e 00 43 5c 00 03 3a 61 00 00 34 0a 18 04 04 00
+28 32 00 00 00 32 00 47 75 69 52 6f 61 63 68 3a 3a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GuiRoach::
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 00 0b 0a 0d 00 40 5b 2d 03 1f 00 00 03 0f 00 40 61 00 03 1f 00 00 03 0f
+00 40 4c 2d 03 0e 0b 0d 0f 0e 00 43 5c 00 03 3a 61 00 00 34 0d 18 04 04 00
+28 32 00 00 00 32 00 47 75 69 52 6f 61 63 68 3a 3a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gurgle
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 10
+1f 11 00 01 0f 47 00 44 06 06 19 0b 01 01 0f 00 40 55 00 05 01 10 00 06 0f
+18 00 63 08 00 02 03 00 06 0f 00 00 63 0c 01 3c 27 36 1b 44 7f 0c 07 04 00
+63 63 00 32 00 32 00 47 75 72 67 6c 65 20 20 20 20 63 63 63 32 32 32 1b 00
+00 00 08 70 08 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hard Rain
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 04 00 06 0f 2e 03 63 1c 02 1f 06 16 06 0f 00 04 30 31 0b 1f 15 00 06 0f
+00 05 63 04 0a 12 04 00 09 0f 00 04 5a 04 06 3a 21 00 63 00 02 00 02 04 00
+63 32 00 32 00 32 00 48 61 72 64 20 52 61 69 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hard Rain
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 04 00 06 0f 2e 00 63 1c 02 1f 06 16 06 0f 00 00 30 31 0b 1f 15 00 06 0f
+00 00 63 04 0a 12 04 00 09 0f 00 00 5a 04 06 3a 21 00 63 00 02 00 02 04 00
+63 32 00 32 00 32 00 48 61 72 64 20 52 61 69 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harley Hog
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 43 5b 09 13 1f 1f 00 02 0f 00 44 13 08 0e 1f 1f 06 09 0f
+00 45 5a 00 0b 1f 1f 00 04 0f 00 45 51 05 03 7a 63 00 63 63 34 00 00 04 00
+63 32 00 32 00 32 00 48 61 72 6c 65 79 20 48 6f 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Harley Hog
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 0f 0f 00 40 5b 09 13 1f 1f 00 02 0f 00 40 13 08 0e 1f 1f 06 09 0f
+00 40 5a 00 0b 1f 1f 00 04 0f 00 40 51 05 03 7a 63 00 63 63 34 00 00 04 00
+63 32 00 32 00 32 00 48 61 72 6c 65 79 20 48 6f 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Heart Beat
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 18 0f 0f 00 03 63 04 03 15 12 12 08 0c 00 04 34 04 03 07 13 12 08 0f
+00 04 63 00 1b 15 13 12 08 0c 00 05 63 00 03 44 00 00 00 00 02 0c 02 04 00
+28 02 00 00 00 32 00 48 65 61 72 74 20 42 65 61 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Heart Beat
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 18 0f 0f 00 00 63 04 03 15 12 12 08 0c 00 00 34 04 03 07 13 12 08 0f
+00 00 63 00 1b 15 13 12 08 0c 00 00 63 00 03 44 00 00 00 00 02 0c 02 04 00
+28 02 00 00 00 32 00 48 65 61 72 74 20 42 65 61 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Helicopter
+** Controls: MW (LFO amplitude)
+** Source: Yamaha TX81Z factory preset, bank D, voice 14
+0d 1f 00 01 0f 28 40 5c 00 03 1f 1f 00 01 0f 28 40 62 00 03 0e 1f 00 04 0f
+0a 40 63 29 03 0e 1f 00 04 0f 0a 00 63 16 03 3c 33 00 00 5b 6e 18 0c 04 00
+63 63 63 00 00 32 00 48 65 6c 69 63 6f 70 74 65 72 63 63 63 32 32 32 00 00
+00 20 08 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hi Alarm
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 04 0f 00 04 31 10 00 1f 1f 00 04 0f 00 04 43 13 06 1f 1f 00 04 0f
+00 44 37 0a 00 1f 1f 00 06 0f 00 45 63 1f 06 22 38 00 00 32 6d 18 04 04 00
+63 01 63 00 00 32 00 48 69 20 41 6c 61 72 6d 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hi Alarm
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 04 0f 00 00 31 10 00 1f 1f 00 04 0f 00 00 43 13 06 1f 1f 00 04 0f
+00 40 37 0a 00 1f 1f 00 06 0f 00 40 63 1f 06 22 38 00 00 32 6d 18 04 04 00
+63 01 63 00 00 32 00 48 69 20 41 6c 61 72 6d 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Hole in 1
+** Source: Yamaha TX81Z factory preset, bank D, voice 11
+1f 14 00 01 0b 00 40 54 11 03 15 07 00 0f 0e 2e 00 33 27 0b 14 0c 11 05 0a
+00 40 58 0d 0a 1f 12 10 0b 00 01 00 62 10 0b 3c 3a 00 63 50 5f 18 05 04 00
+63 00 00 00 00 32 00 48 6f 6c 65 20 69 6e 20 31 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: House Fly
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 05 06 04 0c 00 04 4b 1a 03 07 0c 06 04 0c 00 04 3e 1a 06 1f 1f 00 0f 0f
+00 05 3f 00 03 1f 1f 00 0f 0f 00 07 63 00 03 7c 2f 00 00 00 31 00 05 04 00
+63 63 63 00 00 32 00 48 6f 75 73 65 20 46 6c 79 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: House Fly
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 05 06 04 0c 00 00 4b 1a 03 07 0c 06 04 0c 00 00 3e 1a 06 1f 1f 00 0f 0f
+00 00 3f 00 03 1f 1f 00 0f 0f 00 00 63 00 03 7c 2f 00 00 00 31 00 05 04 00
+63 63 63 00 00 32 00 48 6f 75 73 65 20 46 6c 79 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HowlAtMoon
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 0a 06 0c 0f 0a 02 33 0f 03 12 10 06 0a 0d 00 04 3d 1c 0b 0f 09 03 09 0e
+00 04 52 0d 0b 0e 0c 09 0a 0f 00 05 5d 0c 0c 3c 19 2a 00 00 22 00 02 04 00
+28 02 00 00 00 32 00 48 6f 77 6c 41 74 4d 6f 6f 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HowlAtMoon
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 0a 06 0c 0f 0a 00 33 0f 03 12 10 06 0a 0d 00 00 3d 1c 0b 0f 09 03 09 0e
+00 00 52 0d 0b 0e 0c 09 0a 0f 00 00 5d 0c 0c 3c 19 2a 00 00 22 00 02 04 00
+28 02 00 00 00 32 00 48 6f 77 6c 41 74 4d 6f 6f 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lil'Birdie
+** Controls: KV, MW (LFO pitch), BC (LFO pitch), BC (EG amplitude), BC (voice pitch), FC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+08 0d 17 07 0f 5d 19 09 2e 0b 02 09 0a 08 05 25 1f 63 0c 1c 0c 1d 0c 0d 07
+0c 0a 4b 34 0c 1f 04 0e 02 0b 2c 00 1e 0c 08 04 63 43 20 4a 42 18 0b 00 26
+51 29 1f 51 2f 25 1b 4c 69 6c 27 42 69 72 64 69 65 00 00 00 00 00 00 2a 29
+02 5c 34 18 39 48 04 15 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lo Alarm
+** Controls: KV, MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 03 0f 00 03 31 03 00 1f 1f 00 04 0f 00 04 43 18 06 1f 1f 00 06 0f
+00 45 37 07 00 1f 1f 00 06 0f 00 44 63 07 06 52 38 00 00 27 65 00 04 04 00
+63 01 63 00 00 32 00 4c 6f 20 41 6c 61 72 6d 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Lo Alarm
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 03 0f 00 00 31 03 00 1f 1f 00 04 0f 00 00 43 18 06 1f 1f 00 06 0f
+00 40 37 07 00 1f 1f 00 06 0f 00 40 63 07 06 52 38 00 00 27 65 00 04 04 00
+63 01 63 00 00 32 00 4c 6f 20 41 6c 61 72 6d 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MT:Apr'88
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 04 00 02 0f 0f 00 44 04 03 1f 09 03 02 0f 15 01 3a 08 00 1f 00 00 0b 0f
+0c 02 44 07 06 1a 0a 00 05 0f 05 01 5c 08 13 3c 18 06 10 00 5a 0c 04 04 00
+63 32 00 00 00 32 00 4d 54 3a 41 70 72 27 38 38 20 63 63 63 32 32 32 20 00
+30 30 10 04 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MachineGun
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1a 15 12 09 0f 00 40 63 00 00 19 09 08 09 0f 00 40 54 08 03 1f 15 1f 0a 0f
+00 45 63 06 03 19 15 03 09 0f 00 45 63 00 0b 7c 40 00 63 63 74 18 02 04 00
+28 02 00 00 00 32 00 4d 61 63 68 69 6e 65 47 75 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MachineGun
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1a 15 12 09 0f 00 40 63 00 00 19 09 08 09 0f 00 40 54 08 03 1f 15 1f 0a 0f
+00 40 63 06 03 19 15 03 09 0f 00 40 63 00 0b 7c 40 00 63 63 74 18 02 04 00
+28 02 00 00 00 32 00 4d 61 63 68 69 6e 65 47 75 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MalibuNite
+** Controls: MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 13
+1f 1f 00 01 0f 00 00 63 3f 03 1f 1f 00 01 0f 00 00 63 29 03 1f 1f 00 03 0f
+00 00 63 35 03 0b 16 00 07 0f 00 40 5b 00 03 38 05 00 42 5a 6e 00 04 04 00
+63 32 00 00 00 32 00 4d 61 6c 69 62 75 4e 69 74 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Med Musak
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+07 11 00 01 09 00 45 4f 00 00 01 08 00 01 09 05 01 62 0a 03 01 07 00 01 08
+08 41 62 23 06 01 08 00 01 0a 00 43 63 00 00 3f 21 00 35 1c 6f 14 0c 04 1e
+63 32 00 00 00 32 00 4d 65 64 20 4d 75 73 61 6b 20 63 63 63 32 32 32 30 37
+20 1f 20 21 00 22 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mouse-Tom
+** Source: Yamaha DX11 factory preset, bank D, voice 18
+1f 1f 0c 07 0f 00 00 5c 32 03 1f 14 1f 09 01 00 00 63 00 0b 1f 1f 1f 0f 0f
+0c 00 3e 0b 1b 1f 1f 0e 0f 0f 00 00 5c 05 0b 3b 23 00 00 00 62 24 04 04 00
+63 32 00 00 00 32 00 4d 6f 75 73 65 2d 54 6f 6d 20 63 63 63 32 32 32 08 00
+00 03 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Mr.Mr.Noiz
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 13 03 00 00 00 5f 3d 06 14 12 13 02 00 00 01 52 05 02 17 14 13 03 00
+00 01 56 28 05 16 0b 13 0f 09 00 00 63 06 03 3b 63 00 63 00 73 10 07 04 00
+63 32 00 00 00 32 00 4d 72 2e 4d 72 2e 4e 6f 69 7a 63 63 63 32 32 32 08 00
+00 00 08 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Noise Shot
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 27
+1f 1f 13 03 00 00 00 5f 3d 06 1f 12 13 02 00 00 01 52 05 02 1f 14 13 03 00
+00 01 56 28 05 1e 0b 13 0f 09 00 00 63 06 03 3b 63 00 63 00 73 23 07 04 00
+63 32 00 00 00 32 00 4e 6f 69 73 65 20 53 68 6f 74 63 63 63 32 32 32 08 00
+00 00 08 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ofthewall*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 08 00 07 00 00 00 63 00 03 08 1f 00 09 0f 00 00 43 00 05 0b 1f 00 05 0f
+00 01 63 0a 06 0c 1f 00 06 0f 00 02 63 04 00 64 4f 2e 63 63 62 18 02 04 00
+28 63 00 00 00 32 00 4f 66 74 68 65 77 61 6c 6c 2a 63 63 63 32 32 32 08 20
+08 30 00 50 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OldClock
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 02 04 0f 00 43 3c 21 0e 1f 19 08 03 0f 63 07 63 17 08 1f 1f 0a 04 0a
+5a 07 63 0a 0a 1f 1f 07 03 0f 00 04 63 0a 08 3b 0e 00 00 00 56 0f 04 04 00
+63 37 00 00 00 32 00 4f 6c 64 43 6c 6f 63 6b 20 20 63 63 63 32 32 32 04 00
+08 08 08 1b 07 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OutOfTune
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0f 03 09 06 0e 0a 03 3c 00 03 1f 03 03 06 0d 00 04 60 04 02 1f 04 02 06 0d
+00 04 62 0a 03 1f 02 02 06 0d 00 06 63 04 03 3d 10 00 59 00 52 18 02 04 00
+28 02 00 00 00 32 00 4f 75 74 4f 66 54 75 6e 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OutOfTune
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0f 03 09 06 0e 0a 00 3c 00 03 1f 03 03 06 0d 00 00 60 04 02 1f 04 02 06 0d
+00 00 62 0a 03 1f 02 02 06 0d 00 00 63 04 03 3d 10 00 59 00 52 18 02 04 00
+28 02 00 00 00 32 00 4f 75 74 4f 66 54 75 6e 65 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Passing By
+** Source: Yamaha DX11 factory preset, bank D, voice 27
+1f 1f 00 01 0f 00 00 55 04 03 1f 1f 00 01 0f 00 00 52 0a 03 02 1f 1f 06 0f
+00 00 5a 04 0b 02 1f 1f 06 0f 00 00 5a 04 0b 7c 0a 00 00 00 71 0c 04 04 00
+28 32 00 00 00 32 00 50 61 73 73 69 6e 67 20 42 79 4a 02 1b 32 00 00 00 10
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Passing By
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 00 00 55 04 03 1f 1f 00 01 0f 00 00 52 0a 03 02 1f 1f 06 0f
+00 00 5a 04 0b 02 1f 1f 06 0f 00 00 5a 04 0b 7c 0d 00 00 00 71 0c 04 04 00
+28 32 00 00 00 32 00 50 61 73 73 69 6e 67 20 42 79 4a 02 1b 32 00 00 00 10
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pull Over
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 44 2b 08 03 1f 1f 00 09 0f 00 44 4a 08 03 10 1f 00 0f 0f
+00 05 5d 04 03 15 1f 00 09 0f 00 05 63 04 03 04 15 00 63 63 76 24 02 04 00
+28 02 00 00 00 32 00 50 75 6c 6c 20 4f 76 65 72 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pull Over
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 0f 0f 00 40 2b 08 03 1f 1f 00 09 0f 00 40 4a 08 03 10 1f 00 0f 0f
+00 00 5d 04 03 15 1f 00 09 0f 00 00 63 04 03 04 15 00 63 63 76 24 02 04 00
+28 02 00 00 00 32 00 50 75 6c 6c 20 4f 76 65 72 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: R2-D2 *
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 00 00 04 03 0d 1f 00 09 0f 00 00 00 04 03 1d 1f 00 09 0f
+00 00 63 3f 03 1d 1f 00 09 0f 00 00 63 31 03 44 2e 00 63 00 73 24 0c 04 00
+28 63 00 00 00 32 00 52 32 2d 44 32 20 20 20 20 2a 63 63 63 32 32 32 00 00
+00 00 00 50 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Racing Car
+** Controls: MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 19
+1f 1f 00 02 0f 00 00 47 00 03 1f 1f 00 01 0f 00 00 35 04 03 1f 1f 00 03 0f
+00 00 5b 01 03 15 1f 00 03 0f 00 00 63 04 03 3a 05 00 3c 00 62 18 0c 04 00
+63 32 00 00 00 32 00 52 61 63 69 6e 67 20 43 61 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RADIATION?
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 31
+03 03 00 01 0f 00 40 51 28 03 15 09 00 03 0f 00 00 61 0c 03 0b 05 00 02 0f
+00 40 33 34 03 12 18 00 06 0e 00 40 5a 30 03 7b 32 00 06 56 25 00 04 04 00
+28 32 00 00 00 32 00 52 41 44 49 41 54 49 4f 4e 3f 63 63 63 32 32 32 09 09
+08 02 0b 0e 08 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rain Storm
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 03 0f 22 04 63 0c 08 1f 00 00 05 0f 24 44 2c 08 00 1f 00 00 03 0f
+00 05 63 04 06 1f 00 00 04 0f 00 04 5a 01 0e 3a 55 00 2d 00 7e 00 04 04 00
+63 32 00 32 00 32 00 52 61 69 6e 20 53 74 6f 72 6d 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Rain Storm
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 03 0f 22 00 63 0c 08 1f 00 00 05 0f 24 40 2c 08 00 1f 00 00 03 0f
+00 00 63 04 06 1f 00 00 04 0f 00 00 5a 01 0e 3a 55 00 2d 00 7e 00 04 04 00
+63 32 00 32 00 32 00 52 61 69 6e 20 53 74 6f 72 6d 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Refs.Wisl*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1d 15 00 08 0d 00 00 4b 34 03 12 0c 00 06 0f 00 00 5d 04 03 1f 1f 00 05 0f
+00 00 00 04 0b 0f 0c 00 08 0f 00 01 63 20 03 12 51 00 00 00 72 18 07 04 00
+28 63 00 00 00 32 00 52 65 66 73 2e 57 69 73 6c 2a 63 63 63 32 32 32 0d 35
+08 0d 00 00 0c 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Repeater.1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 18 06 0a 0f 00 78 5f 00 04 16 04 06 07 09 00 58 42 04 06 16 04 06 07 09
+00 58 63 04 00 16 04 06 07 09 00 78 63 04 03 6c 29 00 00 63 34 18 02 04 00
+63 32 00 00 00 32 00 52 65 70 65 61 74 65 72 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Repeater.2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 18 06 0a 0f 00 7b 47 10 04 16 04 06 07 09 00 5b 37 10 06 16 04 06 07 09
+00 5d 61 04 00 16 04 06 07 09 00 7c 59 10 03 3a 29 3d 54 63 74 18 02 04 00
+63 32 00 00 00 32 00 52 65 70 65 61 74 65 72 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Repeater.2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 18 06 0a 0f 00 78 47 10 04 16 04 06 07 09 00 58 37 10 06 16 04 06 07 09
+00 58 61 04 00 16 04 06 07 09 00 78 59 10 03 3a 29 3d 54 63 74 18 02 04 00
+63 32 00 00 00 32 00 52 65 70 65 61 74 65 72 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Repeater.3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+13 0f 0a 0f 0f 00 79 58 16 04 16 09 06 0f 0f 00 5b 49 10 06 16 09 06 0f 0f
+00 5d 61 04 00 16 09 06 0f 0f 00 7d 59 04 03 7a 33 00 00 63 34 18 02 04 00
+63 32 00 00 00 32 00 52 65 70 65 61 74 65 72 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Repeater.3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+13 0f 0a 0f 0f 00 78 58 16 04 16 09 06 0f 0f 00 58 49 10 06 16 09 06 0f 0f
+00 58 61 04 00 16 09 06 0f 0f 00 78 59 04 03 7a 33 00 00 63 34 18 02 04 00
+63 32 00 00 00 32 00 52 65 70 65 61 74 65 72 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Repeater.4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 13 07 07 00 7b 47 08 03 1f 06 1f 04 00 00 5b 4c 04 04 15 06 0c 06 07
+00 5d 63 04 00 1f 06 1f 04 00 00 7d 63 04 06 6c 40 00 00 63 34 18 02 04 00
+63 32 00 00 00 32 00 52 65 70 65 61 74 65 72 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Repeater.4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 13 07 07 00 78 47 08 03 1f 06 1f 04 00 00 58 4c 04 04 15 06 0c 06 07
+00 58 63 04 00 1f 06 1f 04 00 00 78 63 04 06 6c 40 00 00 63 34 18 02 04 00
+63 32 00 00 00 32 00 52 65 70 65 61 74 65 72 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Repeater.5
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 04 07 0f 00 7b 52 08 03 03 1b 04 07 0f 00 5c 56 04 03 13 1b 04 07 0f
+00 5d 51 08 03 1b 0f 04 07 0e 00 7e 63 04 03 45 25 00 00 63 35 18 02 04 00
+63 32 00 00 00 32 00 52 65 70 65 61 74 65 72 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Repeater.5
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 04 07 0f 00 78 52 08 03 03 1b 04 07 0f 00 58 56 04 03 13 1b 04 07 0f
+00 58 51 08 03 1b 0f 04 07 0e 00 78 63 04 03 45 25 00 00 63 35 18 02 04 00
+63 32 00 00 00 32 00 52 65 70 65 61 74 65 72 2e 35 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+* SUBCATEGORY Noises2
+
+** Name: Ringing..1
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 1f 00 03 0f 00 00 34 1a 03 1f 1f 00 02 0f 00 00 3e 19 03 1f 1f 00 02 0f
+00 00 39 1a 03 16 1f 00 06 0f 00 40 63 19 03 52 58 00 00 32 65 00 05 04 00
+63 63 63 00 00 32 00 52 69 6e 67 69 6e 67 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ringing..2
+** Controls: MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 1f 00 03 0f 00 00 1c 00 03 1f 1f 00 02 0f 00 00 3e 1f 03 1f 1f 00 02 0f
+00 00 39 04 03 16 1f 00 06 0f 00 40 63 1f 03 52 3b 00 00 3c 65 00 05 04 00
+63 63 63 00 00 32 00 52 69 6e 67 69 6e 67 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RiseDecent
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 06 06 04 0e 00 44 43 0d 03 0c 06 06 04 0e 00 44 63 08 03 1f 06 06 04 0e
+00 46 5b 04 03 1f 06 06 04 0e 00 45 63 00 03 7d 1e 00 48 3c 67 18 02 04 00
+28 02 00 00 00 32 00 52 69 73 65 44 65 63 65 6e 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RiseDecent
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0a 06 06 04 0e 00 40 43 0d 03 0c 06 06 04 0e 00 40 63 08 03 1f 06 06 04 0e
+00 40 5b 04 03 1f 06 06 04 0e 00 40 63 00 03 7d 1e 00 48 3c 67 18 02 04 00
+28 02 00 00 00 32 00 52 69 73 65 44 65 63 65 6e 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Description: An interesting use of portamento
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: GLIB (Michael Kesti and others)
+1f 17 03 06 0f 52 07 5c 08 03 1f 1f 05 09 0b 00 06 63 10 03 1f 09 00 09 00
+00 03 62 08 03 1f 0b 04 09 0b 00 07 63 04 03 02 1e 09 04 00 62 0c 07 02 03
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+0c 04 02 01 09 08 01 43 04 0b 11 07 02 07 09 00 01 50 04 03 12 07 02 07 09
+00 01 35 04 0b 0f 08 02 07 09 36 02 63 04 0b 30 1f 1c 13 00 52 18 07 04 00
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 02 03 06 00 52 03 50 04 03 1f 0b 00 09 0c 00 00 4e 04 03 1f 06 00 09 01
+00 00 5f 04 03 0b 09 04 09 0a 00 03 63 08 03 3c 1e 09 04 00 62 0c 07 04 00
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 1f 00 00 0f 00 00 31 04 03 1f 1f 00 00 0f 21 00 3c 04 06 1f 1f 00 00 0f
+1b 00 42 04 00 0b 1f 00 06 0f 00 00 60 04 03 3a 20 00 00 00 62 18 0c 04 00
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 1f 00 00 0f 00 00 32 08 03 1f 1f 00 00 0f 21 00 4e 04 06 1f 1f 00 00 0f
+1b 00 40 04 00 0b 1f 00 06 0f 00 00 5a 04 03 3a 20 00 00 00 62 18 0c 04 00
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 02 03 06 00 0a 43 52 08 1b 1f 0a 00 09 0c 00 04 63 08 03 1f 08 02 09 0a
+00 05 60 04 03 1f 1c 04 09 0c 00 07 63 04 03 3c 1e 09 03 00 62 18 07 04 00
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 17 03 06 0f 52 07 5c 08 03 1f 1f 05 09 0b 00 06 63 10 03 1f 09 00 09 00
+00 03 62 08 03 1f 0b 04 09 0b 00 07 63 04 03 02 1e 09 04 00 62 0c 07 0a 03
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 02 03 06 00 52 03 50 04 03 1f 0b 00 09 0c 00 00 4e 04 04 1f 06 00 09 01
+00 00 5f 04 03 1f 1c 04 09 0a 00 03 63 08 03 3c 1e 09 04 00 62 0c 02 04 00
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 02 03 06 00 52 03 50 04 03 1f 0b 00 09 0c 00 00 4e 04 04 1f 06 00 09 01
+00 00 5f 04 03 1f 1c 04 09 0a 00 03 63 08 03 3c 1e 09 04 00 62 0c 02 0a 07
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: RubberBand
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: DX100 GLIB patch (Michael Kesti and others)
+1f 02 03 06 00 0e 03 55 04 1b 1f 0b 00 09 0c 00 00 4e 04 04 1f 06 00 09 01
+00 00 5f 04 03 1f 1c 04 09 0a 00 03 63 08 03 3c 1e 09 04 00 62 0c 02 05 00
+63 32 00 32 00 32 00 52 75 62 62 65 72 42 61 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SCM Writer
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 0a 44 63 3f 03 1f 0d 06 04 0f 00 44 55 20 1b 1f 1f 00 03 0f
+00 44 63 35 03 1f 0f 09 07 00 00 44 63 3f 1b 3b 05 00 00 58 66 18 02 04 00
+28 02 00 00 00 32 00 53 43 4d 20 57 72 69 74 65 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SCM Writer
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 0a 40 63 3f 03 1f 0d 06 04 0f 00 40 55 20 1b 1f 1f 00 03 0f
+00 40 63 35 03 1f 0f 09 07 00 00 40 63 3f 1b 3b 05 00 00 58 66 18 02 04 00
+28 02 00 00 00 32 00 53 43 4d 20 57 72 69 74 65 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SCM Writer
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0f 0a 40 63 3f 03 1f 0d 06 04 0f 00 40 55 20 1b 1f 1f 00 03 0f
+00 40 63 35 03 1f 0f 09 07 00 00 40 63 3f 1b 3b 05 00 00 58 66 18 02 04 00
+28 02 00 00 00 32 00 53 43 4d 20 57 72 69 74 65 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Saron Gam
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1d 09 05 06 0a 00 05 50 19 0e 1f 0c 06 06 0c 00 05 5d 06 16 1f 0d 08 03 0f
+00 05 5e 11 1e 1f 11 07 06 0f 00 02 63 04 10 37 52 00 07 00 62 18 04 04 00
+28 32 00 00 00 32 00 53 61 72 6f 6e 20 47 61 6d 20 63 63 63 32 32 32 00 0f
+00 0c 00 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Shore Wave
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+10 0f 00 0d 0d 00 00 63 20 03 17 0e 00 0d 0f 00 00 63 20 03 17 0f 00 0a 0f
+00 00 63 3c 03 03 09 00 0f 00 00 00 52 3f 03 02 23 00 00 00 62 30 04 04 00
+28 32 00 00 00 32 00 53 68 6f 72 65 20 57 61 76 65 63 63 63 32 32 32 0c 06
+00 12 0b 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Shore Wv2
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+10 0f 00 07 0d 00 00 63 20 03 17 0e 00 07 0f 00 00 63 20 03 17 0f 00 04 0f
+00 00 63 3c 03 03 05 00 09 00 00 00 52 3f 03 02 23 00 00 00 62 30 04 04 00
+28 32 00 00 00 32 00 53 68 6f 72 65 20 57 76 32 20 63 63 63 32 32 32 0c 06
+00 12 0b 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sick Siren
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0e 1f 00 0f 0f 00 43 2b 08 03 0e 1f 00 09 0f 00 45 4a 08 03 10 1f 00 0f 0f
+00 45 5d 04 03 15 1f 00 09 0f 00 45 63 04 03 04 0d 00 00 63 64 24 02 04 00
+28 02 00 00 00 32 00 53 69 63 6b 20 53 69 72 65 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sick Siren
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 1f 00 0f 0f 00 40 2b 08 03 0e 1f 00 09 0f 00 40 4a 08 03 10 1f 00 0f 0f
+00 40 5d 04 03 15 1f 00 09 0f 00 40 63 04 03 04 0d 00 00 63 64 24 02 04 00
+28 02 00 00 00 32 00 53 69 63 6b 20 53 69 72 65 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space BUG?
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 26
+1f 1f 00 01 0f 06 00 63 01 1b 1f 1f 00 0f 0f 02 40 63 01 1b 0f 15 00 04 0f
+00 40 56 00 1b 19 1f 00 0a 0f 63 40 53 00 1b 7c 1f 00 2a 3c 3c 00 04 04 00
+28 32 00 00 00 32 00 53 70 61 63 65 20 42 55 47 3f 63 63 63 32 32 32 0f 06
+00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space BUG?
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 06 00 63 01 1b 1f 1f 00 0f 0f 02 40 63 01 1b 0f 15 00 04 0f
+00 40 56 00 1b 19 1f 00 0d 0f 63 40 53 00 1b 7c 1f 00 2a 3c 3c 00 04 04 00
+28 32 00 00 00 32 00 53 70 61 63 65 20 42 55 47 3f 63 63 63 32 32 32 0f 06
+00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space Gong
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 30
+16 0a 0c 06 0f 03 00 53 04 08 0e 09 03 02 0f 03 00 59 07 0e 0a 06 05 04 0f
+00 40 5a 00 00 14 08 05 04 08 00 40 5a 00 06 3c 0a 08 2d 3c 36 1b 04 04 00
+28 32 00 00 00 32 00 53 70 61 63 65 20 47 6f 6e 67 5e 63 12 29 32 15 00 16
+00 20 00 15 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space Gong
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+16 0d 0c 06 0f 03 00 53 04 08 0e 09 03 02 0f 03 00 59 07 0e 0a 06 05 04 0f
+00 40 5a 00 00 14 08 05 04 08 00 40 5a 00 06 3c 0a 08 2d 3c 36 1b 04 04 00
+28 32 00 00 00 32 00 53 70 61 63 65 20 47 6f 6e 67 5e 63 12 29 32 15 00 16
+00 20 00 15 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space Gun
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 08 1f 05 0d 0a 02 39 00 03 1f 0a 1f 0a 0f 00 05 63 04 03 1f 09 1f 0a 0f
+00 04 63 08 03 1f 04 1f 0a 0d 00 04 63 04 03 7d 39 00 63 00 70 18 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 20 47 75 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space Gun
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 08 1f 05 0d 0a 00 39 00 03 1f 0a 1f 0a 0f 00 00 63 04 03 1f 09 1f 0a 0f
+00 00 63 08 03 1f 04 1f 0a 0d 00 00 63 04 03 7d 39 00 63 00 70 18 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 20 47 75 6e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space Talk
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 21
+05 1f 01 01 0f 60 44 63 0b 03 06 1f 03 01 0f 02 42 63 06 03 0b 1f 04 01 0f
+03 42 63 09 03 08 1f 02 09 0f 01 42 63 04 04 05 32 00 63 00 6d 18 05 04 3c
+63 32 00 00 00 32 00 53 70 61 63 65 20 54 61 6c 6b 63 63 63 32 32 32 00 70
+00 40 00 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space Vibe
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 22
+19 0f 0f 07 0f 05 00 62 0d 00 19 00 0f 07 0f 05 01 63 04 00 19 00 0f 07 0f
+05 02 63 0d 06 1f 00 06 02 0f 05 01 63 04 06 47 23 00 4b 00 71 1e 0c 04 00
+63 32 00 00 00 32 00 53 70 61 63 65 20 56 69 62 65 63 63 63 32 32 32 00 10
+00 00 00 50 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space....1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+04 0c 00 03 0f 00 03 57 2d 06 04 09 00 03 0f 00 03 59 04 01 06 09 00 04 0f
+00 03 63 04 05 06 09 00 04 0f 00 04 63 00 01 6c 23 21 00 00 02 18 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space....1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+04 0c 00 03 0f 00 00 57 2d 06 04 09 00 03 0f 00 00 59 04 01 06 09 00 04 0f
+00 00 63 04 05 06 09 00 04 0f 00 00 63 00 01 6c 23 21 00 00 02 18 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 07 0f 00 41 57 04 03 03 1f 00 04 0f 00 43 59 1c 05 09 1f 00 06 0f
+00 43 63 04 03 0c 1f 00 04 0f 00 45 63 13 00 2c 05 00 2f 63 14 18 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space....2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 07 0f 00 40 57 04 03 03 1f 00 04 0f 00 40 59 1c 05 09 1f 00 06 0f
+00 40 63 04 03 0c 1f 00 04 0f 00 40 63 13 00 2c 05 00 2f 63 14 18 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space....3
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+19 12 06 06 00 00 42 63 04 13 04 09 1f 04 04 00 43 4a 0b 04 15 15 09 0a 0f
+00 43 5d 04 03 1c 09 04 04 04 00 44 5f 04 00 0c 2b 41 0b 5a 76 18 02 04 00
+63 63 00 00 00 32 00 53 70 61 63 65 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space....3
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+19 12 06 06 00 00 40 63 04 13 04 09 1f 04 04 00 40 4a 0b 04 15 15 09 0a 0f
+00 40 5d 04 03 1c 09 04 04 04 00 40 5f 04 00 0c 2b 41 0b 5a 76 18 02 04 00
+63 63 00 00 00 32 00 53 70 61 63 65 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space....4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 15 04 00 00 02 46 13 0c 06 04 07 04 00 00 04 46 04 0b 14 1d 15 06 00
+00 04 63 08 0c 19 03 0c 04 00 00 04 5f 04 0b 4c 63 00 63 00 72 18 02 04 00
+63 63 00 00 00 32 00 53 70 61 63 65 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Space....4
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 15 04 00 00 00 46 13 0c 06 04 07 04 00 00 00 46 04 0b 14 1d 15 06 00
+00 00 63 08 0c 19 03 0c 04 00 00 00 5f 04 0b 4c 63 00 63 00 72 18 02 04 00
+63 63 00 00 00 32 00 53 70 61 63 65 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpaceBirds
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 06 00 0a 0e 0a 43 39 0d 00 1f 1f 00 09 0f 00 45 63 29 03 1f 0b 00 0a 0f
+00 44 36 08 06 0b 0b 00 0b 0f 00 45 63 00 03 07 25 00 42 5a 6e 00 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 42 69 72 64 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpaceBirds
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 06 00 0a 0e 0a 40 39 0d 00 1f 1f 00 09 0f 00 40 63 29 03 1f 0b 00 0a 0f
+00 40 36 08 06 0b 0b 00 0b 0f 00 40 63 00 03 07 25 00 42 5a 6e 00 02 04 00
+28 02 00 00 00 32 00 53 70 61 63 65 42 69 72 64 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Spc Midiot
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank D, voice 9
+04 07 00 09 0d 22 00 4b 3d 08 14 14 00 05 0b 24 41 52 08 00 15 03 00 06 06
+00 01 60 14 06 05 15 00 08 0f 00 04 63 00 06 7b 1f 0d 0e 1e 0e 18 0c 04 00
+63 32 00 32 00 32 00 53 70 63 20 4d 69 64 69 6f 74 63 63 63 32 32 32 08 70
+00 00 00 10 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SteelPan *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+14 0c 07 04 0f 27 05 52 0a 08 14 07 08 03 0f 2b 03 52 09 0e 16 07 09 06 0f
+00 02 63 04 0e 11 07 09 05 0f 00 02 63 04 16 04 19 00 0a 63 52 18 02 04 00
+28 32 00 00 00 32 00 53 74 65 65 6c 50 61 6e 20 2a 63 63 63 32 32 32 00 01
+00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Storm Wind
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 17
+12 08 01 03 05 00 01 43 0a 00 14 0b 04 01 09 00 01 60 11 00 14 07 01 03 05
+00 01 63 00 00 0f 06 00 01 0c 00 02 63 00 00 33 63 00 63 00 73 00 05 04 00
+63 63 63 00 00 32 00 53 74 6f 72 6d 20 57 69 6e 64 63 63 63 32 32 32 00 50
+00 10 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: TAP TAP<<<
+** Source: Yamaha DX11 factory preset, bank D, voice 29
+12 09 00 01 0f 06 00 3a 00 1b 12 09 00 01 0f 02 00 61 00 1b 17 08 00 01 0f
+00 00 33 00 1b 15 15 00 0a 0f 00 40 53 3e 1b 3a 1c 00 00 63 6e 00 04 04 00
+28 63 00 00 00 32 00 54 41 50 20 54 41 50 3c 3c 3c 63 63 63 32 32 32 00 00
+00 00 00 00 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: TAP TAP<<<
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 09 00 01 0f 06 00 3a 00 1b 12 09 00 01 0f 02 00 61 00 1b 17 08 00 01 0f
+00 00 33 00 1b 15 15 00 0d 0f 00 40 53 3e 1b 3a 1c 00 00 63 6e 00 04 04 00
+28 63 00 00 00 32 00 54 41 50 20 54 41 50 3c 3c 3c 63 63 63 32 32 32 00 00
+00 00 00 00 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Telephone*
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 0f 0f 00 40 4b 30 03 1f 1f 00 06 0f 00 40 48 28 03 1f 1f 00 06 0f
+00 00 63 30 03 1f 1f 00 06 0f 00 00 63 24 03 7c 3a 00 00 63 09 18 04 04 00
+28 32 00 00 00 32 00 54 65 6c 65 70 68 6f 6e 65 2a 63 63 63 32 32 32 0c 0a
+0c 05 0b 16 0e 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Terror!
+** Controls: MW (LFO pitch)
+** Source: Yamaha DX11 factory preset, bank D, voice 23
+0c 1f 00 03 0f 20 00 2e 31 03 1f 1f 00 03 0f 00 00 3b 08 06 0a 1f 00 03 0f
+2a 00 34 08 00 12 1f 00 04 0f 00 00 54 00 03 03 63 00 23 00 63 18 04 04 00
+28 32 00 00 00 32 00 54 65 72 72 6f 72 21 20 20 20 63 24 11 2d 32 25 04 6f
+00 20 00 40 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Terror!
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 1f 00 03 0f 20 00 2e 31 03 1f 1f 00 03 0f 00 00 3b 08 06 0d 1f 00 03 0f
+2a 00 34 08 00 12 1f 00 04 0f 00 00 54 00 03 03 63 00 23 00 63 18 04 04 00
+28 32 00 00 00 32 00 54 65 72 72 6f 72 21 20 20 20 63 24 11 2d 32 25 04 6f
+00 20 00 40 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Traffic..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 02 0f 00 02 42 02 03 1f 1f 00 01 0f 00 04 32 0a 03 1f 1f 00 03 0f
+00 05 46 01 03 15 1f 00 03 0f 00 05 63 04 03 3a 47 00 3c 00 62 18 0c 04 0e
+63 32 00 00 00 32 00 54 72 61 66 66 69 63 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Traffic..1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 02 0f 00 00 42 02 03 1f 1f 00 01 0f 00 00 32 0a 03 1f 1f 00 03 0f
+00 00 46 01 03 15 1f 00 03 0f 00 00 63 04 03 3a 47 00 3c 00 62 18 0c 04 0e
+63 32 00 00 00 32 00 54 72 61 66 66 69 63 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Traffic..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 02 0f 00 04 48 06 03 1f 1f 00 01 0f 00 05 32 07 03 1f 1f 00 03 0f
+00 05 46 00 03 15 1f 00 03 0f 00 05 63 04 03 3a 15 00 5f 00 73 18 0c 04 0e
+63 32 00 00 00 32 00 54 72 61 66 66 69 63 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Traffic..2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 02 0f 00 00 48 06 03 1f 1f 00 01 0f 00 00 32 07 03 1f 1f 00 03 0f
+00 00 46 00 03 15 1f 00 03 0f 00 00 63 04 03 3a 15 00 5f 00 73 18 0c 04 0e
+63 32 00 00 00 32 00 54 72 61 66 66 69 63 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tug Boat
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+15 16 00 01 0f 0a 03 00 06 03 0f 0d 00 01 0f 00 04 3b 08 03 1f 07 00 03 0c
+00 06 3c 06 03 13 16 00 07 0f 00 06 63 04 03 7a 0c 00 00 00 40 18 02 04 00
+28 02 00 00 00 32 00 54 75 67 20 42 6f 61 74 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tug Boat
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 16 00 01 0f 0a 00 00 06 03 0f 0d 00 01 0f 00 00 3b 08 03 1f 07 00 03 0c
+00 00 3c 06 03 13 16 00 07 0f 00 00 63 04 03 7a 0c 00 00 00 40 18 02 04 00
+28 02 00 00 00 32 00 54 75 67 20 42 6f 61 74 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Tug Boat
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+15 16 00 00 0f 0a 00 00 06 03 0f 0d 00 00 0f 00 00 3b 08 03 1f 07 00 03 0c
+00 00 3c 06 03 13 16 00 07 0f 00 00 63 04 03 7a 0c 00 00 00 40 18 02 04 00
+28 02 00 00 00 32 00 54 75 67 20 42 6f 61 74 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Typwriter*
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 05 00 07 00 00 00 3e 00 03 1f 1f 00 03 0f 00 00 4d 24 03 1f 1f 00 07 0f
+00 00 59 18 03 1f 11 00 09 00 00 41 63 38 03 3b 4a 00 00 00 0d 18 02 04 00
+28 63 00 00 00 32 00 54 79 70 77 72 69 74 65 72 2a 63 63 63 32 32 32 08 70
+0c 02 08 04 09 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: UFO Decent
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 06 00 05 0e 0a 43 39 0d 00 1f 1f 00 01 0f 00 43 63 29 03 1f 0b 00 0a 0f
+00 45 36 08 06 0b 0b 00 07 0f 00 45 63 00 03 38 05 00 42 5a 6e 18 02 04 00
+28 02 00 00 00 32 00 55 46 4f 20 44 65 63 65 6e 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: UFO Decent
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 06 00 05 0e 0a 40 39 0d 00 1f 1f 00 01 0f 00 40 63 29 03 1f 0b 00 0a 0f
+00 40 36 08 06 0b 0b 00 07 0f 00 40 63 00 03 38 05 00 42 5a 6e 18 02 04 00
+28 02 00 00 00 32 00 55 46 4f 20 44 65 63 65 6e 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: UFO Decent
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+10 06 00 05 0e 0a 40 39 0d 00 1f 1f 00 00 0f 00 40 63 29 03 1f 0b 00 0a 0f
+00 40 36 08 06 0b 0b 00 07 0f 00 40 63 00 03 38 05 00 42 5a 6e 18 02 04 00
+28 02 00 00 00 32 00 55 46 4f 20 44 65 63 65 6e 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Uzzie
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 06 08 07 0f 0a 43 63 3f 03 1f 04 00 06 0f 00 45 63 29 03 1f 09 00 06 0f
+00 45 47 35 03 1f 0a 00 07 0f 00 45 63 00 03 12 44 00 00 63 04 18 02 04 00
+28 02 00 00 00 32 00 20 20 55 7a 7a 69 65 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Uzzie
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 08 07 0f 0a 40 63 3f 03 1f 04 00 06 0f 00 40 63 29 03 1f 09 00 06 0f
+00 40 47 35 03 1f 0a 00 07 0f 00 40 63 00 03 12 44 00 00 63 04 18 02 04 00
+28 02 00 00 00 32 00 20 20 55 7a 7a 69 65 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Water *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+06 00 06 04 0f 00 40 44 18 00 08 08 07 07 0f 00 00 63 04 06 06 07 08 07 0f
+00 00 5a 05 06 09 08 04 05 0f 00 03 63 03 00 7f 43 00 63 63 7b 18 02 04 00
+63 32 00 00 00 32 00 57 61 74 65 72 20 20 20 20 2a 63 63 63 32 32 32 00 08
+00 38 00 01 00 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 0a 43 63 3f 03 1f 1f 00 01 0f 00 43 63 29 03 1f 1f 00 03 0f
+00 45 63 35 03 0b 0b 00 07 0f 00 45 63 00 03 38 06 00 42 5a 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....1
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 0a 40 63 3f 03 1f 1f 00 01 0f 00 40 63 29 03 1f 1f 00 03 0f
+00 40 63 35 03 0b 0b 00 07 0f 00 40 63 00 03 38 06 00 42 5a 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....1
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0f 0a 40 63 3f 03 1f 1f 00 00 0f 00 40 63 29 03 1f 1f 00 03 0f
+00 40 63 35 03 0b 0b 00 07 0f 00 40 63 00 03 38 06 00 42 5a 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 0a 43 63 3f 03 1f 1f 00 01 0f 00 43 63 29 03 1f 1f 00 03 0f
+00 45 63 35 03 04 0b 00 07 0f 00 45 63 00 03 38 04 00 42 5a 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 0a 40 63 3f 03 1f 1f 00 01 0f 00 40 63 29 03 1f 1f 00 03 0f
+00 40 63 35 03 04 0b 00 07 0f 00 40 63 00 03 38 04 00 42 5a 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....2
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0f 0a 40 63 3f 03 1f 1f 00 00 0f 00 40 63 29 03 1f 1f 00 03 0f
+00 40 63 35 03 04 0b 00 07 0f 00 40 63 00 03 38 04 00 42 5a 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 0a 45 63 3f 03 1f 1f 00 01 0f 00 44 63 29 03 1f 1f 00 03 0f
+00 45 63 35 03 08 0b 00 07 0f 00 45 63 00 03 38 05 00 00 58 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 0a 40 63 3f 03 1f 1f 00 01 0f 00 40 63 29 03 1f 1f 00 03 0f
+00 40 63 35 03 08 0b 00 07 0f 00 40 63 00 03 38 05 00 00 58 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....3
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0f 0a 40 63 3f 03 1f 1f 00 00 0f 00 40 63 29 03 1f 1f 00 03 0f
+00 40 63 35 03 08 0b 00 07 0f 00 40 63 00 03 38 05 00 00 58 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 33 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....4
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 1f 00 01 0f 0a 43 63 3f 03 1f 1f 00 01 0f 00 45 00 29 03 0a 1f 00 03 0f
+00 46 63 35 03 0b 0b 00 07 0f 00 46 01 00 03 3e 05 00 42 55 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....4
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 00 01 0f 0a 02 63 08 03 1f 1f 00 01 0f 00 04 63 0a 03 1f 1f 00 03 0f
+00 04 63 08 03 0c 0a 09 07 0e 00 05 63 00 03 38 23 00 00 00 62 00 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....4
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 1f 00 01 0f 0a 40 63 3f 03 1f 1f 00 01 0f 00 40 00 29 03 0a 1f 00 03 0f
+0f 40 63 35 03 0b 0b 00 07 0f 00 40 01 00 03 3e 05 00 42 55 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....4
+** Controls: MW (LFO pitch)
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1e 1f 00 00 0f 0a 40 63 3f 03 1f 1f 00 00 0f 00 40 00 29 03 0a 1f 00 03 0f
+0f 40 63 35 03 0b 0b 00 07 0f 00 40 01 00 03 3e 05 00 42 55 66 18 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....4
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 00 01 0f 0a 00 63 08 03 1f 1f 00 01 0f 00 00 63 0a 03 1f 1f 00 03 0f
+00 00 63 08 03 0c 0a 09 07 0e 00 00 63 00 03 38 23 00 00 00 62 00 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Waves....4
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+1f 1f 00 00 0f 0a 00 63 08 03 1f 1f 00 00 0f 00 00 63 0a 03 1f 1f 00 03 0f
+00 00 63 08 03 0c 0a 09 07 0e 00 00 63 00 03 38 23 00 00 00 62 00 02 04 00
+28 02 00 00 00 32 00 57 61 76 65 73 2e 2e 2e 2e 34 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Wind *
+** Controls: KV, MW (LFO pitch), BC (voice pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 13 01 00 00 00 63 21 06 1f 05 13 01 00 00 00 00 00 02 1f 00 13 01 00
+00 00 40 28 05 06 08 00 02 0e 00 01 63 05 03 3b 63 00 63 00 73 24 0c 04 00
+63 32 00 00 00 53 00 57 69 6e 64 20 20 20 20 20 2a 63 63 63 32 32 32 08 00
+00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: >>WOW<<
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank D, voice 7
+1f 0c 0d 08 0a 00 01 45 04 03 1f 10 00 04 0f 00 00 4c 00 03 0f 04 02 0a 0a
+00 01 55 00 03 1f 1f 00 0c 0f 00 02 63 04 03 39 23 00 00 00 62 0c 02 04 00
+63 32 00 32 00 32 00 3e 3e 57 4f 57 3c 3c 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WaterGlass
+** Controls: KV
+** Source: Yamaha TX81Z factory preset, bank D, voice 5
+1f 1f 00 05 0f 00 00 41 32 03 1f 14 10 05 05 01 02 63 07 03 1f 0b 12 08 0f
+00 01 63 0c 03 1f 1f 0f 08 0f 00 01 63 04 03 39 23 00 00 00 62 18 07 04 00
+63 32 00 00 00 32 00 57 61 74 65 72 47 6c 61 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WeirdAxe *
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0f 0d 09 0f 00 00 5f 3c 03 1f 0f 0d 09 0f 00 02 63 38 03 1d 0f 0d 07 0f
+00 01 63 1a 03 1f 0f 0d 07 0f 00 01 63 00 03 04 23 00 00 00 32 24 02 04 00
+28 63 00 00 00 32 00 57 65 69 72 64 41 78 65 20 2a 63 63 63 32 32 32 0d 03
+0d 31 00 04 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: White Blow
+** Source: Yamaha DX11 factory preset, bank D, voice 32
+18 13 00 0f 0a 00 00 3f 20 03 1f 12 00 0a 0f 00 00 56 20 03 1f 13 00 0c 0f
+00 00 5c 3c 03 0b 0a 0a 0b 0a 00 00 5a 3f 03 02 23 00 00 00 62 30 04 04 00
+28 32 00 00 00 32 00 57 68 69 74 65 20 42 6c 6f 77 63 63 63 32 32 32 0c 06
+00 02 0b 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: White Blow
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 13 00 0f 0d 00 00 3f 20 03 1f 12 00 0d 0f 00 00 56 20 03 1f 13 00 0c 0f
+00 00 5c 3c 03 0b 0d 0a 0b 0d 00 00 5a 3f 03 02 23 00 00 00 62 30 04 04 00
+28 32 00 00 00 32 00 57 68 69 74 65 20 42 6c 6f 77 63 63 63 32 32 32 0c 06
+00 02 0b 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+--Bank 29
+
+* CATEGORY OTHER
+
+* SUBCATEGORY Other
+
+** Name: 120 VAC
+** Description: A guitar-like sound
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 07 07 06 0f 00 3d 5e 04 0c 1f 07 07 05 0f 00 1d 46 28 01 1f 07 07 07 0f
+00 1d 63 10 0c 1f 07 0a 05 0f 00 3d 5d 04 01 24 1c 11 02 00 42 18 02 04 00
+63 32 00 00 00 32 00 31 32 30 20 56 41 43 20 20 20 63 63 63 32 32 32 00 00
+00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: 120 VAC
+** Description: A guitar-like sound
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 07 07 06 0f 00 3a 5e 04 0c 1f 07 07 05 0f 00 19 46 28 01 1f 07 07 07 0f
+00 19 63 10 0c 1f 07 0a 05 0f 00 38 5d 04 01 24 1c 11 02 00 42 18 02 04 00
+63 32 00 00 00 32 00 31 32 30 20 56 41 43 20 20 20 63 63 63 32 32 32 00 00
+00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Amazon
+** Description: A jungle sound
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 13 1f 03 05 00 06 4b 13 13 13 1f 1f 05 05 00 06 4a 10 13 1f 1f 01 05 0f
+00 03 63 03 0d 1f 1f 01 05 0f 00 03 63 05 09 2c 1c 09 07 00 52 05 04 04 00
+63 28 00 0f 00 32 00 41 6d 61 7a 6f 6e 20 20 20 20 63 63 63 32 32 32 00 10
+00 6d 00 16 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ArcoGlass*
+** Description: A glass harp
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 00 05 00 0a 01 47 12 0e 1f 09 00 05 00 0a 01 47 0d 0e 0b 0a 0a 05 00
+09 40 63 00 06 0b 0a 0a 05 00 09 40 63 00 00 2c 15 01 16 0c 3a 24 02 04 00
+28 37 00 00 00 32 00 41 72 63 6f 47 6c 61 73 73 2a 63 63 63 32 32 32 00 06
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Aviary
+** Description: A glassy sound
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1f 1f 0f 0f 0a 00 00 1e 03 1f 1f 0b 00 0f 00 00 2f 1a 03 0c 1f 0d 07 0f
+00 00 48 03 03 0c 0f 06 05 0f 00 00 50 03 03 7c 23 00 00 00 32 18 02 04 00
+28 02 00 00 00 32 00 41 76 69 61 72 79 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Aviary
+** Description: A glassy sound
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 1f 0f 0f 0a 00 00 1e 03 1f 1f 0b 01 0f 00 00 2f 1a 03 0c 1f 0d 07 0f
+00 00 48 03 03 0c 0f 06 05 0f 00 00 50 03 03 7c 23 00 00 00 32 18 02 04 00
+28 02 00 00 00 32 00 41 76 69 61 72 79 20 20 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: BC1 GlassV
+** Controls: KV, MW (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 03 03 06 0f 00 3b 4c 19 0b 0c 0c 05 05 0d 40 04 59 10 10 0b 0a 06 06 0c
+27 06 63 08 08 09 06 06 06 0d 00 06 5c 04 13 0c 1e 18 03 00 62 18 07 04 00
+63 32 01 00 00 32 63 42 43 31 20 47 6c 61 73 73 56 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Botl.Shff*
+** Description: Blowing across the top of a bottle
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 13 11 0a 0d 00 01 55 13 09 1f 19 00 07 0d 00 01 4f 0a 00 1f 11 0d 09 09
+00 02 5c 09 06 0e 08 00 07 0e 00 42 63 05 0b 3b 1c 00 00 00 5e 05 02 04 00
+63 10 2e 00 00 32 00 42 6f 74 6c 2e 53 68 66 66 2a 63 63 63 32 32 32 00 00
+00 00 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Cairo *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 08 06 07 0e 14 00 53 04 0e 1f 0f 0a 0b 0b 00 00 3d 38 0b 1f 1e 06 07 0e
+00 02 63 03 08 1f 07 07 0a 0b 00 02 63 04 0b 04 15 00 0a 00 32 05 02 04 00
+28 63 00 00 00 32 00 43 61 69 72 6f 20 20 20 20 2a 63 63 63 32 32 32 00 18
+00 06 00 06 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Celestial
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 04 0f 00 18 41 39 06 0b 02 03 04 00 00 00 50 05 06 0f 02 04 03 0a
+00 08 55 03 04 0e 00 01 06 00 00 02 63 04 00 7e 1a 00 05 01 62 11 0c 05 00
+63 32 00 00 00 32 00 43 65 6c 65 73 74 69 61 6c 20 63 63 63 32 32 32 00 21
+00 11 00 46 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ChimeStrig
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 09 04 03 08 00 04 57 0a 03 1f 1f 00 03 0f 00 04 5e 00 06 1f 09 04 04 08
+00 04 5b 1f 02 0f 1f 00 04 0f 00 06 5e 08 06 2c 23 00 00 00 02 18 04 04 00
+28 32 00 00 00 32 00 43 68 69 6d 65 53 74 72 69 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ChimeStrig
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 09 04 03 08 00 02 57 0a 03 1f 1f 00 03 0f 00 01 5e 00 06 1f 09 04 04 08
+00 00 5b 1f 02 0f 1f 00 04 0f 00 00 5e 08 06 2c 23 00 00 00 02 18 04 04 00
+28 32 00 00 00 32 00 43 68 69 6d 65 53 74 72 69 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Deep Space
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1b 07 07 00 0a 44 54 13 03 1f 0a 07 06 00 00 45 52 04 13 1f 12 07 06 00
+00 46 53 10 03 10 0a 0a 04 00 00 46 63 04 03 07 2a 48 01 4b 06 18 02 04 00
+28 02 00 00 00 32 00 44 65 65 70 20 53 70 61 63 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Deep Space
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1b 07 07 00 0a 40 54 13 03 1f 0a 07 06 00 00 40 52 04 13 1f 12 07 06 00
+00 40 53 10 03 10 0a 0a 04 00 00 40 63 04 03 07 2a 48 01 4b 06 18 02 04 00
+28 02 00 00 00 32 00 44 65 65 70 20 53 70 61 63 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EleChamber
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 06 02 03 0e 00 02 3f 08 02 0b 03 03 05 08 00 04 47 08 00 0a 08 03 07 0f
+00 05 63 08 06 09 10 03 05 0f 00 05 63 08 05 5c 21 23 09 00 32 0c 05 04 00
+63 63 63 00 00 32 00 45 6c 65 43 68 61 6d 62 65 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: EleChamber
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 06 02 03 0e 00 00 3f 08 02 0b 03 03 05 08 00 00 47 08 00 0a 08 03 07 0f
+00 01 63 08 06 09 10 03 05 0f 00 01 63 08 05 5c 21 23 09 00 32 0c 05 04 00
+63 63 63 00 00 32 00 45 6c 65 43 68 61 6d 62 65 72 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Enc3rdKind
+** Controls: KV, MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 00 06 00 00 44 63 00 03 1f 0d 00 06 00 00 43 63 04 03 1f 0c 00 06 00
+00 45 63 04 03 1f 0a 00 06 0a 00 45 63 04 03 47 14 4f 1e 02 15 18 04 04 00
+63 01 63 00 00 32 00 45 6e 63 33 72 64 4b 69 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Enc3rdKind
+** Controls: MW (LFO pitch), MW (LFO amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 00 06 00 00 40 63 00 03 1f 0d 00 06 00 00 40 63 04 03 1f 0c 00 06 00
+00 40 63 04 03 1f 0a 00 06 0a 00 40 63 04 03 47 14 4f 1e 02 15 18 04 04 00
+63 01 63 00 00 32 00 45 6e 63 33 72 64 4b 69 6e 64 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Etherial
+** Controls: MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 1f 00 03 0f 00 00 42 13 03 1f 1f 00 03 0f 00 00 3c 13 03 14 1f 00 05 0f
+1e 00 56 0a 03 14 1f 00 05 0f 1e 00 56 1c 03 3c 23 00 32 00 42 05 02 04 00
+63 63 00 00 00 32 00 45 74 68 65 72 69 61 6c 20 20 63 63 63 32 32 32 00 30
+00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Floot Base
+** Description: Almost a flute, and down a fifth
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+18 1f 16 0f 0f 00 00 63 05 00 18 07 00 0f 07 1b 00 45 03 0c 1f 1f 15 0f 0f
+03 00 63 1e 05 0f 14 00 0f 0f 05 01 5f 04 02 3b 20 00 00 00 62 0c 02 05 00
+63 13 63 00 00 32 00 46 6c 6f 6f 74 20 42 61 73 65 63 63 63 32 32 32 00 72
+00 36 00 04 00 08 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Full Ranks
+** Source: Unknown (downloaded from TX81Z patch directory on ucsd.edu)
+16 00 00 0a 0f 00 00 39 1f 02 18 00 00 05 0f 5b 00 5b 00 10 0f 00 00 08 0f
+00 00 63 08 10 0c 00 00 05 0f 00 00 63 00 16 3c 23 00 00 00 02 0c 00 04 00
+63 00 00 00 00 32 00 46 75 6c 6c 20 52 61 6e 6b 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: FuzzyPad
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 06 06 04 0f 00 40 40 05 00 14 08 07 05 0f 05 00 47 04 00 0f 07 03 07 0e
+08 03 63 04 06 13 08 04 05 0f 00 03 60 04 06 64 1f 00 06 00 4a 05 02 04 00
+63 32 00 00 00 32 00 46 75 7a 7a 79 50 61 64 20 20 63 63 63 32 32 32 06 31
+00 38 00 08 00 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Gender Gam
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+15 13 05 06 0a 00 04 54 19 0e 1f 0e 04 06 0c 00 04 4a 06 0e 18 13 03 08 0c
+00 04 59 10 06 1f 12 03 06 0d 00 01 63 04 00 37 52 00 07 00 62 18 04 04 00
+28 32 00 00 00 32 00 47 65 6e 64 65 72 20 47 61 6d 63 63 63 32 32 32 00 1e
+00 0b 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GlassHarp1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1c 0a 00 04 00 00 02 50 15 02 1f 0a 00 05 00 00 03 4e 0d 02 0f 0c 0a 06 00
+00 03 63 00 02 0f 0c 00 06 0f 00 04 63 00 04 2e 63 00 00 00 33 1b 04 04 00
+63 01 63 00 00 32 00 47 6c 61 73 73 48 61 72 70 31 63 63 63 32 32 32 0f 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GlassHarp1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1c 0a 00 04 00 00 00 50 15 02 1f 0a 00 05 00 00 00 4e 0d 02 0f 0c 0a 06 00
+00 00 63 00 02 0f 0c 00 06 0f 00 00 63 00 04 2e 63 00 00 00 33 1b 04 04 00
+63 01 63 00 00 32 00 47 6c 61 73 73 48 61 72 70 31 63 63 63 32 32 32 0f 00
+00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GlassHarp2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 03 03 06 0f 00 3c 40 19 0b 0c 0c 05 05 0d 40 04 4f 10 10 0b 0a 06 06 0c
+27 05 63 08 08 09 06 06 06 0d 00 05 5c 04 13 0c 1e 18 03 00 62 18 07 04 00
+63 32 01 00 00 32 00 47 6c 61 73 73 48 61 72 70 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GlassHarp2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 03 03 06 0f 00 38 40 19 0b 0c 0c 05 05 0d 40 00 4f 10 10 0b 0a 06 06 0c
+27 00 63 08 08 09 06 06 06 0d 00 00 5c 04 13 0c 1e 18 03 00 62 18 07 04 00
+63 32 01 00 00 32 00 47 6c 61 73 73 48 61 72 70 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GlassHarp3
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 07 04 04 0a 00 04 3e 2a 03 07 07 04 04 09 00 04 27 2d 05 0c 06 07 07 03
+00 04 63 10 06 0a 08 05 05 0c 00 04 63 10 00 2e 63 00 00 00 23 18 04 04 00
+63 01 63 00 00 32 00 47 6c 61 73 73 48 61 72 70 33 63 63 63 32 32 32 0f 07
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: GlassHarp3
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 07 04 04 0a 00 00 3e 2a 03 07 07 04 04 09 00 00 27 2d 05 0c 06 07 07 03
+00 00 63 10 06 0a 08 05 05 0c 00 00 63 10 00 2e 63 00 00 00 33 18 04 04 00
+63 01 63 00 00 32 00 47 6c 61 73 73 48 61 72 70 33 63 63 63 32 32 32 0f 07
+00 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: HarmoPad
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank B, voice 28
+0a 1f 02 05 0f 27 43 4d 05 06 0a 1f 02 05 0f 27 03 4f 04 00 0b 1f 00 04 0f
+00 01 63 05 0e 0b 1f 00 04 0f 00 01 63 04 08 04 1c 0e 1c 00 36 05 04 04 00
+28 32 00 00 00 32 00 48 61 72 6d 6f 50 61 64 20 20 63 63 63 32 32 32 04 41
+00 48 00 31 07 38 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Impression
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 15 04 07 0f 00 06 50 00 0b 09 15 04 07 0f 00 06 43 00 0b 16 07 04 07 0f
+00 05 63 00 03 16 07 04 07 0f 00 05 63 00 03 14 20 3b 02 00 02 18 04 04 00
+63 01 63 00 00 32 00 49 6d 70 72 65 73 73 69 6f 6e 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Impression
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 15 04 07 0f 00 02 50 00 0b 09 15 04 07 0f 00 01 43 00 0b 16 07 04 07 0f
+00 00 63 00 03 16 07 04 07 0f 00 00 63 00 03 14 20 3b 02 00 02 18 04 04 00
+63 01 63 00 00 32 00 49 6d 70 72 65 73 73 69 6f 6e 63 63 63 32 32 32 00 00
+00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jump.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 03 01 06 0e 00 03 54 04 03 12 04 01 04 0e 00 05 4d 08 03 15 03 02 09 0e
+00 05 63 04 03 15 0c 03 09 0e 00 05 63 04 01 34 26 02 0d 00 32 0c 04 04 00
+28 32 00 00 00 32 00 4a 75 6d 70 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jump.....1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 03 01 06 0e 00 01 54 04 03 12 04 01 04 0e 00 02 4d 08 03 15 03 02 09 0e
+00 00 63 04 03 15 0c 03 09 0e 00 00 63 04 01 34 26 02 0d 00 32 0c 04 04 00
+28 32 00 00 00 32 00 4a 75 6d 70 2e 2e 2e 2e 2e 31 63 63 63 32 32 32 00 00
+00 10 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jump.....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 03 07 09 0e 00 03 57 04 03 1f 16 18 09 0c 00 05 63 08 1b 1f 16 00 09 0e
+00 05 63 04 03 1f 16 00 09 0c 00 05 63 08 03 2c 26 21 20 00 12 18 04 04 00
+28 32 00 00 00 32 00 4a 75 6d 70 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 10
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Jump.....2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 03 07 09 0e 00 01 57 04 03 1f 16 18 09 0c 00 02 63 08 1b 1f 16 00 09 0e
+00 00 63 04 03 1f 16 00 09 0c 00 00 63 08 03 2c 26 21 20 00 12 18 04 04 00
+28 32 00 00 00 32 00 4a 75 6d 70 2e 2e 2e 2e 2e 32 63 63 63 32 32 32 00 10
+00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: KrstlChoir
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank D, voice 3
+1f 00 06 04 0f 00 40 43 18 00 0b 08 07 07 0f 05 00 63 04 06 0f 07 08 07 0f
+08 00 59 05 06 0e 08 04 05 0f 00 03 63 03 00 7e 22 00 0f 00 4a 1d 02 04 00
+63 32 00 00 00 32 00 4b 72 73 74 6c 43 68 6f 69 72 63 63 63 32 32 32 00 38
+00 38 00 01 00 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: KrystlPad1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 11 06 07 0f 00 45 4f 1a 00 0b 08 07 07 0f 05 01 62 04 03 0f 07 08 07 0f
+08 01 62 05 06 0e 08 04 05 0f 00 03 63 03 00 7f 22 00 0f 00 26 11 02 04 00
+63 32 00 00 00 32 00 4b 72 79 73 74 6c 50 61 64 31 63 63 63 32 32 32 00 38
+00 18 00 21 00 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: MilkBottle
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0c 1f 06 05 01 00 03 3f 09 08 13 1c 03 05 0b 00 02 53 09 0e 1c 1f 01 05 0f
+00 03 46 0a 08 0c 09 01 08 0d 00 04 63 04 00 33 1a 09 07 1f 52 05 02 04 00
+63 19 1f 10 1e 32 00 4d 69 6c 6b 42 6f 74 74 6c 65 63 63 63 32 32 32 20 33
+00 02 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Movement.1
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 09 03 06 0b 00 43 42 2a 10 1f 09 05 03 0f 00 43 63 04 04 1f 09 05 06 0b
+00 44 63 19 0a 1f 09 06 06 0f 00 46 63 04 05 64 18 39 09 19 35 00 00 04 00
+63 32 00 32 00 32 00 4d 6f 76 65 6d 65 6e 74 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Movement.1
+** Controls: MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0a 09 03 06 0b 00 40 42 2a 10 1f 09 05 03 0f 00 40 63 04 04 1f 09 05 06 0b
+00 40 63 19 0a 1f 09 06 06 0f 00 40 63 04 05 64 18 39 09 19 35 00 00 04 00
+63 32 00 32 00 32 00 4d 6f 76 65 6d 65 6e 74 2e 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Movement.2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0b 09 00 06 0e 00 43 3e 1c 18 1f 09 00 03 0f 00 44 53 08 01 1f 09 01 06 0e
+00 43 63 08 02 1f 09 00 06 0f 00 45 63 08 15 7c 25 00 00 27 37 00 00 04 00
+63 32 00 32 00 32 00 4d 6f 76 65 6d 65 6e 74 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Movement.2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0b 09 00 06 0e 00 40 3e 1c 18 1f 09 00 03 0f 00 40 53 08 01 1f 09 01 06 0e
+00 40 63 08 02 1f 09 00 06 0f 00 40 63 08 15 7c 25 00 00 27 37 00 00 04 00
+63 32 00 32 00 32 00 4d 6f 76 65 6d 65 6e 74 2e 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Musicbox *
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 1a 01 01 09 00 00 4b 1f 06 1f 1f 1f 0f 00 00 00 5e 30 03 1f 1c 0a 04 0b
+00 00 63 08 08 1b 16 1f 0f 00 00 00 52 30 03 04 04 00 00 00 52 18 02 04 00
+28 63 00 00 00 32 00 4d 75 73 69 63 62 6f 78 20 2a 63 63 63 32 32 32 00 10
+0c 0f 00 00 0a 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Obelisk
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+02 1d 00 04 0f 00 18 41 39 06 02 02 03 04 00 00 00 50 05 06 02 02 04 03 0a
+00 08 55 03 04 02 0d 01 06 00 00 02 63 04 00 7f 1a 00 05 01 62 11 0c 05 00
+63 32 00 00 00 32 00 4f 62 65 6c 69 73 6b 20 20 20 63 63 63 32 32 32 00 21
+00 11 00 46 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt E.T.
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 03 00 06 04 00 42 50 2a 05 1f 05 00 06 04 00 42 47 34 03 1f 03 00 06 04
+00 45 5d 22 04 1f 04 00 06 04 00 44 63 04 03 6c 48 2a 0a 27 36 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 20 45 2e 54 2e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt E.T.
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 03 00 06 04 00 40 50 2a 05 1f 05 00 06 04 00 40 47 34 03 1f 03 00 06 04
+00 40 5d 22 04 1f 04 00 06 04 00 40 63 04 03 6c 48 2a 0a 27 36 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 20 45 2e 54 2e 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Quest
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 08 1f 09 05 00 03 63 3f 1b 12 1f 0e 0f 0f 00 04 63 0d 03 0a 1f 09 0f 0f
+00 04 5e 19 03 1f 06 03 0f 0f 00 05 61 04 03 3f 15 00 15 23 12 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 20 51 75 65 73 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Ornt Quest
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 08 1f 09 05 00 00 63 3f 1b 12 1f 0e 0f 0f 00 00 63 0d 03 0a 1f 09 0f 0f
+00 00 5e 19 03 1f 06 03 0f 0f 00 00 61 04 03 3f 15 00 15 23 12 18 04 04 00
+28 32 00 00 00 32 00 4f 72 6e 74 20 51 75 65 73 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntFlight
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+12 06 00 04 00 2e 02 46 0d 1a 1f 13 1d 09 0a 00 02 63 34 04 12 02 00 04 00
+2e 05 63 08 1a 13 03 15 09 0d 00 04 5d 08 03 7c 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 46 6c 69 67 68 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntFlight
+** Source: from a library of patches collected by Duane Bowker, author unknown
+12 06 00 04 00 2e 00 46 0d 1a 1f 13 1d 09 0a 00 00 63 34 04 12 02 00 04 00
+2e 00 63 08 1a 13 03 15 09 0d 00 00 5d 08 03 7c 23 00 00 00 32 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 46 6c 69 67 68 74 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntSound1
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 03 02 05 00 00 02 40 0a 03 1f 0a 03 05 00 00 03 54 08 03 1f 12 04 05 00
+00 03 63 0a 03 06 05 00 05 00 00 05 63 04 06 77 38 44 00 3f 12 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 53 6f 75 6e 64 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntSound1
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 03 02 05 00 00 00 40 0a 03 1f 0a 03 05 00 00 00 54 08 03 1f 12 04 05 00
+00 00 63 0a 03 06 05 00 05 00 00 00 63 04 06 77 38 44 00 3f 12 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 53 6f 75 6e 64 31 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntSound2
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+09 03 09 04 0c 00 02 40 08 03 09 0d 03 02 0c 00 02 54 04 03 16 0f 04 05 0c
+00 05 63 04 03 16 06 01 07 0c 00 05 63 04 06 74 38 44 00 3f 31 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 53 6f 75 6e 64 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: OrntSound2
+** Source: from a library of patches collected by Duane Bowker, author unknown
+09 03 09 04 0c 00 00 40 08 03 09 0d 03 02 0c 00 00 54 04 03 16 0f 04 05 0c
+00 00 63 04 03 16 06 01 07 0c 00 00 63 04 06 74 38 44 00 3f 31 0c 02 04 00
+63 32 00 32 00 32 00 4f 72 6e 74 53 6f 75 6e 64 32 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: ParisDream
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 0b 06 0b 00 02 4b 1f 01 13 0b 0c 07 0a 00 02 63 16 01 1f 09 0c 06 0a
+00 02 54 0a 0d 0e 0f 0c 07 0d 00 00 63 16 05 3e 1a 00 05 00 42 0c 01 04 00
+63 32 00 00 00 32 00 50 61 72 69 73 44 72 65 61 6d 63 63 63 32 32 32 00 38
+00 10 00 08 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianoVoice
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 0a 0e 07 06 63 04 4d 1f 03 0a 1f 00 03 0f 00 04 4c 08 03 1f 07 07 05 07
+00 05 63 04 03 08 0e 00 06 0f 00 45 63 04 03 7c 23 00 0e 00 36 18 02 04 00
+28 02 00 00 00 32 00 50 69 61 6e 6f 56 6f 69 63 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianoVoice
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 0a 0e 07 06 63 03 4d 1f 03 0a 1f 00 03 0f 00 02 4c 08 03 1f 07 07 05 07
+00 00 63 04 03 08 0e 00 06 0f 00 40 63 04 03 7c 23 00 0e 00 36 18 02 04 00
+28 02 00 00 00 32 00 50 69 61 6e 6f 56 6f 69 63 65 63 63 63 32 32 32 00 00
+00 00 00 00 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PianoStrng
+** Controls: KV, MW (LFO pitch)
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 1c 00 04 0f 1e 02 43 09 06 1f 1c 00 04 0f 1e 02 43 0a 00 1f 1f 00 05 0f
+1e 01 63 09 06 1f 1f 00 05 0f 1e 01 63 0a 00 3c 1f 06 0a 00 52 05 02 04 00
+63 32 00 00 00 32 00 50 69 61 6e 6f 53 74 72 6e 67 63 63 63 32 32 32 00 02
+00 00 02 32 00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PlasticHit
+** Controls: KV, MW (LFO pitch)
+** Source: Yamaha TX81Z factory preset, bank C, voice 31
+1f 14 0e 07 04 00 04 5b 30 16 1f 12 04 0a 06 00 04 61 04 10 1f 0f 03 05 0b
+00 02 5e 04 10 1f 0b 03 06 0b 00 02 63 04 16 03 1b 0b 05 00 52 0c 04 04 00
+32 32 00 00 00 32 00 50 6c 61 73 74 69 63 48 69 74 63 63 63 32 32 32 00 30
+00 50 00 50 07 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pno String
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 07 07 05 07 00 04 43 2a 02 18 03 03 05 08 00 04 58 08 00 1f 08 06 06 07
+00 07 63 04 0e 09 10 03 05 0f 00 06 5e 08 05 2c 21 23 0f 00 12 0c 05 04 00
+63 63 63 00 00 32 00 50 6e 6f 20 53 74 72 69 6e 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Pno String
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 07 07 05 07 00 03 43 2a 02 18 03 03 05 08 00 01 58 08 00 1f 08 06 06 07
+00 00 63 04 0e 09 10 03 05 0f 00 00 5e 08 05 2c 21 23 0f 00 12 0c 05 04 00
+63 63 63 00 00 32 00 50 6e 6f 20 53 74 72 69 6e 67 63 63 63 32 32 32 00 00
+00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PnoClouds
+** Controls: KV, MW (LFO pitch), BC (LFO pitch), BC (EG amplitude)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 1f 08 05 0f 17 45 47 05 02 06 0b 01 04 0e 00 24 4e 1a 00 1f 1f 08 05 0f
+00 04 63 04 03 07 07 01 04 0e 00 24 4e 1a 06 06 1c 0e 09 2e 4a 05 02 04 00
+63 32 00 07 00 32 39 50 6e 6f 43 6c 6f 75 64 73 20 63 63 63 32 32 32 06 41
+00 57 00 78 00 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: PopPercuss
+** Description: guitar / horn / electric piano mix
+** Controls: KV
+** Source: GLIB (Michael Kesti and others)
+1f 0c 06 0b 06 00 04 56 04 02 1f 02 03 0b 0e 43 04 61 04 10 1f 12 06 08 0e
+00 04 60 08 00 1a 17 08 08 0c 00 03 63 04 03 33 14 00 00 00 62 18 01 04 00
+63 32 00 32 00 32 00 50 6f 70 50 65 72 63 75 73 73 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Sawsy Pad1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0e 08 06 07 0e 1d 01 63 03 06 0e 08 07 07 0f 16 41 62 05 00 0e 08 05 07 0f
+1d 01 62 05 00 0e 08 04 05 0f 14 41 63 04 06 7f 22 00 0f 00 36 05 02 05 03
+63 32 00 00 00 32 00 53 61 77 73 79 20 50 61 64 31 63 63 63 32 32 32 00 36
+00 31 00 31 00 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Solstice
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0a 1b 0d 06 0f 00 04 31 12 00 0d 1b 0d 06 0f 00 04 43 13 06 0c 1b 0d 06 0f
+00 04 37 12 00 1f 1b 0d 06 0f 00 04 63 19 03 47 23 13 00 00 32 0c 04 04 00
+63 01 63 00 00 32 00 53 6f 6c 73 74 69 63 65 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Solstice
+** Source: from a library of patches collected by Duane Bowker, author unknown
+0a 1b 0d 06 0f 00 00 31 12 00 0d 1b 0d 06 0f 00 00 43 13 06 0c 1b 0d 06 0f
+00 00 37 12 00 1f 1b 0d 06 0f 00 00 63 19 03 47 23 13 00 00 32 0c 04 04 00
+63 01 63 00 00 32 00 53 6f 6c 73 74 69 63 65 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpoonChoir
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1e 0b 0f 04 07 00 40 43 1c 00 13 0c 07 07 0b 05 00 54 05 00 1f 07 02 07 0f
+08 03 5c 00 06 13 0c 04 05 0a 00 03 57 03 06 7c 1f 00 06 00 4a 11 02 04 00
+63 32 00 00 00 32 00 53 70 6f 6f 6e 43 68 6f 69 72 63 63 63 32 32 32 06 70
+00 71 00 04 00 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpreadThin
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+10 0a 06 08 0c 00 02 59 08 0b 18 12 06 0a 00 00 05 5a 04 0b 15 07 06 08 0c
+00 04 63 04 0b 15 1d 06 0f 0f 00 05 63 04 03 24 1e 00 00 00 22 00 05 04 00
+63 63 63 00 00 32 00 53 70 72 65 61 64 54 68 69 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: SpreadThin
+** Controls: KV
+** Source: from a library of patches collected by Duane Bowker, author unknown
+10 0a 06 08 0c 00 01 59 08 0b 18 12 06 0a 00 00 01 5a 04 0b 15 07 06 08 0c
+00 00 63 04 0b 15 1d 06 0f 0f 00 00 63 04 03 24 1e 00 00 00 22 00 05 04 00
+63 63 63 00 00 32 00 53 70 72 65 61 64 54 68 69 6e 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: St Nick..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 01 0f 00 04 4c 00 02 1f 1f 0c 05 0f 00 03 53 2a 0b 0c 0c 06 05 0f
+00 04 63 00 04 1f 0c 06 05 0f 00 07 63 08 0b 3c 1b 28 10 00 22 18 04 04 00
+28 32 00 00 00 32 00 53 74 20 4e 69 63 6b 2e 2e 31 63 63 63 32 32 32 00 20
+00 00 00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: St Nick..1
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 01 0f 00 01 4c 00 02 1f 1f 0c 05 0f 00 00 53 2a 0b 0c 0c 06 05 0f
+00 00 63 00 04 1f 0c 06 05 0f 00 01 63 08 0b 3c 1b 28 10 00 22 18 04 04 00
+28 32 00 00 00 32 00 53 74 20 4e 69 63 6b 2e 2e 31 63 63 63 32 32 32 00 20
+00 00 00 40 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: St Nick..2
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 00 00 01 0f 00 02 4c 04 00 19 1f 0c 05 0f 00 03 63 0a 03 0c 0c 06 05 0f
+00 04 5a 04 06 19 0c 06 05 0f 00 06 63 04 03 36 22 28 2b 00 12 18 04 04 00
+28 32 00 00 00 32 00 53 74 20 4e 69 63 6b 2e 2e 32 63 63 63 32 32 32 00 20
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: St Nick..2
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 00 00 01 0f 00 00 4c 04 00 19 1f 0c 05 0f 00 00 63 0a 03 0c 0c 06 05 0f
+00 00 5a 04 06 19 0c 06 05 0f 00 00 63 04 03 36 22 28 2b 00 12 18 04 04 00
+28 32 00 00 00 32 00 53 74 20 4e 69 63 6b 2e 2e 32 63 63 63 32 32 32 00 20
+00 10 00 10 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StonedCycl
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+04 0f 07 06 0f 00 05 4d 08 00 04 0d 07 06 0f 00 04 63 04 06 04 0e 07 06 0f
+00 06 38 00 00 05 0e 07 06 0f 00 06 63 04 03 7a 63 63 06 00 53 00 04 04 00
+63 01 63 00 00 32 00 53 74 6f 6e 65 64 43 79 63 6c 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: StonedCycl
+** Controls: MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+04 0f 07 06 0f 00 00 4d 08 00 04 0d 07 06 0f 00 00 63 04 06 04 0e 07 06 0f
+00 00 38 00 00 05 0e 07 06 0f 00 00 63 04 03 7a 63 63 06 00 53 00 04 04 00
+63 01 63 00 00 32 00 53 74 6f 6e 65 64 43 79 63 6c 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Texture *
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+0c 0f 0d 07 0f 00 00 63 00 00 1b 00 0d 07 0f 00 01 63 04 00 0f 00 0d 07 0f
+00 02 63 0d 06 1f 00 0d 07 0f 00 01 63 04 06 6f 32 00 63 00 33 18 0c 04 00
+63 32 00 00 00 32 00 54 65 78 74 75 72 65 20 20 2a 63 63 63 32 32 32 00 50
+00 40 00 60 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: That Girl*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1e 02 07 05 00 00 02 5e 05 19 1e 07 0a 08 0b 00 05 59 38 18 1e 06 0a 07 00
+00 02 63 03 0c 1b 06 1f 0b 00 00 02 60 04 13 04 1d 12 1e 00 32 05 02 04 00
+28 63 00 00 00 32 00 54 68 61 74 20 47 69 72 6c 2a 63 63 63 32 32 32 00 01
+00 06 00 06 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Up We Go
+** Controls: KV
+** Source: from a library of patches collected by Rod Lemcke, author unknown
+1f 12 0c 06 0e 00 04 5f 04 03 1f 0f 0c 04 0e 00 02 50 07 0b 1b 03 01 02 0e
+00 05 51 0e 03 1f 09 0f 06 0d 00 06 63 04 03 44 23 00 00 00 32 18 04 04 00
+63 01 63 00 00 32 00 55 70 20 57 65 20 47 6f 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: Up We Go
+** Source: from a library of patches collected by Duane Bowker, author unknown
+1f 12 0c 06 0e 00 00 5f 04 03 1f 0f 0c 04 0e 00 00 50 07 0b 1b 03 01 02 0e
+00 00 51 0e 03 1f 09 0f 06 0d 00 00 63 04 03 44 23 00 00 00 32 18 04 04 00
+63 01 63 00 00 32 00 55 70 20 57 65 20 47 6f 20 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WineGlass*
+** Controls: KV, MW (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+03 05 05 04 00 40 01 35 24 08 08 07 01 04 0c 40 41 34 19 0e 08 09 00 04 0c
+32 44 63 08 1e 03 01 00 04 0c 32 42 5b 08 18 04 08 00 08 22 3e 18 04 04 00
+63 32 00 00 00 32 60 57 69 6e 65 47 6c 61 73 73 2a 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: WireWaves
+** Controls: KV, MW (LFO pitch), BC (LFO pitch)
+** Source: from a library of patches collected by Duane Bowker, author unknown
+14 19 03 05 00 00 07 5d 18 12 19 09 00 05 00 1f 06 3e 2d 16 12 07 07 05 0c
+00 05 63 0b 08 10 09 07 05 0d 00 05 63 0d 08 34 1a 09 05 00 52 00 02 04 00
+63 19 00 10 00 32 00 57 69 72 65 57 61 76 65 73 20 63 63 63 32 32 32 20 32
+1d 74 00 69 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
+
+** Name: XyloSynth
+** Controls: KV
+** Source: by Steve Michelson, from the patch library of his dx11lib librarian
+1f 16 0e 07 07 15 06 63 24 0b 1a 18 0c 07 05 0c 02 63 0a 0b 17 1f 0d 07 0f
+00 02 63 0a 0b 16 1f 0a 05 0f 00 01 63 04 0b 3e 23 00 00 00 52 18 02 04 00
+28 32 00 00 00 32 00 58 79 6c 6f 53 79 6e 74 68 20 63 63 63 32 32 32 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00
+
diff --git a/muse/synti/deicsonze/CMakeLists.txt b/muse/synti/deicsonze/CMakeLists.txt
new file mode 100644
index 00000000..d508b9d1
--- /dev/null
+++ b/muse/synti/deicsonze/CMakeLists.txt
@@ -0,0 +1,43 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+QT4_WRAP_CPP ( deicsonze_mocs deicsonzegui.h )
+QT4_WRAP_UI ( deicsonze_uis deicsonzegui.ui )
+
+add_library ( deicsonze SHARED
+ deicsonze.cpp
+ deicsonzepreset.cpp
+ deicsonzegui.cpp
+ deicsonzegui.h
+ ${deicsonze_mocs}
+ ${deicsonze_uis}
+ )
+
+# - tell cmake to name target deicsonze.so instead of
+# libdeicsonze.so
+# - use precompiled header files
+#
+set_target_properties ( deicsonze
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /lib/muse-1.0pre1/synthi/ deicsonze )
+
diff --git a/muse/synti/deicsonze/README b/muse/synti/deicsonze/README
new file mode 100644
index 00000000..8f402e51
--- /dev/null
+++ b/muse/synti/deicsonze/README
@@ -0,0 +1,20 @@
+DeicsOnze is a virtual synthesizer plugin for MusE which reproduces the
+FM synthesis of the YAMAHA DX11 synthesizer/TX81Z sound module.
+
+It contains over 2000 presets archived by Bryan Sutula belonging to the public
+domain. If by any chance you find some of them that are under copyright please
+contact me to take it off as soon as possible.
+
+Not every function is implemented but it starts to sound like the original
+(and even better). Pitch envelope, portamento, pitch bend, modulation and some
+others are not implemented yet.
+
+The vertical sliders are inverted because QTDesigner doesn't have the feature
+of slider invertion, since I think that it will get it before I will finish
+DeicsOnze I'm waiting for a QT improvement.
+
+The files with the extention .fig in the directory pics have been made
+with xfig.
+
+Nil Geisweiller
+a-lin@users.sourceforge.net
diff --git a/muse/synti/deicsonze/SutulaBank.dei b/muse/synti/deicsonze/SutulaBank.dei
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/muse/synti/deicsonze/SutulaBank.dei
diff --git a/muse/synti/deicsonze/TODO b/muse/synti/deicsonze/TODO
new file mode 100644
index 00000000..b4e6a9af
--- /dev/null
+++ b/muse/synti/deicsonze/TODO
@@ -0,0 +1,15 @@
+- Pitch Bend CTRL
+- Modulation CTRL
+- LFO Delay (bug)
+- portamento
+- EG Shift
+- EG Pitch
+- Rate Scaling
+- Monophony
+- Foot Control, Modulation Wheel, Breath Control, After Touch
+- Reverb
+- change presetName subcategoryName category with SysEx
+- internal restructure, private vs public, add comment, etc
+- getPatchInfo
+- Optimize the code, make 3 level of quality sound
+- Remember the last directory
diff --git a/muse/synti/deicsonze/deicsonze.cpp b/muse/synti/deicsonze/deicsonze.cpp
new file mode 100644
index 00000000..75d25076
--- /dev/null
+++ b/muse/synti/deicsonze/deicsonze.cpp
@@ -0,0 +1,2794 @@
+//===========================================================================
+//
+// DeicsOnze an emulator of the YAMAHA DX11 synthesizer
+//
+// Version 0.3
+//
+//
+//
+//
+// Copyright (c) 2004-2006 Nil Geisweiller
+//
+//
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+// #include <cmath>
+// #include <list>
+
+// #include <stdio.h>
+
+#include "muse/midi.h"
+#include "libsynti/mess.h"
+#include "muse/midictrl.h"
+#include "deicsonze.h"
+// #include "config.h"
+
+#define ABS(x) (x>=0?x:-x)
+
+
+float DeicsOnze::waveTable[NBRWAVES][RESOLUTION];
+int DeicsOnze::useCount = 0;
+
+//---------------------------------------------------------
+// DeicsOnze
+//---------------------------------------------------------
+
+DeicsOnze::DeicsOnze() : Mess(1)
+{
+ if (useCount++ == 0) {
+ // create sinus wave table, W1
+ for(int i = 0; i < RESOLUTION; i++)
+ waveTable[W1][i] =
+ (float)(sin((i * 2.0 * M_PI) / (double)RESOLUTION));
+ // create sinus*abs(sinus) wave table, W2
+ for(int i = 0; i < RESOLUTION; i++){
+ double t = (i * 2.0 * M_PI) / (double)RESOLUTION;
+ waveTable[W2][i] = (float)(ABS(sin(t))*sin(t));}
+ // create halfsinus_ wave table, W3
+ for(int i = 0; i < RESOLUTION; i++)
+ waveTable[W3][i] = (float)
+ (i<RESOLUTION/2?sin((i*2.0*M_PI)/(double)RESOLUTION):0.0);
+ // create halfsinus*abs(sinus)_ wave table, W4
+ for(int i = 0; i < RESOLUTION; i++){
+ double t = (i * 2.0 * M_PI) / (double)RESOLUTION;
+ waveTable[W4][i] = (float)(i<RESOLUTION/2?ABS(sin(t))*sin(t):0.0);}
+ // create sinus_ wave table, W5
+ for(int i = 0; i < RESOLUTION; i++)
+ waveTable[W5][i] = (float)
+ (i<RESOLUTION/2?sin((i*4.0*M_PI) / (double)RESOLUTION):0.0);
+ // create sinus*abs(sinus)_ wave table, W6
+ for(int i = 0; i < RESOLUTION; i++){
+ double t = (i*4.0*M_PI) / (double)RESOLUTION;
+ waveTable[W6][i] = (float)(i<RESOLUTION/2?ABS(sin(t))*sin(t):0.0);}
+ // create 2halfsinus_ wave table, W7
+ for(int i = 0; i < RESOLUTION; i++)
+ waveTable[W7][i] = (float)
+ (i<RESOLUTION/2?ABS(sin((i*4.0*M_PI)/(double)RESOLUTION)):0.0);
+ // create 2halfsinus*abs(sinus)_ wave table, W8
+ for(int i = 0; i < RESOLUTION; i++){
+ double t = (i * 4.0 * M_PI) / (double)RESOLUTION;
+ waveTable[W8][i] = (float)(i<RESOLUTION/2?sin(t)*sin(t):0.0);}
+ }
+
+ srand(time(0)); // initialize random number generator
+
+ _gui = new DeicsOnzeGui(this);
+ _gui->setWindowTitle(QString("DeicsOnze"));
+ _gui->show();
+
+ initCtrls();
+ initGlobal();
+ initVoices();
+
+ //Load configuration
+ QString defaultConf = (QString(getenv("HOME")) + QString("/." DEICSONZESTR));
+ FILE* f;
+ f = fopen(defaultConf.toAscii().data(), "r");
+ if(f) {
+ fclose(f);
+ loadConfiguration(defaultConf);
+ }
+
+ //load Set
+ _set=new Set("Initial Bank");
+ if(_isInitSet) loadSet(_initSetPath);
+
+ _initialPreset = new
+ Preset(new Subcategory(new Category(NULL, "NONE", 0), "NONE", 0));
+ _preset=_initialPreset;
+
+ setPreset();
+}
+
+//---------------------------------------------------------
+// ~DeicsOnze
+//---------------------------------------------------------
+
+DeicsOnze::~DeicsOnze()
+{
+ //if (--useCount == 0)
+ //delete[] sine_table;
+}
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+bool DeicsOnze::guiVisible() const
+{
+ return _gui->isVisible();
+}
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+void DeicsOnze::showGui(bool val)
+{
+ _gui->setShown(val);
+}
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void DeicsOnze::getGeometry(int* x, int* y, int* w, int* h) const {
+ QPoint pos(_gui->pos());
+ QSize size(_gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+}
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void DeicsOnze::setGeometry(int x, int y, int w, int h) {
+ _gui->resize(QSize(w, h));
+ _gui->move(QPoint(x, y));
+}
+
+//---------------------------------------------------------
+// initCtrls
+//---------------------------------------------------------
+void DeicsOnze::initCtrls() {
+ int i=0;
+ for(int k=0; k<NBROP; k++) {
+ _ctrl[i].name=(QString(ARSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_AR+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXAR;
+ _ctrl[i].name=(QString(D1RSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_D1R+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXD1R;
+ _ctrl[i].name=(QString(D2RSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_D2R+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXD2R;
+ _ctrl[i].name=(QString(RRSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_RR+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXRR;
+ _ctrl[i].name=(QString(D1LSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_D1L+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXD1L;
+ _ctrl[i].name=(QString(LSSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_LS+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXLS;
+ _ctrl[i].name=(QString(RSSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_RS+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXRS;
+ _ctrl[i].name=(QString(EBSSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_EBS+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXEBS;
+ _ctrl[i].name=(QString(AMESTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_AME+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=1;
+ _ctrl[i].name=(QString(KVSSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_KVS+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXKVS;
+ _ctrl[i].name=(QString(OUTSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_OUT+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXOUT;
+ _ctrl[i].name=(QString("Centi")+QString(RATIOSTR)+QString::number(k+1))
+ .toAscii().data();
+ _ctrl[i].num=CTRL_RATIO+k*DECAPAR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXRATIO*100;
+ _ctrl[i].name=(QString(DETSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_DET+k*DECAPAR1;
+ _ctrl[i].min=-MAXDET;
+ _ctrl[i++].max=MAXDET;
+ }
+ _ctrl[i].name=ALGSTR;
+ _ctrl[i].num=CTRL_ALG;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXALG;
+ _ctrl[i].name=FEEDBACKSTR;
+ _ctrl[i].num=CTRL_FEEDBACK;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXFEEDBACK;
+ _ctrl[i].name=SPEEDSTR;
+ _ctrl[i].num=CTRL_SPEED;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXSPEED;
+ _ctrl[i].name=DELAYSTR;
+ _ctrl[i].num=CTRL_DELAY;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXDELAY;
+ _ctrl[i].name=PMODDEPTHSTR;
+ _ctrl[i].num=CTRL_PMODDEPTH;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPMODDEPTH;
+ _ctrl[i].name=AMODDEPTHSTR;
+ _ctrl[i].num=CTRL_AMODDEPTH;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXAMODDEPTH;
+ _ctrl[i].name=SYNCSTR;
+ _ctrl[i].num=CTRL_SYNC;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=1;
+ _ctrl[i].name=WAVESTR;
+ _ctrl[i].num=CTRL_WAVE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXWAVE;
+ _ctrl[i].name=PMODSENSSTR;
+ _ctrl[i].num=CTRL_PMODSENS;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPMODSENS;
+ _ctrl[i].name=AMSSTR;
+ _ctrl[i].num=CTRL_AMS;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXAMS;
+ _ctrl[i].name=TRANSPOSESTR;
+ _ctrl[i].num=CTRL_TRANSPOSE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXTRANSPOSE;
+ _ctrl[i].name=POLYMODESTR;
+ _ctrl[i].num=CTRL_POLYMODE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=1;
+ _ctrl[i].name=PBENDRANGESTR;
+ _ctrl[i].num=CTRL_PBENDRANGE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPBENDRANGE;
+ _ctrl[i].name=PORTAMODESTR;
+ _ctrl[i].num=CTRL_PORTAMODE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=1;
+ _ctrl[i].name=PORTATIMESTR;
+ _ctrl[i].num=CTRL_PORTATIME;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPROTATIME;
+ _ctrl[i].name=FCVOLUMESTR;
+ _ctrl[i].num=CTRL_FCVOLUME;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXFCVOLUME;
+ _ctrl[i].name=FSWSTR;
+ _ctrl[i].num=CTRL_FSW;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXFSW;
+ _ctrl[i].name=MWPITCHSTR;
+ _ctrl[i].num=CTRL_MWPITCH;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXMWPITCH;
+ _ctrl[i].name=MWAMPLITUDESTR;
+ _ctrl[i].num=CTRL_MWAMPLITUDE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXMWAMPLITUDE;
+ _ctrl[i].name=BCPITCHSTR;
+ _ctrl[i].num=CTRL_BCPITCH;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXBCPITCH;
+ _ctrl[i].name=BCAMPLITUDESTR;
+ _ctrl[i].num=CTRL_BCAMPLITUDE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXBCAMPLITUDE;
+ _ctrl[i].name=BCPITCHBIASSTR;
+ _ctrl[i].num=CTRL_BCPITCHBIAS;
+ _ctrl[i].min=-MAXBCPITCHBIAS;
+ _ctrl[i++].max=MAXBCPITCHBIAS;
+ _ctrl[i].name=BCEGBIASSTR;
+ _ctrl[i].num=CTRL_BCEGBIAS;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXBCEGBIAS;
+ _ctrl[i].name=ATPITCHSTR;
+ _ctrl[i].num=CTRL_ATPITCH;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXATPITCH;
+ _ctrl[i].name=ATAMPLITUDESTR;
+ _ctrl[i].num=CTRL_ATAMPLITUDE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXATAMPLITUDE;
+ _ctrl[i].name=ATPITCHBIASSTR;
+ _ctrl[i].num=CTRL_ATPITCHBIAS;
+ _ctrl[i].min=-MAXATPITCHBIAS;
+ _ctrl[i++].max=MAXATPITCHBIAS;
+ _ctrl[i].name=ATEGBIASSTR;
+ _ctrl[i].num=CTRL_ATEGBIAS;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXATEGBIAS;
+ _ctrl[i].name=PR1STR;
+ _ctrl[i].num=CTRL_PR1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPR;
+ _ctrl[i].name=PR2STR;
+ _ctrl[i].num=CTRL_PR2;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPR;
+ _ctrl[i].name=PR3STR;
+ _ctrl[i].num=CTRL_PR3;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPR;
+ _ctrl[i].name=PL1STR;
+ _ctrl[i].num=CTRL_PL1;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPL;
+ _ctrl[i].name=PL2STR;
+ _ctrl[i].num=CTRL_PL2;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPL;
+ _ctrl[i].name=PL3STR;
+ _ctrl[i].num=CTRL_PL3;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXPL;
+ for(int k=0; k<NBROP; k++) {
+ _ctrl[i].name=(QString(FIXSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_FIX+k*DECAPAR2;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=1;
+ _ctrl[i].name=(QString("Centi")+QString(FIXRANGESTR)
+ +QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_FIXRANGE+k*DECAPAR2;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXFIXRANGE*100;
+ _ctrl[i].name=(QString(OSWSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_OSW+k*DECAPAR2;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXOSW;
+ _ctrl[i].name=(QString(SHFTSTR)+QString::number(k+1)).toAscii().data();
+ _ctrl[i].num=CTRL_SHFT+k*DECAPAR2;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXSHFT;
+ }
+ _ctrl[i].name=REVERBRATESTR;
+ _ctrl[i].num=CTRL_REVERBRATE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=7;
+ _ctrl[i].name=FCPITCHSTR;
+ _ctrl[i].num=CTRL_FCPITCH;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXFCPITCH;
+ _ctrl[i].name=FCAMPLITUDESTR;
+ _ctrl[i].num=CTRL_FCAMPLITUDE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXFCAMPLITUDE;
+ _ctrl[i].name=GLOBALDETUNESTR;
+ _ctrl[i].num=CTRL_GLOBALDETUNE;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXGLOBALDETUNE;
+ _ctrl[i].name=MASTERVOLUMESTR;
+ _ctrl[i].num=CTRL_MASTERVOLUME;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXMASTERVOLUME;
+ _ctrl[i].name=FINEBRIGHTNESSSTR;
+ _ctrl[i].num=CTRL_FINEBRIGHTNESS;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXFINEBRIGHTNESS;
+ _ctrl[i].name=NBRVOICESSTR;
+ _ctrl[i].num=CTRL_NBRVOICES;
+ _ctrl[i].min=0;
+ _ctrl[i++].max=MAXNBRVOICES;
+ nbrCtrl=i;
+}
+
+//---------------------------------------------------------
+// initGlobal
+//---------------------------------------------------------
+void DeicsOnze::initGlobal() {
+ setMasterVol(32);
+ _global.quality = high;
+ _global.sustain = false;
+ _global.pitchBendCoef = 1.0;
+ _global.lfoIndex = 0;
+ _numPatch = 0;
+ _saveOnlyUsed = true;
+ _saveConfig = true;
+ _global.nbrVoices = 8;
+ _global.channelNum = -1;
+ _isInitSet = true;
+ _initSetPath =
+ "/usr/local/share/muse-1.0pre1/presets/deicsonze/SutulaBank.dei";
+ //INSTPREFIX + "/share/" + PACKAGEVERSION + "/presets/deicsonze/ARCH_ALIN";
+}
+
+//---------------------------------------------------------
+// initVoice
+//---------------------------------------------------------
+void DeicsOnze::initVoice(unsigned char v) {
+ _voices[v].isOn=false;
+ _voices[v].isSustained=false;
+}
+//---------------------------------------------------------
+// initVoices
+//---------------------------------------------------------
+void DeicsOnze::initVoices() {
+ for(int v=0; v<MAXNBRVOICES; v++) initVoice((unsigned char)v);
+}
+
+//--------------------------------------------------------
+// findPreset
+//--------------------------------------------------------
+Preset* DeicsOnze::findPreset(int hbank, int lbank, int prog) {
+ return _set->findPreset(hbank, lbank, prog);
+}
+
+
+//---------------------------------------------------------
+// note2Amp
+// return the Amp of a note depending on the level scaling
+//---------------------------------------------------------
+inline double note2Amp(double note, int ls)
+{
+ if(ls==0) return(1.0);
+ else return((note<LEVELSCALENOTE?1.0:exp((double)ls*COEFLEVELSCALE*
+ ((double)LEVELSCALENOTE-note))));
+}
+
+//---------------------------------------------------------
+// delay2Time
+// return the time in second corresponding to the LFO delay parameter
+//---------------------------------------------------------
+inline double delay2Time(int d)
+{
+ double t;
+ //fitting
+ t=0.07617*(double)d-0.002695*(double)(d*d)+4.214e-05*(double)(d*d*d);
+ //printf("delay2Time : %f\n", t);
+ return(t);
+}
+
+//----------------------------------------------------------------
+// setNbrVoices
+//----------------------------------------------------------------
+void DeicsOnze::setNbrVoices(unsigned char nv) {
+ nv=(nv>MAXNBRVOICES?MAXNBRVOICES:(nv<1?1:nv));
+ //we assume that any voices
+ //that is not included in the active voices is properly initialized
+ for(int v=nv; v<_global.nbrVoices; v++) initVoice(v);
+ _global.nbrVoices=nv;
+}
+
+//----------------------------------------------------------------
+// setMasterVol
+//----------------------------------------------------------------
+void DeicsOnze::setMasterVol(int mv) {
+ _global.amp=(double)mv/(double)MAXMASTERVOLUME;
+}
+
+//----------------------------------------------------------------
+// getMasterVol
+//----------------------------------------------------------------
+int DeicsOnze::getMasterVol(void) {
+ return((int)(_global.amp*(double)MAXMASTERVOLUME));
+}
+
+//----------------------------------------------------------------
+// setLfo
+//----------------------------------------------------------------
+void DeicsOnze::setLfo()
+{
+ double x;
+ x=(double)_preset->lfo.speed;
+ // lfoSpeed to Hz, obtained by fitting the actual curve by a polynomial
+ _global.lfoFreq=-1.9389e-08*x*x*x*x*x+2.8826e-06*x*x*x*x-9.0316e-05*x*x*x
+ +4.7453e-03*x*x-1.2295e-02*x+7.0347e-02;//a revoir
+ //Pitch LFO
+ _global.lfoMaxIndex=(_global.lfoFreq==0?0:(int)((1.0/_global.lfoFreq)
+ *(double)sampleRate()));
+ _global.lfoPitch=(((double)_preset->lfo.pModDepth/(double)MAXPMODDEPTH)
+ *(COEFPLFO(_preset->sensitivity.pitch)));
+ //Amplitude LFO
+ _global.lfoMaxAmp=(((double)_preset->lfo.aModDepth/(double)MAXAMODDEPTH)
+ *(COEFALFO(_preset->sensitivity.amplitude)));
+ //index is concidered on the frequency of the delay
+ _global.lfoDelayMaxIndex=delay2Time(_preset->lfo.delay)*_global.lfoFreq;
+ _global.lfoDelayInct=(double)(RESOLUTION/4)/_global.lfoDelayMaxIndex;
+}
+
+//-----------------------------------------------------------------
+// setOutLevel
+//-----------------------------------------------------------------
+void DeicsOnze::setOutLevel(int k) {
+ for(int v=0; v<_global.nbrVoices; v++) {
+ if(_voices[v].op[k].envState!=OFF) {
+ _voices[v].op[k].amp = outLevel2Amp(_preset->outLevel[k])
+ * _voices[v].op[k].ampVeloNote * brightness2Amp(k);
+ }
+ }
+}
+void DeicsOnze::setOutLevel() {
+ for(int k=0; k<NBROP; k++) {
+ setOutLevel(k);
+ }
+}
+//-----------------------------------------------------------------
+// setEnvAttack
+//-----------------------------------------------------------------
+void DeicsOnze::setEnvAttack(int v, int k) {
+ if(_voices[v].op[k].envState==ATTACK)
+ _voices[v].op[k].envInct=
+ (_preset->eg[k].ar==0?0:
+ (double)(RESOLUTION/4)/(envAR2s(_preset->eg[k].ar)
+ *(double)sampleRate()))
+ *coefAttack(_preset->attack);
+}
+void DeicsOnze::setEnvAttack(int k) {
+ for(int v=0; v<_global.nbrVoices; v++) setEnvAttack(v, k);
+}
+void DeicsOnze::setEnvAttack() {
+ for(int k=0; k<NBROP; k++) setEnvAttack(k);
+}
+//-----------------------------------------------------------------
+// setEnvRelease
+//-----------------------------------------------------------------
+void DeicsOnze::setEnvRelease(int v, int k) {
+ if(_voices[v].op[k].envState==RELEASE)
+ _voices[v].op[k].coefVLevel = envRR2coef(_preset->eg[k].rr,
+ sampleRate(),
+ _preset->release);
+}
+void DeicsOnze::setEnvRelease(int k) {
+ for(int v=0; v<_global.nbrVoices; v++) setEnvRelease(v, k);
+}
+void DeicsOnze::setEnvRelease() {
+ for(int k=0; k<NBROP; k++) setEnvRelease(k);
+}
+//-----------------------------------------------------------------
+// brightness2Amp
+//-----------------------------------------------------------------
+double DeicsOnze::brightness2Amp(int k) {
+ if(
+ (k==1 && (_preset->algorithm!=SIXTH || _preset->algorithm!=SEVENTH
+ || _preset->algorithm!=EIGHTH))
+ ||
+ (k==2 && (_preset->algorithm==FIRST || _preset->algorithm==SECOND
+ || _preset->algorithm==THIRD || _preset->algorithm==FOURTH))
+ ||
+ (k==3 && (_preset->algorithm!=EIGHTH))
+ ) {
+ double x = 2.0*(double)_preset->brightness/(double)MAXFINEBRIGHTNESS;
+ double square_x = x*x;
+ return(square_x*x);
+ }
+ else return(1.0);
+}
+//-----------------------------------------------------------------
+// setFeedback
+//-----------------------------------------------------------------
+void DeicsOnze::setFeedback() {
+ _global.feedbackAmp=COEFFEEDBACK*exp(log(2)*(double)(_preset->feedback
+ -MAXFEEDBACK));
+}
+
+//-----------------------------------------------------------------
+// setPreset
+//-----------------------------------------------------------------
+
+void DeicsOnze::setPreset() {
+ setFeedback();
+ setLfo();
+ setEnvAttack();
+ setEnvRelease();
+ setOutLevel();
+}
+
+
+inline double coarseFine2Ratio(int c,int f) {
+ double tab[64][16]=
+ {
+ {0.50,0.56,0.62,0.68,0.75,0.81,0.87,0.93,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
+ {0.71,0.79,0.88,0.96,1.05,1.14,1.23,1.32,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
+ {0.78,0.88,0.98,1.07,1.17,1.27,1.37,1.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
+ {0.87,0.97,1.08,1.18,1.29,1.40,1.51,1.62,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},
+ {1.00,1.06,1.12,1.18,1.25,1.31,1.37,1.43,1.50,1.56,1.62,1.68,1.75,1.81,1.87,1.93},
+ {1.41,1.49,1.58,1.67,1.76,1.85,1.93,2.02,2.11,2.20,2.29,2.37,2.46,2.55,2.64,2.73},
+ {1.57,1.66,1.76,1.86,1.96,2.06,2.15,2.25,2.35,2.45,2.55,2.64,2.74,2.84,2.94,3.04},
+ {1.73,1.83,1.94,2.05,2.16,2.27,2.37,2.48,2.59,2.70,2.81,2.91,3.02,3.13,3.24,3.35},
+ {2.00,2.06,2.12,2.18,2.25,2.31,2.37,2.43,2.50,2.56,2.62,2.68,2.75,2.81,2.87,2.93},
+ {2.82,2.90,2.99,3.08,3.17,3.26,3.34,3.43,3.52,3.61,3.70,3.78,3.87,3.96,4.05,3.14},
+ {3.00,3.06,3.12,3.18,3.25,3.31,3.37,3.43,3.50,3.56,3.62,3.68,3.75,3.81,3.87,3.93} ,
+ {3.14,3.23,3.33,3.43,3.53,3.63,3.72,3.82,3.92,4.02,4.12,4.21,4.31,4.41,4.51,4.61},
+ {3.46,3.56,3.67,3.78,3.89,4.00,4.10,4.21,4.32,4.43,4.54,4.64,4.75,4.86,4.97,5.08},
+ {4.00,4.06,4.12,4.18,4.25,4.31,4.37,4.43,4.50,4.56,4.62,4.68,4.75,4.81,4.87,4.93},
+ {4.24,4.31,4.40,4.49,4.58,4.67,4.75,4.84,4.93,5.02,5.11,5.19,5.28,5.37,5.46,5.55},
+ {4.71,4.80,4.90,5.00,5.10,5.20,5.29,5.39,5.49,5.59,5.69,5.78,5.88,5.98,6.08,6.18},
+ {5.00,5.06,5.12,5.18,5.25,5.31,5.37,5.43,5.50,5.56,5.62,5.68,5.75,5.81,5.87,5.93},
+ {5.19,5.29,5.40,5.51,5.62,5.73,5.83,5.94,6.05,6.16,6.27,6.37,6.48,6.59,6.70,6.81},
+ {5.65,5.72,5.81,5.90,5.99,6.08,6.16,6.25,6.34,6.43,6.52,6.60,6.69,6.78,6.87,6.96},
+ {6.00,6.06,6.12,6.18,6.25,6.31,6.37,6.43,6.50,6.56,6.62,6.68,6.75,6.81,6.87,6.93},
+ {6.28,6.37,6.47,6.57,6.67,6.77,6.86,6.96,7.06,7.16,7.26,7.35,7.45,7.55,7.65,7.75},
+ {6.92,7.02,7.13,7.24,7.35,7.46,7.56,7.67,7.78,7.89,8.00,8.10,8.21,8.32,8.43,8.54},
+ {7.00,7.06,7.12,7.18,7.25,7.31,7.37,7.43,7.50,7.56,7.62,7.68,7.75,7.81,7.87,7.93},
+ {7.07,7.13,7.22,7.31,7.40,7.49,7.57,7.66,7.75,7.84,7.93,8.01,8.10,8.19,8.28,8.37},
+ {7.85,7.94,8.04,8.14,8.24,8.34,8.43,8.53,8.63,8.73,8.83,8.92,9.02,9.12,9.22,9.32},
+ {8.00,8.06,8.12,8.18,8.25,8.31,8.37,8.43,8.50,8.56,8.62,8.68,8.75,8.81,8.87,8.93},
+ {8.48,8.54,8.63,8.72,8.81,8.90,8.98,9.07,9.16,9.25,9.34,9.42,9.51,9.60,9.69,9.78},
+ {8.65,8.75,8.86,8.97,9.08,9.19,9.29,9.40,9.51,9.62,9.73,9.83,9.94,10.05,10.16,10.27},
+ {9.00,9.06,9.12,9.18,9.25,9.31,9.37,9.43,9.50,9.56,9.62,9.68,9.75,9.81,9.87,9.93},
+ {9.42,9.51,9.61,9.71,9.81,9.91,10.00,10.10,10.20,10.30,10.40,10.49,10.59,10.69,10.79,10.89},
+ {9.89,9.95,10.04,10.13,10.22,10.31,10.39,10.48,10.57,10.66,10.75,10.83,10.92,11.01,11.10,11.19},
+ {10.00,10.06,10.12,10.18,10.25,10.31,10.37,10.43,10.50,10.56,10.62,10.68,10.75,10.81,10.87,10.93},
+ {10.38,10.48,10.59,10.70,10.81,10.92,11.02,11.13,11.24,11.35,11.46,11.56,11.67,11.78,11.89,12.00},
+ {10.99,11.08,11.18,11.28,11.38,11.48,11.57,11.67,11.77,11.87,11.97,12.06,12.16,12.26,12.36,12.46},
+ {11.00,11.06,11.12,11.18,11.25,11.31,11.37,11.43,11.50,11.56,11.62,11.68,11.75,11.81,11.87,11.93},
+ {11.30,11.36,11.45,11.54,11.63,11.72,11.80,11.89,11.98,12.07,12.16,12.24,12.33,12.42,12.51,12.60},
+ {12.00,12.06,12.12,12.18,12.25,12.31,12.37,12.43,12.50,12.56,12.62,12.68,12.75,12.81,12.87,12.93},
+ {12.11,12.21,12.32,12.43,12.54,12.65,12.75,12.86,12.97,13.08,13.19,13.29,13.40,13.51,13.62,13.73},
+ {12.56,12.65,12.75,12.85,12.95,13.05,13.14,13.24,13.34,13.44,13.54,13.63,13.73,13.83,13.93,14.03},
+ {12.72,12.77,12.86,12.95,13.04,13.13,13.21,13.30,13.39,13.48,13.57,13.65,13.74,13.83,13.92,14.01},
+ {13.00,13.06,13.12,13.18,13.25,13.31,13.37,13.43,13.50,13.56,13.62,13.68,13.75,13.81,13.87,13.93},
+ {13.84,13.94,14.05,14.16,14.27,14.38,14.48,14.59,14.70,14.81,14.92,15.02,15.13,15.24,15.35,15.46},
+ {14.00,14.06,14.12,14.18,14.25,14.31,14.37,14.43,14.50,14.56,14.62,14.68,14.75,14.81,14.87,14.93},
+ {14.10,14.18,14.27,14.36,14.45,14.54,14.62,14.71,14.80,14.89,14.98,15.06,15.15,15.24,15.33,15.42},
+ {14.13,14.22,14.32,14.42,14.52,14.62,14.71,14.81,14.91,15.01,15.11,15.20,15.30,15.40,15.50,15.60},
+ {15.00,15.06,15.12,15.18,15.25,15.31,15.37,15.43,15.50,15.56,15.62,15.68,15.75,15.81,15.87,15.93},
+ {15.55,15.59,15.68,15.77,15.86,15.95,16.03,16.12,16.21,16.30,16.39,16.47,16.56,16.65,16.74,16.83},
+ {15.57,15.67,15.78,15.89,16.00,16.11,16.21,16.32,16.43,16.54,16.65,16.75,16.86,16.97,17.08,17.19},
+ {15.70,15.79,15.89,15.99,16.09,16.19,16.28,16.38,16.48,16.58,16.68,16.77,16.87,16.97,17.07,17.17},
+ {16.96,17.00,17.09,17.18,17.27,17.36,17.44,17.53,17.62,17.71,17.80,17.88,17.97,18.06,18.15,18.24},
+ {17.27,17.36,17.46,17.56,17.66,17.76,17.85,17.95,18.05,18.15,18.25,18.34,18.44,18.54,18.64,18.74},
+ {17.30,17.40,17.51,17.62,17.73,17.84,17.94,18.05,18.16,18.27,18.38,18.48,18.59,18.70,18.81,18.92},
+ {18.37,18.41,18.50,18.59,18.68,18.77,18.85,18.94,19.03,19.12,19.21,19.29,19.38,19.47,19.56,19.65},
+ {18.84,18.93,19.03,19.13,19.23,19.33,19.42,19.52,19.62,19.72,19.82,19.91,20.01,20.11,20.21,20.31},
+ {19.03,19.13,19.24,19.35,19.46,19.57,19.67,19.78,19.89,20.00,20.11,20.21,20.32,20.43,20.54,20.65},
+ {19.78,19.82,19.91,20.00,20.09,20.18,20.26,20.35,20.44,20.53,20.62,20.70,20.79,20.88,20.97,21.06},
+ {20.41,20.50,20.60,20.70,20.80,20.90,20.99,21.09,21.19,21.29,21.39,21.48,21.58,21.68,21.78,21.88},
+ {20.76,20.86,20.97,21.08,21.19,21.30,21.40,21.51,21.62,21.73,21.84,21.94,22.05,22.16,22.27,22.38},
+ {21.20,21.23,21.32,21.41,21.50,21.59,21.67,21.76,21.85,21.94,22.03,22.11,22.20,22.29,22.38,22.47},
+ {21.98,22.07,22.17,22.17,22.37,22.47,22.56,22.66,22.76,22.86,22.96,23.05,23.15,23.25,23.35,23.45},
+ {22.49,22.59,22.70,22.81,22.92,23.03,23.13,13.24,13.35,13.46,13.57,13.67,13.78,13.89,24.00,24.11},
+ {23.55,23.64,23.74,23.84,23.94,24.04,24.13,24.23,24.33,24.43,24.53,24.62,24.72,24.82,24.92,25.02},
+ {24.22,24.32,24.43,24.54,24.65,24.76,24.86,24.97,25.08,25.19,25.30,25.40,25.51,25.62,25.73,25.84},
+ {25.95,26.05,26.16,26.27,26.38,26.49,26.59,26.70,26.81,26.92,27.03,27.13,27.24,27.35,27.46,27.57}
+ };
+ return(tab[c][f]);
+}
+
+//---------------------------------------------------------------
+// loadSet
+//---------------------------------------------------------------
+void DeicsOnze::loadSet(QString fileName) {
+ // read the XML file and create DOM tree
+ if(!fileName.isEmpty()) {
+ QFile deicsonzeFile(fileName);
+ if(!deicsonzeFile.open(QIODevice::ReadOnly)) {
+ printf("Critical Error Cannot open file %s\n",
+ fileName.toAscii().data());
+ return;
+ }
+ QDomDocument domTree;
+ if (!domTree.setContent(&deicsonzeFile )) {
+ printf("Critical Error Parsing error for file %s\n",
+ fileName.toAscii().data());
+ deicsonzeFile.close();
+ return;
+ }
+ deicsonzeFile.close();
+
+ QDomNode node = domTree.documentElement();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "deicsOnzeSet") {
+ QString version = e.attribute(QString("version"));
+ if (version == "1.0") {
+ _preset=_initialPreset;
+ while(!_set->_categoryVector.empty())
+ delete(*_set->_categoryVector.begin());
+ _set->readSet(node.firstChild());
+ //display load preset
+ unsigned char dataUpdateGuiSet[1];
+ dataUpdateGuiSet[0]=SYSEX_UPDATESETGUI;
+ MidiEvent evSysexUpdateGuiSet(0, ME_SYSEX,
+ (const unsigned char*)dataUpdateGuiSet,
+ 1);
+ _gui->writeEvent(evSysexUpdateGuiSet);
+ }
+ else printf("unsupported *.dei file version %s\n",
+ version.toLatin1().data());
+ }
+ else printf("DeicsOnze: %s not supported\n",
+ e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+}
+//---------------------------------------------------------------
+// loadSutulaPreset
+//---------------------------------------------------------------
+/*
+void DeicsOnze::loadSutulaPresets()
+{
+ FILE* file;
+ int v;
+ int crs[NBROP], fin[NBROP]; //coarse ratio, fine ratio
+ char s[500];
+ char sname[LENGTHNAME+1];
+ char scategory[LENGTHCATEGORY+1];
+ char ssubcategory[LENGTHSUBCATEGORY+1];
+ int k;
+ int nhBank, nlBank, nPreset;
+ Preset* presetTemp;
+ Subcategory* subcategoryTemp;
+ Category* categoryTemp;
+
+ if(!_set) _set=new Set("Sutula Bank");
+
+ nhBank=0;
+ nlBank=0;
+ nPreset=0;
+
+ QString presetPath(INSTPREFIX);
+ presetPath += "/share/" PACKAGEVERSION "/presets/deicsonze/ARCH_ALIN";
+
+ file = fopen (presetPath.toLatin1().data(), "rt");
+ if (file == NULL) {
+ printf("can't open ");
+ printf(presetPath.toLatin1().data());
+ printf("\n");
+ }
+ else
+ {
+ while(fgets(s, 500, file) && !strstr(s, "** Source:"))
+ {
+ if (strstr(s,"* CATEGORY"))
+ {
+ sscanf(s, "* CATEGORY %s", scategory);
+ categoryTemp=new Category(_set, scategory,0);
+ }
+ if (strstr(s,"* SUBCATEGORY"))
+ {
+ sscanf(s, "* SUBCATEGORY %s", ssubcategory);
+ subcategoryTemp=new Subcategory(categoryTemp,ssubcategory,0);
+ nlBank++;
+ }
+ }
+ while(!feof(file))
+ {
+
+ presetTemp=new Preset(subcategoryTemp);
+ // Fill the preset
+ //OP.4 to OP.1
+ for(int kaka=(NBROP-1); kaka>=0; kaka--)
+ {
+ k=(kaka==2?1:(kaka==1?2:kaka));
+
+ fscanf(file, "%x", &v);//0
+ presetTemp->eg[k].ar=v;
+ fscanf(file, "%x", &v);//1
+ presetTemp->eg[k].d1r=v;
+ fscanf(file, "%x", &v);//2
+ presetTemp->eg[k].d2r=v;
+ fscanf(file, "%x", &v);//3
+ presetTemp->eg[k].rr=v;
+ fscanf(file, "%x", &v);//4
+ presetTemp->eg[k].d1l=v;
+ fscanf(file, "%x", &v);//5
+ presetTemp->scaling.level[k]=v;
+ fscanf(file, "%x", &v);//6
+ presetTemp->sensitivity.keyVelocity[k]=
+ v & 0x7;
+ presetTemp->sensitivity.egBias[k]=
+ (v & 0x38)>>3;
+ presetTemp->sensitivity.ampOn[k]=
+ (v & 0x40)>>6;
+ fscanf(file, "%x", &v);//7
+ presetTemp->outLevel[k]=v;
+ fscanf(file, "%x", &v);//8
+ crs[k]=v;
+ fscanf(file, "%x", &v);//9
+ presetTemp->detune[k]=(v & 0x7)-3;
+ presetTemp->scaling.rate[k]=(v & 0x18)>>3;
+ }
+ fscanf(file, "%x", &v);//40
+ presetTemp->algorithm=
+ ((v & 0x7)==0?FIRST:
+ ((v & 0x7)==1?SECOND:
+ ((v & 0x7)==2?THIRD:
+ ((v & 0x7)==3?FOURTH:
+ ((v & 0x7)==4?FIFTH:
+ ((v & 0x7)==5?SIXTH:
+ ((v & 0x7)==6?SEVENTH:EIGHTH)))))));
+ presetTemp->feedback=(v & 0x38)>>3;
+ presetTemp->lfo.sync=(v & 0x40)>>6;
+ fscanf(file, "%x", &v);//41
+ presetTemp->lfo.speed=v;
+ fscanf(file, "%x", &v);//42
+ presetTemp->lfo.delay=v;
+ fscanf(file, "%x", &v);//43
+ presetTemp->lfo.pModDepth=v;
+ fscanf(file, "%x", &v);//44
+ presetTemp->lfo.aModDepth=v;
+ fscanf(file, "%x", &v);//45
+ presetTemp->lfo.wave=
+ ((v & 0x3)==0?SAWUP:
+ ((v & 0x3)==1?SQUARE:
+ ((v & 0x3)==2?TRIANGL:SHOLD)));
+ presetTemp->sensitivity.amplitude=(v & 0xc)>>2;
+ presetTemp->sensitivity.pitch=(v & 0x70)>>4;
+ fscanf(file, "%x", &v);//46
+ presetTemp->function.transpose=v-24;
+ fscanf(file, "%x", &v);//47
+ presetTemp->function.pBendRange=v;
+ fscanf(file, "%x", &v);//48
+ presetTemp->function.portamento=
+ ((v & 0x1)==0?FULL:FINGER);
+ presetTemp->function.footSw=
+ ((v & 0x4)==0?SUS:POR);
+ presetTemp->function.mode=
+ ((v & 0x8)==0?POLY:MONO);
+ fscanf(file, "%x", &v);//49
+ presetTemp->function.portamentoTime=v;
+ fscanf(file, "%x", &v);//50
+ presetTemp->function.fcVolume=v;
+ fscanf(file, "%x", &v);//51
+ presetTemp->function.mwPitch=v;
+ fscanf(file, "%x", &v);//52
+ presetTemp->function.mwAmplitude=v;
+ fscanf(file, "%x", &v);//53
+ presetTemp->function.bcPitch=v;
+ fscanf(file, "%x", &v);//54
+ presetTemp->function.bcAmplitude=v;
+ fscanf(file, "%x", &v);//55
+ presetTemp->function.bcPitchBias=v;
+ fscanf(file, "%x", &v);//56
+ presetTemp->function.bcEgBias=v;
+ for(int l=0; l<10; l++)
+ {
+ fscanf(file, "%x", &v);//57 to 66
+ sname[l]=(char)v;
+ }
+ sname[10]='\0';
+ presetTemp->name=sname;
+ fscanf(file, "%x", &v);//67
+ presetTemp->pitchEg.pr1=v;
+ fscanf(file, "%x", &v);//68
+ presetTemp->pitchEg.pr2=v;
+ fscanf(file, "%x", &v);//69
+ presetTemp->pitchEg.pr3=v;
+ fscanf(file, "%x", &v);//70
+ presetTemp->pitchEg.pl1=v;
+ fscanf(file, "%x", &v);//71
+ presetTemp->pitchEg.pl1=v;
+ fscanf(file, "%x", &v);//72
+ presetTemp->pitchEg.pl1=v;
+ for(int kaka=(NBROP-1); kaka>=0; kaka--)
+ {
+ k=(kaka==2?1:(kaka==1?2:kaka));
+
+ fscanf(file, "%x", &v);//73, 75, 77, 79
+ presetTemp->frequency[k].isFix=(v & 0x8)>>3;
+ presetTemp->frequency[k].freq=((v & 0x7)==0?8:(v & 0x7)*16);
+ presetTemp->eg[k].egShift=
+ (((v & 0x30)>>4)==0?VOF:
+ (((v & 0x30)>>4)==1?V48:
+ (((v & 0x30)>>4)==2?V24:V12)));
+ fscanf(file, "%x", &v);//74, 76, 78, 80
+ fin[k]=v & 0xF;
+ presetTemp->frequency[k].freq+=fin[k];
+ presetTemp->frequency[k].ratio=
+ coarseFine2Ratio(crs[k],fin[k]);
+ presetTemp->oscWave[k]=
+ (((v & 0x70)>>4)==0?W1:
+ (((v & 0x70)>>4)==1?W2:
+ (((v & 0x70)>>4)==2?W3:
+ (((v & 0x70)>>4)==3?W4:
+ (((v & 0x70)>>4)==4?W5:
+ (((v & 0x70)>>4)==5?W6:
+ (((v & 0x70)>>4)==6?W7:W8)))))));
+ }
+ fscanf(file, "%x", &v);//81
+ presetTemp->function.reverbRate=v;
+ fscanf(file, "%x", &v);//82
+ presetTemp->function.fcPitch=v;
+ fscanf(file, "%x", &v);//83
+ presetTemp->function.fcAmplitude=v;
+ presetTemp->globalDetune=0;
+ presetTemp->prog=nPreset;
+ // End of filling the preset
+
+ nPreset++;
+ while(fgets(s, 500, file) && !strstr(s, "** Source:"))
+ {
+ if (strstr(s,"* CATEGORY"))
+ {
+ sscanf(s, "* CATEGORY %s", scategory);
+ nhBank++;
+ categoryTemp=new Category(_set,scategory,nhBank);
+ nlBank=0;
+ }
+ if (strstr(s,"* SUBCATEGORY"))
+ {
+ sscanf(s, "* SUBCATEGORY %s", ssubcategory);
+ subcategoryTemp=new
+ Subcategory(categoryTemp,ssubcategory,nlBank);
+ nlBank++;
+ nPreset=0;
+ }
+ }
+ }
+ }
+ fclose(file);
+}*/
+
+//---------------------------------------------------------
+// minVolu2Voice
+// return the number of the voice which is the least aloud
+// and is not is the ATTACK state
+//---------------------------------------------------------
+int DeicsOnze::minVolu2Voice() {
+ int minVoice=0;
+ double min=MAXVOLUME;
+ for(int i=0; i<_global.nbrVoices; i++)
+ {
+ min=((min>_voices[i].volume
+ && _voices[i].op[0].envState!=ATTACK
+ && _voices[i].op[1].envState!=ATTACK
+ && _voices[i].op[2].envState!=ATTACK
+ && _voices[i].op[3].envState!=ATTACK)?_voices[i].volume:min);
+ minVoice=(min==_voices[i].volume?i:minVoice);
+ }
+ return minVoice;
+}
+
+//---------------------------------------------------------
+// noteOff2Voice
+// return the number of one off voice, MAXNBRVOICES otherwise
+//---------------------------------------------------------
+int DeicsOnze::noteOff2Voice() {
+ int offVoice=MAXNBRVOICES;
+ for(int i=0; i<_global.nbrVoices; i++) offVoice=(_voices[i].isOn?offVoice:i);
+ return offVoice;
+}
+
+//---------------------------------------------------------
+// pitchOn2Voice
+// return the number of the voice which has the input
+// pitch and is On and not release, MAXNBRVOICES otherwise
+//---------------------------------------------------------
+int DeicsOnze::pitchOn2Voice(int pitch) {
+ int pitchVoice=MAXNBRVOICES;
+ for(int i=0; i<_global.nbrVoices; i++) {
+ if(_voices[i].pitch==pitch && _voices[i].isOn && !_voices[i].isSustained) {
+ if((_preset->algorithm == FIRST || _preset->algorithm == SECOND
+ || _preset->algorithm == THIRD || _preset->algorithm == FOURTH)
+ && _voices[i].op[0].envState!=RELEASE
+ && _voices[i].op[0].envState!=OFF)
+ pitchVoice = i;
+ if(_preset->algorithm == FIFTH
+ && ((_voices[i].op[0].envState!=RELEASE
+ && _voices[i].op[0].envState!=OFF)
+ || (_voices[i].op[2].envState!=RELEASE
+ && _voices[i].op[2].envState!=OFF)))
+ pitchVoice = i;
+ if((_preset->algorithm == SIXTH || _preset->algorithm == SEVENTH)
+ && ((_voices[i].op[0].envState!=RELEASE
+ && _voices[i].op[0].envState!=OFF)
+ || (_voices[i].op[1].envState!=RELEASE
+ && _voices[i].op[1].envState!=OFF)
+ || (_voices[i].op[2].envState!=RELEASE
+ && _voices[i].op[2].envState!=OFF)))
+ pitchVoice = i;
+ if(_preset->algorithm == EIGHTH
+ && ((_voices[i].op[0].envState!=RELEASE
+ && _voices[i].op[0].envState!=OFF)
+ || (_voices[i].op[1].envState!=RELEASE
+ && _voices[i].op[1].envState!=OFF)
+ || (_voices[i].op[2].envState!=RELEASE
+ && _voices[i].op[2].envState!=OFF)
+ || (_voices[i].op[3].envState!=RELEASE
+ && _voices[i].op[3].envState!=OFF)))
+ pitchVoice = i;
+ }
+ }
+ return pitchVoice;
+}
+
+
+//---------------------------------------------------------
+// pitch2freq
+//---------------------------------------------------------
+inline double pitch2freq(double p) {
+ return(LOWERNOTEFREQ*exp(p*log(2.0)/12.0));
+}
+
+//---------------------------------------------------------
+// lfoUpdate
+// update the coefficent which multiplies the current inct in order to
+// get the right current frequency with respect to the lfo
+// update the coefficent which multiplies the amplitude.
+//---------------------------------------------------------
+inline void lfoUpdate(Preset* p, Global* p_g, float* wt) {
+ double delayCoef;
+
+ if(p_g->lfoIndex==0)
+ {
+ if(p_g->lfoDelayIndex<(double)(RESOLUTION/4))
+ {
+ delayCoef=(double)wt[(int)p_g->lfoDelayIndex];
+ p_g->lfoMaxCoefInct=exp((log(2.0)/12.0)*p_g->lfoPitch*delayCoef);
+ p_g->lfoCoefInctInct=
+ exp((log(2.0)/12.0)*((2*p_g->lfoPitch*delayCoef)
+ /p_g->lfoMaxIndex));
+ p_g->lfoDelayIndex+=p_g->lfoDelayInct;
+ p_g->lfoMaxDAmp=delayCoef*p_g->lfoMaxAmp;
+ }
+ else
+ if(!p_g->delayPassed)
+ {
+ p_g->lfoMaxCoefInct=exp((log(2.0)/12.0)*p_g->lfoPitch);
+ p_g->lfoCoefInctInct=
+ exp((log(2.0)/12.0)*((2*p_g->lfoPitch)/p_g->lfoMaxIndex));
+ p_g->delayPassed=true;
+ p_g->lfoMaxDAmp=p_g->lfoMaxDAmp;
+ }
+ }
+
+ switch(p->lfo.wave)
+ {
+ case SAWUP :
+ if(p_g->lfoIndex==0)
+ {
+ p_g->lfoCoefInct=1.0/(p_g->lfoMaxCoefInct);
+ p_g->lfoCoefAmp=p_g->lfoMaxDAmp/(double)p_g->lfoMaxIndex;
+ p_g->lfoAmp=1.0;
+ }
+ else
+ {
+ p_g->lfoCoefInct*=p_g->lfoCoefInctInct;
+ p_g->lfoAmp-=p_g->lfoCoefAmp;
+ }
+ break;
+ case SQUARE :
+ if(p_g->lfoIndex==0)
+ {
+ p_g->lfoCoefInct=p_g->lfoMaxCoefInct;
+ p_g->lfoAmp=1.0;
+ }
+ if(p_g->lfoIndex==(p_g->lfoMaxIndex/2))
+ {
+ p_g->lfoCoefInct=1.0/p_g->lfoMaxCoefInct;
+ p_g->lfoAmp=1.0-p_g->lfoMaxDAmp;
+ }
+ break;
+ case TRIANGL :
+ if(p_g->lfoIndex==0)
+ {
+ p_g->lfoCoefInct=1.0;
+ p_g->lfoCoefAmp=p_g->lfoMaxDAmp
+ /(double)(p_g->lfoMaxIndex/2);
+ p_g->lfoAmp=1.0-p_g->lfoMaxDAmp/2.0;
+ }
+ else if(p_g->lfoIndex<(p_g->lfoMaxIndex/4))
+ {
+ p_g->lfoCoefInct*=p_g->lfoCoefInctInct;
+ p_g->lfoAmp-=p_g->lfoCoefAmp;
+ }
+ else if(p_g->lfoIndex<((3*p_g->lfoMaxIndex)/4))
+ {
+ p_g->lfoCoefInct/=p_g->lfoCoefInctInct;
+ p_g->lfoAmp+=p_g->lfoCoefAmp;
+ }
+ else if(p_g->lfoIndex<p_g->lfoMaxIndex)
+ {
+ p_g->lfoCoefInct*=p_g->lfoCoefInctInct;
+ p_g->lfoAmp-=p_g->lfoCoefAmp;
+ }
+ break;
+ case SHOLD :
+ if(p_g->lfoIndex==0||p_g->lfoIndex==(p_g->lfoMaxIndex/2))
+ {
+ double r;//uniform random between -1.0 and 1.0
+ r = (double)(2*rand()-RAND_MAX)/(double)RAND_MAX;
+ p_g->lfoCoefInct=(r>=0.0?1.0+r*(p_g->lfoMaxCoefInct-1.0)
+ :1.0/(1.0-r*(p_g->lfoMaxCoefInct-1.0)));
+ p_g->lfoAmp=1.0-(r/2.0+0.5)*p_g->lfoMaxDAmp;
+ }
+ break;
+ default : printf("Error : lfo wave does not exist\n");
+ break;
+ }
+ p_g->lfoIndex=(p_g->lfoIndex<p_g->lfoMaxIndex?p_g->lfoIndex+1:0);
+}
+
+//---------------------------------------------------------
+// outLevel2Amp, Amp for amplitude //between 0.0 and 2.0 or more
+// 100->2.0, 90->1.0, 80->0.5 ...
+//---------------------------------------------------------
+inline double outLevel2Amp(int ol) {
+ double a;
+ double b;
+ a = log(2)/10.0;
+ b = -a*DB0LEVEL;
+ return exp(a*(double)ol+b);
+}
+
+//---------------------------------------------------------
+// velo2RAmp, AmpR between 0.0 and 1.0
+// return an amplitude ratio with respect to _preset->sensitivity.keyVelocity
+//---------------------------------------------------------
+inline double velo2AmpR(int velo, int kvs) {
+ double lev;
+ lev = exp(-log(2)*kvs);
+ return (lev+(1.0-lev)*((double)velo/(double)MAXVELO));
+}
+
+//---------------------------------------------------------
+// envAR2s
+// return the time in second of the ATTACK duration
+//---------------------------------------------------------
+inline double envAR2s(int ar) {
+ //determined using the fitting feature of gnuplot
+ return 10.4423*exp(-0.353767*ar);
+}
+
+//---------------------------------------------------------
+// envD1R2coef
+// return the coefficient for the exponential decrease
+// with respect to d1r and sampleRate, sr
+//---------------------------------------------------------
+inline double envD1R2coef(int d1r, int sr) {
+ double dt;//such that amp(t+dt)=amp(t)/2
+ double alpha;//such that amp(t)=exp(alpha*t)
+
+ if(d1r==0) return 1.0;
+ else
+ {
+ //dt has been determined with the fitting function of gnuplot
+ dt=9.80715*exp(-0.356053*(double)d1r);
+
+ //amp(0)=1
+ //amp(t+dt)=amp(t)/2
+ //amp(t)=exp(alpha*t)
+ //amp(t+mt)
+ //following the above equational system we found :
+ alpha=-log(2)/dt;
+ return exp(alpha/(double)sr);
+ }
+}
+
+//---------------------------------------------------------
+// coefRelease
+// convert the release value to a coef for coefVLevel
+//---------------------------------------------------------
+inline double coefRelease(unsigned char release) {
+ double x = COEFGRELEASE*(double)release/(double)MIDRELEASE+1.0-COEFGRELEASE;
+ double square_x = x*x;
+ return(1.0/(square_x*x));
+}
+
+//---------------------------------------------------------
+// envRR2coef
+// return the coefficient for the exponential decrease
+// with respect to rr and sampleRate, sr
+//---------------------------------------------------------
+inline double envRR2coef(int rr, int sr, unsigned char release) {
+ double dt;//such that amp(t+dt)=amp(t)/2
+ double alpha;//such that amp(t)=exp(alpha*t)
+
+ //dt has been determined with the fitting function of gnuplot
+ dt=7.06636*exp(-0.697606*(double)rr);
+
+ dt*=coefRelease(release);
+ //printf("demi life = %e\n", dt);
+ //amp(0)=1
+ //amp(t+dt)=amp(t)/2
+ //amp(t)=exp(alpha*t)
+ //amp(t+mt)
+ //following the above equational system we found :
+ alpha=-log(2)/dt;
+ return exp(alpha/(double)sr);
+}
+
+//---------------------------------------------------------
+// coefAttack
+// convert the attack value to a coef for envInct
+//---------------------------------------------------------
+inline double coefAttack(unsigned char attack) {
+ double x = COEFGATTACK*(double)attack/(double)MIDATTACK + 1.0-COEFGATTACK;
+ double square_x = x*x;
+ return(square_x*square_x*x);
+}
+
+//---------------------------------------------------------
+// env2RAmp
+// return the amplitude ratio with respect to an envelope and an
+// envelope state, making evoluate the envelope
+// sr is the sample rate and st the sine_table
+//---------------------------------------------------------
+inline double env2AmpR(int sr, float* wt, Eg eg, OpVoice* p_opVoice) {
+ switch(p_opVoice->envState)
+ {
+ case ATTACK:
+ p_opVoice->envIndex+=p_opVoice->envInct;
+ if (p_opVoice->envIndex<(RESOLUTION/4))
+ {
+ p_opVoice->envLevel=wt[(int)p_opVoice->envIndex];
+ }
+ else
+ {
+ //printf("DECAY\n");
+ p_opVoice->envState=DECAY;
+ p_opVoice->envLevel=1.0;
+ p_opVoice->coefVLevel=envD1R2coef(eg.d1r, sr);
+ }
+ return p_opVoice->envLevel;
+ break;
+ case DECAY:
+ if (p_opVoice->envLevel>((double)eg.d1l/(double)MAXD1L)+COEFERRDECSUS)
+ {
+ p_opVoice->envLevel*=p_opVoice->coefVLevel;
+ }
+ else
+ {
+ //printf("SUSTAIN\n");
+ p_opVoice->envState=SUSTAIN;
+ p_opVoice->envLevel=((double)eg.d1l/(double)MAXD1L);
+ p_opVoice->coefVLevel=envD1R2coef(eg.d2r, sr);//probably the same
+ }
+ return p_opVoice->envLevel;
+ break;
+ case SUSTAIN:
+ if (p_opVoice->envLevel>COEFERRSUSREL)
+ {
+ p_opVoice->envLevel*=p_opVoice->coefVLevel;
+ }
+ else
+ {
+ //printf("OFF\n");
+ p_opVoice->envState=OFF;
+ p_opVoice->envLevel=0.0;
+ }
+ return p_opVoice->envLevel;
+ break;
+ case RELEASE:
+ if (p_opVoice->envLevel > COEFERRSUSREL)
+ {
+ p_opVoice->envLevel*=p_opVoice->coefVLevel;
+ }
+ else
+ {
+ p_opVoice->envState=OFF;
+ p_opVoice->envLevel=0.0;
+ }
+ return p_opVoice->envLevel;
+ break;
+ case OFF: return 0.0;
+ break;
+ default: printf("Error case envelopeState");
+ break;
+ }
+}
+
+//---------------------------------------------------------
+// programSelect
+//---------------------------------------------------------
+
+void DeicsOnze::programSelect(int hbank, int lbank, int prog) {
+ Preset* foundPreset;
+ foundPreset=findPreset(hbank, lbank, prog);
+ if (foundPreset) _preset=foundPreset;
+ else {
+ _preset=_initialPreset;
+ _preset->prog=prog;
+ _preset->_subcategory->_lbank=lbank;
+ _preset->_subcategory->_category->_hbank=hbank;
+ }
+ setPreset();
+}
+
+//---------------------------------------------------------
+// setModulation
+//---------------------------------------------------------
+void DeicsOnze::setModulation(int val) {
+ _preset->modulation = (unsigned char) val;
+}
+//---------------------------------------------------------
+// setPitchBendCoef
+//---------------------------------------------------------
+void DeicsOnze::setPitchBendCoef(int val) {
+ _global.pitchBendCoef = exp(log(2)
+ *((double)_preset->function.pBendRange
+ /(double)MAXPBENDRANGE)
+ *((double)val/(double)MAXPITCHBENDVALUE));
+}
+
+//---------------------------------------------------------
+// setSustain
+//---------------------------------------------------------
+void DeicsOnze::setSustain(int val) {
+ _global.sustain=(val>64);
+ if(!_global.sustain)
+ for(int i=0; i<_global.nbrVoices; i++)
+ if(_voices[i].isSustained) {
+ for(int j=0; j<NBROP; j++) {
+ _voices[i].op[j].envState=RELEASE;
+ setEnvRelease(i, j);
+ }
+ _voices[i].isSustained=false;
+ }
+}
+
+//---------------------------------------------------------
+// readColor
+//---------------------------------------------------------
+QColor readColor(QDomNode node)
+{
+ QDomElement e = node.toElement();
+ int r = e.attribute("r","0").toInt();
+ int g = e.attribute("g","0").toInt();
+ int b = e.attribute("b","0").toInt();
+ return QColor(r, g, b);
+}
+
+//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+void DeicsOnze::readConfiguration(QDomNode qdn) {
+ QColor textColor, backgroundColor, editTextColor, editBackgroundColor;
+ while(!qdn.isNull()) {
+ QDomElement qdEl = qdn.toElement();
+ if(qdEl.isNull())
+ continue;
+ //nbrVoices
+ if(qdEl.tagName()==NBRVOICESSTR) {
+ setNbrVoices(qdEl.text().toInt());
+ MidiEvent evNbrVoices(0, 0, ME_CONTROLLER,
+ CTRL_NBRVOICES, _global.nbrVoices);
+ _gui->writeEvent(evNbrVoices);
+ }
+ //channelNum
+ if(qdEl.tagName()==CHANNELNUMSTR) {
+ _global.channelNum = (qdEl.text()==ALLSTR?-1:qdEl.text().toInt()-1);
+ unsigned char *dataChannelNum = new unsigned char[2];
+ dataChannelNum[0]=SYSEX_CHANNELNUM;
+ dataChannelNum[1]=(unsigned char)_global.channelNum;
+ MidiEvent
+ evChannelNum(0, ME_SYSEX, (const unsigned char*)dataChannelNum, 2);
+ _gui->writeEvent(evChannelNum);
+ }
+ //quality
+ if(qdEl.tagName()==QUALITYSTR) {
+ _global.quality = (qdEl.text()==HIGHSTR?high:
+ (qdEl.text()==MIDDLESTR?middle:low));
+ unsigned char *dataQuality = new unsigned char[2];
+ dataQuality[0]=SYSEX_QUALITY;
+ dataQuality[1]=(unsigned char)_global.quality;
+ MidiEvent evQuality(0, ME_SYSEX, (const unsigned char*)dataQuality, 2);
+ _gui->writeEvent(evQuality);
+ }
+ //saveConfig
+ if(qdEl.tagName()==SAVECONFIGSTR) {
+ _saveConfig = (qdEl.text()==YESSTRDEI?true:false);
+ unsigned char *dataSaveConfig = new unsigned char[2];
+ dataSaveConfig[0]=SYSEX_SAVECONFIG;
+ dataSaveConfig[1]=(unsigned char)_saveConfig;
+ MidiEvent
+ evSaveConfig(0, ME_SYSEX, (const unsigned char*)dataSaveConfig, 2);
+ _gui->writeEvent(evSaveConfig);
+ }
+ //saveOnlyUsed
+ if(qdEl.tagName()==SAVEONLYUSEDSTR) {
+ _saveOnlyUsed = (qdEl.text()==YESSTRDEI?true:false);
+ unsigned char *dataSaveOnlyUsed = new unsigned char[2];
+ dataSaveOnlyUsed[0]=SYSEX_SAVEONLYUSED;
+ dataSaveOnlyUsed[1]=(unsigned char)_saveOnlyUsed;
+ MidiEvent
+ evSaveOnlyUsed(0, ME_SYSEX, (const unsigned char*)dataSaveOnlyUsed, 2);
+ _gui->writeEvent(evSaveOnlyUsed);
+ }
+ //colors
+ if(qdEl.tagName()==TEXTCOLORSTR) textColor = readColor(qdn);
+ if(qdEl.tagName()==BACKGROUNDCOLORSTR) backgroundColor = readColor(qdn);
+ if(qdEl.tagName()==EDITTEXTCOLORSTR) editTextColor = readColor(qdn);
+ if(qdEl.tagName()==EDITBACKGROUNDCOLORSTR)
+ editBackgroundColor = readColor(qdn);
+ //load init set
+ if(qdEl.tagName()==ISINITSETSTR) {
+ _isInitSet = (qdEl.text()==YESSTRDEI?true:false);
+ unsigned char *dataIsInitSet = new unsigned char[2];
+ dataIsInitSet[0]=SYSEX_ISINITSET;
+ dataIsInitSet[1]=(unsigned char)_isInitSet;
+ MidiEvent
+ evIsInitSet(0, ME_SYSEX, (const unsigned char*)dataIsInitSet, 2);
+ _gui->writeEvent(evIsInitSet);
+ }
+ if(qdEl.tagName()==INITSETPATHSTR) {
+ _initSetPath = qdEl.text();
+ unsigned char *dataInitSetPath =
+ new unsigned char[1+MAXSTRLENGTHINITSETPATH];
+ dataInitSetPath[0]=SYSEX_INITSETPATH;
+ strncpy((char*)&dataInitSetPath[1], _initSetPath.toLatin1().data(),
+ MAXSTRLENGTHINITSETPATH);
+ MidiEvent
+ evInitSetPath(0, ME_SYSEX, (const unsigned char*)dataInitSetPath,
+ 1+MAXSTRLENGTHINITSETPATH);
+ _gui->writeEvent(evInitSetPath);
+ }
+ qdn = qdn.nextSibling();
+ }
+ //send colors
+ unsigned char dataColorGui[COLORSYSEXLENGTH+1];
+ dataColorGui[0]=SYSEX_COLORGUI;
+ dataColorGui[1]=(unsigned char)textColor.red();
+ dataColorGui[2]=(unsigned char)textColor.green();
+ dataColorGui[3]=(unsigned char)textColor.blue();
+ dataColorGui[4]=(unsigned char)backgroundColor.red();
+ dataColorGui[5]=(unsigned char)backgroundColor.green();
+ dataColorGui[6]=(unsigned char)backgroundColor.blue();
+ dataColorGui[7]=(unsigned char)editTextColor.red();
+ dataColorGui[8]=(unsigned char)editTextColor.green();
+ dataColorGui[9]=(unsigned char)editTextColor.blue();
+ dataColorGui[10]=(unsigned char)editBackgroundColor.red();
+ dataColorGui[11]=(unsigned char)editBackgroundColor.green();
+ dataColorGui[12]=(unsigned char)editBackgroundColor.blue();
+ MidiEvent evSysexColor(0, ME_SYSEX, (const unsigned char*)dataColorGui,
+ COLORSYSEXLENGTH+1);
+ _gui->writeEvent(evSysexColor);
+}
+
+//-----------------------------------------------------------
+// loadConfiguration
+//-----------------------------------------------------------
+void DeicsOnze::loadConfiguration(QString fileName) {
+ // read the XML file and create DOM tree
+ if(!fileName.isEmpty()) {
+ QFile confFile(fileName);
+ if(!confFile.open(QIODevice::ReadOnly)) {
+ printf("Critical Error. Cannot open file %s\n",
+ fileName.toAscii().data());
+ return;
+ }
+ QDomDocument domTree;
+ if (!domTree.setContent(&confFile )) {
+ printf("Critical Error. Parsing error for file %s\n",
+ fileName.toAscii().data());
+ confFile.close();
+ return;
+ }
+
+ confFile.close();
+
+ QDomNode node = domTree.documentElement();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == DEICSONZECONFIGURATIONSTR) {
+ QString version = e.attribute(QString("version"));
+ if (version == "1.0") {
+ readConfiguration(node.firstChild());
+ }
+ else printf("unsupported *.dco file version %s\n",
+ version.toLatin1().data());
+ }
+ else printf("DeicsOnze: %s not supported\n",
+ e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+}
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+void DeicsOnze::writeConfiguration(AL::Xml* xml) {
+ QString str;
+ xml->tag("deicsOnzeConfiguation version=\"1.0\"");
+ xml->intTag(NBRVOICESSTR, (int)_global.nbrVoices);
+ xml->strTag(CHANNELNUMSTR, (_global.channelNum==-1?ALLSTR:
+ str.setNum(_global.channelNum+1)));
+ xml->strTag(QUALITYSTR, (_global.quality==high?HIGHSTR:
+ (_global.quality==middle?MIDDLESTR:LOWSTR)));
+ xml->strTag(SAVECONFIGSTR, (_saveConfig?YESSTRDEI:NOSTRDEI));
+ xml->strTag(SAVEONLYUSEDSTR, (_saveOnlyUsed?YESSTRDEI:NOSTRDEI));
+ xml->colorTag(TEXTCOLORSTR,
+ reinterpret_cast<const QColor &>(*_gui->tColor));
+ xml->colorTag(BACKGROUNDCOLORSTR,
+ reinterpret_cast<const QColor &>(*_gui->bColor));
+ xml->colorTag(EDITTEXTCOLORSTR,
+ reinterpret_cast<const QColor &>(*_gui->etColor));
+ xml->colorTag(EDITBACKGROUNDCOLORSTR,
+ reinterpret_cast<const QColor &>(*_gui->ebColor));
+ xml->strTag(ISINITSETSTR, (_isInitSet?YESSTRDEI:NOSTRDEI));
+ printf("initSetPath : %s\n", _initSetPath.toAscii().data());
+ xml->strTag(INITSETPATHSTR, _initSetPath.toAscii().data());
+ xml->etag(DEICSONZECONFIGURATIONSTR);
+}
+
+//---------------------------------------------------------
+// getInitData
+//---------------------------------------------------------
+void DeicsOnze::getInitData(int* length, const unsigned char** data) const {
+ FILE* tmp;
+ char* comptmp;
+ QString cmd="bzip2 > ";
+
+ //compress the set
+ comptmp=tempnam("/tmp", "DeicsOnze");
+ cmd+=comptmp;
+ tmp=popen(cmd.toAscii().data(), "w");
+ QFile file;
+ file.open(tmp, QIODevice::WriteOnly);
+ AL::Xml* xml=new AL::Xml(&file);
+ xml->header();
+ _set->writeSet(xml, _saveOnlyUsed);
+ file.close(); //flush
+ pclose(tmp);
+
+ //save the set
+ FILE* comptmpf=fopen(comptmp, "r");
+ fseek(comptmpf, 0, SEEK_END);
+ *length=ftell(comptmpf)
+ + SAVEINITLENGTH + SAVEGLOBALLENGTH + SAVECONFIGLENGTH
+ + MAXSTRLENGTHINITSETPATH + 1;
+ fseek(comptmpf, 0, SEEK_SET);
+ unsigned char* buffer = new unsigned char[*length];
+ //save init data
+ buffer[0]=SYSEX_INIT_DATA;
+ buffer[1]=SYSEX_INIT_DATA_VERSION;
+ //save global data
+ buffer[NUMMASTERVOL]=
+ (unsigned char)(_global.amp*(double)MAXMASTERVOLUME);
+ buffer[NUMCURRENTPROG]=(unsigned char) _preset->prog;
+ buffer[NUMCURRENTLBANK]=(unsigned char) _preset->_subcategory->_lbank;
+ buffer[NUMCURRENTHBANK]=
+ (unsigned char) _preset->_subcategory->_category->_hbank;
+ buffer[NUMNBRVOICES]=(unsigned char) _global.nbrVoices;
+ buffer[NUMCHANNELNUM]=(unsigned char) _global.channelNum;
+ buffer[NUMSAVEONLYUSED]=(unsigned char) _saveOnlyUsed;
+ buffer[NUMSAVECONFIG]=(unsigned char) _saveConfig;
+ //save config data
+ if(_saveConfig) {
+ buffer[NUMQUALITY]=(unsigned char)_global.quality;
+ buffer[NUMREDTEXT]=(unsigned char)_gui->tColor->red();
+ buffer[NUMGREENTEXT]=(unsigned char)_gui->tColor->green();
+ buffer[NUMBLUETEXT]=(unsigned char)_gui->tColor->blue();
+ buffer[NUMREDBACKGROUND]=(unsigned char)_gui->bColor->red();
+ buffer[NUMGREENBACKGROUND]=(unsigned char)_gui->bColor->green();
+ buffer[NUMBLUEBACKGROUND]=(unsigned char)_gui->bColor->blue();
+ buffer[NUMREDEDITTEXT]=(unsigned char)_gui->etColor->red();
+ buffer[NUMGREENEDITTEXT]=(unsigned char)_gui->etColor->green();
+ buffer[NUMBLUEEDITTEXT]=(unsigned char)_gui->etColor->blue();
+ buffer[NUMREDEDITBACKGROUND]=(unsigned char)_gui->ebColor->red();
+ buffer[NUMGREENEDITBACKGROUND]=(unsigned char)_gui->ebColor->green();
+ buffer[NUMBLUEEDITBACKGROUND]=(unsigned char)_gui->ebColor->blue();
+ buffer[NUMISINITSET]=(unsigned char)_isInitSet;
+ strncpy((char*)&buffer[NUMINITSETPATH],
+ _initSetPath.toLatin1().data(), MAXSTRLENGTHINITSETPATH);
+ }
+ //save set data
+ for(int i=SAVEINITLENGTH+SAVEGLOBALLENGTH+SAVECONFIGLENGTH
+ +MAXSTRLENGTHINITSETPATH+1; i<*length; i++)
+ buffer[i]=(unsigned char)getc(comptmpf);
+ fclose(comptmpf);
+ QString rmcmd="rm ";
+ rmcmd+=comptmp;
+ system(rmcmd.toAscii().data());
+ free(comptmp);
+ //printf("Taille en save : %d\n", *length);
+ //for(int i=0; i<*length; i++) printf("%x ", buffer[i]);
+ *data=buffer;
+}
+//---------------------------------------------------------
+// parseInitData
+//---------------------------------------------------------
+void DeicsOnze::parseInitData(int length, const unsigned char* data) {
+ if(data[1]==SYSEX_INIT_DATA_VERSION) {
+ //load global parameters
+ setMasterVol(data[NUMMASTERVOL]);
+ MidiEvent ev(0, 0, ME_CONTROLLER, CTRL_MASTERVOLUME, data[NUMMASTERVOL]);
+ _gui->writeEvent(ev);
+ //nbrVoices
+ setNbrVoices(data[NUMNBRVOICES]);
+ MidiEvent evNbrVoices(0,0,ME_CONTROLLER,CTRL_NBRVOICES,data[NUMNBRVOICES]);
+ _gui->writeEvent(evNbrVoices);
+ //channelNum
+ _global.channelNum = (char)data[NUMCHANNELNUM];
+ unsigned char *dataChannelNum = new unsigned char[2];
+ dataChannelNum[0]=SYSEX_CHANNELNUM;
+ dataChannelNum[1]=(unsigned char)_global.channelNum;
+ MidiEvent
+ evChannelNum(0, ME_SYSEX, (const unsigned char*)dataChannelNum, 2);
+ _gui->writeEvent(evChannelNum);
+ //load configuration
+ _saveConfig = (bool)data[NUMSAVECONFIG];
+ unsigned char *dataSaveConfig = new unsigned char[2];
+ dataSaveConfig[0]=SYSEX_SAVECONFIG;
+ dataSaveConfig[1]=(unsigned char)_saveConfig;
+ MidiEvent
+ evSaveConfig(0, ME_SYSEX, (const unsigned char*)dataSaveConfig, 2);
+ _gui->writeEvent(evSaveConfig);
+ if(_saveConfig) {
+ //saveOnlyUsed
+ _saveOnlyUsed = (bool)data[NUMSAVEONLYUSED];
+ unsigned char *dataSaveOnlyUsed = new unsigned char[2];
+ dataSaveOnlyUsed[0]=SYSEX_SAVEONLYUSED;
+ dataSaveOnlyUsed[1]=(unsigned char)_saveOnlyUsed;
+ MidiEvent
+ evSaveOnlyUsed(0, ME_SYSEX, (const unsigned char*)dataSaveOnlyUsed, 2);
+ _gui->writeEvent(evSaveOnlyUsed);
+ //colors
+ unsigned char dataColorGui[COLORSYSEXLENGTH+1];
+ dataColorGui[0]=SYSEX_COLORGUI;
+ for (int i=0; i<COLORSYSEXLENGTH; i++)
+ dataColorGui[i+1]=data[NUMREDTEXT+i];
+ MidiEvent evSysexColor(0, ME_SYSEX, (const unsigned char*)dataColorGui,
+ COLORSYSEXLENGTH+1);
+ _gui->writeEvent(evSysexColor);
+ //quality
+ unsigned char dataQuality[2];
+ dataQuality[0]=SYSEX_QUALITY;
+ dataQuality[1]=data[NUMQUALITY];
+ MidiEvent evQuality(0, ME_SYSEX, (const unsigned char*)dataQuality, 2);
+ _gui->writeEvent(evQuality);
+ //load init set
+ unsigned char dataIsInitSet[2];
+ dataIsInitSet[0]=SYSEX_ISINITSET;
+ dataIsInitSet[1]=data[NUMISINITSET];
+ MidiEvent evIsInitSet(0, ME_SYSEX,
+ (const unsigned char*)dataIsInitSet, 2);
+ _gui->writeEvent(ev);
+ unsigned char dataInitSetPath[1+MAXSTRLENGTHINITSETPATH];
+ dataInitSetPath[0]=SYSEX_INITSETPATH;
+ dataInitSetPath[1]=data[NUMINITSETPATH];
+ MidiEvent evInitSetPath(0,ME_SYSEX,(const unsigned char*)dataInitSetPath,
+ 1+MAXSTRLENGTHINITSETPATH);
+ _gui->writeEvent(evInitSetPath);
+ }
+ else _gui->saveConfigCheckBox->setChecked(false);
+
+ //load set
+ FILE* tmp;
+ char* tmpname;
+ char* uncompname;
+ QString cmd="bunzip2 ";
+
+ //get the bz2 part
+ tmpname=tempnam("/tmp", "DEIBZ2");
+ tmp=fopen(tmpname, "w");
+ for(int i=SAVEINITLENGTH+SAVEGLOBALLENGTH+SAVECONFIGLENGTH;
+ i<length; i++) putc(data[i], tmp);
+ fclose(tmp);
+
+ //uncompress the set
+ uncompname=tempnam("/tmp", "DEISET");
+ cmd+=tmpname;
+ cmd+=" -c > ";
+ cmd+=uncompname;
+ system(cmd.toAscii().data());
+
+ //load the set
+ // read the XML file and create DOM tree
+ //QString filename = (const char*) (data+2);
+ QFile deicsonzeFile(uncompname);
+ deicsonzeFile.open(QIODevice::ReadOnly);
+ QDomDocument domTree;
+ domTree.setContent(&deicsonzeFile);
+ deicsonzeFile.close();
+ QDomNode node = domTree.documentElement();
+
+ //printf("After XML\n");
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "deicsOnzeSet") {
+ QString version = e.attribute(QString("version"));
+ if (version == "1.0") {
+ _preset=_initialPreset;
+ //read the set
+ if((bool)data[NUMSAVEONLYUSED]) {
+ //printf("Mini\n");
+ //updateSaveOnlyUsed(true);
+ }
+ else {
+ //printf("Huge\n");
+ while(!_set->_categoryVector.empty())
+ delete(*_set->_categoryVector.begin());
+ //updateSaveOnlyUsed(false);
+ }
+ _set->readSet(node.firstChild());
+ //display load preset
+ //setSet();
+ }
+ else printf("Wrong set version : %s\n",
+ version.toLatin1().data());
+ }
+ node = node.nextSibling();
+ }
+ //send sysex to the gui to load the set (actually not because it doesn't work -the code is just zapped in the middle???-, so it is done above
+ int dL=2+strlen(uncompname);
+ char dataSend[dL];
+ dataSend[0]=SYSEX_LOADSET;
+ dataSend[1]=data[NUMSAVEONLYUSED];
+ for(int i=2; i<dL; i++) dataSend[i]=uncompname[i-2];
+ MidiEvent evSysex(0,ME_SYSEX,(const unsigned char*)dataSend, dL);
+ _gui->writeEvent(evSysex);
+
+
+ //set the last hbank, lbank, prog
+ int hbank=(int)data[NUMCURRENTHBANK];
+ int lbank=(int)data[NUMCURRENTLBANK];
+ int prog=(int)data[NUMCURRENTPROG];
+ int val=prog+(lbank<<8)+(hbank<<16);
+ MidiEvent evProgSel(0, 0, ME_CONTROLLER, CTRL_PROGRAM, val);
+ _gui->writeEvent(evProgSel);
+
+ //delete the temporary file bz2
+ QString rmfile;
+ rmfile="rm ";
+ rmfile+=tmpname;
+ system(rmfile.toAscii().data());
+ }
+}
+//---------------------------------------------------------
+// sysex
+//---------------------------------------------------------
+bool DeicsOnze::sysex(int length, const unsigned char* data) {
+ sysex(length, data, false);
+ return false;
+}
+bool DeicsOnze::sysex(int length, const unsigned char* data, bool fromGui) {
+ int cmd=data[0];
+ switch(cmd) {
+ case SYSEX_INIT_DATA:
+ parseInitData(length, data);
+ break;
+ case SYSEX_CHANNELNUM:
+ _global.channelNum = (char)data[1];
+ if(!fromGui) {
+ MidiEvent evSysex(0, ME_SYSEX, data, length);
+ _gui->writeEvent(evSysex);
+ }
+ break;
+ case SYSEX_QUALITY:
+ _global.quality = (Quality)data[1];
+ if(!fromGui) {
+ MidiEvent evSysex(0, ME_SYSEX, data, length);
+ _gui->writeEvent(evSysex);
+ }
+ break;
+ case SYSEX_SAVECONFIG:
+ _saveConfig = (bool)data[1];
+ if(!fromGui) {
+ MidiEvent evSysex(0, ME_SYSEX, data, length);
+ _gui->writeEvent(evSysex);
+ }
+ break;
+ case SYSEX_SAVEONLYUSED:
+ _saveOnlyUsed = (bool)data[1];
+ if(!fromGui) {
+ MidiEvent evSysex(0, ME_SYSEX, data, length);
+ _gui->writeEvent(evSysex);
+ }
+ break;
+ case SYSEX_ISINITSET:
+ _isInitSet = (bool)data[1];
+ if(!fromGui) {
+ MidiEvent evSysex(0, ME_SYSEX, data, length);
+ _gui->writeEvent(evSysex);
+ }
+ break;
+ case SYSEX_INITSETPATH:
+ _initSetPath = (char*)&data[1];
+ if(!fromGui) {
+ MidiEvent evSysex(0, ME_SYSEX, data, length);
+ _gui->writeEvent(evSysex);
+ }
+ break;
+ default:
+ break;
+ }
+ return false;
+}
+//---------------------------------------------------------
+// setController
+//---------------------------------------------------------
+bool DeicsOnze::setController(int channel, int id, int val) {
+ setController(channel, id, val, false);
+ return false;
+}
+bool DeicsOnze::setController(int ch, int ctrl, int val, bool fromGui) {
+ int k=0;
+ if(ch==_global.channelNum || _global.channelNum==-1 || fromGui) {
+ if(ctrl>=CTRL_AR && ctrl<CTRL_ALG) {
+ k=(ctrl-CTRLOFFSET)/DECAPAR1;
+ ctrl=ctrl-DECAPAR1*k;
+ }
+ else if(ctrl>CTRL_PL3 && ctrl<CTRL_REVERBRATE) {
+ k=(ctrl-CTRLOFFSET-100)/DECAPAR2;
+ ctrl=ctrl-DECAPAR2*k;
+ }
+ switch(ctrl) {
+ case CTRL_AR:
+ _preset->setIsUsed(true);
+ _preset->eg[k].ar=val;
+ printf("AR : %d\n", val);
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_AR+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_D1R:
+ _preset->setIsUsed(true);
+ _preset->eg[k].d1r=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_D1R+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_D2R:
+ _preset->setIsUsed(true);
+ _preset->eg[k].d2r=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_D2R+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_RR:
+ _preset->setIsUsed(true);
+ _preset->eg[k].rr=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_RR+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_D1L:
+ _preset->setIsUsed(true);
+ _preset->eg[k].d1l=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_D1L+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_LS:
+ _preset->setIsUsed(true);
+ _preset->scaling.level[k]=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_LS+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_RS:
+ _preset->setIsUsed(true);
+ _preset->scaling.rate[k]=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_RS+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_EBS:
+ _preset->setIsUsed(true);
+ _preset->sensitivity.egBias[k]=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_EBS+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_AME:
+ _preset->setIsUsed(true);
+ _preset->sensitivity.ampOn[k]=val==1;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_AME+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_KVS:
+ _preset->setIsUsed(true);
+ _preset->sensitivity.keyVelocity[k]=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_KVS+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_OUT:
+ _preset->setIsUsed(true);
+ _preset->outLevel[k]=val;
+ setOutLevel(k);
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_OUT+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_RATIO:
+ _preset->setIsUsed(true);
+ _preset->frequency[k].ratio=((double)val)/100.0;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,
+ CTRL_RATIO+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_DET:
+ _preset->setIsUsed(true);
+ _preset->detune[k]=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_DET+k*DECAPAR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_ALG:
+ _preset->setIsUsed(true);
+ _preset->algorithm=(Algorithm)val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_ALG,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_FEEDBACK:
+ _preset->setIsUsed(true);
+ _preset->feedback=val;
+ setFeedback();
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_FEEDBACK,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_SPEED:
+ _preset->setIsUsed(true);
+ _preset->lfo.speed=val;
+ setLfo();
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_SPEED,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_DELAY:
+ _preset->setIsUsed(true);
+ _preset->lfo.delay=val;
+ setLfo();
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_DELAY,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PMODDEPTH:
+ _preset->setIsUsed(true);
+ _preset->lfo.pModDepth=val;
+ setLfo();
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PMODDEPTH,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_AMODDEPTH:
+ _preset->setIsUsed(true);
+ _preset->lfo.aModDepth=val;
+ setLfo();
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_AMODDEPTH,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_SYNC:
+ _preset->setIsUsed(true);
+ _preset->lfo.sync=val==1;
+ setLfo();
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_SYNC,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_WAVE:
+ _preset->setIsUsed(true);
+ _preset->lfo.wave=(Wave)val;
+ setLfo();
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_WAVE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PMODSENS:
+ _preset->setIsUsed(true);
+ _preset->sensitivity.pitch=val;
+ setLfo();
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PMODSENS,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_AMS:
+ _preset->setIsUsed(true);
+ _preset->sensitivity.amplitude=val;
+ setLfo();
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_AMS,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_TRANSPOSE:
+ _preset->setIsUsed(true);
+ _preset->function.transpose=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_TRANSPOSE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_POLYMODE:
+ _preset->setIsUsed(true);
+ _preset->function.mode=(Mode)val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_POLYMODE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PBENDRANGE:
+ _preset->setIsUsed(true);
+ _preset->function.pBendRange=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PBENDRANGE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PORTAMODE:
+ _preset->setIsUsed(true);
+ _preset->function.portamento=(Portamento)val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PORTAMODE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PORTATIME:
+ _preset->setIsUsed(true);
+ _preset->function.portamentoTime=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PORTATIME,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_FCVOLUME:
+ _preset->setIsUsed(true);
+ _preset->function.fcVolume=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_FCVOLUME,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_FSW:
+ _preset->setIsUsed(true);
+ _preset->function.footSw=(FootSw)val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_FSW,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_MWPITCH:
+ _preset->setIsUsed(true);
+ _preset->function.mwPitch=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_MWPITCH,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_MWAMPLITUDE:
+ _preset->setIsUsed(true);
+ _preset->function.mwAmplitude=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_MWAMPLITUDE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_BCPITCH:
+ _preset->setIsUsed(true);
+ _preset->function.bcPitch=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_BCPITCH,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_BCAMPLITUDE:
+ _preset->setIsUsed(true);
+ _preset->function.bcAmplitude=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_BCAMPLITUDE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_BCPITCHBIAS:
+ _preset->setIsUsed(true);
+ _preset->function.bcPitchBias=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_BCPITCHBIAS,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_BCEGBIAS:
+ _preset->setIsUsed(true);
+ _preset->function.bcEgBias=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_BCEGBIAS,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_ATPITCH:
+ _preset->setIsUsed(true);
+ _preset->function.atPitch=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_ATPITCH,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_ATAMPLITUDE:
+ _preset->setIsUsed(true);
+ _preset->function.atAmplitude=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_ATAMPLITUDE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_ATPITCHBIAS:
+ _preset->setIsUsed(true);
+ _preset->function.atPitchBias=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_ATPITCHBIAS,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_ATEGBIAS:
+ _preset->setIsUsed(true);
+ _preset->function.atEgBias=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_ATEGBIAS,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PR1:
+ _preset->setIsUsed(true);
+ _preset->pitchEg.pr1=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PR1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PR2:
+ _preset->setIsUsed(true);
+ _preset->pitchEg.pr2=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PR2,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PR3:
+ _preset->setIsUsed(true);
+ _preset->pitchEg.pr3=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PR3,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PL1:
+ _preset->setIsUsed(true);
+ _preset->pitchEg.pl1=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PL1,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PL2:
+ _preset->setIsUsed(true);
+ _preset->pitchEg.pl2=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PL2,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PL3:
+ _preset->setIsUsed(true);
+ _preset->pitchEg.pl3=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_PL3,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_FIX:
+ _preset->setIsUsed(true);
+ _preset->frequency[k].isFix=val==1;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_FIX+k*DECAPAR2,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_FIXRANGE:
+ _preset->setIsUsed(true);
+ _preset->frequency[k].freq=((double)val)/100.0;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,
+ CTRL_FIXRANGE+k*DECAPAR2,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_OSW:
+ _preset->setIsUsed(true);
+ _preset->oscWave[k]=(OscWave)val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_OSW+k*DECAPAR2,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_SHFT:
+ _preset->setIsUsed(true);
+ _preset->eg[k].egShift=(egShiftValue)val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_SHFT+k*DECAPAR2,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_REVERBRATE:
+ _preset->setIsUsed(true);
+ _preset->function.reverbRate=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_REVERBRATE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_FCPITCH:
+ _preset->setIsUsed(true);
+ _preset->function.fcPitch=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_FCPITCH,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_FCAMPLITUDE:
+ _preset->setIsUsed(true);
+ _preset->function.fcAmplitude=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_FCAMPLITUDE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_GLOBALDETUNE:
+ _preset->setIsUsed(true);
+ _preset->globalDetune=val;
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_GLOBALDETUNE,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_MASTERVOLUME:
+ setMasterVol(val);
+ if(!fromGui) {
+ MidiEvent ev(0,0,ME_CONTROLLER,CTRL_MASTERVOLUME,val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_NBRVOICES:
+ setNbrVoices((unsigned char)val);
+ if(!fromGui) {
+ MidiEvent ev(0, 0/*ch*/, ME_CONTROLLER, CTRL_NBRVOICES, val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_PROGRAM: {
+ int hbank = (val & 0xff0000) >> 16;
+ int lbank = (val & 0xff00) >> 8;
+ int prog = val & 0x7f;
+ if (hbank > 127) // map "dont care" to 0
+ hbank = 0;
+ if (lbank > 127)
+ lbank = 0;
+ programSelect(hbank, lbank, prog);
+ _preset->setIsUsed(true);//not sure to put that
+ if(!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, CTRL_PROGRAM, val);
+ _gui->writeEvent(ev);
+ }
+ } break;
+ case CTRL_MODULATION:
+ printf("TODO : CONTROLE MODULATION %d\n", val);
+ setModulation(val);
+ break;
+ case CTRL_PITCH:
+ printf("CONTROLE PITCH %d\n", val);
+ setPitchBendCoef(val);
+ break;
+ case CTRL_FINEBRIGHTNESS:
+ _preset->setIsUsed(true);
+ _preset->brightness = val;
+ setOutLevel();
+ if(!fromGui) {
+ MidiEvent ev(0,0, ME_CONTROLLER, CTRL_FINEBRIGHTNESS, val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_BRIGHTNESS:
+ _preset->setIsUsed(true);
+ _preset->brightness = val*(MIDFINEBRIGHTNESS/MIDBRIGHTNESS);
+ setOutLevel();
+ if(!fromGui) {
+ MidiEvent
+ ev(0,0,ME_CONTROLLER,CTRL_FINEBRIGHTNESS,_preset->brightness);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_ATTACK_TIME:
+ _preset->setIsUsed(true);
+ _preset->attack = val;
+ setEnvAttack();
+ if(!fromGui) {
+ MidiEvent ev(0,0, ME_CONTROLLER, CTRL_ATTACK_TIME, val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_RELEASE_TIME:
+ _preset->setIsUsed(true);
+ _preset->release = val;
+ setEnvRelease();
+ if(!fromGui) {
+ MidiEvent ev(0,0, ME_CONTROLLER, CTRL_RELEASE_TIME, val);
+ _gui->writeEvent(ev);
+ }
+ break;
+ case CTRL_SUSTAIN:
+ setSustain(val);
+ break;
+ default:
+ break;
+ }
+ }
+ return false;
+}
+
+//---------------------------------------------------------
+// getPatchName
+//---------------------------------------------------------
+
+const char* DeicsOnze::getPatchName(int ch, int val, int) const
+{
+ if(ch==_global.channelNum || _global.channelNum==-1) {
+ Preset* p_preset;
+ int hbank = (val & 0xff0000) >> 16;
+ int lbank = (val & 0xff00) >> 8;
+ if (hbank > 127)
+ hbank = 0;
+ if (lbank > 127)
+ lbank = 0;
+ if (lbank == 127) // drum HACK
+ lbank = 128;
+ int prog = val & 0x7f;
+ char* tempName="INITVOICE";
+ p_preset=_set->findPreset(hbank, lbank, prog);
+ if (p_preset) tempName=const_cast<char *>(p_preset->name.c_str());
+ return tempName;
+ }
+}
+
+//---------------------------------------------------------
+// getPatchInfo
+//---------------------------------------------------------
+
+const MidiPatch* DeicsOnze::getPatchInfo(int /*ch*/, const MidiPatch* /*p*/) const {
+ /*if(_numPatch<NBRBANKPRESETS)
+ {
+ _patch.typ = 0;
+ _patch.name = bankA[_numPatch].name;
+ _patch.lbank = 1;
+ _patch.prog = _numPatch;
+ return &_patch;
+ }*/
+ return 0;
+}
+
+//---------------------------------------------------------
+// getControllerInfo
+/*!
+ \fn SimpleSynth::getControllerInfo
+ \brief Called from host to collect info about which controllers
+ the synth supports
+ \param index current controller number
+ \param name pointer where name is stored
+ \param controller int pointer where muse controller number is stored
+ \param min int pointer where controller min value is stored
+ \param max int pointer where controller max value is stored
+ \return 0 when done, otherwise return next desired controller index
+*/
+//---------------------------------------------------------
+int DeicsOnze::getControllerInfo(int index, const char** name,
+ int* controller, int* min, int* max) const
+{
+ if (index >= nbrCtrl) {
+ return 0;
+ }
+
+ *name = _ctrl[index].name.c_str();
+ *controller = _ctrl[index].num;
+ *min = _ctrl[index].min;
+ *max = _ctrl[index].max;
+ return (index +1);
+}
+
+//---------------------------------------------------------
+// playNote
+// process note on
+//---------------------------------------------------------
+
+bool DeicsOnze::playNote(int ch, int pitch, int velo) {
+ int newVoice;
+ int nO2V;
+ int p2V;
+ if(ch==_global.channelNum || _global.channelNum==-1) {
+ if(velo==0) {//Note off
+ p2V=pitchOn2Voice(pitch);
+ printf("pitchOn2Voice %d\n", p2V);
+ if(p2V<_global.nbrVoices) {
+ if(_global.sustain) _voices[p2V].isSustained=true;
+ else
+ for(int i=0; i<NBROP; i++) {
+ _voices[p2V].op[i].envState=RELEASE;
+ _voices[p2V].op[i].coefVLevel=
+ envRR2coef(_preset->eg[i].rr, sampleRate(), _preset->release);
+ }
+ return false;}
+ //else printf("error over NBRVOICES\n");
+ }
+ else //Note on
+ {
+ nO2V=noteOff2Voice();
+ newVoice=((nO2V==MAXNBRVOICES)?minVolu2Voice():nO2V);
+
+ _voices[newVoice].isOn=true;
+ _voices[newVoice].sampleFeedback=0.0;
+ _voices[newVoice].pitch=pitch;
+
+ /*if(_preset->lfo.sync)*/ _global.lfoIndex=0;//a revoir
+ _global.lfoDelayIndex=0.0;
+ _global.delayPassed=false;
+
+ for(int i=0; i<NBROP; i++) {
+ _voices[newVoice].op[i].ampVeloNote =
+ velo2AmpR(velo, _preset->sensitivity.keyVelocity[i])
+ *note2Amp((double) (pitch+_preset->function.transpose),
+ _preset->scaling.level[i]);
+ _voices[newVoice].op[i].amp = outLevel2Amp(_preset->outLevel[i])
+ *_voices[newVoice].op[i].ampVeloNote * brightness2Amp(i);
+ _voices[newVoice].op[i].index=0.0;
+ _voices[newVoice].op[i].freq=
+ (pitch2freq((double)_preset->globalDetune/(double)MAXGLOBALDETUNE)
+ /LOWERNOTEFREQ)*
+ (_preset->frequency[i].isFix?
+ _preset->frequency[i].freq:
+ (_preset->frequency[i].ratio
+ *pitch2freq((double)(pitch+_preset->function.transpose)
+ +(double)_preset->detune[i]*COEFDETUNE)));
+ _voices[newVoice].op[i].inct=(double)RESOLUTION
+ /((double)sampleRate()/_voices[newVoice].op[i].freq);
+ _voices[newVoice].op[i].envState=ATTACK;
+ _voices[newVoice].op[i].envIndex=0.0;
+ setEnvAttack(newVoice, i);
+ //printf("Coef Attack = %e envInct = %e\n",
+ //coefAttack(_preset->attack), _voices[newVoice].op[i].envInct);
+ }
+ return false;
+ }
+ }
+ return false;
+}
+
+//---------------------------------------------------------
+// plusMod
+// add two doubles modulo SINRESOLUTION
+//---------------------------------------------------------
+inline double plusMod(double x, double y)
+{
+ double res;
+ res=x+y;
+ if (res>=0) while (res >= (double)RESOLUTION) res-=(double)RESOLUTION;
+ else while (res < 0) res+=(double)RESOLUTION;
+ return res;
+}
+
+
+//---------------------------------------------------------
+// write
+// synthesize n samples into buffer+offset
+//---------------------------------------------------------
+
+void DeicsOnze::process(float** buffer, int offset, int n)
+{
+ //Process messages from the gui
+ while (_gui->fifoSize()) {
+ MidiEvent ev = _gui->readEvent();
+ if (ev.type() == ME_SYSEX) {
+ sysex(ev.len(), ev.data(), true);
+ sendEvent(ev);
+ }
+ else if (ev.type() == ME_CONTROLLER) {
+ setController(ev.channel(), ev.dataA(), ev.dataB(), true);
+ sendEvent(ev);
+ }
+ }
+ float* p = buffer[0] + offset;
+ float sample[MAXNBRVOICES];
+ float resSample;
+ float sampleOp[NBROP];
+ float ampOp[NBROP];
+ for(int i = 0; i < n; i++)
+ {
+ resSample = 0;
+ //stepProcess return the result to resSample
+
+ //Global
+ lfoUpdate(_preset, &_global, waveTable[W2]);
+
+ //per voice
+ for(int j=0; j<_global.nbrVoices; j++)
+ {
+ if (_voices[j].isOn)
+ {
+ for(int k=0; k<NBROP; k++)
+ {
+ _voices[j].op[k].index=
+ plusMod(_voices[j].op[k].index,
+ _global.lfoCoefInct*_voices[j].op[k].inct
+ *_global.pitchBendCoef);
+
+ ampOp[k]=_voices[j].op[k].amp*COEFLEVEL
+ *(_preset->sensitivity.ampOn[k]?_global.lfoAmp:1.0)
+ *env2AmpR(sampleRate(), waveTable[W2],
+ _preset->eg[k], &_voices[j].op[k]);
+ }
+ switch(_preset->algorithm)
+ {
+ case FIRST :
+ sampleOp[3]=ampOp[3]
+ *waveTable[_preset->oscWave[3]]
+ [(int)plusMod(_voices[j].op[3].index,
+ (float)RESOLUTION
+ *_voices[j].sampleFeedback)];
+ sampleOp[2]=ampOp[2]
+ *waveTable[_preset->oscWave[2]]
+ [(int)plusMod(_voices[j].op[2].index,
+ (float)RESOLUTION*sampleOp[3])];
+ sampleOp[1]=ampOp[1]
+ *waveTable[_preset->oscWave[1]]
+ [(int)plusMod(_voices[j].op[1].index,
+ (float)RESOLUTION*sampleOp[2])];
+ sampleOp[0]=ampOp[0]
+ *waveTable[_preset->oscWave[0]]
+ [(int)plusMod(_voices[j].op[0].index,
+ (float)RESOLUTION*sampleOp[1])];
+
+ sample[j]=sampleOp[0];///COEFLEVEL;
+
+ _voices[j].isOn=(_voices[j].op[0].envState!=OFF);
+ break;
+ case SECOND :
+ sampleOp[3]=ampOp[3]
+ *waveTable[_preset->oscWave[3]]
+ [(int)plusMod(_voices[j].op[3].index,
+ (float)RESOLUTION
+ *_voices[j].sampleFeedback)];
+ sampleOp[2]=ampOp[2]
+ *waveTable[_preset->oscWave[2]]
+ [(int)_voices[j].op[2].index];
+ sampleOp[1]=ampOp[1]
+ *waveTable[_preset->oscWave[1]]
+ [(int)plusMod(_voices[j].op[1].index,
+ (float)RESOLUTION
+ *(sampleOp[2]+sampleOp[3])/2.0)];
+ sampleOp[0]=ampOp[0]
+ *waveTable[_preset->oscWave[0]]
+ [(int)plusMod(_voices[j].op[0].index,
+ (float)RESOLUTION
+ *sampleOp[1])];
+
+ sample[j]=sampleOp[0];///COEFLEVEL;
+
+ _voices[j].isOn=(_voices[j].op[0].envState!=OFF);
+ break;
+ case THIRD :
+ sampleOp[3]=ampOp[3]
+ *waveTable[_preset->oscWave[3]]
+ [(int)plusMod(_voices[j].op[3].index,
+ (float)RESOLUTION
+ *_voices[j].sampleFeedback)];
+ sampleOp[2]=ampOp[2]
+ *waveTable[_preset->oscWave[2]]
+ [(int)_voices[j].op[2].index];
+ sampleOp[1]=ampOp[1]
+ *waveTable[_preset->oscWave[1]]
+ [(int)plusMod(_voices[j].op[1].index,
+ (float)RESOLUTION*sampleOp[2])];
+ sampleOp[0]=ampOp[0]
+ *waveTable[_preset->oscWave[0]]
+ [(int)plusMod(_voices[j].op[0].index,
+ (float)RESOLUTION
+ *(sampleOp[3]+sampleOp[1])/2.0)];
+
+ sample[j]=sampleOp[0];///COEFLEVEL;
+
+ _voices[j].isOn=(_voices[j].op[0].envState!=OFF);
+ break;
+ case FOURTH :
+ sampleOp[3]=ampOp[3]
+ *waveTable[_preset->oscWave[3]]
+ [(int)plusMod(_voices[j].op[3].index,
+ (float)RESOLUTION
+ *_voices[j].sampleFeedback)];
+ sampleOp[2]=ampOp[2]
+ *waveTable[_preset->oscWave[2]]
+ [(int)plusMod(_voices[j].op[2].index,
+ (float)RESOLUTION
+ *sampleOp[3])];
+ sampleOp[1]=ampOp[1]
+ *waveTable[_preset->oscWave[1]]
+ [(int)_voices[j].op[1].index];
+ sampleOp[0]=ampOp[0]
+ *waveTable[_preset->oscWave[0]]
+ [(int)plusMod(_voices[j].op[0].index,
+ (float)RESOLUTION
+ *(sampleOp[1]+sampleOp[2])/2.0)];
+
+ sample[j]=sampleOp[0];///COEFLEVEL;
+
+ _voices[j].isOn=(_voices[j].op[0].envState!=OFF);
+ break;
+ case FIFTH :
+ sampleOp[3]=ampOp[3]
+ *waveTable[_preset->oscWave[3]]
+ [(int)plusMod(_voices[j].op[3].index,
+ (float)RESOLUTION
+ *_voices[j].sampleFeedback)];
+ sampleOp[2]=ampOp[2]
+ *waveTable[_preset->oscWave[2]]
+ [(int)plusMod(_voices[j].op[2].index,
+ (float)RESOLUTION*sampleOp[3])];
+ sampleOp[1]=ampOp[1]
+ *waveTable[_preset->oscWave[1]]
+ [(int)_voices[j].op[1].index];
+ sampleOp[0]=ampOp[0]
+ *waveTable[_preset->oscWave[0]]
+ [(int)plusMod(_voices[j].op[0].index,
+ (float)RESOLUTION*sampleOp[1])];
+
+ sample[j]=(sampleOp[0]+sampleOp[2])/2.0;///COEFLEVEL;
+
+ _voices[j].isOn=(_voices[j].op[0].envState!=OFF
+ ||_voices[j].op[2].envState!=OFF);
+ break;
+ case SIXTH :
+ sampleOp[3]=ampOp[3]
+ *waveTable[_preset->oscWave[3]]
+ [(int)plusMod(_voices[j].op[3].index,
+ (float)RESOLUTION
+ *_voices[j].sampleFeedback)];
+ sampleOp[2]=ampOp[2]
+ *waveTable[_preset->oscWave[2]]
+ [(int)plusMod(_voices[j].op[2].index,
+ (float)RESOLUTION*sampleOp[3])];
+ sampleOp[1]=ampOp[1]
+ *waveTable[_preset->oscWave[1]]
+ [(int)plusMod(_voices[j].op[1].index,
+ (float)RESOLUTION*sampleOp[3])];
+ sampleOp[0]=ampOp[0]
+ *waveTable[_preset->oscWave[0]]
+ [(int)plusMod(_voices[j].op[0].index,
+ (float)RESOLUTION*sampleOp[3])];
+
+ sample[j]=(sampleOp[0]+sampleOp[1]+sampleOp[2])/3.0;
+
+ _voices[j].isOn=(_voices[j].op[0].envState!=OFF);
+ break;
+ case SEVENTH :
+ sampleOp[3]=ampOp[3]
+ *waveTable[_preset->oscWave[3]]
+ [(int)plusMod(_voices[j].op[3].index,
+ (float)RESOLUTION
+ *_voices[j].sampleFeedback)];
+ sampleOp[2]=ampOp[2]
+ *waveTable[_preset->oscWave[2]]
+ [(int)plusMod(_voices[j].op[2].index,
+ (float)RESOLUTION*sampleOp[3])];
+ sampleOp[1]=ampOp[1]
+ *waveTable[_preset->oscWave[1]]
+ [(int)_voices[j].op[1].index];
+ sampleOp[0]=ampOp[0]*waveTable[_preset->oscWave[0]]
+ [(int)_voices[j].op[0].index];
+
+ sample[j]=(sampleOp[0]+sampleOp[1]+sampleOp[2])/3.0;
+
+ _voices[j].isOn=(_voices[j].op[0].envState!=OFF);
+ break;
+ case EIGHTH :
+ sampleOp[3]=ampOp[3]
+ *waveTable[_preset->oscWave[3]]
+ [(int)plusMod(_voices[j].op[3].index,
+ (float)RESOLUTION
+ *_voices[j].sampleFeedback)];
+ sampleOp[2]=ampOp[2]
+ *waveTable[_preset->oscWave[2]]
+ [(int)_voices[j].op[2].index];
+ sampleOp[1]=ampOp[1]
+ *waveTable[_preset->oscWave[1]]
+ [(int)_voices[j].op[1].index];
+ sampleOp[0]=ampOp[0]
+ *waveTable[_preset->oscWave[0]]
+ [(int)_voices[j].op[0].index];
+
+ sample[j]=
+ (sampleOp[0]+sampleOp[1]+sampleOp[2]+sampleOp[3])
+ /4.0;
+
+ _voices[j].isOn=(_voices[j].op[0].envState!=OFF
+ || _voices[j].op[1].envState!=OFF
+ || _voices[j].op[2].envState!=OFF
+ || _voices[j].op[3].envState!=OFF);
+ break;
+ default : printf("Error : No algorithm");
+ break;
+ }
+
+ _voices[j].volume=
+ ampOp[0]+ampOp[1]+ampOp[2]+ampOp[3];
+
+ _voices[j].sampleFeedback=sampleOp[3]*_global.feedbackAmp;
+
+ resSample += sample[j];
+ }
+ }
+ p[i] += resSample*_global.amp;
+ }
+}
+
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+class QWidget;
+
+static Mess* instantiate(int sr, QWidget*, const char*)
+{
+ DeicsOnze* deicsonze = new DeicsOnze();
+ deicsonze->setSampleRate(sr);
+ return deicsonze;
+}
+
+extern "C" {
+ static MESS descriptor = {
+ "DeicsOnze",
+ "DeicsOnze FM DX11 emulator",
+ "0.3", // version string
+ MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
+ instantiate
+ };
+
+ const MESS* mess_descriptor() { return &descriptor; }
+}
+
diff --git a/muse/synti/deicsonze/deicsonze.h b/muse/synti/deicsonze/deicsonze.h
new file mode 100644
index 00000000..77bcd0c7
--- /dev/null
+++ b/muse/synti/deicsonze/deicsonze.h
@@ -0,0 +1,351 @@
+//===========================================================================
+//
+// DeicsOnze an emulator of the YAMAHA DX11 synthesizer
+//
+// Version 0.3
+//
+//
+//
+//
+// Copyright (c) 2004-2006 Nil Geisweiller
+//
+//
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+
+#ifndef __DEICSONZE_H
+#define __DEICSONZE_H
+
+
+#include "deicsonzepreset.h"
+#include "deicsonzegui.h"
+#include "libsynti/mess.h"
+
+#define DEICSONZESTR "deicsonze-0.3"
+
+#define MAXPITCHBENDVALUE 8191
+
+#define RESOLUTION 96000
+
+#define NBRCTRLS 127
+
+#define NBRPRESETS 128
+
+#define LOWERNOTEFREQ 8.176
+
+#define DB0LEVEL 90
+
+#define LENGTHNAME 20
+#define LENGTHCATEGORY 20
+#define LENGTHSUBCATEGORY 20
+
+#define MAXVELO 127
+#define MAXVOLUME 100.0
+#define MAXSTRLENGTHINITSETPATH 128
+
+//coef determined by ear to sound like the YAMAHA DX11
+#define COEFFEEDBACK 0.3
+#define COEFPLFO(x) (x==0?0.0:(x==1?0.06:(x==2?0.12:(x==3?0.25:(x==4?0.5:(x==5?0.9:(x==6?3.9:7.9))))))) //return pitch amplitude with respect to sensitivity pitch
+#define COEFALFO(x) (x==0?0.0:(x==1?0.4:(x==2?0.9:1.0)))
+#define COEFLEVEL 1.0//19.0
+#define COEFMAXATTACK 7.5
+#define COEFERRDECSUS 0.01 //for the transition between DECAY and SUSTAIN
+#define COEFERRSUSREL 0.001 //from SUSTAIN or RELEASE until no sound
+#define COEFDECAY 1.0
+#define COEFSUSTAIN 0.2
+#define COEFRELEASE 1.0
+#define COEFDETUNE 0.008
+#define COEFLEVELSCALE 0.0005
+#define COEFGATTACK 0.9
+#define COEFGRELEASE 0.9
+#define LEVELSCALENOTE 24.0
+
+#define NBRWAVES 8 //number wave forms, do not change
+#define NBRBANKPRESETS 32
+
+#define SYSEX_INIT_DATA 1
+#define SYSEX_INIT_DATA_VERSION 1
+#define SAVEINITLENGTH 2
+
+#define DEICSONZECONFIGURATIONSTR "deicsOnzeConfiguation"
+#define SYSEX_QUALITY 5
+#define QUALITYSTR "Quality"
+#define HIGHSTR "High"
+#define MIDDLESTR "Middle"
+#define LOWSTR "Low"
+#define SYSEX_CHANNELNUM 6
+#define CHANNELNUMSTR "ChannelNumber"
+#define ALLSTR "All"
+#define SYSEX_SAVECONFIG 7
+#define SAVECONFIGSTR "SaveConfig"
+#define SYSEX_SAVEONLYUSED 8
+#define SAVEONLYUSEDSTR "SaveOnlyUsed"
+#define YESSTRDEI "yes"
+#define NOSTRDEI "no"
+#define SYSEX_LOADSET 10
+#define SYSEX_ISINITSET 12
+#define ISINITSETSTR "IsInitSet"
+#define SYSEX_INITSETPATH 13
+#define INITSETPATHSTR "InitSetPath"
+#define SYSEX_COLORGUI 20
+#define TEXTCOLORSTR "TextColor"
+#define BACKGROUNDCOLORSTR "BackgroundColor"
+#define EDITTEXTCOLORSTR "EditTextColor"
+#define EDITBACKGROUNDCOLORSTR "EditBackgroundColor"
+#define COLORSYSEXLENGTH 12
+#define SYSEX_UPDATESETGUI 25
+
+#define NUMMASTERVOL SAVEINITLENGTH
+#define NUMCURRENTPROG SAVEINITLENGTH+1
+#define NUMCURRENTLBANK SAVEINITLENGTH+2
+#define NUMCURRENTHBANK SAVEINITLENGTH+3
+#define NUMSAVEONLYUSED SAVEINITLENGTH+4
+#define NUMSAVECONFIG SAVEINITLENGTH+5
+#define NUMNBRVOICES SAVEINITLENGTH+6
+#define NUMCHANNELNUM SAVEINITLENGTH+7
+#define SAVEGLOBALLENGTH 10
+
+#define NUMREDTEXT SAVEINITLENGTH+SAVEGLOBALLENGTH
+#define NUMGREENTEXT SAVEINITLENGTH+SAVEGLOBALLENGTH+1
+#define NUMBLUETEXT SAVEINITLENGTH+SAVEGLOBALLENGTH+2
+#define NUMREDBACKGROUND SAVEINITLENGTH+SAVEGLOBALLENGTH+3
+#define NUMGREENBACKGROUND SAVEINITLENGTH+SAVEGLOBALLENGTH+4
+#define NUMBLUEBACKGROUND SAVEINITLENGTH+SAVEGLOBALLENGTH+5
+#define NUMREDEDITTEXT SAVEINITLENGTH+SAVEGLOBALLENGTH+6
+#define NUMGREENEDITTEXT SAVEINITLENGTH+SAVEGLOBALLENGTH+7
+#define NUMBLUEEDITTEXT SAVEINITLENGTH+SAVEGLOBALLENGTH+8
+#define NUMREDEDITBACKGROUND SAVEINITLENGTH+SAVEGLOBALLENGTH+9
+#define NUMGREENEDITBACKGROUND SAVEINITLENGTH+SAVEGLOBALLENGTH+10
+#define NUMBLUEEDITBACKGROUND SAVEINITLENGTH+SAVEGLOBALLENGTH+11
+#define NUMQUALITY SAVEINITLENGTH+SAVEGLOBALLENGTH+12
+#define SAVECONFIGLENGTH 20
+
+#define NUMISINITSET SAVEINITLENGTH+SAVEGLOBALLENGTH+SAVECONFIGLENGTH
+#define NUMINITSETPATH SAVEINITLENGTH+SAVEGLOBALLENGTH+SAVECONFIGLENGTH+1
+
+class DeicsOnzeGui;
+
+//---------------------------------------------------------
+// outLevel2Amp, Amp for amplitude //between 0.0 and 2.0 or more
+// 100->2.0, 90->1.0, 80->0.5 ...
+//---------------------------------------------------------
+inline double outLevel2Amp(int ol);
+
+//---------------------------------------------------------
+// envAR2s
+// return the time in second of the ATTACK duration
+//---------------------------------------------------------
+inline double envAR2s(int ar);
+
+//---------------------------------------------------------
+// coefAttack
+// convert the attack value to a coef for envInct
+//---------------------------------------------------------
+inline double coefAttack(unsigned char attack);
+
+//---------------------------------------------------------
+// envRR2coef
+// return the coefficient for the exponential decrease
+// with respect to rr and sampleRate, sr
+//---------------------------------------------------------
+inline double envRR2coef(int rr, int sr, unsigned char release);
+
+//--------------------------------------------------------
+// DeicsOnzeCtrl
+//--------------------------------------------------------
+struct DeicsOnzeCtlr
+{
+ std::string name;
+ int num;
+ int min, max;
+};
+
+//---------------------------------------------------------
+// EnvState
+//---------------------------------------------------------
+
+enum EnvState{
+ ATTACK,
+ DECAY,
+ SUSTAIN,
+ RELEASE,
+ OFF
+};
+
+//---------------------------------------------------------
+// OpVoice
+//---------------------------------------------------------
+
+struct OpVoice {
+ double freq;
+ double index;
+ double inct;
+ double amp; //between 0 and 1
+ double ampVeloNote; //keeps the ratio amplitude from velo2AmpR and note2Amp
+ //in order to change independently the output level
+ //after pressing the note
+ EnvState envState;
+ double envIndex;
+ double envInct;
+ double envLevel;
+ double coefVLevel;
+};
+
+//---------------------------------------------------------
+// Voice
+//---------------------------------------------------------
+
+struct Voice {
+ bool isOn;
+ bool isSustained;
+ int pitch;
+ double volume;
+ OpVoice op[NBROP];
+ float sampleFeedback;
+};
+
+//---------------------------------------------------------
+// Global
+//---------------------------------------------------------
+
+enum Quality {
+ high,
+ middle,
+ low
+};
+
+struct Global {
+ float amp;
+ float feedbackAmp;
+ float lfoFreq;
+ float lfoPitch;
+ float lfoMaxCoefInct;
+ float lfoCoefInct;
+ float lfoCoefInctInct;
+ unsigned int lfoIndex;
+ unsigned int lfoMaxIndex;
+ float lfoMaxAmp;
+ float lfoMaxDAmp;
+ float lfoAmp;
+ float lfoCoefAmp;
+ double lfoDelayIndex;
+ double lfoDelayInct;
+ double lfoDelayMaxIndex;
+ bool delayPassed;
+ bool sustain;
+ double pitchBendCoef;//speed coef to read the sample
+ Quality quality; //0=high, 1=medium, 2=low
+ unsigned char nbrVoices;
+ char channelNum;//-1 to 15, -1 means all
+};
+
+
+//---------------------------------------------------------
+// DeicsOnze : DX11 emulator
+//---------------------------------------------------------
+
+class DeicsOnze : public Mess {
+ DeicsOnzeGui* _gui;
+
+ static int useCount;
+ static float waveTable[NBRWAVES][RESOLUTION];
+
+ private:
+ void parseInitData(int length, const unsigned char* data);
+ void loadConfiguration(QString fileName);
+
+ public:
+ int nbrCtrl;
+
+ QString _initSetPath;
+ bool _isInitSet;
+ bool _saveOnlyUsed;
+ bool _saveConfig;
+ DeicsOnzeCtlr _ctrl[NBRCTRLS];
+ Global _global;
+ Voice _voices[MAXNBRVOICES];
+ Preset* _preset;
+ Preset* _initialPreset;
+
+ mutable MidiPatch _patch;
+ int _numPatch;
+
+ //preset tree
+ Set* _set;
+
+ Preset* findPreset(int hbank, int lbank, int prog);
+ void initCtrls();
+ void initGlobal();
+ void initVoice(unsigned char v);
+ void initVoices();
+ void initPreset();
+ void setPreset();
+ void setFeedback();
+ void setLfo();
+ void setOutLevel(int k); //set the output level of the operator k
+ void setOutLevel(); //do the same for all operators
+ void setEnvAttack(int v, int k); //set envInct of voice v and operator k
+ void setEnvAttack(int k); //do the same for all voices of operator k
+ void setEnvAttack(); //do the same for all voices all operators
+ void setEnvRelease(int v, int k); //set coefVLevel of voice v and operator k
+ void setEnvRelease(int k); //do the same for all voices of operator k
+ void setEnvRelease(); //do the same for all voices all operators
+ double brightness2Amp(int k); //get the brightness of the operator k
+ //void loadSutulaPresets();
+ void loadSet(QString s);
+ int noteOff2Voice();
+ int minVolu2Voice();
+ int pitchOn2Voice(int pitch);
+ void programSelect(int hbank, int lbank, int prog);
+
+ void setNbrVoices(unsigned char nv);
+ void setMasterVol(int mv);
+ int getMasterVol(void);
+ void setPitchBendCoef(int val);
+ void setModulation(int val);
+ void setSustain(int val);
+
+ void readConfiguration(QDomNode qdn);
+ void writeConfiguration(AL::Xml* xml);
+
+ bool setController(int ch, int ctrl, int val, bool fromGui);
+ virtual bool setController(int ch, int ctrl, int val);
+ bool sysex(int length, const unsigned char* data, bool fromGui);
+ virtual bool sysex(int length, const unsigned char* data);
+
+ virtual const char* getPatchName(int ch, int number, int) const;
+ virtual const MidiPatch* getPatchInfo(int, const MidiPatch *) const;
+ virtual int getControllerInfo(int arg1, const char** arg2,
+ int* arg3, int* arg4, int* arg5) const;
+ virtual void getInitData(int* length, const unsigned char** data) const;
+ virtual bool playNote(int channel, int pitch, int velo);
+ virtual void process(float** buffer, int offset, int n);
+
+ // GUI interface routines
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const;
+ virtual void showGui(bool);
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+
+ DeicsOnze();
+ ~DeicsOnze();
+};
+
+
+#endif /* __DEICSONZE_H */
diff --git a/muse/synti/deicsonze/deicsonzegui.cpp b/muse/synti/deicsonze/deicsonzegui.cpp
new file mode 100644
index 00000000..cc3bb7aa
--- /dev/null
+++ b/muse/synti/deicsonze/deicsonzegui.cpp
@@ -0,0 +1,3601 @@
+//===========================================================================
+//
+// DeicsOnze an emulator of the YAMAHA DX11 synthesizer
+//
+// Version 0.3
+//
+// deicsonzegui.cpp
+//
+//
+// Copyright (c) 2004-2006 Nil Geisweiller
+//
+//
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+#include "muse/midi.h"
+#include "muse/midictrl.h"
+
+#include "deicsonzegui.h"
+
+DeicsOnzeGui::DeicsOnzeGui(DeicsOnze* deicsOnze)
+ : QDialog(0),
+ MessGui()
+{
+ setupUi(this);
+ _deicsOnze = deicsOnze;
+ lastDir= "";
+
+ tColor = new TCOLOR;
+ bColor = new BCOLOR;
+ etColor = new ETCOLOR;
+ ebColor = new EBCOLOR;
+ curColor = new QColor(0, 0, 0);
+
+ pitchEnvelopeGraph = new QFramePitchEnvelope(pitchEnvFrame, this);
+
+ envelopeGraph[0] = new QFrameEnvelope(envelope1Frame, this, 0);
+ envelopeGraph[1] = new QFrameEnvelope(envelope2Frame, this, 1);
+ envelopeGraph[2] = new QFrameEnvelope(envelope3Frame, this, 2);
+ envelopeGraph[3] = new QFrameEnvelope(envelope4Frame, this, 3);
+
+ //Quick edit
+ connect(volumeKnob, SIGNAL(valueChanged(float, int)),
+ this, SLOT(setVolKnob(float)));
+ connect(brightnessKnob, SIGNAL(valueChanged(float, int)),
+ this, SLOT(setBrightnessKnob(float)));
+ connect(modulationKnob, SIGNAL(valueChanged(float, int)),
+ this, SLOT(setModulationKnob(float)));
+ connect(detuneKnob, SIGNAL(valueChanged(float, int)),
+ this, SLOT(setDetuneKnob(float)));
+ connect(attackKnob, SIGNAL(valueChanged(float, int)),
+ this, SLOT(setAttackKnob(float)));
+ connect(releaseKnob, SIGNAL(valueChanged(float, int)),
+ this, SLOT(setReleaseKnob(float)));
+ //nbr of voices
+ connect(nbrVoicesSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setNbrVoices(int)));
+ //quality
+ connect(qualityComboBox, SIGNAL(activated(const QString&)),
+ this, SLOT(setQuality(const QString&)));
+ //load save configuration
+ connect(saveConfPushButton, SIGNAL(pressed()),
+ this, SLOT(saveConfiguration()));
+ connect(loadConfPushButton, SIGNAL(pressed()),
+ this, SLOT(loadConfiguration()));
+ connect(saveDefaultPushButton, SIGNAL(pressed()),
+ this, SLOT(saveDefaultConfiguration()));
+ //load init set
+ connect(initSetCheckBox, SIGNAL(toggled(bool)),
+ this, SLOT(setIsInitSet(bool)));
+ connect(pathLineEdit, SIGNAL(textChanged(const QString&)),
+ this, SLOT(setInitSetPath(const QString&)));
+ connect(browsePushButton, SIGNAL(pressed()),
+ this, SLOT(setBrowseInitSetPath()));
+
+ //Midi in channel
+ connect(MidiInChComboBox, SIGNAL(activated(int)),
+ this, SLOT(setMidiInCh(int)));
+ //Save mode ratio button
+ connect(minSaveRadioButton, SIGNAL(toggled(bool)),
+ this, SLOT(setSaveOnlyUsed(bool)));
+ connect(hugeSaveRadioButton, SIGNAL(toggled(bool)),
+ this, SLOT(setSaveOnlyUsedComp(bool)));
+ connect(saveConfigCheckBox, SIGNAL(toggled(bool)),
+ this, SLOT(setSaveConfig(bool)));
+ //Colors
+ connect(redSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setRedColor(int)));
+ connect(greenSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setGreenColor(int)));
+ connect(blueSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setBlueColor(int)));
+ connect(colorListBox,
+ SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
+ this, SLOT(setRGBSliders(QListWidgetItem*)));
+ //PopupMenu Category Subcategory Preset
+ connect(categoryListView,
+ SIGNAL(customContextMenuRequested(const QPoint&)),
+ this, SLOT(categoryPopupMenu(const QPoint&)));
+ connect(subcategoryListView,
+ SIGNAL(customContextMenuRequested(const QPoint&)),
+ this, SLOT(subcategoryPopupMenu(const QPoint&)));
+ connect(presetListView,
+ SIGNAL(customContextMenuRequested(const QPoint &)),
+ this, SLOT(presetPopupMenu(const QPoint &)));
+ //Preset and bank
+ connect(presetLineEdit, SIGNAL(textChanged(const QString&)),
+ this, SLOT(setPresetName(const QString&)));
+ connect(subcategoryLineEdit, SIGNAL(textChanged(const QString&)),
+ this, SLOT(setSubcategoryName(const QString&)));
+ connect(categoryLineEdit, SIGNAL(textChanged(const QString&)),
+ this, SLOT(setCategoryName(const QString&)));
+ connect(hbankSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setHBank(int)));
+ connect(lbankSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setLBank(int)));
+ connect(progSpinBox, SIGNAL(valueChanged(int)), this, SLOT(setProg(int)));
+ //Global
+ connect(masterVolSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setMasterVol(int)));
+ connect(feedbackSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setFeedback(int)));
+ connect(LFOWaveComboBox, SIGNAL(activated(int)),
+ this, SLOT(setLfoWave(int)));
+ connect(LFOSpeedSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setLfoSpeed(int)));
+ connect(LFODelaySlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setLfoDelay(int)));
+ connect(PModDepthSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setLfoPModDepth(int)));
+ connect(PModSensSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setLfoPitchSens(int)));
+ connect(AModDepthSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setLfoAModDepth(int)));
+ connect(AModSensSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setLfoAmpSens(int)));
+ connect(transposeSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setTranspose(int)));
+ connect(globalDetuneSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setGlobalDetune(int)));
+ connect(algorithmComboBox, SIGNAL(activated(int)),
+ this, SLOT(setAlgorithm(int)));
+ connect(pitchBendRangeSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(setPitchBendRange(int)));
+ //Pitch Envelope
+ connect(PL1SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setPL1(int)));
+ connect(PL2SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setPL2(int)));
+ connect(PL3SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setPL3(int)));
+ connect(PR1SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setPR1(int)));
+ connect(PR2SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setPR2(int)));
+ connect(PR3SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setPR3(int)));
+ //Function
+ connect(fcVolumeSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFcVolume(int)));
+ connect(fcPitchSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFcPitch(int)));
+ connect(fcAmplitudeSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFcAmplitude(int)));
+ connect(mwPitchSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setMwPitch(int)));
+ connect(mwAmplitudeSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setMwAmplitude(int)));
+ connect(bcPitchSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setBcPitch(int)));
+ connect(bcAmplitudeSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setBcAmplitude(int)));
+ connect(bcPitchBiasSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setBcPitchBias(int)));
+ connect(bcEgBiasSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setBcEgBias(int)));
+ connect(atPitchSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setAtPitch(int)));
+ connect(atAmplitudeSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setAtAmplitude(int)));
+ connect(atPitchBiasSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setAtPitchBias(int)));
+ connect(atEgBiasSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setAtEgBias(int)));
+ connect(reverbSpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setReverbRate(int)));
+ //envelope
+ connect(AR1SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setAR1(int)));
+ connect(D1R1SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD1R1(int)));
+ connect(D1L1SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD1L1(int)));
+ connect(D2R1SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD2R1(int)));
+ connect(RR1SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setRR1(int)));
+ connect(AR2SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setAR2(int)));
+ connect(D1R2SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD1R2(int)));
+ connect(D1L2SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD1L2(int)));
+ connect(D2R2SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD2R2(int)));
+ connect(RR2SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setRR2(int)));
+ connect(AR3SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setAR3(int)));
+ connect(D1R3SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD1R3(int)));
+ connect(D1L3SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD1L3(int)));
+ connect(D2R3SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD2R3(int)));
+ connect(RR3SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setRR3(int)));
+ connect(AR4SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setAR4(int)));
+ connect(D1R4SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD1R4(int)));
+ connect(D1L4SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD1L4(int)));
+ connect(D2R4SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setD2R4(int)));
+ connect(RR4SpinBox, SIGNAL(valueChanged(int)), this, SLOT(setRR4(int)));
+ //Scaling
+ connect(LS1Slider, SIGNAL(valueChanged(int)), this, SLOT(setLS1(int)));
+ connect(RS1Slider, SIGNAL(valueChanged(int)), this, SLOT(setRS1(int)));
+ connect(LS2Slider, SIGNAL(valueChanged(int)), this, SLOT(setLS2(int)));
+ connect(RS2Slider, SIGNAL(valueChanged(int)), this, SLOT(setRS2(int)));
+ connect(LS3Slider, SIGNAL(valueChanged(int)), this, SLOT(setLS3(int)));
+ connect(RS3Slider, SIGNAL(valueChanged(int)), this, SLOT(setRS3(int)));
+ connect(LS4Slider, SIGNAL(valueChanged(int)), this, SLOT(setLS4(int)));
+ connect(RS4Slider, SIGNAL(valueChanged(int)), this, SLOT(setRS4(int)));
+ //Volume
+ connect(OUT1Slider, SIGNAL(valueChanged(int)), this, SLOT(setVol1(int)));
+ connect(OUT2Slider, SIGNAL(valueChanged(int)), this, SLOT(setVol2(int)));
+ connect(OUT3Slider, SIGNAL(valueChanged(int)), this, SLOT(setVol3(int)));
+ connect(OUT4Slider, SIGNAL(valueChanged(int)), this, SLOT(setVol4(int)));
+ //Ratio and Frequency
+ connect(CoarseRatio1SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setCoarseRatio1(int)));
+ connect(FineRatio1SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFineRatio1(int)));
+ connect(Freq1SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFreq1(int)));
+ connect(Fix1CheckBox, SIGNAL(toggled(bool)), this, SLOT(setFix1(bool)));
+ connect(CoarseRatio2SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setCoarseRatio2(int)));
+ connect(FineRatio2SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFineRatio2(int)));
+ connect(Freq2SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFreq2(int)));
+ connect(Fix2CheckBox, SIGNAL(toggled(bool)), this, SLOT(setFix2(bool)));
+ connect(CoarseRatio3SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setCoarseRatio3(int)));
+ connect(FineRatio3SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFineRatio3(int)));
+ connect(Freq3SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFreq3(int)));
+ connect(Fix3CheckBox, SIGNAL(toggled(bool)), this, SLOT(setFix3(bool)));
+ connect(CoarseRatio4SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setCoarseRatio4(int)));
+ connect(FineRatio4SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFineRatio4(int)));
+ connect(Freq4SpinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(setFreq4(int)));
+ connect(Fix4CheckBox, SIGNAL(toggled(bool)), this, SLOT(setFix4(bool)));
+ //Sensitivity
+ connect(AME1CheckBox, SIGNAL(toggled(bool)), this, SLOT(setAME1(bool)));
+ connect(EBS1Slider, SIGNAL(valueChanged(int)), this, SLOT(setEBS1(int)));
+ connect(KVS1Slider, SIGNAL(valueChanged(int)), this, SLOT(setKVS1(int)));
+ connect(AME2CheckBox, SIGNAL(toggled(bool)), this, SLOT(setAME2(bool)));
+ connect(EBS2Slider, SIGNAL(valueChanged(int)), this, SLOT(setEBS2(int)));
+ connect(KVS2Slider, SIGNAL(valueChanged(int)), this, SLOT(setKVS2(int)));
+ connect(AME3CheckBox, SIGNAL(toggled(bool)), this, SLOT(setAME3(bool)));
+ connect(EBS3Slider, SIGNAL(valueChanged(int)), this, SLOT(setEBS3(int)));
+ connect(KVS3Slider, SIGNAL(valueChanged(int)), this, SLOT(setKVS3(int)));
+ connect(AME4CheckBox, SIGNAL(toggled(bool)), this, SLOT(setAME4(bool)));
+ connect(EBS4Slider, SIGNAL(valueChanged(int)), this, SLOT(setEBS4(int)));
+ connect(KVS4Slider, SIGNAL(valueChanged(int)), this, SLOT(setKVS4(int)));
+ //detune
+ connect(DET1Slider, SIGNAL(valueChanged(int)), this, SLOT(setDET1(int)));
+ connect(DET2Slider, SIGNAL(valueChanged(int)), this, SLOT(setDET2(int)));
+ connect(DET3Slider, SIGNAL(valueChanged(int)), this, SLOT(setDET3(int)));
+ connect(DET4Slider, SIGNAL(valueChanged(int)), this, SLOT(setDET4(int)));
+ //WaveForm
+ connect(WaveForm1ComboBox, SIGNAL(activated(int)),
+ this, SLOT(setWaveForm1(int)));
+ connect(WaveForm2ComboBox, SIGNAL(activated(int)),
+ this, SLOT(setWaveForm2(int)));
+ connect(WaveForm3ComboBox, SIGNAL(activated(int)),
+ this, SLOT(setWaveForm3(int)));
+ connect(WaveForm4ComboBox, SIGNAL(activated(int)),
+ this, SLOT(setWaveForm4(int)));
+ //category subcategory preset
+ connect(categoryListView,
+ SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
+ this, SLOT(setCategory(QTreeWidgetItem*)));
+ connect(categoryListView, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
+ this, SLOT(setCategory(QTreeWidgetItem*)));
+ connect(subcategoryListView,
+ SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
+ this, SLOT(setSubcategory(QTreeWidgetItem*)));
+ connect(subcategoryListView, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
+ this, SLOT(setSubcategory(QTreeWidgetItem*)));
+ connect(presetListView,
+ SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
+ this, SLOT(setPreset(QTreeWidgetItem*)));
+ connect(presetListView, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
+ this, SLOT(setPreset(QTreeWidgetItem*)));
+ //Connect socketnotifier to fifo
+ QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read);
+ connect(s, SIGNAL(activated(int)), SLOT(readMessage(int)));
+
+ setTextColor(reinterpret_cast<const QColor &>(*tColor));
+ setBackgroundColor(reinterpret_cast<const QColor &>(*bColor));
+ setEditTextColor(reinterpret_cast<const QColor &>(*etColor));
+ setEditBackgroundColor(reinterpret_cast<const QColor &>(*ebColor));
+
+ //select the first item in the color list
+ colorListBox->setCurrentItem(colorListBox->item(0));
+
+ //color the colorFrame with the color of the text
+ QPalette p = colorFrame->palette();
+ p.setColor(QPalette::Window, (reinterpret_cast<const QColor &>(*tColor)));
+ colorFrame->setPalette(p);
+
+ //updatePreset();
+ _enabledPreset = true;
+ setEnabledPreset(false);
+
+ updateInitSetPath
+ (QString
+ ("/usr/local/share/muse-1.0pre1/presets/deicsonze/SutulaBank.dei")
+ );
+
+}
+
+//-----------------------------------------------------------
+// setNbrVoices
+//-----------------------------------------------------------
+void DeicsOnzeGui::setNbrVoices(int nv) {
+ sendController(0, CTRL_NBRVOICES, nv);
+}
+
+//----------------------------------------------------------
+// setMidiInCh
+//----------------------------------------------------------
+void DeicsOnzeGui::setMidiInCh(int m) {
+ unsigned char* message = new unsigned char[2];
+ message[0]=SYSEX_CHANNELNUM;
+ message[1]=(unsigned char)(m-1);
+ sendSysex(message, 2);
+}
+
+//-----------------------------------------------------------
+// saveConfiguration
+//-----------------------------------------------------------
+void DeicsOnzeGui::saveConfiguration() {
+ QString filename =
+ QFileDialog::getSaveFileName(
+ this,
+ tr("Save configuration"),
+ lastDir,
+ QString("*.dco"));
+ if(!filename.isEmpty()) {
+ QFileInfo fi(filename);
+ lastDir = fi.path();
+ if(!filename.endsWith(".dco")) filename+=".dco";
+ QFile f(filename);
+ f.open(QIODevice::WriteOnly);
+ AL::Xml* xml = new AL::Xml(&f);
+ xml->header();
+ _deicsOnze->writeConfiguration(xml);
+ f.close();
+ }
+}
+
+//-----------------------------------------------------------
+// saveDefaultConfiguration
+//-----------------------------------------------------------
+void DeicsOnzeGui::saveDefaultConfiguration() {
+ QString filename = QString(getenv("HOME")) + QString("/." DEICSONZESTR);
+ if(!filename.isEmpty()) {
+ QFile f(filename);
+ f.open(QIODevice::WriteOnly);
+
+ AL::Xml* xml = new AL::Xml(&f);
+ xml->header();
+ _deicsOnze->writeConfiguration(xml);
+ f.close();
+ }
+}
+
+//-----------------------------------------------------------
+// loadConfiguration
+//-----------------------------------------------------------
+void DeicsOnzeGui::loadConfiguration(QString fileName) {
+ // read the XML file and create DOM tree
+ if(!fileName.isEmpty()) {
+ QFile confFile(fileName);
+ if(!confFile.open(QIODevice::ReadOnly)) {
+ QMessageBox::critical(0,
+ tr("Critical Error"),
+ tr("Cannot open file %1").arg(fileName));
+ return;
+ }
+ QDomDocument domTree;
+ if (!domTree.setContent(&confFile )) {
+ QMessageBox::critical
+ (0, tr("Critical Error"),
+ tr("Parsing error for file %1").arg(fileName));
+ confFile.close();
+ return;
+ }
+
+ confFile.close();
+
+ QDomNode node = domTree.documentElement();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == DEICSONZECONFIGURATIONSTR) {
+ QString version = e.attribute(QString("version"));
+ if (version == "1.0") {
+ _deicsOnze->readConfiguration(node.firstChild());
+ }
+ else printf("unsupported *.dco file version %s\n",
+ version.toLatin1().data());
+ }
+ else printf("DeicsOnze: %s not supported\n",
+ e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+}
+
+//-----------------------------------------------------------
+// loadConfiguration
+//-----------------------------------------------------------
+void DeicsOnzeGui::loadConfiguration() {
+ QString fileName =
+ QFileDialog::getOpenFileName(
+ this,
+ tr("Load category dialog"),
+ lastDir,
+ QString("*.dco"));
+ QFileInfo fi(fileName);
+ lastDir = fi.path();
+ loadConfiguration(fileName);
+}
+
+//-----------------------------------------------------------
+// setQuality
+//-----------------------------------------------------------
+void DeicsOnzeGui::setQuality(const QString& q) {
+ unsigned char* message = new unsigned char[2];
+ message[0]=SYSEX_QUALITY;
+ message[1]=(unsigned char)(q=="High"?high:(q=="Middle"?middle:low));
+ sendSysex(message, 2);
+}
+
+//-----------------------------------------------------------
+// setSaveOnlyUsed
+//-----------------------------------------------------------
+void DeicsOnzeGui::setSaveOnlyUsed(bool sou) {
+ unsigned char* message = new unsigned char[2];
+ message[0]=SYSEX_SAVEONLYUSED;
+ message[1]=(unsigned char)sou;
+ sendSysex(message, 2);
+ updateSaveOnlyUsed(sou);
+}
+void DeicsOnzeGui::setSaveOnlyUsedComp(bool souc) {
+ unsigned char* message = new unsigned char[2];
+ message[0]=SYSEX_SAVEONLYUSED;
+ message[1]=(unsigned char)!souc;
+ sendSysex(message, 2);
+ updateSaveOnlyUsed(!souc);
+}
+//-----------------------------------------------------------
+// setSaveConfig
+//-----------------------------------------------------------
+void DeicsOnzeGui::setSaveConfig(bool ssc) {
+ unsigned char* message = new unsigned char[2];
+ message[0]=SYSEX_SAVECONFIG;
+ message[1]=(unsigned char)ssc;
+ sendSysex(message, 2);
+}
+//-----------------------------------------------------------
+// setColor
+//-----------------------------------------------------------
+void DeicsOnzeGui::setRedColor(int r) {
+ QListWidgetItem* i=colorListBox->selectedItems().at(0);
+ if(i){
+ curColor->setRgb(r, curColor->green(), curColor->blue());
+ if(i->text()==QString("Text")) {
+ tColor->setRgb(curColor->rgb());
+ setTextColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ else if(i->text()==QString("Background")) {
+ bColor->setRgb(curColor->rgb());
+ setBackgroundColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ else if(i->text()==QString("Edit Text")) {
+ etColor->setRgb(curColor->rgb());
+ setEditTextColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ else if(i->text()==QString("Edit Background")) {
+ ebColor->setRgb(curColor->rgb());
+ setEditBackgroundColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ QPalette p = colorFrame->palette();
+ p.setColor(QPalette::Window,
+ (reinterpret_cast<const QColor &>(*curColor)));
+ colorFrame->setPalette(p);
+ }
+}
+void DeicsOnzeGui::setGreenColor(int g) {
+ QListWidgetItem* i=colorListBox->selectedItems().at(0);
+ if(i) {
+ curColor->setRgb(curColor->red(), g, curColor->blue());
+ if(i->text()==QString("Text")) {
+ tColor->setRgb(curColor->rgb());
+ setTextColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ else if(i->text()==QString("Background")) {
+ bColor->setRgb(curColor->rgb());
+ setBackgroundColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ else if(i->text()==QString("Edit Text")) {
+ etColor->setRgb(curColor->rgb());
+ setEditTextColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ else if(i->text()==QString("Edit Background")) {
+ ebColor->setRgb(curColor->rgb());
+ setEditBackgroundColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ QPalette p = colorFrame->palette();
+ p.setColor(QPalette::Window, (reinterpret_cast<const QColor &>(*curColor)));
+ colorFrame->setPalette(p);
+ }
+}
+void DeicsOnzeGui::setBlueColor(int b) {
+ QListWidgetItem* i=colorListBox->selectedItems().at(0);
+ if(i) {
+ curColor->setRgb(curColor->red(), curColor->green(), b);
+ if(i->text()==QString("Text")) {
+ tColor->setRgb(curColor->rgb());
+ setTextColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ else if(i->text()==QString("Background")) {
+ bColor->setRgb(curColor->rgb());
+ setBackgroundColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ else if(i->text()==QString("Edit Text")) {
+ etColor->setRgb(curColor->rgb());
+ setEditTextColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ else if(i->text()==QString("Edit Background")) {
+ ebColor->setRgb(curColor->rgb());
+ setEditBackgroundColor(reinterpret_cast<const QColor &>(*curColor));
+ }
+ QPalette p = colorFrame->palette();
+ p.setColor(QPalette::Window, (reinterpret_cast<const QColor &>(*curColor)));
+ colorFrame->setPalette(p);
+ }
+}
+void DeicsOnzeGui::setRGBSliders(QListWidgetItem* i) {
+ if(i->text()==QString("Text"))
+ curColor->setRgb(tColor->red(), tColor->green(), tColor->blue());
+ else if(i->text()==QString("Background"))
+ curColor->setRgb(bColor->red(), bColor->green(), bColor->blue());
+ else if(i->text()==QString("Edit Text"))
+ curColor->setRgb(etColor->red(), etColor->green(), etColor->blue());
+ else if(i->text()==QString("Edit Background"))
+ curColor->setRgb(ebColor->red(), ebColor->green(), ebColor->blue());
+
+ redSlider->blockSignals(true);
+ redSlider->setValue(curColor->red());
+ redSlider->blockSignals(false);
+ redSpinBox->blockSignals(true);
+ redSpinBox->setValue(curColor->red());
+ redSpinBox->blockSignals(false);
+ greenSlider->blockSignals(true);
+ greenSlider->setValue(curColor->green());
+ greenSlider->blockSignals(false);
+ greenSpinBox->blockSignals(true);
+ greenSpinBox->setValue(curColor->green());
+ greenSpinBox->blockSignals(false);
+ blueSlider->blockSignals(true);
+ blueSlider->setValue(curColor->blue());
+ blueSlider->blockSignals(false);
+ blueSpinBox->blockSignals(true);
+ blueSpinBox->setValue(curColor->blue());
+ blueSpinBox->blockSignals(false);
+ QPalette p = colorFrame->palette();
+ p.setColor(QPalette::Window, (reinterpret_cast<const QColor &>(*curColor)));
+ colorFrame->setPalette(p);
+}
+void DeicsOnzeGui::setTextColor(const QColor & c) {
+ QPalette p = this->palette();
+ p.setColor(QPalette::WindowText, c);
+ this->setPalette(p);
+}
+void DeicsOnzeGui::setBackgroundColor(const QColor & c) {
+ QPalette p = this->palette();
+ p.setColor(QPalette::Window, c);
+ this->setPalette(p);
+}
+void DeicsOnzeGui::setEditTextColor(const QColor & c) {
+ QPalette p = this->palette();
+ p.setColor(QPalette::Text, c);
+ this->setPalette(p);
+ volumeKnob->setScaleValueColor(c);
+ brightnessKnob->setScaleValueColor(c);
+ modulationKnob->setScaleValueColor(c);
+ detuneKnob->setScaleValueColor(c);
+ attackKnob->setScaleValueColor(c);
+ releaseKnob->setScaleValueColor(c);
+}
+void DeicsOnzeGui::setEditBackgroundColor(const QColor & c) {
+ QPalette p = this->palette();
+ p.setColor(QPalette::Base, c);
+ this->setPalette(p);
+ p = pitchEnvFrame->palette();
+ p.setColor(QPalette::Window, c);
+ pitchEnvFrame->setPalette(p);
+ p = envelope1Frame->palette();
+ p.setColor(QPalette::Window, c);
+ envelope1Frame->setPalette(p);
+ p = envelope2Frame->palette();
+ p.setColor(QPalette::Window, c);
+ envelope2Frame->setPalette(p);
+ p = envelope3Frame->palette();
+ p.setColor(QPalette::Window, c);
+ envelope3Frame->setPalette(p);
+ p = envelope4Frame->palette();
+ p.setColor(QPalette::Window, c);
+ envelope4Frame->setPalette(p);
+ volumeKnob->setScaleColor(c);
+ brightnessKnob->setScaleColor(c);
+ modulationKnob->setScaleColor(c);
+ detuneKnob->setScaleColor(c);
+ attackKnob->setScaleColor(c);
+ releaseKnob->setScaleColor(c);
+}
+
+//-----------------------------------------------------------
+// QFramePitchEnvelope
+//-----------------------------------------------------------
+void QFramePitchEnvelope::paintEvent(QPaintEvent* /*e*/) {
+ QPainter paint(this);
+ QPen pen;
+ pen.setColor(*(_deicsOnzeGui->etColor));
+ //if the size of pitchEnvFrame is different than QFramePitchEnvelope resize
+ //and update the envelope
+ if(_deicsOnzeGui->pitchEnvFrame->width()!=width() ||
+ _deicsOnzeGui->pitchEnvFrame->height()!=height()) {
+ resize(_deicsOnzeGui->pitchEnvFrame->width(),
+ _deicsOnzeGui->pitchEnvFrame->height());
+ //update the positions of the envelope
+ PitchEg* pe=&_deicsOnzeGui->_deicsOnze->_preset->pitchEg;
+ env2Points(pe->pl1, pe->pl2, pe->pl3, pe->pr1, pe->pr2, pe->pr3);
+ }
+ //Draw the verticale line on the release time
+ pen.setWidth(1);
+ pen.setStyle(Qt::DotLine);
+ paint.setPen(pen);
+ paint.drawLine(P2linkP3.x(), height(), P2linkP3.x(), 0);
+ //Draw the horisontal line for the center of the pitch
+ pen.setStyle(Qt::DashDotLine);
+ paint.setPen(pen);
+ paint.drawLine(0, height()/2-DOTWIDTH/2, width(), height()/2-DOTWIDTH/2);
+ //Draw the pitch envelope
+ pen.setWidth(PENWIDTH);
+ pen.setStyle(Qt::SolidLine);
+ paint.setPen(pen);
+ paint.drawRect(startlinkP1.x()-DOTWIDTH/2, startlinkP1.y()-DOTWIDTH/2,
+ DOTWIDTH, DOTWIDTH);
+ paint.drawRect(P1linkP2.x()-DOTWIDTH/2, P1linkP2.y()-DOTWIDTH/2,
+ DOTWIDTH, DOTWIDTH);
+ paint.drawRect(P2linkP3.x()-DOTWIDTH/2, P2linkP3.y()-DOTWIDTH/2,
+ DOTWIDTH, DOTWIDTH);
+ paint.drawRect(P3linkEnd.x()-DOTWIDTH/2, P3linkEnd.y()-DOTWIDTH/2,
+ DOTWIDTH, DOTWIDTH);
+ paint.drawLine(startlinkP1,P1linkP2);
+ paint.drawLine(P1linkP2, P2linkP3);
+ paint.drawLine(P2linkP3, P3linkEnd);
+}
+void QFramePitchEnvelope::mousePressEvent(QMouseEvent * e) {
+ //startlinkP1
+ if(e->x()<startlinkP1.x()+DRAGWIDTH && e->x()>startlinkP1.x()-DRAGWIDTH
+ && e->y()<startlinkP1.y()+DRAGWIDTH && e->y()>startlinkP1.y()-DRAGWIDTH)
+ isStartlinkP1Edit=true;
+ //P1linkP2
+ if(e->x()<P1linkP2.x()+DRAGWIDTH && e->x()>P1linkP2.x()-DRAGWIDTH
+ && e->y()<P1linkP2.y()+DRAGWIDTH && e->y()>P1linkP2.y()-DRAGWIDTH)
+ isP1linkP2Edit=true;
+ //P2linkP3
+ if(e->x()<P2linkP3.x()+DRAGWIDTH && e->x()>P2linkP3.x()-DRAGWIDTH
+ && e->y()<P2linkP3.y()+DRAGWIDTH && e->y()>P2linkP3.y()-DRAGWIDTH)
+ isP2linkP3Edit=true;
+ //P3linkEnd
+ if(e->x()<P3linkEnd.x()+DRAGWIDTH && e->x()>P3linkEnd.x()-DRAGWIDTH
+ && e->y()<P3linkEnd.y()+DRAGWIDTH && e->y()>P3linkEnd.y()-DRAGWIDTH)
+ isP3linkEndEdit=true;
+}
+void QFramePitchEnvelope::mouseReleaseEvent(QMouseEvent* /*e*/) {
+ isStartlinkP1Edit=false;
+ isP1linkP2Edit=false;
+ isP2linkP3Edit=false;
+ isP3linkEndEdit=false;
+}
+void QFramePitchEnvelope::mouseMoveEvent(QMouseEvent* e) {
+ if(isStartlinkP1Edit) {
+ if(e->y()>startlinkP1.y()) _deicsOnzeGui->PL1SpinBox->stepDown();
+ if(e->y()<startlinkP1.y()) _deicsOnzeGui->PL1SpinBox->stepUp();
+ }
+ if(isP1linkP2Edit) {
+ if(e->x()>P1linkP2.x()) _deicsOnzeGui->PR1SpinBox->stepDown();
+ if(e->x()<P1linkP2.x()) _deicsOnzeGui->PR1SpinBox->stepUp();
+ if(e->y()>P1linkP2.y()) _deicsOnzeGui->PL2SpinBox->stepDown();
+ if(e->y()<P1linkP2.y()) _deicsOnzeGui->PL2SpinBox->stepUp();
+ }
+ if(isP2linkP3Edit) {
+ if(e->x()>P2linkP3.x()) _deicsOnzeGui->PR2SpinBox->stepDown();
+ if(e->x()<P2linkP3.x()) _deicsOnzeGui->PR2SpinBox->stepUp();
+ if(e->y()>P2linkP3.y()) _deicsOnzeGui->PL3SpinBox->stepDown();
+ if(e->y()<P2linkP3.y()) _deicsOnzeGui->PL3SpinBox->stepUp();
+ }
+ if(isP3linkEndEdit) {
+ if(e->x()>P3linkEnd.x()) _deicsOnzeGui->PR3SpinBox->stepDown();
+ if(e->x()<P3linkEnd.x()) _deicsOnzeGui->PR3SpinBox->stepUp();
+ if(e->y()>P3linkEnd.y()) _deicsOnzeGui->PL1SpinBox->stepDown();
+ if(e->y()<P3linkEnd.y()) _deicsOnzeGui->PL1SpinBox->stepUp();
+ }
+}
+//-----------------------------------------------------------
+// env2Points
+// assigns the right coordinates to the points
+// to draw the pitch envelope
+//-----------------------------------------------------------
+void QFramePitchEnvelope::env2Points(int pl1, int pl2, int pl3,
+ int pr1, int pr2, int pr3) {
+ startlinkP1.setY(YOFFSET+MAXPHEIGHT
+ -PENWIDTH-((PL1HEIGHT-PENWIDTH)*pl1)/MAXPL);
+ startlinkP1.setX(XOFFSET);
+ P1linkP2.setY(YOFFSET+MAXPHEIGHT-PENWIDTH-((PL2HEIGHT-PENWIDTH)*pl2)/MAXPL);
+ P1linkP2.setX(XOFFSET+WALLWIDTH+PR1WIDTH-(PR1WIDTH*pr1)/MAXPR);
+ P2linkP3.setY(YOFFSET+MAXPHEIGHT-PENWIDTH-((PL3HEIGHT-PENWIDTH)*pl3)/MAXPL);
+ P2linkP3.setX(P1linkP2.x()+WALLWIDTH+PR2WIDTH-(PR2WIDTH*pr2)/MAXPR);
+ P3linkEnd.setY(YOFFSET+MAXPHEIGHT-PENWIDTH-((PL1HEIGHT-PENWIDTH)*pl1)/MAXPL);
+ P3linkEnd.setX(P2linkP3.x()+WALLWIDTH+PR3WIDTH-(PR3WIDTH*pr3)/MAXPR);
+}
+//-----------------------------------------------------------
+// QFrameEnvelope
+//-----------------------------------------------------------
+void QFrameEnvelope::paintEvent(QPaintEvent* /*e*/) {
+ QPainter paint(this);
+ QPen pen;
+ pen.setColor(*(_deicsOnzeGui->etColor));
+ //if the size of pitchEnvFrame is different than QFramePitchEnvelope resize
+ //and update the envelope
+ int op = _deicsOnzeGui->deicsOnzeTabWidget->currentIndex()-2;
+ //-2 because of the presetsTab and globalTab
+ Eg* eg=&(_deicsOnzeGui->_deicsOnze->_preset->eg[op]);
+ switch(op) {
+ case 0 :
+ if(_deicsOnzeGui->envelope1Frame->width()!=width() ||
+ _deicsOnzeGui->envelope1Frame->height()!=height()) {
+ resize(_deicsOnzeGui->envelope1Frame->width(),
+ _deicsOnzeGui->envelope1Frame->height());
+ //update the positions of the envelope
+ env2Points(eg->ar, eg->d1r, eg->d1l, eg->d2r, eg->rr);
+ }
+ break;
+ case 1 :
+ if(_deicsOnzeGui->envelope2Frame->width()!=width() ||
+ _deicsOnzeGui->envelope2Frame->height()!=height()) {
+ resize(_deicsOnzeGui->envelope2Frame->width(),
+ _deicsOnzeGui->envelope2Frame->height());
+ //update the positions of the envelope
+ env2Points(eg->ar, eg->d1r, eg->d1l, eg->d2r, eg->rr);
+ }
+ break;
+ case 2 :
+ if(_deicsOnzeGui->envelope3Frame->width()!=width() ||
+ _deicsOnzeGui->envelope3Frame->height()!=height()) {
+ resize(_deicsOnzeGui->envelope3Frame->width(),
+ _deicsOnzeGui->envelope3Frame->height());
+ //update the positions of the envelope
+ env2Points(eg->ar, eg->d1r, eg->d1l, eg->d2r, eg->rr);
+ }
+ break;
+ case 3 :
+ if(_deicsOnzeGui->envelope4Frame->width()!=width() ||
+ _deicsOnzeGui->envelope4Frame->height()!=height()) {
+ resize(_deicsOnzeGui->envelope4Frame->width(),
+ _deicsOnzeGui->envelope4Frame->height());
+ //update the positions of the envelope
+ env2Points(eg->ar, eg->d1r, eg->d1l, eg->d2r, eg->rr);
+ }
+ break;
+ default :
+ printf("QFrameEnvelope::paintEvent switch case error\n");
+ break;
+ }
+ //Draw the vertical line of the release note
+ pen.setWidth(1);
+ pen.setStyle(Qt::DotLine);
+ paint.setPen(pen);
+ paint.drawLine(D2linkRR.x(), MAXHEIGHT, D2linkRR.x(), YOFFSET);
+ //Draw the volume envelope
+ pen.setWidth(PENWIDTH);
+ pen.setStyle(Qt::SolidLine);
+ paint.setPen(pen);
+ paint.drawRect(startlinkAR.x()-DOTWIDTH/2, startlinkAR.y()-DOTWIDTH/2,
+ DOTWIDTH, DOTWIDTH);
+ paint.drawRect(ARlinkD1.x()-DOTWIDTH/2, ARlinkD1.y()-DOTWIDTH/2,
+ DOTWIDTH, DOTWIDTH);
+ paint.drawRect(D1linkD2.x()-DOTWIDTH/2, D1linkD2.y()-DOTWIDTH/2,
+ DOTWIDTH, DOTWIDTH);
+ paint.drawRect(D2linkRR.x()-DOTWIDTH/2, D2linkRR.y()-DOTWIDTH/2,
+ DOTWIDTH, DOTWIDTH);
+ paint.drawRect(RRlinkEnd.x()-DOTWIDTH/2, RRlinkEnd.y()-DOTWIDTH/2,
+ DOTWIDTH, DOTWIDTH);
+ paint.drawLine(startlinkAR,ARlinkD1);
+ paint.drawLine(ARlinkD1, D1linkD2);
+ paint.drawLine(D1linkD2, D2linkRR);
+ paint.drawLine(D2linkRR, RRlinkEnd);
+}
+void QFrameEnvelope::mousePressEvent(QMouseEvent * e) {
+ //ARlinkD1
+ if(e->x()<ARlinkD1.x()+DRAGWIDTH && e->x()>ARlinkD1.x()-DRAGWIDTH
+ && e->y()<ARlinkD1.y()+DRAGWIDTH && e->y()>ARlinkD1.y()-DRAGWIDTH)
+ isARlinkD1Edit=true;
+ //D1linkD2
+ if(e->x()<D1linkD2.x()+DRAGWIDTH && e->x()>D1linkD2.x()-DRAGWIDTH
+ && e->y()<D1linkD2.y()+DRAGWIDTH && e->y()>D1linkD2.y()-DRAGWIDTH)
+ isD1linkD2Edit=true;
+ //D2linkRR
+ if(e->x()<D2linkRR.x()+DRAGWIDTH && e->x()>D2linkRR.x()-DRAGWIDTH
+ && e->y()<D2linkRR.y()+DRAGWIDTH && e->y()>D2linkRR.y()-DRAGWIDTH)
+ isD2linkRREdit=true;
+ //RRlinkEnd
+ if(e->x()<RRlinkEnd.x()+DRAGWIDTH && e->x()>RRlinkEnd.x()-DRAGWIDTH
+ && e->y()<RRlinkEnd.y()+DRAGWIDTH && e->y()>RRlinkEnd.y()-DRAGWIDTH)
+ isRRlinkEndEdit=true;
+}
+void QFrameEnvelope::mouseReleaseEvent(QMouseEvent* /*e*/) {
+ isARlinkD1Edit=false;
+ isD1linkD2Edit=false;
+ isD2linkRREdit=false;
+ isRRlinkEndEdit=false;
+}
+void QFrameEnvelope::mouseMoveEvent(QMouseEvent* e) {
+ if(isARlinkD1Edit)
+ {
+ switch(op) {
+ case 0 :
+ if(e->x()>ARlinkD1.x()) _deicsOnzeGui->AR1SpinBox->stepDown();
+ if(e->x()<ARlinkD1.x()) _deicsOnzeGui->AR1SpinBox->stepUp();
+ break;
+ case 1 :
+ if(e->x()>ARlinkD1.x()) _deicsOnzeGui->AR2SpinBox->stepDown();
+ if(e->x()<ARlinkD1.x()) _deicsOnzeGui->AR2SpinBox->stepUp();
+ break;
+ case 2 :
+ if(e->x()>ARlinkD1.x()) _deicsOnzeGui->AR3SpinBox->stepDown();
+ if(e->x()<ARlinkD1.x()) _deicsOnzeGui->AR3SpinBox->stepUp();
+ break;
+ case 3 :
+ if(e->x()>ARlinkD1.x()) _deicsOnzeGui->AR4SpinBox->stepDown();
+ if(e->x()<ARlinkD1.x()) _deicsOnzeGui->AR4SpinBox->stepUp();
+ break;
+ default :
+ break;
+ }
+ }
+ if(isD1linkD2Edit)
+ {
+ switch(op) {
+ case 0 :
+ if(e->x()>D1linkD2.x()) _deicsOnzeGui->D1R1SpinBox->stepDown();
+ if(e->x()<D1linkD2.x()) _deicsOnzeGui->D1R1SpinBox->stepUp();
+ if(e->y()>D1linkD2.y()) _deicsOnzeGui->D1L1SpinBox->stepDown();
+ if(e->y()<D1linkD2.y()) _deicsOnzeGui->D1L1SpinBox->stepUp();
+ break;
+ case 1 :
+ if(e->x()>D1linkD2.x()) _deicsOnzeGui->D1R2SpinBox->stepDown();
+ if(e->x()<D1linkD2.x()) _deicsOnzeGui->D1R2SpinBox->stepUp();
+ if(e->y()>D1linkD2.y()) _deicsOnzeGui->D1L2SpinBox->stepDown();
+ if(e->y()<D1linkD2.y()) _deicsOnzeGui->D1L2SpinBox->stepUp();
+ break;
+ case 2 :
+ if(e->x()>D1linkD2.x()) _deicsOnzeGui->D1R3SpinBox->stepDown();
+ if(e->x()<D1linkD2.x()) _deicsOnzeGui->D1R3SpinBox->stepUp();
+ if(e->y()>D1linkD2.y()) _deicsOnzeGui->D1L3SpinBox->stepDown();
+ if(e->y()<D1linkD2.y()) _deicsOnzeGui->D1L3SpinBox->stepUp();
+ break;
+ case 3 :
+ if(e->x()>D1linkD2.x()) _deicsOnzeGui->D1R4SpinBox->stepDown();
+ if(e->x()<D1linkD2.x()) _deicsOnzeGui->D1R4SpinBox->stepUp();
+ if(e->y()>D1linkD2.y()) _deicsOnzeGui->D1L4SpinBox->stepDown();
+ if(e->y()<D1linkD2.y()) _deicsOnzeGui->D1L4SpinBox->stepUp();
+ break;
+ default :
+ break;
+ }
+ }
+ if(isD2linkRREdit)
+ {
+ switch(op) {
+ case 0 :
+ if(e->x()>D2linkRR.x() /*&& e->y()<D2linkRR.y()*/)
+ _deicsOnzeGui->D2R1SpinBox->stepDown();
+ if(e->x()<D2linkRR.x() /*&& e->y()>D2linkRR.y()*/)
+ _deicsOnzeGui->D2R1SpinBox->stepUp();
+ break;
+ case 1 :
+ if(e->x()>D2linkRR.x() /*&& e->y()<D2linkRR.y()*/)
+ _deicsOnzeGui->D2R2SpinBox->stepDown();
+ if(e->x()<D2linkRR.x() /*&& e->y()>D2linkRR.y()*/)
+ _deicsOnzeGui->D2R2SpinBox->stepUp();
+ break;
+ case 2 :
+ if(e->x()>D2linkRR.x() /*&& e->y()<D2linkRR.y()*/)
+ _deicsOnzeGui->D2R3SpinBox->stepDown();
+ if(e->x()<D2linkRR.x() /*&& e->y()>D2linkRR.y()*/)
+ _deicsOnzeGui->D2R3SpinBox->stepUp();
+ break;
+ case 3 :
+ if(e->x()>D2linkRR.x() /*&& e->y()<D2linkRR.y()*/)
+ _deicsOnzeGui->D2R4SpinBox->stepDown();
+ if(e->x()<D2linkRR.x() /*&& e->y()>D2linkRR.y()*/)
+ _deicsOnzeGui->D2R4SpinBox->stepUp();
+ break;
+ default :
+ break;
+ }
+ }
+ if(isRRlinkEndEdit)
+ {
+ switch(op) {
+ case 0 :
+ if(e->x()>RRlinkEnd.x()) _deicsOnzeGui->RR1SpinBox->stepDown();
+ if(e->x()<RRlinkEnd.x()) _deicsOnzeGui->RR1SpinBox->stepUp();
+ break;
+ case 1 :
+ if(e->x()>RRlinkEnd.x()) _deicsOnzeGui->RR2SpinBox->stepDown();
+ if(e->x()<RRlinkEnd.x()) _deicsOnzeGui->RR2SpinBox->stepUp();
+ break;
+ case 2 :
+ if(e->x()>RRlinkEnd.x()) _deicsOnzeGui->RR3SpinBox->stepDown();
+ if(e->x()<RRlinkEnd.x()) _deicsOnzeGui->RR3SpinBox->stepUp();
+ break;
+ case 3 :
+ if(e->x()>RRlinkEnd.x()) _deicsOnzeGui->RR4SpinBox->stepDown();
+ if(e->x()<RRlinkEnd.x()) _deicsOnzeGui->RR4SpinBox->stepUp();
+ break;
+ default :
+ break;
+ }
+ }
+}
+//-----------------------------------------------------------
+// env2Points
+// assigns the right coordinates to the points
+// to draw the envelope
+//-----------------------------------------------------------
+void QFrameEnvelope::env2Points(int ar, int d1r, int d1l, int d2r, int rr) {
+ startlinkAR.setY(MAXHEIGHT-PENWIDTH);
+ startlinkAR.setX(PENWIDTH);
+ ARlinkD1.setY(PENWIDTH);
+ ARlinkD1.setX(PENWIDTH+ARWIDTH-(ARWIDTH*ar)/MAXAR);
+ D1linkD2.setY(PENWIDTH+
+ (D1LHEIGHT-2*PENWIDTH-((D1LHEIGHT-2*PENWIDTH)*d1l)/MAXD1L));
+ D1linkD2.setX(ARlinkD1.x()+D1RWIDTH-(D1RWIDTH*d1r)/MAXD1R);
+ D2linkRR.setY(D1linkD2.y()
+ +((D1LHEIGHT-2*PENWIDTH-D1linkD2.y())*d2r)/MAXD2R);
+ D2linkRR.setX(D1linkD2.x()+D2RWIDTH-(D2RWIDTH*d2r)/MAXD2R);
+ RRlinkEnd.setY(MAXHEIGHT-PENWIDTH);
+ RRlinkEnd.setX(D2linkRR.x()
+ +(RRWIDTH-PENWIDTH-((RRWIDTH-PENWIDTH)*rr)/MAXRR));
+}
+
+//-----------------------------------------------------------
+// processEvent(const MidiEvent&);
+//-----------------------------------------------------------
+void DeicsOnzeGui::processEvent(const MidiEvent& ev) {
+ //Controler
+ if (ev.type() == ME_CONTROLLER) {
+ //printf("ME_CONTROLLER\n");
+ int id=ev.dataA();
+ int val=ev.dataB();
+ switch(id) {
+ case CTRL_AR: updateAR(0, val); break;
+ case CTRL_D1R: updateD1R(0, val); break;
+ case CTRL_D2R: updateD2R(0, val); break;
+ case CTRL_RR: updateRR(0, val); break;
+ case CTRL_D1L: updateD1L(0, val); break;
+ case CTRL_LS: updateLS(0, val); break;
+ case CTRL_RS: updateRS(0, val); break;
+ case CTRL_EBS: updateEBS(0, val); break;
+ case CTRL_AME: updateAME(0, val==1); break;
+ case CTRL_KVS: updateKVS(0, val); break;
+ case CTRL_OUT: updateOUT(0, val); break;
+ case CTRL_RATIO: updateRATIO(0, val); break;
+ case CTRL_DET: updateDET(0, val); break;
+ case CTRL_AR+DECAPAR1: updateAR(1, val); break;
+ case CTRL_D1R+DECAPAR1: updateD1R(1, val); break;
+ case CTRL_D2R+DECAPAR1: updateD2R(1, val); break;
+ case CTRL_RR+DECAPAR1: updateRR(1, val); break;
+ case CTRL_D1L+DECAPAR1: updateD1L(1, val); break;
+ case CTRL_LS+DECAPAR1: updateLS(1, val); break;
+ case CTRL_RS+DECAPAR1: updateRS(1, val); break;
+ case CTRL_EBS+DECAPAR1: updateEBS(1, val); break;
+ case CTRL_AME+DECAPAR1: updateAME(1, val==1); break;
+ case CTRL_KVS+DECAPAR1: updateKVS(1, val); break;
+ case CTRL_OUT+DECAPAR1: updateOUT(1, val); break;
+ case CTRL_RATIO+DECAPAR1: updateRATIO(1, val); break;
+ case CTRL_DET+DECAPAR1: updateDET(1, val); break;
+ case CTRL_AR+2*DECAPAR1: updateAR(2, val); break;
+ case CTRL_D1R+2*DECAPAR1: updateD1R(2, val); break;
+ case CTRL_D2R+2*DECAPAR1: updateD2R(2, val); break;
+ case CTRL_RR+2*DECAPAR1: updateRR(2, val); break;
+ case CTRL_D1L+2*DECAPAR1: updateD1L(2, val); break;
+ case CTRL_LS+2*DECAPAR1: updateLS(2, val); break;
+ case CTRL_RS+2*DECAPAR1: updateRS(2, val); break;
+ case CTRL_EBS+2*DECAPAR1: updateEBS(2, val); break;
+ case CTRL_AME+2*DECAPAR1: updateAME(2, val==1); break;
+ case CTRL_KVS+2*DECAPAR1: updateKVS(2, val); break;
+ case CTRL_OUT+2*DECAPAR1: updateOUT(2, val); break;
+ case CTRL_RATIO+2*DECAPAR1: updateRATIO(2, val); break;
+ case CTRL_DET+2*DECAPAR1: updateDET(2, val); break;
+ case CTRL_AR+3*DECAPAR1: updateAR(3, val); break;
+ case CTRL_D1R+3*DECAPAR1: updateD1R(3, val); break;
+ case CTRL_D2R+3*DECAPAR1: updateD2R(3, val); break;
+ case CTRL_RR+3*DECAPAR1: updateRR(3, val); break;
+ case CTRL_D1L+3*DECAPAR1: updateD1L(3, val); break;
+ case CTRL_LS+3*DECAPAR1: updateLS(3, val); break;
+ case CTRL_RS+3*DECAPAR1: updateRS(3, val); break;
+ case CTRL_EBS+3*DECAPAR1: updateEBS(3, val); break;
+ case CTRL_AME+3*DECAPAR1: updateAME(3, val==1); break;
+ case CTRL_KVS+3*DECAPAR1: updateKVS(3, val); break;
+ case CTRL_OUT+3*DECAPAR1: updateOUT(3, val); break;
+ case CTRL_RATIO+3*DECAPAR1: updateRATIO(3, val); break;
+ case CTRL_DET+3*DECAPAR1: updateDET(3, val); break;
+ case CTRL_ALG: updateALG(val); break;
+ case CTRL_FEEDBACK: updateFEEDBACK(val); break;
+ case CTRL_SPEED: updateSPEED(val); break;
+ case CTRL_DELAY: updateDELAY(val); break;
+ case CTRL_PMODDEPTH: updatePMODDEPTH(val); break;
+ case CTRL_AMODDEPTH: updateAMODDEPTH(val); break;
+ case CTRL_SYNC: updateSYNC(val==1); break;
+ case CTRL_WAVE: updateWAVE(val); break;
+ case CTRL_PMODSENS: updatePMODSENS(val); break;
+ case CTRL_AMS: updateAMS(val); break;
+ case CTRL_TRANSPOSE: updateTRANSPOSE(val); break;
+ case CTRL_POLYMODE: updatePOLYMODE(val); break;
+ case CTRL_PBENDRANGE: updatePBENDRANGE(val); break;
+ case CTRL_PORTAMODE: updatePORTAMODE(val); break;
+ case CTRL_PORTATIME: updatePORTATIME(val); break;
+ case CTRL_FCVOLUME: updateFcVolume(val); break;
+ case CTRL_FSW:
+ break;
+ case CTRL_MWPITCH: updateMwPitch(val); break;
+ case CTRL_MWAMPLITUDE: updateMwAmplitude(val); break;
+ case CTRL_BCPITCH: updateBcPitch(val); break;
+ case CTRL_BCAMPLITUDE: updateBcAmplitude(val); break;
+ case CTRL_BCPITCHBIAS: updateBcPitchBias(val); break;
+ case CTRL_BCEGBIAS: updateBcEgBias(val); break;
+ case CTRL_PR1: updatePR1(val); break;
+ case CTRL_PR2: updatePR2(val); break;
+ case CTRL_PR3: updatePR3(val); break;
+ case CTRL_PL1: updatePL1(val); break;
+ case CTRL_PL2: updatePL2(val); break;
+ case CTRL_PL3: updatePL3(val); break;
+ case CTRL_FIX: updateFIX(0, val==1); break;
+ case CTRL_FIXRANGE: updateFIXRANGE(0, val); break;
+ case CTRL_OSW: updateOSW(0, val); break;
+ case CTRL_SHFT: updateSHFT(0, val); break;
+ case CTRL_FIX+DECAPAR2: updateFIX(1, val==1); break;
+ case CTRL_FIXRANGE+DECAPAR2: updateFIXRANGE(1, val); break;
+ case CTRL_OSW+DECAPAR2: updateOSW(1, val); break;
+ case CTRL_SHFT+DECAPAR2: updateSHFT(1, val); break;
+ case CTRL_FIX+2*DECAPAR2: updateFIX(2, val==1); break;
+ case CTRL_FIXRANGE+2*DECAPAR2: updateFIXRANGE(2, val); break;
+ case CTRL_OSW+2*DECAPAR2: updateOSW(2, val); break;
+ case CTRL_SHFT+2*DECAPAR2: updateSHFT(2, val); break;
+ case CTRL_FIX+3*DECAPAR2: updateFIX(3, val==1); break;
+ case CTRL_FIXRANGE+3*DECAPAR2: updateFIXRANGE(3, val); break;
+ case CTRL_OSW+3*DECAPAR2: updateOSW(3, val); break;
+ case CTRL_SHFT+3*DECAPAR2: updateSHFT(3, val); break;
+ case CTRL_REVERBRATE: updateReverbRate(val); break;
+ case CTRL_FCPITCH: updateFcPitch(val); break;
+ case CTRL_FCAMPLITUDE: updateFcAmplitude(val); break;
+ case CTRL_GLOBALDETUNE: updateGLOBALDETUNE(val); break;
+ case CTRL_MASTERVOLUME: updateMASTERVOLUME(val); break;
+ case CTRL_NBRVOICES: updateNbrVoices(val); break;
+ case CTRL_FINEBRIGHTNESS: updateBrightness(val); break;
+ case CTRL_ATTACK_TIME: updateAttack(val); break;
+ case CTRL_RELEASE_TIME: updateRelease(val); break;
+ case CTRL_PROGRAM :
+ int hbank = (val & 0xff0000) >> 16;
+ int lbank = (val & 0xff00) >> 8;
+ if (hbank > 127) // map "dont care" to 0
+ hbank = 0;
+ if (lbank > 127)
+ lbank = 0;
+ int prog = val & 0x7f;
+ //change the _deicsonze preset
+ _deicsOnze->programSelect(hbank, lbank, prog);
+ //only display _deicsonze preset
+ setPreset(hbank, lbank, prog);
+ updatePreset();
+ break;
+ }
+ }
+ // Sysexes
+ else if (ev.type() == ME_SYSEX) {
+ //printf("ME_SYSEX\n");
+ unsigned char* data = ev.data();
+ int cmd = *data;
+ switch (cmd) {
+ case SYSEX_QUALITY :
+ updateQuality((int)data[1]);
+ break;
+ case SYSEX_CHANNELNUM :
+ updateMidiInCh((int)(((char)data[1])+1));
+ break;
+ case SYSEX_SAVECONFIG :
+ updateSaveConfig((bool)data[1]);
+ break;
+ case SYSEX_SAVEONLYUSED :
+ updateSaveOnlyUsed((bool)data[1]);
+ break;
+ case SYSEX_COLORGUI :
+ tColor->setRgb(data[1], data[2], data[3]);
+ bColor->setRgb(data[4], data[5], data[6]);
+ etColor->setRgb(data[7], data[8], data[9]);
+ ebColor->setRgb(data[10], data[11], data[12]);
+ setTextColor(reinterpret_cast<const QColor &>(*tColor));
+ setBackgroundColor(reinterpret_cast<const QColor &>(*bColor));
+ setEditTextColor(reinterpret_cast<const QColor &>(*etColor));
+ setEditBackgroundColor(reinterpret_cast<const QColor &>(*ebColor));
+ setRGBSliders(colorListBox->currentItem());
+ break;
+ case SYSEX_ISINITSET :
+ updateInitSetCheckBox((bool)data[1]);
+ break;
+ case SYSEX_INITSETPATH :
+ updateInitSetPath(QString((char*)&data[1]));
+ break;
+ case SYSEX_UPDATESETGUI :
+ setSet();
+ subcategoryListView->clear();
+ presetListView->clear();
+ updateCategoryName("NONE", false);
+ hbankSpinBox->setEnabled(false);
+ updatePreset();
+ updateSubcategoryName("NONE", false);
+ progSpinBox->setEnabled(false);
+ updatePresetName("INITVOICE", false);
+ break;
+ case SYSEX_LOADSET :
+ //printf("LoadSet\n");
+ // read the XML file and create DOM tree
+ /*QString filename = (const char*) (data+2);
+ QFile deicsonzeFile(filename);
+ deicsonzeFile.open(IO_ReadOnly);
+ QDomDocument domTree;
+ domTree.setContent(&deicsonzeFile);
+ deicsonzeFile.close();
+ QDomNode node = domTree.documentElement();
+
+ printf("After XML\n");
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "deicsOnzeSet") {
+ QString version = e.attribute(QString("version"));
+ if (version == "1.0") {
+ _deicsOnze->_preset=_deicsOnze->_initialPreset;*/
+ //read the set
+ if((bool)data[1]) {
+ //printf("Mini\n");
+ updateSaveOnlyUsed(true);
+ }
+ else {
+ //printf("Huge\n");
+ //while(!_deicsOnze->_set->_categoryVector.empty())
+ // delete(*_deicsOnze->_set->_categoryVector.begin());
+ updateSaveOnlyUsed(false);
+ }
+ //_deicsOnze->_set->readSet(node.firstChild());
+ //display load preset
+ setSet();
+ /*}
+ else printf("Wrong set version : %s\n",
+ version.toLatin1().data());
+ }
+ node = node.nextSibling();
+ }
+ break;
+ // delete the temporary file created
+ QString rmfile;
+ rmfile="rm ";
+ rmfile+=filename;
+ system(rmfile);
+ printf("Finit\n");*/
+ }
+ }
+}
+
+/*!
+ \fn SimpleSynthGui::readMessage(int)
+ */
+void DeicsOnzeGui::readMessage(int)
+{
+ MessGui::readMessage();
+}
+
+//-----------------------------------------------------------
+// num3Digits(int n)
+//-----------------------------------------------------------
+QString DeicsOnzeGui::num3Digits(int n) {
+ QString sn=QString::number(n);
+ return(sn.length()==1?"00"+sn:(sn.length()==2?"0"+sn:sn));
+}
+
+//-----------------------------------------------------------
+// deleteSet
+//-----------------------------------------------------------
+void DeicsOnzeGui::deleteSetDialog() {
+ _deicsOnze->_preset=_deicsOnze->_initialPreset;
+ while(!_deicsOnze->_set->_categoryVector.empty())
+ delete(*_deicsOnze->_set->_categoryVector.begin());
+ setSet();
+ //_currentQLVCategory = NULL;
+ presetListView->clear();
+ subcategoryListView->clear();
+ updateCategoryName("NONE", false);
+ hbankSpinBox->setEnabled(false);
+ updateSubcategoryName("NONE", false);
+ lbankSpinBox->setEnabled(false);
+ updatePresetName("INITVOICE", false);
+ progSpinBox->setEnabled(false);
+ updatePreset();
+}
+//-----------------------------------------------------------
+// loadSetDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::loadSetDialog() {
+ QString fileName =
+ QFileDialog::getOpenFileName(
+ this,
+ tr("Load set dialog"),
+ lastDir,
+ QString("*.dei")
+ );
+
+ // read the XML file and create DOM tree
+ if(!fileName.isEmpty()) {
+ QFileInfo fi(fileName);
+ lastDir = fi.path();
+ QFile deicsonzeFile(fileName);
+ if(!deicsonzeFile.open(QIODevice::ReadOnly)) {
+ QMessageBox::critical(0,
+ tr("Critical Error"),
+ tr("Cannot open file %1").arg(fileName));
+ return;
+ }
+ QDomDocument domTree;
+ if (!domTree.setContent(&deicsonzeFile )) {
+ QMessageBox::critical
+ (0, tr("Critical Error"),
+ tr("Parsing error for file %1").arg(fileName));
+ deicsonzeFile.close();
+ return;
+ }
+ deicsonzeFile.close();
+
+ QDomNode node = domTree.documentElement();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "deicsOnzeSet") {
+ QString version = e.attribute(QString("version"));
+ if (version == "1.0") {
+ _deicsOnze->_preset=_deicsOnze->_initialPreset;
+ while(!_deicsOnze->_set->_categoryVector.empty())
+ delete(*_deicsOnze->_set->_categoryVector.begin());
+ _deicsOnze->_set->readSet(node.firstChild());
+ //display load preset
+ setSet();
+ subcategoryListView->clear();
+ presetListView->clear();
+ updateCategoryName("NONE", false);
+ hbankSpinBox->setEnabled(false);
+ updatePreset();
+ updateSubcategoryName("NONE", false);
+ progSpinBox->setEnabled(false);
+ updatePresetName("INITVOICE", false);
+ }
+ else printf("unsupported *.dei file version %s\n",
+ version.toLatin1().data());
+ }
+ else printf("DeicsOnze: %s not supported\n",
+ e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+}
+
+//-----------------------------------------------------------
+// saveSetDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::saveSetDialog() {
+ QString filename =
+ QFileDialog::getSaveFileName(
+ this,
+ tr("Save set dialog"),
+ lastDir,
+ QString("*.dei"));
+ if(!filename.isEmpty()) {
+ QFileInfo fi(filename);
+ lastDir = fi.path();
+ if(!filename.endsWith(".dei")) filename+=".dei";
+ QFile f(filename);
+ f.open(QIODevice::WriteOnly);
+
+ AL::Xml* xml = new AL::Xml(&f);
+ xml->header();
+ _deicsOnze->_set->writeSet(xml, false);
+
+ f.close();
+ }
+}
+
+//-----------------------------------------------------------
+// popupMenuCategory
+//-----------------------------------------------------------
+void DeicsOnzeGui::categoryPopupMenu(const QPoint&) {
+ QTreeWidgetItem* cat = categoryListView->currentItem();
+ QMenu *categoryMenu = new QMenu;
+ categoryMenu->addAction(tr("New category"),
+ this, SLOT(newCategoryDialog()));
+ QAction* deleteItem = categoryMenu->addAction(tr("Delete category"), this,
+ SLOT(deleteCategoryDialog()));
+ categoryMenu->addAction(tr("Load category"),
+ this, SLOT(loadCategoryDialog()));
+ QAction* saveItem = categoryMenu->addAction(tr("Save category"), this,
+ SLOT(saveCategoryDialog()));
+ if(!cat || !categoryListView->isItemSelected(cat)) {
+ deleteItem->setEnabled(false);
+ saveItem->setEnabled(false);
+ }
+ categoryMenu->addSeparator();
+ categoryMenu->addAction(tr("Load set"),
+ this, SLOT(loadSetDialog()));;
+ categoryMenu->addAction(tr("Save set"),
+ this, SLOT(saveSetDialog()));;
+ categoryMenu->addAction(tr("Delete set"),
+ this, SLOT(deleteSetDialog()));;
+ categoryMenu->exec(QCursor::pos());
+}
+void DeicsOnzeGui::subcategoryPopupMenu(const QPoint&) {
+ QTreeWidgetItem* sub = subcategoryListView->currentItem();
+ QMenu *subcategoryMenu = new QMenu;
+ QAction* newItem =
+ subcategoryMenu->addAction(tr("New subcategory"), this,
+ SLOT(newSubcategoryDialog()));
+ QAction* deleteItem =
+ subcategoryMenu->addAction(tr("Delete subcategory"),
+ this, SLOT(deleteSubcategoryDialog()));
+ QAction* loadItem =
+ subcategoryMenu->addAction(tr("Load subcategory"), this,
+ SLOT(loadSubcategoryDialog()));
+ QAction* saveItem =
+ subcategoryMenu->addAction(tr("Save subcategory"), this,
+ SLOT(saveSubcategoryDialog()));
+ if(!sub || !subcategoryListView->isItemSelected(sub)) {
+ deleteItem->setEnabled(false);
+ saveItem->setEnabled(false);
+ }
+ if(!categoryListView->currentItem()
+ || !categoryListView->isItemSelected(categoryListView->currentItem())) {
+ newItem->setEnabled(false);
+ loadItem->setEnabled(false);
+ }
+ subcategoryMenu->exec(QCursor::pos());
+}
+void DeicsOnzeGui::presetPopupMenu(const QPoint&) {
+ QTreeWidgetItem* pre = presetListView->currentItem();
+ QMenu *presetMenu = new QMenu;
+ QAction* newItem = presetMenu->addAction(tr("New preset"), this,
+ SLOT(newPresetDialog()));
+ QAction* deleteItem = presetMenu->addAction(tr("Delete preset"), this,
+ SLOT(deletePresetDialog()));
+ QAction* loadItem = presetMenu->addAction(tr("Load preset"), this,
+ SLOT(loadPresetDialog()));
+ QAction* saveItem = presetMenu->addAction(tr("Save preset"), this,
+ SLOT(savePresetDialog()));
+ if(!pre || !presetListView->isItemSelected(pre)) {
+ deleteItem->setEnabled(false);
+ saveItem->setEnabled(false);
+ }
+ if(!subcategoryListView->currentItem() ||
+ !subcategoryListView->isItemSelected(subcategoryListView->currentItem())){
+ newItem->setEnabled(false);
+ loadItem->setEnabled(false);
+ }
+ presetMenu->exec(QCursor::pos());
+}
+
+//-----------------------------------------------------------
+// newCategoryDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::newCategoryDialog() {
+ int nhbank=_deicsOnze->_set->firstFreeHBank();
+ if(nhbank==-1)
+ QMessageBox::information(this,
+ tr("No more category supported"),
+ tr("You can not add more categories"),
+ QMessageBox::Ok);
+ else {
+ new Category(_deicsOnze->_set, "NEWCAT", nhbank);
+ setSet();
+ QTreeWidgetItem* ci=
+ categoryListView->findItems(num3Digits(nhbank+1), Qt::MatchExactly).at(0);
+ categoryListView->setItemSelected(ci, true);
+ setCategory(ci);
+ categoryListView->scrollToItem(ci);
+ }
+}
+
+//-----------------------------------------------------------
+// deleteCategoryDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::deleteCategoryDialog() {
+ QTreeCategory* cat = (QTreeCategory*) categoryListView->currentItem();
+ if(cat && categoryListView->isItemSelected(cat)) {
+ if(!QMessageBox::question(
+ this,
+ tr("Delete category"),
+ tr("Do you really want to delete %1 ?")
+ .arg(cat->_category->_categoryName.c_str()),
+ tr("&Yes"), tr("&No"),
+ QString::null, 0, 1 ))
+ {
+ _deicsOnze->_preset=_deicsOnze->_initialPreset;
+ delete(cat->_category);
+ delete(cat);
+ subcategoryListView->clear();
+ presetListView->clear();
+ updateCategoryName("NONE", false);
+ hbankSpinBox->setEnabled(false);
+ updatePreset();
+ updateSubcategoryName("NONE", false);
+ progSpinBox->setEnabled(false);
+ updatePresetName("INITVOICE", false);
+ }
+ }
+ else QMessageBox::warning(this, tr("No category selected"),
+ tr("You must first select a category."));
+}
+
+//-----------------------------------------------------------
+// loadCategoryDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::loadCategoryDialog() {
+ QString buffstr;
+ QString fileName =
+ QFileDialog::getOpenFileName(
+ this,
+ tr("Load category dialog"),
+ lastDir,
+ QString("*.dec"));
+
+ // read the XML file and create DOM tree
+ if(!fileName.isEmpty()) {
+ QFileInfo fi(fileName);
+ lastDir = fi.path();
+ QFile deicsonzeFile(fileName);
+ if(!deicsonzeFile.open(QIODevice::ReadOnly)) {
+ QMessageBox::critical(0,
+ tr("Critical Error"),
+ tr("Cannot open file %1").arg(fileName));
+ return;
+ }
+ QDomDocument domTree;
+ if (!domTree.setContent(&deicsonzeFile )) {
+ QMessageBox::critical
+ (0, tr("Critical Error"),
+ tr("Parsing error for file %1").arg(fileName));
+ deicsonzeFile.close();
+ return;
+ }
+ deicsonzeFile.close();
+
+ QDomNode node = domTree.documentElement();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "deicsOnzeCategory") {
+ QString version = e.attribute(QString("version"));
+ if (version == "1.0") {
+ Category* lCategory = new Category();
+ lCategory->readCategory(node.firstChild());
+ if (!_deicsOnze->_set->isFreeHBank(lCategory->_hbank)) {
+ if(!QMessageBox::question(
+ this,
+ tr("Replace or add"),
+ tr("%1 is supposed to be affected to the hbank number %2, but there is already one on this slot.\n Do you want to replace it or to add it in the next free slot ?")
+ .arg((lCategory->_categoryName).c_str())
+ .arg(buffstr.setNum(lCategory->_hbank+1)),
+ tr("&Replace"), tr("&Add"),
+ QString::null, 0, 1 )) {
+ delete(_deicsOnze->_set
+ ->findCategory(lCategory->_hbank));
+ lCategory->linkSet(_deicsOnze->_set);
+ }
+ else {
+ int ffhb=_deicsOnze->_set->firstFreeHBank();
+ if(ffhb==-1)
+ QMessageBox::warning
+ (this, tr("Download error"),
+ tr("There is no more free category slot."));
+ else lCategory->_hbank=ffhb;
+ lCategory->linkSet(_deicsOnze->_set);
+ }
+ }
+ else lCategory->linkSet(_deicsOnze->_set);
+ //display category
+ setSet();
+ }
+ else printf("unsupported *.dec file version %s\n",
+ version.toLatin1().data());
+ }
+ else printf("DeicsOnze: %s not supported\n",
+ e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+}
+
+//-----------------------------------------------------------
+// saveCategoryDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::saveCategoryDialog() {
+ QTreeCategory* cat = (QTreeCategory*) categoryListView->currentItem();
+ if(cat) {
+ QString filename =
+ QFileDialog::getSaveFileName(
+ this,
+ tr("Save category dialog"),
+ lastDir,
+ QString("*.dec"));
+
+ if(!filename.isEmpty()) {
+ QFileInfo fi(filename);
+ lastDir = fi.path();
+ if(!filename.endsWith(".dec")) filename+=".dec";
+ QFile f(filename);
+ f.open(QIODevice::WriteOnly);
+ AL::Xml* xml = new AL::Xml(&f);
+ xml->header();
+ cat->_category->writeCategory(xml, false);
+
+ f.close();
+ }
+ }
+ else QMessageBox::warning(this, tr("No category selected"),
+ tr("You must first select a category."));
+}
+
+//-----------------------------------------------------------
+// newSubcategoryDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::newSubcategoryDialog() {
+ QTreeCategory* cat = (QTreeCategory*) categoryListView->currentItem();
+ if(cat && categoryListView->isItemSelected(cat)) {
+ int nlbank=cat->_category->firstFreeLBank();
+ if(nlbank==-1)
+ QMessageBox::information(this,
+ tr("No more subcategory supported"),
+ tr("You can not add more subcategories"),
+ QMessageBox::Ok);
+ else {
+ new Subcategory(cat->_category, "NEWSUB", nlbank);
+ setCategory(cat);
+ QTreeWidgetItem* si=
+ subcategoryListView->findItems(num3Digits(nlbank+1),
+ Qt::MatchExactly).at(0);
+ subcategoryListView->setItemSelected(si, true);
+ setSubcategory(si);
+ subcategoryListView->scrollToItem(si);
+ }
+ }
+}
+
+//-----------------------------------------------------------
+// deleteSubcategoryDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::deleteSubcategoryDialog() {
+ QTreeSubcategory* sub =
+ (QTreeSubcategory*) subcategoryListView->currentItem();
+ if(sub && subcategoryListView->isItemSelected(sub)) {
+ if(!QMessageBox::question(
+ this,
+ tr("Delete subcategory"),
+ tr("Do you really want to delete %1 ?")
+ .arg(sub->_subcategory
+ ->_subcategoryName.c_str()),
+ tr("&Yes"), tr("&No"),
+ QString::null, 0, 1 )) {
+ _deicsOnze->_preset=_deicsOnze->_initialPreset;
+ delete(sub->_subcategory);
+ delete(sub);
+ presetListView->clear();
+ //subcategoryLineEdit->setEnabled(false);
+ updateSubcategoryName("NONE", false);
+ lbankSpinBox->setEnabled(false);
+ updatePreset();
+ }
+ }
+ else QMessageBox::warning(this, tr("No subcategory selected"),
+ tr("You must first select a subcategory."));
+}
+
+//-----------------------------------------------------------
+// loadSubcategoryDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::loadSubcategoryDialog() {
+ QTreeCategory* cat = (QTreeCategory*) categoryListView->currentItem();
+ QString buffstr;
+ QString fileName =
+ QFileDialog::getOpenFileName(
+ this,
+ tr("Load subcategory dialog"),
+ lastDir,
+ QString("*.des"));
+
+ // read the XML file and create DOM tree
+ if(!fileName.isEmpty()) {
+ QFileInfo fi(fileName);
+ lastDir = fi.path();
+ QFile deicsonzeFile(fileName);
+ if(!deicsonzeFile.open(QIODevice::ReadOnly)) {
+ QMessageBox::critical(0,
+ tr("Critical Error"),
+ tr("Cannot open file %1").arg(fileName));
+ return;
+ }
+ QDomDocument domTree;
+ if (!domTree.setContent(&deicsonzeFile )) {
+ QMessageBox::critical
+ (0, tr("Critical Error"),
+ tr("Parsing error for file %1").arg(fileName));
+ deicsonzeFile.close();
+ return;
+ }
+ deicsonzeFile.close();
+
+ QDomNode node = domTree.documentElement();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if (e.isNull())
+ continue;
+ if (e.tagName() == "deicsOnzeSubcategory") {
+ QString version = e.attribute(QString("version"));
+ if (version == "1.0") {
+ Subcategory* lSubcategory = new Subcategory();
+ lSubcategory->readSubcategory(node.firstChild());
+ if (!cat->_category->isFreeLBank(lSubcategory->_lbank)) {
+ if(!QMessageBox::question(
+ this,
+ tr("Replace or add"),
+ tr("%1 is supposed to be affected to the lbank number %2, but there is already one on this slot.\n Do you want to replace it or to add it in the next free slot ?")
+ .arg((lSubcategory->_subcategoryName)
+ .c_str())
+ .arg(buffstr.setNum(lSubcategory->_lbank+1)),
+ tr("&Replace"), tr("&Add"),
+ QString::null, 0, 1 )) {
+ delete(cat->_category->findSubcategory(lSubcategory->_lbank));
+ lSubcategory->linkCategory(cat->_category);
+ }
+ else {
+ int fflb=cat->_category->firstFreeLBank();
+ if(fflb==-1)
+ QMessageBox::warning
+ (this, tr("Download error"),
+ tr("There is no more free subcategory slot."));
+ else lSubcategory->_lbank=fflb;
+ lSubcategory->linkCategory(cat->_category);
+ }
+ }
+ else lSubcategory->linkCategory(cat->_category);
+ //display subcategory
+ setCategory(cat);
+ }
+ else printf("unsupported *.des file version %s\n",
+ version.toLatin1().data());
+ }
+ else printf("DeicsOnze: %s not supported\n",
+ e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+}
+
+//-----------------------------------------------------------
+// saveSubcategoryDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::saveSubcategoryDialog() {
+ QTreeSubcategory* sub =
+ (QTreeSubcategory*) subcategoryListView->currentItem();
+ if(sub) {
+ QString filename =
+ QFileDialog::getSaveFileName(
+ this,
+ tr("Save subcategory dialog"),
+ lastDir,
+ QString("*.des"));
+
+ if(!filename.isEmpty()) {
+ QFileInfo fi(filename);
+ lastDir = fi.path();
+ if(!filename.endsWith(".des")) filename+=".des";
+ QFile f(filename);
+ f.open(QIODevice::WriteOnly);
+
+ AL::Xml* xml = new AL::Xml(&f);
+ xml->header();
+ sub->_subcategory->writeSubcategory(xml, false);
+
+ f.close();
+ }
+ }
+ else QMessageBox::warning(this, tr("No subcategory selected"),
+ tr("You must first select a subcategory."));
+}
+
+
+//-----------------------------------------------------------
+// newPresetDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::newPresetDialog() {
+ QTreeSubcategory* sub =
+ (QTreeSubcategory*) subcategoryListView->currentItem();
+ if(sub && subcategoryListView->isItemSelected(sub)) {
+ int nprog=sub->_subcategory->firstFreeProg();
+ if(nprog==-1)
+ QMessageBox::information(this,
+ tr("No more preset supported"),
+ tr("You can not add more presets"),
+ QMessageBox::Ok);
+ else {
+ new Preset(sub->_subcategory, nprog);
+ setSubcategory(sub);
+ QTreeWidgetItem* pi=
+ presetListView->findItems(num3Digits(nprog+1),
+ Qt::MatchExactly).at(0);
+ presetListView->setItemSelected(pi, true);
+ setPreset(pi);
+ presetListView->scrollToItem(pi);
+ }
+ }
+}
+
+//-----------------------------------------------------------
+// deletePresetDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::deletePresetDialog() {
+ QTreePreset* pre = (QTreePreset*) presetListView->currentItem();
+ if(pre) {
+ if(presetListView->isItemSelected(pre)) {
+ if(!QMessageBox::question(
+ this,
+ tr("Delete preset"),
+ tr("Do you really want to delete %1 ?")
+ .arg(pre->_preset->name.c_str()),
+ tr("&Yes"), tr("&No"),
+ QString::null, 0, 1 )) {
+ _deicsOnze->_preset=_deicsOnze->_initialPreset;
+ delete(pre->_preset);
+ delete(pre);
+ presetLineEdit->setEnabled(false);
+ progSpinBox->setEnabled(false);
+ updatePreset();
+ }
+ }
+ else QMessageBox::warning(this, tr("No preset selected"),
+ tr("You must first select a preset."));
+ }
+ else QMessageBox::warning(this, tr("No preset selected"),
+ tr("You must first select a preset."));
+}
+
+//-----------------------------------------------------------
+// loadPresetDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::loadPresetDialog() {
+ QTreeSubcategory* sub =
+ (QTreeSubcategory*) subcategoryListView->currentItem();
+ QString buffstr;
+ QString fileName =
+ QFileDialog::getOpenFileName(
+ this,
+ tr("Load preset dialog"),
+ lastDir,
+ QString("*.dep"));
+
+ // read the XML file and create DOM tree
+ if(!fileName.isEmpty()) {
+ QFileInfo fi(fileName);
+ lastDir = fi.path();
+ QFile deicsonzeFile(fileName);
+ if(!deicsonzeFile.open(QIODevice::ReadOnly)) {
+ QMessageBox::critical(0,
+ tr("Critical Error"),
+ tr("Cannot open file %1").arg(fileName));
+ return;
+ }
+ QDomDocument domTree;
+ if (!domTree.setContent(&deicsonzeFile )) {
+ QMessageBox::critical
+ (0, tr("Critical Error"),
+ tr("Parsing error for file %1").arg(fileName));
+ deicsonzeFile.close();
+ return;
+ }
+ deicsonzeFile.close();
+
+ QDomNode node = domTree.documentElement();
+ while (!node.isNull()) {
+ QDomElement e = node.toElement();
+ if(e.isNull())
+ continue;
+ if(e.tagName() == "deicsOnzePreset") {
+ QString version = e.attribute(QString("version"));
+ if (version == "1.0") {
+ Preset* lPreset = new Preset();
+ lPreset->readPreset(node.firstChild());
+ if(!sub->_subcategory->isFreeProg(lPreset->prog)) {
+ if(!QMessageBox::question(
+ this,
+ tr("Replace or add"),
+ tr("%1 is supposed to be affected to the prog number %2, but there is already one on this slot.\n Do you want to replace it or to add it in the next free slot ?")
+ .arg((lPreset->name).c_str())
+ .arg(buffstr.setNum(lPreset->prog+1)),
+ tr("&Replace"), tr("&Add"),
+ QString::null, 0, 1 )) {
+ delete(sub->_subcategory->findPreset(lPreset->prog));
+ lPreset->linkSubcategory(sub->_subcategory);
+ }
+ else {
+ int ffp=sub->_subcategory->firstFreeProg();
+ if(ffp==-1)
+ QMessageBox::warning
+ (this, tr("Download error"),
+ tr("There is no more free preset slot."));
+ else lPreset->prog=ffp;
+ lPreset->linkSubcategory(sub->_subcategory);
+ }
+ }
+ else lPreset->linkSubcategory(sub->_subcategory);
+ //display preset
+ setSubcategory(sub->_subcategory);
+ }
+ else printf("unsupported *.dep file version %s\n",
+ version.toLatin1().data());
+ }
+ else printf("DeicsOnze: %s not supported\n",
+ e.tagName().toLatin1().data());
+ node = node.nextSibling();
+ }
+ }
+}
+
+
+//-----------------------------------------------------------
+// savePresetDialog
+//-----------------------------------------------------------
+void DeicsOnzeGui::savePresetDialog() {
+ QTreePreset* pre = (QTreePreset*) presetListView->currentItem();
+ if(pre) {
+ QString filename =
+ QFileDialog::getSaveFileName(
+ this,
+ tr("Save preset dialog"),
+ lastDir,
+ QString("*.dep"));
+ if(!filename.isEmpty()) {
+ QFileInfo fi(filename);
+ lastDir = fi.path();
+ if(!filename.endsWith(".dep")) filename+=".dep";
+ QFile f(filename);
+ f.open(QIODevice::WriteOnly);
+ AL::Xml* xml = new AL::Xml(&f);
+
+ xml->header();
+ pre->_preset->writePreset(xml, false);
+ f.close();
+ }
+ }
+ else QMessageBox::warning(this, tr("No preset selected"),
+ tr("You must first select a preset."));
+}
+
+//-----------------------------------------------------------
+// Preset and bank
+//-----------------------------------------------------------
+void DeicsOnzeGui::setPresetName(const QString& n) {
+ QTreeWidgetItem* pre = presetListView->currentItem();
+ if(pre) {
+ _deicsOnze->_preset->name=n.toAscii().data();//must be changed with SysEx
+ pre->setText(1,n.toAscii().data());
+ }
+}
+void DeicsOnzeGui::setSubcategoryName(const QString& s) {
+ QTreeSubcategory* sub =
+ (QTreeSubcategory*) subcategoryListView->currentItem();
+ if(sub) {//must be changed with SysEx
+ sub->_subcategory->_subcategoryName=s.toAscii().data();
+ sub->setText(1, s.toAscii().data());
+ }
+}
+void DeicsOnzeGui::setCategoryName(const QString& c) {
+ QTreeCategory* cat = (QTreeCategory*) categoryListView->currentItem();
+ if(cat) {//must be changed with SysEx
+ cat->_category->_categoryName=c.toAscii().data();
+ cat->setText(1, c.toAscii().data());
+ }
+}
+void DeicsOnzeGui::setHBank(int hb) {
+ QTreeCategory* cat = (QTreeCategory*) categoryListView->currentItem();
+ if(cat) {//must be changed with SysEx
+ if(!_deicsOnze->_set->isFreeHBank(hb-1)) {
+ QTreeWidgetItem* qcat;
+ qcat=categoryListView->findItems(num3Digits(hb), Qt::MatchExactly).at(0);
+ ((QTreeCategory*)qcat)->_category->_hbank=
+ cat->_category->_hbank;
+ qcat->setText(0, num3Digits(((QTreeCategory*)qcat)
+ ->_category->_hbank+1));
+ }
+ cat->_category->_hbank=hb-1;
+ cat->setText(0,num3Digits(hb));
+ categoryListView->sortItems(0, Qt::AscendingOrder);
+ categoryListView->scrollToItem(cat);
+ }
+}
+void DeicsOnzeGui::setLBank(int lb) {//must be changed with SysEx
+ QTreeSubcategory* sub =
+ (QTreeSubcategory*) subcategoryListView->currentItem();
+ if(sub) {
+ Category* currentCat=sub->_subcategory->_category;
+ if(!currentCat->isFreeLBank(lb-1)) {
+ QTreeWidgetItem* qsub;
+ qsub=subcategoryListView->findItems(num3Digits(lb),
+ Qt::MatchExactly).at(0);
+ ((QTreeSubcategory*)qsub)->_subcategory->_lbank=
+ sub->_subcategory->_lbank;
+ qsub->setText(0, num3Digits(((QTreeSubcategory*)qsub)
+ ->_subcategory->_lbank+1));
+ }
+ sub->_subcategory->_lbank=lb-1;
+ sub->setText(0,num3Digits(lb));
+ subcategoryListView->sortItems(0, Qt::AscendingOrder);
+ subcategoryListView->scrollToItem(sub);
+ }
+}
+void DeicsOnzeGui::setProg(int pr) {//must be changed with SysEx
+ QTreePreset* pre = (QTreePreset*) presetListView->currentItem();
+ if(pre) {
+ Subcategory* currentSub=pre->_preset->_subcategory;
+ if(!currentSub->isFreeProg(pr-1)) {
+ QTreeWidgetItem* qpre;
+ qpre=presetListView->findItems(num3Digits(pr), Qt::MatchExactly).at(0);
+ ((QTreePreset*)qpre)->_preset->prog=pre->_preset->prog;
+ qpre->setText(0, num3Digits(((QTreePreset*)qpre)->_preset->prog+1));
+ }
+ pre->_preset->prog=pr-1;
+ pre->setText(0,num3Digits(pr));
+ presetListView->sortItems(0,Qt::AscendingOrder);
+ presetListView->scrollToItem(pre);
+ }
+}
+//-----------------------------------------------------------
+// load init set
+//-----------------------------------------------------------
+void DeicsOnzeGui::setIsInitSet(bool b) {
+ pathLineEdit->setEnabled(b);
+ browsePushButton-> setEnabled(b);
+ unsigned char* message = new unsigned char[2];
+ message[0]=SYSEX_ISINITSET;
+ message[1]=(unsigned char)b;
+ sendSysex(message, 2);
+}
+void DeicsOnzeGui::setInitSetPath(const QString& s) {
+ unsigned char* message = new unsigned char[1+MAXSTRLENGTHINITSETPATH];
+ message[0]=SYSEX_INITSETPATH;
+ strncpy((char*)&message[1], s.toAscii().data(), MAXSTRLENGTHINITSETPATH);
+ sendSysex(message, 1+MAXSTRLENGTHINITSETPATH);
+}
+void DeicsOnzeGui::setBrowseInitSetPath() {
+ QString fileName =
+ QFileDialog::getOpenFileName(
+ this,
+ tr("Browse set dialog"),
+ lastDir,
+ QString("*.dei"));
+ QFileInfo fi(fileName);
+ lastDir = fi.path();
+ updateInitSetPath(fileName);
+ setInitSetPath(fileName);
+}
+//-----------------------------------------------------------
+// Quick Edit
+//-----------------------------------------------------------
+void DeicsOnzeGui::setVolKnob(float val) {
+ masterVolSlider->setValue((int)(val*MAXMASTERVOLUME));
+}
+void DeicsOnzeGui::setBrightnessKnob(float val) {
+ sendController(0, CTRL_FINEBRIGHTNESS, (int)(val*(float)MAXFINEBRIGHTNESS));
+}
+void DeicsOnzeGui::setModulationKnob(float val) {
+ sendController(0, CTRL_MODULATION, (int)(val*(float)MAXMODULATION));
+}
+void DeicsOnzeGui::setDetuneKnob(float val) {
+ globalDetuneSlider->setValue((int)((2.0*val-1.0)*(float)MAXGLOBALDETUNE));
+}
+void DeicsOnzeGui::setAttackKnob(float val) {
+ sendController(0, CTRL_ATTACK_TIME, (int)(val*(float)MAXATTACK));
+}
+void DeicsOnzeGui::setReleaseKnob(float val) {
+ sendController(0, CTRL_RELEASE_TIME, (int)(val*(float)MAXRELEASE));
+}
+//-----------------------------------------------------------
+// Global control
+//-----------------------------------------------------------
+void DeicsOnzeGui::setMasterVol(int mv) {
+ volumeKnob->blockSignals(true);
+ volumeKnob->setValue((float)mv/(float)MAXMASTERVOLUME);
+ volumeKnob->blockSignals(false);
+ sendController(0, CTRL_MASTERVOLUME, mv);
+}
+
+void DeicsOnzeGui::setFeedback(int f) {sendController(0, CTRL_FEEDBACK, f);}
+
+void DeicsOnzeGui::setLfoWave(int lw) {sendController(0, CTRL_WAVE, lw);}
+
+void DeicsOnzeGui::setLfoSpeed(int ls) {sendController(0, CTRL_SPEED, ls);}
+
+void DeicsOnzeGui::setLfoDelay(int ld) {sendController(0, CTRL_DELAY, ld);}
+
+void DeicsOnzeGui::setLfoPModDepth(int lpmd) {
+ sendController(0, CTRL_PMODDEPTH, lpmd);
+}
+
+void DeicsOnzeGui::setLfoPitchSens(int lps) {
+ sendController(0, CTRL_PMODSENS, lps);
+}
+
+void DeicsOnzeGui::setLfoAModDepth(int lamd) {
+ sendController(0, CTRL_AMODDEPTH, lamd);
+}
+void DeicsOnzeGui::setLfoAmpSens(int las) {sendController(0, CTRL_AMS, las);}
+
+void DeicsOnzeGui::setTranspose(int t) {sendController(0, CTRL_TRANSPOSE, t);}
+
+void DeicsOnzeGui::setGlobalDetune(int gd) {
+ detuneKnob->blockSignals(true);
+ detuneKnob->setValue((((float)gd)/((float)MAXGLOBALDETUNE))/2.0+0.5);
+ detuneKnob->blockSignals(false);
+ sendController(0, CTRL_GLOBALDETUNE, gd);
+}
+
+void DeicsOnzeGui::setAlgorithm(int a) {
+ sendController(0, CTRL_ALG, (int) (a==0?FIRST:
+ (a==1?SECOND:
+ (a==2?THIRD:
+ (a==3?FOURTH:
+ (a==4?FIFTH:
+ (a==5?SIXTH:
+ (a==6?SEVENTH:EIGHTH))))))));
+}
+
+void DeicsOnzeGui::setPitchBendRange(int pbr) {
+ sendController(0, CTRL_PBENDRANGE, pbr);
+}
+
+//---------------------------------------------------------------
+// Pitch Envelope
+//---------------------------------------------------------------
+void DeicsOnzeGui::setPL1(int val) {
+ PitchEg* pe=&_deicsOnze->_preset->pitchEg;
+ pitchEnvelopeGraph->env2Points(val, pe->pl2, pe->pl3,
+ pe->pr1, pe->pr2, pe->pr3);
+ pitchEnvelopeGraph->updateEnv();
+ sendController(0, CTRL_PL1, val);
+}
+void DeicsOnzeGui::setPL2(int val) {
+ PitchEg* pe=&_deicsOnze->_preset->pitchEg;
+ pitchEnvelopeGraph->env2Points(pe->pl1, val, pe->pl3,
+ pe->pr1, pe->pr2, pe->pr3);
+ pitchEnvelopeGraph->updateEnv();
+ sendController(0, CTRL_PL2, val);
+}
+void DeicsOnzeGui::setPL3(int val) {
+ PitchEg* pe=&_deicsOnze->_preset->pitchEg;
+ pitchEnvelopeGraph->env2Points(pe->pl1, pe->pl2, val,
+ pe->pr1, pe->pr2, pe->pr3);
+ pitchEnvelopeGraph->updateEnv();
+ sendController(0, CTRL_PL3, val);
+}
+void DeicsOnzeGui::setPR1(int val) {
+ PitchEg* pe=&_deicsOnze->_preset->pitchEg;
+ pitchEnvelopeGraph->env2Points(pe->pl1, pe->pl2, pe->pl3,
+ val, pe->pr2, pe->pr3);
+ pitchEnvelopeGraph->updateEnv();
+ sendController(0, CTRL_PR1, val);
+}
+void DeicsOnzeGui::setPR2(int val) {
+ PitchEg* pe=&_deicsOnze->_preset->pitchEg;
+ pitchEnvelopeGraph->env2Points(pe->pl1, pe->pl2, pe->pl3,
+ pe->pr1, val, pe->pr3);
+ pitchEnvelopeGraph->updateEnv();
+ sendController(0, CTRL_PR2, val);
+}
+void DeicsOnzeGui::setPR3(int val) {
+ PitchEg* pe=&_deicsOnze->_preset->pitchEg;
+ pitchEnvelopeGraph->env2Points(pe->pl1, pe->pl2, pe->pl3,
+ pe->pr1, pe->pr2, val);
+ pitchEnvelopeGraph->updateEnv();
+ sendController(0, CTRL_PR3, val);
+}
+//---------------------------------------------------------------
+// Function
+//---------------------------------------------------------------
+void DeicsOnzeGui::setFcVolume(int val){sendController(0, CTRL_FCVOLUME, val);}
+void DeicsOnzeGui::setFcPitch(int val){sendController(0, CTRL_FCPITCH, val);}
+void DeicsOnzeGui::setFcAmplitude(int val) {
+ sendController(0, CTRL_FCAMPLITUDE, val);
+}
+void DeicsOnzeGui::setMwPitch(int val){sendController(0, CTRL_MWPITCH, val);}
+void DeicsOnzeGui::setMwAmplitude(int val) {
+ sendController(0, CTRL_MWAMPLITUDE, val);
+}
+void DeicsOnzeGui::setBcPitch(int val){sendController(0, CTRL_BCPITCH, val);}
+void DeicsOnzeGui::setBcAmplitude(int val) {
+ sendController(0, CTRL_BCAMPLITUDE, val);
+}
+void DeicsOnzeGui::setBcPitchBias(int val) {
+ sendController(0, CTRL_BCPITCHBIAS, val);}
+void DeicsOnzeGui::setBcEgBias(int val) {
+ sendController(0, CTRL_BCEGBIAS, val);
+}
+void DeicsOnzeGui::setAtPitch(int val){sendController(0, CTRL_ATPITCH, val);}
+void DeicsOnzeGui::setAtAmplitude(int val) {
+ sendController(0, CTRL_ATAMPLITUDE, val);
+}
+void DeicsOnzeGui::setAtPitchBias(int val) {
+ sendController(0, CTRL_ATPITCHBIAS, val);}
+void DeicsOnzeGui::setAtEgBias(int val) {
+ sendController(0, CTRL_ATEGBIAS, val);
+}
+void DeicsOnzeGui::setReverbRate(int val) {
+ //printf("Envoie\n");
+ sendController(0, CTRL_REVERBRATE, val);
+}
+//---------------------------------------------------------------
+// envelope controle
+//---------------------------------------------------------------
+void DeicsOnzeGui::setAR1(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[0]);
+ printf("ar : %d, d1r : %d, d1l : %d, d2r : %d, rr : %d\n",
+ val, _eg->d1r, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[0]->env2Points(val, _eg->d1r, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[0]->updateEnv();
+ sendController(0, CTRL_AR, val);
+}
+void DeicsOnzeGui::setD1R1(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[0]);
+ envelopeGraph[0]->env2Points(_eg->ar, val, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[0]->updateEnv();
+ sendController(0, CTRL_D1R, val);
+}
+void DeicsOnzeGui::setD1L1(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[0]);
+ envelopeGraph[0]->env2Points(_eg->ar, _eg->d1r, val, _eg->d2r, _eg->rr);
+ envelopeGraph[0]->updateEnv();
+ sendController(0, CTRL_D1L, val);
+}
+void DeicsOnzeGui::setD2R1(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[0]);
+ envelopeGraph[0]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, val, _eg->rr);
+ envelopeGraph[0]->updateEnv();
+ sendController(0, CTRL_D2R, val);
+}
+void DeicsOnzeGui::setRR1(int val){
+ Eg* _eg=&(_deicsOnze->_preset->eg[0]);
+ envelopeGraph[0]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, _eg->d2r, val);
+ envelopeGraph[0]->updateEnv();
+ sendController(0, CTRL_RR, val);
+}
+void DeicsOnzeGui::setAR2(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[1]);
+ envelopeGraph[1]->env2Points(val, _eg->d1r, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[1]->updateEnv();
+ sendController(0, CTRL_AR+DECAPAR1, val);
+}
+void DeicsOnzeGui::setD1R2(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[1]);
+ envelopeGraph[1]->env2Points(_eg->ar, val, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[1]->updateEnv();
+ sendController(0, CTRL_D1R+DECAPAR1, val);
+}
+void DeicsOnzeGui::setD1L2(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[1]);
+ envelopeGraph[1]->env2Points(_eg->ar, _eg->d1r, val, _eg->d2r, _eg->rr);
+ envelopeGraph[1]->updateEnv();
+ sendController(0, CTRL_D1L+DECAPAR1, val);
+}
+void DeicsOnzeGui::setD2R2(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[1]);
+ envelopeGraph[1]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, val, _eg->rr);
+ envelopeGraph[1]->updateEnv();
+ sendController(0, CTRL_D2R+DECAPAR1, val);
+}
+void DeicsOnzeGui::setRR2(int val){
+ Eg* _eg=&(_deicsOnze->_preset->eg[1]);
+ envelopeGraph[1]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, _eg->d2r, val);
+ envelopeGraph[1]->updateEnv();
+ sendController(0, CTRL_RR+DECAPAR1, val);
+}
+void DeicsOnzeGui::setAR3(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[2]);
+ envelopeGraph[2]->env2Points(val, _eg->d1r, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[2]->updateEnv();
+ sendController(0, CTRL_AR+2*DECAPAR1, val);
+}
+void DeicsOnzeGui::setD1R3(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[2]);
+ envelopeGraph[2]->env2Points(_eg->ar, val, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[2]->updateEnv();
+ sendController(0, CTRL_D1R+2*DECAPAR1, val);
+}
+void DeicsOnzeGui::setD1L3(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[2]);
+ envelopeGraph[2]->env2Points(_eg->ar, _eg->d1r, val, _eg->d2r, _eg->rr);
+ envelopeGraph[2]->updateEnv();
+ sendController(0, CTRL_D1L+2*DECAPAR1, val);
+}
+void DeicsOnzeGui::setD2R3(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[2]);
+ envelopeGraph[2]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, val, _eg->rr);
+ envelopeGraph[2]->updateEnv();
+ sendController(0, CTRL_D2R+2*DECAPAR1, val);
+}
+void DeicsOnzeGui::setRR3(int val){
+ Eg* _eg=&(_deicsOnze->_preset->eg[2]);
+ envelopeGraph[2]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, _eg->d2r, val);
+ envelopeGraph[2]->updateEnv();
+ sendController(0, CTRL_RR+2*DECAPAR1, val);
+}
+void DeicsOnzeGui::setAR4(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[3]);
+ envelopeGraph[3]->env2Points(val, _eg->d1r, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[3]->updateEnv();
+ sendController(0, CTRL_AR+3*DECAPAR1, val);
+}
+void DeicsOnzeGui::setD1R4(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[3]);
+ envelopeGraph[3]->env2Points(_eg->ar, val, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[3]->updateEnv();
+ sendController(0, CTRL_D1R+3*DECAPAR1, val);
+}
+void DeicsOnzeGui::setD1L4(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[3]);
+ envelopeGraph[3]->env2Points(_eg->ar, _eg->d1r, val, _eg->d2r, _eg->rr);
+ envelopeGraph[3]->updateEnv();
+ sendController(0, CTRL_D1L+3*DECAPAR1, val);
+}
+void DeicsOnzeGui::setD2R4(int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[3]);
+ envelopeGraph[3]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, val, _eg->rr);
+ envelopeGraph[3]->updateEnv();
+ sendController(0, CTRL_D2R+3*DECAPAR1, val);
+}
+void DeicsOnzeGui::setRR4(int val){
+ Eg* _eg=&(_deicsOnze->_preset->eg[3]);
+ envelopeGraph[3]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, _eg->d2r, val);
+ envelopeGraph[3]->updateEnv();
+ sendController(0, CTRL_RR+3*DECAPAR1, val);
+}
+
+//--------------------------------------------------------------
+// set Scaling
+//--------------------------------------------------------------
+void DeicsOnzeGui::setLS1(int val){sendController(0, CTRL_LS, val);}
+void DeicsOnzeGui::setRS1(int val){sendController(0, CTRL_RS, val);}
+void DeicsOnzeGui::setLS2(int val){sendController(0, CTRL_LS+DECAPAR1, val);}
+void DeicsOnzeGui::setRS2(int val){sendController(0, CTRL_RS+DECAPAR1, val);}
+void DeicsOnzeGui::setLS3(int val){sendController(0, CTRL_LS+2*DECAPAR1, val);}
+void DeicsOnzeGui::setRS3(int val){sendController(0, CTRL_RS+2*DECAPAR1, val);}
+void DeicsOnzeGui::setLS4(int val){sendController(0, CTRL_LS+3*DECAPAR1, val);}
+void DeicsOnzeGui::setRS4(int val){sendController(0, CTRL_RS+3*DECAPAR1, val);}
+
+//--------------------------------------------------------------
+// set Volume
+//--------------------------------------------------------------
+void DeicsOnzeGui::setVol1(int val){sendController(0, CTRL_OUT, val);}
+void DeicsOnzeGui::setVol2(int val){sendController(0, CTRL_OUT+DECAPAR1, val);}
+void DeicsOnzeGui::setVol3(int val){sendController(0,CTRL_OUT+2*DECAPAR1,val);}
+void DeicsOnzeGui::setVol4(int val){sendController(0,CTRL_OUT+3*DECAPAR1,val);}
+
+//--------------------------------------------------------------
+// set Ratio and Frequency
+//--------------------------------------------------------------
+void DeicsOnzeGui::setCoarseRatio1(int val) {
+ sendController(0, CTRL_RATIO, val*100+FineRatio1SpinBox->value());
+}
+void DeicsOnzeGui::setFineRatio1(int val) {
+ sendController(0, CTRL_RATIO, val+CoarseRatio1SpinBox->value()*100);
+}
+void DeicsOnzeGui::setFreq1(int val) {
+ sendController(0,CTRL_FIXRANGE,val*100);}
+void DeicsOnzeGui::setFix1(bool f) {
+ sendController(0, CTRL_FIX, (f==false?0:1));}
+void DeicsOnzeGui::setCoarseRatio2(int val) {
+ sendController(0, CTRL_RATIO+DECAPAR1, val*100+FineRatio1SpinBox->value());
+}
+void DeicsOnzeGui::setFineRatio2(int val) {
+ sendController(0,CTRL_RATIO+DECAPAR1,val+CoarseRatio1SpinBox->value()*100);
+}
+void DeicsOnzeGui::setFreq2(int val) {
+ sendController(0,CTRL_FIXRANGE+DECAPAR1,val*100);}
+void DeicsOnzeGui::setFix2(bool f) {
+ sendController(0, CTRL_FIX+DECAPAR1, (f==false?0:1));}
+void DeicsOnzeGui::setCoarseRatio3(int val) {
+ sendController(0,CTRL_RATIO+2*DECAPAR1,val*100+FineRatio1SpinBox->value());
+}
+void DeicsOnzeGui::setFineRatio3(int val) {
+ sendController(0,CTRL_RATIO+2*DECAPAR1,
+ val+CoarseRatio1SpinBox->value()*100);
+}
+void DeicsOnzeGui::setFreq3(int val) {
+ sendController(0,CTRL_FIXRANGE+2*DECAPAR1,val*100);}
+void DeicsOnzeGui::setFix3(bool f) {
+ sendController(0, CTRL_FIX+2*DECAPAR1, (f==false?0:1));}
+void DeicsOnzeGui::setCoarseRatio4(int val) {
+ sendController(0,CTRL_RATIO+3*DECAPAR1,val*100+FineRatio1SpinBox->value());
+}
+void DeicsOnzeGui::setFineRatio4(int val) {
+ sendController(0,CTRL_RATIO+3*DECAPAR1,
+ val+CoarseRatio1SpinBox->value()*100);
+}
+void DeicsOnzeGui::setFreq4(int val) {
+ sendController(0,CTRL_FIXRANGE+3*DECAPAR1,val*100);}
+void DeicsOnzeGui::setFix4(bool f) {
+ sendController(0, CTRL_FIX+3*DECAPAR1, (f==false?0:1));}
+
+//--------------------------------------------------------------
+// set Sensitivity
+//--------------------------------------------------------------
+void DeicsOnzeGui::setAME1(bool val) {sendController(0, CTRL_AME, val);}
+void DeicsOnzeGui::setEBS1(int val) {sendController(0, CTRL_EBS, val);}
+void DeicsOnzeGui::setKVS1(int val) {sendController(0, CTRL_KVS, val);}
+void DeicsOnzeGui::setAME2(bool val) {sendController(0,CTRL_AME+DECAPAR1,val);}
+void DeicsOnzeGui::setEBS2(int val) {sendController(0,CTRL_EBS+DECAPAR1,val);}
+void DeicsOnzeGui::setKVS2(int val) {sendController(0,CTRL_KVS+DECAPAR1,val);}
+void DeicsOnzeGui::setAME3(bool val) {
+ sendController(0,CTRL_AME+2*DECAPAR1,val);}
+void DeicsOnzeGui::setEBS3(int val) {
+ sendController(0, CTRL_EBS+2*DECAPAR1, val);}
+void DeicsOnzeGui::setKVS3(int val) {
+ sendController(0, CTRL_KVS+2*DECAPAR1, val);}
+void DeicsOnzeGui::setAME4(bool val) {
+ sendController(0, CTRL_AME+3*DECAPAR1, val);}
+void DeicsOnzeGui::setEBS4(int val) {
+ sendController(0, CTRL_EBS+3*DECAPAR1, val);}
+void DeicsOnzeGui::setKVS4(int val) {
+ sendController(0, CTRL_KVS+3*DECAPAR1, val);}
+
+//--------------------------------------------------------------
+// set detune
+//--------------------------------------------------------------
+void DeicsOnzeGui::setDET1(int val){sendController(0, CTRL_DET, val);}
+void DeicsOnzeGui::setDET2(int val){sendController(0, CTRL_DET+DECAPAR1, val);}
+void DeicsOnzeGui::setDET3(int val){sendController(0,CTRL_DET+2*DECAPAR1,val);}
+void DeicsOnzeGui::setDET4(int val){sendController(0,CTRL_DET+3*DECAPAR1,val);}
+
+//--------------------------------------------------------------
+// set WaveForm
+//--------------------------------------------------------------
+void DeicsOnzeGui::setWaveForm1(int w) {
+ sendController(0, CTRL_OSW, w);
+}
+void DeicsOnzeGui::setWaveForm2(int w) {
+ sendController(0, CTRL_OSW+DECAPAR2, w);
+}
+void DeicsOnzeGui::setWaveForm3(int w) {
+ sendController(0, CTRL_OSW+2*DECAPAR2, w);
+}
+void DeicsOnzeGui::setWaveForm4(int w) {
+ sendController(0, CTRL_OSW+3*DECAPAR2, w);
+}
+//--------------------------------------------------------------
+// setSet
+// Display the set, that is the category list
+//--------------------------------------------------------------
+void DeicsOnzeGui::setSet() {
+ categoryListView->clear();
+ hbankSpinBox->setEnabled(false);
+ categoryLineEdit->setEnabled(false);
+ for(std::vector<Category*>::iterator
+ i=_deicsOnze->_set->_categoryVector.begin();
+ i!=_deicsOnze->_set->_categoryVector.end(); i++)
+ (void) new QTreeCategory
+ (categoryListView, num3Digits((*i)->_hbank+1),
+ (*i)->_categoryName.c_str(), *i);
+ categoryListView->resizeColumnToContents(0);
+ categoryListView->sortItems(0,Qt::AscendingOrder);
+}
+
+//--------------------------------------------------------------
+// setCategory
+//--------------------------------------------------------------
+void DeicsOnzeGui::setCategory(Category* cat) {
+ subcategoryListView->clear();
+ lbankSpinBox->setEnabled(false);
+ subcategoryLineEdit->setEnabled(false);
+ for(std::vector<Subcategory*>::iterator i=cat->_subcategoryVector.begin();
+ i!=cat->_subcategoryVector.end(); i++)
+ (void) new QTreeSubcategory(subcategoryListView,
+ num3Digits((*i)->_lbank+1),
+ (*i)->_subcategoryName.c_str(),*i);
+ subcategoryListView->resizeColumnToContents(0);
+ subcategoryListView->sortItems(0,Qt::AscendingOrder);
+}
+void DeicsOnzeGui::setCategory(QTreeWidgetItem* cat) {
+ QTreeCategory* ccat = (QTreeCategory*) categoryListView->currentItem();
+ if(cat) {
+ categoryLineEdit->setEnabled(true);
+ hbankSpinBox->setEnabled(true);
+ categoryLineEdit
+ ->setText(((QTreeCategory*)cat)->_category->_categoryName.c_str());
+ hbankSpinBox->setValue(((QTreeCategory*)cat)->_category->_hbank+1);
+ ccat=(QTreeCategory*)cat;
+ setCategory(ccat->_category);
+ }
+}
+
+//--------------------------------------------------------------
+// setSubcategory
+//--------------------------------------------------------------
+void DeicsOnzeGui::setSubcategory(Subcategory* sub) {
+ presetListView->clear();
+ progSpinBox->setEnabled(false);
+ presetLineEdit->setEnabled(false);
+ for(std::vector<Preset*>::iterator i=sub->_presetVector.begin();
+ i!=sub->_presetVector.end(); i++)
+ (void) new QTreePreset(presetListView,
+ num3Digits((*i)->prog+1),
+ (*i)->name.c_str(),*i);
+ presetListView->resizeColumnToContents(0);
+ presetListView->sortItems(0,Qt::AscendingOrder);
+}
+void DeicsOnzeGui::setSubcategory(QTreeWidgetItem* sub) {
+ QTreeSubcategory* csub =
+ (QTreeSubcategory*) subcategoryListView->currentItem();
+ if(sub) {
+ subcategoryLineEdit->setEnabled(true);
+ lbankSpinBox->setEnabled(true);
+ subcategoryLineEdit->setText(((QTreeSubcategory*)sub)
+ ->_subcategory->_subcategoryName.c_str());
+ lbankSpinBox->setValue(((QTreeSubcategory*)sub)
+ ->_subcategory->_lbank+1);
+ csub=(QTreeSubcategory*)sub;
+ setSubcategory(csub->_subcategory);
+ }
+}
+//--------------------------------------------------------------
+// setPreset
+//--------------------------------------------------------------
+void DeicsOnzeGui::setPreset(QTreeWidgetItem* pre) {
+ if(pre) {
+ QTreePreset* cpre=(QTreePreset*)pre;
+ updatePresetName(cpre->_preset->name.c_str(), true);
+ updateProg(cpre->_preset->prog, true);
+ int prog = cpre->_preset->prog;
+ int lbank = cpre->_preset->_subcategory->_lbank;
+ int hbank = cpre->_preset->_subcategory->_category->_hbank;
+ setEnabledPreset(true);
+ updatePreset(cpre->_preset);
+ sendController(0, CTRL_PROGRAM, (hbank<<16)+(lbank<<8)+prog);
+ }
+}
+//--------------------------------------------------------------
+// update the gui
+//--------------------------------------------------------------
+void DeicsOnzeGui::setEnabledPreset(bool b) {
+ if(_enabledPreset!=b) {
+ FeedbackGroupBox->setEnabled(b);
+ LFOGroupBox->setEnabled(b);
+ pitchEnvGroupBox->setEnabled(b);
+ ModulationMatrixGroupBox->setEnabled(b);
+ Op1Tab->setEnabled(b);
+ Op2Tab->setEnabled(b);
+ Op3Tab->setEnabled(b);
+ Op4Tab->setEnabled(b);
+ FunctionsTab->setEnabled(b);
+
+ _enabledPreset=b;
+ }
+}
+void DeicsOnzeGui::updateNbrVoices(int val) {
+ nbrVoicesSpinBox->blockSignals(true);
+ nbrVoicesSpinBox->setValue(val);
+ nbrVoicesSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateMidiInCh(int val) {
+ MidiInChComboBox->blockSignals(true);
+ MidiInChComboBox->setCurrentIndex(val);
+ MidiInChComboBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateQuality(int val) {
+ qualityComboBox->blockSignals(true);
+ qualityComboBox->setCurrentIndex(val);
+ qualityComboBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateSaveConfig(bool usc) {
+ saveConfigCheckBox->blockSignals(true);
+ saveConfigCheckBox->setChecked(usc);
+ saveConfigCheckBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateSaveOnlyUsed(bool usou) {
+ hugeSaveRadioButton->blockSignals(true);
+ hugeSaveRadioButton->setChecked(!usou);
+ hugeSaveRadioButton->blockSignals(false);
+ minSaveRadioButton->blockSignals(true);
+ minSaveRadioButton->setChecked(usou);
+ minSaveRadioButton->blockSignals(false);
+}
+//Pitch Envelope
+void DeicsOnzeGui::updatePL1(int val) {
+ PL1SpinBox->blockSignals(true);
+ PL1SpinBox->setValue(val);
+ PL1SpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePL2(int val) {
+ PL2SpinBox->blockSignals(true);
+ PL2SpinBox->setValue(val);
+ PL2SpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePL3(int val) {
+ PL3SpinBox->blockSignals(true);
+ PL3SpinBox->setValue(val);
+ PL3SpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePR1(int val) {
+ PR1SpinBox->blockSignals(true);
+ PR1SpinBox->setValue(val);
+ PR1SpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePR2(int val) {
+ PR2SpinBox->blockSignals(true);
+ PR2SpinBox->setValue(val);
+ PR2SpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePR3(int val) {
+ PR3SpinBox->blockSignals(true);
+ PR3SpinBox->setValue(val);
+ PR3SpinBox->blockSignals(false);
+}
+//Function
+void DeicsOnzeGui::updateFcVolume(int val) {
+ fcVolumeSpinBox->blockSignals(true);
+ fcVolumeSpinBox->setValue(val);
+ fcVolumeSpinBox->blockSignals(false);
+ fcVolumeSlider->blockSignals(true);
+ fcVolumeSlider->setValue(val);
+ fcVolumeSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateFcPitch(int val) {
+ fcPitchSpinBox->blockSignals(true);
+ fcPitchSpinBox->setValue(val);
+ fcPitchSpinBox->blockSignals(false);
+ fcPitchSlider->blockSignals(true);
+ fcPitchSlider->setValue(val);
+ fcPitchSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateFcAmplitude(int val) {
+ fcAmplitudeSpinBox->blockSignals(true);
+ fcAmplitudeSpinBox->setValue(val);
+ fcAmplitudeSpinBox->blockSignals(false);
+ fcAmplitudeSlider->blockSignals(true);
+ fcAmplitudeSlider->setValue(val);
+ fcAmplitudeSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateMwPitch(int val) {
+ mwPitchSpinBox->blockSignals(true);
+ mwPitchSpinBox->setValue(val);
+ mwPitchSpinBox->blockSignals(false);
+ mwPitchSlider->blockSignals(true);
+ mwPitchSlider->setValue(val);
+ mwPitchSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateMwAmplitude(int val) {
+ mwAmplitudeSpinBox->blockSignals(true);
+ mwAmplitudeSpinBox->setValue(val);
+ mwAmplitudeSpinBox->blockSignals(false);
+ mwAmplitudeSlider->blockSignals(true);
+ mwAmplitudeSlider->setValue(val);
+ mwAmplitudeSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateBcPitch(int val) {
+ bcPitchSpinBox->blockSignals(true);
+ bcPitchSpinBox->setValue(val);
+ bcPitchSpinBox->blockSignals(false);
+ bcPitchSlider->blockSignals(true);
+ bcPitchSlider->setValue(val);
+ bcPitchSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateBcAmplitude(int val) {
+ bcAmplitudeSpinBox->blockSignals(true);
+ bcAmplitudeSpinBox->setValue(val);
+ bcAmplitudeSpinBox->blockSignals(false);
+ bcAmplitudeSlider->blockSignals(true);
+ bcAmplitudeSlider->setValue(val);
+ bcAmplitudeSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateBcPitchBias(int val) {
+ bcPitchBiasSpinBox->blockSignals(true);
+ bcPitchBiasSpinBox->setValue(val);
+ bcPitchBiasSpinBox->blockSignals(false);
+ bcPitchBiasSlider->blockSignals(true);
+ bcPitchBiasSlider->setValue(val);
+ bcPitchBiasSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateBcEgBias(int val) {
+ bcEgBiasSpinBox->blockSignals(true);
+ bcEgBiasSpinBox->setValue(val);
+ bcEgBiasSpinBox->blockSignals(false);
+ bcEgBiasSlider->blockSignals(true);
+ bcEgBiasSlider->setValue(val);
+ bcEgBiasSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateAtPitch(int val) {
+ atPitchSpinBox->blockSignals(true);
+ atPitchSpinBox->setValue(val);
+ atPitchSpinBox->blockSignals(false);
+ atPitchSlider->blockSignals(true);
+ atPitchSlider->setValue(val);
+ atPitchSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateAtAmplitude(int val) {
+ atAmplitudeSpinBox->blockSignals(true);
+ atAmplitudeSpinBox->setValue(val);
+ atAmplitudeSpinBox->blockSignals(false);
+ atAmplitudeSlider->blockSignals(true);
+ atAmplitudeSlider->setValue(val);
+ atAmplitudeSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateAtPitchBias(int val) {
+ atPitchBiasSpinBox->blockSignals(true);
+ atPitchBiasSpinBox->setValue(val);
+ atPitchBiasSpinBox->blockSignals(false);
+ atPitchBiasSlider->blockSignals(true);
+ atPitchBiasSlider->setValue(val);
+ atPitchBiasSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateAtEgBias(int val) {
+ atEgBiasSpinBox->blockSignals(true);
+ atEgBiasSpinBox->setValue(val);
+ atEgBiasSpinBox->blockSignals(false);
+ atEgBiasSlider->blockSignals(true);
+ atEgBiasSlider->setValue(val);
+ atEgBiasSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateReverbRate(int val) {
+ reverbSpinBox->blockSignals(true);
+ reverbSpinBox->setValue(val);
+ reverbSpinBox->blockSignals(false);
+ reverbSlider->blockSignals(true);
+ reverbSlider->setValue(val);
+ reverbSlider->blockSignals(false);
+}
+//Envelope
+void DeicsOnzeGui::updateAR(int op, int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[op]);
+ envelopeGraph[op]->env2Points(val, _eg->d1r, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[op]->updateEnv();
+ switch(op) {
+ case 0:
+ AR1SpinBox->blockSignals(true);
+ AR1SpinBox->setValue(val);
+ AR1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ AR2SpinBox->blockSignals(true);
+ AR2SpinBox->setValue(val);
+ AR2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ AR3SpinBox->blockSignals(true);
+ AR3SpinBox->setValue(val);
+ AR3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ AR4SpinBox->blockSignals(true);
+ AR4SpinBox->setValue(val);
+ AR4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateAR : Error switch\n");
+ }
+}
+
+void DeicsOnzeGui::updateD1R(int op, int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[op]);
+ envelopeGraph[op]->env2Points(_eg->ar, val, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[op]->updateEnv();
+ switch(op) {
+ case 0:
+ D1R1SpinBox->blockSignals(true);
+ D1R1SpinBox->setValue(val);
+ D1R1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ D1R2SpinBox->blockSignals(true);
+ D1R2SpinBox->setValue(val);
+ D1R2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ D1R3SpinBox->blockSignals(true);
+ D1R3SpinBox->setValue(val);
+ D1R3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ D1R4SpinBox->blockSignals(true);
+ D1R4SpinBox->setValue(val);
+ D1R4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateD1R : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateD2R(int op, int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[op]);
+ envelopeGraph[op]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, val, _eg->rr);
+ envelopeGraph[op]->updateEnv();
+ switch(op) {
+ case 0:
+ D2R1SpinBox->blockSignals(true);
+ D2R1SpinBox->setValue(val);
+ D2R1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ D2R2SpinBox->blockSignals(true);
+ D2R2SpinBox->setValue(val);
+ D2R2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ D2R3SpinBox->blockSignals(true);
+ D2R3SpinBox->setValue(val);
+ D2R3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ D2R4SpinBox->blockSignals(true);
+ D2R4SpinBox->setValue(val);
+ D2R4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateD2R : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateRR(int op, int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[op]);
+ envelopeGraph[op]->env2Points(_eg->ar, _eg->d1r, _eg->d1l, _eg->d2r, val);
+ envelopeGraph[op]->updateEnv();
+ switch(op) {
+ case 0:
+ RR1SpinBox->blockSignals(true);
+ RR1SpinBox->setValue(val);
+ RR1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ RR2SpinBox->blockSignals(true);
+ RR2SpinBox->setValue(val);
+ RR2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ RR3SpinBox->blockSignals(true);
+ RR3SpinBox->setValue(val);
+ RR3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ RR4SpinBox->blockSignals(true);
+ RR4SpinBox->setValue(val);
+ RR4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateRR : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateD1L(int op, int val) {
+ Eg* _eg=&(_deicsOnze->_preset->eg[op]);
+ envelopeGraph[op]->env2Points(_eg->ar, _eg->d1r, val, _eg->d2r, _eg->rr);
+ envelopeGraph[op]->updateEnv();
+ switch(op) {
+ case 0:
+ D1L1SpinBox->blockSignals(true);
+ D1L1SpinBox->setValue(val);
+ D1L1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ D1L2SpinBox->blockSignals(true);
+ D1L2SpinBox->setValue(val);
+ D1L2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ D1L3SpinBox->blockSignals(true);
+ D1L3SpinBox->setValue(val);
+ D1L3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ D1L4SpinBox->blockSignals(true);
+ D1L4SpinBox->setValue(val);
+ D1L4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateD1L : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateLS(int op, int val) {
+ switch(op) {
+ case 0:
+ LS1Slider->blockSignals(true);
+ LS1Slider->setValue(val);
+ LS1Slider->blockSignals(false);
+ LS1SpinBox->blockSignals(true);
+ LS1SpinBox->setValue(val);
+ LS1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ LS2Slider->blockSignals(true);
+ LS2Slider->setValue(val);
+ LS2Slider->blockSignals(false);
+ LS2SpinBox->blockSignals(true);
+ LS2SpinBox->setValue(val);
+ LS2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ LS3Slider->blockSignals(true);
+ LS3Slider->setValue(val);
+ LS3Slider->blockSignals(false);
+ LS3SpinBox->blockSignals(true);
+ LS3SpinBox->setValue(val);
+ LS3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ LS4Slider->blockSignals(true);
+ LS4Slider->setValue(val);
+ LS4Slider->blockSignals(false);
+ LS4SpinBox->blockSignals(true);
+ LS4SpinBox->setValue(val);
+ LS4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateLS : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateRS(int op, int val) {
+ switch(op) {
+ case 0:
+ RS1Slider->blockSignals(true);
+ RS1Slider->setValue(val);
+ RS1Slider->blockSignals(false);
+ RS1SpinBox->blockSignals(true);
+ RS1SpinBox->setValue(val);
+ RS1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ RS2Slider->blockSignals(true);
+ RS2Slider->setValue(val);
+ RS2Slider->blockSignals(false);
+ RS2SpinBox->blockSignals(true);
+ RS2SpinBox->setValue(val);
+ RS2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ RS3Slider->blockSignals(true);
+ RS3Slider->setValue(val);
+ RS3Slider->blockSignals(false);
+ RS3SpinBox->blockSignals(true);
+ RS3SpinBox->setValue(val);
+ RS3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ RS4Slider->blockSignals(true);
+ RS4Slider->setValue(val);
+ RS4Slider->blockSignals(false);
+ RS4SpinBox->blockSignals(true);
+ RS4SpinBox->setValue(val);
+ RS4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateRS : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateEBS(int op, int val) {
+ switch(op) {
+ case 0:
+ EBS1Slider->blockSignals(true);
+ EBS1Slider->setValue(val);
+ EBS1Slider->blockSignals(false);
+ EBS1SpinBox->blockSignals(true);
+ EBS1SpinBox->setValue(val);
+ EBS1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ EBS2Slider->blockSignals(true);
+ EBS2Slider->setValue(val);
+ EBS2Slider->blockSignals(false);
+ EBS2SpinBox->blockSignals(true);
+ EBS2SpinBox->setValue(val);
+ EBS2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ EBS3Slider->blockSignals(true);
+ EBS3Slider->setValue(val);
+ EBS3Slider->blockSignals(false);
+ EBS3SpinBox->blockSignals(true);
+ EBS3SpinBox->setValue(val);
+ EBS3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ EBS4Slider->blockSignals(true);
+ EBS4Slider->setValue(val);
+ EBS4Slider->blockSignals(false);
+ EBS4SpinBox->blockSignals(true);
+ EBS4SpinBox->setValue(val);
+ EBS4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateEBS : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateAME(int op, bool val) {
+ switch(op) {
+ case 0:
+ AME1CheckBox->blockSignals(true);
+ AME1CheckBox->setChecked(val);
+ AME1CheckBox->blockSignals(false);
+ break;
+ case 1:
+ AME2CheckBox->blockSignals(true);
+ AME2CheckBox->setChecked(val);
+ AME2CheckBox->blockSignals(false);
+ break;
+ case 2:
+ AME3CheckBox->blockSignals(true);
+ AME3CheckBox->setChecked(val);
+ AME3CheckBox->blockSignals(false);
+ break;
+ case 3:
+ AME4CheckBox->blockSignals(true);
+ AME4CheckBox->setChecked(val);
+ AME4CheckBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateAME : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateKVS(int op, int val) {
+ switch(op) {
+ case 0:
+ KVS1Slider->blockSignals(true);
+ KVS1Slider->setValue(val);
+ KVS1Slider->blockSignals(false);
+ KVS1SpinBox->blockSignals(true);
+ KVS1SpinBox->setValue(val);
+ KVS1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ KVS2Slider->blockSignals(true);
+ KVS2Slider->setValue(val);
+ KVS2Slider->blockSignals(false);
+ KVS2SpinBox->blockSignals(true);
+ KVS2SpinBox->setValue(val);
+ KVS2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ KVS3Slider->blockSignals(true);
+ KVS3Slider->setValue(val);
+ KVS3Slider->blockSignals(false);
+ KVS3SpinBox->blockSignals(true);
+ KVS3SpinBox->setValue(val);
+ KVS3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ KVS4Slider->blockSignals(true);
+ KVS4Slider->setValue(val);
+ KVS4Slider->blockSignals(false);
+ KVS4SpinBox->blockSignals(true);
+ KVS4SpinBox->setValue(val);
+ KVS4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateKVS : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateOUT(int op, int val) {
+ switch(op) {
+ case 0:
+ OUT1Slider->blockSignals(true);
+ OUT1Slider->setValue(val);
+ OUT1Slider->blockSignals(false);
+ OUT1SpinBox->blockSignals(true);
+ OUT1SpinBox->setValue(val);
+ OUT1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ OUT2Slider->blockSignals(true);
+ OUT2Slider->setValue(val);
+ OUT2Slider->blockSignals(false);
+ OUT2SpinBox->blockSignals(true);
+ OUT2SpinBox->setValue(val);
+ OUT2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ OUT3Slider->blockSignals(true);
+ OUT3Slider->setValue(val);
+ OUT3Slider->blockSignals(false);
+ OUT3SpinBox->blockSignals(true);
+ OUT3SpinBox->setValue(val);
+ OUT3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ OUT4Slider->blockSignals(true);
+ OUT4Slider->setValue(val);
+ OUT4Slider->blockSignals(false);
+ OUT4SpinBox->blockSignals(true);
+ OUT4SpinBox->setValue(val);
+ OUT4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateOUT : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateRATIO(int op, int val) {
+ switch(op) {
+ case 0:
+ CoarseRatio1SpinBox->blockSignals(true);
+ CoarseRatio1SpinBox->setValue(val/100);
+ CoarseRatio1SpinBox->blockSignals(false);
+ FineRatio1SpinBox->blockSignals(true);
+ FineRatio1SpinBox->setValue(val%100);
+ FineRatio1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ CoarseRatio2SpinBox->blockSignals(true);
+ CoarseRatio2SpinBox->setValue(val/100);
+ CoarseRatio2SpinBox->blockSignals(false);
+ FineRatio2SpinBox->blockSignals(true);
+ FineRatio2SpinBox->setValue(val%100);
+ FineRatio2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ CoarseRatio3SpinBox->blockSignals(true);
+ CoarseRatio3SpinBox->setValue(val/100);
+ CoarseRatio3SpinBox->blockSignals(false);
+ FineRatio3SpinBox->blockSignals(true);
+ FineRatio3SpinBox->setValue(val%100);
+ FineRatio3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ CoarseRatio4SpinBox->blockSignals(true);
+ CoarseRatio4SpinBox->setValue(val/100);
+ CoarseRatio4SpinBox->blockSignals(false);
+ FineRatio4SpinBox->blockSignals(true);
+ FineRatio4SpinBox->setValue(val%100);
+ FineRatio4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateRATIO : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateDET(int op, int val) {
+ switch(op) {
+ case 0:
+ DET1Slider->blockSignals(true);
+ DET1Slider->setValue(val);
+ DET1Slider->blockSignals(false);
+ DET1SpinBox->blockSignals(true);
+ DET1SpinBox->setValue(val);
+ DET1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ DET2Slider->blockSignals(true);
+ DET2Slider->setValue(val);
+ DET2Slider->blockSignals(false);
+ DET2SpinBox->blockSignals(true);
+ DET2SpinBox->setValue(val);
+ DET2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ DET3Slider->blockSignals(true);
+ DET3Slider->setValue(val);
+ DET3Slider->blockSignals(false);
+ DET3SpinBox->blockSignals(true);
+ DET3SpinBox->setValue(val);
+ DET3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ DET4Slider->blockSignals(true);
+ DET4Slider->setValue(val);
+ DET4Slider->blockSignals(false);
+ DET4SpinBox->blockSignals(true);
+ DET4SpinBox->setValue(val);
+ DET4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateDET : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateALG(int val) {
+ algorithmComboBox->blockSignals(true);
+ algorithmComboBox->setCurrentIndex(val);
+ algorithmComboBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateFEEDBACK(int val) {
+ feedbackSlider->blockSignals(true);
+ feedbackSlider->setValue(val);
+ feedbackSlider->blockSignals(false);
+ feedbackSpinBox->blockSignals(true);
+ feedbackSpinBox->setValue(val);
+ feedbackSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateSPEED(int val) {
+ LFOSpeedSlider->blockSignals(true);
+ LFOSpeedSlider->setValue(val);
+ LFOSpeedSlider->blockSignals(false);
+ LFOSpeedSpinBox->blockSignals(true);
+ LFOSpeedSpinBox->setValue(val);
+ LFOSpeedSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateDELAY(int val) {
+ LFODelaySlider->blockSignals(true);
+ LFODelaySlider->setValue(val);
+ LFODelaySlider->blockSignals(false);
+ LFODelaySpinBox->blockSignals(true);
+ LFODelaySpinBox->setValue(val);
+ LFODelaySpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePMODDEPTH(int val) {
+ PModDepthSlider->blockSignals(true);
+ PModDepthSlider->setValue(val);
+ PModDepthSlider->blockSignals(false);
+ PModDepthSpinBox->blockSignals(true);
+ PModDepthSpinBox->setValue(val);
+ PModDepthSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateAMODDEPTH(int val) {
+ AModDepthSlider->blockSignals(true);
+ AModDepthSlider->setValue(val);
+ AModDepthSlider->blockSignals(false);
+ AModDepthSpinBox->blockSignals(true);
+ AModDepthSpinBox->setValue(val);
+ AModDepthSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateSYNC(bool val) {
+ LFOSyncCheckBox->blockSignals(true);
+ LFOSyncCheckBox->setChecked(val);
+ LFOSyncCheckBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateWAVE(int val) {
+ LFOWaveComboBox->blockSignals(true);
+ LFOWaveComboBox->setCurrentIndex(val);
+ LFOWaveComboBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePMODSENS(int val) {
+ PModSensSlider->blockSignals(true);
+ PModSensSlider->setValue(val);
+ PModSensSlider->blockSignals(false);
+ PModSensSpinBox->blockSignals(true);
+ PModSensSpinBox->setValue(val);
+ PModSensSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateAMS(int val) {
+ AModSensSlider->blockSignals(true);
+ AModSensSlider->setValue(val);
+ AModSensSlider->blockSignals(false);
+ AModSensSpinBox->blockSignals(true);
+ AModSensSpinBox->setValue(val);
+ AModSensSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateTRANSPOSE(int val) {
+ transposeSlider->blockSignals(true);
+ transposeSlider->setValue(val);
+ transposeSlider->blockSignals(false);
+ transposeSpinBox->blockSignals(true);
+ transposeSpinBox->setValue(val);
+ transposeSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePOLYMODE(int val) {
+ polyMonoComboBox->blockSignals(true);
+ polyMonoComboBox->setCurrentIndex(val);
+ polyMonoComboBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePBENDRANGE(int val) {
+ pitchBendRangeSlider->blockSignals(true);
+ pitchBendRangeSlider->setValue(val);
+ pitchBendRangeSlider->blockSignals(false);
+ pitchBendRangeSpinBox->blockSignals(true);
+ pitchBendRangeSpinBox->setValue(val);
+ pitchBendRangeSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePORTAMODE(int val) {
+ PortFingerFullComboBox->blockSignals(true);
+ PortFingerFullComboBox->setCurrentIndex(val);
+ PortFingerFullComboBox->blockSignals(false);
+}
+void DeicsOnzeGui::updatePORTATIME(int val) {
+ PortamentoTimeSlider->blockSignals(true);
+ PortamentoTimeSlider->setValue(val);
+ PortamentoTimeSlider->blockSignals(false);
+ PortamentoTimeSlider->blockSignals(true);
+ PortamentoTimeSlider->setValue(val);
+ PortamentoTimeSlider->blockSignals(false);
+}
+void DeicsOnzeGui::updateFIX(int op, bool val) {
+ switch(op) {
+ case 0:
+ Fix1CheckBox->blockSignals(true);
+ Fix1CheckBox->setChecked(val);
+ Fix1CheckBox->blockSignals(false);
+ FineRatio1SpinBox->blockSignals(true);
+ FineRatio1SpinBox->setEnabled(!val);
+ FineRatio1SpinBox->blockSignals(false);
+ CoarseRatio1SpinBox->blockSignals(true);
+ CoarseRatio1SpinBox->setEnabled(!val);
+ CoarseRatio1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ Fix2CheckBox->blockSignals(true);
+ Fix2CheckBox->setChecked(val);
+ Fix2CheckBox->blockSignals(false);
+ FineRatio2SpinBox->blockSignals(true);
+ FineRatio2SpinBox->setEnabled(!val);
+ FineRatio2SpinBox->blockSignals(false);
+ CoarseRatio2SpinBox->blockSignals(true);
+ CoarseRatio2SpinBox->setEnabled(!val);
+ CoarseRatio2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ Fix3CheckBox->blockSignals(true);
+ Fix3CheckBox->setChecked(val);
+ Fix3CheckBox->blockSignals(false);
+ FineRatio3SpinBox->blockSignals(true);
+ FineRatio3SpinBox->setEnabled(!val);
+ FineRatio3SpinBox->blockSignals(false);
+ CoarseRatio3SpinBox->blockSignals(true);
+ CoarseRatio3SpinBox->setEnabled(!val);
+ CoarseRatio3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ Fix4CheckBox->blockSignals(true);
+ Fix4CheckBox->setChecked(val);
+ Fix4CheckBox->blockSignals(false);
+ FineRatio4SpinBox->blockSignals(true);
+ FineRatio4SpinBox->setEnabled(!val);
+ FineRatio4SpinBox->blockSignals(false);
+ CoarseRatio4SpinBox->blockSignals(true);
+ CoarseRatio4SpinBox->setEnabled(!val);
+ CoarseRatio4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateFIX : error switch\n");
+ }
+}
+void DeicsOnzeGui::updateFIXRANGE(int op, int val) {
+ switch(op) {
+ case 0:
+ Freq1SpinBox->blockSignals(true);
+ Freq1SpinBox->setValue(val/100);
+ //val/100 because it is still a coarse display
+ Freq1SpinBox->blockSignals(false);
+ break;
+ case 1:
+ Freq2SpinBox->blockSignals(true);
+ Freq2SpinBox->setValue(val/100);
+ Freq2SpinBox->blockSignals(false);
+ break;
+ case 2:
+ Freq3SpinBox->blockSignals(true);
+ Freq3SpinBox->setValue(val/100);
+ Freq3SpinBox->blockSignals(false);
+ break;
+ case 3:
+ Freq4SpinBox->blockSignals(true);
+ Freq4SpinBox->setValue(val/100);
+ Freq4SpinBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateFIXRANGE : error switch\n");
+ }
+}
+void DeicsOnzeGui::updateOSW(int op, int val) {
+ switch(op) {
+ case 0:
+ WaveForm1ComboBox->blockSignals(true);
+ WaveForm1ComboBox->setCurrentIndex(val);
+ WaveForm1ComboBox->blockSignals(false);
+ break;
+ case 1:
+ WaveForm2ComboBox->blockSignals(true);
+ WaveForm2ComboBox->setCurrentIndex(val);
+ WaveForm2ComboBox->blockSignals(false);
+ break;
+ case 2:
+ WaveForm3ComboBox->blockSignals(true);
+ WaveForm3ComboBox->setCurrentIndex(val);
+ WaveForm3ComboBox->blockSignals(false);
+ break;
+ case 3:
+ WaveForm4ComboBox->blockSignals(true);
+ WaveForm4ComboBox->setCurrentIndex(val);
+ WaveForm4ComboBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateOSW : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateSHFT(int op, int val) {
+ switch(op) {
+ case 0:
+ EGS1ComboBox->blockSignals(true);
+ EGS1ComboBox->setCurrentIndex(val);
+ EGS1ComboBox->blockSignals(false);
+ break;
+ case 1:
+ EGS2ComboBox->blockSignals(true);
+ EGS2ComboBox->setCurrentIndex(val);
+ EGS2ComboBox->blockSignals(false);
+ break;
+ case 2:
+ EGS3ComboBox->blockSignals(true);
+ EGS3ComboBox->setCurrentIndex(val);
+ EGS3ComboBox->blockSignals(false);
+ break;
+ case 3:
+ EGS4ComboBox->blockSignals(true);
+ EGS4ComboBox->setCurrentIndex(val);
+ EGS4ComboBox->blockSignals(false);
+ break;
+ default: printf("DeicsOnzeGui::updateSHFT : Error switch\n");
+ }
+}
+void DeicsOnzeGui::updateGLOBALDETUNE(int val) {
+ globalDetuneSlider->blockSignals(true);
+ globalDetuneSlider->setValue(val);
+ globalDetuneSlider->blockSignals(false);
+ globalDetuneSpinBox->blockSignals(true);
+ globalDetuneSpinBox->setValue(val);
+ globalDetuneSpinBox->blockSignals(false);
+ detuneKnob->blockSignals(true);
+ detuneKnob->setValue((((float)val)/((float)MAXGLOBALDETUNE))/2.0+0.5);
+ detuneKnob->blockSignals(false);
+}
+void DeicsOnzeGui::updateMASTERVOLUME(int val) {
+ masterVolSlider->blockSignals(true);
+ masterVolSlider->setValue(val);
+ masterVolSlider->blockSignals(false);
+ masterVolSpinBox->blockSignals(true);
+ masterVolSpinBox->setValue(val);
+ masterVolSpinBox->blockSignals(false);
+ volumeKnob->blockSignals(true);
+ volumeKnob->setValue(((float)val)/(float)MAXMASTERVOLUME);
+ volumeKnob->blockSignals(false);
+}
+void DeicsOnzeGui::updateCategoryName(QString cn, bool enable) {
+ categoryLineEdit->setEnabled(enable);
+ categoryLineEdit->blockSignals(true);
+ categoryLineEdit->setText(cn);
+ categoryLineEdit->blockSignals(false);
+}
+void DeicsOnzeGui::updateSubcategoryName(QString sn, bool enable) {
+ subcategoryLineEdit->setEnabled(enable);
+ subcategoryLineEdit->blockSignals(true);
+ subcategoryLineEdit->setText(sn);
+ subcategoryLineEdit->blockSignals(false);
+}
+void DeicsOnzeGui::updatePresetName(QString pn) {
+ //presetNameLineEdit->blockSignals(true);
+ //presetNameLineEdit->setText(pn);
+ //presetNameLineEdit->blockSignals(false);
+ presetNameLabel->setText(pn);
+ presetLineEdit->blockSignals(true);
+ presetLineEdit->setText(pn);
+ presetLineEdit->blockSignals(false);
+}
+void DeicsOnzeGui::updatePresetName(QString pn, bool enable) {
+ presetLineEdit->setEnabled(enable);
+ //presetNameLineEdit->setEnabled(enable);
+ updatePresetName(pn);
+}
+void DeicsOnzeGui::updateHBank(int n, bool enable) {
+ hbankSpinBox->setEnabled(enable);
+ hbankSpinBox->blockSignals(true);
+ hbankSpinBox->setValue(n+1);
+ hbankSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateLBank(int n, bool enable) {
+ lbankSpinBox->setEnabled(enable);
+ lbankSpinBox->blockSignals(true);
+ lbankSpinBox->setValue(n+1);
+ lbankSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateProg(int n, bool enable) {
+ progSpinBox->setEnabled(enable);
+ progSpinBox->blockSignals(true);
+ progSpinBox->setValue(n+1);
+ progSpinBox->blockSignals(false);
+}
+void DeicsOnzeGui::updateInitSetCheckBox(bool b) {
+ initSetCheckBox->blockSignals(true);
+ initSetCheckBox->setChecked(b);
+ initSetCheckBox->blockSignals(false);
+ pathLineEdit->setEnabled(b);
+ browsePushButton-> setEnabled(b);
+}
+void DeicsOnzeGui::updateInitSetPath(QString s) {
+ pathLineEdit->blockSignals(true);
+ pathLineEdit->setText(s);
+ pathLineEdit->blockSignals(false);
+}
+void DeicsOnzeGui::updateBrightness(int val) {
+ brightnessKnob->blockSignals(true);
+ brightnessKnob->setValue((float)val/((float)MAXFINEBRIGHTNESS));
+ brightnessKnob->blockSignals(false);
+}
+void DeicsOnzeGui::updateModulation(int val) {
+ modulationKnob->blockSignals(true);
+ modulationKnob->setValue((float)val/((float)MAXMODULATION));
+ modulationKnob->blockSignals(false);
+}
+void DeicsOnzeGui::updateAttack(int val) {
+ attackKnob->blockSignals(true);
+ attackKnob->setValue((float)val/((float)MAXATTACK));
+ attackKnob->blockSignals(false);
+}
+void DeicsOnzeGui::updateRelease(int val) {
+ releaseKnob->blockSignals(true);
+ releaseKnob->setValue((float)val/((float)MAXRELEASE));
+ releaseKnob->blockSignals(false);
+}
+//--------------------------------------------------------------
+// updatePreset
+//--------------------------------------------------------------
+void DeicsOnzeGui::updatePreset(Preset* p) {
+ //global
+ updateMASTERVOLUME(_deicsOnze->getMasterVol()); //to change
+ updateBrightness(p->brightness);
+ updateModulation(p->modulation);
+ updatePresetName(p->name.c_str());
+ updateFEEDBACK(p->feedback);
+ updateGLOBALDETUNE(p->globalDetune);
+ updateAttack(p->attack);
+ updateRelease(p->release);
+ updateWAVE((int)p->lfo.wave);
+ updateSPEED(p->lfo.speed);
+ updateDELAY(p->lfo.delay);
+ updatePMODDEPTH(p->lfo.pModDepth);
+ updatePMODSENS(p->sensitivity.pitch);
+ updateAMODDEPTH(p->lfo.aModDepth);
+ updateAMS(p->sensitivity.amplitude);
+ updateTRANSPOSE(p->function.transpose);
+ updateALG((int)p->algorithm);
+ updatePBENDRANGE(p->function.pBendRange);
+ //pitch envelope
+ PitchEg* pe=&(p->pitchEg);
+ pitchEnvelopeGraph
+ ->env2Points(pe->pl1, pe->pl2, pe->pl3, pe->pr1, pe->pr2, pe->pr3);
+ pitchEnvelopeGraph->updateEnv();
+ updatePL1(pe->pl1);
+ updatePL2(pe->pl2);
+ updatePL3(pe->pl3);
+ updatePR1(pe->pr1);
+ updatePR2(pe->pr2);
+ updatePR3(pe->pr3);
+ //function
+ updateFcVolume(p->function.fcVolume);
+ updateFcPitch(p->function.fcPitch);
+ updateFcAmplitude(p->function.fcAmplitude);
+ updateMwPitch(p->function.mwPitch);
+ updateMwAmplitude(p->function.mwAmplitude);
+ updateBcPitch(p->function.bcPitch);
+ updateBcAmplitude(p->function.bcAmplitude);
+ updateBcPitchBias(p->function.bcPitchBias);
+ updateBcEgBias(p->function.bcEgBias);
+ updateAtPitch(p->function.atPitch);
+ updateAtAmplitude(p->function.atAmplitude);
+ updateAtPitchBias(p->function.atPitchBias);
+ updateAtEgBias(p->function.atEgBias);
+ updateReverbRate(p->function.reverbRate);
+ for(int k=0; k<NBROP; k++) {
+ //envelope
+ Eg* _eg=&(p->eg[k]);
+ envelopeGraph[k]
+ ->env2Points(_eg->ar, _eg->d1r, _eg->d1l, _eg->d2r, _eg->rr);
+ envelopeGraph[k]->updateEnv();
+ updateAR(k, _eg->ar);
+ updateD1R(k, _eg->d1r);
+ updateD1L(k, _eg->d1l);
+ updateD2R(k, _eg->d2r);
+ updateRR(k, _eg->rr);
+ //scaling
+ updateLS(k, p->scaling.level[k]);
+ updateRS(k, p->scaling.rate[k]);
+ //Volume
+ updateOUT(k, p->outLevel[k]);
+ //Ratio and Frequency
+ updateRATIO(k, (int)(100*p->frequency[k].ratio));
+ updateFIXRANGE(k, (int)(100*p->frequency[k].freq));
+ updateFIX(k, p->frequency[k].isFix);
+ //Sensitivity
+ updateAME(k, p->sensitivity.ampOn[k]);
+ updateEBS(k, p->sensitivity.egBias[k]);
+ updateKVS(k, p->sensitivity.keyVelocity[k]);
+ //detune
+ updateDET(k, p->detune[k]);
+ //Waveform
+ updateOSW(k, (int)p->oscWave[0]);
+ }
+
+}
+void DeicsOnzeGui::updatePreset() {
+ updatePreset(_deicsOnze->_preset);
+}
+
+void DeicsOnzeGui::setPreset(int hbank, int lbank, int prog) {
+ QTreeWidgetItem* cat = categoryListView->currentItem();
+ QTreeWidgetItem* sub = subcategoryListView->currentItem();
+ QTreeWidgetItem* pre = presetListView->currentItem();
+ //select category, subcategory, preset
+ //category
+ QTreeWidgetItem* qcat=categoryListView->findItems(num3Digits(hbank+1),
+ Qt::MatchExactly).at(0);
+ //if the category is different than the last one then select the new one
+ if(!cat || qcat!= cat) {
+ if(qcat) {
+ categoryListView->setItemSelected(qcat, true);
+ categoryListView->scrollToItem(qcat);
+ setEnabledPreset(true);
+ }
+ else {
+ updateCategoryName(QString("NONE"), false);
+ updateHBank(hbank, false);
+ categoryListView->clearSelection();
+ subcategoryListView->clear();
+ setEnabledPreset(false);
+ }
+ }
+ //subcategory
+ if(cat) {
+ QTreeWidgetItem* qsub;
+ qsub=subcategoryListView->findItems(num3Digits(lbank+1),
+ Qt::MatchExactly).at(0);
+ if(!sub || qsub!=sub) {
+ if(qsub) {
+ subcategoryListView->setItemSelected(qsub, true);
+ subcategoryListView->scrollToItem(qsub);
+ setEnabledPreset(true);
+ }
+ else {
+ updateSubcategoryName(QString("NONE"), false);
+ updateLBank(lbank, false);
+ subcategoryListView->clearSelection();
+ presetListView->clear();
+ setEnabledPreset(false);
+ }
+ }
+ }
+ else {
+ updateSubcategoryName(QString("NONE"), false);
+ updateLBank(lbank, false);
+ subcategoryListView->clearSelection();
+ presetListView->clear();
+ setEnabledPreset(false);
+ }
+ //preset
+ if(sub) {
+ QTreeWidgetItem* qpre=presetListView->findItems(num3Digits(prog+1),
+ Qt::MatchExactly).at(0);
+ if(qpre) {
+ presetListView->blockSignals(true);
+ presetListView->setItemSelected(qpre, true);
+ presetListView->blockSignals(false);
+ presetListView->scrollToItem(qpre);
+ updatePresetName(qpre->text(1), true);
+ updateProg(prog, true);
+ pre=(QTreePreset*) qpre;
+ setEnabledPreset(true);
+ }
+ else {
+ updatePresetName(QString("INITVOICE"), false);
+ updateProg(prog, false);
+ presetListView->clearSelection();
+ setEnabledPreset(false);
+ }
+ }
+ else {
+ updatePresetName(QString("INITVOICE"), false);
+ updateProg(prog, false);
+ presetListView->clearSelection();
+ setEnabledPreset(false);
+ }
+}
diff --git a/muse/synti/deicsonze/deicsonzegui.h b/muse/synti/deicsonze/deicsonzegui.h
new file mode 100644
index 00000000..09e463db
--- /dev/null
+++ b/muse/synti/deicsonze/deicsonzegui.h
@@ -0,0 +1,453 @@
+//===========================================================================
+//
+// DeicsOnze an emulator of the YAMAHA DX11 synthesizer
+//
+// Version 0.3
+//
+// deicsonzegui.h
+//
+//
+// Copyright (c) 2004-2006 Nil Geisweiller
+//
+//
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+#ifndef __DEICSONZEGUI_H
+#define __DEICSONZEGUI_H
+
+#include "deicsonze.h"
+#include "deicsonzepreset.h"
+#include "ui_deicsonzegui.h"
+#include "libsynti/gui.h"
+
+//Envelope Gui constants
+#define XOFFSET 2
+#define YOFFSET 2
+#define PENWIDTH 2
+#define DOTWIDTH 3
+#define DRAGWIDTH 6 //size of the mousetracking threshold
+//pitch envelope constants
+#define WALLWIDTH 6
+#define PR1WIDTH (width()/3-9)
+#define PR2WIDTH PR1WIDTH
+#define PR3WIDTH PR1WIDTH
+#define PL1HEIGHT (height()-4)
+#define PL2HEIGHT PL1HEIGHT
+#define PL3HEIGHT PL1HEIGHT
+#define MAXPWIDTH PR1WIDTH+WALLWIDTH+PR2WIDTH+WALLWIDTH+PR3WIDTH+WALLWIDTH+PR1WIDTH
+#define MAXPHEIGHT PL1HEIGHT
+#define STEPVALUE 10
+//amplitude envelope constants
+#define ARWIDTH (width()/4-1)
+#define D1RWIDTH ARWIDTH
+#define D1LHEIGHT (height()-2)
+#define D2RWIDTH ARWIDTH
+#define RRWIDTH ARWIDTH
+#define MAXWIDTH ARWIDTH+D1RWIDTH+D1RWIDTH+RRWIDTH
+#define MAXHEIGHT D1LHEIGHT
+
+//COLOR
+#define TCOLOR QColor(0, 0, 0) //text color
+#define BCOLOR QColor(210, 180, 90) //background color
+#define ETCOLOR QColor(0, 150, 0) //edit text color
+#define EBCOLOR QColor(255, 255, 30) //edit background color
+
+class DeicsOnze;
+class QFramePitchEnvelope;
+class QFrameEnvelope;
+
+class QTreeCategory:public QTreeWidgetItem {
+ public:
+ Category* _category;
+ QTreeCategory(QTreeWidget* p, QString shbank, QString l, Category* c)
+ :QTreeWidgetItem(p) {
+ setText(0, shbank);
+ setText(1, l);
+ _category=c;
+ };
+};
+
+class QTreeSubcategory:public QTreeWidgetItem {
+ public:
+ Subcategory* _subcategory;
+ QTreeSubcategory(QTreeWidget* p, QString slbank,
+ QString l, Subcategory* s)
+ :QTreeWidgetItem(p) {
+ setText(0, slbank);
+ setText(1, l);
+ _subcategory=s;
+ };
+};
+
+class QTreePreset:public QTreeWidgetItem {
+ public:
+ Preset* _preset;
+ QTreePreset(QTreeWidget* pa, QString sprog, QString l, Preset* p)
+ :QTreeWidgetItem(pa) {
+ setText(0, sprog);
+ setText(1, l);
+ _preset=p;
+ };
+};
+
+//---------------------------------------------------------
+// DeicsOnzeGui
+//---------------------------------------------------------
+class DeicsOnzeGui : public QDialog, public Ui::DeicsOnzeGuiBase, public MessGui {
+ bool _enabledPreset;
+
+ QFramePitchEnvelope* pitchEnvelopeGraph;
+ QFrameEnvelope* envelopeGraph[NBROP];
+
+ Q_OBJECT
+ QString lastDir;
+ private slots:
+ void readMessage(int);
+ void setNbrVoices(int);
+ void setSaveOnlyUsed(bool);
+ void setSaveOnlyUsedComp(bool);
+ void setSaveConfig(bool);
+ void setMidiInCh(int);
+ void setQuality(const QString&);
+ void saveConfiguration();
+ void saveDefaultConfiguration();
+ void loadConfiguration();
+ void loadConfiguration(QString s);
+ //load init set
+ void setIsInitSet(bool);
+ void setInitSetPath(const QString&);
+ void setBrowseInitSetPath();
+ //quick edit
+ void setVolKnob(float val);
+ void setBrightnessKnob(float val);
+ void setModulationKnob(float val);
+ void setDetuneKnob(float val);
+ void setAttackKnob(float val);
+ void setReleaseKnob(float val);
+ //Color
+ void setRedColor(int);
+ void setGreenColor(int);
+ void setBlueColor(int);
+ void setRGBSliders(QListWidgetItem*);
+ void setTextColor(const QColor &);
+ void setBackgroundColor(const QColor &);
+ void setEditTextColor(const QColor &);
+ void setEditBackgroundColor(const QColor &);
+ //New Delete Load Save
+ void deleteSetDialog();
+ void loadSetDialog();
+ void saveSetDialog();
+ void deleteCategoryDialog();
+ void newCategoryDialog();
+ void loadCategoryDialog();
+ void saveCategoryDialog();
+ void deleteSubcategoryDialog();
+ void newSubcategoryDialog();
+ void loadSubcategoryDialog();
+ void saveSubcategoryDialog();
+ void newPresetDialog();
+ void loadPresetDialog();
+ void deletePresetDialog();
+ void savePresetDialog();
+ //popupMenu
+ void categoryPopupMenu(const QPoint&);
+ void subcategoryPopupMenu(const QPoint&);
+ void presetPopupMenu(const QPoint&);
+ //Preset and bank
+ void setPresetName(const QString&);
+ void setSubcategoryName(const QString&);
+ void setCategoryName(const QString&);
+ void setHBank(int);
+ void setLBank(int);
+ void setProg(int);
+ //Global
+ void setMasterVol(int);
+ void setFeedback(int);
+ void setLfoWave(int);
+ void setLfoSpeed(int);
+ void setLfoDelay(int);
+ void setLfoPModDepth(int);
+ void setLfoPitchSens(int);
+ void setLfoAModDepth(int);
+ void setLfoAmpSens(int);
+ void setTranspose(int);
+ void setGlobalDetune(int);
+ void setAlgorithm(int);
+ void setPitchBendRange(int);
+ //Pitch Envelope
+ void setPL1(int);
+ void setPL2(int);
+ void setPL3(int);
+ void setPR1(int);
+ void setPR2(int);
+ void setPR3(int);
+ //Function
+ void setFcVolume(int);
+ void setFcPitch(int);
+ void setFcAmplitude(int);
+ void setMwPitch(int);
+ void setMwAmplitude(int);
+ void setBcPitch(int);
+ void setBcAmplitude(int);
+ void setBcPitchBias(int);
+ void setBcEgBias(int);
+ void setAtPitch(int);
+ void setAtAmplitude(int);
+ void setAtPitchBias(int);
+ void setAtEgBias(int);
+ void setReverbRate(int);
+ //envelope
+ void setAR1(int val);
+ void setD1R1(int val);
+ void setD1L1(int val);
+ void setD2R1(int val);
+ void setRR1(int val);
+ void setAR2(int val);
+ void setD1R2(int val);
+ void setD1L2(int val);
+ void setD2R2(int val);
+ void setRR2(int val);
+ void setAR3(int val);
+ void setD1R3(int val);
+ void setD1L3(int val);
+ void setD2R3(int val);
+ void setRR3(int val);
+ void setAR4(int val);
+ void setD1R4(int val);
+ void setD1L4(int val);
+ void setD2R4(int val);
+ void setRR4(int val);
+ //scaling
+ void setLS1(int val);
+ void setRS1(int val);
+ void setLS2(int val);
+ void setRS2(int val);
+ void setLS3(int val);
+ void setRS3(int val);
+ void setLS4(int val);
+ void setRS4(int val);
+ //vol
+ void setVol1(int val);
+ void setVol2(int val);
+ void setVol3(int val);
+ void setVol4(int val);
+ //Ratio and Frequency
+ void setCoarseRatio1(int val);
+ void setFineRatio1(int val);
+ void setFreq1(int val);
+ void setFix1(bool f);
+ void setCoarseRatio2(int val);
+ void setFineRatio2(int val);
+ void setFreq2(int val);
+ void setFix2(bool f);
+ void setCoarseRatio3(int val);
+ void setFineRatio3(int val);
+ void setFreq3(int val);
+ void setFix3(bool f);
+ void setCoarseRatio4(int val);
+ void setFineRatio4(int val);
+ void setFreq4(int val);
+ void setFix4(bool f);
+ //Sensitivity
+ void setAME1(bool val);
+ void setEBS1(int val);
+ void setKVS1(int val);
+ void setAME2(bool val);
+ void setEBS2(int val);
+ void setKVS2(int val);
+ void setAME3(bool val);
+ void setEBS3(int val);
+ void setKVS3(int val);
+ void setAME4(bool val);
+ void setEBS4(int val);
+ void setKVS4(int val);
+ //detune
+ void setDET1(int val);
+ void setDET2(int val);
+ void setDET3(int val);
+ void setDET4(int val);
+ //WaveForm
+ void setWaveForm1(int);
+ void setWaveForm2(int);
+ void setWaveForm3(int);
+ void setWaveForm4(int);
+ //category subcategory preset
+ void setSet(void); //display the set, that is the category list
+ void setCategory(Category*);
+ void setCategory(QTreeWidgetItem*);
+ void setSubcategory(Subcategory*);
+ void setSubcategory(QTreeWidgetItem*);
+ void setPreset(QTreeWidgetItem*);
+ public:
+ virtual void processEvent(const MidiEvent&);
+ void setPreset(int hbank, int lbank, int prog);
+ //update the gui
+ void setEnabledPreset(bool b);
+ void updateNbrVoices(int val);
+ void updateMidiInCh(int val);
+ void updateQuality(int val);
+ void updateSaveOnlyUsed(bool);
+ void updateSaveConfig(bool);
+ //update load init set
+ void updateInitSetCheckBox(bool);
+ void updateInitSetPath(QString);
+ //update quick edit
+ void updateBrightness(int val);
+ void updateModulation(int val);
+ void updateAttack(int val);
+ void updateRelease(int val);
+ //update pitch envelope
+ void updatePL1(int val);
+ void updatePL2(int val);
+ void updatePL3(int val);
+ void updatePR1(int val);
+ void updatePR2(int val);
+ void updatePR3(int val);
+ //update function
+ void updateFcVolume(int val);
+ void updateFcPitch(int val);
+ void updateFcAmplitude(int val);
+ void updateMwPitch(int val);
+ void updateMwAmplitude(int val);
+ void updateBcPitch(int val);
+ void updateBcAmplitude(int val);
+ void updateBcPitchBias(int val);
+ void updateBcEgBias(int val);
+ void updateAtPitch(int val);
+ void updateAtAmplitude(int val);
+ void updateAtPitchBias(int val);
+ void updateAtEgBias(int val);
+ void updateReverbRate(int val);
+ //update envelope
+ void updateAR(int op, int val);
+ void updateD1R(int op, int val);
+ void updateD2R(int op, int val);
+ void updateRR(int op, int val);
+ void updateD1L(int op, int val);
+ //update scale
+ void updateLS(int op, int val);
+ void updateRS(int op, int val);
+ void updateEBS(int op, int val);
+ void updateAME(int op, bool val);
+ void updateKVS(int op, int val);
+ void updateOUT(int op, int val);
+ void updateRATIO(int op, int val);
+ void updateDET(int op, int val);
+ //update global
+ void updateALG(int val);
+ void updateFEEDBACK(int val);
+ void updateSPEED(int val);
+ void updateDELAY(int val);
+ void updatePMODDEPTH(int val);
+ void updateAMODDEPTH(int val);
+ void updateSYNC(bool val);
+ void updateWAVE(int val);
+ void updatePMODSENS(int val);
+ void updateAMS(int val);
+ void updateTRANSPOSE(int val);
+ void updatePOLYMODE(int val);
+ void updatePBENDRANGE(int val);
+ void updatePORTAMODE(int val);
+ void updatePORTATIME(int val);
+ void updateFIX(int op, bool val);
+ void updateFIXRANGE(int op, int val);
+ void updateOSW(int op, int val);
+ void updateSHFT(int op, int val);
+ void updateGLOBALDETUNE(int val);
+ void updateMASTERVOLUME(int val);
+ void updateCategoryName(QString cn, bool enable);
+ void updateSubcategoryName(QString sn, bool enable);
+ void updatePresetName(QString pn, bool enable);
+ void updatePresetName(QString pn);
+ void updateHBank(int hbank, bool enable);
+ void updateLBank(int lbank, bool enable);
+ void updateProg(int prog, bool enable);
+ void updatePreset(Preset* p);
+ void updatePreset(void); //update gui following the current preset
+ QString num3Digits(int);
+ DeicsOnzeGui(DeicsOnze*);
+
+ QColor* tColor; //text color
+ QColor* bColor; //background color
+ QColor* etColor;//edit text color
+ QColor* ebColor;//edit background color
+ QColor* curColor;//current color
+
+ DeicsOnze* _deicsOnze;
+};
+
+class QFramePitchEnvelope:private QFrame {
+ QPoint startlinkP1, //first point
+ P1linkP2, //point linking P1 to P2
+ P2linkP3, //point linking P2 to P3
+ P3linkEnd; //point linking P3 to End
+ bool isStartlinkP1Edit;
+ bool isP1linkP2Edit;
+ bool isP2linkP3Edit;
+ bool isP3linkEndEdit;
+ public:
+ DeicsOnzeGui* _deicsOnzeGui;
+ QFramePitchEnvelope(QWidget* parent, DeicsOnzeGui* dog):QFrame(parent){
+ _deicsOnzeGui = dog;
+ isStartlinkP1Edit=false;
+ isP1linkP2Edit=false;
+ isP2linkP3Edit=false;
+ isP3linkEndEdit=false;
+ };
+ void env2Points(int pl1, int pl2, int pl3, int pr1, int pr2, int pr3);
+ void updateEnv(void) {update();};
+ protected:
+ void paintEvent(QPaintEvent* e);
+ void mouseMoveEvent(QMouseEvent* e);
+ void mousePressEvent(QMouseEvent * e);
+ void mouseReleaseEvent(QMouseEvent * e);
+};
+
+class QFrameEnvelope:private QFrame {
+ unsigned char op; //operator number, between 0 and 3
+ QPoint startlinkAR, //first point
+ ARlinkD1, //point linking AR to D1
+ D1linkD2, //point linking D1 to D2
+ D2linkRR, //point linking D2 to RR
+ RRlinkEnd; //last point
+ bool isARlinkD1Edit;
+ bool isD1linkD2Edit;
+ bool isD2linkRREdit;
+ bool isRRlinkEndEdit;
+ public:
+ DeicsOnzeGui* _deicsOnzeGui;
+ QFrameEnvelope(QWidget* parent, DeicsOnzeGui* dog, unsigned char k):QFrame(parent){
+ _deicsOnzeGui = dog;
+ isARlinkD1Edit=false;
+ isD1linkD2Edit=false;
+ isD2linkRREdit=false;
+ isRRlinkEndEdit=false;
+ op = k;
+ //setGeometry(XOFFSET, YOFFSET, XOFFSET+MAXWIDTH, MAXHEIGHT);
+ //setMouseTracking(true);
+ };
+ void env2Points(int ar, int d1r, int d1l, int d2r, int rr);
+ void updateEnv(void) {update();};
+ protected:
+ void paintEvent(QPaintEvent* e);
+ void mouseMoveEvent(QMouseEvent* e);
+ void mousePressEvent(QMouseEvent * e);
+ void mouseReleaseEvent(QMouseEvent * e);
+};
+
+#endif /* __DEICSONZEGUI_H */
diff --git a/muse/synti/deicsonze/deicsonzegui.ui b/muse/synti/deicsonze/deicsonzegui.ui
new file mode 100644
index 00000000..3e8623e4
--- /dev/null
+++ b/muse/synti/deicsonze/deicsonzegui.ui
@@ -0,0 +1,7752 @@
+<ui version="4.0" >
+ <author>Nil Geisweiller</author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>DeicsOnzeGuiBase</class>
+ <widget class="QDialog" name="DeicsOnzeGuiBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>544</width>
+ <height>570</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>9</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="windowTitle" >
+ <string>DeicsOnze</string>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>false</bool>
+ </property>
+ <property name="modal" >
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="quickEditGroupBox" >
+ <property name="minimumSize" >
+ <size>
+ <width>16</width>
+ <height>104</height>
+ </size>
+ </property>
+ <property name="title" >
+ <string>Quick Edit</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="3" >
+ <widget class="Awl::Knob" name="detuneKnob" />
+ </item>
+ <item row="1" column="3" >
+ <widget class="QLabel" name="detuneLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text" >
+ <string>Detune</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="Awl::Knob" name="attackKnob" />
+ </item>
+ <item row="1" column="4" >
+ <widget class="QLabel" name="attackTimeLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text" >
+ <string>Attack</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="5" >
+ <widget class="QLabel" name="releaseLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text" >
+ <string>Release</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5" >
+ <widget class="Awl::Knob" name="releaseKnob" />
+ </item>
+ <item row="0" column="2" >
+ <widget class="Awl::Knob" name="modulationKnob" />
+ </item>
+ <item row="1" column="2" >
+ <widget class="QLabel" name="modulationLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text" >
+ <string>Modulation</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="6" >
+ <widget class="QLabel" name="currentPresetLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text" >
+ <string>Current preset</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="GlobalVolumeLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text" >
+ <string>Volume</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="Awl::Knob" name="volumeKnob" >
+ <property name="maxValue" >
+ <double>1</double>
+ </property>
+ <property name="lineStep" >
+ <double>0.1</double>
+ </property>
+ <property name="pageStep" >
+ <double>0.2</double>
+ </property>
+ <property name="scaleSize" >
+ <number>270</number>
+ </property>
+ <property name="markSize" >
+ <number>6</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="Awl::Knob" name="brightnessKnob" />
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="brightnessLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text" >
+ <string>Brightness</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="6" >
+ <widget class="QLabel" name="presetNameLabel" >
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>9</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text" >
+ <string>INITVOICE</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QTabWidget" name="deicsOnzeTabWidget" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor" >
+ <cursor>0</cursor>
+ </property>
+ <property name="toolTip" >
+ <string/>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="tabShape" >
+ <enum>QTabWidget::Rounded</enum>
+ </property>
+ <widget class="QWidget" name="PresetsTab" >
+ <attribute name="title" >
+ <string>&amp;Presets</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="5" >
+ <widget class="QLineEdit" name="presetLineEdit" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>INITVOICE</string>
+ </property>
+ <property name="maxLength" >
+ <number>12</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="6" >
+ <widget class="QLabel" name="presentTextLAbel" >
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>8</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="text" >
+ <string>DeicsOnze v0.3 Copyright (c) 2004-2006 Nil Geisweiller. Published under GPL licence.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QTreeWidget" name="subcategoryListView" >
+ <property name="contextMenuPolicy" >
+ <enum>Qt::CustomContextMenu</enum>
+ </property>
+ <property name="rootIsDecorated" >
+ <bool>false</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>LBank</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Subcategory</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item row="1" column="4" colspan="2" >
+ <widget class="QTreeWidget" name="presetListView" >
+ <property name="contextMenuPolicy" >
+ <enum>Qt::CustomContextMenu</enum>
+ </property>
+ <property name="rootIsDecorated" >
+ <bool>false</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>Prog</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Preset</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QTreeWidget" name="categoryListView" >
+ <property name="contextMenuPolicy" >
+ <enum>Qt::CustomContextMenu</enum>
+ </property>
+ <property name="layoutDirection" >
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>1</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>0</number>
+ </property>
+ <property name="rootIsDecorated" >
+ <bool>false</bool>
+ </property>
+ <property name="uniformRowHeights" >
+ <bool>true</bool>
+ </property>
+ <property name="columnCount" >
+ <number>2</number>
+ </property>
+ <column>
+ <property name="text" >
+ <string>HBank</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Category</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="progSpinBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Program numerous</string>
+ </property>
+ <property name="maximum" >
+ <number>128</number>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLineEdit" name="subcategoryLineEdit" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>NONE</string>
+ </property>
+ <property name="maxLength" >
+ <number>12</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="lbankSpinBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Bank numerous</string>
+ </property>
+ <property name="maximum" >
+ <number>128</number>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLineEdit" name="categoryLineEdit" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>NONE</string>
+ </property>
+ <property name="maxLength" >
+ <number>12</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="hbankSpinBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Bank numerous</string>
+ </property>
+ <property name="maximum" >
+ <number>128</number>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="GlobalTab" >
+ <attribute name="title" >
+ <string>&amp;Global</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item rowspan="2" row="1" column="1" >
+ <widget class="QGroupBox" name="pitchEnvGroupBox" >
+ <property name="title" >
+ <string>Pitch Envelope</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="PL3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>PL3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="PL2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>PL2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="PL1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>PL1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="PR1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>PR1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QLabel" name="PR2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>PR2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QLabel" name="PR3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>PR3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="4" >
+ <widget class="QFrame" name="pitchEnvFrame" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="PL1SpinBox" >
+ <property name="toolTip" >
+ <string>Pitch modulation depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>2</number>
+ </property>
+ <property name="value" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="PL2SpinBox" >
+ <property name="toolTip" >
+ <string>Pitch modulation depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>2</number>
+ </property>
+ <property name="value" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="PL3SpinBox" >
+ <property name="toolTip" >
+ <string>Pitch modulation depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>2</number>
+ </property>
+ <property name="value" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="PR1SpinBox" >
+ <property name="toolTip" >
+ <string>Pitch modulation depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>3</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QSpinBox" name="PR3SpinBox" >
+ <property name="toolTip" >
+ <string>Pitch modulation depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>3</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QSpinBox" name="PR2SpinBox" >
+ <property name="toolTip" >
+ <string>Pitch modulation depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>3</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="LFOGroupBox" >
+ <property name="title" >
+ <string>LFO</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QCheckBox" name="LFOSyncCheckBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="text" >
+ <string>LFO Sync</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="PModSensSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch modulation sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSlider" name="PModSensSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Modulation Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" colspan="3" >
+ <widget class="QSlider" name="LFODelaySlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>LFO Delay</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="4" >
+ <widget class="QSpinBox" name="LFODelaySpinBox" >
+ <property name="toolTip" >
+ <string>LFO delay</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="4" >
+ <widget class="QSpinBox" name="LFOSpeedSpinBox" >
+ <property name="toolTip" >
+ <string>LFO speed</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4" >
+ <widget class="QSpinBox" name="AModDepthSpinBox" >
+ <property name="toolTip" >
+ <string>Amplitude modulation depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4" >
+ <widget class="QSpinBox" name="PModDepthSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch modulation depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QSpinBox" name="AModSensSpinBox" >
+ <property name="toolTip" >
+ <string>Amplitude modulation sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QSlider" name="AModSensSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Amplitude Modulation Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QLabel" name="AModSensLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>AMS</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QComboBox" name="LFOWaveComboBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>LFO Waveform</string>
+ </property>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/sawUp.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/square.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/triangl.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/SHold.png</iconset>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="3" >
+ <widget class="QSlider" name="PModDepthSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Modulation Depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="PModDepthLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>PMD</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" colspan="3" >
+ <widget class="QSlider" name="LFOSpeedSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>LFO Speed</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" colspan="3" >
+ <widget class="QSlider" name="AModDepthSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Modulation Depth</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="AModDepthLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>AMD</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="LFOSpeedLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Speed</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLabel" name="LFODelayLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Delay</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="PModSensLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>PMS</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QGroupBox" name="ModulationMatrixGroupBox" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="title" >
+ <string>Modulation Matrix</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QComboBox" name="algorithmComboBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Modulation Matrix</string>
+ </property>
+ <property name="whatsThis" >
+ <string>&lt;b>Algorithm 1&lt;/b> : &lt;i>Op 1&lt;/i> modulated by &lt;i>Op 2&lt;/i> modulated by &lt;i>Op 3&lt;/i> modulated by &lt;i>Op 4&lt;/i>&lt;br>
+&lt;b>Algorithm 2&lt;/b> : &lt;i>Op 1&lt;/i> modulated by &lt;i>Op 2&lt;/i> modulated by both &lt;i>Op 3&lt;/i> and &lt;i>Op 4&lt;/i>&lt;br>
+&lt;b>Algorithm 3&lt;/b> : &lt;i>Op 1&lt;/i> modulated by both &lt;i>Op 4&lt;/i> and &lt;i>Op 2&lt;/i> modulated by &lt;i>Op 3&lt;/i>&lt;br>
+&lt;b>Algorithm 4&lt;/b> : &lt;i>Op 1&lt;/i> modulated by both &lt;i>Op 2&lt;/i> and &lt;i>Op 3&lt;/i> modulated by &lt;i>Op 4&lt;/i>&lt;br>
+&lt;b>Algorithm 5&lt;/b> : (&lt;i>Op 1&lt;/i> modulated by &lt;i>Op 2&lt;/i>) add to (&lt;i>Op 3&lt;/i> modulated by &lt;i>Op 4&lt;/i>) &lt;br>
+&lt;b>Algorithm 6&lt;/b> : addition of the three &lt;i>Op 1, 2, 3&lt;/i> all modulated by &lt;i>Op 4&lt;/i>&lt;br>
+&lt;b>Algorithm 7&lt;/b> : addition of the three &lt;i>Op 1, 2, 3&lt;/i> with &lt;i>Op 3&lt;/i> modulated by &lt;i>Op 4&lt;/i>&lt;br>
+&lt;b>Algorithm 8&lt;/b> : addition of the four &lt;i>Op 1, 2, 3, 4&lt;/i></string>
+ </property>
+ <item>
+ <property name="text" >
+ <string>Algo1</string>
+ </property>
+ <property name="icon" >
+ <iconset>pics/algo1.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Algo2</string>
+ </property>
+ <property name="icon" >
+ <iconset>pics/algo3.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Algo3</string>
+ </property>
+ <property name="icon" >
+ <iconset>pics/algo3.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Algo4</string>
+ </property>
+ <property name="icon" >
+ <iconset>pics/algo4.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Algo5</string>
+ </property>
+ <property name="icon" >
+ <iconset>pics/algo5.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Algo6</string>
+ </property>
+ <property name="icon" >
+ <iconset>pics/algo6.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Algo7</string>
+ </property>
+ <property name="icon" >
+ <iconset>pics/algo7.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Algo8</string>
+ </property>
+ <property name="icon" >
+ <iconset>pics/algo8.png</iconset>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="masterVolGroupBox" >
+ <property name="title" >
+ <string>Master Volume</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSlider" name="masterVolSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Master Volume</string>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="value" >
+ <number>64</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="masterVolSpinBox" >
+ <property name="toolTip" >
+ <string>Master volume</string>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="value" >
+ <number>64</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QGroupBox" name="FeedbackGroupBox" >
+ <property name="toolTip" >
+ <string/>
+ </property>
+ <property name="title" >
+ <string>Op4 Feedback</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSlider" name="feedbackSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Feedback level of the operator 4</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="feedbackSpinBox" >
+ <property name="toolTip" >
+ <string>Feedback level of the operator 4</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Op1Tab" >
+ <attribute name="title" >
+ <string>Op &amp;1</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="3" >
+ <widget class="QGroupBox" name="Scaling1GroupBox" >
+ <property name="title" >
+ <string>Scaling 1</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="LS1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>LS1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="RS1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>RS1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="RS1Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Rate Scaling</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QSlider" name="LS1Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Level Scaling</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="LS1SpinBox" >
+ <property name="toolTip" >
+ <string>Level Scaling</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="RS1SpinBox" >
+ <property name="toolTip" >
+ <string>Rate Scaling</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2" >
+ <widget class="QGroupBox" name="Env1GroupBox" >
+ <property name="title" >
+ <string>Amplitude Envelope 1</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="4" >
+ <widget class="QLabel" name="RR1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>RR1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="D1R1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D1R1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QLabel" name="D1L1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D1L1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QLabel" name="D2R1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D2R1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="RR1SpinBox" >
+ <property name="toolTip" >
+ <string>Release Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>15</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="D2R1SpinBox" >
+ <property name="toolTip" >
+ <string>2° Decay Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="D1L1SpinBox" >
+ <property name="toolTip" >
+ <string>1° Decay Level</string>
+ </property>
+ <property name="maximum" >
+ <number>15</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="D1R1SpinBox" >
+ <property name="toolTip" >
+ <string>1° Decay Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="AR1SpinBox" >
+ <property name="toolTip" >
+ <string>Attack Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="AR1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>AR1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="5" >
+ <widget class="QFrame" name="envelope1Frame" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QGroupBox" name="DetWaveEGS1GroupBox" >
+ <property name="title" >
+ <string>Detune, OSCWave, EGShift 1</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="DET1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>DET1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="DET1SpinBox" >
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="minimum" >
+ <number>-3</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QSlider" name="DET1Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="minimum" >
+ <number>-3</number>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QComboBox" name="EGS1ComboBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>EG Shift</string>
+ </property>
+ <item>
+ <property name="text" >
+ <string>96dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>48dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>24dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>12dB</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QComboBox" name="WaveForm1ComboBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Wave form</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Wave form 1 = &lt;i>sin(&lt;b>t&lt;/b>)&lt;/i>&lt;br>
+Wave form 2 = &lt;i>sin(&lt;b>t&lt;/b>)*abs(sin(&lt;b>t&lt;/b>))&lt;/i>&lt;br>
+Wave form 3 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(&lt;b>t&lt;/b>) else 0&lt;/i>&lt;br>
+Wave form 4 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(&lt;b>t&lt;/b>)*abs(sin(&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 5 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>) else 0&lt;/i>&lt;br>
+Wave form 6 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>)*abs(sin(2*&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 7 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then abs(sin(2*&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 8 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>)*sin(2*&lt;b>t&lt;/b>) else 0&lt;/i></string>
+ </property>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave1.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave2.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave3.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave4.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave5.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave6.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave7.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave8.png</iconset>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="2" colspan="2" >
+ <widget class="QGroupBox" name="sensitivity1groupBox" >
+ <property name="title" >
+ <string>Sensitivity 1</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="KVS1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>KVS1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QCheckBox" name="AME1CheckBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Amplitude Modulation Enable</string>
+ </property>
+ <property name="text" >
+ <string>AME1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QSpinBox" name="KVS1SpinBox" >
+ <property name="toolTip" >
+ <string>Keyboard Velocity Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="3" >
+ <widget class="QSlider" name="KVS1Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="acceptDrops" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Key Velocity Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="EGS1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>EBS1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" colspan="2" >
+ <widget class="QSlider" name="EBS1Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>EG Bias Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5" >
+ <widget class="QSpinBox" name="EBS1SpinBox" >
+ <property name="toolTip" >
+ <string>Eg Bias Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="4" >
+ <widget class="QGroupBox" name="Frequency1groupBox" >
+ <property name="title" >
+ <string>Frequency 1</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="CoarseRatio1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Coarse 1</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="CoarseRatio1SpinBox" >
+ <property name="toolTip" >
+ <string>Coarse Ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="FineRatio1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Fine 1</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="FineRatio1SpinBox" >
+ <property name="toolTip" >
+ <string>Fine Ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="Freq1Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Freq 1</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="Freq1SpinBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Fixed Frequency</string>
+ </property>
+ <property name="maximum" >
+ <number>32000</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="Fix1CheckBox" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Toggle Fix Frequency</string>
+ </property>
+ <property name="text" >
+ <string>FIX</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="OUT1groupBox" >
+ <property name="title" >
+ <string>OUT 1</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSpinBox" name="OUT1SpinBox" >
+ <property name="toolTip" >
+ <string>Output Volume</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="OUT1Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Volume</string>
+ </property>
+ <property name="whatsThis" >
+ <string/>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="singleStep" >
+ <number>1</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Op2Tab" >
+ <attribute name="title" >
+ <string>Op &amp;2</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="1" colspan="2" >
+ <widget class="QGroupBox" name="Env2GroupBox" >
+ <property name="title" >
+ <string>Amplitude Envelope 2</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="AR2SpinBox" >
+ <property name="toolTip" >
+ <string>Attack Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="D1R2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D1R2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QLabel" name="D1L2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D1L2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QLabel" name="D2R2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D2R2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QLabel" name="RR2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>RR2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="AR2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>AR2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="RR2SpinBox" >
+ <property name="toolTip" >
+ <string>Release Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>15</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="D2R2SpinBox" >
+ <property name="toolTip" >
+ <string>2° Decay Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="D1L2SpinBox" >
+ <property name="toolTip" >
+ <string>1° Decay Level</string>
+ </property>
+ <property name="maximum" >
+ <number>15</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="D1R2SpinBox" >
+ <property name="toolTip" >
+ <string>1° Decay Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="5" >
+ <widget class="QFrame" name="envelope2Frame" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="4" >
+ <widget class="QGroupBox" name="Frequency2groupBox" >
+ <property name="title" >
+ <string>Frequency 2</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="CoarseRatio2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Coarse 2</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="CoarseRatio2SpinBox" >
+ <property name="toolTip" >
+ <string>Coarse Ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="FineRatio2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Fine 2</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="FineRatio2SpinBox" >
+ <property name="toolTip" >
+ <string>Fine Ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="Freq2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Freq 2</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="Freq2SpinBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Fixed Frequency</string>
+ </property>
+ <property name="maximum" >
+ <number>32000</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="Fix2CheckBox" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Toggle Fix Frequency</string>
+ </property>
+ <property name="text" >
+ <string>FIX</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QGroupBox" name="Scaling2GroupBox" >
+ <property name="title" >
+ <string>Scaling 2</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="LS2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>LS2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="RS2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>RS2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QSlider" name="LS2Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Level Scaling</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="RS2Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Rate Scaling</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="LS2SpinBox" >
+ <property name="toolTip" >
+ <string>Level Scaling</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="RS2SpinBox" >
+ <property name="toolTip" >
+ <string>Rate Scaling</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="OUT2groupBox" >
+ <property name="title" >
+ <string>OUT 2</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSpinBox" name="OUT2SpinBox" >
+ <property name="toolTip" >
+ <string>Output Volume</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="OUT2Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Volume</string>
+ </property>
+ <property name="whatsThis" >
+ <string/>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QGroupBox" name="DetWaveEGS2GroupBox" >
+ <property name="title" >
+ <string>Detune, OSCWave, EGShift 2</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="DET2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>DET2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="DET2SpinBox" >
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="minimum" >
+ <number>-3</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QSlider" name="DET2Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="minimum" >
+ <number>-3</number>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QComboBox" name="EGS2ComboBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>EG Shift</string>
+ </property>
+ <item>
+ <property name="text" >
+ <string>96dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>48dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>24dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>12dB</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QComboBox" name="WaveForm2ComboBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Wave form</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Wave form 1 = &lt;i>sin(&lt;b>t&lt;/b>)&lt;/i>&lt;br>
+Wave form 2 = &lt;i>sin(&lt;b>t&lt;/b>)*abs(sin(&lt;b>t&lt;/b>))&lt;/i>&lt;br>
+Wave form 3 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(&lt;b>t&lt;/b>) else 0&lt;/i>&lt;br>
+Wave form 4 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(&lt;b>t&lt;/b>)*abs(sin(&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 5 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>) else 0&lt;/i>&lt;br>
+Wave form 6 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>)*abs(sin(2*&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 7 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then abs(sin(2*&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 8 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>)*sin(2*&lt;b>t&lt;/b>) else 0&lt;/i></string>
+ </property>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave1.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave2.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave3.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave4.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave5.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave6.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave7.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave8.png</iconset>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="2" colspan="2" >
+ <widget class="QGroupBox" name="sensitivity2groupBox" >
+ <property name="title" >
+ <string>Sensitivity 2</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="EGS2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>EBS2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="KVS2Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>KVS2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QCheckBox" name="AME2CheckBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Amplitude Modulation Enable</string>
+ </property>
+ <property name="text" >
+ <string>AME2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="3" >
+ <widget class="QSlider" name="KVS2Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="acceptDrops" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Key Velocity Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QSpinBox" name="KVS2SpinBox" >
+ <property name="toolTip" >
+ <string>Keyboard Velocity Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" colspan="2" >
+ <widget class="QSlider" name="EBS2Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>EG Bias Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5" >
+ <widget class="QSpinBox" name="EBS2SpinBox" >
+ <property name="toolTip" >
+ <string>Eg Bias Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Op3Tab" >
+ <attribute name="title" >
+ <string>Op &amp;3</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="1" colspan="2" >
+ <widget class="QGroupBox" name="Env3GroupBox" >
+ <property name="title" >
+ <string>Amplitude Envelope 3</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="AR3SpinBox" >
+ <property name="toolTip" >
+ <string>Attack Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="D1R3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D1R3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QLabel" name="D1L3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D1L3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QLabel" name="D2R3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D2R3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QLabel" name="RR3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>RR3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="AR3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>AR3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="RR3SpinBox" >
+ <property name="toolTip" >
+ <string>Release Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>15</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="D2R3SpinBox" >
+ <property name="toolTip" >
+ <string>2° Decay Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="D1L3SpinBox" >
+ <property name="toolTip" >
+ <string>1° Decay Level</string>
+ </property>
+ <property name="maximum" >
+ <number>15</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="D1R3SpinBox" >
+ <property name="toolTip" >
+ <string>1° Decay Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="5" >
+ <widget class="QFrame" name="envelope3Frame" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QGroupBox" name="Scaling3GroupBox" >
+ <property name="title" >
+ <string>Scaling 3</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="LS3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>LS3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="RS3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>RS3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QSlider" name="LS3Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Level Scaling</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="RS3Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Rate Scaling</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="LS3SpinBox" >
+ <property name="toolTip" >
+ <string>Level Scaling</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="RS3SpinBox" >
+ <property name="toolTip" >
+ <string>Rate Scaling</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="OUT3groupBox" >
+ <property name="title" >
+ <string>OUT 3</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSpinBox" name="OUT3SpinBox" >
+ <property name="toolTip" >
+ <string>Output Volume</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="OUT3Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Volume</string>
+ </property>
+ <property name="whatsThis" >
+ <string/>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="4" >
+ <widget class="QGroupBox" name="Frequency3groupBox" >
+ <property name="title" >
+ <string>Frequency 3</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="CoarseRatio3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Coarse 3</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="CoarseRatio3SpinBox" >
+ <property name="cursor" >
+ <cursor>0</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Coarse Ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="FineRatio3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Fine 3</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="FineRatio3SpinBox" >
+ <property name="cursor" >
+ <cursor>0</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Fine Ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="Freq3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Freq 3</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="Freq3SpinBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Fixed Frequency</string>
+ </property>
+ <property name="maximum" >
+ <number>32000</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="Fix3CheckBox" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Toggle Fix Frequency</string>
+ </property>
+ <property name="text" >
+ <string>FIX</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QGroupBox" name="DetWaveEGS3GroupBox" >
+ <property name="title" >
+ <string>Detune, OSCWave, EGShift 3</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="DET3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>DET3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="DET3SpinBox" >
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="minimum" >
+ <number>-3</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QSlider" name="DET3Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="minimum" >
+ <number>-3</number>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QComboBox" name="EGS3ComboBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>EG Shift</string>
+ </property>
+ <item>
+ <property name="text" >
+ <string>96dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>48dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>24dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>12dB</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QComboBox" name="WaveForm3ComboBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Wave form</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Wave form 1 = &lt;i>sin(&lt;b>t&lt;/b>)&lt;/i>&lt;br>
+Wave form 2 = &lt;i>sin(&lt;b>t&lt;/b>)*abs(sin(&lt;b>t&lt;/b>))&lt;/i>&lt;br>
+Wave form 3 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(&lt;b>t&lt;/b>) else 0&lt;/i>&lt;br>
+Wave form 4 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(&lt;b>t&lt;/b>)*abs(sin(&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 5 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>) else 0&lt;/i>&lt;br>
+Wave form 6 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>)*abs(sin(2*&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 7 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then abs(sin(2*&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 8 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>)*sin(2*&lt;b>t&lt;/b>) else 0&lt;/i></string>
+ </property>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave1.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave2.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave3.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave4.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave5.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave6.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave7.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave8.png</iconset>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="2" colspan="2" >
+ <widget class="QGroupBox" name="sensitivity3groupBox" >
+ <property name="title" >
+ <string>Sensitivity 3</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="EGS3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>EBS3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="KVS3Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>KVS3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QCheckBox" name="AME3CheckBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Amplitude Modulation Enable</string>
+ </property>
+ <property name="text" >
+ <string>AME3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="3" >
+ <widget class="QSlider" name="KVS3Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="acceptDrops" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Key Velocity Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QSpinBox" name="KVS3SpinBox" >
+ <property name="toolTip" >
+ <string>Keyboard Velocity Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" colspan="2" >
+ <widget class="QSlider" name="EBS3Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>EG Bias Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5" >
+ <widget class="QSpinBox" name="EBS3SpinBox" >
+ <property name="toolTip" >
+ <string>Eg Bias Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="Op4Tab" >
+ <attribute name="title" >
+ <string>Op &amp;4</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="1" colspan="2" >
+ <widget class="QGroupBox" name="Env4GroupBox" >
+ <property name="title" >
+ <string>amplitude Envelope 4</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="AR4SpinBox" >
+ <property name="toolTip" >
+ <string>Attack Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="AR4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>AR4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="D1R4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D1R4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QLabel" name="D1L4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D1L4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QLabel" name="D2R4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>D2R4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QLabel" name="RR4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>RR4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QSpinBox" name="RR4SpinBox" >
+ <property name="toolTip" >
+ <string>Release Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>15</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="D2R4SpinBox" >
+ <property name="toolTip" >
+ <string>2° Decay Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="D1L4SpinBox" >
+ <property name="toolTip" >
+ <string>1° Decay Level</string>
+ </property>
+ <property name="maximum" >
+ <number>15</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="D1R4SpinBox" >
+ <property name="toolTip" >
+ <string>1° Decay Rate</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="5" >
+ <widget class="QFrame" name="envelope4Frame" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="4" >
+ <widget class="QGroupBox" name="Frequency4groupBox" >
+ <property name="title" >
+ <string>Frequency 4</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="CoarseRatio4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Coarse 4</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="CoarseRatio4SpinBox" >
+ <property name="toolTip" >
+ <string>Coarse Ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="FineRatio4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Fine 4</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="FineRatio4SpinBox" >
+ <property name="toolTip" >
+ <string>Fine Ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="Freq4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Freq 4</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="Freq4SpinBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Fixed Frequency</string>
+ </property>
+ <property name="maximum" >
+ <number>32000</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="Fix4CheckBox" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Toggle Fix Frequency</string>
+ </property>
+ <property name="text" >
+ <string>FIX</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QGroupBox" name="Scaling4GroupBox" >
+ <property name="title" >
+ <string>Scaling 4</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="LS4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>LS4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="RS4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>RS4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QSlider" name="LS4Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Level Scaling</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="RS4Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Rate Scaling</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="LS4SpinBox" >
+ <property name="toolTip" >
+ <string>Level Scaling</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="RS4SpinBox" >
+ <property name="toolTip" >
+ <string>Rate Scaling</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QGroupBox" name="OUT4groupBox" >
+ <property name="title" >
+ <string>OUT 4</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSpinBox" name="OUT4SpinBox" >
+ <property name="toolTip" >
+ <string>Output Volume</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="OUT4Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Volume</string>
+ </property>
+ <property name="whatsThis" >
+ <string/>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QGroupBox" name="DetWaveEGS4GroupBox" >
+ <property name="title" >
+ <string>Detune, OSCWave, EGShift 4</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="DET4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>DET4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="DET4SpinBox" >
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="minimum" >
+ <number>-3</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QSlider" name="DET4Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Attack Rate of the operator 1</string>
+ </property>
+ <property name="minimum" >
+ <number>-3</number>
+ </property>
+ <property name="maximum" >
+ <number>3</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QComboBox" name="EGS4ComboBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>EG Shift</string>
+ </property>
+ <item>
+ <property name="text" >
+ <string>96dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>48dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>24dB</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>12dB</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QComboBox" name="WaveForm4ComboBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Wave form</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Wave form 1 = &lt;i>sin(&lt;b>t&lt;/b>)&lt;/i>&lt;br>
+Wave form 2 = &lt;i>sin(&lt;b>t&lt;/b>)*abs(sin(&lt;b>t&lt;/b>))&lt;/i>&lt;br>
+Wave form 3 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(&lt;b>t&lt;/b>) else 0&lt;/i>&lt;br>
+Wave form 4 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(&lt;b>t&lt;/b>)*abs(sin(&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 5 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>) else 0&lt;/i>&lt;br>
+Wave form 6 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>)*abs(sin(2*&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 7 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then abs(sin(2*&lt;b>t&lt;/b>)) else 0&lt;/i>&lt;br>
+Wave form 8 = &lt;i>if &lt;b>t&lt;/b>&amp;#060 pi then sin(2*&lt;b>t&lt;/b>)*sin(2*&lt;b>t&lt;/b>) else 0&lt;/i></string>
+ </property>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave1.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave2.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave3.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave4.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave5.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave6.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave7.png</iconset>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>pics/wave8.png</iconset>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="2" colspan="2" >
+ <widget class="QGroupBox" name="sensitivity4groupBox" >
+ <property name="title" >
+ <string>Sensitivity 4</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="EGS4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>EBS4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="KVS4Label" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>KVS4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QCheckBox" name="AME4CheckBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Amplitude Modulation Enable</string>
+ </property>
+ <property name="text" >
+ <string>AME4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="3" >
+ <widget class="QSlider" name="KVS4Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="acceptDrops" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Key Velocity Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QSpinBox" name="KVS4SpinBox" >
+ <property name="toolTip" >
+ <string>Keyboard Velocity Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" colspan="2" >
+ <widget class="QSlider" name="EBS4Slider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>EG Bias Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5" >
+ <widget class="QSpinBox" name="EBS4SpinBox" >
+ <property name="toolTip" >
+ <string>Eg Bias Sensitivity</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="FunctionsTab" >
+ <attribute name="title" >
+ <string>&amp;Functions</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" colspan="4" >
+ <widget class="QTabWidget" name="controlTabWidget" >
+ <widget class="QWidget" name="FCTab" >
+ <attribute name="title" >
+ <string>Foot Control</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="fcVolumeSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="fcAmplitudeSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSpinBox" name="fcPitchSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="fcPitchLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Pitch</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="fcPitchSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSlider" name="fcAmplitudeSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="fcAmpliLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Amplitude</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="fcVolumeLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Volume</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSlider" name="fcVolumeSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="MWTab" >
+ <attribute name="title" >
+ <string>Modulation Wheel</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="2" >
+ <widget class="QSpinBox" name="mwAmplitudeSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSlider" name="mwPitchSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="mwPitchSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="mwAmplitudeSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="mwAmplitudeLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Amplitude</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="mwPitchLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Pitch</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="BCTab" >
+ <attribute name="title" >
+ <string>Breath Control</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="1" >
+ <widget class="QSlider" name="bcPitchBiasSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>50</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="bcPitchBiasSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSpinBox" name="bcAmplitudeSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="bcPitchSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="bcEgBiasSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="bcVolumeLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Pitch</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="bcPitchBiasLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Pitch Bias</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="bcEgBiasLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Envelope Bias</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="bcAmpliLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Amplitude</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSlider" name="bcPitchSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSlider" name="bcEgBiasSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="bcAmplitudeSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="ATTab" >
+ <attribute name="title" >
+ <string>After Touch</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="atPitchLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Pitch</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSpinBox" name="atPitchSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSlider" name="atPitchSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="atPitchBiasSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSlider" name="atPitchBiasSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>50</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="atEgBiasSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSpinBox" name="atAmplitudeSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="atPitchBiasLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Pitch Bias</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="atAmplitudeLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Amplitude</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="atEgBiasLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Envelope Bias</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSlider" name="atEgBiasSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="atAmplitudeSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QGroupBox" name="modeGroupBox" >
+ <property name="title" >
+ <string>Phony Mode</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="polyMonoComboBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <item>
+ <property name="text" >
+ <string>POLY</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>MONO</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QGroupBox" name="reverbGroupBox" >
+ <property name="title" >
+ <string>Reverb</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSlider" name="reverbSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="reverbSpinBox" >
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="maximum" >
+ <number>7</number>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="2" colspan="2" >
+ <widget class="QGroupBox" name="detuneGroupBox" >
+ <property name="title" >
+ <string>Detune</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSlider" name="globalDetuneSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="minimum" >
+ <number>-31</number>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="globalDetuneSpinBox" >
+ <property name="toolTip" >
+ <string>Detune</string>
+ </property>
+ <property name="maximum" >
+ <number>31</number>
+ </property>
+ <property name="minimum" >
+ <number>-31</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="1" colspan="3" >
+ <widget class="QGroupBox" name="portamentoGroupBox" >
+ <property name="title" >
+ <string>Potamento</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="PortFingerFullComboBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Portamento Mode</string>
+ </property>
+ <item>
+ <property name="text" >
+ <string>FINGER</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>FULL</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="PotamentoTimeLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>PT</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="PortamentoTimeSlider" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Portamento Time</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="PortamentoTimeSpinBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Portamento Time</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2" >
+ <widget class="QGroupBox" name="pitchBendRangeGroupBox" >
+ <property name="title" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSlider" name="pitchBendRangeSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>12</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="pitchBendRangeSpinBox" >
+ <property name="toolTip" >
+ <string>Pitch Bend Range</string>
+ </property>
+ <property name="maximum" >
+ <number>12</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QGroupBox" name="footSWGroupBox" >
+ <property name="title" >
+ <string>Foot Switch</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="footSWComboBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <item>
+ <property name="text" >
+ <string>Sustain</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Portamento</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QGroupBox" name="transposeGroupBox" >
+ <property name="title" >
+ <string>Transpose</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSlider" name="transposeSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Transpose</string>
+ </property>
+ <property name="minimum" >
+ <number>-24</number>
+ </property>
+ <property name="maximum" >
+ <number>24</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="transposeSpinBox" >
+ <property name="toolTip" >
+ <string>Transpose</string>
+ </property>
+ <property name="maximum" >
+ <number>99</number>
+ </property>
+ <property name="minimum" >
+ <number>-24</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="ConfigureTab" >
+ <attribute name="title" >
+ <string>&amp;Configure</string>
+ </attribute>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" colspan="4" >
+ <widget class="QGroupBox" name="colorGroupBox" >
+ <property name="title" >
+ <string>Colors</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="3" column="0" colspan="4" >
+ <widget class="QFrame" name="colorFrame" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ <item rowspan="3" row="0" column="0" >
+ <widget class="QListWidget" name="colorListBox" >
+ <item>
+ <property name="text" >
+ <string>Text</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Background</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Edit Text</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Edit Background</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QSpinBox" name="redSpinBox" >
+ <property name="toolTip" >
+ <string>Red</string>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSlider" name="blueSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Blue</string>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSlider" name="greenSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Green</string>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSlider" name="redSlider" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="toolTip" >
+ <string>Red</string>
+ </property>
+ <property name="layoutDirection" >
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition" >
+ <enum>QSlider::NoTicks</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QSpinBox" name="blueSpinBox" >
+ <property name="toolTip" >
+ <string>Blue</string>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QSpinBox" name="greenSpinBox" >
+ <property name="toolTip" >
+ <string>Green</string>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="blueLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Blue</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="greenLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Green</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="redLabel" >
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text" >
+ <string>Red</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item rowspan="2" row="2" column="3" >
+ <widget class="QGroupBox" name="saveModeButtonGroup" >
+ <property name="title" >
+ <string>Save Mode (into the song)</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="minSaveRadioButton" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="text" >
+ <string>Save only the used presets</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="hugeSaveRadioButton" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="text" >
+ <string>Save the entire set</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="saveConfigCheckBox" >
+ <property name="cursor" >
+ <cursor>13</cursor>
+ </property>
+ <property name="text" >
+ <string>Save the configuration</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="3" >
+ <widget class="QGroupBox" name="fileGroupBox" >
+ <property name="title" >
+ <string>Configuration File</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="1" >
+ <widget class="QPushButton" name="saveConfPushButton" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Save...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QPushButton" name="loadConfPushButton" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Load...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QPushButton" name="saveDefaultPushButton" >
+ <property name="text" >
+ <string>Save as default</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="4" >
+ <widget class="QGroupBox" name="pathGroupBox" >
+ <property name="title" >
+ <string>Set Path</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" colspan="2" >
+ <widget class="QCheckBox" name="initSetCheckBox" >
+ <property name="text" >
+ <string>Load the following set at the initialization :</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QPushButton" name="browsePushButton" >
+ <property name="text" >
+ <string>Browse...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLineEdit" name="pathLineEdit" >
+ <property name="maxLength" >
+ <number>128</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QGroupBox" name="nbrVoicesGroupBox" >
+ <property name="title" >
+ <string>Nbr Voices</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSpinBox" name="nbrVoicesSpinBox" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" >
+ <string>Number of Voices</string>
+ </property>
+ <property name="maximum" >
+ <number>64</number>
+ </property>
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="value" >
+ <number>8</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QGroupBox" name="qualityGroupBox" >
+ <property name="title" >
+ <string>Quality</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="qualityComboBox" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <item>
+ <property name="text" >
+ <string>High</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Middle</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Low</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QGroupBox" name="MidiChInGroupBox" >
+ <property name="title" >
+ <string>Midi Input Ch</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="MidiInChComboBox" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <item>
+ <property name="text" >
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>3</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>4</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>5</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>6</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>7</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>8</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>9</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>10</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>11</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>12</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>13</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>14</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>15</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>16</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>Awl::Knob</class>
+ <extends></extends>
+ <header>awl/knob.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>deicsOnzeTabWidget</tabstop>
+ <tabstop>presetLineEdit</tabstop>
+ <tabstop>masterVolSlider</tabstop>
+ <tabstop>feedbackSlider</tabstop>
+ <tabstop>LFOSyncCheckBox</tabstop>
+ <tabstop>PModSensSlider</tabstop>
+ <tabstop>LFOWaveComboBox</tabstop>
+ <tabstop>AModSensSlider</tabstop>
+ <tabstop>PModDepthSlider</tabstop>
+ <tabstop>AModDepthSlider</tabstop>
+ <tabstop>LFOSpeedSlider</tabstop>
+ <tabstop>LFODelaySlider</tabstop>
+ <tabstop>algorithmComboBox</tabstop>
+ <tabstop>LS1Slider</tabstop>
+ <tabstop>RS1Slider</tabstop>
+ <tabstop>OUT1Slider</tabstop>
+ <tabstop>Fix1CheckBox</tabstop>
+ <tabstop>AME1CheckBox</tabstop>
+ <tabstop>EBS1Slider</tabstop>
+ <tabstop>DET1Slider</tabstop>
+ <tabstop>KVS1Slider</tabstop>
+ <tabstop>WaveForm1ComboBox</tabstop>
+ <tabstop>EGS1ComboBox</tabstop>
+ <tabstop>LS2Slider</tabstop>
+ <tabstop>RS2Slider</tabstop>
+ <tabstop>OUT2Slider</tabstop>
+ <tabstop>AME2CheckBox</tabstop>
+ <tabstop>EBS2Slider</tabstop>
+ <tabstop>DET2Slider</tabstop>
+ <tabstop>KVS2Slider</tabstop>
+ <tabstop>WaveForm2ComboBox</tabstop>
+ <tabstop>EGS2ComboBox</tabstop>
+ <tabstop>LS3Slider</tabstop>
+ <tabstop>RS3Slider</tabstop>
+ <tabstop>OUT3Slider</tabstop>
+ <tabstop>AME3CheckBox</tabstop>
+ <tabstop>EBS3Slider</tabstop>
+ <tabstop>DET3Slider</tabstop>
+ <tabstop>KVS3Slider</tabstop>
+ <tabstop>WaveForm3ComboBox</tabstop>
+ <tabstop>EGS3ComboBox</tabstop>
+ <tabstop>LS4Slider</tabstop>
+ <tabstop>RS4Slider</tabstop>
+ <tabstop>OUT4Slider</tabstop>
+ <tabstop>AME4CheckBox</tabstop>
+ <tabstop>EBS4Slider</tabstop>
+ <tabstop>DET4Slider</tabstop>
+ <tabstop>KVS4Slider</tabstop>
+ <tabstop>WaveForm4ComboBox</tabstop>
+ <tabstop>EGS4ComboBox</tabstop>
+ <tabstop>subcategoryLineEdit</tabstop>
+ <tabstop>categoryLineEdit</tabstop>
+ <tabstop>lbankSpinBox</tabstop>
+ <tabstop>progSpinBox</tabstop>
+ <tabstop>masterVolSpinBox</tabstop>
+ <tabstop>feedbackSpinBox</tabstop>
+ <tabstop>PModSensSpinBox</tabstop>
+ <tabstop>AModSensSpinBox</tabstop>
+ <tabstop>PModDepthSpinBox</tabstop>
+ <tabstop>AModDepthSpinBox</tabstop>
+ <tabstop>LFOSpeedSpinBox</tabstop>
+ <tabstop>LFODelaySpinBox</tabstop>
+ <tabstop>CoarseRatio1SpinBox</tabstop>
+ <tabstop>FineRatio1SpinBox</tabstop>
+ <tabstop>Freq1SpinBox</tabstop>
+ <tabstop>LS1SpinBox</tabstop>
+ <tabstop>RS1SpinBox</tabstop>
+ <tabstop>OUT1SpinBox</tabstop>
+ <tabstop>EBS1SpinBox</tabstop>
+ <tabstop>KVS1SpinBox</tabstop>
+ <tabstop>DET1SpinBox</tabstop>
+ <tabstop>AR1SpinBox</tabstop>
+ <tabstop>D1R1SpinBox</tabstop>
+ <tabstop>D1L1SpinBox</tabstop>
+ <tabstop>D2R1SpinBox</tabstop>
+ <tabstop>RR1SpinBox</tabstop>
+ <tabstop>Fix2CheckBox</tabstop>
+ <tabstop>Freq2SpinBox</tabstop>
+ <tabstop>CoarseRatio2SpinBox</tabstop>
+ <tabstop>FineRatio2SpinBox</tabstop>
+ <tabstop>LS2SpinBox</tabstop>
+ <tabstop>RS2SpinBox</tabstop>
+ <tabstop>OUT2SpinBox</tabstop>
+ <tabstop>EBS2SpinBox</tabstop>
+ <tabstop>KVS2SpinBox</tabstop>
+ <tabstop>DET2SpinBox</tabstop>
+ <tabstop>AR2SpinBox</tabstop>
+ <tabstop>D1R2SpinBox</tabstop>
+ <tabstop>D1L2SpinBox</tabstop>
+ <tabstop>D2R2SpinBox</tabstop>
+ <tabstop>RR2SpinBox</tabstop>
+ <tabstop>Fix3CheckBox</tabstop>
+ <tabstop>CoarseRatio3SpinBox</tabstop>
+ <tabstop>FineRatio3SpinBox</tabstop>
+ <tabstop>Freq3SpinBox</tabstop>
+ <tabstop>AR3SpinBox</tabstop>
+ <tabstop>D1R3SpinBox</tabstop>
+ <tabstop>D1L3SpinBox</tabstop>
+ <tabstop>D2R3SpinBox</tabstop>
+ <tabstop>RR3SpinBox</tabstop>
+ <tabstop>LS3SpinBox</tabstop>
+ <tabstop>RS3SpinBox</tabstop>
+ <tabstop>OUT3SpinBox</tabstop>
+ <tabstop>EBS3SpinBox</tabstop>
+ <tabstop>KVS3SpinBox</tabstop>
+ <tabstop>DET3SpinBox</tabstop>
+ <tabstop>Fix4CheckBox</tabstop>
+ <tabstop>CoarseRatio4SpinBox</tabstop>
+ <tabstop>FineRatio4SpinBox</tabstop>
+ <tabstop>Freq4SpinBox</tabstop>
+ <tabstop>LS4SpinBox</tabstop>
+ <tabstop>RS4SpinBox</tabstop>
+ <tabstop>OUT4SpinBox</tabstop>
+ <tabstop>EBS4SpinBox</tabstop>
+ <tabstop>KVS4SpinBox</tabstop>
+ <tabstop>DET4SpinBox</tabstop>
+ <tabstop>AR4SpinBox</tabstop>
+ <tabstop>D1R4SpinBox</tabstop>
+ <tabstop>D1L4SpinBox</tabstop>
+ <tabstop>D2R4SpinBox</tabstop>
+ <tabstop>RR4SpinBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>masterVolSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>masterVolSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>masterVolSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>masterVolSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>feedbackSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>feedbackSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>feedbackSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>feedbackSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>PModSensSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>PModSensSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>PModSensSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>PModSensSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>AModSensSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AModSensSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>AModSensSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AModSensSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>PModDepthSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>PModDepthSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>AModDepthSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>AModDepthSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LFOSpeedSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LFOSpeedSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LFOSpeedSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LFOSpeedSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LFODelaySlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LFODelaySpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LFODelaySpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LFODelaySlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>PModDepthSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>PModDepthSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix1CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Freq1SpinBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix1CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>FineRatio1SpinBox</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix1CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CoarseRatio1SpinBox</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>OUT1Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>OUT1SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>57</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>95</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>OUT1SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>OUT1Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>95</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>57</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LS1Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LS1SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LS1SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LS1Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>RS1Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>RS1SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>RS1SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>RS1Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>DET1Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>DET1SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>DET1SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>DET1Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>EBS1Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>EBS1SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>EBS1SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>EBS1Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>KVS1Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>KVS1SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>KVS1SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>KVS1Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix2CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Freq2SpinBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix2CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>FineRatio2SpinBox</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix2CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CoarseRatio2SpinBox</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>OUT2SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>OUT2Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>95</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>57</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LS2Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LS2SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LS2SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LS2Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>RS2Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>RS2SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>RS2SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>RS2Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>DET2Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>DET2SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>DET2SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>DET2Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>EBS2SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>EBS2Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>EBS2Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>EBS2SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>KVS2Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>KVS2SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>KVS2SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>KVS2Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix3CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Freq3SpinBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix3CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>FineRatio3SpinBox</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix3CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CoarseRatio3SpinBox</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>OUT3Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>OUT3SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>57</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>82</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>OUT3SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>OUT3Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>60</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LS3Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LS3SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LS3SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LS3Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>RS3Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>RS3SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>RS3SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>RS3Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>DET3Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>DET3SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>DET3SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>DET3Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>EBS3Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>EBS3SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>EBS3SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>EBS3Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>KVS3Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>KVS3SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>KVS3SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>KVS3Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix4CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Freq4SpinBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix4CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>FineRatio4SpinBox</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>Fix4CheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>CoarseRatio4SpinBox</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>OUT4Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>OUT4SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>55</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>84</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>OUT4SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>OUT4Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>56</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LS4Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LS4SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>LS4SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LS4Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>RS4Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>RS4SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>RS4SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>RS4Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>DET4Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>DET4SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>DET4SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>DET4Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>EBS4Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>EBS4SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>EBS4SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>EBS4Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>KVS4Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>KVS4SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>KVS4SpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>KVS4Slider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>redSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>redSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>redSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>redSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>greenSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>greenSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>greenSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>greenSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>blueSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>blueSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>blueSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>blueSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>fcVolumeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>fcVolumeSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>66</x>
+ <y>155</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>102</x>
+ <y>155</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>fcVolumeSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>fcVolumeSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>102</x>
+ <y>155</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>66</x>
+ <y>155</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>fcPitchSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>fcPitchSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>66</x>
+ <y>159</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>102</x>
+ <y>159</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>fcPitchSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>fcPitchSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>102</x>
+ <y>159</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>66</x>
+ <y>159</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>fcAmplitudeSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>fcAmplitudeSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>102</x>
+ <y>163</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>66</x>
+ <y>163</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>fcAmplitudeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>fcAmplitudeSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>66</x>
+ <y>163</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>102</x>
+ <y>163</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>transposeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>transposeSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>transposeSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>transposeSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>globalDetuneSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>globalDetuneSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>globalDetuneSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>globalDetuneSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>pitchBendRangeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>pitchBendRangeSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>pitchBendRangeSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>pitchBendRangeSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>reverbSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>reverbSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>reverbSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>reverbSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>PortamentoTimeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>PortamentoTimeSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>PortamentoTimeSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>PortamentoTimeSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>mwPitchSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>mwPitchSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>mwAmplitudeSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>mwAmplitudeSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>mwAmplitudeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>mwAmplitudeSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>mwPitchSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>mwPitchSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcPitchSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcPitchSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcAmplitudeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcAmplitudeSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcPitchBiasSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcPitchBiasSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcEgBiasSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcEgBiasSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcPitchSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcPitchSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcEgBiasSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcEgBiasSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>atPitchSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>atPitchSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>atAmplitudeSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>atAmplitudeSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>atAmplitudeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>atAmplitudeSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>atPitchBiasSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>atPitchBiasSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>atPitchBiasSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>atPitchBiasSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>atEgBiasSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>atEgBiasSpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>atPitchSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>atPitchSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>atEgBiasSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>atEgBiasSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcPitchSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcPitchSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcAmplitudeSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcAmplitudeSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcPitchBiasSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcPitchBiasSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>bcEgBiasSpinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>bcEgBiasSlider</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>110</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>OUT2Slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>OUT2SpinBox</receiver>
+ <slot>setValue(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>53</x>
+ <y>172</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>70</x>
+ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>presetLineEdit</sender>
+ <signal>textChanged(QString)</signal>
+ <receiver>presetNameLabel</receiver>
+ <slot>setText(QString)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>483</x>
+ <y>165</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>473</x>
+ <y>56</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse/synti/deicsonze/deicsonzepreset.cpp b/muse/synti/deicsonze/deicsonzepreset.cpp
new file mode 100644
index 00000000..d65140c7
--- /dev/null
+++ b/muse/synti/deicsonze/deicsonzepreset.cpp
@@ -0,0 +1,1171 @@
+//===========================================================================
+//
+// DeicsOnze an emulator of the YAMAHA DX11 synthesizer
+//
+// Version 0.3
+//
+// deicsonzepreset.cpp
+//
+//
+// Copyright (c) 2004-2006 Nil Geisweiller
+//
+//
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+#include "deicsonzepreset.h"
+#include <iostream>
+#include <algorithm>
+
+//-----------------------------------------------------------
+// Constructor destructor
+//-----------------------------------------------------------
+Preset::Preset() {_subcategory=NULL;_isUsed=false;initPreset();}
+Preset::Preset(Subcategory* sub) {
+ _subcategory=sub;
+ _isUsed=false;
+ initPreset();
+ if(sub) sub->_presetVector.push_back(this);
+}
+Preset::Preset(Subcategory* sub, int pr) {
+ _subcategory=sub;
+ _isUsed=false;
+ initPreset();
+ prog=pr;
+ if(sub) sub->_presetVector.push_back(this);
+}
+Preset::~Preset() {
+ if(_subcategory) {
+ std::vector<Preset*>::iterator iB=_subcategory->_presetVector.begin();
+ std::vector<Preset*>::iterator iE=_subcategory->_presetVector.end();
+ std::vector<Preset*>::iterator iP=std::find(iB, iE, this);
+ if(iP!=iE) _subcategory->_presetVector.erase(iP);
+ else printf("Error : preset %s not found\n", name.c_str());
+ }
+}
+//----------------------------------------------------------
+// setIsUsed(bool b)
+// set the flag _isUsed and transmit in the parents
+//----------------------------------------------------------
+void Preset::setIsUsed(bool b) {
+ if(!_isUsed) {
+ _isUsed=b;
+ if(_subcategory) {
+ _subcategory->_isUsed=b;
+ if(_subcategory->_category) {
+ _subcategory->_category->_isUsed=b;
+ }
+ }
+ }
+}
+//----------------------------------------------------------
+// linkSubcategory
+// links the preset to a subcategory parent and erase itself
+// from the last subcategory if not NULL
+//----------------------------------------------------------
+void Preset::linkSubcategory(Subcategory* sub) {
+ if(_subcategory) {
+ std::vector<Preset*> pv=_subcategory->_presetVector;
+ std::vector<Preset*>::iterator iP=find(pv.begin(),pv.end(),this);
+ if(iP!=pv.end()) pv.erase(iP);
+ else printf("Error linkSubcategory: preset %s not found\n",
+ name.c_str());
+ }
+ _subcategory=sub;
+ if(sub) sub->_presetVector.push_back(this);
+}
+//----------------------------------------------------------
+// linkCategory
+// links the subcategory to a category parent and erase itself
+// from the last category if not NULL
+//----------------------------------------------------------
+void Subcategory::linkCategory(Category* cat) {
+ if(_category) {
+ std::vector<Subcategory*> sv=_category->_subcategoryVector;
+ std::vector<Subcategory*>::iterator iS=find(sv.begin(),sv.end(),this);
+ if(iS!=sv.end()) sv.erase(iS);
+ else printf("Error linkCategory: preset %s not found\n",
+ _subcategoryName.c_str());
+ }
+ _category=cat;
+ if(cat) cat->_subcategoryVector.push_back(this);
+}
+
+
+//----------------------------------------------------------
+// linkSet
+// links the category to a set parent (there is always only one set)
+//----------------------------------------------------------
+void Category::linkSet(Set* s) {
+ _set=s;
+ if(s) s->_categoryVector.push_back(this);
+}
+
+//----------------------------------------------------------
+// Subcategory constructor and destruction
+//----------------------------------------------------------
+Subcategory::Subcategory() {_category=NULL;}
+Subcategory::Subcategory(Category* cat) {
+ _category=cat;
+ _isUsed=false;
+ if(cat) cat->_subcategoryVector.push_back(this);
+}
+Subcategory::Subcategory(const std::string name) {
+ _category=NULL;
+ _isUsed=false;
+ _subcategoryName=name;
+}
+Subcategory::Subcategory(Category* cat, const std::string name, int lbank) {
+ _category=cat;
+ _isUsed=false;
+ _subcategoryName=name;
+ _lbank=lbank;
+ if(cat) cat->_subcategoryVector.push_back(this);
+}
+Subcategory::~Subcategory() {
+ while(!_presetVector.empty()) delete(*_presetVector.begin());
+ if(_category) {
+ std::vector<Subcategory*>::iterator
+ iB=_category->_subcategoryVector.begin();
+ std::vector<Subcategory*>::iterator
+ iE=_category->_subcategoryVector.end();
+ std::vector<Subcategory*>::iterator iS=std::find(iB, iE, this);
+ if(iS!=iE) _category->_subcategoryVector.erase(iS);
+ else printf("Error : subcategory %s not found\n",
+ _subcategoryName.c_str());
+ }
+}
+
+//--------------------------------------------------------
+// Category constructor destructor
+//--------------------------------------------------------
+Category::Category() {_set=NULL;_isUsed=false;}
+Category::Category(Set* s) {
+ _set=s;
+ _isUsed=false;
+ if(s) s->_categoryVector.push_back(this);
+}
+Category::Category(Set* s,const std::string name, int hbank) {
+ _set=s;
+ _isUsed=false;
+ _categoryName=name;
+ _hbank=hbank;
+ if(s) s->_categoryVector.push_back(this);
+}
+Category::~Category() {
+ while(!_subcategoryVector.empty()) delete(*_subcategoryVector.begin());
+ if(_set) {
+ std::vector<Category*>::iterator iB=_set->_categoryVector.begin();
+ std::vector<Category*>::iterator iE=_set->_categoryVector.end();
+ std::vector<Category*>::iterator iC=std::find(iB, iE, this);
+ if(iC!=iE) _set->_categoryVector.erase(iC);
+ else printf("Error : category %s not found\n", _categoryName.c_str());
+ }
+}
+
+//---------------------------------------------------------
+// initPreset
+// put the preset in the initial state as defined by YAMAHA
+//---------------------------------------------------------
+void Preset::initPreset() {
+ //algorithm
+ algorithm=FIRST;
+ //feedeback
+ feedback=0;
+ //quick edit
+ brightness=MIDFINEBRIGHTNESS;
+ attack=MIDATTACK;
+ release=MIDRELEASE;
+ modulation=0;
+ //lfo
+ lfo.wave=TRIANGL;
+ lfo.speed=35;
+ lfo.delay=0;
+ lfo.pModDepth=0;
+ lfo.aModDepth=0;
+ lfo.sync=false;
+ //sensitivity
+ sensitivity.pitch=6;
+ sensitivity.amplitude=0;
+ sensitivity.ampOn[0]=false;
+ sensitivity.ampOn[1]=false;
+ sensitivity.ampOn[2]=false;
+ sensitivity.ampOn[3]=false;
+ sensitivity.egBias[0]=0;
+ sensitivity.egBias[1]=0;
+ sensitivity.egBias[2]=0;
+ sensitivity.egBias[3]=0;
+ sensitivity.keyVelocity[0]=0;
+ sensitivity.keyVelocity[1]=0;
+ sensitivity.keyVelocity[2]=0;
+ sensitivity.keyVelocity[3]=0;
+ //frequency
+ frequency[0].ratio=1.0;
+ frequency[1].ratio=1.0;
+ frequency[2].ratio=1.0;
+ frequency[3].ratio=1.0;
+ frequency[0].isFix=false;
+ frequency[1].isFix=false;
+ frequency[2].isFix=false;
+ frequency[3].isFix=false;
+ frequency[0].freq=255.0;
+ frequency[1].freq=255.0;
+ frequency[2].freq=255.0;
+ frequency[3].freq=255.0;
+ //oscWave
+ oscWave[0]=W1;
+ oscWave[1]=W1;
+ oscWave[2]=W1;
+ oscWave[3]=W1;
+ //detune
+ detune[0]=0;
+ detune[1]=0;
+ detune[2]=0;
+ detune[3]=0;
+ //eg
+ eg[0].ar=31;
+ eg[1].ar=31;
+ eg[2].ar=31;
+ eg[3].ar=31;
+ eg[0].d1r=31;
+ eg[1].d1r=31;
+ eg[2].d1r=31;
+ eg[3].d1r=31;
+ eg[0].d1l=15;
+ eg[1].d1l=15;
+ eg[2].d1l=15;
+ eg[3].d1l=15;
+ eg[0].d2r=0;
+ eg[1].d2r=0;
+ eg[2].d2r=0;
+ eg[3].d2r=0;
+ eg[0].rr=15;
+ eg[1].rr=15;
+ eg[2].rr=15;
+ eg[3].rr=15;
+ eg[0].egShift=VOF;
+ eg[1].egShift=VOF;
+ eg[2].egShift=VOF;
+ eg[3].egShift=VOF;
+ //pitchEg
+ pitchEg.pr1=99;
+ pitchEg.pr2=99;
+ pitchEg.pr3=99;
+ pitchEg.pl1=50;
+ pitchEg.pl2=50;
+ pitchEg.pl3=50;
+ //outLevel
+ outLevel[0]=90;
+ outLevel[1]=0;
+ outLevel[2]=0;
+ outLevel[3]=0;
+ //scaling
+ scaling.rate[0]=0;
+ scaling.rate[1]=0;
+ scaling.rate[2]=0;
+ scaling.rate[3]=0;
+ scaling.level[0]=0;
+ scaling.level[1]=0;
+ scaling.level[2]=0;
+ scaling.level[3]=0;
+ //function
+ function.transpose=0;
+ function.mode=POLY;
+ function.pBendRange=4;
+ function.portamento=FULL;
+ function.portamentoTime=0;
+ function.fcVolume=40;
+ function.fcPitch=0;
+ function.fcAmplitude=0;
+ function.mwPitch=50;
+ function.mwAmplitude=0;
+ function.bcPitch=0;
+ function.bcAmplitude=0;
+ function.bcPitchBias=0;
+ function.bcEgBias=0;
+ function.atPitch=0;
+ function.atAmplitude=0;
+ function.atPitchBias=0;
+ function.atEgBias=0;
+ function.reverbRate=0;
+ globalDetune=0;
+ //Name
+ name="INITVOICE";
+}
+//---------------------------------------------------------
+// Preset::merge
+// copy the preset
+//---------------------------------------------------------
+void Preset::merge(Preset* p) {
+ if(p) {
+ //algorithm
+ algorithm=p->algorithm;
+ //feedeback
+ feedback=p->feedback;
+ //lfo
+ lfo.wave=p->lfo.wave;
+ lfo.speed=p->lfo.speed;
+ lfo.delay=p->lfo.delay;
+ lfo.pModDepth=p->lfo.pModDepth;
+ lfo.aModDepth=p->lfo.aModDepth;
+ lfo.sync=p->lfo.sync;
+ //sensitivity
+ sensitivity.pitch=p->sensitivity.pitch;
+ sensitivity.amplitude=p->sensitivity.amplitude;
+ for(int k=0; k<NBROP; k++) {
+ sensitivity.ampOn[k]=p->sensitivity.ampOn[k];
+ sensitivity.egBias[k]=p->sensitivity.egBias[k];
+ sensitivity.keyVelocity[k]=p->sensitivity.keyVelocity[k];
+ //frequency
+ frequency[k].ratio=p->frequency[k].ratio;
+ frequency[k].isFix=p->frequency[k].isFix;
+ frequency[k].freq=p->frequency[k].freq;
+ //oscWave
+ oscWave[k]=p->oscWave[k];
+ //detune
+ detune[k]=p->detune[k];
+ //eg
+ eg[k].ar=p->eg[k].ar;
+ eg[k].d1r=p->eg[k].d1r;
+ eg[k].d1l=p->eg[k].d1l;
+ eg[k].d2r=p->eg[k].d2r;
+ eg[k].rr=p->eg[k].rr;
+ eg[k].egShift=p->eg[k].egShift;
+ //outLevel
+ outLevel[k]=p->outLevel[k];
+ //scaling
+ scaling.rate[k]=p->scaling.rate[k];
+ scaling.level[k]=p->scaling.level[k];
+ }
+ //pitchEg
+ pitchEg.pr1=p->pitchEg.pr1;
+ pitchEg.pr2=p->pitchEg.pr2;
+ pitchEg.pr3=p->pitchEg.pr3;
+ pitchEg.pl1=p->pitchEg.pl1;
+ pitchEg.pl2=p->pitchEg.pl2;
+ pitchEg.pl3=p->pitchEg.pl3;
+ //function
+ function.transpose=p->function.transpose;
+ function.mode=p->function.mode;
+ function.pBendRange=p->function.pBendRange;
+ function.portamento=p->function.portamento;
+ function.portamentoTime=p->function.portamentoTime;
+ function.fcVolume=p->function.fcVolume;
+ function.fcPitch=p->function.fcPitch;
+ function.fcAmplitude=p->function.fcAmplitude;
+ function.mwPitch=p->function.mwPitch;
+ function.mwAmplitude=p->function.mwAmplitude;
+ function.bcPitch=p->function.bcPitch;
+ function.bcAmplitude=p->function.bcAmplitude;
+ function.bcPitchBias=p->function.bcPitchBias;
+ function.bcEgBias=p->function.bcEgBias;
+ function.atPitch=p->function.atPitch;
+ function.atAmplitude=p->function.atAmplitude;
+ function.atPitchBias=p->function.atPitchBias;
+ function.atEgBias=p->function.atEgBias;
+ function.reverbRate=p->function.reverbRate;
+ globalDetune=p->globalDetune;
+ //Name
+ name=p->name;
+ }
+}
+//---------------------------------------------------------
+// findPreset
+// return the first preset corresponding of hbank, lbank, prog
+//---------------------------------------------------------
+Preset* Subcategory::findPreset(int prog) {
+ std::vector<Preset*>::iterator pvi;
+ for(pvi=_presetVector.begin(); pvi!=_presetVector.end(); pvi++) {
+ if((*pvi)->prog==prog) return(*pvi);
+ }
+ return NULL;
+}
+Preset* Category::findPreset(int lbank, int prog) {
+ Subcategory* s=findSubcategory(lbank);
+ if(s) {
+ Preset* p=s->findPreset(prog);
+ if(p) return(p);
+ }
+ return(NULL);
+}
+Preset* Set::findPreset(int hbank, int lbank, int prog) {
+ Category* c=findCategory(hbank);
+ if(c) {
+ Preset* p=c->findPreset(lbank, prog);
+ if(p) return(p);
+ }
+ return NULL;
+}
+
+//---------------------------------------------------------
+// isFreeHBank, firstFreeHBank -1 otherwise
+//---------------------------------------------------------
+bool Set::isFreeHBank(int hbank) {
+ if(findCategory(hbank)) return(false);
+ else return(true);
+}
+int Set::firstFreeHBank() {
+ for(int hbank=0; hbank<128; hbank++) if(isFreeHBank(hbank)) return(hbank);
+ return(-1);
+}
+//--------------------------------------------------------------
+// Set::merge
+//--------------------------------------------------------------
+void Set::merge(Category* c) {
+ if(isFreeHBank(c->_hbank)) c->linkSet(this);
+ else {
+ Category* cFromSet=findCategory(c->_hbank);
+ cFromSet->_categoryName=c->_categoryName;
+ for(std::vector<Subcategory*>::iterator
+ i=c->_subcategoryVector.begin();
+ i!=c->_subcategoryVector.end(); i++) cFromSet->merge(*i);
+ //delete(c);
+ }
+}
+
+bool Category::isFreeLBank(int lbank) {
+ if(findSubcategory(lbank)) return(false);
+ else return(true);
+}
+int Category::firstFreeLBank() {
+ for(int lbank=0; lbank<128; lbank++) if(isFreeLBank(lbank)) return(lbank);
+ return(-1);
+}
+//--------------------------------------------------------------
+// Category::merge
+//--------------------------------------------------------------
+void Category::merge(Subcategory* s) {
+ if(isFreeLBank(s->_lbank)) s->linkCategory(this);
+ else {
+ Subcategory* sFromCat=findSubcategory(s->_lbank);
+ sFromCat->_subcategoryName=s->_subcategoryName;
+ for(std::vector<Preset*>::iterator
+ i=s->_presetVector.begin();
+ i!=s->_presetVector.end(); i++) sFromCat->merge(*i);
+ //delete(s);
+ }
+}
+//---------------------------------------------------------
+// Category::unlink
+// unlink the subcategories, so don't delete them when delete
+//---------------------------------------------------------
+void Category::unlink() {
+ while(!_subcategoryVector.empty())
+ _subcategoryVector.erase(_subcategoryVector.begin());
+}
+
+bool Subcategory::isFreeProg(int pr) {
+ if(findPreset(pr)) return(false);
+ else return(true);
+}
+int Subcategory::firstFreeProg() {
+ for(int pr=0; pr<128; pr++) if(isFreeProg(pr)) return(pr);
+ return(-1);
+}
+//---------------------------------------------------------
+// Subcategory::unlink
+// unlink the presets, so don't delete them when delete
+//---------------------------------------------------------
+void Subcategory::unlink() {
+ while(!_presetVector.empty()) _presetVector.erase(_presetVector.begin());
+}
+
+//---------------------------------------------------------
+// findCategory
+// takes hbank a category and return the first category,
+// NULL if doesn't exist
+//---------------------------------------------------------
+Category* Set::findCategory(int hbank) {
+ std::vector<Category*>::iterator cvi;
+ for(cvi=_categoryVector.begin(); cvi!=_categoryVector.end(); cvi++)
+ if((*cvi)->_hbank==hbank) return(*cvi);
+ return(NULL);
+}
+//---------------------------------------------------------
+// findSubcategory
+// takes lbank a subcategory and return the subcategory
+// NULL if doesn't exist
+//---------------------------------------------------------
+Subcategory* Category::findSubcategory(int lbank) {
+ std::vector<Subcategory*>::iterator svi;
+ for(svi=_subcategoryVector.begin(); svi!=_subcategoryVector.end(); svi++)
+ if((*svi)->_lbank==lbank) return(*svi);
+ return(NULL);
+}
+//--------------------------------------------------------------
+// Subcategory::merge
+//--------------------------------------------------------------
+void Subcategory::merge(Preset* p) {
+ if(isFreeProg(p->prog)) p->linkSubcategory(this);
+ else {
+ Preset* pFromSub=findPreset(p->prog);
+ pFromSub->merge(p);
+ }
+}
+
+//---------------------------------------------------------
+// readSet
+//---------------------------------------------------------
+void Set::readSet(QDomNode setNode) {
+ while(!setNode.isNull()) {
+ QDomElement setEl = setNode.toElement();
+ if (setEl.isNull())
+ continue;
+ if (setEl.tagName() == "setName")
+ _setName=setEl.text().toAscii().data();
+ if (setEl.tagName() == "deicsOnzeCategory") {
+ //load category
+ QString version = setEl.attribute(QString("version"));
+ if (version == "1.0") {
+ Category* lCategory = new Category();
+ lCategory->readCategory(setNode.firstChild());
+ //printf("Ready to merge!\n");
+ merge(lCategory);
+ }
+ }
+ setNode = setNode.nextSibling();
+ }
+}
+
+//---------------------------------------------------------
+// writeSet
+//---------------------------------------------------------
+void Set::writeSet(AL::Xml* xml, bool onlyUsed) {
+ xml->tag("deicsOnzeSet version=\"1.0\"");
+ xml->strTag("setName",_setName.c_str());
+ for(std::vector<Category*>::iterator i=_categoryVector.begin();
+ i!=_categoryVector.end(); i++) (*i)->writeCategory(xml, onlyUsed);
+ xml->etag("deicsOnzeSet");
+}
+
+//---------------------------------------------------------
+// readCategory
+//---------------------------------------------------------
+void Category::readCategory(QDomNode catNode) {
+ while(!catNode.isNull()) {
+ QDomElement catEl = catNode.toElement();
+ if (catEl.isNull())
+ continue;
+ if (catEl.tagName() == "categoryName")
+ _categoryName=catEl.text().toAscii().data();
+ if (catEl.tagName() == "hbank")
+ _hbank=catEl.text().toInt();
+ if (catEl.tagName() == "deicsOnzeSubcategory") {
+ //load Subcategory
+ QString version = catEl.attribute(QString("version"));
+ if (version == "1.0") {
+ Subcategory* lSubcategory = new Subcategory(this);
+ lSubcategory->readSubcategory(catNode.firstChild());
+ }
+ }
+ catNode = catNode.nextSibling();
+ }
+}
+
+//---------------------------------------------------------
+// writeCategory
+//---------------------------------------------------------
+void Category::writeCategory(AL::Xml* xml, bool onlyUsed) {
+ if((!onlyUsed || _isUsed)) {
+ xml->tag("deicsOnzeCategory version=\"1.0\"");
+ xml->strTag("categoryName",_categoryName.c_str());
+ xml->intTag("hbank", _hbank);
+ for(std::vector<Subcategory*>::iterator i=_subcategoryVector.begin();
+ i!=_subcategoryVector.end(); i++)
+ (*i)->writeSubcategory(xml, onlyUsed);
+ xml->etag("deicsOnzeCategory");
+ }
+}
+
+//---------------------------------------------------------
+// readSubcategory
+//---------------------------------------------------------
+void Subcategory::readSubcategory(QDomNode subNode) {
+ while(!subNode.isNull()) {
+ QDomElement subEl = subNode.toElement();
+ if (subEl.isNull())
+ continue;
+ if (subEl.tagName() == "subcategoryName")
+ _subcategoryName=subEl.text().toAscii().data();
+ if (subEl.tagName() == "lbank")
+ _lbank=subEl.text().toInt();
+ if (subEl.tagName() == "deicsOnzePreset") {
+ //load preset
+ QString version = subEl.attribute(QString("version"));
+ if (version == "1.0") {
+ Preset* lPreset = new Preset(this);
+ lPreset->readPreset(subNode.firstChild());
+ }
+ }
+ subNode = subNode.nextSibling();
+ }
+}
+
+//---------------------------------------------------------
+// writeSubcategory
+//---------------------------------------------------------
+void Subcategory::writeSubcategory(AL::Xml* xml, bool onlyUsed) {
+ if((!onlyUsed || _isUsed)) {
+ xml->tag("deicsOnzeSubcategory version=\"1.0\"");
+ xml->strTag("subcategoryName",_subcategoryName.c_str());
+ xml->intTag("lbank", _lbank);
+ for(std::vector<Preset*>::iterator i=_presetVector.begin();
+ i!=_presetVector.end(); i++) (*i)->writePreset(xml, onlyUsed);
+ xml->etag("deicsOnzeSubcategory");
+ }
+}
+
+//---------------------------------------------------------
+// readPreset
+//---------------------------------------------------------
+void Preset::readPreset(QDomNode presetNode) {
+ while(!presetNode.isNull()) {
+ QDomElement presetEl = presetNode.toElement();
+ if (presetEl.isNull())
+ continue;
+ //algorithm
+ if(presetEl.tagName()==ALGSTR)
+ algorithm=(presetEl.text()=="FIRST"? FIRST:
+ (presetEl.text()=="SECOND"? SECOND:
+ (presetEl.text()=="THIRD"? THIRD:
+ (presetEl.text()=="FOURTH"? FOURTH:
+ (presetEl.text()=="FIFTH"? FIFTH:
+ (presetEl.text()=="SIXTH"? SIXTH:
+ (presetEl.text()=="SEVENTH"? SEVENTH:EIGHTH)))))));
+ //feedback
+ else if(presetEl.tagName()==FEEDBACKSTR)
+ feedback=presetEl.text().toInt();
+ //quick edit
+ else if(presetEl.tagName()==FINEBRIGHTNESSSTR)
+ brightness=presetEl.text().toInt();
+ else if(presetEl.tagName()==MODULATIONSTR)
+ modulation=(unsigned char)presetEl.text().toInt();
+ else if(presetEl.tagName()==GLOBALDETUNESTR)
+ globalDetune=presetEl.text().toInt();
+ else if(presetEl.tagName()==ATTACKSTR)
+ attack=presetEl.text().toInt();
+ else if(presetEl.tagName()==RELEASESTR)
+ release=presetEl.text().toInt();
+ //lfo
+ else if(presetEl.tagName()=="lfo") {
+ QDomNode lfoNode = presetNode.firstChild();
+ while(!lfoNode.isNull()) {
+ QDomElement lfoEl = lfoNode.toElement();
+ if (lfoEl.isNull())
+ continue;
+ if(lfoEl.tagName()==WAVESTR)
+ lfo.wave=(lfoEl.text()=="SAWUP"? SAWUP:
+ (lfoEl.text()=="SQUARE"? SQUARE:
+ (lfoEl.text()=="TRIANGL"? TRIANGL:SHOLD)));
+ else if(lfoEl.tagName()==SPEEDSTR)
+ lfo.speed=lfoEl.text().toInt();
+ else if(lfoEl.tagName()==DELAYSTR)
+ lfo.delay=lfoEl.text().toInt();
+ else if(lfoEl.tagName()==PMODDEPTHSTR)
+ lfo.pModDepth=lfoEl.text().toInt();
+ else if(lfoEl.tagName()==AMODDEPTHSTR)
+ lfo.aModDepth=lfoEl.text().toInt();
+ else if(lfoEl.tagName()==SYNCSTR)
+ lfo.sync=(lfoEl.text()=="on"? true:false);
+ lfoNode = lfoNode.nextSibling();
+ }
+ }
+ //sensitivity
+ else if(presetEl.tagName()=="sensitivity") {
+ QDomNode sensitivityNode = presetNode.firstChild();
+ while(!sensitivityNode.isNull()) {
+ QDomElement sensitivityEl = sensitivityNode.toElement();
+ if (sensitivityEl.isNull())
+ continue;
+ QString st=sensitivityEl.tagName();
+ if(st==PMODSENSSTR)
+ sensitivity.pitch=sensitivityEl.text().toInt();
+ else if(st==AMSSTR)
+ sensitivity.amplitude=sensitivityEl.text().toInt();
+ else if(st.contains(AMESTR, Qt::CaseSensitive)) {
+ int op = (st.remove(AMESTR, Qt::CaseSensitive)).toInt()-1;
+ sensitivity.ampOn[op]=(sensitivityEl.text()=="on"? true:false);
+ }
+ else if(st.contains(EBSSTR, Qt::CaseSensitive)) {
+ int op = (st.remove(EBSSTR, Qt::CaseSensitive)).toInt()-1;
+ sensitivity.egBias[op]=sensitivityEl.text().toInt();
+ }
+ else if(st.contains(KVSSTR, Qt::CaseSensitive)) {
+ int op = (st.remove(KVSSTR, Qt::CaseSensitive)).toInt()-1;
+ sensitivity.keyVelocity[op]=sensitivityEl.text().toInt();
+ }
+ sensitivityNode =sensitivityNode.nextSibling();
+ }
+ }
+ //frequency
+ else if(presetEl.tagName()=="frequency") {
+ QDomNode frequencyNode = presetNode.firstChild();
+ while(!frequencyNode.isNull()) {
+ QDomElement frequencyEl = frequencyNode.toElement();
+ if (frequencyEl.isNull())
+ continue;
+ QString ft = frequencyEl.tagName();
+ if(ft.contains(RATIOSTR, Qt::CaseSensitive)) {
+ int op = (ft.remove(RATIOSTR, Qt::CaseSensitive)).toInt()-1;
+ frequency[op].ratio=frequencyEl.text().toDouble();
+ }
+ else if(ft.contains(FIXSTR, Qt::CaseSensitive)) {
+ int op = (ft.remove(FIXSTR, Qt::CaseSensitive)).toInt()-1;
+ frequency[op].isFix=(frequencyEl.text()=="yes"?true:false);
+ }
+ else if(ft.contains(FIXRANGESTR, Qt::CaseSensitive)) {
+ int op= (ft.remove(FIXRANGESTR, Qt::CaseSensitive)).toInt()-1;
+ frequency[op].freq=frequencyEl.text().toDouble();
+ }
+ frequencyNode =frequencyNode.nextSibling();
+ }
+ }
+ //oscWave
+ else if(presetEl.tagName().contains(OSWSTR, Qt::CaseSensitive)) {
+ int op=(presetEl.tagName().remove(OSWSTR, Qt::CaseSensitive)).toInt()-1;
+ oscWave[op]=(presetEl.text()=="W1"? W1:
+ (presetEl.text()=="W2"?W2:
+ (presetEl.text()=="W3"?W3:
+ (presetEl.text()=="W4"?W4:
+ (presetEl.text()=="W5"?W5:
+ (presetEl.text()=="W6"?W6:
+ (presetEl.text()=="W7"?W7:W8)))))));
+
+ }
+ //detune
+ else if(presetEl.tagName().contains(DETSTR, Qt::CaseSensitive)) {
+ int op=(presetEl.tagName().remove(DETSTR, Qt::CaseSensitive)).toInt()-1;
+ detune[op]=presetEl.text().toInt();
+ }
+ //eg
+ else if(presetEl.tagName()=="eg") {
+ QDomNode egNode = presetNode.firstChild();
+ while(!egNode.isNull()) {
+ QDomElement egEl = egNode.toElement();
+ if (egEl.isNull())
+ continue;
+ QString et=egEl.tagName();
+ if(et.contains(ARSTR, Qt::CaseSensitive)) {
+ int op=(et.remove(ARSTR, Qt::CaseSensitive)).toInt()-1;
+ eg[op].ar=egEl.text().toInt();
+ }
+ else if(et.contains(D1RSTR, Qt::CaseSensitive)) {
+ int op=(et.remove(D1RSTR, Qt::CaseSensitive)).toInt()-1;
+ eg[op].d1r=egEl.text().toInt();
+ }
+ else if(et.contains(D1LSTR, Qt::CaseSensitive)) {
+ int op = (et.remove(D1LSTR, Qt::CaseSensitive)).toInt()-1;
+ eg[op].d1l=egEl.text().toInt();
+ }
+ else if(et.contains(D2RSTR, Qt::CaseSensitive)) {
+ int op=(et.remove(D2RSTR, Qt::CaseSensitive)).toInt()-1;
+ eg[op].d2r=egEl.text().toInt();
+ }
+ else if(et.contains(RRSTR, Qt::CaseSensitive)) {
+ int op=(et.remove(RRSTR, Qt::CaseSensitive)).toInt()-1;
+ eg[op].rr=egEl.text().toInt();
+ }
+ else if(et.contains(SHFTSTR, Qt::CaseSensitive)) {
+ int op=(et.remove(SHFTSTR, Qt::CaseSensitive)).toInt()-1;
+ eg[op].egShift=(egEl.text()=="VOF"?VOF:
+ (egEl.text()=="V48"?V48:
+ (egEl.text()=="V24"?V24:V12)));
+ }
+ egNode =egNode.nextSibling();
+ }
+ }
+ //pitchEg
+ else if(presetEl.tagName()=="pitchEg") {
+ QDomNode pitchEgNode = presetNode.firstChild();
+ while(!pitchEgNode.isNull()) {
+ QDomElement pitchEgEl = pitchEgNode.toElement();
+ if (pitchEgEl.isNull())
+ continue;
+ QString pt=pitchEgEl.tagName();
+ if(pt==PR1STR) pitchEg.pr1=pitchEgEl.text().toInt();
+ else if(pt==PR2STR) pitchEg.pr2=pitchEgEl.text().toInt();
+ else if(pt==PR3STR) pitchEg.pr3=pitchEgEl.text().toInt();
+ else if(pt==PL1STR) pitchEg.pl1=pitchEgEl.text().toInt();
+ else if(pt==PL2STR) pitchEg.pl2=pitchEgEl.text().toInt();
+ else if(pt==PL3STR) pitchEg.pl3=pitchEgEl.text().toInt();
+ pitchEgNode=pitchEgNode.nextSibling();
+ }
+ }
+ //outLevel
+ else if(presetEl.tagName().contains(OUTSTR, Qt::CaseSensitive)) {
+ int op=(presetEl.tagName().remove(OUTSTR, Qt::CaseSensitive)).toInt()-1;
+ outLevel[op]=presetEl.text().toInt();
+ }
+ //scaling
+ else if(presetEl.tagName()=="scaling") {
+ QDomNode scalingNode = presetNode.firstChild();
+ while(!scalingNode.isNull()) {
+ QDomElement scalingEl = scalingNode.toElement();
+ if (scalingEl.isNull())
+ continue;
+ QString st=scalingEl.tagName();
+ if(st.contains(RSSTR, Qt::CaseSensitive)) {
+ int op=(st.remove(RSSTR, Qt::CaseSensitive)).toInt()-1;
+ scaling.rate[op]=scalingEl.text().toInt();
+ }
+ else if(st.contains(LSSTR, Qt::CaseSensitive)) {
+ int op=(st.remove(LSSTR, Qt::CaseSensitive)).toInt()-1;
+ scaling.level[op]=scalingEl.text().toInt();
+ }
+ scalingNode =scalingNode.nextSibling();
+ }
+ }
+ //function
+ else if(presetEl.tagName()=="function") {
+ QDomNode functionNode = presetNode.firstChild();
+ while(!functionNode.isNull()) {
+ QDomElement functionEl = functionNode.toElement();
+ if (functionEl.isNull())
+ continue;
+ QString ft=functionEl.tagName();
+ if(ft==TRANSPOSESTR)
+ function.transpose=functionEl.text().toInt();
+ else if(ft==POLYMODESTR)
+ function.mode=(functionEl.text()=="POLY"?POLY:MONO);
+ else if(ft==PBENDRANGESTR)
+ function.pBendRange=functionEl.text().toInt();
+ else if(ft==PORTAMODESTR)
+ function.portamento=
+ functionEl.text()=="FINGER"?FINGER:FULL;
+ else if(ft==PORTATIMESTR)
+ function.portamentoTime=functionEl.text().toInt();
+ else if(ft==FSWSTR)
+ function.footSw=(functionEl.text()=="POR"?POR:SUS);
+ else if(ft==FCVOLUMESTR)
+ function.fcVolume=functionEl.text().toInt();
+ else if(ft==FCPITCHSTR)
+ function.fcPitch=functionEl.text().toInt();
+ else if(ft==FCAMPLITUDESTR)
+ function.fcAmplitude=functionEl.text().toInt();
+ else if(ft==MWPITCHSTR)
+ function.mwPitch=functionEl.text().toInt();
+ else if(ft==MWAMPLITUDESTR)
+ function.mwAmplitude=functionEl.text().toInt();
+ else if(ft==BCPITCHSTR)
+ function.bcPitch=functionEl.text().toInt();
+ else if(ft==BCAMPLITUDESTR)
+ function.bcAmplitude=functionEl.text().toInt();
+ else if(ft==BCPITCHBIASSTR)
+ function.bcPitchBias=functionEl.text().toInt();
+ else if(ft==BCEGBIASSTR)
+ function.bcEgBias=functionEl.text().toInt();
+ else if(ft=="atPitch")
+ function.atPitch=functionEl.text().toInt();
+ else if(ft=="atAmplitude")
+ function.atAmplitude=functionEl.text().toInt();
+ else if(ft=="atPitchBias")
+ function.atPitchBias=functionEl.text().toInt();
+ else if(ft=="atEgBias")
+ function.atEgBias=functionEl.text().toInt();
+ else if(ft==REVERBRATESTR)
+ function.reverbRate=functionEl.text().toInt();
+ functionNode=functionNode.nextSibling();
+ }
+ }
+ //globalDetune
+ else if(presetEl.tagName()=="globalDetune")
+ globalDetune=presetEl.text().toInt();
+ //Names
+ else if(presetEl.tagName()=="name")
+ name=presetEl.text().toAscii().data();
+ //prog
+ else if(presetEl.tagName()=="prog")
+ prog=presetEl.text().toInt();
+ presetNode = presetNode.nextSibling();
+ }
+}
+
+//---------------------------------------------------------
+// witePreset
+//---------------------------------------------------------
+void Preset::writePreset(AL::Xml* xml, bool onlyUsed) {
+ char s[MAXCHARTAG];
+ if((!onlyUsed || _isUsed)) {
+ xml->tag("deicsOnzePreset version=\"1.0\"");
+
+ //algorithm
+ xml->strTag(ALGSTR, (algorithm==FIRST? "FIRST":
+ (algorithm==SECOND? "SECOND":
+ (algorithm==THIRD? "THIRD":
+ (algorithm==FOURTH? "FOURTH":
+ (algorithm==FIFTH? "FIFTH":
+ (algorithm==SIXTH? "SIXTH":
+ (algorithm==SEVENTH? "SEVENTH":
+ "EIGHTH"))))))));
+ //feedback
+ xml->intTag(FEEDBACKSTR, feedback);
+ //quick edit
+ xml->intTag(FINEBRIGHTNESSSTR, brightness);
+ xml->intTag(MODULATIONSTR, (int)modulation);
+ xml->intTag(GLOBALDETUNESTR, globalDetune);
+ xml->intTag(ATTACKSTR, attack);
+ xml->intTag(RELEASESTR, release);
+ //lfo
+ xml->tag("lfo");
+ xml->strTag(WAVESTR, (lfo.wave==SAWUP? "SAWUP":
+ (lfo.wave==SQUARE? "SQUARE":
+ (lfo.wave==TRIANGL? "TRIANGL":"SHOLD"))));
+ xml->intTag(SPEEDSTR, lfo.speed);
+ xml->intTag(DELAYSTR, lfo.delay);
+ xml->intTag(PMODDEPTHSTR, lfo.pModDepth);
+ xml->intTag(AMODDEPTHSTR, lfo.aModDepth);
+ xml->strTag(SYNCSTR, (lfo.sync==true? "on":"off"));
+ xml->etag("lfo");
+ //sensitivity
+ xml->tag("sensitivity");
+ xml->intTag(PMODSENSSTR, sensitivity.pitch);
+ xml->intTag(AMSSTR, sensitivity.amplitude);
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"AME%d",i+1);
+ xml->strTag(s, (sensitivity.ampOn[i]==true? "on":"off"));
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"EBS%d",i+1);
+ xml->intTag(s, sensitivity.egBias[i]);
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"KVS%d",i+1);
+ xml->intTag(s, sensitivity.keyVelocity[i]);
+ }
+ xml->etag("sensitivity");
+ //frequency
+ xml->tag("frequency");
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"Ratio%d",i+1);
+ xml->floatTag(s, frequency[i].ratio);
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"FIX%d",i+1);
+ xml->strTag(s, (frequency[i].isFix==true? "yes":"no"));
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"FixRange%d",i+1);
+ xml->floatTag(s, frequency[i].freq);
+ }
+ xml->etag("frequency");
+ //oscWave
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"OSW%d",i+1);
+ xml->strTag(s, (oscWave[i]==W1?"W1":
+ (oscWave[i]==W2?"W2":
+ (oscWave[i]==W3?"W3":
+ (oscWave[i]==W4?"W4":
+ (oscWave[i]==W5?"W5":
+ (oscWave[i]==W6?"W6":
+ (oscWave[i]==W7?"W7":"W8"))))))));
+ }
+ //detune
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"DET%d",i+1);
+ xml->intTag(s, detune[i]);
+ }
+ //eg
+ xml->tag("eg");
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"AR%d",i+1);
+ xml->intTag(s, eg[i].ar);
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"D1R%d",i+1);
+ xml->intTag(s, eg[i].d1r);
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"D1L%d",i+1);
+ xml->intTag(s, eg[i].d1l);
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"D2R%d",i+1);
+ xml->intTag(s, eg[i].d2r);
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"RR%d",i+1);
+ xml->intTag(s, eg[i].rr);
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"SHFT%d",i+1);
+ xml->strTag(s, (eg[i].egShift==VOF?"VOF":
+ (eg[i].egShift==V48?"V48":
+ (eg[i].egShift==V24?"V24":"V12"))));
+ }
+ xml->etag("eg");
+ //pitchEg
+ xml->tag("pitchEg");
+ xml->intTag(PR1STR,pitchEg.pr1);
+ xml->intTag(PR2STR,pitchEg.pr2);
+ xml->intTag(PR3STR,pitchEg.pr3);
+ xml->intTag(PL1STR,pitchEg.pl1);
+ xml->intTag(PL2STR,pitchEg.pl2);
+ xml->intTag(PL3STR,pitchEg.pl3);
+ xml->etag("pitchEg");
+ //outLevel
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"OUT%d",i+1);
+ xml->intTag(s, outLevel[i]);
+ }
+ //scaling
+ xml->tag("scaling");
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"RS%d",i+1);
+ xml->intTag(s, scaling.rate[i]);
+ }
+ for(int i=0; i<NBROP; i++) {
+ sprintf(s,"LS%d",i+1);
+ xml->intTag(s, scaling.level[i]);
+ }
+ xml->etag("scaling");
+ //function
+ xml->tag("function");
+ xml->intTag(TRANSPOSESTR, function.transpose);
+ xml->strTag(POLYMODESTR, (function.mode==POLY? "POLY":"MONO"));
+ xml->intTag(PBENDRANGESTR, function.pBendRange);
+ xml->strTag(PORTAMODESTR, (function.portamento==FINGER?
+ "FINGER":"FULL"));
+ xml->intTag(PORTATIMESTR, function.portamentoTime);
+ xml->strTag(FSWSTR, (function.footSw==POR? "POR":"SUS"));
+ xml->intTag(FCVOLUMESTR, function.fcVolume);
+ xml->intTag(FCPITCHSTR, function.fcPitch);
+ xml->intTag(FCAMPLITUDESTR, function.fcAmplitude);
+ xml->intTag(MWPITCHSTR, function.mwPitch);
+ xml->intTag(MWAMPLITUDESTR, function.mwAmplitude);
+ xml->intTag(BCPITCHSTR, function.bcPitch);
+ xml->intTag(BCAMPLITUDESTR, function.bcAmplitude);
+ xml->intTag(BCPITCHBIASSTR, function.bcPitchBias);
+ xml->intTag(BCEGBIASSTR, function.bcEgBias);
+ xml->intTag("atPitch", function.atPitch);
+ xml->intTag("atAmplitude", function.atAmplitude);
+ xml->intTag("atPitchBias", function.atPitchBias);
+ xml->intTag("atEgBias", function.atEgBias);
+ xml->intTag(REVERBRATESTR, function.reverbRate);
+ xml->etag("function");
+ //globalDetune
+ xml->intTag("globalDetune", globalDetune);
+ //preset name
+ xml->strTag("name", name.c_str());
+ //bank prog
+ xml->intTag("prog",prog);
+
+ xml->etag("deicsOnzePreset");
+ }
+}
+
+//---------------------------------------------------------
+// printPreset
+//---------------------------------------------------------
+
+void Preset::printPreset()
+{
+ printf("\n");
+ printf("Algorithm : %d, Feedback : %d\n", algorithm, feedback);
+ printf("LFO : ");
+ switch(lfo.wave)
+ {
+ case(SAWUP) : printf("SAWUP ,"); break;
+ case(SQUARE) : printf("SQUARE ,"); break;
+ case(TRIANGL) : printf("TRIANGL ,"); break;
+ case(SHOLD) : printf("SHOLD ,"); break;
+ default : printf("No defined, "); break;
+ }
+ printf("Speed : %d, Delay : %d, PModD : %d, AModD : %d, ",
+ lfo.speed, lfo.delay, lfo.pModDepth, lfo.aModDepth);
+ if(lfo.sync) printf("Sync\n"); else printf("Not Sync\n");
+ printf("LFO Pitch Sensitivity : %d, LFO Amplitude Sensitivity : %d\n",
+ sensitivity.pitch, sensitivity.amplitude);
+ for(int i=0; i<NBROP; i++)
+ {
+ printf("amp%d ",i+1);
+ if(sensitivity.ampOn) printf("ON "); else printf("OFF ");
+ }
+ printf("\n");
+ for(int i=0; i<NBROP; i++)
+ printf("EgBias%d : %d ",i+1, sensitivity.egBias[i]);
+ printf("\n");
+ for(int i=0; i<NBROP; i++)
+ printf("KVS%d : %d ",i+1, sensitivity.keyVelocity[i]);
+ printf("\n");
+ for(int i=0; i<NBROP; i++)
+ {
+ if(frequency[i].isFix)
+ printf("Freq%d : %f ",i+1, frequency[i].ratio);
+ else printf("Ratio%d : %f ",i+1, frequency[i].ratio);
+ }
+ printf("\n");
+ for(int i=0; i<NBROP; i++)
+ {
+ printf("OscWave%d ", i+1);
+ switch(oscWave[i])
+ {
+ case(W1) : printf("W1 "); break;
+ case(W2) : printf("W2 "); break;
+ case(W3) : printf("W3 "); break;
+ case(W4) : printf("W4 "); break;
+ case(W5) : printf("W5 "); break;
+ case(W6) : printf("W6 "); break;
+ case(W7) : printf("W7 "); break;
+ case(W8) : printf("W8 "); break;
+ default : printf("No defined "); break;
+ }
+ }
+ printf("\n");
+ for(int i=0; i<NBROP; i++)
+ printf("Detune%d : %d ",i+1, detune[i]);
+ printf("\n");
+ for(int i=0; i<NBROP; i++)
+ {
+ printf("AR%d : %d, D1R%d : %d, D1L%d : %d, D2R%d : %d, RR%d : %d, EgShift%d : ",
+ i+1, eg[i].ar, i+1, eg[i].d1r,
+ i+1, eg[i].d1l, i+1, eg[i].d2r, i+1, eg[i].rr, i+1);
+ switch(eg[i].egShift)
+ {
+ case(VOF) : printf("VOF");
+ case(V48) : printf("48");
+ case(V24) : printf("24");
+ case(V12) : printf("12");
+ }
+ printf("\n");
+ }
+ printf("PitchEg pr1 : %d, pr2 : %d, pr3 : %d, pl1 : %d, pl2 : %d, pl3 : %d"
+ , pitchEg.pr1, pitchEg.pr2, pitchEg.pr3,
+ pitchEg.pl1, pitchEg.pl2, pitchEg.pl3);
+ printf("\n");
+ for(int i=0; i<NBROP; i++)
+ printf("OutLevel%d : %d ",i+1, outLevel[i]);
+ printf("\n");
+ printf("Name : %s\n", name.c_str());
+}
+
+void Subcategory::printSubcategory() {
+ std::cout << " " << _subcategoryName << "\n";
+ for(std::vector<Preset*>::iterator i=_presetVector.begin();
+ i!=_presetVector.end(); i++) (*i)->printPreset();
+}
+
+void Category::printCategory() {
+ std::cout << " " << _categoryName << "\n";
+ for(unsigned int i=0; i<_subcategoryVector.size(); i++)
+ _subcategoryVector[i]->printSubcategory();
+}
+
+void Set::printSet() {
+ std::cout << _setName << "\n";
+ for(unsigned int i=0; i<_categoryVector.size(); i++)
+ _categoryVector[i]->printCategory();
+}
diff --git a/muse/synti/deicsonze/deicsonzepreset.h b/muse/synti/deicsonze/deicsonzepreset.h
new file mode 100644
index 00000000..c85d91a3
--- /dev/null
+++ b/muse/synti/deicsonze/deicsonzepreset.h
@@ -0,0 +1,555 @@
+//===========================================================================
+//
+// DeicsOnze an emulator of the YAMAHA DX11 synthesizer
+//
+// Version 0.3
+//
+// deicsonzepreset.h
+//
+//
+// Copyright (c) 2004-2006 Nil Geisweiller
+//
+//
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//===========================================================================
+
+#ifndef __DEICSONZEPRESET_H
+#define __DEICSONZEPRESET_H
+
+// #include <qdom.h>
+
+#include <string>
+#include "al/xml.h"
+
+#define NBROP 4 //do not change
+#define MAXCHARTAG 64
+
+
+//---------------------------------------------------------
+// define strings of the parameter names for load save and ctrl interface
+// number of ctrl
+// following the internal DX11 organization (c.f T81Z manual)
+//---------------------------------------------------------
+#define CTRLOFFSET 0x100
+#define DECAPAR1 13
+#define ARSTR "AR"
+#define ARLONGSTR "AttackRate"
+#define CTRL_AR 0+CTRLOFFSET
+#define MAXAR 31
+#define D1RSTR "D1R"
+#define D1RLONGSTR "Decay1Rate"
+#define CTRL_D1R 1+CTRLOFFSET
+#define MAXD1R 31
+#define D2RSTR "D2R"
+#define D2RLONGSTR "Decay2Rate"
+#define CTRL_D2R 2+CTRLOFFSET
+#define MAXD2R 31
+#define RRSTR "RR"
+#define RRLONGSTR "ReleaseRate"
+#define CTRL_RR 3+CTRLOFFSET
+#define MAXRR 15
+#define D1LSTR "D1L"
+#define D1LLONGSTR "Decay1Level"
+#define CTRL_D1L 4+CTRLOFFSET
+#define MAXD1L 15
+#define LSSTR "LS"
+#define LSLONGSTR "LevelScaling"
+#define CTRL_LS 5+CTRLOFFSET
+#define MAXLS 99
+#define RSSTR "RS"
+#define RSLONGSTR "RateScaling"
+#define CTRL_RS 6+CTRLOFFSET
+#define MAXRS 3
+#define EBSSTR "EBS"
+#define EBSLONGSTR "EGBiasSensitivity"
+#define CTRL_EBS 7+CTRLOFFSET
+#define MAXEBS 7
+#define AMESTR "AME"
+#define AMELONGSTR "AmplitudeModulationEnable"
+#define CTRL_AME 8+CTRLOFFSET
+#define KVSSTR "KVS"
+#define KVSLONGSTR "KeyVelocitySensitivity"
+#define CTRL_KVS 9+CTRLOFFSET
+#define MAXKVS 7
+#define OUTSTR "OUT"
+#define OUTLONGSTR "OperatorOutputLevel"
+#define CTRL_OUT 10+CTRLOFFSET
+#define MAXOUT 99
+#define RATIOSTR "Ratio"
+#define CTRL_RATIO 11+CTRLOFFSET
+#define MAXRATIO 64
+#define DETSTR "DET"
+#define DETLONGSTR "Detune"
+#define CTRL_DET 12+CTRLOFFSET
+#define MAXDET 3
+#define ALGSTR "ALG"
+#define ALGLONGSTR "Algorithm"
+#define CTRL_ALG 52+CTRLOFFSET
+#define MAXALG 7
+#define FEEDBACKSTR "Feedback"
+#define CTRL_FEEDBACK 53+CTRLOFFSET
+#define MAXFEEDBACK 7
+#define SPEEDSTR "Speed"
+#define SPEEDLONGSTR "LFOSpeed"
+#define CTRL_SPEED 54+CTRLOFFSET
+#define MAXSPEED 99
+#define DELAYSTR "Delay"
+#define DELAYLONGSTR "LFODelay"
+#define CTRL_DELAY 55+CTRLOFFSET
+#define MAXDELAY 99
+#define PMODDEPTHSTR "PModDepth"
+#define PMODDEPTHLONGSTR "PitchModulationDepth"
+#define CTRL_PMODDEPTH 56+CTRLOFFSET
+#define MAXPMODDEPTH 99
+#define AMODDEPTHSTR "AModDepth"
+#define AMODDEPTHLONGSTR "AmplitudeModulationDepth"
+#define CTRL_AMODDEPTH 57+CTRLOFFSET
+#define MAXAMODDEPTH 99
+#define SYNCSTR "Sync"
+#define SYNCLONGSTR "LFOSync"
+#define CTRL_SYNC 58+CTRLOFFSET
+#define WAVESTR "Wave"
+#define WAVELONGSTR "LFOWave"
+#define CTRL_WAVE 59+CTRLOFFSET
+#define MAXWAVE 3
+#define PMODSENSSTR "PModSens"
+#define PMODSENSLONGSTR "PitchModulationSensitivity"
+#define CTRL_PMODSENS 60+CTRLOFFSET
+#define MAXPMODSENS 7
+#define AMSSTR "AMS"
+#define AMSLONGSTR "AmplitudeModulationSensitivity"
+#define CTRL_AMS 61+CTRLOFFSET
+#define MAXAMS 3
+#define TRANSPOSESTR "Transpose"
+#define CTRL_TRANSPOSE 62+CTRLOFFSET
+#define MAXTRANSPOSE 24
+#define POLYMODESTR "PolyMode"
+#define CTRL_POLYMODE 63+CTRLOFFSET
+#define PBENDRANGESTR "PBendRange"
+#define PBENDRANGELONGSTR "PitchBendRange"
+#define CTRL_PBENDRANGE 64+CTRLOFFSET
+#define MAXPBENDRANGE 12
+#define PORTAMODESTR "PortaMode"
+#define PORTAMODELONGSTR "PortamentoMode"
+#define CTRL_PORTAMODE 65+CTRLOFFSET
+#define PORTATIMESTR "PortaTime"
+#define PORTATIMELONGSTR "PortamentoTime"
+#define CTRL_PORTATIME 66+CTRLOFFSET
+#define MAXPROTATIME 99
+#define FCVOLUMESTR "FCVolume"
+#define FCVOLUMELONGSTR "FootControllerVolume"
+#define CTRL_FCVOLUME 67+CTRLOFFSET
+#define MAXFCVOLUME 99
+#define FSWSTR "FSW"
+#define FSWLONGSTR "FootSwitch"
+#define CTRL_FSW 68+CTRLOFFSET
+#define MAXFSW 99
+#define MWPITCHSTR "MWPitch"
+#define MWPITCHLONGSTR "ModulationWheelPitch"
+#define CTRL_MWPITCH 71+CTRLOFFSET
+#define MAXMWPITCH 99
+#define MWAMPLITUDESTR "MWAmplitude"
+#define MWAMPLITUDELONGSTR "ModulationWheelAmplitude"
+#define CTRL_MWAMPLITUDE 72+CTRLOFFSET
+#define MAXMWAMPLITUDE 99
+#define BCPITCHSTR "BCPitch"
+#define BCPITCHLONGSTR "BreathControlPitch"
+#define CTRL_BCPITCH 73+CTRLOFFSET
+#define MAXBCPITCH 99
+#define BCAMPLITUDESTR "BCAmplitude"
+#define BCAMPLITUDELONGSTR "BreathControlAmplitude"
+#define CTRL_BCAMPLITUDE 74+CTRLOFFSET
+#define MAXBCAMPLITUDE 99
+#define BCPITCHBIASSTR "BCPitchBias"
+#define BCPITCHBIASLONGSTR "BreathControlPitchBias"
+#define CTRL_BCPITCHBIAS 75+CTRLOFFSET
+#define MAXBCPITCHBIAS 50
+#define BCEGBIASSTR "BCEGBias"
+#define BCEGBIASLONGSTR "BreathControlEGBias"
+#define CTRL_BCEGBIAS 76+CTRLOFFSET
+#define MAXBCEGBIAS 99
+#define MIDATTACK 64
+#define ATPITCHSTR "ATPitch"
+#define ATPITCHLONGSTR "AfterTouchPitch"
+#define CTRL_ATPITCH 77+CTRLOFFSET
+#define MAXATPITCH 99
+#define ATAMPLITUDESTR "ATAmplitude"
+#define ATAMPLITUDELONGSTR "AfterTouchAmplitude"
+#define CTRL_ATAMPLITUDE 78+CTRLOFFSET
+#define MAXATAMPLITUDE 99
+#define ATPITCHBIASSTR "ATPitchBias"
+#define ATPITCHBIASLONGSTR "AfterTouchPitchBias"
+#define CTRL_ATPITCHBIAS 79+CTRLOFFSET
+#define MAXATPITCHBIAS 50
+#define ATEGBIASSTR "ATEGBias"
+#define ATEGBIASLONGSTR "AfterTouchEGBias"
+#define CTRL_ATEGBIAS 80+CTRLOFFSET
+#define MAXATEGBIAS 99
+#define PR1STR "PR1"
+#define PR1LONGSTR "PitchRateEG1"
+#define CTRL_PR1 81+CTRLOFFSET
+#define MAXPR 99
+#define PR2STR "PR2"
+#define PR2LONGSTR "PitchRateEG2"
+#define CTRL_PR2 82+CTRLOFFSET
+#define PR3STR "PR3"
+#define PR3LONGSTR "PitchRateEG3"
+#define CTRL_PR3 83+CTRLOFFSET
+#define PL1STR "PL1"
+#define PL1LONGSTR "PitchLevelEG1"
+#define CTRL_PL1 84+CTRLOFFSET
+#define MAXPL 99
+#define PL2STR "PL2"
+#define PL2LONGSTR "PitchLevelEG2"
+#define CTRL_PL2 85+CTRLOFFSET
+#define PL3STR "PL3"
+#define PL3LONGSTR "PitchLevelEG3"
+#define CTRL_PL3 86+CTRLOFFSET
+#define DECAPAR2 5
+#define FIXSTR "FIX"
+#define FIXLONGSTR "FixedFrequency"
+#define CTRL_FIX 100+CTRLOFFSET
+#define FIXRANGESTR "FixRange"
+#define FIXRANGELONGSTR "FixedFrequencyRange"
+#define CTRL_FIXRANGE 101+CTRLOFFSET
+#define MAXFIXRANGE 255
+#define OSWSTR "OSW"
+#define OSWLONGSTR "OperatorWaveform"
+#define CTRL_OSW 103+CTRLOFFSET
+#define MAXOSW 7
+#define SHFTSTR "SHFT"
+#define SHFTLONGSTR "EGShift"
+#define CTRL_SHFT 104+CTRLOFFSET
+#define MAXSHFT 3
+#define REVERBRATESTR "ReverbRate"
+#define CTRL_REVERBRATE 120+CTRLOFFSET
+#define MAXREVERBRATE 7
+#define FCPITCHSTR "FCPitch"
+#define FCPITCHLONGSTR "FootControllerPitch"
+#define CTRL_FCPITCH 121+CTRLOFFSET
+#define MAXFCPITCH 99
+#define FCAMPLITUDESTR "FCAmplitude"
+#define FCAMPLITUDELONGSTR "FootControllerAmplitude"
+#define CTRL_FCAMPLITUDE 122+CTRLOFFSET
+#define MAXFCAMPLITUDE 99
+#define GLOBALDETUNESTR "GlobalDetune"
+#define CTRL_GLOBALDETUNE 123+CTRLOFFSET
+#define MAXGLOBALDETUNE 31
+#define MASTERVOLUMESTR "MasterVolume"
+#define CTRL_MASTERVOLUME 124+CTRLOFFSET
+#define MAXMASTERVOLUME 255
+#define CTRL_FINEBRIGHTNESS 125+CTRLOFFSET
+#define FINEBRIGHTNESSSTR "FineBrightness"
+#define MAXFINEBRIGHTNESS 4095
+#define MIDFINEBRIGHTNESS (MAXFINEBRIGHTNESS+1)/2
+#define BRIGHTNESSSTR "Brightness"
+#define MAXBRIGHTNESS 127
+#define MIDBRIGHTNESS 64
+#define MAXMODULATION 127
+#define MODULATIONSTR "Modulation"
+#define ATTACKSTR "Attack"
+#define MAXATTACK 127
+#define MIDATTACK 64
+#define RELEASESTR "Attack"
+#define MAXRELEASE 127
+#define MIDRELEASE 64
+#define NBRVOICESSTR "NumberOfVoices"
+#define CTRL_NBRVOICES 127+CTRLOFFSET
+#define MAXNBRVOICES 64
+
+class Preset;
+class Subcategory;
+class Category;
+class Set;
+
+//---------------------------------------------------------
+// Algorithm
+//---------------------------------------------------------
+
+enum Algorithm {
+ FIRST, // Op 0 modulated by Op 1 modulated by Op 2 modulated by Op3
+ SECOND, // Op 0 modulated by Op 1 modulated by both Op 2 and Op 3
+ THIRD, // Op 0 modulated by both Op 3 and Op 1 modulated by Op 2
+ FOURTH, // Op 0 modulated by both Op 1 and Op 2 modulated by Op 3
+ FIFTH, // (Op 0 modulated by Op 1) add to (Op 2 modulated by Op 3)
+ SIXTH, // addition of the three Op 0, 1, 2 all modulated by Op 3
+ SEVENTH, // addition of the three Op 0, 1, 2 with 2 modulated by Op3
+ EIGHTH // addition of the four Op 0, 1, 2, 3
+};
+
+//---------------------------------------------------------
+// Wave of the low frequency modulation
+//---------------------------------------------------------
+enum Wave {
+ SAWUP,
+ SQUARE,
+ TRIANGL,
+ SHOLD
+};
+
+//---------------------------------------------------------
+// Lfo, low frequency modulation
+//---------------------------------------------------------
+struct Lfo {
+ Wave wave;
+ unsigned char speed; //0 to 99
+ unsigned char delay; //0 to 99
+ unsigned char pModDepth; //0 to 99
+ unsigned char aModDepth; //0 to 99
+ bool sync;
+};
+
+//---------------------------------------------------------
+// Sensitivity
+// of the frequency and amplitude of the lfo
+// and the key velocity
+//---------------------------------------------------------
+struct Sensitivity {
+ unsigned char pitch; //0 to 7
+ unsigned char amplitude; //0 to 3
+ bool ampOn[NBROP];
+ unsigned char egBias[NBROP]; //O to 7
+ unsigned char keyVelocity[NBROP]; //0 to 7
+};
+
+//---------------------------------------------------------
+// Frequency
+//---------------------------------------------------------
+struct Frequency {
+ double ratio;
+ bool isFix; //if isFix no ratio but frequency
+ double freq;
+};
+
+//---------------------------------------------------------
+// OscWave
+//---------------------------------------------------------
+enum OscWave {
+ W1, //sine wave
+ W2, //sine˛ relative
+ W3, //half sine
+ W4, //half sine˛ relative
+ W5,
+ W6,
+ W7,
+ W8
+};
+
+enum egShiftValue {VOF, V48, V24, V12};
+
+//---------------------------------------------------------
+// Eg
+// Envelope
+//---------------------------------------------------------
+struct Eg {
+ unsigned char ar; //0 to 31 speed attack
+ unsigned char d1r; //0 to 31 speed decay
+ unsigned char d1l; //0 to 15 level sustain
+ unsigned char d2r; //0 to 31 speed of sustain
+ unsigned char rr; //1 to 15
+ egShiftValue egShift;
+};
+
+//---------------------------------------------------------
+// PitchEg
+//---------------------------------------------------------
+struct PitchEg {
+ unsigned char pr1;//0 to 99
+ unsigned char pr2;//0 to 99
+ unsigned char pr3;//0 to 99
+ unsigned char pl1;//0 to 99
+ unsigned char pl2;//0 to 99
+ unsigned char pl3;//0 to 99
+};
+
+//---------------------------------------------------------
+// Scaling
+//---------------------------------------------------------
+struct Scaling {
+ unsigned char rate[NBROP];//0 to 3
+ unsigned char level[NBROP];//0 to 99
+};
+
+//---------------------------------------------------------
+// Mode
+//---------------------------------------------------------
+enum Mode {
+ POLY,
+ MONO
+};
+
+//---------------------------------------------------------
+// Portamento
+//---------------------------------------------------------
+enum Portamento {
+ FINGER,
+ FULL
+};
+
+//---------------------------------------------------------
+// FootSw
+//---------------------------------------------------------
+enum FootSw {
+ POR,
+ SUS
+};
+//---------------------------------------------------------
+// Function
+//---------------------------------------------------------
+struct Function {
+ int transpose;
+ Mode mode;
+ unsigned char pBendRange;//0 to 12
+ Portamento portamento;
+ unsigned char portamentoTime;//0 to 99
+ FootSw footSw;
+ unsigned char fcVolume;//0 to 99
+ unsigned char fcPitch;//0 to 99
+ unsigned char fcAmplitude;//0 to 99
+ unsigned char mwPitch;//0 to 99
+ unsigned char mwAmplitude;//0 to 99
+ unsigned char bcPitch;//0 to 99
+ unsigned char bcAmplitude;//0 to 99
+ signed char bcPitchBias;//-50 to 50
+ unsigned char bcEgBias;//0 to 99
+ unsigned char atPitch;//0 to 99
+ unsigned char atAmplitude;//0 to 99
+ signed char atPitchBias;//-50 to 50
+ unsigned char atEgBias;//0 to 99
+ signed char reverbRate;//O=off, 1 to 7
+};
+
+//---------------------------------------------------------
+// Preset class
+//---------------------------------------------------------
+
+class Preset {
+ public:
+ Subcategory* _subcategory; //subcategory parent
+ bool _isUsed; //false if the preset has never been used or modified,
+ //in this case the preset is not going to be
+ //save with the project
+ //Attributes
+ Algorithm algorithm;
+ unsigned char feedback; //0 to 7
+ unsigned short brightness; //0 to 4095
+ unsigned char attack; //0 to 127
+ unsigned char release; //0 to 127
+ Lfo lfo;
+ Sensitivity sensitivity;
+ Frequency frequency[NBROP];
+ OscWave oscWave[NBROP];
+ signed char detune[NBROP]; //-3 to 3
+ Eg eg[NBROP];
+ PitchEg pitchEg;
+ unsigned char outLevel[NBROP]; //0 to 99
+ Scaling scaling;
+ Function function;
+ int globalDetune; //-31 to 31
+ std::string name;
+ unsigned char modulation; //0 to 127
+ int prog; //0 to 127
+ //Methods
+ void printPreset();
+ void initPreset();
+ void readPreset(QDomNode qdn);
+ void writePreset(AL::Xml* xml, bool onlyUsed);
+ void linkSubcategory(Subcategory* sub);
+ void merge(Preset* p); //copy the data of p in the preset
+ void setIsUsed(bool b); //set flag _isUsed and transmit in the parents
+ //Constructor destructor
+ Preset();
+ Preset(Subcategory* sub);
+ Preset(Subcategory* sub, int prog);
+ ~Preset();
+};
+
+//---------------------------------------------------------------
+// Bank, organized by a tree of category, subcategory, preset
+//---------------------------------------------------------------
+class Subcategory {
+ public:
+ Category* _category;//parent category
+ bool _isUsed; //false if the subcategory has never been used or modified,
+ //in this case the subcategory is not going to be
+ //save with the project
+ std::string _subcategoryName;
+ int _lbank; //0 to 127
+ std::vector<Preset*> _presetVector;
+ Preset* findPreset(int prog);
+ void readSubcategory(QDomNode subNode);
+ void writeSubcategory(AL::Xml* xml, bool onlyUsed);
+ void printSubcategory();
+ void linkCategory(Category* cat);
+ void unlink();
+ bool isFreeProg(int prog);
+ int firstFreeProg();
+ void merge(Preset*);
+ //Constructor destructor
+ Subcategory();
+ Subcategory(Category* cat);
+ Subcategory(const std::string name);
+ Subcategory(Category* cat, const std::string name, int lbank);
+ ~Subcategory();
+};
+
+class Category {
+ public:
+ Set* _set;//parent set
+ bool _isUsed; //false if the category has never been used or modified,
+ //in this case the category is not going to be
+ //save with the project
+ std::string _categoryName;
+ int _hbank; //0 to 127
+ std::vector<Subcategory*> _subcategoryVector;
+ Subcategory* findSubcategory(int lbank);
+ Preset* findPreset(int lbank, int prog);
+ void readCategory(QDomNode catNode);
+ void writeCategory(AL::Xml* xml, bool onlyUsed);
+ void printCategory();
+ void linkSet(Set* s);
+ void unlink();
+ bool isFreeLBank(int lbank);
+ int firstFreeLBank(); //return -1 if no free
+ void merge(Subcategory*);
+ //Constructor Destructor
+ Category();
+ Category(Set* s);
+ Category(Set* s,const std::string name, int hbank);
+ ~Category();
+};
+
+class Set {
+ public:
+ std::string _setName;
+ std::vector<Category*> _categoryVector;
+ Preset* findPreset(int hbank, int lbank, int prog);
+ Category* findCategory(int hbank);
+ void readSet(QDomNode setNode);
+ void writeSet(AL::Xml* xml, bool onlyUsed);
+ void printSet();
+ bool isFreeHBank(int hbank);
+ int firstFreeHBank();
+ void merge(Category*);
+ //Constructor Destructor
+ Set(const std::string name){_setName=name;}
+ ~Set() {
+ while(!_categoryVector.empty()) delete(*_categoryVector.begin());
+ }
+};
+
+#endif /* __DEICSONZE_H */
diff --git a/muse/synti/deicsonze/pics/SHold.fig b/muse/synti/deicsonze/pics/SHold.fig
new file mode 100644
index 00000000..2e1d2431
--- /dev/null
+++ b/muse/synti/deicsonze/pics/SHold.fig
@@ -0,0 +1,12 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 8
+ 720 968 855 968 855 1035 990 1035 990 900 1125 900
+ 1125 945 1260 945
diff --git a/muse/synti/deicsonze/pics/SHold.png b/muse/synti/deicsonze/pics/SHold.png
new file mode 100644
index 00000000..b500ca67
--- /dev/null
+++ b/muse/synti/deicsonze/pics/SHold.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/algo1.fig b/muse/synti/deicsonze/pics/algo1.fig
new file mode 100644
index 00000000..f90714b7
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo1.fig
@@ -0,0 +1,31 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+6 2070 1530 4275 1890
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 2430 1665 2655 1665
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 3015 1665 3240 1665
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 3600 1665 3825 1665
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 4185 1665 4275 1665 4275 1890 4006 1890 4006 1800
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2070 1530 2430 1530 2430 1800 2070 1800 2070 1530
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2655 1530 3015 1530 3015 1800 2655 1800 2655 1530
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3240 1530 3600 1530 3600 1800 3240 1800 3240 1530
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3825 1530 4185 1530 4185 1800 3825 1800 3825 1530
+4 0 0 50 -1 0 12 0.0000 4 180 336 2093 1718 Op1\001
+4 0 0 50 -1 0 12 0.0000 4 180 336 2677 1718 Op2\001
+4 0 0 50 -1 0 12 0.0000 4 180 336 3262 1718 Op3\001
+4 0 0 50 -1 0 12 0.0000 4 180 336 3847 1718 Op4\001
+-6
diff --git a/muse/synti/deicsonze/pics/algo1.png b/muse/synti/deicsonze/pics/algo1.png
new file mode 100644
index 00000000..1347af71
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo1.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/algo2.fig b/muse/synti/deicsonze/pics/algo2.fig
new file mode 100644
index 00000000..d0dbea38
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo2.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 2475 1710 2700 1710
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 3060 1710 3195 1710
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
+ 3285 1530 3195 1530 3195 1800 3285 1800
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2115 1575 2475 1575 2475 1845 2115 1845 2115 1575
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2700 1575 3060 1575 3060 1845 2700 1845 2700 1575
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3285 1665 3645 1665 3645 1890 3285 1890 3285 1665
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3285 1440 3645 1440 3645 1665 3285 1665 3285 1440
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 3645 1800 3735 1800 3735 1935 3465 1935 3465 1890
+4 0 0 50 -1 0 12 0.0000 4 150 315 3307 1590 Op3\001
+4 0 0 50 -1 0 12 0.0000 4 150 315 3315 1822 Op4\001
+4 0 0 50 -1 0 12 0.0000 4 165 315 2138 1762 Op1\001
+4 0 0 50 -1 0 12 0.0000 4 150 315 2722 1762 Op2\001
diff --git a/muse/synti/deicsonze/pics/algo2.png b/muse/synti/deicsonze/pics/algo2.png
new file mode 100644
index 00000000..7d623227
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo2.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/algo3.fig b/muse/synti/deicsonze/pics/algo3.fig
new file mode 100644
index 00000000..9efaa53f
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo3.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 3060 1575 3285 1575
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 2475 1710 2610 1710
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 3060 1800 3150 1800 3150 1935 2880 1935 2880 1890
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
+ 2700 1530 2610 1530 2610 1800 2700 1800
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3285 1440 3645 1440 3645 1710 3285 1710 3285 1440
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2700 1665 3060 1665 3060 1890 2700 1890 2700 1665
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2700 1440 3060 1440 3060 1665 2700 1665 2700 1440
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2115 1575 2475 1575 2475 1845 2115 1845 2115 1575
+4 0 0 50 -1 0 12 0.0000 4 150 315 2722 1590 Op2\001
+4 0 0 50 -1 0 12 0.0000 4 150 315 2730 1822 Op4\001
+4 0 0 50 -1 0 12 0.0000 4 150 315 3307 1627 Op3\001
+4 0 0 50 -1 0 12 0.0000 4 165 315 2138 1762 Op1\001
diff --git a/muse/synti/deicsonze/pics/algo3.png b/muse/synti/deicsonze/pics/algo3.png
new file mode 100644
index 00000000..b091cc16
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo3.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/algo4.fig b/muse/synti/deicsonze/pics/algo4.fig
new file mode 100644
index 00000000..26d12f54
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo4.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 2475 1710 2610 1710
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
+ 2700 1530 2610 1530 2610 1800 2700 1800
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2700 1665 3060 1665 3060 1890 2700 1890 2700 1665
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2700 1440 3060 1440 3060 1665 2700 1665 2700 1440
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2115 1575 2475 1575 2475 1845 2115 1845 2115 1575
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3285 1620 3645 1620 3645 1890 3285 1890 3285 1620
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 3645 1755 3735 1755 3735 1530 3465 1530 3465 1620
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 3060 1755 3285 1755
+4 0 0 50 -1 0 12 0.0000 4 150 315 2722 1590 Op2\001
+4 0 0 50 -1 0 12 0.0000 4 150 315 2730 1822 Op3\001
+4 0 0 50 -1 0 12 0.0000 4 165 315 2138 1762 Op1\001
+4 0 0 50 -1 0 12 0.0000 4 150 315 3307 1807 Op4\001
diff --git a/muse/synti/deicsonze/pics/algo4.png b/muse/synti/deicsonze/pics/algo4.png
new file mode 100644
index 00000000..de0e6d26
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo4.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/algo5.fig b/muse/synti/deicsonze/pics/algo5.fig
new file mode 100644
index 00000000..63731eba
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo5.fig
@@ -0,0 +1,34 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+6 2115 1575 2475 1845
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2115 1575 2475 1575 2475 1845 2115 1845 2115 1575
+4 0 0 50 -1 0 12 0.0000 4 165 315 2138 1762 Op1\001
+-6
+6 3330 1575 4320 1935
+6 3870 1575 4320 1935
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3870 1575 4230 1575 4230 1845 3870 1845 3870 1575
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 4230 1710 4320 1710 4320 1935 4050 1935 4050 1845
+4 0 0 50 -1 0 12 0.0000 4 150 315 3892 1762 Op4\001
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 3690 1710 3870 1710
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3330 1575 3690 1575 3690 1845 3330 1845 3330 1575
+4 0 0 50 -1 0 12 0.0000 4 150 315 3353 1762 Op3\001
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 2475 1710 2655 1710
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2655 1575 3015 1575 3015 1845 2655 1845 2655 1575
+4 0 0 50 -1 0 12 0.0000 4 150 315 2678 1762 Op2\001
+4 0 0 50 -1 0 12 0.0000 4 75 105 3127 1763 +\001
diff --git a/muse/synti/deicsonze/pics/algo5.png b/muse/synti/deicsonze/pics/algo5.png
new file mode 100644
index 00000000..2e41a1db
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo5.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/algo6.fig b/muse/synti/deicsonze/pics/algo6.fig
new file mode 100644
index 00000000..4e23b8fa
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo6.fig
@@ -0,0 +1,37 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+6 2115 1575 2475 1845
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2115 1575 2475 1575 2475 1845 2115 1845 2115 1575
+4 0 0 50 -1 0 12 0.0000 4 165 315 2138 1762 Op1\001
+-6
+6 3195 1575 3555 1845
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3195 1575 3555 1575 3555 1845 3195 1845 3195 1575
+4 0 0 50 -1 0 12 0.0000 4 150 315 3218 1762 Op3\001
+-6
+6 3825 1575 4275 1935
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3825 1575 4185 1575 4185 1845 3825 1845 3825 1575
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 4185 1710 4275 1710 4275 1935 4005 1935 4005 1845
+4 0 0 50 -1 0 12 0.0000 4 150 315 3847 1762 Op4\001
+-6
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2655 1575 3015 1575 3015 1845 2655 1845 2655 1575
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 3825 1710 3555 1710
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
+ 3690 1710 3690 1530 2835 1530 2835 1575
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
+ 2835 1530 2295 1530 2295 1575
+4 0 0 50 -1 0 12 0.0000 4 150 315 2678 1762 Op2\001
+4 0 0 50 -1 0 12 0.0000 4 75 105 3060 1755 +\001
+4 0 0 50 -1 0 12 0.0000 4 75 105 2520 1755 +\001
diff --git a/muse/synti/deicsonze/pics/algo6.png b/muse/synti/deicsonze/pics/algo6.png
new file mode 100644
index 00000000..80de4a94
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo6.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/algo7.fig b/muse/synti/deicsonze/pics/algo7.fig
new file mode 100644
index 00000000..6d0fe501
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo7.fig
@@ -0,0 +1,35 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+6 2115 1575 2475 1845
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2115 1575 2475 1575 2475 1845 2115 1845 2115 1575
+4 0 0 50 -1 0 12 0.0000 4 165 315 2138 1762 Op1\001
+-6
+6 2745 1575 3105 1845
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2745 1575 3105 1575 3105 1845 2745 1845 2745 1575
+4 0 0 50 -1 0 12 0.0000 4 150 315 2768 1762 Op2\001
+-6
+6 3375 1575 3735 1845
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3375 1575 3735 1575 3735 1845 3375 1845 3375 1575
+4 0 0 50 -1 0 12 0.0000 4 150 315 3398 1762 Op3\001
+-6
+6 3915 1575 4365 1935
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3915 1575 4275 1575 4275 1845 3915 1845 3915 1575
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 4275 1710 4365 1710 4365 1935 4095 1935 4095 1845
+4 0 0 50 -1 0 12 0.0000 4 150 315 3937 1762 Op4\001
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 3735 1710 3915 1710
+4 0 0 50 -1 0 12 0.0000 4 75 105 2565 1755 +\001
+4 0 0 50 -1 0 12 0.0000 4 75 105 3195 1755 +\001
diff --git a/muse/synti/deicsonze/pics/algo7.png b/muse/synti/deicsonze/pics/algo7.png
new file mode 100644
index 00000000..0cdda327
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo7.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/algo8.fig b/muse/synti/deicsonze/pics/algo8.fig
new file mode 100644
index 00000000..8bf9dcc9
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo8.fig
@@ -0,0 +1,34 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+6 2115 1575 2475 1845
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2115 1575 2475 1575 2475 1845 2115 1845 2115 1575
+4 0 0 50 -1 0 12 0.0000 4 165 315 2138 1762 Op1\001
+-6
+6 2745 1575 3105 1845
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 2745 1575 3105 1575 3105 1845 2745 1845 2745 1575
+4 0 0 50 -1 0 12 0.0000 4 150 315 2768 1762 Op2\001
+-6
+6 3375 1575 3735 1845
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3375 1575 3735 1575 3735 1845 3375 1845 3375 1575
+4 0 0 50 -1 0 12 0.0000 4 150 315 3398 1762 Op3\001
+-6
+6 4005 1575 4455 1935
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 4005 1575 4365 1575 4365 1845 4005 1845 4005 1575
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 4365 1710 4455 1710 4455 1935 4185 1935 4185 1845
+4 0 0 50 -1 0 12 0.0000 4 150 315 4027 1762 Op4\001
+-6
+4 0 0 50 -1 0 12 0.0000 4 75 105 2565 1755 +\001
+4 0 0 50 -1 0 12 0.0000 4 75 105 3195 1755 +\001
+4 0 0 50 -1 0 12 0.0000 4 75 105 3825 1755 +\001
diff --git a/muse/synti/deicsonze/pics/algo8.png b/muse/synti/deicsonze/pics/algo8.png
new file mode 100644
index 00000000..17ca60d7
--- /dev/null
+++ b/muse/synti/deicsonze/pics/algo8.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/sawUp.fig b/muse/synti/deicsonze/pics/sawUp.fig
new file mode 100644
index 00000000..2c701818
--- /dev/null
+++ b/muse/synti/deicsonze/pics/sawUp.fig
@@ -0,0 +1,13 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+6 450 720 990 855
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 450 855 720 720 720 855 990 720 990 855
+-6
diff --git a/muse/synti/deicsonze/pics/sawUp.png b/muse/synti/deicsonze/pics/sawUp.png
new file mode 100644
index 00000000..d0541858
--- /dev/null
+++ b/muse/synti/deicsonze/pics/sawUp.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/square.fig b/muse/synti/deicsonze/pics/square.fig
new file mode 100644
index 00000000..0adb802e
--- /dev/null
+++ b/muse/synti/deicsonze/pics/square.fig
@@ -0,0 +1,14 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+6 540 540 1080 675
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 10
+ 540 608 540 540 675 540 675 675 810 675 810 540
+ 945 540 945 675 1080 675 1080 608
+-6
diff --git a/muse/synti/deicsonze/pics/square.png b/muse/synti/deicsonze/pics/square.png
new file mode 100644
index 00000000..f2293267
--- /dev/null
+++ b/muse/synti/deicsonze/pics/square.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/triangl.fig b/muse/synti/deicsonze/pics/triangl.fig
new file mode 100644
index 00000000..95970995
--- /dev/null
+++ b/muse/synti/deicsonze/pics/triangl.fig
@@ -0,0 +1,13 @@
+#FIG 3.2
+Landscape
+Center
+Metric
+A4
+100.00
+Single
+-2
+1200 2
+6 360 630 900 765
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 6
+ 360 698 428 630 563 765 698 630 833 765 900 698
+-6
diff --git a/muse/synti/deicsonze/pics/triangl.png b/muse/synti/deicsonze/pics/triangl.png
new file mode 100644
index 00000000..c0937be9
--- /dev/null
+++ b/muse/synti/deicsonze/pics/triangl.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/wave1.fig b/muse/synti/deicsonze/pics/wave1.fig
new file mode 100644
index 00000000..9cf6f065
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave1.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 1650 1350 2325 1500
+2 1 0 1 -1 -1 10 0 -1 0.000 0 0 0 0 0 100
+ 1658 1424 1665 1415 1670 1406 1678 1397 1684 1388 1692 1380
+ 1697 1373 1704 1367 1711 1361 1718 1357 1724 1353 1731 1351
+ 1738 1350 1745 1350 1751 1352 1758 1354 1765 1358 1770 1363
+ 1778 1368 1784 1375 1792 1382 1797 1390 1804 1399 1811 1408
+ 1818 1418 1824 1427 1831 1436 1837 1445 1845 1454 1850 1463
+ 1858 1471 1864 1477 1871 1484 1877 1489 1884 1493 1891 1496
+ 1898 1498 1904 1499 1911 1498 1918 1497 1925 1494 1931 1490
+ 1937 1485 1945 1479 1950 1472 1958 1465 1964 1456 1971 1447
+ 1977 1439 1984 1429 1991 1420 1998 1411 2003 1401 2011 1392
+ 2017 1384 2025 1376 2030 1370 2037 1364 2044 1359 2051 1355
+ 2057 1352 2064 1350 2071 1350 2078 1351 2084 1353 2091 1356
+ 2098 1360 2103 1365 2111 1371 2117 1379 2125 1386 2130 1395
+ 2137 1403 2144 1413 2151 1422 2157 1432 2164 1441 2170 1450
+ 2178 1458 2183 1466 2191 1474 2197 1481 2204 1486 2210 1491
+ 2217 1495 2224 1497 2231 1499 2237 1499 2244 1497 2251 1496
+ 2258 1492 2264 1487 2270 1482 2278 1476 2283 1468 2291 1461
+ 2297 1452 2304 1443 2310 1434 2317 1424
+-6
diff --git a/muse/synti/deicsonze/pics/wave1.gnuplot b/muse/synti/deicsonze/pics/wave1.gnuplot
new file mode 100644
index 00000000..ff4aa2ed
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave1.gnuplot
@@ -0,0 +1,2 @@
+set terminal fig
+plot [0:4*pi] sin(x)
diff --git a/muse/synti/deicsonze/pics/wave1.png b/muse/synti/deicsonze/pics/wave1.png
new file mode 100644
index 00000000..009aa7f7
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave1.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/wave2.fig b/muse/synti/deicsonze/pics/wave2.fig
new file mode 100644
index 00000000..2da89e13
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave2.fig
@@ -0,0 +1,31 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 1650 1350 2325 1500
+2 1 0 1 -1 -1 10 0 -1 0.000 0 0 0 0 0 2
+ 2079 1350 2079 1353
+2 1 0 1 -1 -1 10 0 -1 0.000 0 0 0 0 0 100
+ 1658 1425 1665 1423 1670 1419 1678 1414 1685 1407 1692 1398
+ 1697 1389 1704 1380 1711 1371 1719 1363 1724 1357 1731 1353
+ 1738 1350 1743 1351 1751 1353 1758 1358 1765 1365 1770 1373
+ 1777 1382 1784 1391 1792 1401 1797 1409 1804 1415 1811 1421
+ 1818 1424 1824 1425 1831 1426 1838 1431 1845 1436 1850 1444
+ 1857 1453 1865 1462 1872 1472 1877 1480 1884 1487 1891 1494
+ 1899 1497 1904 1499 1911 1498 1918 1495 1923 1489 1930 1483
+ 1938 1473 1945 1465 1950 1455 1957 1446 1964 1438 1971 1431
+ 1977 1427 1984 1425 1991 1425 1998 1422 2003 1417 2011 1411
+ 2018 1403 2025 1394 2030 1385 2037 1375 2044 1367 2052 1359
+ 2057 1354 2064 1351 2071 1350 2076 1351 2084 1355 2091 1361
+ 2098 1369 2103 1377 2110 1387 2118 1396 2125 1405 2130 1412
+ 2137 1419 2144 1422 2151 1425 2157 1425 2164 1428 2171 1433
+ 2178 1440 2183 1448 2190 1457 2198 1467 2205 1476 2210 1484
+ 2217 1491 2224 1496 2232 1499 2237 1499 2244 1497 2251 1493
+ 2256 1486 2263 1478 2271 1469 2278 1459 2283 1451 2290 1442
+ 2297 1435 2304 1429 2310 1425 2317 1425
+-6
diff --git a/muse/synti/deicsonze/pics/wave2.gnuplot b/muse/synti/deicsonze/pics/wave2.gnuplot
new file mode 100644
index 00000000..01e57a9b
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave2.gnuplot
@@ -0,0 +1,2 @@
+set terminal fig
+plot [0:4*pi] sin(x)*abs(sin(x))
diff --git a/muse/synti/deicsonze/pics/wave2.png b/muse/synti/deicsonze/pics/wave2.png
new file mode 100644
index 00000000..5f4daaee
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave2.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/wave3.fig b/muse/synti/deicsonze/pics/wave3.fig
new file mode 100644
index 00000000..5051c2ef
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave3.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 1650 1350 2325 1500
+2 1 0 1 -1 -1 10 0 -1 0.000 0 0 0 0 0 100
+ 1658 1496 1665 1478 1671 1458 1678 1442 1685 1424 1691 1408
+ 1697 1396 1704 1382 1711 1372 1718 1362 1724 1358 1731 1352
+ 1738 1350 1745 1352 1751 1352 1758 1358 1765 1364 1772 1374
+ 1777 1386 1784 1398 1791 1412 1797 1428 1804 1446 1811 1462
+ 1818 1482 1824 1496 1831 1496 1838 1496 1845 1496 1851 1496
+ 1857 1496 1864 1496 1871 1496 1877 1496 1884 1496 1891 1496
+ 1898 1496 1904 1496 1911 1496 1918 1496 1925 1496 1931 1496
+ 1938 1496 1944 1496 1950 1496 1957 1496 1964 1496 1971 1496
+ 1977 1496 1984 1496 1991 1486 1998 1468 2004 1450 2011 1432
+ 2018 1418 2025 1402 2030 1388 2037 1378 2044 1368 2051 1360
+ 2057 1354 2064 1352 2071 1350 2078 1352 2084 1354 2091 1362
+ 2098 1370 2105 1380 2110 1392 2117 1406 2124 1420 2130 1438
+ 2137 1454 2144 1472 2151 1492 2157 1496 2164 1496 2171 1496
+ 2178 1496 2184 1496 2191 1496 2197 1496 2204 1496 2210 1496
+ 2217 1496 2224 1496 2231 1496 2237 1496 2244 1496 2251 1496
+ 2258 1496 2264 1496 2271 1496 2277 1496 2283 1496 2290 1496
+ 2297 1496 2304 1496 2310 1496 2317 1496
+-6
diff --git a/muse/synti/deicsonze/pics/wave3.gnuplot b/muse/synti/deicsonze/pics/wave3.gnuplot
new file mode 100644
index 00000000..e97c06b8
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave3.gnuplot
@@ -0,0 +1,2 @@
+set terminal fig
+plot [0:4*pi] [-1:1] (x<pi || (x>2*pi && x<3*pi))?sin(x):0
diff --git a/muse/synti/deicsonze/pics/wave3.png b/muse/synti/deicsonze/pics/wave3.png
new file mode 100644
index 00000000..6e0ada6d
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave3.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/wave4.fig b/muse/synti/deicsonze/pics/wave4.fig
new file mode 100644
index 00000000..cb54e0e6
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave4.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 1650 1350 2325 1500
+2 1 0 1 -1 -1 10 0 -1 0.000 0 0 0 0 0 100
+ 1658 1495 1665 1493 1671 1486 1678 1475 1685 1461 1691 1444
+ 1697 1426 1704 1408 1711 1390 1718 1375 1724 1363 1731 1354
+ 1738 1350 1745 1351 1751 1356 1758 1366 1765 1379 1772 1394
+ 1777 1412 1784 1431 1791 1448 1797 1465 1804 1479 1811 1489
+ 1818 1494 1824 1495 1831 1495 1838 1495 1845 1495 1851 1495
+ 1857 1495 1864 1495 1871 1495 1877 1495 1884 1495 1891 1495
+ 1898 1495 1904 1495 1911 1495 1918 1495 1925 1495 1931 1495
+ 1938 1495 1944 1495 1950 1495 1957 1495 1964 1495 1971 1495
+ 1977 1495 1984 1495 1991 1495 1998 1490 2004 1481 2011 1469
+ 2018 1453 2025 1435 2030 1417 2037 1399 2044 1383 2051 1369
+ 2057 1358 2064 1352 2071 1350 2078 1353 2084 1361 2091 1372
+ 2098 1386 2105 1403 2110 1421 2117 1440 2124 1457 2130 1472
+ 2137 1484 2144 1492 2151 1495 2157 1495 2164 1495 2171 1495
+ 2178 1495 2184 1495 2191 1495 2197 1495 2204 1495 2210 1495
+ 2217 1495 2224 1495 2231 1495 2237 1495 2244 1495 2251 1495
+ 2258 1495 2264 1495 2271 1495 2277 1495 2283 1495 2290 1495
+ 2297 1495 2304 1495 2310 1495 2317 1495
+-6
diff --git a/muse/synti/deicsonze/pics/wave4.gnuplot b/muse/synti/deicsonze/pics/wave4.gnuplot
new file mode 100644
index 00000000..bf7b43c9
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave4.gnuplot
@@ -0,0 +1,2 @@
+set terminal fig
+plot [0:4*pi] [-1:1] (x<pi || (x>2*pi && x<3*pi))?sin(x)*abs(sin(x)):0
diff --git a/muse/synti/deicsonze/pics/wave4.png b/muse/synti/deicsonze/pics/wave4.png
new file mode 100644
index 00000000..f104e06c
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave4.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/wave5.fig b/muse/synti/deicsonze/pics/wave5.fig
new file mode 100644
index 00000000..5d60ea7e
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave5.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 1650 1350 2325 1500
+2 1 0 1 -1 -1 10 0 -1 0.000 0 0 0 0 0 100
+ 1658 1425 1665 1406 1671 1388 1678 1373 1685 1361 1691 1353
+ 1697 1350 1704 1352 1711 1358 1718 1368 1724 1382 1731 1399
+ 1738 1417 1745 1436 1751 1454 1758 1470 1765 1484 1772 1493
+ 1777 1498 1784 1498 1791 1494 1797 1485 1804 1472 1811 1456
+ 1818 1438 1824 1425 1831 1425 1838 1425 1845 1425 1851 1425
+ 1857 1425 1864 1425 1871 1425 1877 1425 1884 1425 1891 1425
+ 1898 1425 1904 1425 1911 1425 1918 1425 1925 1425 1931 1425
+ 1938 1425 1944 1425 1950 1425 1957 1425 1964 1425 1971 1425
+ 1977 1425 1984 1425 1991 1415 1998 1397 2004 1380 2011 1367
+ 2018 1357 2025 1351 2030 1350 2037 1354 2044 1363 2051 1375
+ 2057 1390 2064 1408 2071 1427 2078 1446 2084 1463 2091 1477
+ 2098 1489 2105 1496 2110 1499 2117 1497 2124 1490 2130 1479
+ 2137 1465 2144 1448 2151 1429 2157 1425 2164 1425 2171 1425
+ 2178 1425 2184 1425 2191 1425 2197 1425 2204 1425 2210 1425
+ 2217 1425 2224 1425 2231 1425 2237 1425 2244 1425 2251 1425
+ 2258 1425 2264 1425 2271 1425 2277 1425 2283 1425 2290 1425
+ 2297 1425 2304 1425 2310 1425 2317 1425
+-6
diff --git a/muse/synti/deicsonze/pics/wave5.gnuplot b/muse/synti/deicsonze/pics/wave5.gnuplot
new file mode 100644
index 00000000..066cb3d4
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave5.gnuplot
@@ -0,0 +1,2 @@
+set terminal fig
+plot [0:4*pi] [-1:1] (x<pi || (x>2*pi && x<3*pi))?sin(2*x):0
diff --git a/muse/synti/deicsonze/pics/wave5.png b/muse/synti/deicsonze/pics/wave5.png
new file mode 100644
index 00000000..003af248
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave5.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/wave6.fig b/muse/synti/deicsonze/pics/wave6.fig
new file mode 100644
index 00000000..5bad4b67
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave6.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 1650 1350 2325 1500
+2 1 0 1 -1 -1 10 0 -1 0.000 0 0 0 0 0 100
+ 1658 1425 1665 1420 1671 1407 1678 1389 1685 1371 1691 1357
+ 1697 1350 1704 1353 1711 1365 1718 1382 1724 1401 1731 1416
+ 1738 1424 1745 1426 1751 1436 1758 1453 1765 1472 1772 1488
+ 1777 1497 1784 1498 1791 1490 1797 1474 1804 1455 1811 1438
+ 1818 1427 1824 1425 1831 1425 1838 1425 1845 1425 1851 1425
+ 1857 1425 1864 1425 1871 1425 1877 1425 1884 1425 1891 1425
+ 1898 1425 1904 1425 1911 1425 1918 1425 1925 1425 1931 1425
+ 1938 1425 1944 1425 1950 1425 1957 1425 1964 1425 1971 1425
+ 1977 1425 1984 1425 1991 1423 1998 1414 2004 1398 2011 1380
+ 2018 1363 2025 1352 2030 1350 2037 1358 2044 1373 2051 1391
+ 2057 1409 2064 1421 2071 1425 2078 1430 2084 1444 2091 1462
+ 2098 1480 2105 1494 2110 1499 2117 1495 2124 1482 2130 1464
+ 2137 1446 2144 1432 2151 1425 2157 1425 2164 1425 2171 1425
+ 2178 1425 2184 1425 2191 1425 2197 1425 2204 1425 2210 1425
+ 2217 1425 2224 1425 2231 1425 2237 1425 2244 1425 2251 1425
+ 2258 1425 2264 1425 2271 1425 2277 1425 2283 1425 2290 1425
+ 2297 1425 2304 1425 2310 1425 2317 1425
+-6
diff --git a/muse/synti/deicsonze/pics/wave6.gnuplot b/muse/synti/deicsonze/pics/wave6.gnuplot
new file mode 100644
index 00000000..e1eed2e5
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave6.gnuplot
@@ -0,0 +1,2 @@
+set terminal fig
+plot [0:4*pi] [-1:1] (x<pi || (x>2*pi && x<3*pi))?sin(2*x)*abs(sin(2*x)):0
diff --git a/muse/synti/deicsonze/pics/wave6.png b/muse/synti/deicsonze/pics/wave6.png
new file mode 100644
index 00000000..08e717ce
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave6.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/wave7.fig b/muse/synti/deicsonze/pics/wave7.fig
new file mode 100644
index 00000000..b5ad0ea2
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave7.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 1650 1350 2325 1500
+2 1 0 1 -1 -1 10 0 -1 0.000 0 0 0 0 0 100
+ 1658 1495 1665 1459 1671 1425 1678 1395 1685 1372 1691 1357
+ 1697 1350 1704 1353 1711 1364 1718 1385 1724 1413 1731 1446
+ 1738 1482 1745 1472 1751 1437 1758 1405 1765 1380 1772 1361
+ 1777 1352 1784 1351 1791 1360 1797 1377 1804 1402 1811 1433
+ 1818 1468 1824 1495 1831 1495 1838 1495 1845 1495 1851 1495
+ 1857 1495 1864 1495 1871 1495 1877 1495 1884 1495 1891 1495
+ 1898 1495 1904 1495 1911 1495 1918 1495 1925 1495 1931 1495
+ 1938 1495 1944 1495 1950 1495 1957 1495 1964 1495 1971 1495
+ 1977 1495 1984 1495 1991 1477 1998 1441 2004 1409 2011 1382
+ 2018 1363 2025 1353 2030 1351 2037 1359 2044 1375 2051 1399
+ 2057 1428 2064 1463 2071 1491 2078 1454 2084 1421 2091 1392
+ 2098 1370 2105 1355 2110 1350 2117 1354 2124 1367 2130 1388
+ 2137 1417 2144 1450 2151 1486 2157 1495 2164 1495 2171 1495
+ 2178 1495 2184 1495 2191 1495 2197 1495 2204 1495 2210 1495
+ 2217 1495 2224 1495 2231 1495 2237 1495 2244 1495 2251 1495
+ 2258 1495 2264 1495 2271 1495 2277 1495 2283 1495 2290 1495
+ 2297 1495 2304 1495 2310 1495 2317 1495
+-6
diff --git a/muse/synti/deicsonze/pics/wave7.gnuplot b/muse/synti/deicsonze/pics/wave7.gnuplot
new file mode 100644
index 00000000..294b2423
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave7.gnuplot
@@ -0,0 +1,2 @@
+set terminal fig
+plot [0:4*pi] [-1:1] (x<pi || (x>2*pi && x<3*pi))?abs(sin(2*x)):0
diff --git a/muse/synti/deicsonze/pics/wave7.png b/muse/synti/deicsonze/pics/wave7.png
new file mode 100644
index 00000000..44e5928f
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave7.png
Binary files differ
diff --git a/muse/synti/deicsonze/pics/wave8.fig b/muse/synti/deicsonze/pics/wave8.fig
new file mode 100644
index 00000000..017deb5b
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave8.fig
@@ -0,0 +1,29 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+6 1650 1350 2325 1500
+2 1 0 1 -1 -1 10 0 -1 0.000 0 0 0 0 0 100
+ 1658 1495 1665 1486 1671 1461 1678 1426 1685 1390 1691 1363
+ 1697 1350 1704 1356 1711 1379 1718 1412 1724 1448 1731 1479
+ 1738 1494 1745 1492 1751 1472 1758 1440 1765 1403 1772 1372
+ 1777 1353 1784 1352 1791 1369 1797 1399 1804 1435 1811 1469
+ 1818 1490 1824 1495 1831 1495 1838 1495 1845 1495 1851 1495
+ 1857 1495 1864 1495 1871 1495 1877 1495 1884 1495 1891 1495
+ 1898 1495 1904 1495 1911 1495 1918 1495 1925 1495 1931 1495
+ 1938 1495 1944 1495 1950 1495 1957 1495 1964 1495 1971 1495
+ 1977 1495 1984 1495 1991 1493 1998 1475 2004 1444 2011 1408
+ 2018 1375 2025 1354 2030 1351 2037 1366 2044 1394 2051 1431
+ 2057 1465 2064 1489 2071 1495 2078 1484 2084 1457 2091 1421
+ 2098 1386 2105 1361 2110 1350 2117 1358 2124 1383 2130 1417
+ 2137 1453 2144 1481 2151 1495 2157 1495 2164 1495 2171 1495
+ 2178 1495 2184 1495 2191 1495 2197 1495 2204 1495 2210 1495
+ 2217 1495 2224 1495 2231 1495 2237 1495 2244 1495 2251 1495
+ 2258 1495 2264 1495 2271 1495 2277 1495 2283 1495 2290 1495
+ 2297 1495 2304 1495 2310 1495 2317 1495
+-6
diff --git a/muse/synti/deicsonze/pics/wave8.gnuplot b/muse/synti/deicsonze/pics/wave8.gnuplot
new file mode 100644
index 00000000..e86332c7
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave8.gnuplot
@@ -0,0 +1,2 @@
+set terminal fig
+plot [0:4*pi] [-1:1] (x<pi || (x>2*pi && x<3*pi))?sin(2*x)*sin(2*x):0
diff --git a/muse/synti/deicsonze/pics/wave8.png b/muse/synti/deicsonze/pics/wave8.png
new file mode 100644
index 00000000..6df0dda5
--- /dev/null
+++ b/muse/synti/deicsonze/pics/wave8.png
Binary files differ
diff --git a/muse/synti/fluid/CMakeLists.txt b/muse/synti/fluid/CMakeLists.txt
new file mode 100644
index 00000000..6fdb9488
--- /dev/null
+++ b/muse/synti/fluid/CMakeLists.txt
@@ -0,0 +1,42 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+QT4_WRAP_CPP ( fluid_mocs fluidgui.h )
+QT4_WRAP_UI ( fluid_uis fluidgui.ui )
+
+add_library ( fluid SHARED
+ fluid.cpp
+ fluidgui.cpp
+ fluidgui.h
+ ${fluid_mocs}
+ ${fluid_uis}
+ )
+
+# - tell cmake to name target fluid.so instead of
+# libfluid.so
+# - use precompiled header files
+#
+set_target_properties ( fluid
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /lib/muse-1.0pre1/synthi/ fluid )
+
diff --git a/muse/synti/fluid/fluid.cpp b/muse/synti/fluid/fluid.cpp
new file mode 100644
index 00000000..2f67a528
--- /dev/null
+++ b/muse/synti/fluid/fluid.cpp
@@ -0,0 +1,520 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: fluid.cpp,v 1.21 2005/11/23 13:55:32 wschweer Exp $
+//
+// This file is derived from fluid Synth and modified
+// for MusE.
+// Parts of fluid are derived from Smurf Sound Font Editor.
+// Parts of Smurf Sound Font Editor are derived from
+// awesfx utilities
+// Smurf: Copyright (C) 1999-2000 Josh Green
+// fluid: Copyright (C) 2001 Peter Hanappe
+// MusE: Copyright (C) 2001 Werner Schweer
+// awesfx: Copyright (C) 1996-1999 Takashi Iwai
+//=========================================================
+
+#include "muse/midictrl.h"
+#include "fluid.h"
+#include "fluidgui.h"
+
+//---------------------------------------------------------
+// instantiate
+//---------------------------------------------------------
+
+class QWidget;
+
+static Mess* instantiate(int sr, QWidget*, const char* name)
+ {
+ ISynth* synth = new ISynth();
+ synth->setSampleRate(sr);
+ if (synth->init(name)) {
+ delete synth;
+ synth = 0;
+ }
+ return synth;
+ }
+
+//---------------------------------------------------------
+// MESS
+//---------------------------------------------------------
+
+extern "C" {
+ static MESS descriptor = {
+ "fluid",
+ "Werner Schweer",
+ "0.1", // fluid version string
+ MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
+ instantiate,
+ };
+ const MESS* mess_descriptor() { return &descriptor; }
+ }
+
+//---------------------------------------------------------
+// ISynth
+//---------------------------------------------------------
+
+ISynth::ISynth()
+ : Mess(2)
+ {
+ _busy = false;
+ sfont = 0;
+ _gmMode = false; // General Midi Mode
+ _fluidsynth = 0;
+ initBuffer = 0;
+ initLen = 0;
+ fontId = -1;
+ }
+
+//---------------------------------------------------------
+// playNote
+// return true if busy
+//---------------------------------------------------------
+
+bool ISynth::playNote(int channel, int pitch, int velo)
+ {
+ if (_busy) {
+// printf("fluid: playNote(): busy!\n");
+ return true;
+ }
+ if (velo) {
+ int err = fluid_synth_noteon(_fluidsynth, channel, pitch, velo);
+ if (err) {
+ printf("ISynth: noteon error, channel %d pitch %d<%s>\n",
+ channel, pitch, fluid_synth_error(_fluidsynth));
+ }
+ }
+ else
+ fluid_synth_noteoff(_fluidsynth, channel, pitch);
+ return false;
+ }
+
+//---------------------------------------------------------
+// setController
+// return true if busy
+//---------------------------------------------------------
+
+bool ISynth::setController(int ch, int ctrl, int val)
+ {
+ if (_busy) {
+// printf("fluid: setController(%d,%d,%d): busy!\n", ch, ctrl, val);
+ return true;
+ }
+ switch(ctrl) {
+ case CTRL_PROGRAM:
+ {
+ int hbank = (val & 0xff0000) >> 16;
+ int lbank = (val & 0xff00) >> 8;
+ if (hbank > 127) // map "dont care" to 0
+ hbank = 0;
+ if (lbank > 127)
+ lbank = 0;
+ if (lbank == 127 || ch == 9) // drum HACK
+ lbank = 128;
+ int prog = val & 0x7f;
+ fluid_synth_program_select(_fluidsynth, ch,
+ hbank, lbank, prog);
+ }
+ break;
+
+ case CTRL_PITCH:
+ fluid_synth_pitch_bend (_fluidsynth, ch, val);
+ break;
+
+ default:
+// printf("controller %x val %x\n", ctrl & 0x3fff, val);
+ fluid_synth_cc(_fluidsynth, ch, ctrl & 0x3fff, val);
+ break;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// sysex
+// 7e 7f 09 01 GM on
+// 7e 7f 09 02 GM off
+// 7f 7f 04 01 ll hh Master Volume (ll-low byte, hh-high byte)
+// 7c 00 01 nn ... replace Soundfont (nn-ascii char of path
+// 7c 00 02 nn ... add Soundfont
+// 7c 00 03 nn ... remove Soundfont
+//
+// return true if busy
+//---------------------------------------------------------
+
+bool ISynth::sysex(int len, const unsigned char* data)
+ {
+ if (_busy) {
+// printf("fluid: sysex(): busy!\n");
+ return true;
+ }
+ if (len >= 4) {
+ //---------------------------------------------
+ // Universal Non Realtime
+ //---------------------------------------------
+
+ if (data[0] == 0x7e) {
+ if (data[1] == 0x7f) { // device Id
+ if (data[2] == 0x9) { // GM
+ if (data[3] == 0x1) {
+ gmOn(true);
+ return false;
+ }
+ else if (data[3] == 0x2) {
+ gmOn(false);
+ return false;
+ }
+ }
+ }
+ }
+
+ //---------------------------------------------
+ // Universal Realtime
+ //---------------------------------------------
+
+ else if (data[0] == 0x7f) {
+ if (data[1] == 0x7f) { // device Id
+ if ((data[2] == 0x4) && (data[3] == 0x1)) {
+ float v = (data[5]*128 + data[4])/32767.0;
+ fluid_synth_set_gain(_fluidsynth, v);
+ return false;
+ }
+ }
+ }
+
+ //---------------------------------------------
+ // MusE Soft Synth
+ //---------------------------------------------
+
+ else if (data[0] == 0x7c) {
+ int n = len - 3;
+ if (n < 1) {
+ printf("fluid: bad sysEx:\n");
+ return false;
+ }
+ char buffer[n+1];
+ memcpy(buffer, (char*)data+3, n);
+ buffer[n] = 0;
+ if (data[1] == 0) { // fluid
+ if (data[2] == 1) { // load sound font
+ sysexSoundFont(SF_REPLACE, buffer);
+ return false;
+ }
+ else if (data[2] == 2) { // load sound font
+ sysexSoundFont(SF_ADD, buffer);
+ return false;
+ }
+ else if (data[2] == 3) { // load sound font
+ sysexSoundFont(SF_REMOVE, buffer);
+ return false;
+ }
+ }
+ }
+ else if (data[0] == 0x41) { // roland
+ if (data[1] == 0x10 && data[2] == 0x42 && data[3] == 0x12
+ && data[4] == 0x40 && data[5] == 00 && data[6] == 0x7f
+ && data[7] == 0x41) {
+ // gs on
+ gmOn(true);
+ return false;
+ }
+ }
+ }
+ printf("fluid: unknown sysex received, len %d:\n", len);
+ for (int i = 0; i < len; ++i)
+ printf("%02x ", data[i]);
+ printf("\n");
+ return false;
+ }
+
+//---------------------------------------------------------
+// gmOn
+//---------------------------------------------------------
+
+void ISynth::gmOn(bool flag)
+ {
+ _gmMode = flag;
+ allNotesOff();
+ }
+
+//---------------------------------------------------------
+// allNotesOff
+// stop all notes
+//---------------------------------------------------------
+
+void ISynth::allNotesOff()
+ {
+ for (int ch = 0; ch < 16; ++ch) {
+ fluid_synth_cc(_fluidsynth, ch, 0x7b, 0); // all notes off
+ }
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool ISynth::guiVisible() const
+ {
+ return gui->isVisible();
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void ISynth::showGui(bool flag)
+ {
+ gui->setShown(flag);
+ }
+
+//---------------------------------------------------------
+// ~ISynth
+//---------------------------------------------------------
+
+ISynth::~ISynth()
+ {
+ // TODO delete settings
+ if (_fluidsynth)
+ delete_fluid_synth(_fluidsynth);
+ if (initBuffer)
+ delete [] initBuffer;
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void ISynth::process(float** ports, int offset, int n)
+ {
+ if (!_busy) {
+ //
+ // get and process all pending events from the
+ // synthesizer GUI
+ //
+ while (gui->fifoSize())
+ processEvent(gui->readEvent());
+ fluid_synth_write_float(_fluidsynth, n, ports[0],
+ offset, 1, ports[1], offset, 1);
+ }
+ // printf("%f %f\n", *ports[0], *(ports[0]+1));
+ }
+
+//---------------------------------------------------------
+// getPatchName
+//---------------------------------------------------------
+
+const char* ISynth::getPatchName(int /*ch*/, int val, int) const
+ {
+ int hbank = (val & 0xff0000) >> 16;
+ int lbank = (val & 0xff00) >> 8;
+ if (hbank > 127)
+ hbank = 0;
+ if (lbank > 127)
+ lbank = 0;
+ if (lbank == 127) // drum HACK
+ lbank = 128;
+ int prog = val & 0x7f;
+ char* name = "---";
+
+ if (_busy) {
+ printf("fluid: getPatchName(): busy!\n");
+ return name;
+ }
+ fluid_font = fluid_synth_get_sfont_by_id(_fluidsynth, hbank);
+ if (fluid_font) {
+ fluid_preset_t* preset = (*fluid_font->get_preset)(fluid_font, lbank, prog);
+ if (preset)
+ name = (*preset->get_name)(preset);
+ else
+ fprintf(stderr, "no fluid preset for bank %d prog %d\n",
+ lbank, prog);
+ }
+ else
+ fprintf(stderr, "ISynth::getPatchName(): no fluid font id=%d found\n", hbank);
+ return name;
+ }
+
+//---------------------------------------------------------
+// getNextPatch
+//---------------------------------------------------------
+
+const MidiPatch* ISynth::getPatchInfo(int ch, const MidiPatch* p) const
+ {
+ if (_busy) {
+ printf("fluid: getPatchInfo(): busy!\n");
+ return 0;
+ }
+ if (p == 0) {
+ // get font at font stack index 0
+ fluid_font = fluid_synth_get_sfont(_fluidsynth, 0);
+ if (fluid_font == 0)
+ return 0;
+ (*fluid_font->iteration_start)(fluid_font);
+ }
+ fluid_preset_t preset;
+
+ while ((*fluid_font->iteration_next)(fluid_font, &preset)) {
+ patch.hbank = fluid_sfont_get_id(fluid_font);
+ int bank = (*preset.get_banknum)(&preset);
+ if (ch == 9 && bank != 128) // show only drums for channel 10
+ continue;
+ if (bank == 128)
+ bank = 127;
+ patch.typ = 0;
+ patch.name = (*preset.get_name)(&preset);
+ patch.lbank = bank;
+ patch.prog = (*preset.get_num)(&preset);
+ return &patch;
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// getInitData
+// construct an initialization string which can be used
+// as a sysex to restore current state
+//---------------------------------------------------------
+
+void ISynth::getInitData(int* len, const unsigned char** data)
+ {
+ if (sfont == 0) {
+ *len = 0;
+ return;
+ }
+ int n = 4 + strlen(sfont);
+ if (n > initLen) {
+ if (initBuffer)
+ delete [] initBuffer;
+ initBuffer = new unsigned char[n];
+ }
+ initBuffer[0] = 0x7c;
+ initBuffer[1] = 0x00;
+ initBuffer[2] = SF_REPLACE;
+ strcpy((char*)(initBuffer+3), sfont);
+ *len = n;
+ *data = initBuffer;
+ }
+
+//---------------------------------------------------------
+// sysexSoftfont
+//---------------------------------------------------------
+
+void ISynth::sysexSoundFont(SfOp op, const char* data)
+ {
+ char c = 'x';
+ allNotesOff();
+ switch(op) {
+ case SF_REMOVE:
+ break;
+ case SF_REPLACE:
+ case SF_ADD:
+ if (sfont && (strcmp(sfont, data) == 0)) {
+ fprintf(stderr, "fluid: font already loaded\n");
+ break;
+ }
+ if (_busy) {
+ fprintf(stderr, "fluid: busy!\n");
+ break;
+ }
+ _busy = true;
+ if (sfont)
+ delete[] sfont;
+ sfont = new char[strlen(data)+1];
+ strcpy(sfont, data);
+ _busy = true;
+ write(writeFd, &c, 1);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// fontLoad
+// helper thread to load soundfont in the
+// background
+//---------------------------------------------------------
+
+static void* helper(void* t)
+ {
+ ISynth* is = (ISynth*) t;
+ is->noRTHelper();
+ pthread_exit(0);
+ }
+
+//------------------------------------
+// noRTHelper
+//---------------------------------------------------------
+
+void ISynth::noRTHelper()
+ {
+ for (;;) {
+ char c;
+ int n = read(readFd, &c, 1);
+ if (n != 1) {
+ perror("ISynth::read ipc failed\n");
+ continue;
+ }
+ int id = getFontId();
+ if (id != -1) {
+ fprintf(stderr, "ISynth: unload old font\n");
+ fluid_synth_sfunload(synth(), (unsigned)id, true);
+ }
+ int rv = fluid_synth_sfload(synth(), getFont(), true);
+ if (rv == -1) {
+ fprintf(stderr, "ISynth: sfload %s failed\n",
+ fluid_synth_error(synth()));
+ }
+ else {
+ setFontId(rv);
+ fprintf(stderr, "ISynth: sfont %s loaded as %d\n ",
+ getFont(), rv);
+ }
+ fluid_synth_set_gain(synth(), 1.0); //?
+ _busy = false;
+ }
+ }
+
+//---------------------------------------------------------
+// init
+// return true on error
+//---------------------------------------------------------
+
+bool ISynth::init(const char* name)
+ {
+ fluid_settings_t* settings;
+ settings = new_fluid_settings();
+ fluid_settings_setnum(settings, "synth.sample-rate", float(sampleRate()));
+
+ _fluidsynth = new_fluid_synth(settings);
+
+ //---------------------------------------
+ // create non realtime helper thread
+ // create message channels
+ //
+ int filedes[2]; // 0 - reading 1 - writing
+ if (pipe(filedes) == -1) {
+ perror("ISynth::thread:creating pipe");
+ return true;
+ }
+ readFd = filedes[0];
+ writeFd = filedes[1];
+
+ pthread_attr_t* attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t));
+ pthread_attr_init(attributes);
+ if (pthread_create(&helperThread, attributes, ::helper, this))
+ perror("creating thread failed:");
+ pthread_attr_destroy(attributes);
+
+ char* p = getenv("DEFAULT_SOUNDFONT");
+ if (p) {
+ sfont = new char[strlen(p)+1];
+ strcpy(sfont, p);
+ char c = 'x';
+ _busy = true;
+ write(writeFd, &c, 1);
+ }
+
+ gui = new FLUIDGui;
+ gui->setWindowTitle(QString(name));
+ gui->show();
+ return false;
+ }
+
diff --git a/muse/synti/fluid/fluid.h b/muse/synti/fluid/fluid.h
new file mode 100644
index 00000000..af8ff3a1
--- /dev/null
+++ b/muse/synti/fluid/fluid.h
@@ -0,0 +1,80 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: fluid.h,v 1.8 2005/11/23 13:55:32 wschweer Exp $
+//
+// This file is derived from fluid Synth and modified
+// for MusE.
+// Parts of fluid are derived from Smurf Sound Font Editor.
+// Parts of Smurf Sound Font Editor are derived from
+// awesfx utilities
+// Smurf: Copyright (C) 1999-2000 Josh Green
+// fluid: Copyright (C) 2001 Peter Hanappe
+// MusE: Copyright (C) 2001 Werner Schweer
+// awesfx: Copyright (C) 1996-1999 Takashi Iwai
+//=========================================================
+
+#ifndef _SYNTH_H
+#define _SYNTH_H
+
+#include <fluidsynth.h>
+#include "libsynti/mess.h"
+
+enum SfOp { SF_REPLACE = 1, SF_ADD, SF_REMOVE };
+class FLUIDGui;
+
+//---------------------------------------------------------
+// ISynth
+//---------------------------------------------------------
+
+class ISynth : public Mess {
+ bool _busy;
+ bool _gmMode;
+
+ unsigned char* initBuffer;
+ int initLen;
+
+ fluid_synth_t* _fluidsynth;
+ char* sfont;
+ mutable fluid_sfont_t* fluid_font;
+ int fontId;
+
+ int readFd, writeFd;
+
+ mutable MidiPatch patch;
+
+ pthread_t helperThread;
+ FLUIDGui* gui;
+
+ void gmOn(bool);
+ void sysexSoundFont(SfOp op, const char* data);
+
+ void allNotesOff();
+ void resetAllController(int);
+
+ virtual void process(float**, int, int);
+ virtual bool playNote(int channel, int pitch, int velo);
+ virtual bool setController(int, int, int);
+ virtual bool sysex(int len, const unsigned char* p);
+ virtual const char* getPatchName (int, int, int) const;
+ virtual const MidiPatch* getPatchInfo(int, const MidiPatch *) const;
+ virtual void getInitData(int*, const unsigned char**);
+
+ virtual bool guiVisible() const;
+ virtual void showGui(bool);
+ virtual bool hasGui() const { return true; }
+
+ public:
+ ISynth();
+ ~ISynth();
+
+ fluid_synth_t* synth() { return _fluidsynth; }
+ const fluid_synth_t* synth() const { return _fluidsynth; }
+ char* getFont() const { return sfont; }
+ void setFontId(int id) { fontId = id; }
+ int getFontId() const { return fontId; }
+ bool init(const char* name);
+ void noRTHelper();
+ };
+
+#endif /* _SYNTH_H */
diff --git a/muse/synti/fluid/fluidgui.cpp b/muse/synti/fluid/fluidgui.cpp
new file mode 100644
index 00000000..aea6e38a
--- /dev/null
+++ b/muse/synti/fluid/fluidgui.cpp
@@ -0,0 +1,68 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: fluidgui.cpp,v 1.10 2005/11/23 13:55:32 wschweer Exp $
+//
+// This is a simple GUI implemented with QT for
+// fluid software synthesizer.
+//
+// (C) Copyright 2001-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "fluidgui.h"
+#include "muse/midi.h"
+
+//---------------------------------------------------------
+// FLUIDGui
+//---------------------------------------------------------
+
+FLUIDGui::FLUIDGui()
+ : QDialog(0), MessGui()
+ {
+ setupUi(this);
+ connect(fdialogButton, SIGNAL(clicked()), SLOT(soundFontFileDialog()));
+ connect(loadButton, SIGNAL(clicked()), SLOT(loadFont()));
+ }
+
+//---------------------------------------------------------
+// loadFont
+// sysex f0 lenH lenM lenL 7c 00 01 name
+//---------------------------------------------------------
+
+void FLUIDGui::loadFont()
+ {
+ if (pathEntry->text().isEmpty())
+ return;
+ QFileInfo fi(pathEntry->text());
+ if (!fi.exists()) {
+ QString s = QString("SoundFont ") + pathEntry->text() + QString(" does not exists");
+ QMessageBox::critical(this, tr("FLUID: open Soundfile"), s);
+ return;
+ }
+ const char* path = pathEntry->text().toLatin1().data();
+ int len = strlen(path) + 1 + 3;
+ unsigned char buffer[len];
+ int k = 0;
+ buffer[k++] = 0x7c;
+ buffer[k++] = 0x00; // fluid
+ buffer[k++] = 0x01; // load sound font
+ strcpy((char*)(&buffer[k]), path);
+ sendSysex(buffer, len);
+ }
+
+//---------------------------------------------------------
+// soundFontFileDialog
+//---------------------------------------------------------
+
+void FLUIDGui::soundFontFileDialog()
+ {
+ QString s = QFileDialog::getOpenFileName(
+ this,
+ tr("Fluid: select Sound Font"),
+ ".",
+ QString("*.[Ss][Ff]2"));
+ if (!s.isEmpty()) {
+ pathEntry->setText(s);
+ }
+ }
+
diff --git a/muse/synti/fluid/fluidgui.h b/muse/synti/fluid/fluidgui.h
new file mode 100644
index 00000000..3b42280f
--- /dev/null
+++ b/muse/synti/fluid/fluidgui.h
@@ -0,0 +1,31 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: fluidgui.h,v 1.3 2005/10/04 21:37:44 lunar_shuttle Exp $
+//
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __GUI_H__
+#define __GUI_H
+
+#include "ui_fluidgui.h"
+#include "libsynti/gui.h"
+
+//---------------------------------------------------------
+// FLUIDGui
+//---------------------------------------------------------
+
+class FLUIDGui : public QDialog, public Ui::FLUIDGuiBase, public MessGui {
+
+ Q_OBJECT
+
+ private slots:
+ void soundFontFileDialog();
+ void loadFont();
+
+ public:
+ FLUIDGui();
+ };
+
+#endif
diff --git a/muse/synti/fluid/fluidgui.ui b/muse/synti/fluid/fluidgui.ui
new file mode 100644
index 00000000..dde416d2
--- /dev/null
+++ b/muse/synti/fluid/fluidgui.ui
@@ -0,0 +1,115 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>FLUIDGuiBase</class>
+ <widget class="QDialog" name="FLUIDGuiBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>318</width>
+ <height>228</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Form1</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>Soundfont</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLineEdit" name="pathEntry" />
+ </item>
+ <item>
+ <widget class="QToolButton" name="fdialogButton" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>230</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="loadButton" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Load</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ <widget class="QWidget" name="" />
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/synti/fluidsynth/CMakeLists.txt b/muse/synti/fluidsynth/CMakeLists.txt
new file mode 100644
index 00000000..f5e0133b
--- /dev/null
+++ b/muse/synti/fluidsynth/CMakeLists.txt
@@ -0,0 +1,42 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+QT4_WRAP_CPP ( fluidsynth_mocs fluidsynthgui.h )
+QT4_WRAP_UI ( fluidsynth_uis fluidsynthgui.ui )
+
+add_library ( fluidsynth SHARED
+ fluidsynti.cpp
+ fluidsynthgui.cpp
+ fluidsynthgui.h
+ ${fluidsynth_mocs}
+ ${fluidsynth_uis}
+ )
+
+# - tell cmake to name target fluidsynth.so instead of
+# libfluidsynth.so
+# - use precompiled header files
+#
+set_target_properties ( fluidsynth
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /lib/muse-1.0pre1/synthi/ fluidsynth )
+
diff --git a/muse/synti/fluidsynth/README.txt b/muse/synti/fluidsynth/README.txt
new file mode 100644
index 00000000..7764edb6
--- /dev/null
+++ b/muse/synti/fluidsynth/README.txt
@@ -0,0 +1,45 @@
+README.txt
+----------
+
+Graphical frontend and built-in softsynth (MusE Experimental Soft Synth) for MusE, based on Fluidsynth
+(http://www.fluidsynth.org).
+
+Features:
+---------
+- Loading/unloading of soundfonts
+- Easy control of fluidsynth's send effects and their parameters
+- Mapping of soundfonts to fluidsynth channels
+- Stores all settings in the current project file and automatically loads all effect parameters,
+ soundfonts, channel settings and presets when re-opening the project.
+- Makes it possible to use several soundfonts in one single fluidsynth instance (thereby reducing CPU usage since they share
+ the same send effects)
+
+
+Changelog/History
+-----------------
+040524
+- Err... Fount out that this changelog is neglected. See ../../Changelog.txt instead.
+031019
+- Bugfixes and changes in storing/retrieving init parameters (Mathias Lundgren)
+031009
+- Unloading of soundfonts works (Mathias Lundgren)
+- Last dir stored in project-file (Mathias Lundgren)
+- Ordinary controller-events enabled (Mathias Lundgren)
+031008
+- Mapping of soundfonts to fluidchannels and selection of patches implemented. (Mathias Lundgren)
+- Permanent storage of channels & patches. Extended GUI. (Mathias Lundgren)
+031002
+- Various communication problems fixed between GUI and client (Mathias Lundgren)
+- Storage of synth parameters and soundfonts enabled (Mathias Lundgren/Robert Jonsson)
+
+0309xx
+- Problem with loading of soundfonts resulting in Jack timeout fixed by moving loading of soundfonts to separate thread. (Robert Jonsson)
+
+Original code written by Robert Ham (no information about the history of his work)
+
+
+Known problems/TODO:
+--------------------------------------------------------------
+* Turning on the chorus and/or modifying chorus parameters locks the client.
+* Illegal chorus parameters can be sent to fluidsynth.
+* Drum patches (lbank=128) not implemented yet
diff --git a/muse/synti/fluidsynth/TODO b/muse/synti/fluidsynth/TODO
new file mode 100644
index 00000000..e941e1e9
--- /dev/null
+++ b/muse/synti/fluidsynth/TODO
@@ -0,0 +1,13 @@
+ TODO
+
+o preset loading/saving
+o configuration loading/saving
+o soundfont information display
+o remembering the last directory that was dealt with
+o change gui<->synth communication to nrpns
+
+ DONE
+
+o get all controllers working
+o soundfont stack operations
+o patch name retrieval
diff --git a/muse/synti/fluidsynth/fluidsynthgui.cpp b/muse/synti/fluidsynth/fluidsynthgui.cpp
new file mode 100644
index 00000000..42f812b5
--- /dev/null
+++ b/muse/synti/fluidsynth/fluidsynthgui.cpp
@@ -0,0 +1,596 @@
+/*
+ * MusE FLUID Synth softsynth plugin
+ *
+ * Copyright (C) 2004 Mathias Lundgren (lunar_shuttle@users.sourcforge.net)
+ *
+ * $Id: fluidsynthgui.cpp,v 1.19 2006/01/06 22:48:09 wschweer Exp $
+ *
+ */
+
+#include "fluidsynthgui.h"
+#include "fluidsynti.h"
+#include <iostream>
+#include "muse/midi.h"
+#include "xpm/buttondown.xpm"
+
+
+//#define MUSE_FLUID_DEBUG false
+
+FluidSynthGui::FluidSynthGui()
+ : MessGui()
+ {
+ setupUi(this);
+ //Connect socketnotifier to fifo
+ QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read);
+ connect(s, SIGNAL(activated(int)), SLOT(readMessage(int)));
+ connect (Push, SIGNAL (clicked()), SLOT(loadClicked()));
+
+ pendingFont = "";
+
+ //channelListView->setColumnWidthMode(FS_CHANNEL_COL, Q3ListView::Maximum);
+ //channelListView->setColumnWidthMode(FS_SF_ID_COL,Q3ListView::Maximum);
+ ReverbFrame->setEnabled(true);
+ ChorusFrame->setEnabled(true);
+
+ if (!FS_DEBUG)
+ dumpInfoButton->hide();
+
+ connect(Gain, SIGNAL(valueChanged(int)), SLOT(changeGain(int)));
+ connect(dumpInfoButton , SIGNAL(clicked()), SLOT(dumpInfo()));
+
+ connect(channelTreeWidget, SIGNAL(itemPressed(QTreeWidgetItem*,int)),
+ this, SLOT(channelItemClicked(QTreeWidgetItem*,int)));
+ connect(sfTreeWidget, SIGNAL(itemPressed(QTreeWidgetItem*,int)),
+ this, SLOT(sfItemClicked(QTreeWidgetItem*,int)));
+
+ connect(Reverb, SIGNAL (toggled(bool)), SLOT(toggleReverb(bool)));
+ connect(ReverbLevel, SIGNAL (valueChanged (int)), SLOT(changeReverbLevel(int)));
+ connect(ReverbRoomSize, SIGNAL (valueChanged (int)), SLOT(changeReverbRoomSize(int)));
+ connect(ReverbDamping, SIGNAL (valueChanged (int)), SLOT(changeReverbDamping(int)));
+ connect(ReverbWidth, SIGNAL (valueChanged (int)), SLOT(changeReverbWidth(int)));
+
+ connect (Pop, SIGNAL (clicked()), SLOT(popClicked()));
+ connect(Chorus, SIGNAL (toggled (bool)), SLOT(toggleChorus (bool)));
+ connect(ChorusNumber, SIGNAL (valueChanged (int)), SLOT(changeChorusNumber (int)));
+ connect(ChorusType, SIGNAL (activated (int)), SLOT(changeChorusType (int)));
+ connect(ChorusSpeed, SIGNAL (valueChanged (int)), SLOT(changeChorusSpeed (int)));
+ connect(ChorusDepth, SIGNAL (valueChanged (int)), SLOT(changeChorusDepth (int)));
+ connect(ChorusLevel, SIGNAL (valueChanged (int)), SLOT(changeChorusLevel (int)));
+
+ //Clear channels
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++)
+ channels[i] = FS_UNSPECIFIED_ID;
+ }
+
+FluidSynthGui::~FluidSynthGui()
+ {
+ /*
+ delete _notifier;
+ */
+ }
+
+void FluidSynthGui::toggleReverb(bool on) { sendController(0, FS_REVERB_ON, on); }
+void FluidSynthGui::changeReverbLevel(int val) { sendController(0, FS_REVERB_LEVEL, val); }
+void FluidSynthGui::changeReverbRoomSize(int val) { sendController(0, FS_REVERB_ROOMSIZE, val); }
+void FluidSynthGui::changeReverbWidth(int val) { sendController(0, FS_REVERB_WIDTH, val); }
+void FluidSynthGui::changeReverbDamping(int val) { sendController(0, FS_REVERB_DAMPING, val); }
+
+void FluidSynthGui::toggleChorus(bool val) { sendController(0, FS_CHORUS_ON, val); }
+void FluidSynthGui::changeChorusNumber(int val) { sendController(0, FS_CHORUS_NUM, val); }
+void FluidSynthGui::changeChorusType(int val) { sendController(0, FS_CHORUS_TYPE, val); }
+void FluidSynthGui::changeChorusSpeed(int val) { sendController(0, FS_CHORUS_SPEED, val); }
+void FluidSynthGui::changeChorusDepth(int val) { sendController(0, FS_CHORUS_DEPTH, val); }
+void FluidSynthGui::changeChorusLevel(int val) { sendController(0, FS_CHORUS_LEVEL, val); }
+
+
+void FluidSynthGui::loadClicked()
+ {
+ QString filename = QFileDialog::getOpenFileName(
+ this,
+ tr("Choose soundfont"),
+ lastdir,
+ QString("*.[Ss][Ff]2")
+ );
+ if (!filename.isEmpty()) {
+ QFileInfo fi(filename);
+ lastdir = fi.absolutePath();
+ sendLastdir(lastdir);
+ sendLoadFont(filename);
+ pendingFont = filename;
+ }
+ }
+
+//---------------------------------------------------------
+// sendLastdir
+// Send the last dir-value to the client
+//---------------------------------------------------------
+
+void FluidSynthGui::sendLastdir(QString dir)
+ {
+ int l = dir.size() + 2;
+ byte data[l];
+ data[0] = FS_LASTDIR_CHANGE;
+ memcpy(data+1, dir.toLatin1().data(), dir.size()+1);
+ sendSysex(data,l);
+ }
+
+//---------------------------------------------------------
+// sendLoadFont
+// Tell the client to load a font with first available id
+//---------------------------------------------------------
+
+void FluidSynthGui::sendLoadFont(QString filename)
+ {
+ int l = filename.length()+3;
+ byte data[l];
+ data[0] = FS_PUSH_FONT;
+ data[1] = FS_UNSPECIFIED_ID;
+ memcpy(data+2, filename.toLatin1().data(), filename.length()+1);
+ sendSysex(data,l);
+ }
+
+//---------------------------------------------------------
+// processEvent
+//---------------------------------------------------------
+
+void FluidSynthGui::processEvent(const MidiEvent& ev)
+ {
+ //Sysexes sent from the client
+ if (ev.type() == ME_SYSEX) {
+ byte* data = ev.data();
+ switch (*data) {
+ case FS_LASTDIR_CHANGE:
+ lastdir = QString((const char*)data+1);
+ break;
+ case FS_ERROR: {
+ char* msg = (char*) (data+1);
+ QMessageBox::critical(this, "Fluidsynth",QString(msg));
+ break;
+ }
+ case FS_SEND_SOUNDFONTDATA: {
+ int chunk_len;
+ int filename_len;
+
+ int count = (int)*(data+1); //Number of elements
+ byte* cp = data+2; //Point to beginning of first chunk
+ sfTreeWidget->clear(); //Clear the listview
+ stack.clear(); //Clear the stack since we're starting over again
+
+ while (count) {
+ FluidGuiSoundFont font;
+ filename_len = strlen((const char*)cp) + 1;
+ font.name = (const char*)cp;
+ font.id = *(cp + filename_len);
+ chunk_len = filename_len + FS_SFDATALEN;
+ stack.push_front(font);
+ cp += chunk_len; //Move to next chunk
+ count--;
+ }
+ updateSoundfontTreeWidget();
+ updateChannelTreeWidget();
+ break;
+ }
+ case FS_SEND_CHANNELINFO: {
+ byte* chptr = (data+1);
+ for (int i=0; i< FS_MAX_NR_OF_CHANNELS; i++) {
+ byte id = *chptr;
+ byte channel = *(chptr+1);
+ channels[channel] = id;
+ chptr+=2;
+ }
+ updateChannelTreeWidget();
+
+ break;
+ }
+ case FS_SEND_DRUMCHANNELINFO: {
+ byte* drumchptr = (data+1);
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ drumchannels[i] = *drumchptr;
+ drumchptr++;
+ }
+ updateChannelTreeWidget();
+ break;
+ }
+ case FS_FONT_SUCCESSFULLY_LOADED: {
+ byte extid = *(data+1);
+ QString fn = (const char*) (data+2);
+ if (FS_DEBUG) {
+ printf("Font successfully loaded: %s, extid: %d\n", fn.toLatin1().data(), extid);
+ }
+ // Try to add last loaded font (if any) to first available channel:
+ if (pendingFont == fn) {
+ if (FS_DEBUG)
+ printf("Pending font successfully loaded. Add it to first available channel.\n");
+
+ for (int i=0; i < FS_MAX_NR_OF_CHANNELS; i++) {
+ if (channels[i] == FS_UNSPECIFIED_ID) {
+ if (FS_DEBUG)
+ printf ("sendChannelChange: %d %d\n", extid, i);
+ sendChannelChange(extid, i);
+ channels[i] = extid;
+ updateChannelTreeWidget();
+ break;
+ }
+ }
+ }
+ pendingFont = "";
+ break;
+ }
+ default:
+ if (FS_DEBUG)
+ printf("FluidSynthGui::processEvent() : Unknown Sysex received: %d\n", ev.type());
+ break;
+ }
+ }
+ //Controllers sent from the client:
+ else
+ if(ev.type() == ME_CONTROLLER) {
+ int id = ev.dataA();
+ int val = ev.dataB();
+ switch (id) {
+ case FS_GAIN: {
+ bool sb = Gain->signalsBlocked();
+ Gain->blockSignals(true);
+ // Update Gain-slider without causing it to respond to it's own signal (and send another msg to the synth)
+ Gain->setValue(val);
+ Gain->blockSignals(sb);
+ break;
+ }
+ case FS_REVERB_ON: {
+ bool sb = Reverb->signalsBlocked();
+ Reverb->blockSignals(true);
+ Reverb->setChecked(val);
+ Reverb->blockSignals(sb);
+ break;
+ }
+ case FS_REVERB_LEVEL: {
+ bool sb = ReverbLevel->signalsBlocked();
+ ReverbLevel->blockSignals(true);
+ ReverbLevel->setValue(val);
+ ReverbLevel->blockSignals(sb);
+ break;
+ }
+ case FS_REVERB_DAMPING: {
+ bool sb = ReverbDamping->signalsBlocked();
+ ReverbDamping->blockSignals(true);
+ ReverbDamping->setValue(val);
+ ReverbDamping->blockSignals(sb);
+ break;
+ }
+ case FS_REVERB_ROOMSIZE: {
+ bool sb = ReverbRoomSize->signalsBlocked();
+ ReverbRoomSize->blockSignals(true);
+ ReverbRoomSize->setValue(val);
+ ReverbRoomSize->blockSignals(sb);
+ break;
+ }
+ case FS_REVERB_WIDTH: {
+ bool sb = ReverbWidth->signalsBlocked();
+ ReverbWidth->blockSignals(true);
+ ReverbWidth->setValue(val);
+ ReverbWidth->blockSignals(sb);
+ break;
+ }
+ case FS_CHORUS_ON: {
+ Chorus->blockSignals(true);
+ Chorus->setChecked(val);
+ Chorus->blockSignals(false);
+ break;
+ }
+ case FS_CHORUS_SPEED: {
+ ChorusSpeed->blockSignals(true);
+ ChorusSpeed->setValue(val);
+ ChorusSpeed->blockSignals(false);
+ break;
+ }
+ case FS_CHORUS_NUM: {
+ ChorusNumber->blockSignals(true);
+ ChorusNumber->setValue(val);
+ ChorusNumber->blockSignals(false);
+ break;
+ }
+ case FS_CHORUS_TYPE: {
+ ChorusType->blockSignals(true);
+ ChorusType->setCurrentIndex(val);
+ ChorusType->blockSignals(false);
+ break;
+ }
+ case FS_CHORUS_DEPTH: {
+ ChorusDepth->blockSignals(true);
+ ChorusDepth->setValue(val);
+ ChorusDepth->blockSignals(false);
+ break;
+ }
+ case FS_CHORUS_LEVEL: {
+ ChorusLevel->blockSignals(true);
+ ChorusLevel->setValue(val);
+ ChorusLevel->blockSignals(false);
+ break;
+ }
+ default:
+ if (FS_DEBUG)
+ printf("FluidSynthGui::processEvent() : Unknown controller sent to gui: %x\n",id);
+ break;
+ }
+ }
+ else
+ if (FS_DEBUG)
+ printf("FluidSynthGui::processEvent - unknown event of type %dreceived from synth.\n", ev.type());
+ }
+
+//---------------------------------------------------------
+// readMessage
+//---------------------------------------------------------
+void FluidSynthGui::readMessage(int)
+ {
+ MessGui::readMessage();
+ }
+
+//---------------------------------------------------------
+// updateChannels
+//---------------------------------------------------------
+void FluidSynthGui::updateChannelTreeWidget()
+ {
+ if (FS_DEBUG)
+ printf("FluidSynthGui::updateChannelListView\n");
+ channelTreeWidget->clear();
+ QIcon btndown = QIcon(buttondown_xpm);
+
+ QTreeWidgetItem* header = new QTreeWidgetItem();
+ header->setText(FS_CHANNEL_COL, "Channel");
+ header->setText(FS_SF_ID_COL, "Soundfont");
+ header->setText(FS_DRUM_CHANNEL_COL, "Drum Chnl");
+ channelTreeWidget->setHeaderItem(header);
+
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ QString chanstr, sfidstr, drumchanstr;
+
+ //Soundfont id string:
+ if (channels[i] == FS_UNSPECIFIED_ID)
+ sfidstr = "unspecified";
+ else
+ sfidstr = getSoundFontName(channels[i]);
+ //Channel string:
+ chanstr = QString::number(i+1);
+ if (chanstr.length()==1)
+ chanstr = "0" + chanstr;
+
+ //Drumchan string:
+ if (drumchannels[i])
+ drumchanstr = "Yes";
+ else
+ drumchanstr = "No";
+ QTreeWidgetItem* qlvNewItem = new QTreeWidgetItem(channelTreeWidget);
+ qlvNewItem->setText(FS_CHANNEL_COL, chanstr);
+ qlvNewItem->setIcon(FS_SF_ID_COL, btndown);
+ qlvNewItem->setText(FS_SF_ID_COL, sfidstr);
+ qlvNewItem->setIcon(FS_DRUM_CHANNEL_COL, btndown);
+ qlvNewItem->setText(FS_DRUM_CHANNEL_COL, drumchanstr);
+ }
+ }
+
+//---------------------------------------------------------
+// updateSoundfontTreeWidget
+//---------------------------------------------------------
+void FluidSynthGui::updateSoundfontTreeWidget()
+ {
+ sfTreeWidget->clear(); //Clear the listview
+
+ QTreeWidgetItem* header = new QTreeWidgetItem();
+ header->setText(FS_ID_COL, "ID");
+ header->setText(FS_SFNAME_COL, "Fontname");
+ sfTreeWidget->setHeaderItem(header);
+
+ for (std::list<FluidGuiSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) {
+ QTreeWidgetItem* qlvNewItem;
+
+ qlvNewItem = new QTreeWidgetItem(sfTreeWidget);
+ QString qsid = QString("%1").arg(it->id);
+ qlvNewItem->setText(FS_ID_COL, qsid);
+ qlvNewItem->setText(FS_SFNAME_COL, QString(it->name));
+ }
+ //sfTreeWidget->sort();
+ }
+
+//---------------------------------------------------------
+// changeGain
+//---------------------------------------------------------
+void FluidSynthGui::changeGain(int value)
+ {
+ sendController(0, FS_GAIN, value);
+ }
+
+
+//---------------------------------------------------------
+// dumpInfoButton
+//---------------------------------------------------------
+void FluidSynthGui::dumpInfo()
+ {
+ byte data[1];
+ data[0] = FS_DUMP_INFO;
+ sendSysex(data, 1);
+ }
+
+//---------------------------------------------------------
+// getSoundFontName
+//---------------------------------------------------------
+
+QString FluidSynthGui::getSoundFontName(int id)
+ {
+ QString name = NULL;
+ for (std::list<FluidGuiSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) {
+ if (id == it->id) {
+ name = it->name;
+ continue;
+ }
+ }
+ return name;
+ }
+
+//---------------------------------------------------------
+// channelItemClicked
+// change channel parameters like soundfont / drumchannel on/off
+//---------------------------------------------------------
+
+void FluidSynthGui::channelItemClicked(QTreeWidgetItem* item, int col)
+ {
+ //
+ // Soundfont ID column
+ //
+ if (col == FS_SF_ID_COL) {
+ QMenu* popup = new QMenu(this);
+ QPoint ppt = channelTreeWidget->visualItemRect(item).bottomLeft();
+ QTreeWidget* treeWidget = item->treeWidget();
+ ppt += QPoint(treeWidget->header()->sectionPosition(col), treeWidget->header()->height());
+ ppt = treeWidget->mapToGlobal(ppt);
+
+ int i = 0;
+ for (std::list<FluidGuiSoundFont>::reverse_iterator it = stack.rbegin(); it != stack.rend(); it++) {
+ i++;
+ QAction* a = popup->addAction(it->name);
+ a->setData(i);
+ }
+
+ int lastindex = i+1;
+ QAction* a = popup->addAction("unspecified");
+ a->setData(lastindex);
+ a = popup->exec(ppt, 0);
+ if (a) {
+ int index = a->data().toInt();
+ byte sfid;
+ QString fontname;
+ if (index == lastindex) {
+ sfid = FS_UNSPECIFIED_ID;
+ fontname = "unspecified"; //Actually, it's not possible to reset fluid-channels as for now,
+ } //so this is just a dummy that makes the synth block any events for the channel
+ else {
+ sfid = getSoundFontId(a->text());
+ fontname = getSoundFontName(sfid);
+ }
+ byte channel = atoi(item->text(FS_CHANNEL_COL).toLatin1().data()) - 1;
+ sendChannelChange(sfid, channel);
+ item->setText(FS_SF_ID_COL, fontname);
+ }
+ delete popup;
+ }
+ //
+ // Drumchannel column:
+ //
+ else if (col == FS_DRUM_CHANNEL_COL) {
+ QMenu* popup = new QMenu(this);
+ QPoint ppt = channelTreeWidget->visualItemRect(item).bottomLeft();
+ QTreeWidget* treeWidget = item->treeWidget();
+ ppt += QPoint(treeWidget->header()->sectionPosition(col), treeWidget->header()->height());
+ ppt = treeWidget->mapToGlobal(ppt);
+ QAction* a = popup->addAction("Yes");
+ a->setData(1);
+ a = popup->addAction("No");
+ a->setData(0);
+ byte channel = atoi(item->text(FS_CHANNEL_COL).toLatin1().data()) - 1;
+
+ a = popup->exec(ppt, 0);
+ if (a) {
+ int index = a->data().toInt();
+ if (index != drumchannels[channel]) {
+ sendDrumChannelChange(index, channel);
+ drumchannels[channel] = index;
+ item->setText(FS_DRUM_CHANNEL_COL, index == 0 ? "No" : "Yes" );
+ }
+ }
+ }
+#if 0
+ else if (col == FS_DRUM_CHANNEL_COL) {
+ Q3PopupMenu* popup = new Q3PopupMenu(this);
+ QPoint ppt = channelListView->itemRect(item).bottomLeft();
+ Q3ListView* listView = item->listView();
+ ppt += QPoint(listView->header()->sectionPos(col), listView->header()->height());
+ ppt = listView->mapToGlobal(ppt);
+ popup->insertItem("Yes", 1);
+ popup->insertItem("No", 0);
+ byte channel = atoi(item->text(FS_CHANNEL_COL).toLatin1().data()) - 1;
+
+ int index = popup->exec(ppt, 0);
+ if (index != drumchannels[channel] && index !=-1) {
+ sendDrumChannelChange(index, channel);
+ drumchannels[channel] = index;
+ item->setText(FS_DRUM_CHANNEL_COL, index == 0 ? "No" : "Yes" );
+ }
+ }
+#endif
+ }
+
+//---------------------------------------------------------
+// getSoundFontId
+//---------------------------------------------------------
+
+int FluidSynthGui::getSoundFontId(QString q)
+ {
+ int id = -1;
+ for (std::list<FluidGuiSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) {
+ if (q == it->name)
+ id = it->id;
+ }
+ return id;
+ }
+
+//---------------------------------------------------------
+// sendChannelChange
+// Tell the client to set a soundfont to a specific fluid channel
+//---------------------------------------------------------
+
+void FluidSynthGui::sendChannelChange(byte font_id, byte channel)
+ {
+ byte data[3];
+ data[0] = FS_SOUNDFONT_CHANNEL_SET;
+ data[1] = font_id;
+ data[2] = channel;
+ sendSysex(data, 3);
+ }
+
+//---------------------------------------------------------
+// sendDrumChannelChange
+// Tell the client to set a specific channel to drum channel (equiv to midichan 10)
+//---------------------------------------------------------
+void FluidSynthGui::sendDrumChannelChange(byte onoff, byte channel)
+ {
+ byte data[3];
+ data[0] = FS_DRUMCHANNEL_SET;
+ data[1] = onoff;
+ data[2] = channel;
+ sendSysex(data, 3);
+ if (FS_DEBUG)
+ printf("Sent FS_DRUMCHANNEL_SET for channel %d, status: %d\n", channel, onoff);
+ }
+
+void FluidSynthGui::popClicked()
+ {
+ byte data[2];
+ data[0] = FS_SOUNDFONT_POP;
+ data[1] = currentlySelectedFont;
+ sendSysex(data,2);
+ }
+
+void FluidSynthGui::sfItemClicked(QTreeWidgetItem* item, int /*column*/)
+ {
+ if (item != 0) {
+ currentlySelectedFont = atoi(item->text(FS_ID_COL).toLatin1().data());
+ Pop->setEnabled(true);
+ }
+ else {
+ currentlySelectedFont = -1;
+ Pop->setEnabled(false);
+ }
+ }
+
+#if 0
+
+
+
+void FluidSynthGui::readData (int fd)
+ {
+ unsigned char buffer[512];
+ int n = ::read(fd, buffer, 512);
+// dataInput(buffer, n);
+ }
+
+#endif
diff --git a/muse/synti/fluidsynth/fluidsynthgui.h b/muse/synti/fluidsynth/fluidsynthgui.h
new file mode 100644
index 00000000..9884e636
--- /dev/null
+++ b/muse/synti/fluidsynth/fluidsynthgui.h
@@ -0,0 +1,136 @@
+/*
+ * MusE FLUID Synth softsynth plugin
+ *
+ * Copyright (C) 2004 Mathias Lundgren (lunar_shuttle@users.sourcforge.net)
+ *
+ * $Id: fluidsynthgui.h,v 1.15 2005/10/05 21:51:04 lunar_shuttle Exp $
+ *
+ */
+
+#ifndef __MUSE_FLUIDSYNTHGUI_H__
+#define __MUSE_FLUIDSYNTHGUI_H__
+
+#include "ui_fluidsynthgui.h"
+#include "libsynti/gui.h"
+#include <list>
+
+struct FluidChannel;
+#define FS_DEBUG 0 //Turn on/off debug
+
+#define FS_MAX_NR_OF_CHANNELS 16
+#define FS_UNSPECIFIED_FONT 126
+#define FS_UNSPECIFIED_ID 127
+#define FS_UNSPECIFIED_PRESET 129
+#define FS_CHANNEL_COL 0
+#define FS_ID_COL 0
+#define FS_SFNAME_COL 1
+#define FS_SF_ID_COL 1
+#define FS_DRUM_CHANNEL_COL 2
+
+#define FS_SFDATALEN 1
+#define FS_VERSION_MAJOR 0
+#define FS_VERSION_MINOR 4
+#define FS_INIT_DATA_HEADER_SIZE 4
+#define FS_INIT_CHANNEL_SECTION 255
+
+// Predefined init-values for fluidsynth
+#define FS_PREDEF_VOLUME 0.2
+#define FS_PREDEF_REVERB_LEVEL 0.25
+#define FS_PREDEF_REVERB_ROOMSIZE 0.3
+#define FS_PREDEF_REVERB_DAMPING 0.3
+#define FS_PREDEF_REVERB_WIDTH 0.2
+#define FS_PREDEF_CHORUS_NUM 3
+#define FS_PREDEF_CHORUS_TYPE 1
+#define FS_PREDEF_CHORUS_SPEED 0.5
+#define FS_PREDEF_CHORUS_DEPTH 0.3
+#define FS_PREDEF_CHORUS_LEVEL 0.5
+typedef unsigned char byte;
+
+
+//Various messages the gui and the client uses to communicate
+enum {
+ FS_LASTDIR_CHANGE = 1,
+ FS_PUSH_FONT
+ };
+
+enum {
+ //FS_GAIN_SET,
+ FS_SEND_SOUNDFONTDATA = 4,
+ FS_SEND_CHANNELINFO, //Used by synth to send info about all channels, on init
+ FS_SOUNDFONT_CHANNEL_SET,
+ FS_SOUNDFONT_POP,
+ FS_SEND_DRUMCHANNELINFO, //Used by synth to send drumchannel status about all channels, on init
+ FS_DRUMCHANNEL_SET, //Used by gui to set drumchannel status for specific channel
+ FS_FONT_SUCCESSFULLY_LOADED // synth tells gui it loaded a font successfully, and gives it it's external id
+ };
+
+enum
+ {
+ FS_DUMP_INFO = 240,
+ FS_ERROR,
+ FS_INIT_DATA
+ };
+
+struct FluidGuiSoundFont
+ {
+ QString filename;
+ QString name;
+ byte id;
+ };
+
+//---------------------------------------------------------
+// FluidSynthGui
+//---------------------------------------------------------
+
+class FluidSynthGui : public QDialog, Ui::FLUIDSynthGuiBase, public MessGui
+ {
+ Q_OBJECT
+ private:
+ virtual void processEvent(const MidiEvent& ev);
+ void sendLastdir(QString);
+ void sendLoadFont(QString);
+ void sendChannelChange(byte font_id, byte channel);
+ void sendDrumChannelChange(byte onoff, byte channel);
+ void updateSoundfontTreeWidget();
+ void updateChannelTreeWidget();
+
+ QString getSoundFontName(int id);
+ int getSoundFontId(QString q);
+ QString lastdir;
+ std::list<FluidGuiSoundFont> stack;
+ byte channels[FS_MAX_NR_OF_CHANNELS]; //Array of bytes, for mapping soundfonts to individual channels
+ byte drumchannels[FS_MAX_NR_OF_CHANNELS]; // Array of bytes for setting channels to drumchannels or not (equiv to midichan 10)
+
+ int currentlySelectedFont; //Font currently selected in sfListView. -1 if none selected
+ QString pendingFont;
+
+ private slots:
+ void loadClicked();
+ void readMessage(int);
+ void changeGain(int);
+ void dumpInfo();
+ void channelItemClicked(QTreeWidgetItem* item, int column);
+ void toggleReverb(bool);
+ void changeReverbLevel (int);
+ void changeReverbRoomSize(int val);
+ void changeReverbWidth(int val);
+ void changeReverbDamping(int val);
+ void toggleChorus(bool);
+ void changeChorusNumber(int);
+ void changeChorusType(int);
+ void changeChorusSpeed(int);
+ void changeChorusDepth(int);
+ void changeChorusLevel(int);
+ void popClicked();
+ void sfItemClicked(QTreeWidgetItem* item, int column);
+
+ public:
+// virtual void sysexReceived (const unsigned char *, int);
+// virtual void controllerReceived(int, int, int);
+
+ FluidSynthGui();
+ ~FluidSynthGui();
+};
+
+
+#endif /* __MUSE_FLUIDSYNTHGUI_H__ */
diff --git a/muse/synti/fluidsynth/fluidsynthgui.ui b/muse/synti/fluidsynth/fluidsynthgui.ui
new file mode 100644
index 00000000..558f4133
--- /dev/null
+++ b/muse/synti/fluidsynth/fluidsynthgui.ui
@@ -0,0 +1,641 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>FLUIDSynthGuiBase</class>
+ <widget class="QDialog" name="FLUIDSynthGuiBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>656</width>
+ <height>514</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>FLUID Synth</string>
+ </property>
+ <property name="windowIcon" >
+ <iconset/>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QFrame" name="frame_2" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="loadedFontsLabel" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; />&lt;/head>&lt;body style=&quot; white-space: pre-wrap; font-family:Sans Serif; font-weight:400; font-style:normal; text-decoration:none;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;>&lt;span style=&quot; font-weight:600;&quot;>Loaded Soundfonts&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="textFormat" >
+ <enum>Qt::AutoText</enum>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignHCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTreeWidget" name="sfTreeWidget" >
+ <property name="columnCount" >
+ <number>2</number>
+ </property>
+ <property name="sortingEnabled" >
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>0</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QFrame" name="frame_3" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="fontSetupLabel" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; />&lt;/head>&lt;body style=&quot; white-space: pre-wrap; font-family:Sans Serif; font-weight:400; font-style:normal; text-decoration:none;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;>&lt;span style=&quot; font-weight:600;&quot;>Channel Setup&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignHCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QTreeWidget" name="channelTreeWidget" >
+ <property name="columnCount" >
+ <number>3</number>
+ </property>
+ <property name="sortingEnabled" >
+ <bool>true</bool>
+ </property>
+ <column>
+ <property name="text" >
+ <string>0</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>2</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item rowspan="2" row="1" column="1" >
+ <widget class="QFrame" name="ChorusFrame" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="Chorus" >
+ <property name="text" >
+ <string>Chorus</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="ChorusNumberLabel" >
+ <property name="text" >
+ <string>Number</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="ChorusNumber" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="ChorusTypeLabel" >
+ <property name="text" >
+ <string>Type</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="ChorusType" >
+ <item>
+ <property name="text" >
+ <string>Sine</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Triangle</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="ChorusSpeedLabel" >
+ <property name="text" >
+ <string>Speed</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="ChorusSpeed" >
+ <property name="maximum" >
+ <number>16383</number>
+ </property>
+ <property name="singleStep" >
+ <number>16</number>
+ </property>
+ <property name="pageStep" >
+ <number>1638</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>1638</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="ChorusDepthLabel" >
+ <property name="text" >
+ <string>Depth</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="ChorusDepth" >
+ <property name="maximum" >
+ <number>16383</number>
+ </property>
+ <property name="singleStep" >
+ <number>16</number>
+ </property>
+ <property name="pageStep" >
+ <number>1638</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>1638</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="ChorusLevelLabel" >
+ <property name="text" >
+ <string>Level</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="ChorusLevel" >
+ <property name="maximum" >
+ <number>16383</number>
+ </property>
+ <property name="singleStep" >
+ <number>16</number>
+ </property>
+ <property name="pageStep" >
+ <number>1638</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>1638</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QFrame" name="frame" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="Push" >
+ <property name="text" >
+ <string>Load</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Pop" >
+ <property name="enabled" >
+ <bool>false</bool>
+ </property>
+ <property name="text" >
+ <string>Delete</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="dumpInfoButton" >
+ <property name="text" >
+ <string>Dump Info</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <widget class="QGroupBox" name="GainBox" >
+ <property name="title" >
+ <string/>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>&lt;html>&lt;head>&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; />&lt;/head>&lt;body style=&quot; white-space: pre-wrap; font-family:Sans Serif; font-weight:400; font-style:normal; text-decoration:none;&quot;>&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;>Gain&lt;/p>&lt;/body>&lt;/html></string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="Gain" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="pageStep" >
+ <number>5</number>
+ </property>
+ <property name="value" >
+ <number>13</number>
+ </property>
+ <property name="tracking" >
+ <bool>true</bool>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>7</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QFrame" name="ReverbFrame" >
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="Reverb" >
+ <property name="text" >
+ <string>Reverb</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="ReverbRoomSizeLabel" >
+ <property name="text" >
+ <string>Room Size</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="ReverbDampingLabel" >
+ <property name="text" >
+ <string>Damping</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="ReverbWidthLabel" >
+ <property name="text" >
+ <string>Width</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="ReverbLevelLabel" >
+ <property name="text" >
+ <string>Level</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QSlider" name="ReverbRoomSize" >
+ <property name="maximum" >
+ <number>16383</number>
+ </property>
+ <property name="singleStep" >
+ <number>16</number>
+ </property>
+ <property name="pageStep" >
+ <number>1638</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>1638</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="ReverbDamping" >
+ <property name="maximum" >
+ <number>16383</number>
+ </property>
+ <property name="singleStep" >
+ <number>16</number>
+ </property>
+ <property name="pageStep" >
+ <number>1638</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>1638</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="ReverbWidth" >
+ <property name="maximum" >
+ <number>16383</number>
+ </property>
+ <property name="singleStep" >
+ <number>16</number>
+ </property>
+ <property name="pageStep" >
+ <number>1638</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>1638</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="ReverbLevel" >
+ <property name="maximum" >
+ <number>16383</number>
+ </property>
+ <property name="singleStep" >
+ <number>16</number>
+ </property>
+ <property name="pageStep" >
+ <number>1638</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>1638</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ <widget class="QWidget" name="widget_2" >
+ <property name="geometry" >
+ <rect>
+ <x>11</x>
+ <y>36</y>
+ <width>260</width>
+ <height>17</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QWidget" name="widget_3" >
+ <property name="geometry" >
+ <rect>
+ <x>11</x>
+ <y>59</y>
+ <width>260</width>
+ <height>17</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QWidget" name="widget_4" >
+ <property name="geometry" >
+ <rect>
+ <x>11</x>
+ <y>82</y>
+ <width>260</width>
+ <height>17</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QWidget" name="widget_5" >
+ <property name="geometry" >
+ <rect>
+ <x>11</x>
+ <y>105</y>
+ <width>260</width>
+ <height>17</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="3" margin="8" />
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/synti/fluidsynth/fluidsynti.cpp b/muse/synti/fluidsynth/fluidsynti.cpp
new file mode 100644
index 00000000..b947df2b
--- /dev/null
+++ b/muse/synti/fluidsynth/fluidsynti.cpp
@@ -0,0 +1,1174 @@
+/*
+ * MusE FLUID Synth softsynth plugin
+ *
+ * Copyright (C) 2004 Mathias Lundgren (lunar_shuttle@users.sourcforge.net)
+ *
+ * $Id: fluidsynti.cpp,v 1.28 2005/12/18 14:09:54 wschweer Exp $
+ *
+ */
+
+#include "fluidsynti.h"
+#include "muse/midi.h"
+
+#include <list>
+#include <iostream>
+
+
+FluidCtrl FluidSynth::fluidCtrl[] = {
+ { "Gain", FS_GAIN ,0, 127},
+ { "Master reverb on/off", FS_REVERB_ON , 0, 1},
+ { "Master reverb level", FS_REVERB_LEVEL, 0, 16384 },
+ { "Master reverb size", FS_REVERB_ROOMSIZE, 0, 16384 }, // Interval: [0,1]
+ { "Master reverb damping", FS_REVERB_DAMPING, 0, 16384 }, // Interval: [0,1]
+ { "Master reverb width", FS_REVERB_WIDTH, 0, 16384 }, // Interval: [0,100]
+ { "Master chorus on/off", FS_CHORUS_ON, 0, 1},
+ { "Master chorus num delay lines", FS_CHORUS_NUM, 0, 10 }, //Default: 3
+ { "Master chorus type", FS_CHORUS_TYPE, 0, 1 },
+ { "Master chorus speed", FS_CHORUS_SPEED, 0, 16384 }, // (0.291,5) Hz
+ { "Master chorus depth", FS_CHORUS_DEPTH, 0, 16384 }, // [0,40]
+ { "Master chorus level", FS_CHORUS_LEVEL, 0, 16384 }, // [0,1]
+ { "Modulation", CTRL_MODULATION, 0, 127 },
+ { "Portamento time", CTRL_PORTAMENTO_TIME, 0, 127 },
+ { "Volume", CTRL_VOLUME, 0, 127 },
+ { "Pan", CTRL_PANPOT, 0, 127 },
+ { "Expression", CTRL_EXPRESSION, 0, 127 },
+ { "Sustain", CTRL_SUSTAIN, 0, 127 },
+ { "Portamento", CTRL_PORTAMENTO, 0, 127 },
+ { "Soft Pedal", CTRL_SOFT_PEDAL, 0, 127 },
+ { "Variation", CTRL_VARIATION_SEND, 0, 127 },
+ { "Channel reverb send", CTRL_REVERB_SEND, 0, 127 },
+ { "Channel chorus send", CTRL_CHORUS_SEND, 0, 127 },
+ { "Pitch", CTRL_PITCH, -8192, 8191 }
+ };
+
+static int NUM_CONTROLLER = sizeof(FluidSynth::fluidCtrl)/sizeof(*(FluidSynth::fluidCtrl));
+
+//
+// Fluidsynth
+//
+FluidSynth::FluidSynth(int sr) : Mess(2)
+ {
+ setSampleRate(sr);
+ fluid_settings_t* s = new_fluid_settings();
+ fluid_settings_setnum(s, "synth.sample-rate", float(sampleRate()));
+ fluidsynth = new_fluid_synth(s);
+ if (!fluidsynth) {
+ printf("Error while creating fluidsynth!\n");
+ return;
+ }
+
+ //Set up channels:
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ //channels[i].font = 0;
+ channels[i].font_extid = FS_UNSPECIFIED_ID;
+ channels[i].font_intid = FS_UNSPECIFIED_ID;
+ channels[i].preset = FS_UNSPECIFIED_PRESET;
+ channels[i].drumchannel= false;
+ }
+ pthread_mutex_init(&_sfloader_mutex,NULL);
+
+/*
+ buffer = 0;
+ bufferlen = 0;
+ */
+ }
+
+FluidSynth::~FluidSynth()
+ {
+ /*
+ int err = delete_fluid_synth (_fluidsynth);
+ if (buffer)
+ delete [] buffer;
+ if (err == -1) {
+ std::cerr << DEBUG_ARGS << "error while destroying synth: " << fluid_synth_error(_fluidsynth) << std::endl;
+ return;
+ }
+ //Destroy the mutex
+ if (pthread_mutex_destroy(&_sfloader_mutex) != 0)
+ std::cerr << DEBUG_ARGS << "Strange, mutex busy! Should not be!" << std::endl;
+ */
+ }
+
+bool FluidSynth::init(const char* name)
+ {
+ debug("FluidSynth::init\n");
+
+ gui = new FluidSynthGui();
+ gui->show();
+ gui->setWindowTitle(name);
+
+ lastdir= "";
+ currentlyLoadedFonts = 0;
+ nrOfSoundfonts = 0;
+ sendChannelData();
+ cho_on = false;
+ cho_num = FS_PREDEF_CHORUS_NUM;
+ cho_type = FS_PREDEF_CHORUS_TYPE;
+ cho_level = FS_PREDEF_CHORUS_LEVEL;
+ cho_speed = FS_PREDEF_CHORUS_SPEED;
+ cho_depth = FS_PREDEF_CHORUS_DEPTH;
+ setController(0, FS_GAIN, (int)(fluidCtrl[0].max*FS_PREDEF_VOLUME));
+ setController(0, FS_REVERB_ON, 0);
+ setController(0, FS_REVERB_LEVEL, (int)(fluidCtrl[2].max*FS_PREDEF_REVERB_LEVEL));
+ setController(0, FS_REVERB_ROOMSIZE, (int)(fluidCtrl[3].max*FS_PREDEF_REVERB_ROOMSIZE));
+ setController(0, FS_REVERB_DAMPING, (int)(fluidCtrl[4].max*FS_PREDEF_REVERB_DAMPING));
+ setController(0, FS_REVERB_WIDTH, (int)(fluidCtrl[5].max*FS_PREDEF_REVERB_WIDTH));
+ setController(0, FS_CHORUS_ON, 0);
+ setController(0, FS_CHORUS_NUM, FS_PREDEF_CHORUS_NUM);
+ //setController(0, FS_CHORUS_TYPE, FS_PREDEF_CHORUS_TYPE); //?
+ setController(0, FS_CHORUS_SPEED, (int)(fluidCtrl[9].max*FS_PREDEF_CHORUS_SPEED));
+ setController(0, FS_CHORUS_DEPTH, (int)(fluidCtrl[10].max*FS_PREDEF_CHORUS_DEPTH));
+ setController(0, FS_CHORUS_LEVEL, (int)(fluidCtrl[11].max*FS_PREDEF_CHORUS_LEVEL));
+ return false;
+ }
+
+//---------------------------------------------------------
+// process
+// called from host
+//---------------------------------------------------------
+
+void FluidSynth::process(float** ports, int offset, int len)
+ {
+ //Process messages from the gui
+ while (gui->fifoSize()) {
+ MidiEvent ev = gui->readEvent();
+ if (ev.type() == ME_SYSEX) {
+ sysex(ev.len(), ev.data());
+ sendEvent(ev);
+ }
+ else if (ev.type() == ME_CONTROLLER) {
+ setController(ev.channel(), ev.dataA(), ev.dataB(), true);
+ sendEvent(ev);
+ }
+ else {
+ if (FS_DEBUG)
+ printf("FluidSynth::process(): unknown event, type: %d\n", ev.type());
+ }
+ }
+
+ if (fluid_synth_write_float(fluidsynth, len, ports[0], offset, 1, ports[1], offset, 1)) {
+ M_ERROR("Error writing from synth!");
+ return;
+ }
+ }
+
+//---------------------------------------------------------
+// getInitData
+// Prepare data that will restore the synth's state on load
+//---------------------------------------------------------
+void FluidSynth::getInitData(int* n, const unsigned char** data) const
+ {
+ // Data setup:
+ // FS_INIT_DATA (1 byte)
+ // FluidSynth version (2 bytes, x.y)
+ // n = Number of soundfonts (1 byte)
+ // Lastdir (variable size)
+ //
+ // FS_FONTS_BEGIN
+ // n blocks with font path (variable size)
+ // n bytes with font external id
+ //
+ // for all channels (16), 1 byte each for external id + 1 byte for preset + 1 byte for bankno
+ // which is mapped to internal id after all fonts are loaded.
+ //
+ // reverb + chorus on/off (2 bytes)
+ if (FS_DEBUG)
+ printf("FluidSynth::getInitData()\n");
+
+ //Calculate length:
+ int len = FS_INIT_DATA_HEADER_SIZE + strlen(lastdir.c_str()) + 1; //header size
+ for (std::list<FluidSoundFont>::const_iterator it = stack.begin(); it!=stack.end(); it++) {
+ len+=strlen(it->filename.c_str()) + 2;
+ }
+ //Add length for lastdir and channels:
+ len+=strlen(lastdir.c_str())+1;
+ len+=(FS_MAX_NR_OF_CHANNELS*4); // 4 bytes: ext+int id + bankno + drumchannel status
+ // + reverb
+ len+=2;
+
+ if (FS_DEBUG)
+ printf("Total length of init sysex: %d\n", len);
+ byte* d = new byte[len];
+
+ // Header:
+ d[0] = FS_INIT_DATA;
+ d[1] = FS_VERSION_MAJOR;
+ d[2] = FS_VERSION_MINOR;
+ d[3] = stack.size();
+
+ //Lastdir:
+ byte* chptr = d + FS_INIT_DATA_HEADER_SIZE;
+ memcpy(chptr, lastdir.c_str(), strlen(lastdir.c_str())+1);
+
+ //For each font...
+ chptr+=strlen(lastdir.c_str())+1;
+ for (std::list<FluidSoundFont>::const_iterator it =stack.begin(); it!=stack.end(); it++) {
+ memcpy(chptr, it->filename.c_str(), strlen(it->filename.c_str())+1);
+ chptr = chptr + 1 + strlen(it->filename.c_str());
+ }
+
+ //For each font again...
+ *chptr = FS_INIT_CHANNEL_SECTION;
+ chptr++;
+ for (std::list<FluidSoundFont>::const_iterator it =stack.begin(); it!=stack.end(); it++) {
+ *chptr = it->extid;
+ chptr++;
+ }
+
+ //External id:s & preset for all channels:
+ for(int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ *chptr = channels[i].font_extid; chptr++;
+ *chptr = channels[i].preset; chptr++;
+ *chptr = channels[i].banknum; chptr++;
+ *chptr = channels[i].drumchannel; chptr++;
+ }
+
+ //Reverb:
+ *chptr = rev_on; chptr++;
+ *chptr = cho_on; chptr++;
+ if (FS_DEBUG) {
+ for (int i=0; i<len; i++)
+ printf("%c ", d[i]);
+ printf("\n");
+ for (int i=0; i<len; i++)
+ printf("%x ", d[i]);
+ printf("\n");
+ }
+ // Give values to host:
+ *data = d;
+ *n = len;
+ }
+
+//-----------------------------------
+// parseInitData
+//-----------------------------------
+void FluidSynth::parseInitData(int n, const byte* d)
+ {
+ bool load_drumchannels = true; // Introduced in initdata ver 0.3
+ bool handle_bankvalue = true; // Introduced in initdata ver 0.4
+
+ if (FS_DEBUG) {
+ printf("--- PARSING INIT DATA ---\n");
+ for (int i=0; i<n; i++)
+ printf("%c ", d[i]);
+ printf("\n");
+ }
+
+ byte version_major, version_minor;
+ version_major = d[1]; version_minor = d[2];
+
+ // Check which version of the initdata we're using and if it's OK
+ if (!(version_major == FS_VERSION_MAJOR && version_minor == FS_VERSION_MINOR)) {
+ if (FS_DEBUG) {
+ printf("Project saved with other version of fluidsynth format. Ver: %d.%d\n", version_major, version_minor);
+ }
+
+ if (version_major == 0 && version_minor == 1) {
+ sendError("Initialization data created with different version of FluidSynth Mess, will be ignored.");
+ return;
+ }
+
+ if (version_major == 0 && version_minor <= 2) {
+ load_drumchannels = false;
+ }
+
+ if (version_major == 0 && version_minor <= 3) {
+ handle_bankvalue = false;
+ }
+ }
+
+ byte nr_of_fonts = d[3];
+ nrOfSoundfonts = nr_of_fonts; //"Global" counter
+ const byte* chptr = (d + 4);
+
+ //Get lastdir:
+ lastdir = std::string((char*)chptr);
+ sendLastdir(lastdir.c_str());
+
+ chptr+=strlen(lastdir.c_str())+1;
+
+ FluidSoundFont fonts[nrOfSoundfonts]; //Just a temp one
+ //Fonts:
+ for (int i=0; i<nr_of_fonts; i++) {
+ fonts[i].filename = (char*)(chptr);
+ chptr+=(strlen(fonts[i].filename.c_str())+1);
+ }
+
+ if (*chptr != FS_INIT_CHANNEL_SECTION) {
+ sendError("Init-data corrupt... Projectfile error. Initdata ignored.\n");
+ return;
+ }
+
+ chptr++;
+ for (int i=0; i<nr_of_fonts; i++) {
+ fonts[i].extid = *chptr;
+ chptr++;
+ //printf("Extid, %d: %d\n",i,fonts[i].extid);
+ }
+
+ // All channels external id + preset
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ channels[i].font_extid = *chptr; chptr++;
+ channels[i].preset = *chptr; chptr++;
+ if (handle_bankvalue) { // Ver 0.4 and later
+ channels[i].banknum = *chptr; chptr++;
+ }
+ else {
+ channels[i].banknum = 0;
+ }
+
+ if (load_drumchannels) { // Ver 0.3 and later
+ channels[i].drumchannel = *chptr;
+ chptr++;
+ }
+ }
+
+ //Reverb:
+ setController(0, FS_REVERB_ON, *chptr); chptr++;
+ setController(0, FS_CHORUS_ON, *chptr); chptr++;
+
+ if (FS_DEBUG)
+ printf("--- END PARSE INIT DATA ---\n");
+ //Load the shit:
+ for (int i=0; i<nrOfSoundfonts; i++) {
+ pushSoundfont(fonts[i].filename.c_str(), fonts[i].extid);
+ }
+ }
+
+
+//---------------------------------------------------------
+// processEvent
+// All events from the sequencer goes here
+//---------------------------------------------------------
+
+bool FluidSynth::processEvent(const MidiEvent& ev)
+ {
+ switch(ev.type()) {
+ case ME_CONTROLLER:
+ if (FS_DEBUG_DATA) {
+ printf("*** FluidSynth::process - Controller. Chan: %x dataA: %x dataB: %x\n", ev.channel(), ev.dataA(), ev.dataB());
+ for (int i=0; i< ev.len(); i++)
+ printf("%x ", ev.data()[i]);
+ }
+ setController(ev.channel(), ev.dataA(), ev.dataB(), false);
+ return true;
+ case ME_NOTEON:
+ return playNote(ev.channel(), ev.dataA(), ev.dataB());
+ case ME_NOTEOFF:
+ return playNote(ev.channel(), ev.dataA(), 0);
+ case ME_SYSEX:
+ //Debug print
+ if (FS_DEBUG_DATA) {
+ printf("*** FluidSynth::process - Sysex received\n");
+ for (int i=0; i< ev.len(); i++)
+ printf("%x ", ev.data()[i]);
+ printf("\n");
+ }
+ return sysex(ev.len(), ev.data());
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// sysex
+//---------------------------------------------------------
+
+bool FluidSynth::sysex(int n, const unsigned char* d)
+ {
+ if (n == 0 || d == 0)
+ return false;
+ switch(*d) {
+ case FS_LASTDIR_CHANGE: {
+ lastdir = std::string((char*)(d+1));
+ sendLastdir(lastdir.c_str());
+ break;
+ }
+ case FS_PUSH_FONT: {
+ int extid = d[1];
+
+ if (FS_DEBUG)
+ printf("Client: Got push font %s, id: %d\n",(d+1), extid);
+
+ const char* filename = (const char*)(d+2);
+ if (!pushSoundfont(filename, extid))
+ sendError("Could not load soundfont ");
+ break;
+ }
+ case FS_DUMP_INFO: {
+ dumpInfo();
+ break;
+ }
+ case FS_SOUNDFONT_CHANNEL_SET: {
+ sfChannelChange(*(d+1), *(d+2));
+ break;
+ }
+ case FS_INIT_DATA: {
+ parseInitData(n,d);
+ break;
+ }
+ case FS_SOUNDFONT_POP:
+ popSoundfont(*(d+1));
+ break;
+ case FS_DRUMCHANNEL_SET: {
+ byte onoff = (*(d+1));
+ byte channel = (*(d+2));
+ channels[channel].drumchannel = onoff;
+ if (FS_DEBUG)
+ printf("Client: Set drumchannel on chan %d to %d\n",channel, onoff);
+ break;
+ }
+ default:
+ if (FS_DEBUG)
+ printf("FluidSynth::sysex() : unknown sysex received: %d\n",*d);
+ break;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// sendSysex
+//---------------------------------------------------------
+void FluidSynth::sendSysex(int l, const unsigned char* d)
+ {
+ MidiEvent ev(0, ME_SYSEX, d, l);
+ gui->writeEvent(ev);
+ }
+
+//-----------------------------------
+// pushSoundfont - load a soundfont
+//-----------------------------------
+bool FluidSynth::pushSoundfont (const char* filename, int extid)
+ {
+ pthread_attr_t* attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t));
+ pthread_attr_init(attributes);
+ pthread_attr_setdetachstate(attributes, PTHREAD_CREATE_DETACHED);
+
+ FS_Helper* helper = new FS_Helper;
+ helper->fptr = this;
+ helper->filename = filename;
+ helper->id = extid;
+
+ if (pthread_create(&fontThread, attributes, FluidSynth::fontLoadThread, (void*) helper))
+ perror("creating thread failed:");
+
+ pthread_attr_destroy(attributes);
+ return true;
+ }
+
+//---------------------------------------------------------
+// fontLoadThread
+// helper thread to load soundfont in the
+// background
+//---------------------------------------------------------
+
+void* FluidSynth::fontLoadThread(void* t)
+ {
+ //Init vars
+ FS_Helper* h = (FS_Helper*) t;
+ FluidSynth* fptr = h->fptr;
+ const char* filename = h->filename.c_str();
+ pthread_mutex_t* sfloader_mutex = &(fptr->_sfloader_mutex);
+
+ //Let only one loadThread have access to the fluidsynth-object at the time
+ pthread_mutex_lock(sfloader_mutex);
+ int rv = fluid_synth_sfload(fptr->fluidsynth, filename, 1);
+
+ if (rv ==-1) {
+ fptr->sendError(fluid_synth_error(fptr->fluidsynth));
+ if (FS_DEBUG)
+ std::cerr << DEBUG_ARGS << "error loading soundfont: " << fluid_synth_error(fptr->fluidsynth) << std::endl;
+
+ //Unlock the mutex, or else we might be stuck here forever...
+ pthread_mutex_unlock(sfloader_mutex);
+ delete h;
+ pthread_exit(0);
+ }
+
+ //Deal with internal and external id etc.
+ if (FS_DEBUG)
+ printf("Soundfont %s loaded, index %d\n", filename, rv);
+
+ FluidSoundFont font;
+ font.filename = h->filename;//strdup(filename);
+
+ font.intid = rv;
+ if (h->id == FS_UNSPECIFIED_ID) {
+ font.extid = fptr->getNextAvailableExternalId();
+ if (FS_DEBUG)
+ printf("Font got extid %d\n",font.extid);
+ }
+ else
+ font.extid = h->id;
+ if (FS_DEBUG)
+ printf("Font has external id: %d int id:%d\n", font.extid, font.intid);
+
+ //Strip off the filename
+ QFileInfo fi(filename);
+ font.name = fi.baseName().toLatin1().data();
+ fptr->stack.push_front(font);
+ fptr->currentlyLoadedFonts++;
+
+ //Cleanup & unlock:
+ pthread_mutex_unlock(sfloader_mutex);
+ delete h;
+
+ if (FS_DEBUG)
+ printf("Currently loaded fonts: %d Nr of soundfonts: %d\n",fptr->currentlyLoadedFonts, fptr->nrOfSoundfonts);
+ //Check whether this was the last font or not. If so, run initSynth();
+ if (fptr->nrOfSoundfonts <= fptr->currentlyLoadedFonts) {
+ if (FS_DEBUG)
+ printf("This was the last font, rewriting channel settings...\n");
+ fptr->rewriteChannelSettings();
+ //Update data in GUI-window.
+ fptr->sendSoundFontData();
+ fptr->sendChannelData();
+ fptr->sendFontSuccessfullyLoaded(filename, font.extid);
+ }
+
+ pthread_exit(0);
+ }
+
+//---------------------------------------------------------
+// playNote
+// called from host
+//---------------------------------------------------------
+
+bool FluidSynth::playNote(int channel, int pitch, int velo)
+ {
+ if (channels[channel].font_intid == FS_UNSPECIFIED_FONT)
+ return false;
+ if (velo) {
+ if (fluid_synth_noteon(fluidsynth, channel, pitch, velo)) {
+ if (FS_DEBUG)
+ std::cerr << DEBUG_ARGS << "error processing noteon event: " << fluid_synth_error(fluidsynth);
+ }
+ }
+ else {
+ if (fluid_synth_noteoff(fluidsynth, channel, pitch))
+ if (FS_DEBUG)
+ std::cerr << DEBUG_ARGS << "error processing noteoff event: " << fluid_synth_error(fluidsynth) << std::endl;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// sendSoundFontData
+//---------------------------------------------------------
+void FluidSynth::sendSoundFontData()
+ {
+ int ndatalen = 2; //2 bytes for command and length
+
+ //Calculate length in chars of all strings in the soundfontstack in one string
+ for (std::list<FluidSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) {
+ ndatalen += 1 + strlen(it->name.c_str());
+ ndatalen += FS_SFDATALEN; //unsigned char for ID
+ }
+ byte ndata[ndatalen];
+ *ndata = FS_SEND_SOUNDFONTDATA; //The command
+ *(ndata + 1) = (unsigned char)stack.size (); //Nr of Soundfonts
+
+ // Copy the stuff to ndatalen:
+ char* chunk_start = (char*)(ndata + 2);
+ int chunk_len, name_len;
+ for (std::list<FluidSoundFont>::iterator it = stack.begin(); it != stack.end(); ++it) {
+ name_len = strlen(it->name.c_str()) + 1;
+ chunk_len = name_len + FS_SFDATALEN;
+ memcpy(chunk_start, it->name.c_str(), name_len); //First, store the fontname
+ *(chunk_start + name_len) = it->extid; //The GUI only needs to know about the external id, store that here
+ chunk_start += chunk_len;
+ }
+ sendSysex(ndatalen, ndata);
+ }
+
+//---------------------------------------------------------
+// sendChannelData
+//---------------------------------------------------------
+void FluidSynth::sendChannelData()
+ {
+ int chunk_size = 2;
+ int chdata_length = (chunk_size * FS_MAX_NR_OF_CHANNELS) +1 ; //Command and the 2 channels * 16
+ byte chdata[chdata_length];
+ byte* chdptr;
+ chdata[0] = FS_SEND_CHANNELINFO;
+ chdptr = (chdata + 1);
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ *(chdptr) = channels[i].font_extid; //Font external id
+ *(chdptr+1) = i; //Channel nr
+ chdptr += chunk_size;
+ }
+ sendSysex(chdata_length, chdata);
+ // Send drum channel info afterwards (later addition, not very neat, but works...)
+
+ int drumchdata_length = FS_MAX_NR_OF_CHANNELS + 1; //1 byte for the command, one byte for each channel
+ byte drumchdata[drumchdata_length ];
+ byte* drumchdataptr = drumchdata;
+ *drumchdata = FS_SEND_DRUMCHANNELINFO;
+
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ drumchdataptr++;
+ *drumchdataptr = channels[i].drumchannel;
+ }
+ sendSysex(drumchdata_length, drumchdata);
+ }
+
+//---------------------------------------------------------
+// dumpInfo
+//---------------------------------------------------------
+
+void FluidSynth::dumpInfo()
+ {
+ printf("-----------------------------------------------------\n");
+ printf("Dumping info...\n");
+ printf("Last dir: %s\n", lastdir.c_str());
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++)
+ printf("Chan %d\tFont extid:%d\tintid:%d\tdrumchan:%d\tpreset: %d\n", i, channels[i].font_extid, channels[i].font_intid, channels[i].drumchannel, channels[i].preset);
+
+ printf("\n");
+ for (std::list<FluidSoundFont>::iterator it = stack.begin(); it != stack.end(); it++)
+ printf("Font: %s\tintid: %d\textid %d\tfilename:%s\n", it->name.c_str(), it->intid, it->extid, it->filename.c_str());
+ printf("Reverb on: %d, width: %f, size: %f level: %f damp: %f\n",rev_on, rev_width, rev_size, rev_level, rev_damping);
+ printf("-----------------------------------------------------\n");
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool FluidSynth::guiVisible() const
+ {
+ return gui->isVisible();
+ }
+
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void FluidSynth::showGui(bool val)
+ {
+ gui->setShown(val);
+ }
+
+//---------------------------------------------------------
+// setController
+//---------------------------------------------------------
+
+bool FluidSynth::setController(int channel, int id, int val)
+ {
+ setController(channel, id, val, false);
+ return false;
+ }
+
+//---------------------------------------------------------
+// setController
+//---------------------------------------------------------
+
+void FluidSynth::setController(int channel, int id, int val, bool fromGui)
+ {
+ //
+ // Channelless controllers
+ //
+ int err = 0;
+ switch (id) {
+ case FS_GAIN: {
+ fluid_synth_set_gain(fluidsynth, (float) val/25); //gives val an interval of approximately[0,5]
+ //Forward to gui if not from Gui
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_GAIN, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ }
+ case FS_REVERB_ON: {
+ rev_on = val;
+ fluid_synth_set_reverb_on(fluidsynth, val); // 0 or 1
+ //if (rev_on)
+ // fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_REVERB_ON, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ }
+ case FS_REVERB_LEVEL:
+ //Interval: 0-2
+ rev_level = (double)2*val/16384; //[0,2]
+ //if (rev_on)
+ fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_REVERB_LEVEL, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ case FS_REVERB_WIDTH: //
+ rev_width = (double)val/164; //[0,100]
+ //if (rev_on)
+ fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_REVERB_WIDTH, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ case FS_REVERB_DAMPING: //[0,1]
+ rev_damping = (double)val/16384;
+ //if (rev_on)
+ fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_REVERB_DAMPING, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ case FS_REVERB_ROOMSIZE: //[0,1]
+ rev_size = (double)val/16384;
+ //if (rev_on)
+ fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_REVERB_ROOMSIZE, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ case FS_CHORUS_ON: {// 0 or 1
+ cho_on = val;
+ fluid_synth_set_chorus_on(fluidsynth, val);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_CHORUS_ON, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ }
+ case FS_CHORUS_NUM: {//Number of delay lines
+ cho_num = val;
+ fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_CHORUS_NUM, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ }
+ case FS_CHORUS_TYPE: {//?
+ cho_type = val;
+ fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_CHORUS_TYPE, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ }
+ case FS_CHORUS_SPEED: {//(0.291,5) Hz
+ cho_speed = (double)(0.291 + (double)val/3479);
+ fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_CHORUS_SPEED, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ }
+ case FS_CHORUS_DEPTH: { //[0,40]
+ cho_depth = (double) val*40/16383;
+ fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_CHORUS_DEPTH, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ }
+ case FS_CHORUS_LEVEL: { //[0,1]
+ cho_level = (double) val/16383;
+ fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type);
+ if (!fromGui) {
+ MidiEvent ev(0, 0, ME_CONTROLLER, FS_CHORUS_LEVEL, val);
+ gui->writeEvent(ev);
+ }
+ break;
+ }
+ //
+ // Controllers that depend on channels
+ //
+ case CTRL_PITCH:
+ err = fluid_synth_pitch_bend (fluidsynth, channel, val);
+ break;
+ case CTRL_PROGRAM: {
+ //Check if MusE is trying to set a preset on an unspecified font. If so, ignore.
+ if (FS_DEBUG)
+ printf("Program select : channel %d val %d\n",channel, val);
+ byte font_intid = channels[channel].font_intid;
+
+ if (font_intid == FS_UNSPECIFIED_ID || font_intid == FS_UNSPECIFIED_FONT)
+ return;
+
+ byte banknum = ((val >> 16) & 0xff);
+ byte patch = (val & 0xff);
+ //printf("val: %d banknum: %x patch: %d\n", val, banknum, patch);
+
+ err = fluid_synth_program_select(fluidsynth, channel, font_intid , banknum, patch);
+ if (err)
+ printf("FluidSynth::setController() - Error changing program on soundfont %s, channel: %d\n", fluid_synth_error(fluidsynth), channel);
+ else {
+ channels[channel].preset = val;//setChannelPreset(val, channel);
+ channels[channel].banknum = banknum;
+ }
+ break;
+ }
+ default:
+ if (FS_DEBUG)
+ printf("Setting controller on channel: %d with id: 0x%x to val: %d\n",channel, id, val);
+ err = fluid_synth_cc(fluidsynth, channel, id, val);
+ break;
+ }
+
+ if (err)
+ printf ("FluidSynth::setController() - error processing controller event: %s\n", fluid_synth_error(fluidsynth));
+ }
+
+//---------------------------------------------------------
+// getControllerInfo
+//---------------------------------------------------------
+int FluidSynth::getControllerInfo(int id, const char** name, int* controller, int* min, int* max) const
+ {
+ if (id >= NUM_CONTROLLER)
+ return 0;
+ *controller = fluidCtrl[id].num;
+ *name = fluidCtrl[id].name;
+ *min = fluidCtrl[id].min;
+ *max = fluidCtrl[id].max;
+ if (FS_DEBUG)
+ printf("FluidSynth::getControllerInfo() id: %d name: %s controller: %d min: %d max: %d\n",id,*name,*controller,*min,*max);
+ return ++id;
+ }
+
+//---------------------------------------------------------
+// sendError
+//---------------------------------------------------------
+void FluidSynth::sendError(const char *errorMessage)
+ {
+ int len = 2 + strlen(errorMessage);
+ unsigned char data[len];
+ *data = FS_ERROR;
+ memcpy(data + 1, errorMessage, len - 1);
+ sendSysex(len, data);
+ }
+
+//---------------------------------------------------------
+// getNextAvailableExternalId
+//---------------------------------------------------------
+
+int FluidSynth::getNextAvailableExternalId()
+ {
+ unsigned char place[FS_MAX_NR_OF_CHANNELS];
+ for(int i=0; i<FS_MAX_NR_OF_CHANNELS; i++)
+ place[i] = 0;
+ for (std::list<FluidSoundFont>::iterator it = stack.begin(); it != stack.end(); it++)
+ place[it->extid] = 1;
+
+ int i=0;
+ while (i < FS_MAX_NR_OF_CHANNELS && place[i] == 1)
+ i++;
+
+ return i;
+ }
+
+//---------------------------------------------------------
+// sfChannelChange
+//---------------------------------------------------------
+
+void FluidSynth::sfChannelChange(byte extid, byte channel)
+ {
+ if (FS_DEBUG)
+ printf("FluidSynth::sfChannelChange()-Setting channel %d to font with extid %d intid %d\n",channel, extid, getFontInternalIdByExtId(extid));
+ channels[channel].font_extid = extid;
+ channels[channel].font_intid = getFontInternalIdByExtId(extid);
+ }
+
+//---------------------------------------------------------
+// getFontInternalIdByExtId
+//---------------------------------------------------------
+byte FluidSynth::getFontInternalIdByExtId(byte ext_id)
+ {
+ for (std::list<FluidSoundFont>::iterator it = stack.begin(); it !=stack.end(); it++) {
+ if (it->extid == ext_id)
+ return it->intid;
+ }
+ return FS_UNSPECIFIED_FONT;
+ }
+
+//---------------------------------------------------------
+// sendLastDir
+//---------------------------------------------------------
+void FluidSynth::sendLastdir(const char* lastdir)
+ {
+ int n = strlen(lastdir) + 2;
+ byte d[n];
+ d[0] = FS_LASTDIR_CHANGE;
+ memcpy(d+1,lastdir, strlen(lastdir)+1);
+
+ MidiEvent ev(0, ME_SYSEX, d, n);
+ gui->writeEvent(ev);
+ }
+
+//---------------------------------------------------------
+// sendLastDir
+//---------------------------------------------------------
+void FluidSynth::sendFontSuccessfullyLoaded(const char* filename, byte extid)
+ {
+ // extid first, then filename:
+ int n = strlen(filename) + 3;
+ byte d[n];
+ d[0] = FS_FONT_SUCCESSFULLY_LOADED;
+ d[1] = extid;
+ memcpy(d+2, filename, strlen(filename)+1);
+ MidiEvent ev(0, ME_SYSEX, d, n);
+ gui->writeEvent(ev);
+ }
+//---------------------------------------------------------
+// rewriteChannelSettings
+//---------------------------------------------------------
+void FluidSynth::rewriteChannelSettings()
+ {
+ //Walk through the channels, remap internal ID:s to external ID:s (something that actually only needs to be done at
+ //startup, since the fonts aren't loaded yet at that time and it isn't possible to give them a correct internal id
+ //since they don't have any at that time, this can probably be fixed in a smarter way (but it works..))
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ int ext_id = channels[i].font_extid;//getFontExternalIdByChannel(i);
+ if (ext_id != FS_UNSPECIFIED_ID) //Check if ext_id is set to any sane font
+ {
+ channels[i].font_intid = getFontInternalIdByExtId(ext_id);//(getFontInternalIdByExtId(ext_id));//if so, get value from the stack
+ }
+ else
+ channels[i].font_intid = FS_UNSPECIFIED_FONT; //if not, set it to unspecified
+ }
+
+ //Assign correct presets to all channels
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ int preset = channels[i].preset;
+ int int_id = channels[i].font_intid;
+ byte banknum = channels[i].banknum;
+
+ if (channels[i].drumchannel)
+ banknum = 128;
+
+ //printf("Channel %d, font int-id %d ext_id %d, preset %d\n",i, int_id, getFontExternalIdByChannel(i), preset);
+ if (!(preset == FS_UNSPECIFIED_PRESET || int_id == FS_UNSPECIFIED_FONT)) {
+ int rv = fluid_synth_program_select(fluidsynth, i, int_id, banknum, preset);
+ if (rv)
+ std::cerr << DEBUG_ARGS << "Error changing preset! " << fluid_synth_error(fluidsynth) << std::endl;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// getPatchName
+//---------------------------------------------------------
+const char* FluidSynth::getPatchName(int i, int, int) const
+ {
+ if (channels[i].font_intid == FS_UNSPECIFIED_FONT)
+ return "no preset";
+ else if (channels[i].preset == FS_UNSPECIFIED_PRESET)
+ return "no preset";
+ else {
+ //printf("Getpatchname, channel: %d\n",channel);
+ fluid_preset_t *preset = fluid_synth_get_channel_preset(fluidsynth, i);
+ if (!preset) return "no preset";
+ return preset->get_name(preset);
+ }
+ }
+
+//---------------------------------------------------------
+// getPatchInfo
+//---------------------------------------------------------
+const MidiPatch* FluidSynth::getPatchInfo(int i, const MidiPatch* patch) const
+ {
+ if (channels[i].font_intid == FS_UNSPECIFIED_FONT)
+ return 0;
+ //else if (channels[i].preset == FS_UNSPECIFIED_PRESET)
+ // return 0;
+ else {
+ //printf("Getpatchname, channel: %d\n",channel);
+ if (!patch)
+ //Deliver first patch
+ return getFirstPatch(i);
+ else
+ //Deliver next patch
+ return getNextPatch(i, patch);
+ }
+ }
+
+//---------------------------------------------------------
+// getFirstPatch
+//---------------------------------------------------------
+const MidiPatch* FluidSynth::getFirstPatch (int channel) const
+ {
+ static MidiPatch midiPatch;
+
+ midiPatch.typ = 0;
+ midiPatch.lbank = 0;
+
+ fluid_preset_t* preset;
+ int font_id = channels[channel].font_intid;
+ if (font_id == FS_UNSPECIFIED_FONT)
+ return 0;
+
+ fluid_sfont_t* sfont = fluid_synth_get_sfont_by_id(fluidsynth, font_id);
+
+ if (!channels[channel].drumchannel) {
+ for (unsigned bank = 0; bank < 128; ++bank) {
+ for (unsigned patch = 0; patch < 128; ++patch) {
+ preset = sfont->get_preset (sfont, bank, patch);
+ if (preset) {
+ midiPatch.hbank = bank;
+ midiPatch.prog = patch;
+ midiPatch.name = preset->get_name (preset);
+ return &midiPatch;
+ }
+ }
+ }
+ return 0;
+ }
+ else { //This is a drumchannel
+ int bank = 128;
+ for (unsigned patch = 0; patch < 128; ++patch) {
+ preset = sfont->get_preset (sfont, bank, patch);
+ if (preset) {
+ midiPatch.hbank = bank;
+ midiPatch.prog = patch;
+ midiPatch.name = preset->get_name(preset);
+ return &midiPatch;
+ }
+ }
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// getNextPatch
+//---------------------------------------------------------
+const MidiPatch* FluidSynth::getNextPatch (int channel, const MidiPatch* patch) const
+ {
+ static MidiPatch midiPatch;
+ //First check if there actually is any soundfont associated to the channel. If not, don't bother
+ int font_id = channels[channel].font_intid;
+ if (font_id == FS_UNSPECIFIED_FONT)
+ return 0;
+ if (patch == 0)
+ return getFirstPatch(channel);
+
+ midiPatch.typ = 0;
+ midiPatch.lbank = 0;
+
+ if (font_id == FS_UNSPECIFIED_FONT)
+ return 0;
+ //printf("Font has internal id: %d\n",font_id);
+ fluid_preset_t* preset;
+ fluid_sfont_t* sfont = fluid_synth_get_sfont_by_id(fluidsynth, font_id);
+
+ if (!channels[channel].drumchannel) {
+ unsigned prog = patch->prog + 1;
+
+ for (unsigned bank = patch->hbank; bank < 128; ++bank) {
+ for ( ; prog < 128; ++prog) {
+ preset = sfont->get_preset (sfont, bank, prog);
+ if (preset) {
+ //printf("Preset info: bank: %d prog: %d name: %s\n", bank, prog, preset->get_name(preset));
+ midiPatch.hbank = bank;
+ midiPatch.prog = prog;
+ midiPatch.name = preset->get_name (preset);
+ return &midiPatch;
+ }
+ }
+ prog = 0; // Reset if we "come around"
+ }
+ }
+ else { //This is a drum channel
+ unsigned bank = 128;
+ unsigned prog = patch->prog;
+ for (prog = patch->prog + 1; prog < 128; ++prog) {
+ preset = sfont->get_preset (sfont, bank, prog);
+ if (preset) {
+ //printf("Preset info: bank: %d prog: %d name: %s\n",bank, prog, preset->get_name(preset));
+ midiPatch.hbank = bank;
+ midiPatch.prog = prog;
+ midiPatch.name = preset->get_name (preset);
+ return &midiPatch;
+ }
+ }
+ }
+ return 0;
+ }
+
+//---------------------------------------------------------
+// popSoundfont
+//---------------------------------------------------------
+
+bool FluidSynth::popSoundfont (int ext_id)
+ {
+ bool success = false;
+ int int_id = getFontInternalIdByExtId(ext_id);
+
+ if (int_id == FS_UNSPECIFIED_FONT) {
+ std::cerr << DEBUG_ARGS << "Internal error! Request for deletion of Soundfont that is not registered!" << std::endl;
+ }
+ else
+ {
+ //Try to unload soundfont
+ int err = fluid_synth_sfunload(fluidsynth, int_id, 0);
+ if (err != -1) {//Success
+ //Check all channels that the font is used in
+ for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) {
+ //Set them to unspecified and reset preset settings
+ if (channels[i].font_intid == int_id) {
+ channels[i].font_intid = FS_UNSPECIFIED_ID;
+ channels[i].font_extid = FS_UNSPECIFIED_ID;
+ channels[i].preset = FS_UNSPECIFIED_PRESET;
+ }
+ }
+ //Remove it from soundfont stack
+ for (std::list<FluidSoundFont>::iterator it =stack.begin(); it !=stack.end(); it++) {
+ if (it->intid == int_id) {
+ stack.erase(it);
+ break;
+ }
+ }
+ //Resend fontdata & re-initialize
+ sendSoundFontData();
+ sendChannelData();
+ rewriteChannelSettings();
+ success = true;
+ currentlyLoadedFonts--;
+ }
+ else //OK, there was trouble
+ std::cerr << DEBUG_ARGS << "Error unloading soundfont!" << fluid_synth_error(fluidsynth) << std::endl;
+ }
+ if (FS_DEBUG)
+ printf("Removed soundfont with ext it: %d\n",ext_id);
+ return success;
+ }
+
+//---------------------------------------------------------
+// instantiate
+// construct a new synthesizer instance
+//---------------------------------------------------------
+
+class QWidget;
+
+static Mess* instantiate(int sr, QWidget*, const char* name)
+ {
+ printf("fluidsynth sampleRate %d\n", sr);
+ FluidSynth* synth = new FluidSynth(sr);
+ if (synth->init(name)) {
+ delete synth;
+ synth = 0;
+ }
+ return synth;
+ }
+
+extern "C"
+ {
+ static MESS descriptor = {
+ "FluidSynth",
+ "Mathias Lundgren (lunar_shuttle@users.sf.net)",
+ "0.1", //Version string
+ MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
+ instantiate,
+ };
+ const MESS* mess_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse/synti/fluidsynth/fluidsynti.h b/muse/synti/fluidsynth/fluidsynti.h
new file mode 100644
index 00000000..41ca2dc4
--- /dev/null
+++ b/muse/synti/fluidsynth/fluidsynti.h
@@ -0,0 +1,142 @@
+/*
+ * MusE FLUID Synth softsynth plugin
+ *
+ * Copyright (C) 2004 Mathias Lundgren (lunar_shuttle@users.sourcforge.net)
+ *
+ * $Id: fluidsynti.h,v 1.20 2006/01/06 22:48:09 wschweer Exp $
+ *
+ */
+
+#ifndef __MUSE_FLUIDSYNTI_H__
+#define __MUSE_FLUIDSYNTI_H__
+
+#include <fluidsynth.h>
+// #include <qstring.h>
+#include <pthread.h>
+#include <string>
+#include "fluidsynthgui.h"
+#include "libsynti/mess.h"
+#include "muse/debug.h"
+#include "libsynti/mpevent.h"
+#include "muse/midictrl.h"
+
+#define FS_DEBUG_DATA 0 //Turn on/off debug print of midi data sent to fluidsynth
+
+typedef unsigned char byte;
+
+struct FluidSoundFont
+ {
+ std::string filename;
+ std::string name;
+ byte extid, intid;
+ };
+
+struct FluidCtrl {
+ const char* name;
+ int num;
+ int min, max;
+ //int val;
+ };
+
+// NRPN-controllers:
+static const int FS_GAIN = 0 + CTRL_NRPN14_OFFSET;
+static const int FS_REVERB_ON = 1 + CTRL_NRPN14_OFFSET;
+static const int FS_REVERB_LEVEL = 2 + CTRL_NRPN14_OFFSET;
+static const int FS_REVERB_ROOMSIZE = 3 + CTRL_NRPN14_OFFSET;
+static const int FS_REVERB_DAMPING = 4 + CTRL_NRPN14_OFFSET;
+static const int FS_REVERB_WIDTH = 5 + CTRL_NRPN14_OFFSET;
+static const int FS_CHORUS_ON = 6 + CTRL_NRPN14_OFFSET;
+static const int FS_CHORUS_NUM = 7 + CTRL_NRPN14_OFFSET;
+static const int FS_CHORUS_TYPE = 8 + CTRL_NRPN14_OFFSET;
+static const int FS_CHORUS_SPEED = 9 + CTRL_NRPN14_OFFSET;
+static const int FS_CHORUS_DEPTH = 10 + CTRL_NRPN14_OFFSET;
+static const int FS_CHORUS_LEVEL = 11 + CTRL_NRPN14_OFFSET;
+
+// FluidChannel is used to map different soundfonts to different fluid-channels
+// This is to be able to select different presets from specific soundfonts, since
+// Fluidsynth has a quite strange way of dealing with fontloading and channels
+// We also need this since getFirstPatch and getNextPatch only tells us which channel is
+// used, so this works as a connection between soundfonts and fluid-channels (one channel
+// can only have one soundfont, but one soundfont can have many channels)
+
+struct FluidChannel
+ {
+ byte font_extid, font_intid, preset, drumchannel;
+ byte banknum; // hbank
+ };
+
+class FluidSynth : public Mess {
+ private:
+ bool pushSoundfont (const char*, int);
+ void sendSysex(int l, const unsigned char* d);
+ void sendLastdir(const char*);
+ void sfChannelChange(unsigned char font_id, unsigned char channel);
+ void parseInitData(int n, const byte* d);
+
+ byte getFontInternalIdByExtId (byte channel);
+
+ void debug(const char* msg) { if (FS_DEBUG) printf("Debug: %s\n",msg); }
+ void dumpInfo(); //Prints out debug info
+
+ FluidChannel channels[FS_MAX_NR_OF_CHANNELS];
+ std::string lastdir;
+ pthread_t fontThread;
+ const MidiPatch * getFirstPatch (int channel) const;
+ const MidiPatch* getNextPatch (int, const MidiPatch *) const;
+
+ //For reverb and chorus:
+ double rev_size, rev_damping, rev_width, rev_level, cho_level, cho_speed, cho_depth;
+ bool rev_on, cho_on;
+ int cho_num, cho_type;
+
+public:
+ FluidSynth(int sr);
+ ~FluidSynth();
+ bool init(const char*);
+ virtual void process(float**, int, int);
+ virtual bool playNote(int channel, int pitch, int velo);
+ virtual bool sysex(int, const unsigned char*);
+ virtual bool setController(int, int, int);
+ void setController(int, int , int, bool);
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual const char* getPatchName(int, int, int) const;
+ virtual const MidiPatch* getPatchInfo(int i, const MidiPatch* patch) const;
+ virtual int getControllerInfo(int, const char**, int*, int*, int*) const;
+ virtual bool processEvent(const MidiEvent&);
+
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const;
+ virtual void showGui(bool val);
+
+ void sendError(const char*);
+ void sendSoundFontData();
+ void sendChannelData();
+ void sendFontSuccessfullyLoaded(const char* filename, byte extid);
+ void rewriteChannelSettings(); //used because fluidsynth does some very nasty things when loading a font!
+ bool popSoundfont (int ext_id);
+
+ int getNextAvailableExternalId();
+
+ fluid_synth_t* fluidsynth;
+ FluidSynthGui* gui;
+ pthread_mutex_t _sfloader_mutex;
+ int currentlyLoadedFonts; //To know whether or not to run the init-parameters
+ std::list<FluidSoundFont> stack;
+ int nrOfSoundfonts;
+
+ void initInternal();
+
+ static FluidCtrl fluidCtrl[];
+ static void* fontLoadThread(void* t);
+
+ };
+
+struct FS_Helper //Only used to pass parameters when calling the loading thread
+ {
+ FluidSynth* fptr;
+ std::string filename;
+ int id;
+ };
+
+
+#endif /* __MUSE_FLUIDSYNTI_H__ */
diff --git a/muse/synti/libsynti/CMakeLists.txt b/muse/synti/libsynti/CMakeLists.txt
new file mode 100644
index 00000000..36fcde38
--- /dev/null
+++ b/muse/synti/libsynti/CMakeLists.txt
@@ -0,0 +1,10 @@
+#
+#
+#
+#
+
+add_library(synti mess.cpp gui.cpp mono.cpp poly.cpp mpevent.cpp)
+set_target_properties( synti
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_SOURCE_DIR}/all.h"
+ )
+
diff --git a/muse/synti/libsynti/evdata.h b/muse/synti/libsynti/evdata.h
new file mode 100644
index 00000000..29f6441e
--- /dev/null
+++ b/muse/synti/libsynti/evdata.h
@@ -0,0 +1,66 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: evdata.h,v 1.1 2004/02/13 13:55:03 wschweer Exp $
+//
+// (C) Copyright 1999-2003 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __EVDATA_H__
+#define __EVDATA_H__
+
+#include <memory.h>
+
+//---------------------------------------------------------
+// EvData
+// variable len event data (sysex, meta etc.)
+//---------------------------------------------------------
+
+class EvData {
+ int* refCount;
+
+ public:
+ unsigned char* data;
+ int dataLen;
+
+ EvData() {
+ data = 0;
+ dataLen = 0;
+ refCount = new int(1);
+ }
+ EvData(const EvData& ed) {
+ data = ed.data;
+ dataLen = ed.dataLen;
+ refCount = ed.refCount;
+ (*refCount)++;
+ }
+
+ EvData& operator=(const EvData& ed) {
+ if (data == ed.data)
+ return *this;
+ if (--(*refCount) == 0) {
+ delete refCount;
+ delete[] data;
+ }
+ data = ed.data;
+ dataLen = ed.dataLen;
+ refCount = ed.refCount;
+ (*refCount)++;
+ return *this;
+ }
+
+ ~EvData() {
+ if (--(*refCount) == 0) {
+ delete[] data;
+ delete refCount;
+ }
+ }
+ void setData(const unsigned char* p, int l) {
+ data = new unsigned char[l];
+ memcpy(data, p, l);
+ dataLen = l;
+ }
+ };
+
+#endif
+
diff --git a/muse/synti/libsynti/gui.cpp b/muse/synti/libsynti/gui.cpp
new file mode 100644
index 00000000..a983bf94
--- /dev/null
+++ b/muse/synti/libsynti/gui.cpp
@@ -0,0 +1,130 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// software synthesizer helper library
+// $Id: gui.cpp,v 1.7 2005/05/11 14:18:48 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "gui.h"
+#include "muse/midi.h"
+
+#include <unistd.h>
+
+//---------------------------------------------------------
+// MessGui
+//---------------------------------------------------------
+
+MessGui::MessGui()
+ {
+ //
+ // prepare for interprocess communication:
+ //
+ int filedes[2]; // 0 - reading 1 - writing
+ if (pipe(filedes) == -1) {
+ perror("thread:creating pipe4");
+ exit(-1);
+ }
+ readFd = filedes[0];
+ writeFd = filedes[1];
+ wFifoSize = 0;
+ wFifoWindex = 0;
+ wFifoRindex = 0;
+ rFifoSize = 0;
+ rFifoWindex = 0;
+ rFifoRindex = 0;
+ }
+
+//---------------------------------------------------------
+// MessGui
+//---------------------------------------------------------
+
+MessGui::~MessGui()
+ {
+ }
+
+//---------------------------------------------------------
+// readMessage
+//---------------------------------------------------------
+
+void MessGui::readMessage()
+ {
+ char c;
+ while (rFifoSize) {
+ ::read(readFd, &c, 1);
+ processEvent(rFifo[rFifoRindex]);
+ rFifoRindex = (rFifoRindex + 1) % EVENT_FIFO_SIZE;
+ --rFifoSize;
+ }
+ }
+
+//---------------------------------------------------------
+// sendEvent
+//---------------------------------------------------------
+
+void MessGui::sendEvent(const MidiEvent& ev)
+ {
+ if (wFifoSize == EVENT_FIFO_SIZE) {
+ printf("event gui->synti fifo overflow\n");
+ return;
+ }
+ wFifo[wFifoWindex] = ev;
+ wFifoWindex = (wFifoWindex + 1) % EVENT_FIFO_SIZE;
+ ++wFifoSize;
+ }
+
+//---------------------------------------------------------
+// sendController
+//---------------------------------------------------------
+
+void MessGui::sendController(int ch, int idx, int val)
+ {
+// MidiEvent pe(0, ch, ME_CONTROLLER, idx, val);
+// sendEvent(pe);
+
+ sendEvent(MidiEvent(0, ch, ME_CONTROLLER, idx, val));
+ }
+
+//---------------------------------------------------------
+// sendSysex
+//---------------------------------------------------------
+
+void MessGui::sendSysex(unsigned char* p, int n)
+ {
+// MidiEvent pe(0, 0, ME_SYSEX, p, n);
+// sendEvent(pe);
+
+ sendEvent(MidiEvent(0, ME_SYSEX, p, n));
+ }
+
+//---------------------------------------------------------
+// writeEvent
+// send an event to synti gui
+//---------------------------------------------------------
+
+void MessGui::writeEvent(const MidiEvent& ev)
+ {
+ if (rFifoSize == EVENT_FIFO_SIZE) {
+ printf("event synti->gui fifo overflow\n");
+ return;
+ }
+ rFifo[rFifoWindex] = ev;
+ rFifoWindex = (rFifoWindex + 1) % EVENT_FIFO_SIZE;
+ ++rFifoSize;
+ write(writeFd, "x", 1); // wakeup GUI
+ }
+
+//---------------------------------------------------------
+// readEvent
+// read event from synti gui
+//---------------------------------------------------------
+
+MidiEvent MessGui::readEvent()
+ {
+ MidiEvent ev = wFifo[wFifoRindex];
+ wFifoRindex = (wFifoRindex + 1) % EVENT_FIFO_SIZE;
+ --wFifoSize;
+ return ev;
+ }
+
diff --git a/muse/synti/libsynti/gui.h b/muse/synti/libsynti/gui.h
new file mode 100644
index 00000000..1aa375c7
--- /dev/null
+++ b/muse/synti/libsynti/gui.h
@@ -0,0 +1,72 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// software synthesizer helper library
+// $Id: gui.h,v 1.5 2005/05/11 14:18:48 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __SYNTH_GUI_H__
+#define __SYNTH_GUI_H__
+
+#include "mpevent.h"
+
+const int EVENT_FIFO_SIZE = 256;
+class QWidget;
+
+//---------------------------------------------------------
+// MessGui
+// manage IO from synti-GUI to Host
+//---------------------------------------------------------
+
+class MessGui {
+ int writeFd;
+
+ // Event Fifo synti -> GUI
+ MidiEvent rFifo[EVENT_FIFO_SIZE];
+ volatile int rFifoSize;
+ int rFifoWindex;
+ int rFifoRindex;
+
+ // Event Fifo GUI -> synti
+ MidiEvent wFifo[EVENT_FIFO_SIZE];
+ volatile int wFifoSize;
+ int wFifoWindex;
+ int wFifoRindex;
+
+ protected:
+ int readFd;
+ void readMessage();
+ void sendEvent(const MidiEvent& ev);
+ void sendController(int,int,int);
+ void sendSysex(unsigned char*, int);
+
+ virtual void processEvent(const MidiEvent&) {};
+
+ public:
+ MessGui();
+ virtual ~MessGui();
+
+ void writeEvent(const MidiEvent&);
+ int fifoSize() const { return wFifoSize; }
+ MidiEvent readEvent();
+ };
+
+//---------------------------------------------------------
+// SynthGuiCtrl
+//---------------------------------------------------------
+
+struct SynthGuiCtrl {
+ enum EditorType { SLIDER, SWITCH, COMBOBOX };
+ QWidget* editor;
+ QWidget* label;
+ EditorType type;
+
+ SynthGuiCtrl() {}
+ SynthGuiCtrl(QWidget* w, QWidget* l, const EditorType t)
+ : editor(w), label(l), type(t) {}
+ };
+
+#endif
+
diff --git a/muse/synti/libsynti/mess.cpp b/muse/synti/libsynti/mess.cpp
new file mode 100644
index 00000000..7ebcec65
--- /dev/null
+++ b/muse/synti/libsynti/mess.cpp
@@ -0,0 +1,122 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mess.cpp,v 1.3 2005/05/11 14:18:48 wschweer Exp $
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "mess.h"
+#include "muse/midi.h"
+
+static const int FIFO_SIZE = 32;
+
+//---------------------------------------------------------
+// MessP
+//---------------------------------------------------------
+
+struct MessP {
+ // Event Fifo synti -> Host:
+ MidiEvent fifo[FIFO_SIZE];
+ volatile int fifoSize;
+ int fifoWindex;
+ int fifoRindex;
+ };
+
+//---------------------------------------------------------
+// Mess
+//---------------------------------------------------------
+
+Mess::Mess(int n)
+ {
+ _channels = n;
+ _sampleRate = 44100;
+ d = new MessP;
+ d->fifoSize = 0;
+ d->fifoWindex = 0;
+ d->fifoRindex = 0;
+ }
+
+//---------------------------------------------------------
+// Mess
+//---------------------------------------------------------
+
+Mess::~Mess()
+ {
+ delete d;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+// dummy
+//---------------------------------------------------------
+
+void Mess::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ x = 0;
+ y = 0;
+ w = 0;
+ h = 0;
+ }
+
+//---------------------------------------------------------
+// sendEvent
+// send Event synti -> host
+//---------------------------------------------------------
+
+void Mess::sendEvent(MidiEvent ev)
+ {
+ if (d->fifoSize == FIFO_SIZE) {
+ printf("event synti->host fifo overflow\n");
+ return;
+ }
+ d->fifo[d->fifoWindex] = ev;
+ d->fifoWindex = (d->fifoWindex + 1) % FIFO_SIZE;
+ ++(d->fifoSize);
+ }
+
+//---------------------------------------------------------
+// receiveEvent
+// called from host
+//---------------------------------------------------------
+
+MidiEvent Mess::receiveEvent()
+ {
+ MidiEvent ev = d->fifo[d->fifoRindex];
+ d->fifoRindex = (d->fifoRindex + 1) % FIFO_SIZE;
+ --(d->fifoSize);
+ return ev;
+ }
+
+//---------------------------------------------------------
+// eventsPending
+// called from host:
+// while (eventsPending()) {
+// receiveEvent();
+// ...
+//---------------------------------------------------------
+
+int Mess::eventsPending() const
+ {
+ return d->fifoSize;
+ }
+
+//---------------------------------------------------------
+// processEvent
+// return true if synti is busy
+//---------------------------------------------------------
+
+bool Mess::processEvent(const MidiEvent& ev)
+ {
+ switch(ev.type()) {
+ case ME_NOTEON:
+ return playNote(ev.channel(), ev.dataA(), ev.dataB());
+ case ME_NOTEOFF:
+ return playNote(ev.channel(), ev.dataA(), 0);
+ case ME_SYSEX:
+ return sysex(ev.len(), ev.data());
+ case ME_CONTROLLER:
+ return setController(ev.channel(), ev.dataA(), ev.dataB());
+ }
+ return false;
+ }
+
diff --git a/muse/synti/libsynti/mess.h b/muse/synti/libsynti/mess.h
new file mode 100644
index 00000000..8187a3f3
--- /dev/null
+++ b/muse/synti/libsynti/mess.h
@@ -0,0 +1,97 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mess.h,v 1.6 2005/05/11 14:18:48 wschweer Exp $
+// (C) Copyright 2001-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MESS_H__
+#define __MESS_H__
+
+#define MESS_MAJOR_VERSION 2
+#define MESS_MINOR_VERSION 1
+
+#include "mpevent.h"
+
+class QWidget;
+class MessP;
+
+//---------------------------------------------------------
+// MidiPatch
+//---------------------------------------------------------
+
+struct MidiPatch {
+ signed char typ; // 1 - GM 2 - GS 4 - XG
+ signed char hbank, lbank, prog;
+ const char* name;
+ };
+
+//---------------------------------------------------------
+// Mess
+// MusE experimental software synth
+// Instance virtual interface class
+//---------------------------------------------------------
+
+class Mess {
+ MessP* d;
+
+ int _sampleRate;
+ int _channels; // 1 - mono, 2 - stereo
+
+ public:
+ Mess(int channels);
+ virtual ~Mess();
+
+ int channels() const { return _channels; }
+ int sampleRate() const { return _sampleRate; }
+ void setSampleRate(int r) { _sampleRate = r; }
+
+ virtual void process(float** data, int offset, int len) = 0;
+
+ // the synti has to (re-)implement processEvent() or provide
+ // some of the next three functions:
+
+ virtual bool processEvent(const MidiEvent&);
+ virtual bool setController(int, int, int) { return false; }
+ virtual bool playNote(int, int, int) { return false; }
+ virtual bool sysex(int, const unsigned char*) { return false; }
+
+ virtual void getInitData(int*, const unsigned char**) const {}
+ virtual int getControllerInfo(int, const char**, int*, int*, int*) const {return 0;}
+ virtual const char* getPatchName(int, int, int) const { return "?"; }
+ virtual const MidiPatch* getPatchInfo(int, const MidiPatch*) const { return 0; }
+
+ // synthesizer -> host communication
+ void sendEvent(MidiEvent); // called from synti
+ MidiEvent receiveEvent(); // called from host
+ int eventsPending() const;
+
+ // GUI interface routines
+ virtual bool hasGui() const { return false; }
+ virtual bool guiVisible() const { return false; }
+ virtual void showGui(bool) {}
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int) {}
+ };
+
+//---------------------------------------------------------
+// MESS
+// Class descriptor
+//---------------------------------------------------------
+
+struct MESS {
+ const char* name;
+ const char* description;
+ const char* version;
+ int majorMessVersion, minorMessVersion;
+ // QWidget* parent allows for a threaded GUI using the Qt Library
+ // can be ignored by synti
+ Mess* (*instantiate)(int sr, QWidget* parent, const char* name);
+ };
+
+extern "C" {
+ const MESS* mess_descriptor();
+ }
+
+#endif
+
diff --git a/muse/synti/libsynti/mono.cpp b/muse/synti/libsynti/mono.cpp
new file mode 100644
index 00000000..14a23aca
--- /dev/null
+++ b/muse/synti/libsynti/mono.cpp
@@ -0,0 +1,47 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// software synthesizer helper library
+// $Id: mono.cpp,v 1.2 2004/04/15 13:46:18 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "mono.h"
+
+//---------------------------------------------------------
+// playNote
+//---------------------------------------------------------
+
+bool MessMono::playNote(int channel, int pitch, int velo)
+ {
+ if (velo == 0) {
+ if (pitchStack.empty())
+ return false;
+ if (pitchStack.back().pitch == pitch) {
+ pitchStack.pop_back();
+ if (pitchStack.empty()) {
+ note(channel, pitch, 0);
+ return false;
+ }
+ PitchVelo pv = pitchStack.back();
+ note(pv.channel, pv.pitch, pv.velo); // change pitch
+ return false;
+ }
+ for (std::list<PitchVelo>::iterator i = pitchStack.begin();
+ i != pitchStack.end(); ++i) {
+ if ((*i).pitch == pitch) {
+ pitchStack.erase(i);
+ return false;
+ }
+ }
+ // no noteon found
+ // emergency stop:
+ note(channel, pitch, velo);
+ return false;
+ }
+ pitchStack.push_back(PitchVelo(channel, pitch, velo));
+ note(channel, pitch, velo);
+ return false;
+ }
+
diff --git a/muse/synti/libsynti/mono.h b/muse/synti/libsynti/mono.h
new file mode 100644
index 00000000..f2f8bdf7
--- /dev/null
+++ b/muse/synti/libsynti/mono.h
@@ -0,0 +1,47 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// software synthesizer helper library
+// $Id: mono.h,v 1.4 2004/04/15 13:46:18 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __SYNTH_MONO_H__
+#define __SYNTH_MONO_H
+
+#include <list>
+#include "mess.h"
+
+//---------------------------------------------------------
+// PitchVelo
+//---------------------------------------------------------
+
+struct PitchVelo {
+ signed char channel;
+ signed char pitch;
+ signed char velo;
+ PitchVelo(signed char a, signed char b, signed char c)
+ : channel(a), pitch(b), velo(c) {}
+ };
+
+//---------------------------------------------------------
+// MessMono
+// implements some functions for monophone
+// synthesizer
+//---------------------------------------------------------
+
+class MessMono : public Mess {
+ std::list<PitchVelo> pitchStack;
+
+ protected:
+ virtual bool playNote(int channel, int pitch, int velo);
+ virtual void note(int channel, int pitch, int velo) = 0;
+
+ public:
+ MessMono() : Mess(1) {}
+ virtual ~MessMono() {}
+ };
+
+#endif
+
diff --git a/muse/synti/libsynti/mpevent.cpp b/muse/synti/libsynti/mpevent.cpp
new file mode 100644
index 00000000..c1d44c91
--- /dev/null
+++ b/muse/synti/libsynti/mpevent.cpp
@@ -0,0 +1,21 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mpevent.cpp,v 1.3 2005/05/11 14:18:48 wschweer Exp $
+//
+// (C) Copyright 2002-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "mpevent.h"
+
+//---------------------------------------------------------
+// MidiEvent
+//---------------------------------------------------------
+
+MidiEvent::MidiEvent(unsigned t, int tpe, const unsigned char* data, int len)
+ {
+ _time = t;
+ edata.setData(data, len);
+ _type = tpe;
+ }
+
diff --git a/muse/synti/libsynti/mpevent.h b/muse/synti/libsynti/mpevent.h
new file mode 100644
index 00000000..67af3a88
--- /dev/null
+++ b/muse/synti/libsynti/mpevent.h
@@ -0,0 +1,55 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mpevent.h,v 1.3 2005/05/11 14:18:48 wschweer Exp $
+//
+// (C) Copyright 1999-2002 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MPEVENT_H__
+#define __MPEVENT_H__
+
+#include "evdata.h"
+
+//---------------------------------------------------------
+// MidiEvent
+//---------------------------------------------------------
+
+class MidiEvent {
+ unsigned _time;
+ EvData edata;
+ unsigned char _channel, _type;
+ int _a, _b;
+
+ public:
+ MidiEvent() {}
+ MidiEvent(unsigned tm, int c, int t, int a, int b)
+ : _time(tm), _channel(c & 0xf), _type(t), _a(a), _b(b) {}
+ MidiEvent(unsigned t, int type, const unsigned char* data, int len);
+ MidiEvent(unsigned t, int tpe, EvData d) : _time(t), edata(d), _type(tpe) {}
+
+ ~MidiEvent() {}
+
+ int channel() const { return _channel; }
+ int type() const { return _type; }
+ int dataA() const { return _a; }
+ int dataB() const { return _b; }
+ unsigned time() const { return _time; }
+
+ void setChannel(int val) { _channel = val; }
+ void setType(int val) { _type = val; }
+ void setA(int val) { _a = val; }
+ void setB(int val) { _b = val; }
+ void setTime(unsigned val) { _time = val; }
+
+ const EvData& eventData() const { return edata; }
+ unsigned char* data() const { return edata.data; }
+ int len() const { return edata.dataLen; }
+ void setData(const EvData& e) { edata = e; }
+ void setData(const unsigned char* p, int len) { edata.setData(p, len); }
+ bool isNote() const { return _type == 0x90; }
+ bool isNoteOff() const { return (_type == 0x80)||(_type == 0x90 && _b == 0); }
+ };
+
+#endif
+
diff --git a/muse/synti/libsynti/poly.cpp b/muse/synti/libsynti/poly.cpp
new file mode 100644
index 00000000..e76fe966
--- /dev/null
+++ b/muse/synti/libsynti/poly.cpp
@@ -0,0 +1,35 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// software synthesizer helper library
+// $Id: poly.cpp,v 1.3 2004/06/01 14:25:50 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "poly.h"
+#include "muse/midictrl.h"
+
+//---------------------------------------------------------
+// playNote
+//---------------------------------------------------------
+
+bool MessPoly::playNote(int /*channel*/, int /*pitch*/, int /*velo*/)
+ {
+ return false;
+ }
+
+//---------------------------------------------------------
+// setController
+//---------------------------------------------------------
+
+bool MessPoly::setController(int /*channel*/, int num, int /*val*/)
+ {
+ switch(num) {
+ case CTRL_VOLUME:
+ case CTRL_EXPRESSION:
+ break;
+ }
+ return false;
+ }
+
diff --git a/muse/synti/libsynti/poly.h b/muse/synti/libsynti/poly.h
new file mode 100644
index 00000000..b990b198
--- /dev/null
+++ b/muse/synti/libsynti/poly.h
@@ -0,0 +1,39 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// software synthesizer helper library
+// $Id: poly.h,v 1.2 2004/04/15 13:46:18 wschweer Exp $
+//
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __SYNTH_POLY_H__
+#define __SYNTH_POLY_H
+
+#include <list>
+#include "mess.h"
+
+//---------------------------------------------------------
+// MessPoly
+// implements some functions for monophone
+// synthesizer
+//---------------------------------------------------------
+
+class MessPoly : public Mess {
+ float volume;
+ float expression;
+
+ // cached values:
+ float mainLevel;
+
+ protected:
+ virtual bool playNote(int channel, int pitch, int velo);
+ virtual bool setController(int, int, int);
+
+ public:
+ MessPoly() : Mess(1) {}
+ virtual ~MessPoly() {}
+ };
+
+#endif
+
diff --git a/muse/synti/organ/CMakeLists.txt b/muse/synti/organ/CMakeLists.txt
new file mode 100644
index 00000000..88ec29a6
--- /dev/null
+++ b/muse/synti/organ/CMakeLists.txt
@@ -0,0 +1,42 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+QT4_WRAP_CPP ( organ_mocs organgui.h )
+QT4_WRAP_UI ( organ_uis organgui.ui )
+
+add_library ( organ SHARED
+ organ.cpp
+ organgui.cpp
+ organgui.h
+ ${organ_mocs}
+ ${organ_uis}
+ )
+
+# - tell cmake to name target organ.so instead of
+# liborgan.so
+# - use precompiled header files
+#
+set_target_properties ( organ
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /lib/muse-1.0pre1/synthi/ organ )
+
diff --git a/muse/synti/organ/organ.cpp b/muse/synti/organ/organ.cpp
new file mode 100644
index 00000000..dc8e9fe4
--- /dev/null
+++ b/muse/synti/organ/organ.cpp
@@ -0,0 +1,648 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: organ.cpp,v 1.23 2005/12/16 15:36:51 wschweer Exp $
+//
+// Parts of this file taken from:
+// Organ - Additive Organ Synthesizer Voice
+// Copyright (c) 1999, 2000 David A. Bartold
+//
+// (C) Copyright 2001-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "muse/midi.h"
+#include "libsynti/mpevent.h"
+
+#include "organ.h"
+#include "organgui.h"
+
+SynthCtrl Organ::synthCtrl[] = {
+ { "harm0", HARM0, 0 },
+ { "harm1", HARM1, 0 },
+ { "harm2", HARM2, 0 },
+ { "harm3", HARM3, 0 },
+ { "harm4", HARM4, 0 },
+ { "harm5", HARM5, 0 },
+ { "attackLo", ATTACK_LO, 20 },
+ { "decayLo", DECAY_LO, 20 },
+ { "sustainLo", SUSTAIN_LO, 0 },
+ { "releaseLo", RELEASE_LO, 20 },
+ { "attackHi", ATTACK_HI, 10 },
+ { "decayHi", DECAY_HI, 10 },
+ { "sustainHi", SUSTAIN_HI, 0 },
+ { "releaseHi", RELEASE_HI, 10 },
+ { "brass", BRASS, 1 },
+ { "flute", FLUTE, 1 },
+ { "reed", REED, 1 },
+ { "velocity", VELO, 0 },
+ // next controller not send as init data
+ { "volume", CTRL_VOLUME, 100 },
+ };
+
+static int NUM_CONTROLLER = sizeof(Organ::synthCtrl)/sizeof(*(Organ::synthCtrl));
+static int NUM_INIT_CONTROLLER = NUM_CONTROLLER - 1;
+
+float* Organ::sine_table;
+float* Organ::g_triangle_table;
+float* Organ::g_pulse_table;
+int Organ::useCount = 0;
+double Organ::cb2amp_tab[MAX_ATTENUATION];
+unsigned Organ::freq256[128];
+
+//---------------------------------------------------------
+// cb2amp
+// convert centibel to amplification (0 - 96dB)
+//---------------------------------------------------------
+
+double Organ::cb2amp(int cb)
+ {
+ if (cb < 0)
+ return 1.0;
+ if (cb >= MAX_ATTENUATION)
+ return 0.0;
+ return cb2amp_tab[cb];
+ }
+
+//---------------------------------------------------------
+// Organ
+//---------------------------------------------------------
+
+Organ::Organ(int sr)
+ : Mess(1)
+ {
+ idata = new int[NUM_CONTROLLER];
+ setSampleRate(sr);
+ gui = 0;
+
+ ++useCount;
+ if (useCount > 1)
+ return;
+
+ // centibels to amplitude conversion
+ for (int i = 0; i < MAX_ATTENUATION; i++)
+ cb2amp_tab[i] = pow(10.0, double(i) / -200.0);
+
+ for (int i = 0; i < 128; ++i) {
+ double freq = 8.176 * exp(double(i)*log(2.0)/12.0);
+ freq256[i] = (int) (freq * ((double) RESOLUTION) / sr * 256.0);
+ }
+ int size = RESOLUTION;
+ int half = size / 2;
+ int slope = size / 10;
+ int i;
+
+ // Initialize sine table.
+ sine_table = new float[size];
+ for (i = 0; i < size; i++)
+ sine_table[i] = sin ((i * 2.0 * M_PI) / size) / 6.0;
+
+ // Initialize triangle table.
+ g_triangle_table = new float[size];
+ for (i = 0; i < half; i++)
+ g_triangle_table[i] = (4.0 / size * i - 1.0) / 6.0;
+ for (; i < size; i++)
+ g_triangle_table[i] = (4.0 / size * (size - i) - 1.0) / 6.0;
+
+ // Initialize pulse table.
+ g_pulse_table = new float[size];
+ for (i = 0; i < slope; i++)
+ g_pulse_table[i] = (((double) -i) / slope) / 6.0;
+ for (; i < half - slope; i++)
+ g_pulse_table[i] = -1.0 / 6.0;
+ for (; i < half + slope; i++)
+ g_pulse_table[i] = (((double) i - half) / slope) / 6.0;
+ for (; i < size - slope; i++)
+ g_pulse_table[i] = 1.0 / 6.0;
+ for (; i < size; i++)
+ g_pulse_table[i] = (((double) size - i) / slope) / 6.0;
+ }
+
+//---------------------------------------------------------
+// ~Organ
+//---------------------------------------------------------
+
+Organ::~Organ()
+ {
+ if (gui)
+ delete gui;
+ delete[] idata;
+ --useCount;
+ if (useCount == 0) {
+ delete[] g_pulse_table;
+ delete[] g_triangle_table;
+ delete[] sine_table;
+ }
+ }
+
+//---------------------------------------------------------
+// table_pos
+//---------------------------------------------------------
+
+static inline float table_pos (float* table, unsigned long freq_256, unsigned *accum)
+ {
+ *accum += freq_256;
+ while (*accum >= RESOLUTION * 256)
+ *accum -= RESOLUTION * 256;
+ return table[*accum >> 8];
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool Organ::init(const char* name)
+ {
+ gui = new OrganGui;
+ gui->setWindowTitle(QString(name));
+ gui->show();
+
+ for (int i = 0; i < NUM_CONTROLLER; ++i)
+ setController(0, synthCtrl[i].num, synthCtrl[i].val);
+
+ for (int i = 0; i < VOICES; ++i)
+ voices[i].isOn = false;
+ return false;
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void Organ::process(float** ports, int offset, int sampleCount)
+ {
+ //
+ // get and process all pending events from the
+ // synthesizer GUI
+ //
+ while (gui->fifoSize()) {
+ MidiEvent ev = gui->readEvent();
+ if (ev.type() == ME_CONTROLLER) {
+ // process local?
+ setController(ev.dataA(), ev.dataB());
+ sendEvent(ev);
+ }
+ else
+ printf("Organ::process(): unknown event\n");
+ }
+
+ float* buffer = *ports + offset;
+ for (int i = 0; i < VOICES; ++i) {
+ Voice* v = &voices[i];
+ if (!v->isOn)
+ continue;
+ double vol = velo ? v->velocity : 1.0;
+ vol *= volume;
+
+ unsigned freq_256 = freq256[v->pitch];
+ unsigned* harm0_accum = &(v->harm0_accum);
+ unsigned* harm1_accum = &(v->harm1_accum);
+ unsigned* harm2_accum = &(v->harm2_accum);
+ unsigned* harm3_accum = &(v->harm3_accum);
+ unsigned* harm4_accum = &(v->harm4_accum);
+ unsigned* harm5_accum = &(v->harm5_accum);
+
+ unsigned long freq_256_harm2, freq_256_harm3;
+ unsigned long freq_256_harm4, freq_256_harm5;
+
+ float* reed_table = reed ? g_pulse_table : sine_table;
+ float* flute_table = flute ? g_triangle_table : sine_table;
+
+ unsigned freq_256_harm0 = freq_256 / 2;
+ unsigned freq_256_harm1 = freq_256;
+
+ if (brass) {
+ freq_256_harm2 = freq_256 * 2;
+ freq_256_harm3 = freq_256_harm2 * 2;
+ freq_256_harm4 = freq_256_harm3 * 2;
+ freq_256_harm5 = freq_256_harm4 * 2;
+ for (int i = 0; i < sampleCount; i++) {
+ int a1, a2;
+ switch(v->state1) {
+ case ATTACK:
+ if (v->envL1.step(&a1))
+ break;
+ v->state1 = DECAY;
+ case DECAY:
+ if (v->envL2.step(&a1))
+ break;
+ v->state1 = SUSTAIN;
+ case SUSTAIN:
+ a1 = sustain0;
+ break;
+ case RELEASE:
+ if (v->envL3.step(&a1))
+ break;
+ v->state1 = OFF;
+ a1 = MAX_ATTENUATION;
+ break;
+ }
+ switch(v->state2) {
+ case ATTACK:
+ if (v->envH1.step(&a2))
+ break;
+ v->state2 = DECAY;
+ case DECAY:
+ if (v->envH2.step(&a2))
+ break;
+ v->state2 = SUSTAIN;
+ case SUSTAIN:
+ a2 = sustain1;
+ break;
+ case RELEASE:
+ if (v->envH3.step(&a2))
+ break;
+ v->state2 = OFF;
+ a1 = MAX_ATTENUATION;
+ break;
+ }
+ if (v->state1 == OFF && v->state2 == OFF) {
+ v->isOn = false;
+ break;
+ }
+ buffer[i] +=
+ (table_pos (sine_table, freq_256_harm0, harm0_accum) * harm0
+ + table_pos (sine_table, freq_256_harm1, harm1_accum) * harm1
+ + table_pos (reed_table, freq_256_harm2, harm2_accum) * harm2)
+ * cb2amp(a1) * vol
+ + (table_pos (sine_table, freq_256_harm3, harm3_accum) * harm3
+ + table_pos (flute_table, freq_256_harm4, harm4_accum) * harm4
+ + table_pos (flute_table, freq_256_harm5, harm5_accum) * harm5)
+ * cb2amp(a2) * vol;
+ }
+ }
+ else {
+ freq_256_harm2 = freq_256 * 3 / 2;
+ freq_256_harm3 = freq_256 * 2;
+ freq_256_harm4 = freq_256 * 3;
+ freq_256_harm5 = freq_256_harm3 * 2;
+ for (int i = 0; i < sampleCount; i++) {
+ int a1, a2;
+ switch(v->state1) {
+ case ATTACK:
+ if (v->envL1.step(&a1))
+ break;
+ v->state1 = DECAY;
+ case DECAY:
+ if (v->envL2.step(&a1))
+ break;
+ v->state1 = SUSTAIN;
+ case SUSTAIN:
+ a1 = sustain0;
+ break;
+ case RELEASE:
+ if (v->envL3.step(&a1))
+ break;
+ v->state1 = OFF;
+ a1 = MAX_ATTENUATION;
+ break;
+ }
+ switch(v->state2) {
+ case ATTACK:
+ if (v->envH1.step(&a2))
+ break;
+ v->state2 = DECAY;
+ case DECAY:
+ if (v->envH2.step(&a2))
+ break;
+ v->state2 = SUSTAIN;
+ case SUSTAIN:
+ a2 = sustain1;
+ break;
+ case RELEASE:
+ if (v->envH3.step(&a2))
+ break;
+ v->state2 = OFF;
+ a1 = MAX_ATTENUATION;
+ break;
+ }
+ if (v->state1 == OFF && v->state2 == OFF) {
+ v->isOn = false;
+ break;
+ }
+ buffer[i] +=
+ (table_pos (sine_table, freq_256_harm0, harm0_accum) * harm0
+ + table_pos (sine_table, freq_256_harm1, harm1_accum) * harm1
+ + table_pos (sine_table, freq_256_harm2, harm2_accum) * harm2)
+ * cb2amp(a1) * vol
+ + (table_pos (reed_table, freq_256_harm3, harm3_accum) * harm3
+ + table_pos (sine_table, freq_256_harm4, harm4_accum) * harm4
+ + table_pos (flute_table, freq_256_harm5, harm5_accum) * harm5)
+ * cb2amp(a2) * vol;
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// playNote
+//---------------------------------------------------------
+
+bool Organ::playNote(int channel, int pitch, int velo)
+ {
+ if (velo == 0) {
+ noteoff(channel, pitch);
+ return false;
+ }
+ for (int i = 0; i < VOICES; ++i) {
+ if (voices[i].isOn)
+ continue;
+ voices[i].isOn = true;
+ voices[i].pitch = pitch;
+ voices[i].channel = channel;
+ // velo is never 0
+ voices[i].velocity = cb2amp(int(200 * log10((127.0 * 127)/(velo*velo))));
+ voices[i].state1 = ATTACK;
+ voices[i].state2 = ATTACK;
+ voices[i].envL1.set(attack0, MAX_ATTENUATION, 0);
+ voices[i].envL2.set(decay0, MAX_ATTENUATION, sustain0);
+ voices[i].envL3.set(release0, sustain0, MAX_ATTENUATION);
+
+ voices[i].envH1.set(attack1, MAX_ATTENUATION, 0);
+ voices[i].envH2.set(decay1, MAX_ATTENUATION, sustain1);
+ voices[i].envH3.set(release1, sustain1, MAX_ATTENUATION);
+
+ voices[i].harm0_accum = 0;
+ voices[i].harm1_accum = 0;
+ voices[i].harm2_accum = 0;
+ voices[i].harm3_accum = 0;
+ voices[i].harm4_accum = 0;
+ voices[i].harm5_accum = 0;
+ return false;
+ }
+ printf("organ: voices overflow!\n");
+ return false;
+ }
+
+//---------------------------------------------------------
+// noteoff
+//---------------------------------------------------------
+
+void Organ::noteoff(int channel, int pitch)
+ {
+ bool found = false;
+ for (int i = 0; i < VOICES; ++i) {
+ if (voices[i].isOn && (voices[i].pitch == pitch)
+ && (voices[i].channel == channel)) {
+ found = true;
+ voices[i].state1 = RELEASE;
+ voices[i].state2 = RELEASE;
+ }
+ }
+ if (!found) {
+ printf("Organ: noteoff %d:%d not found\n", channel, pitch);
+ for (int i = 0; i < VOICES; ++i) {
+ if (voices[i].isOn)
+ printf(" %d\n", voices[i].pitch);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// setController
+//---------------------------------------------------------
+
+void Organ::setController(int ctrl, int data)
+ {
+ int sr = sampleRate();
+ switch (ctrl) {
+ case HARM0:
+ harm0 = cb2amp(-data);
+ break;
+ case HARM1:
+ harm1 = cb2amp(-data);
+ break;
+ case HARM2:
+ harm2 = cb2amp(-data);
+ break;
+ case HARM3:
+ harm3 = cb2amp(-data);
+ break;
+ case HARM4:
+ harm4 = cb2amp(-data);
+ break;
+ case HARM5:
+ harm5 = cb2amp(-data);
+ break;
+ case ATTACK_LO: // maxval -> 500msec
+ attack0 = (data * sr) / 1000;
+ break;
+ case DECAY_LO: // maxval -> 5000msec
+ decay0 = (data * sr) / 1000;
+ break;
+ case SUSTAIN_LO:
+ sustain0 = -data;
+ break;
+ case RELEASE_LO:
+ release0 = (data * sr) / 1000;
+ break;
+ case ATTACK_HI:
+ attack1 = (data * sr) / 1000;
+ break;
+ case DECAY_HI:
+ decay1 = (data * sr) / 1000;
+ break;
+ case SUSTAIN_HI:
+ sustain1 = -data;
+ break;
+ case RELEASE_HI:
+ release1 = (data * sr) / 1000;
+ break;
+ case BRASS:
+ brass = data;
+ break;
+ case FLUTE:
+ flute = data;
+ break;
+ case REED:
+ reed = data;
+ break;
+ case VELO:
+ velo = data;
+ break;
+ case CTRL_VOLUME:
+ data &= 0x7f;
+ volume = data == 0 ? 0.0 : cb2amp(int(200 * log10((127.0 * 127)/(data*data))));
+ break;
+ case CTRL_ALL_SOUNDS_OFF:
+ for (int i = 0; i < VOICES; ++i)
+ voices[i].isOn = false;
+ break;
+ case CTRL_RESET_ALL_CTRL:
+ for (int i = 0; i < NUM_CONTROLLER; ++i)
+ setController(0, synthCtrl[i].num, synthCtrl[i].val);
+ break;
+ default:
+// fprintf(stderr, "Organ:set unknown Ctrl 0x%x to 0x%x\n", ctrl, data);
+ return;
+ }
+ for (int i = 0; i < NUM_CONTROLLER; ++i) {
+ if (synthCtrl[i].num == ctrl) {
+ synthCtrl[i].val = data;
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// setController
+//---------------------------------------------------------
+
+bool Organ::setController(int channel, int ctrl, int data)
+ {
+ setController(ctrl, data);
+
+ switch (ctrl) {
+ case HARM0:
+ case HARM1:
+ case HARM2:
+ case HARM3:
+ case HARM4:
+ case HARM5:
+ case ATTACK_LO:
+ case DECAY_LO:
+ case SUSTAIN_LO:
+ case RELEASE_LO:
+ case ATTACK_HI:
+ case DECAY_HI:
+ case SUSTAIN_HI:
+ case RELEASE_HI:
+ case BRASS:
+ case FLUTE:
+ case REED:
+ case VELO:
+ {
+ MidiEvent ev(0, channel, ME_CONTROLLER, ctrl, data);
+ gui->writeEvent(ev);
+ }
+ break;
+ default:
+ break;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// sysex
+//---------------------------------------------------------
+
+bool Organ::sysex(int n, const unsigned char* data)
+ {
+ if (unsigned(n) != (NUM_INIT_CONTROLLER * sizeof(int))) {
+ printf("Organ: unknown sysex\n");
+ return false;
+ }
+ int* s = (int*) data;
+ for (int i = 0; i < NUM_INIT_CONTROLLER; ++i) {
+ int val = *s++;
+ setController(0, synthCtrl[i].num, val);
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// getInitData
+//---------------------------------------------------------
+
+void Organ::getInitData(int* n, const unsigned char**p)
+ {
+ int* d = idata;
+ for (int i = 0; i < NUM_INIT_CONTROLLER; ++i)
+ *d++ = synthCtrl[i].val;
+ *n = NUM_INIT_CONTROLLER * sizeof(int); // sizeof(idata);
+ *p = (unsigned char*)idata;
+ }
+
+//---------------------------------------------------------
+// MESS
+//---------------------------------------------------------
+
+//---------------------------------------------------------
+// getControllerInfo
+//---------------------------------------------------------
+
+int Organ::getControllerInfo(int id, const char** name, int* controller,
+ int* min, int* max) const
+ {
+ if (id >= NUM_CONTROLLER)
+ return 0;
+ *controller = synthCtrl[id].num;
+ *name = synthCtrl[id].name;
+ *min = 0;
+ *max = 128*128-1;
+ return ++id;
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool Organ::guiVisible() const
+ {
+ return gui->isVisible();
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void Organ::showGui(bool val)
+ {
+ gui->setShown(val);
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void Organ::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void Organ::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// instantiate
+// construct a new synthesizer instance
+//---------------------------------------------------------
+
+static Mess* instantiate(int sr, QWidget*, const char* name)
+ {
+ Organ* synth = new Organ(sr);
+ if (synth->init(name)) {
+ delete synth;
+ synth = 0;
+ }
+ return synth;
+ }
+
+//---------------------------------------------------------
+// msynth_descriptor
+// Return a descriptor of the requested plugin type.
+//---------------------------------------------------------
+
+extern "C" {
+ static MESS descriptor = {
+ "Organ",
+ "Organ; based on David A. Bartold's LADSPA plugin",
+ "0.1", // version string
+ MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
+ instantiate,
+ };
+
+ const MESS* mess_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse/synti/organ/organ.h b/muse/synti/organ/organ.h
new file mode 100644
index 00000000..5f3835e1
--- /dev/null
+++ b/muse/synti/organ/organ.h
@@ -0,0 +1,197 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: organ.h,v 1.5 2004/04/15 13:46:18 wschweer Exp $
+//
+// Parts of this file taken from:
+// Organ - Additive Organ Synthesizer Voice
+// Copyright (c) 1999, 2000 David A. Bartold
+//
+// (C) Copyright 2001-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __ORGAN_H__
+#define __ORGAN_H__
+
+#include "muse/midictrl.h"
+#include "libsynti/mess.h"
+
+#define RESOLUTION (16384*2)
+#define VOICES 128 // max polyphony
+
+class OrganGui;
+
+static const int MAX_ATTENUATION = 960;
+
+enum EnvelopeState {
+ ATTACK,
+ DECAY,
+ SUSTAIN,
+ RELEASE,
+ OFF
+ };
+
+//---------------------------------------------------------
+// Envelope
+//---------------------------------------------------------
+
+struct Envelope {
+ int ticks; // len of segment
+ int error, delta, schritt;
+ int y, yinc;
+
+ void set(int t, int y1, int y2) {
+ ticks = t;
+ y = y1;
+ int dy = y2 - y1;
+ int dx = t;
+ error = -dx;
+ schritt = 2*dx;
+ if (dy < 0) {
+ yinc = -1;
+ delta = -2 * dy;
+ }
+ else {
+ yinc = 1;
+ delta = 2 * dy;
+ }
+ }
+
+ // return false on envelope end
+ bool step(int* a) {
+ *a = y;
+ if (ticks == 0)
+ return false;
+ error += delta;
+ while (error > 0) {
+ y += yinc;
+ error -= schritt;
+ }
+ --ticks;
+ return true;
+ }
+ };
+
+static const int HARM0 = 0 + CTRL_RPN14_OFFSET;
+static const int HARM1 = 1 + CTRL_RPN14_OFFSET;
+static const int HARM2 = 2 + CTRL_RPN14_OFFSET;
+static const int HARM3 = 3 + CTRL_RPN14_OFFSET;
+static const int HARM4 = 4 + CTRL_RPN14_OFFSET;
+static const int HARM5 = 5 + CTRL_RPN14_OFFSET;
+static const int ATTACK_LO = 6 + CTRL_RPN14_OFFSET;
+static const int DECAY_LO = 7 + CTRL_RPN14_OFFSET;
+static const int SUSTAIN_LO = 8 + CTRL_RPN14_OFFSET;
+static const int RELEASE_LO = 9 + CTRL_RPN14_OFFSET;
+static const int ATTACK_HI = 10 + CTRL_RPN14_OFFSET;
+static const int DECAY_HI = 11 + CTRL_RPN14_OFFSET;
+static const int SUSTAIN_HI = 12 + CTRL_RPN14_OFFSET;
+static const int RELEASE_HI = 13 + CTRL_RPN14_OFFSET;
+static const int BRASS = 14 + CTRL_RPN14_OFFSET;
+static const int FLUTE = 15 + CTRL_RPN14_OFFSET;
+static const int REED = 16 + CTRL_RPN14_OFFSET;
+static const int VELO = 17 + CTRL_RPN14_OFFSET;
+
+//---------------------------------------------------------
+// SynthCtrl
+//---------------------------------------------------------
+
+struct SynthCtrl {
+ const char* name;
+ int num;
+ int val;
+ };
+
+//---------------------------------------------------------
+// Voice
+//---------------------------------------------------------
+
+struct Voice {
+ bool isOn;
+ int pitch;
+ int channel;
+
+ double velocity;
+
+ int state1, state2;
+ Envelope envL1, envL2, envL3;
+ Envelope envH1, envH2, envH3;
+
+ unsigned harm0_accum;
+ unsigned harm1_accum;
+ unsigned harm2_accum;
+ unsigned harm3_accum;
+ unsigned harm4_accum;
+ unsigned harm5_accum;
+ };
+
+//---------------------------------------------------------
+// Preset
+//---------------------------------------------------------
+
+struct Preset {
+ char* name;
+ bool brass, flute, reed;
+ int attack0, attack1;
+ int release0, release1;
+ int decay0, decay1;
+ double harm0, harm1, harm2, harm3, harm4, harm5;
+ bool velo;
+ };
+
+//---------------------------------------------------------
+// Organ
+//---------------------------------------------------------
+
+class Organ : public Mess {
+ static int useCount;
+
+ static double cb2amp_tab[MAX_ATTENUATION];
+ static unsigned freq256[128];
+ static double cb2amp(int cb);
+
+ int* idata; // buffer for init data
+
+ bool brass, flute, reed;
+ int attack0, attack1;
+ int release0, release1;
+ int decay0, decay1; // ticks
+ int sustain0, sustain1; // centibel
+ bool velo;
+ double volume;
+
+ double harm0, harm1, harm2, harm3, harm4, harm5;
+
+ Voice voices[VOICES];
+
+ static float* sine_table;
+ static float* g_triangle_table;
+ static float* g_pulse_table;
+
+ void noteoff(int channel, int pitch);
+ void setController(int ctrl, int val);
+
+ virtual void process(float**, int, int);
+ virtual bool playNote(int channel, int pitch, int velo);
+ virtual bool setController(int channel, int ctrl, int val);
+ virtual bool sysex(int, const unsigned char*);
+
+ virtual int getControllerInfo(int, const char**, int*, int*, int*) const;
+ virtual void getInitData(int*, const unsigned char**);
+
+ virtual bool guiVisible() const;
+ virtual void showGui(bool);
+ virtual bool hasGui() const { return true; }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int x, int y, int w, int h);
+
+ OrganGui* gui;
+
+ public:
+ static SynthCtrl synthCtrl[];
+ Organ(int sampleRate);
+ ~Organ();
+ bool init(const char* name);
+ };
+
+#endif
+
diff --git a/muse/synti/organ/organgui.cpp b/muse/synti/organ/organgui.cpp
new file mode 100644
index 00000000..0264a073
--- /dev/null
+++ b/muse/synti/organ/organgui.cpp
@@ -0,0 +1,123 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: organgui.cpp,v 1.21 2005/12/16 15:36:51 wschweer Exp $
+//
+// This is a simple GUI implemented with QT for
+// organ software synthesizer.
+//
+// (C) Copyright 2001-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "organgui.h"
+#include "muse/midi.h"
+#include "muse/midictrl.h"
+
+//---------------------------------------------------------
+// OrganGui
+//---------------------------------------------------------
+
+OrganGui::OrganGui()
+// : QWidget(0, "organgui", Qt::WType_TopLevel),
+ : QWidget(0),
+ MessGui()
+ {
+ setupUi(this);
+ QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read);
+ connect(s, SIGNAL(activated(int)), SLOT(readMessage(int)));
+
+ dctrl[0] = SynthGuiCtrl(p1, lcd1, SynthGuiCtrl::SLIDER);
+ dctrl[1] = SynthGuiCtrl(p2, lcd2, SynthGuiCtrl::SLIDER);
+ dctrl[2] = SynthGuiCtrl(p3, lcd3, SynthGuiCtrl::SLIDER);
+ dctrl[3] = SynthGuiCtrl(p4, lcd4, SynthGuiCtrl::SLIDER);
+ dctrl[4] = SynthGuiCtrl(p5, lcd5, SynthGuiCtrl::SLIDER);
+ dctrl[5] = SynthGuiCtrl(p6, lcd6, SynthGuiCtrl::SLIDER);
+ dctrl[6] = SynthGuiCtrl(p7, lcd7, SynthGuiCtrl::SLIDER);
+ dctrl[7] = SynthGuiCtrl(p8, lcd8, SynthGuiCtrl::SLIDER);
+ dctrl[8] = SynthGuiCtrl(p9, lcd9, SynthGuiCtrl::SLIDER);
+ dctrl[9] = SynthGuiCtrl(p10, lcd10, SynthGuiCtrl::SLIDER);
+ dctrl[10] = SynthGuiCtrl(p11, lcd11, SynthGuiCtrl::SLIDER);
+ dctrl[11] = SynthGuiCtrl(p12, lcd12, SynthGuiCtrl::SLIDER);
+ dctrl[12] = SynthGuiCtrl(p13, lcd13, SynthGuiCtrl::SLIDER);
+ dctrl[13] = SynthGuiCtrl(p14, lcd14, SynthGuiCtrl::SLIDER);
+ dctrl[14] = SynthGuiCtrl(sw1, 0, SynthGuiCtrl::SWITCH);
+ dctrl[15] = SynthGuiCtrl(sw3, 0, SynthGuiCtrl::SWITCH);
+ dctrl[16] = SynthGuiCtrl(sw2, 0, SynthGuiCtrl::SWITCH);
+ dctrl[17] = SynthGuiCtrl(sw4, 0, SynthGuiCtrl::SWITCH);
+
+ map = new QSignalMapper(this);
+ for (int i = 0; i < NUM_GUI_CONTROLLER; ++i) {
+ map->setMapping(dctrl[i].editor, i);
+ if (dctrl[i].type == SynthGuiCtrl::SLIDER)
+ connect((QSlider*)(dctrl[i].editor), SIGNAL(valueChanged(int)), map, SLOT(map()));
+ else if (dctrl[i].type == SynthGuiCtrl::SWITCH)
+ connect((QCheckBox*)(dctrl[i].editor), SIGNAL(toggled(bool)), map, SLOT(map()));
+ }
+ connect(map, SIGNAL(mapped(int)), this, SLOT(ctrlChanged(int)));
+ }
+
+//---------------------------------------------------------
+// ctrlChanged
+//---------------------------------------------------------
+
+void OrganGui::ctrlChanged(int idx)
+ {
+ SynthGuiCtrl* ctrl = &dctrl[idx];
+ int val = 0;
+ if (ctrl->type == SynthGuiCtrl::SLIDER) {
+ QSlider* slider = (QSlider*)(ctrl->editor);
+ val = slider->value();
+ }
+ else if (ctrl->type == SynthGuiCtrl::SWITCH) {
+ val = ((QCheckBox*)(ctrl->editor))->isChecked();
+ }
+ sendController(0, idx + CTRL_RPN14_OFFSET, val);
+ }
+
+//---------------------------------------------------------
+// setParam
+// set param in gui
+//---------------------------------------------------------
+
+void OrganGui::setParam(int param, int val)
+ {
+ param &= 0xfff;
+ if (param >= int(sizeof(dctrl)/sizeof(*dctrl))) {
+ fprintf(stderr, "OrganGui: set unknown Ctrl 0x%x to 0x%x\n", param, val);
+ return;
+ }
+ SynthGuiCtrl* ctrl = &dctrl[param];
+ ctrl->editor->blockSignals(true);
+ if (ctrl->type == SynthGuiCtrl::SLIDER) {
+ QSlider* slider = (QSlider*)(ctrl->editor);
+ slider->setValue(val);
+ if (ctrl->label)
+ ((QSpinBox*)(ctrl->label))->setValue(val);
+ }
+ else if (ctrl->type == SynthGuiCtrl::SWITCH) {
+ ((QCheckBox*)(ctrl->editor))->setChecked(val);
+ }
+ ctrl->editor->blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// processEvent
+//---------------------------------------------------------
+
+void OrganGui::processEvent(const MidiEvent& ev)
+ {
+ if (ev.type() == ME_CONTROLLER)
+ setParam(ev.dataA(), ev.dataB());
+ else
+ printf("OrganGui::illegal event type received\n");
+ }
+
+//---------------------------------------------------------
+// readMessage
+//---------------------------------------------------------
+
+void OrganGui::readMessage(int)
+ {
+ MessGui::readMessage();
+ }
+
diff --git a/muse/synti/organ/organgui.h b/muse/synti/organ/organgui.h
new file mode 100644
index 00000000..f58bb4aa
--- /dev/null
+++ b/muse/synti/organ/organgui.h
@@ -0,0 +1,42 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: organgui.h,v 1.8 2005/10/04 21:37:44 lunar_shuttle Exp $
+//
+// (C) Copyright 2001-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __ORGANGUI_H__
+#define __ORGANGUI_H__
+
+#include "ui_organgui.h"
+#include "organ.h"
+#include "libsynti/gui.h"
+#include "libsynti/mpevent.h"
+
+class QSignalMapper;
+
+#define NUM_GUI_CONTROLLER 18
+
+//---------------------------------------------------------
+// OrganGui
+//---------------------------------------------------------
+
+class OrganGui : public QWidget, public Ui::OrganGuiBase, public MessGui {
+ Q_OBJECT
+
+ QSignalMapper* map;
+ SynthGuiCtrl dctrl[NUM_GUI_CONTROLLER];
+ void setParam(int, int);
+ virtual void processEvent(const MidiEvent&);
+
+ private slots:
+ void ctrlChanged(int idx);
+ void readMessage(int);
+
+ public:
+ OrganGui();
+ };
+
+#endif
+
diff --git a/muse/synti/organ/organgui.ui b/muse/synti/organ/organgui.ui
new file mode 100644
index 00000000..aeea79b3
--- /dev/null
+++ b/muse/synti/organ/organgui.ui
@@ -0,0 +1,882 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>OrganGuiBase</class>
+ <widget class="QWidget" name="OrganGuiBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>534</width>
+ <height>366</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Organ</string>
+ </property>
+ <widget class="QGroupBox" name="GroupBox1" >
+ <property name="geometry" >
+ <rect>
+ <x>5</x>
+ <y>162</y>
+ <width>252</width>
+ <height>199</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Drawbars</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>16'</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="TextLabel4" >
+ <property name="text" >
+ <string>4'</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="TextLabel5" >
+ <property name="text" >
+ <string>2 2/3'</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLabel" name="TextLabel6" >
+ <property name="text" >
+ <string>2'</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>5 1/3'</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>8'</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSlider" name="p2" >
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSlider" name="p3" >
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSlider" name="p4" >
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2" >
+ <widget class="QSlider" name="p5" >
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2" >
+ <widget class="QSlider" name="p6" >
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSlider" name="p1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="lcd1" >
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="lcd2" >
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="singleStep" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="lcd3" >
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="singleStep" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="lcd4" >
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="singleStep" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QSpinBox" name="lcd5" >
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="singleStep" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" >
+ <widget class="QSpinBox" name="lcd6" >
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="singleStep" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QGroupBox" name="GroupBox2" >
+ <property name="geometry" >
+ <rect>
+ <x>263</x>
+ <y>5</y>
+ <width>266</width>
+ <height>151</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Envelope Lo</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignLeading</set>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel7" >
+ <property name="text" >
+ <string>Attack</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel8" >
+ <property name="text" >
+ <string>Decay</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="TextLabel9" >
+ <property name="text" >
+ <string>Sustain</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="TextLabel10" >
+ <property name="text" >
+ <string>Release</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSlider" name="p7" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximum" >
+ <number>500</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSlider" name="p8" >
+ <property name="maximum" >
+ <number>5000</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>500</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSlider" name="p9" >
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSlider" name="p10" >
+ <property name="maximum" >
+ <number>500</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="lcd7" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string>ms</string>
+ </property>
+ <property name="maximum" >
+ <number>500</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="lcd8" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string>ms</string>
+ </property>
+ <property name="maximum" >
+ <number>5000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="lcd9" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string>cB</string>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="value" >
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="lcd10" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string>ms</string>
+ </property>
+ <property name="maximum" >
+ <number>500</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel1_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font" >
+ <font>
+ <family></family>
+ <pointsize>48</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>O-1</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="GroupBox3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Oscillator</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="sw1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Brass</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="sw2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Reed</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="sw3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Flute</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="sw4" >
+ <property name="text" >
+ <string>Velocity</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QGroupBox" name="GroupBox4" >
+ <property name="geometry" >
+ <rect>
+ <x>263</x>
+ <y>162</y>
+ <width>266</width>
+ <height>199</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Envelope Hi</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>8</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="3" column="2" >
+ <widget class="QSlider" name="p14" >
+ <property name="maximum" >
+ <number>500</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="TextLabel13" >
+ <property name="text" >
+ <string>Sustain</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="TextLabel14" >
+ <property name="text" >
+ <string>Release</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="lcd14" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string>ms</string>
+ </property>
+ <property name="maximum" >
+ <number>500</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="lcd13" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string>cB</string>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="lcd12" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string>ms</string>
+ </property>
+ <property name="maximum" >
+ <number>5000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QSlider" name="p11" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum" >
+ <number>500</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QSpinBox" name="lcd11" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix" >
+ <string>ms</string>
+ </property>
+ <property name="maximum" >
+ <number>500</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QSlider" name="p12" >
+ <property name="maximum" >
+ <number>5000</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>500</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSlider" name="p13" >
+ <property name="minimum" >
+ <number>-960</number>
+ </property>
+ <property name="maximum" >
+ <number>0</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel11" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Attack</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel12" >
+ <property name="text" >
+ <string>Decay</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <tabstops>
+ <tabstop>p1</tabstop>
+ <tabstop>p3</tabstop>
+ <tabstop>p2</tabstop>
+ <tabstop>p4</tabstop>
+ <tabstop>p5</tabstop>
+ <tabstop>p6</tabstop>
+ <tabstop>p7</tabstop>
+ <tabstop>p8</tabstop>
+ <tabstop>p9</tabstop>
+ <tabstop>p10</tabstop>
+ <tabstop>p11</tabstop>
+ <tabstop>p12</tabstop>
+ <tabstop>p13</tabstop>
+ <tabstop>p14</tabstop>
+ <tabstop>sw1</tabstop>
+ <tabstop>sw2</tabstop>
+ <tabstop>sw3</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/synti/s1/CMakeLists.txt b/muse/synti/s1/CMakeLists.txt
new file mode 100644
index 00000000..23a34bc2
--- /dev/null
+++ b/muse/synti/s1/CMakeLists.txt
@@ -0,0 +1,27 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+add_library ( s1 SHARED s1.cpp )
+
+# tell cmake to name target s1.so instead of
+# libs1.so
+#
+set_target_properties ( s1 PROPERTIES PREFIX "" )
+
diff --git a/muse/synti/s1/s1.cpp b/muse/synti/s1/s1.cpp
new file mode 100644
index 00000000..ff02f6fe
--- /dev/null
+++ b/muse/synti/s1/s1.cpp
@@ -0,0 +1,158 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: s1.cpp,v 1.10 2005/01/13 21:16:27 wschweer Exp $
+//
+// S1 - simple mono demo synthesizer
+// - plays only one note at a time
+// - has no gui nor any controller
+//
+// Version 0.2: stop note on wave zero crossing to avoid
+// clicks
+//
+// (C) Copyright 2001-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include <cmath>
+#include <list>
+
+#include "synti/libsynti/mono.h"
+
+#define RESOLUTION 16384
+
+//---------------------------------------------------------
+// S1 - simple mono demo synthesizer
+//---------------------------------------------------------
+
+class S1 : public MessMono {
+ static int useCount;
+ static float *wave_table;
+
+ int gate;
+ float freq;
+ unsigned accu;
+ float sample;
+
+ virtual void note(int channel, int pitch, int velo);
+ virtual void process(float** buffer, int offset, int n);
+
+ public:
+ S1();
+ ~S1();
+ };
+
+float* S1::wave_table;
+int S1::useCount = 0;
+
+//---------------------------------------------------------
+// S1
+//---------------------------------------------------------
+
+S1::S1() : MessMono()
+ {
+ if (useCount++ == 0) {
+ //
+ // create sinus wave table
+ //
+ wave_table = new float[RESOLUTION];
+ for (int i = 0; i < RESOLUTION; i++)
+ wave_table[i] = sin ((i * 2.0 * M_PI) / RESOLUTION) / 6.0;
+ }
+ gate = 0;
+ }
+
+//---------------------------------------------------------
+// ~S1
+//---------------------------------------------------------
+
+S1::~S1()
+ {
+ if (--useCount == 0)
+ delete[] wave_table;
+ }
+
+//---------------------------------------------------------
+// noteon
+// process note on
+//---------------------------------------------------------
+
+void S1::note(int /*channel*/, int pitch, int velo)
+ {
+ if (velo == 0) {
+ //
+ // note off
+ //
+ if (sample == 0.0)
+ gate = 0;
+ else if (sample > 0.0)
+ gate = 2;
+ else if (sample < 0.0)
+ gate = 3;
+ }
+ else {
+ //
+ // note on
+ //
+ accu = 0;
+ gate = 1;
+ freq = 8.176 * exp(float(pitch)*log(2.0)/12.0);
+ }
+ }
+
+//---------------------------------------------------------
+// write
+// synthesize n samples into buffer+offset
+//---------------------------------------------------------
+
+void S1::process(float** buffer, int offset, int n)
+ {
+ if (gate == 0)
+ return;
+ float* p = buffer[0] + offset;
+ unsigned freq_256 = (int) (freq * ((double) RESOLUTION) / sampleRate() * 256.0);
+ for (int i = 0; i < n; i++) {
+ accu += freq_256;
+ while (accu >= RESOLUTION * 256)
+ accu -= RESOLUTION * 256;
+ sample = wave_table[accu >> 8];
+ //
+ // stop on zero crossing
+ // if in decay state
+ //
+ if (gate == 2 && sample <= 0.0) {
+ gate = 0;
+ break;
+ }
+ else if (gate == 3 && sample >= 0.0) {
+ gate = 0;
+ break;
+ }
+ p[i] += sample;
+ }
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+class QWidget;
+
+static Mess* instantiate(int sr, QWidget*, const char*)
+ {
+ S1* s1 = new S1();
+ s1->setSampleRate(sr);
+ return s1;
+ }
+
+extern "C" {
+ static MESS descriptor = {
+ "S1",
+ "S1 MusE Demo Software Synthesizer",
+ "0.2", // version string
+ MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
+ instantiate
+ };
+
+ const MESS* mess_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse/synti/simpledrums/COPYING b/muse/synti/simpledrums/COPYING
new file mode 100644
index 00000000..5c3cefc2
--- /dev/null
+++ b/muse/synti/simpledrums/COPYING
@@ -0,0 +1,3 @@
+COPYING
+---------------------------------------
+This software is licensed under GNU GPL.
diff --git a/muse/synti/simpledrums/README b/muse/synti/simpledrums/README
new file mode 100644
index 00000000..468640b1
--- /dev/null
+++ b/muse/synti/simpledrums/README
@@ -0,0 +1,43 @@
+--------------------------------------
+Simpledrums v 0.2, by Mathias Lundgren
+--------------------------------------
+
+Simpledrums is a simple MESS-synth sampler (MusE Experimental Soft
+Synth) aiming at becoming a simple, tightly integrated sampler for
+MusE, specifically aimed at drumsamples.
+
+Features:
+- 16 channels/samples (1 sample/channel)
+- Simple controls for each individual channel: volume, balance, noteoff-ignore, channel on/off
+- Main volume
+- 4 LADSPA send-effects can be used, 4 effect taps for each individual channel
+- All channel parameters are controllable via the GUI, or by MusE:s controller handling (controller pane in pianoroll/drumeditor)
+- All effect parameters can be controlled via the GUI, or by Sysex messages (f.ex. turn effect on/off, modify effect parameters)
+- Complete synth state (fx-parameters, samples etc) is saved together with MusE project, and restored later when loaded
+- Samples automatically resampled when loaded (if needed)
+
+That's all folks!
+
+-------------
+Known issues:
+-------------
+- Not the prettiest gui in the world
+- All samples are read directly into memory (no caching)
+- Some obscure LADSPA-effects make SimpleSynth segfault
+- More...
+
+-------------
+Future plans:
+-------------
+- Fix all the known issues! ;-)
+- Sample loops
+- Sample offset variation w respect to note velocity
+- Treble/eq-controller for each individual channel
+- Treble level variation w respect to note velocity
+- More...
+
+Mathias Lundgren, (lunar_shuttle@users.sourceforge.net), 2004
+Plugin management code based on Werner Schweers plugin management handling for MusE
+
+(C) Copyright Mathias Lundgren, Werner Schweer 2000-2004
+Licensed under the GNU General Public License
diff --git a/muse/synti/simpledrums/ReleaseNotes.txt b/muse/synti/simpledrums/ReleaseNotes.txt
new file mode 100644
index 00000000..e0d633d8
--- /dev/null
+++ b/muse/synti/simpledrums/ReleaseNotes.txt
@@ -0,0 +1,18 @@
+RELEASE NOTES:
+--------------
+????-??-?? ver 0.2
+- Support for 4 LADSPA sendeffects added
+- Resampling of samples when loading (libsamplerate)
+- Synth state is saved to/restored from project file
+- Channel settings: balance, volume, effect tap for each sendeffect
+- Effect settings: all LADSPA parameters controllable and saved to MusE project, effect master volume, effect on/off
+- Support for mono + stereo samples
+- Support for stereo + mono LADSPA effects
+- Bugfixes, GUI-improvements etc...
+
+2004-11-09 ver 0.1
+- Simpledrums initial release
+- 16 channels (1 sample for each channel) with parameters: volume, balance, noteoff-ignore
+
+(C) Copyright Mathias Lundgren, Werner Schweer 2000-2004
+Licensed under the GNU General Public License
diff --git a/muse/synti/simpledrums/common.h b/muse/synti/simpledrums/common.h
new file mode 100644
index 00000000..79148d42
--- /dev/null
+++ b/muse/synti/simpledrums/common.h
@@ -0,0 +1,109 @@
+//
+// C++ Interface: common
+//
+// Description:
+//
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef __MUSE_TESTO_COMMON_H__
+#define __MUSE_TESTO_COMMON_H__
+
+#include "muse/midictrl.h"
+
+#define SS_VERSIONSTRING "0.2"
+
+#define SS_DEBUG 0
+#define SS_DEBUG_INIT 0
+#define SS_TRACE_FUNC 0
+#define SS_DEBUG_MIDI 0
+#define SS_DEBUG_LADSPA 0
+#define SS_DEBUG_STATE 0
+
+#define SS_DBG(string) if (SS_DEBUG) fprintf(stderr, "%s:%d:%s: %s\n", __FILE__ , __LINE__ , __PRETTY_FUNCTION__, string);
+#define SS_DBG2(string1, string2) if (SS_DEBUG) fprintf(stderr, "%s:%d:%s: %s: %s\n", __FILE__ , __LINE__ , __PRETTY_FUNCTION__, string1, string2);
+#define SS_DBG_I(string1, int) if (SS_DEBUG) fprintf(stderr, "%s:%d:%s: %s: %d\n", __FILE__ , __LINE__ , __PRETTY_FUNCTION__, string1, int);
+
+#define SS_TRACE_IN if (SS_TRACE_FUNC) fprintf (stderr, "->%s:%d\n", __PRETTY_FUNCTION__, __LINE__);
+#define SS_TRACE_OUT if (SS_TRACE_FUNC) fprintf (stderr, "<-%s:%d\n", __PRETTY_FUNCTION__, __LINE__);
+#define SS_ERROR(string) fprintf(stderr, "SimpleDrums error: %s\n", string)
+#define SS_DBG_LADSPA(string1) if (SS_DEBUG_LADSPA) fprintf(stderr, "%s:%d:%s: %s\n", __FILE__ , __LINE__ , __PRETTY_FUNCTION__, string1);
+#define SS_DBG_LADSPA2(string1, string2) if (SS_DEBUG_LADSPA) fprintf(stderr, "%s:%d:%s: %s: %s\n", __FILE__ , __LINE__ , __PRETTY_FUNCTION__, string1, string2);
+
+//#define SS_TRACE_IN
+//#define SS_TRACE_OUT
+#define SS_SYSEX_INIT_DATA_VERSION 1
+
+#define SS_NR_OF_CHANNELS 16
+#define SS_AUDIO_CHANNELS 2
+#define SS_NR_OF_SENDEFFECTS 4
+
+// Controller-related:
+#define SS_CHANNEL_CTRL_VOLUME 0
+#define SS_CHANNEL_CTRL_PAN 1
+#define SS_CHANNEL_CTRL_NOFF 2
+#define SS_CHANNEL_CTRL_ONOFF 3
+#define SS_CHANNEL_SENDFX1 4
+#define SS_CHANNEL_SENDFX2 5
+#define SS_CHANNEL_SENDFX3 6
+#define SS_CHANNEL_SENDFX4 7
+
+#define SS_PLUGIN_RETURN 0
+#define SS_PLUGIN_ONOFF 1
+
+#define SS_NR_OF_MASTER_CONTROLLERS 1
+#define SS_NR_OF_CHANNEL_CONTROLLERS 8
+#define SS_NR_OF_PLUGIN_CONTROLLERS 2
+
+#define SS_NR_OF_CONTROLLERS (SS_NR_OF_MASTER_CONTROLLERS + (SS_NR_OF_CHANNELS * SS_NR_OF_CHANNEL_CONTROLLERS) + (SS_NR_OF_PLUGIN_CONTROLLERS*SS_NR_OF_SENDEFFECTS))
+#define SS_FIRST_MASTER_CONTROLLER CTRL_NRPN14_OFFSET
+#define SS_FIRST_CHANNEL_CONTROLLER (SS_FIRST_MASTER_CONTROLLER + SS_NR_OF_MASTER_CONTROLLERS)
+#define SS_LAST_MASTER_CONTROLLER (SS_FIRST_CHANNEL_CONTROLLER - 1)
+#define SS_LAST_CHANNEL_CONTROLLER (SS_FIRST_CHANNEL_CONTROLLER -1 + (SS_NR_OF_CHANNEL_CONTROLLERS * SS_NR_OF_CHANNELS))
+
+#define SS_FIRST_PLUGIN_CONTROLLER (SS_LAST_CHANNEL_CONTROLLER + 1)
+#define SS_LAST_PLUGIN_CONTROLLER (SS_FIRST_PLUGIN_CONTROLLER -1 + SS_NR_OF_SENDEFFECTS*SS_NR_OF_PLUGIN_CONTROLLERS)
+
+#define SS_MASTER_CTRL_VOLUME SS_FIRST_MASTER_CONTROLLER
+
+#define SS_CHANNEL_VOLUME_CONTROLLER(int) (SS_FIRST_CHANNEL_CONTROLLER + (SS_NR_OF_CHANNEL_CONTROLLERS * int) + SS_CHANNEL_CTRL_VOLUME)
+#define SS_CHANNEL_PAN_CONTROLLER(int) (SS_FIRST_CHANNEL_CONTROLLER + (SS_NR_OF_CHANNEL_CONTROLLERS * int) + SS_CHANNEL_CTRL_PAN)
+#define SS_CHANNEL_NOFF_CONTROLLER(int) (SS_FIRST_CHANNEL_CONTROLLER + (SS_NR_OF_CHANNEL_CONTROLLERS * int) + SS_CHANNEL_CTRL_NOFF)
+#define SS_CHANNEL_ONOFF_CONTROLLER(int) (SS_FIRST_CHANNEL_CONTROLLER + (SS_NR_OF_CHANNEL_CONTROLLERS * int) + SS_CHANNEL_CTRL_ONOFF)
+#define SS_CHANNEL_SENDFX_CONTROLLER(int1,int2) (SS_FIRST_CHANNEL_CONTROLLER + (SS_NR_OF_CHANNEL_CONTROLLERS * int1) + SS_CHANNEL_SENDFX1 + int2)
+
+#define SS_PLUGIN_RETURNLEVEL_CONTROLLER(int) (SS_FIRST_PLUGIN_CONTROLLER + (int * SS_NR_OF_PLUGIN_CONTROLLERS))
+#define SS_PLUGIN_ONOFF_CONTROLLER(int) (SS_FIRST_PLUGIN_CONTROLLER + (int * SS_NR_OF_PLUGIN_CONTROLLERS) + 1)
+
+#define SS_LOWEST_NOTE 36
+#define SS_HIGHEST_NOTE (SS_LOWEST_NOTE + SS_NR_OF_CHANNELS)
+
+#define SS_PLUGIN_PARAM_MIN 0
+#define SS_PLUGIN_PARAM_MAX 127
+
+typedef unsigned char byte;
+
+enum {
+ SS_SYSEX_LOAD_SAMPLE = 0, // gui -> synth: tell synth to load sample
+ SS_SYSEX_INIT_DATA, // synth reinitialization, this must not be changed since this value is written into proj file
+ SS_SYSEX_LOAD_SAMPLE_OK, // synth -> gui: tell gui sample loaded OK
+ SS_SYSEX_LOAD_SAMPLE_ERROR, // synth -> gui: tell gui sample ! loaded OK
+ SS_SYSEX_CLEAR_SAMPLE, // gui -> synth: tell synth to clear sample
+ SS_SYSEX_LOAD_SENDEFFECT, // gui -> synth: tell synth to load laspa-effect
+ SS_SYSEX_LOAD_SENDEFFECT_OK,// synth->gui: plugin loaded ok
+ SS_SYSEX_LOAD_SENDEFFECT_ERROR, // synth->gui: plugin _not_ loaded ok
+ SS_SYSEX_CLEAR_SENDEFFECT, // gui->synth: clear plugin
+ SS_SYSEX_CLEAR_SENDEFFECT_OK,// synth->gui: plugin cleared
+ SS_SYSEX_SET_PLUGIN_PARAMETER, //gui->synth: set plugin parameter
+ SS_SYSEX_SET_PLUGIN_PARAMETER_OK, // synth->gui: set plugin parameter (update gui)
+ SS_SYSEX_ERRORMSG // synth -> gui: general error message from synth
+ };
+
+extern int SS_samplerate;
+extern float SS_map_pluginparam2logdomain(int pluginparam_val);
+extern int SS_map_logdomain2pluginparam(float pluginparam_log);
+#endif
+
diff --git a/muse/synti/simpledrums/simpledrums.cpp b/muse/synti/simpledrums/simpledrums.cpp
new file mode 100644
index 00000000..b5b3a1b4
--- /dev/null
+++ b/muse/synti/simpledrums/simpledrums.cpp
@@ -0,0 +1,1650 @@
+//
+// C++ Implementation: simplesynth
+//
+// Description:
+//
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#include "muse/midictrl.h"
+#include "muse/midi.h"
+#include "libsynti/mpevent.h"
+#include "simpledrums.h"
+// #include <qstring.h>
+#include <samplerate.h>
+
+const char* SimpleSynth::synth_state_descr[] =
+ {
+ "SS_INITIALIZING",
+ "SS_LOADING_SAMPLE",
+ "SS_CLEARING_SAMPLE",
+ "SS_RUNNING"
+ };
+
+const char* SimpleSynth::channel_state_descr[] =
+ {
+ "SS_CHANNEL_INACTIVE",
+ "SS_SAMPLE_PLAYING"
+ };
+
+#define SWITCH_SYNTH_STATE(state)\
+synth_state = state; \
+if (SS_DEBUG_STATE) \
+ fprintf (stderr, "SS STATE: %s\n", SimpleSynth::synth_state_descr[state]);
+
+#define SWITCH_CHAN_STATE(ch, s)\
+channels[ch].state = s; \
+if (SS_DEBUG_STATE) \
+ fprintf (stderr, "SS CHAN %d STATE: %s\n", ch, SimpleSynth::channel_state_descr[s]);
+
+#define SS_CHANNEL_VOLUME_QUOT 100.0
+#define SS_MASTER_VOLUME_QUOT 100.0
+int SS_samplerate;
+
+#define SS_LOG_MAX 0
+#define SS_LOG_MIN -10
+#define SS_LOG_OFFSET SS_LOG_MIN
+
+
+//
+// Map plugin parameter on domain [SS_PLUGIN_PARAM_MIN, SS_PLUGIN_PARAM_MAX] to domain [SS_LOG_MIN, SS_LOG_MAX] (log domain)
+//
+float SS_map_pluginparam2logdomain(int pluginparam_val)
+ {
+ float scale = (float) (SS_LOG_MAX - SS_LOG_MIN)/ (float) SS_PLUGIN_PARAM_MAX;
+ float scaled = (float) pluginparam_val * scale;
+ float mapped = scaled + SS_LOG_OFFSET;
+ return mapped;
+ }
+//
+// Map plugin parameter on domain to domain [SS_LOG_MIN, SS_LOG_MAX] to [SS_PLUGIN_PARAM_MIN, SS_PLUGIN_PARAM_MAX] (from log-> [0,127])
+// (inverse func to the above)
+int SS_map_logdomain2pluginparam(float pluginparam_log)
+ {
+ float mapped = pluginparam_log - SS_LOG_OFFSET;
+ float scale = (float) SS_PLUGIN_PARAM_MAX / (float) (SS_LOG_MAX - SS_LOG_MIN);
+ int scaled = (int) round(mapped * scale);
+ return scaled;
+ }
+
+//---------------------------------------------------------
+// SimpleSynth
+//---------------------------------------------------------
+SimpleSynth::SimpleSynth(int sr)
+ : Mess(SS_AUDIO_CHANNELS)
+ {
+ SS_TRACE_IN
+ SS_samplerate = sr;
+ SS_initPlugins();
+
+ simplesynth_ptr = this;
+ master_vol = 100.0 / SS_MASTER_VOLUME_QUOT;
+ master_vol_ctrlval = 100;
+
+ //initialize
+ for (int i=0; i<SS_NR_OF_CHANNELS; i++) {
+ channels[i].sample = 0;
+ channels[i].playoffset = 0;
+ channels[i].noteoff_ignore = false;
+ channels[i].volume = (double) (100.0/SS_CHANNEL_VOLUME_QUOT );
+ channels[i].volume_ctrlval = 100;
+ channels[i].pan = 64;
+ channels[i].balanceFactorL = 1.0;
+ channels[i].balanceFactorR = 1.0;
+ SWITCH_CHAN_STATE(i, SS_CHANNEL_INACTIVE);
+ channels[i].channel_on = false;
+ for (int j=0; j<SS_NR_OF_SENDEFFECTS; j++) {
+ channels[i].sendfxlevel[j] = 0.0;
+ }
+ }
+
+ //Process buffer:
+ processBuffer[0] = new double[SS_PROCESS_BUFFER_SIZE]; //left
+ processBuffer[1] = new double[SS_PROCESS_BUFFER_SIZE]; //right
+
+ //Send effects
+ for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
+ sendFxLineOut[i][0] = new float[SS_SENDFX_BUFFER_SIZE]; //left out
+ sendFxLineOut[i][1] = new float[SS_SENDFX_BUFFER_SIZE]; //right out
+ sendFxReturn[i][0] = new float[SS_SENDFX_BUFFER_SIZE]; //left in
+ sendFxReturn[i][1] = new float[SS_SENDFX_BUFFER_SIZE]; //right in
+ }
+
+ for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
+ sendEffects[i].state = SS_SENDFX_OFF;
+ sendEffects[i].plugin = 0;
+ sendEffects[i].retgain = 1.0;
+ sendEffects[i].retgain_ctrlval = 100;
+ sendEffects[i].nrofparameters = 0;
+ }
+
+ //Build controller list:
+ controllers[0].name = "Master volume";
+ controllers[0].num = CTRL_NRPN14_OFFSET;
+ controllers[0].min = 0;
+ controllers[0].max = 127;
+
+ int i=1;
+ for (int ch=0; ch<SS_NR_OF_CHANNELS; ch++) {
+ QString c1 = "Channel " + QString::number(ch + 1) + " volume";
+ QString c2 = "Channel " + QString::number(ch + 1) + " pan";
+ QString c3 = "Channel " + QString::number(ch + 1) + " noteoff ignore";
+ QString c4 = "Channel " + QString::number(ch + 1) + " on/off";
+ QString c5 = "Channel " + QString::number(ch + 1) + " fx send 1";
+ QString c6 = "Channel " + QString::number(ch + 1) + " fx send 2";
+ QString c7 = "Channel " + QString::number(ch + 1) + " fx send 3";
+ QString c8 = "Channel " + QString::number(ch + 1) + " fx send 4";
+ controllers[i].name = c1.toLatin1().data();
+ controllers[i].num = CTRL_NRPN14_OFFSET+i;
+ controllers[i].min = 0;
+ controllers[i].max = 127;
+
+ controllers[i+1].name = c2.toLatin1().data();
+ controllers[i+1].num = CTRL_NRPN14_OFFSET+i+1;
+ controllers[i+1].min = 0;
+ controllers[i+1].max = 127;
+
+ controllers[i+2].name = c3.toLatin1().data();
+ controllers[i+2].num = CTRL_NRPN14_OFFSET+i+2;
+ controllers[i+2].min = 0;
+ controllers[i+2].max = 1;
+
+ controllers[i+3].name = c4.toLatin1().data();
+ controllers[i+3].num = CTRL_NRPN14_OFFSET+i+3;
+ controllers[i+3].min = 0;
+ controllers[i+3].max = 1;
+
+ controllers[i+4].name = c5.toLatin1().data();
+ controllers[i+4].num = CTRL_NRPN14_OFFSET+i+4;
+
+ controllers[i+5].name = c6.toLatin1().data();
+ controllers[i+5].num = CTRL_NRPN14_OFFSET+i+5;
+
+ controllers[i+6].name = c7.toLatin1().data();
+ controllers[i+6].num = CTRL_NRPN14_OFFSET+i+6;
+
+ controllers[i+7].name = c8.toLatin1().data();
+ controllers[i+7].num = CTRL_NRPN14_OFFSET+i+7;
+
+ controllers[i+4].min = controllers[i+5].min = controllers[i+6].min = controllers[i+7].min = 0;
+ controllers[i+4].max = controllers[i+5].max = controllers[i+6].max = controllers[i+7].max = 127;
+
+ i+=8;
+ }
+
+ for (int sfx=0; sfx<SS_NR_OF_SENDEFFECTS; sfx++) {
+ QString c1 = "Sendfx " + QString::number(sfx) + " ret gain";
+ QString c2 = "Sendfx " + QString::number(sfx) + " on/off";
+ controllers[i].name = c1.toLatin1().data();
+ controllers[i].num = CTRL_NRPN14_OFFSET+i;
+ controllers[i].min = 0;
+ controllers[i].max = 127;
+
+ controllers[i+1].name = c2.toLatin1().data();
+ controllers[i+1].num = CTRL_NRPN14_OFFSET+i+1;
+ controllers[i+1].min = 0;
+ controllers[i+1].max = 1;
+ i+=2;
+ }
+
+ pthread_mutex_init(&SS_LoaderMutex, NULL);
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// ~SimpleSynth
+//---------------------------------------------------------
+SimpleSynth::~SimpleSynth()
+ {
+ SS_TRACE_IN
+
+ // Cleanup channels and samples:
+ SS_DBG("Cleaning up sample data");
+ for (int i=0; i<SS_NR_OF_CHANNELS; i++) {
+ if (channels[i].sample) {
+ delete[] channels[i].sample->data;
+ delete channels[i].sample;
+ }
+ }
+ simplesynth_ptr = NULL;
+
+ SS_DBG("Deleting pluginlist");
+ //Cleanup plugins:
+ for (iPlugin i = plugins.begin(); i != plugins.end(); ++i) {
+ delete (*i);
+ }
+ plugins.clear();
+
+ SS_DBG("Deleting sendfx buffers");
+ //Delete sendfx buffers:
+ for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
+ delete[] sendFxLineOut[i][0];
+ delete[] sendFxLineOut[i][1];
+ delete[] sendFxReturn[i][0];
+ delete[] sendFxReturn[i][1];
+ }
+
+ //processBuffer:
+ SS_DBG("Deleting process buffer");
+ delete[] processBuffer[0];
+ delete[] processBuffer[1];
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// guiVisible
+/*!
+ \fn SimpleSynth::guiVisible
+ \brief Tells if the gui is hidden or shown
+ \return true/false if gui is shown/hidden
+ */
+//---------------------------------------------------------
+bool SimpleSynth::guiVisible() const
+ {
+ SS_TRACE_IN
+ bool v = gui->isVisible();
+ SS_TRACE_OUT
+ return v;
+ }
+
+//---------------------------------------------------------
+// hasGui
+/*!
+ \fn SimpleSynth::hasGui
+ \brief Tells if the synth has a gui or not
+ \return true if synth has gui, false it synth has no gui
+ */
+//---------------------------------------------------------
+bool SimpleSynth::hasGui() const
+ {
+ SS_TRACE_IN
+ SS_TRACE_OUT
+ return true;
+ }
+
+//---------------------------------------------------------
+// playNote
+/*!
+ \fn SimpleSynth::playNote
+ \brief Triggers a note on (noteoffs are noteons with velo=0)
+ \param channel midi channel
+ \param pitch note pitch
+ \param velo note velocity
+ \return false for ok, true for not ok (not sure these are handled differently, but...)
+ */
+//---------------------------------------------------------
+bool SimpleSynth::playNote(int /*channel*/, int pitch, int velo)
+ {
+ SS_TRACE_IN
+ //Don't bother about channel, we're processing every playnote!
+ if ((pitch >= SS_LOWEST_NOTE) && (pitch <= SS_HIGHEST_NOTE)) {
+ bool noteOff = (velo == 0 ? 1 : 0);
+ int ch = pitch - SS_LOWEST_NOTE;
+ if(!noteOff) {
+ if (channels[ch].sample) {
+ //Turn on the white stuff:
+ channels[ch].playoffset = 0;
+ SWITCH_CHAN_STATE(ch , SS_SAMPLE_PLAYING);
+ channels[ch].cur_velo = (double) velo / 127.0;
+ channels[ch].gain_factor = channels[ch].cur_velo * channels[ch].volume;
+ if (SS_DEBUG_MIDI) {
+ printf("Playing note %d on channel %d\n", pitch, ch);
+ }
+ }
+ }
+ else {
+ //Note off:
+ if (channels[ch].noteoff_ignore) {
+ if (SS_DEBUG_MIDI) {
+ printf("Note off on channel %d\n", ch);
+ }
+ SWITCH_CHAN_STATE(ch , SS_CHANNEL_INACTIVE);
+ channels[ch].playoffset = 0;
+ channels[ch].cur_velo = 0;
+ }
+ }
+ }
+ SS_TRACE_OUT
+ return false;
+ }
+
+//---------------------------------------------------------
+// processEvent
+/*!
+ \fn SimpleSynth::processEvent
+ \brief All events from sequencer first shows up here and are forwarded to their correct functions
+ \param event The event sent from sequencer
+ \return false for ok, true for not ok
+ */
+//---------------------------------------------------------
+bool SimpleSynth::processEvent(const MidiEvent& ev)
+ {
+ SS_TRACE_IN
+ switch(ev.type()) {
+ case ME_CONTROLLER:
+ if (SS_DEBUG_MIDI) {
+ printf("SimpleSynth::processEvent - Controller. Chan: %x dataA: %x dataB: %x\n", ev.channel(), ev.dataA(), ev.dataB());
+ for (int i=0; i< ev.len(); i++)
+ printf("%x ", ev.data()[i]);
+ }
+ setController(ev.channel(), ev.dataA(), ev.dataB(), false);
+ return true;
+ case ME_NOTEON:
+ return playNote(ev.channel(), ev.dataA(), ev.dataB());
+ case ME_NOTEOFF:
+ return playNote(ev.channel(), ev.dataA(), 0);
+ case ME_SYSEX:
+ //Debug print
+ if (SS_DEBUG_MIDI) {
+ printf("SimpleSynth::processEvent - Sysex received\n");
+ for (int i=0; i< ev.len(); i++)
+ printf("%x ", ev.data()[i]);
+ printf("\n");
+ }
+ return sysex(ev.len(), ev.data());
+ }
+ return false;
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// setController
+/*!
+ \fn SimpleSynth::setController
+ \brief Called from sequencer indirectly via SimpleSynth::processEvent
+ \brief when the synth is supposed to set a controller value
+ \param channel channel nr
+ \param id controller id
+ \param val value of controller
+ \return false for ok, true for not ok
+ */
+//---------------------------------------------------------
+bool SimpleSynth::setController(int channel, int id, int val)
+ {
+ SS_TRACE_IN
+ if (SS_DEBUG_MIDI) {
+ printf("SimpleSynth::setController - received controller on channel %d, id %d value %d\n", channel, id, val);
+ }
+
+ // Channel controllers:
+ if (id >= SS_FIRST_CHANNEL_CONTROLLER && id <= SS_LAST_CHANNEL_CONTROLLER ) {
+ // Find out which channel we're dealing with:
+ id-= SS_FIRST_CHANNEL_CONTROLLER;
+ int ch = (id / SS_NR_OF_CHANNEL_CONTROLLERS);
+ id = (id % SS_NR_OF_CHANNEL_CONTROLLERS);
+
+ switch (id) {
+ case SS_CHANNEL_CTRL_VOLUME:
+ if (SS_DEBUG_MIDI)
+ printf("Received channel ctrl volume %d for channel %d\n", val, ch);
+ channels[ch].volume_ctrlval = val;
+ updateVolume(ch, val);
+ break;
+ case SS_CHANNEL_CTRL_NOFF:
+ if (SS_DEBUG_MIDI)
+ printf("Received ctrl noff %d for channel %d\n", val, ch);
+ channels[ch].noteoff_ignore = val;
+ break;
+ case SS_CHANNEL_CTRL_PAN:
+ {
+ if (SS_DEBUG_MIDI)
+ printf("Received ctrl pan %d for channel %d\n", val, ch);
+ channels[ch].pan = val;
+ updateBalance(ch, val);
+ break;
+ }
+ case SS_CHANNEL_CTRL_ONOFF:
+ {
+ if (SS_DEBUG_MIDI)
+ printf("Received ctrl onoff %d for channel %d\n", val, ch);
+
+ if (val == false && channels[ch].channel_on == true) {
+ SWITCH_CHAN_STATE(ch, SS_CHANNEL_INACTIVE);
+ channels[ch].channel_on = val;
+ }
+ else if (val == true && channels[ch].channel_on == false) { // if it actually _was_ off:
+ SWITCH_CHAN_STATE(ch, SS_CHANNEL_INACTIVE);
+ channels[ch].playoffset = 0;
+ channels[ch].channel_on = val;
+ }
+ break;
+ }
+ case SS_CHANNEL_SENDFX1:
+ case SS_CHANNEL_SENDFX2:
+ case SS_CHANNEL_SENDFX3:
+ case SS_CHANNEL_SENDFX4:
+ {
+ int fxid = id - SS_CHANNEL_SENDFX1;
+ channels[ch].sendfxlevel[fxid] = (double)val/127.0;
+ break;
+ }
+
+ default:
+ if (SS_DEBUG_MIDI)
+ printf("Unknown controller received for channel %d. id=%d\n", ch, id);
+ break;
+ }
+ }
+ // Master controllers:
+ else if (id >= SS_FIRST_MASTER_CONTROLLER && id <= SS_LAST_MASTER_CONTROLLER) {
+ if (SS_DEBUG_MIDI)
+ printf("Mastervol controller received: %d\n", id);
+ master_vol_ctrlval = val;
+ master_vol = (double) master_vol_ctrlval / SS_MASTER_VOLUME_QUOT;
+ }
+ // Emmm, this one should've been there in the beginning
+ else if (id == CTRL_VOLUME) {
+ if (SS_DEBUG_MIDI) {
+ printf("Ctrl volume received: vol: %d\n", val);
+ }
+ master_vol_ctrlval = val;
+ master_vol = (double) master_vol_ctrlval / SS_MASTER_VOLUME_QUOT;
+ //This one can't be from the gui, update gui:
+ guiUpdateMasterVol(val);
+ }
+ // Plugin controllers:
+ else if (id >= SS_FIRST_PLUGIN_CONTROLLER && id <= SS_LAST_PLUGIN_CONTROLLER) {
+
+ int fxid = (id - SS_FIRST_PLUGIN_CONTROLLER) / SS_NR_OF_PLUGIN_CONTROLLERS;
+ int cmd = (id - SS_FIRST_PLUGIN_CONTROLLER) % SS_NR_OF_PLUGIN_CONTROLLERS;
+
+ // Plugin return-gain:
+ if (cmd == SS_PLUGIN_RETURN) {
+ if (SS_DEBUG_MIDI)
+ printf("Ctrl fx retgain received: fxid: %d val: %d\n", fxid, val);
+ sendEffects[fxid].retgain_ctrlval = val;
+ sendEffects[fxid].retgain = (double) val / 75.0;
+ }
+ // Plugin on/off:
+ else if (cmd == SS_PLUGIN_ONOFF) {
+ if (SS_DEBUG_MIDI)
+ printf("Ctrl fx onoff received: fxid: %d val: %d\n", fxid, val);
+ sendEffects[fxid].state = (SS_SendFXState) val;
+ }
+ }
+ else {
+ if (SS_DEBUG_MIDI)
+ printf("Unknown controller received: %d\n", id);
+ }
+ SS_TRACE_OUT
+ return false;
+ }
+
+//---------------------------------------------------------
+/*!
+ \fn SimpleSynth::setController
+ */
+//---------------------------------------------------------
+bool SimpleSynth::setController(int channel, int id, int val, bool /*fromGui*/)
+ {
+ SS_TRACE_IN
+ bool ret = setController(channel, id, val); //Perhaps TODO... Separate events from the gui
+ SS_TRACE_OUT
+ return ret;
+ }
+//---------------------------------------------------------
+// sysex
+/*!
+ \fn SimpleSynth::sysex
+ \brief Called from sequencer indirectly via SimpleSynth::processEvent
+ \param len length of the sysex data
+ \param data the sysex data
+ \return false for ok, true for not ok
+*/
+//---------------------------------------------------------
+bool SimpleSynth::sysex(int /*len*/, const unsigned char* data)
+ {
+ SS_TRACE_IN
+ int cmd = data[0];
+ switch (cmd) {
+ case SS_SYSEX_LOAD_SAMPLE:
+ {
+ int channel = data[1];
+ //int l = data[2];
+ const char* filename = (const char*)(data+3);
+ if (SS_DEBUG_MIDI) {
+ printf("Sysex cmd: load sample, filename %s, on channel: %d\n", filename, channel);
+ }
+ loadSample(channel, filename);
+ break;
+ }
+ case SS_SYSEX_CLEAR_SAMPLE:
+ {
+ int ch = data[1];
+ if (channels[ch].sample) {
+ SS_State prevstate = synth_state;
+ SWITCH_CHAN_STATE(ch, SS_CHANNEL_INACTIVE);
+ SWITCH_SYNTH_STATE(SS_CLEARING_SAMPLE);
+ delete[] channels[ch].sample->data;
+ delete channels[ch].sample;
+ channels[ch].sample = 0;
+ SWITCH_SYNTH_STATE(prevstate);
+ if (SS_DEBUG_MIDI) {
+ printf("Sysex cmd: clear sample - sample cleared on channel %d\n", ch);
+ }
+ }
+ break;
+ }
+
+ case SS_SYSEX_INIT_DATA:
+ {
+ parseInitData(data);
+ break;
+ }
+
+ case SS_SYSEX_LOAD_SENDEFFECT:
+ {
+ int fxid = data[1];
+ QString lib = (const char*) (data + 2);
+ QString label = (const char*) (data + lib.length() + 3);
+ if (SS_DEBUG_MIDI) {
+ printf("Sysex cmd load effect: %d %s %s\n", fxid, lib.toLatin1().data(), label.toLatin1().data());
+ }
+ initSendEffect(fxid, lib, label);
+ break;
+ }
+
+ case SS_SYSEX_CLEAR_SENDEFFECT:
+ {
+ int fxid = data[1];
+ if (SS_DEBUG_MIDI) {
+ printf("Sysex cmd clear effect: %d\n", fxid);
+ }
+ sendEffects[fxid].state = SS_SENDFX_OFF;
+ cleanupPlugin(fxid);
+ sendEffects[fxid].plugin = 0;
+ break;
+ }
+
+ case SS_SYSEX_SET_PLUGIN_PARAMETER:
+ {
+ int fxid = data[1];
+ int parameter = data[2];
+ int val = data[3];
+ // Write it to the plugin:
+ float floatval = sendEffects[fxid].plugin->convertGuiControlValue(parameter, val);
+ setFxParameter(fxid, parameter, floatval);
+ break;
+ }
+
+ default:
+ if (SS_DEBUG_MIDI)
+ printf("Unknown sysex cmd received: %d\n", cmd);
+ break;
+ }
+ SS_TRACE_OUT
+ return false;
+ }
+
+//---------------------------------------------------------
+// getPatchName
+/*!
+ \fn SimpleSynth::getPatchName
+ \brief Called from host to get names of patches
+ \param index - which patchnr we're about to deliver
+ \return const char* with patchname
+ */
+//---------------------------------------------------------
+const char* SimpleSynth::getPatchName(int /*index*/, int, int) const
+ {
+ SS_TRACE_IN
+ SS_TRACE_OUT
+ return 0;
+ }
+
+//---------------------------------------------------------
+// getPatchInfo
+/*!
+ \fn SimpleSynth::getPatchInfo
+ \brief Called from host to get info about patches
+ \param index - which patchnr we're about to deliver
+ \param patch - if this one is 0, this is the first call, otherwise keep deliver the host patches... or something
+ \return MidiPatch with patch info for host
+ */
+//---------------------------------------------------------
+const MidiPatch* SimpleSynth::getPatchInfo(int index, const MidiPatch* patch) const
+ {
+ SS_TRACE_IN
+ index = 0; patch = 0;
+ SS_TRACE_OUT
+ return 0;
+ }
+
+//---------------------------------------------------------
+// getControllerInfo
+/*!
+ \fn SimpleSynth::getControllerInfo
+ \brief Called from host to collect info about which controllers the synth supports
+ \param index current controller number
+ \param name pointer where name is stored
+ \param controller int pointer where muse controller number is stored
+ \param min int pointer where controller min value is stored
+ \param max int pointer where controller max value is stored
+ \return 0 when done, otherwise return next desired controller index
+ */
+//---------------------------------------------------------
+int SimpleSynth::getControllerInfo(int index, const char** name, int* controller, int* min, int* max) const
+ {
+ SS_TRACE_IN
+ if (index >= SS_NR_OF_CONTROLLERS) {
+ SS_TRACE_OUT
+ return 0;
+ }
+
+ *name = controllers[index].name.c_str();
+ *controller = controllers[index].num;
+ *min = controllers[index].min;
+ *max = controllers[index].max;
+
+ if (SS_DEBUG_MIDI) {
+ printf("setting controller info: index %d name %s controller %d min %d max %d\n", index, *name, *controller, *min, *max);
+ }
+ SS_TRACE_OUT
+ return (index +1);
+ }
+
+//---------------------------------------------------------
+// process
+/*!
+ \fn SimpleSynth::process
+ \brief Realtime function where the processing actually occurs
+ \param channels - audio data
+ \param offset - sample offset
+ \param len - nr of samples to process
+ */
+//---------------------------------------------------------
+void SimpleSynth::process(float** out, int offset, int len)
+ {
+ //Process messages from the gui
+ while (gui->fifoSize()) {
+ MidiEvent ev = gui->readEvent();
+ if (ev.type() == ME_SYSEX) {
+ sysex(ev.len(), ev.data());
+ sendEvent(ev);
+ }
+ else if (ev.type() == ME_CONTROLLER) {
+ setController(ev.channel(), ev.dataA(), ev.dataB(), true);
+ sendEvent(ev);
+ }
+ else {
+ if (SS_DEBUG)
+ printf("SimpleSynth::process(): unknown event, type: %d\n", ev.type());
+ }
+ }
+
+ if (synth_state == SS_RUNNING) {
+
+ //Temporary mix-doubles
+ double out1, out2;
+ //double ltemp, rtemp;
+ float* data;
+ // Velocity factor:
+ double gain_factor;
+
+
+ // Clear send-channels. Skips if fx not turned on
+ for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
+ if (sendEffects[i].state == SS_SENDFX_ON) {
+ memset(sendFxLineOut[i][0], 0, SS_SENDFX_BUFFER_SIZE * sizeof(float));
+ memset(sendFxLineOut[i][1], 0, SS_SENDFX_BUFFER_SIZE * sizeof(float));
+ }
+ }
+
+
+ memset(out[0] + offset, 0, len * sizeof(float));
+ memset(out[1] + offset, 0, len * sizeof(float));
+
+ //Process 1 channel at a time
+ for (int ch=0; ch < SS_NR_OF_CHANNELS; ch++) {
+ // If channels is turned off, skip:
+ if (channels[ch].channel_on == false)
+ continue;
+
+ //If sample isn't playing, skip:
+ if (channels[ch].state == SS_SAMPLE_PLAYING) {
+ memset(processBuffer[0], 0, SS_PROCESS_BUFFER_SIZE * sizeof(double));
+ memset(processBuffer[1], 0, SS_PROCESS_BUFFER_SIZE * sizeof(double));
+
+ for (int i=0; i<len; i++) {
+ // Current channel sample data:
+ data = channels[ch].sample->data;
+ gain_factor = channels[ch].gain_factor;
+ // Current velocity factor:
+
+ if (channels[ch].sample->channels == 2) {
+ //
+ // Stereo sample:
+ //
+ // Add from sample:
+ out1 = (double) (data[channels[ch].playoffset] * gain_factor * channels[ch].balanceFactorL);
+ out2 = (double) (data[channels[ch].playoffset + 1] * gain_factor * channels[ch].balanceFactorR);
+ channels[ch].playoffset += 2;
+ }
+ else {
+ //
+ // Mono sample:
+ //
+ out1 = (double) (data[channels[ch].playoffset] * gain_factor * channels[ch].balanceFactorL);
+ out2 = (double) (data[channels[ch].playoffset] * gain_factor * channels[ch].balanceFactorR);
+ channels[ch].playoffset++;
+ }
+
+ processBuffer[0][i] = out1;
+ processBuffer[1][i] = out2;
+
+ // If send-effects tap is on, tap signal to respective lineout channel
+ for (int j=0; j<SS_NR_OF_SENDEFFECTS; j++) {
+ if (channels[ch].sendfxlevel[j] != 0.0) {
+ //If the effect has 2 inputs (stereo in):
+ if (sendEffects[j].inputs == 2) {
+ sendFxLineOut[j][0][i]+= (out1 * channels[ch].sendfxlevel[j]);
+ sendFxLineOut[j][1][i]+= (out2 * channels[ch].sendfxlevel[j]);
+ }
+ //If the effect is mono (1 input), only use first fxLineOut
+ else if (sendEffects[j].inputs == 1) {
+ sendFxLineOut[j][0][i]+= ((out1 + out2) * channels[ch].sendfxlevel[j] / 2.0);
+ }
+ //Effects with 0 or >2 inputs are ignored
+ }
+ }
+
+ //
+ // If we've reached the last sample, set state to inactive
+ //
+ if (channels[ch].playoffset >= channels[ch].sample->samples) {
+ SWITCH_CHAN_STATE(ch, SS_CHANNEL_INACTIVE);
+ channels[ch].playoffset = 0;
+ break;
+ }
+ }
+ // Add contribution for this channel, for this frame, to final result:
+ for (int i=0; i<len; i++) {
+ out[0][i+offset]+=processBuffer[0][i];
+ out[1][i+offset]+=processBuffer[1][i];
+ }
+ }
+ }
+ // Do something funny with the sendies:
+ for (int j=0; j<SS_NR_OF_SENDEFFECTS; j++) {
+ if (sendEffects[j].state == SS_SENDFX_ON) {
+ sendEffects[j].plugin->process(len);
+ for (int i=0; i<len; i++) {
+ //Effect has mono output:
+ if (sendEffects[j].outputs == 1) {
+ //Add the result to both channels:
+ out[0][i+offset]+=((sendEffects[j].retgain * sendFxReturn[j][0][i]) / 2.0);
+ out[1][i+offset]+=((sendEffects[j].retgain * sendFxReturn[j][0][i]) / 2.0);
+ }
+ else if (sendEffects[j].outputs == 2) {
+ // Effect has stereo output
+ out[0][i+offset]+=(sendEffects[j].retgain * sendFxReturn[j][0][i]);
+ out[1][i+offset]+=(sendEffects[j].retgain * sendFxReturn[j][1][i]);
+ }
+ }
+ }
+ }
+ // Finally master gain:
+ for (int i=0; i<len; i++) {
+ out[0][i+offset] = (out[0][i+offset] * master_vol);
+ out[1][i+offset] = (out[1][i+offset] * master_vol);
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// showGui
+/*!
+ \fn SimpleSynth::showGui
+ \brief Displays or hides the gui window
+ \param val true or false = gui shown or hidden
+ */
+//---------------------------------------------------------
+void SimpleSynth::showGui(bool val)
+ {
+ SS_TRACE_IN
+ gui->setShown(val);
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+/*!
+ \fn SimpleSynth::init
+ \brief Initializes the SimpleSynth
+ \param name string set to caption in the gui dialog
+ \return true if successful, false if unsuccessful
+ */
+//---------------------------------------------------------
+bool SimpleSynth::init(const char* name)
+ {
+ SS_TRACE_IN
+ SWITCH_SYNTH_STATE(SS_INITIALIZING);
+ gui = new SimpleSynthGui();
+ gui->show();
+ gui->setWindowTitle(name);
+ SWITCH_SYNTH_STATE(SS_RUNNING);
+ SS_TRACE_OUT
+ return true;
+ }
+
+//---------------------------------------------------------
+/*!
+ \fn SimpleSynth::getInitData
+ \brief Data for reinitialization of SimpleSynth when loading project
+ \param n - number of chars used in the data
+ \param data - data that is sent as a sysex to the synth on reload of project
+ */
+//---------------------------------------------------------
+void SimpleSynth::getInitData(int* n, const unsigned char** data) const
+ {
+ SS_TRACE_IN
+ // Calculate length of data
+ // For each channel, we need to store volume, pan, noff, onoff
+ int len = SS_NR_OF_CHANNEL_CONTROLLERS * SS_NR_OF_CHANNELS;
+ // Sampledata: filenames len
+ for (int i=0; i<SS_NR_OF_CHANNELS; i++) {
+ if (channels[i].sample) {
+ int filenamelen = strlen(channels[i].sample->filename.c_str()) + 2;
+ len+=filenamelen;
+ }
+ else
+ len++; //Add place for SS_NO_SAMPLE
+ }
+ len+=3; // 1 place for SS_SYSEX_INIT_DATA, 1 byte for master vol, 1 byte for version data
+
+ // Effect data length
+ len++; //Add place for SS_SYSEX_INIT_DATA_VERSION, as control
+
+ for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
+ Plugin* plugin = sendEffects[i].plugin;
+ if (plugin) {
+ int namelen = plugin->lib().size() + 2;
+ int labelnamelen = plugin->label().size() + 2;
+ len+=(namelen + labelnamelen);
+
+ len+=3; //1 byte for nr of parameters, 1 byte for return gain, 1 byte for effect on/off
+ len+=sendEffects[i].nrofparameters; // 1 byte for each parameter value
+ }
+ else {
+ len++; //place for SS_NO_PLUGIN
+ }
+ }
+
+ // First, SS_SYSEX_INIT_DATA
+ byte* buffer = new byte[len];
+ buffer[0] = SS_SYSEX_INIT_DATA;
+ buffer[1] = SS_SYSEX_INIT_DATA_VERSION;
+ if (SS_DEBUG_INIT) {
+ printf("Length of init data: %d\n", len);
+ printf("buffer[0] - SS_SYSEX_INIT_DATA: %d\n", SS_SYSEX_INIT_DATA);
+ printf("buffer[1] - SS_SYSEX_INIT_DATA_VERSION: %d\n", SS_SYSEX_INIT_DATA_VERSION);
+ }
+ int i = 2;
+ // All channels:
+ // 0 - volume ctrlval (0-127)
+ // 1 - pan (0-127)
+ // 2 - noff ignore (0-1)
+ // 3 - channel on/off (0-1)
+ // 4 - 7 - sendfx 1-4 (0-127)
+ // 8 - len of filename, n
+ // 9 - 9+n - filename
+ for (int ch=0; ch<SS_NR_OF_CHANNELS; ch++) {
+ buffer[i] = (byte) channels[ch].volume_ctrlval;
+ buffer[i+1] = (byte) channels[ch].pan;
+ buffer[i+2] = (byte) channels[ch].noteoff_ignore;
+ buffer[i+3] = (byte) channels[ch].channel_on;
+ buffer[i+4] = (byte) round(channels[ch].sendfxlevel[0] * 127.0);
+ buffer[i+5] = (byte) round(channels[ch].sendfxlevel[1] * 127.0);
+ buffer[i+6] = (byte) round(channels[ch].sendfxlevel[2] * 127.0);
+ buffer[i+7] = (byte) round(channels[ch].sendfxlevel[3] * 127.0);
+
+ if (SS_DEBUG_INIT) {
+ printf("Channel %d:\n", ch);
+ printf("buffer[%d] - channels[ch].volume_ctrlval = \t%d\n", i, channels[ch].volume_ctrlval);
+ printf("buffer[%d] - channels[ch].pan = \t\t%d\n", i+1, channels[ch].pan);
+ printf("buffer[%d] - channels[ch].noteoff_ignore = \t%d\n", i+2, channels[ch].noteoff_ignore );
+ printf("buffer[%d] - channels[ch].channel_on = \t%d\n", i+3, channels[ch].channel_on);
+ for (int j= i+4; j < i+8; j++) {
+ printf("buffer[%d] - channels[ch].sendfxlevel[%d]= \t%d\n", j, j-i-4, (int)round(channels[ch].sendfxlevel[j-i-4] * 127.0));
+ }
+ }
+ if (channels[ch].sample) {
+ int filenamelen = strlen(channels[ch].sample->filename.c_str()) + 1;
+ buffer[i+8] = (byte) filenamelen;
+ memcpy((buffer+(i+9)), channels[ch].sample->filename.c_str(), filenamelen);
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d] - filenamelen: %d\n", i+8, filenamelen);
+ printf("buffer[%d] - buffer[%d] - filename: ", (i+9), (i+9) + filenamelen - 1);
+ for (int j = i+9; j< i+9+filenamelen; j++) {
+ printf("%c",buffer[j]);
+ }
+ printf("\n");
+ }
+ i+= (SS_NR_OF_CHANNEL_CONTROLLERS + 1 + filenamelen);
+ }
+ else {
+ buffer[i+8] = SS_NO_SAMPLE;
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d]: SS_NO_SAMPLE: - %d\n", i+8, SS_NO_SAMPLE);
+ }
+ i+= (SS_NR_OF_CHANNEL_CONTROLLERS + 1);
+ }
+ }
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d]: Master vol: - %d\n", i, master_vol_ctrlval);
+ }
+ buffer[i] = master_vol_ctrlval;
+ *(data) = buffer; *n = len;
+ i++;
+
+ //Send effects:
+ buffer[i] = SS_SYSEX_INIT_DATA_VERSION; //Just for check
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d]: Control value, SS_SYSEX_INIT_DATA_VERSION\n", i);
+ }
+
+ i++;
+ for (int j=0; j<SS_NR_OF_SENDEFFECTS; j++) {
+ if (sendEffects[j].plugin) {
+ int labelnamelen = sendEffects[j].plugin->label().size() + 1;
+ buffer[i] = labelnamelen;
+ memcpy((buffer+i+1), sendEffects[j].plugin->label().toLatin1().data(), labelnamelen);
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d] - labelnamelen: %d\n", i, labelnamelen);
+ printf("buffer[%d] - buffer[%d] - filename: ", (i+1), (i+1) + labelnamelen - 1);
+ for (int k = i+1; k < i+1+labelnamelen; k++) {
+ printf("%c",buffer[k]);
+ }
+ printf("\n");
+ }
+
+ i+=(labelnamelen + 1);
+
+ int namelen = sendEffects[j].plugin->lib().size() + 1;
+ buffer[i] = namelen;
+ memcpy((buffer+i+1), sendEffects[j].plugin->lib().toLatin1().data(), namelen);
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d] - libnamelen : %d\n", i, namelen);
+ printf("buffer[%d] - buffer[%d] - filename: ", (i+1), (i+1) + namelen - 1);
+ for (int k = i+1; k < i+1+namelen; k++) {
+ printf("%c",buffer[k]);
+ }
+ printf("\n");
+ }
+
+ i+=(namelen + 1);
+
+ buffer[i]=sendEffects[j].nrofparameters;
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d]: sendEffects[%d].nrofparameters=%d\n", i, j, buffer[i]);
+ }
+ i++;
+
+ buffer[i]=sendEffects[j].retgain_ctrlval;
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d]: sendEffects[%d].retgain_ctrlval=%d\n", i, j, buffer[i]);
+ }
+ i++;
+
+ for (int k=0; k<sendEffects[j].nrofparameters; k++) {
+ //TODO: Convert to 127-scale
+ buffer[i] = sendEffects[j].plugin->getGuiControlValue(k);
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d]: sendEffects[%d].parameterval[%d]=%d\n", i, j, k, buffer[i]);
+ }
+ i++;
+ }
+ }
+ // No plugin loaded:
+ else {
+ buffer[i] = SS_NO_PLUGIN;
+ i++;
+ if (SS_DEBUG_INIT) {
+ printf("buffer[%d]: SS_NO_PLUGIN\n", i);
+ }
+ }
+ }
+
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::parseInitData()
+ */
+void SimpleSynth::parseInitData(const unsigned char* data)
+ {
+ SS_TRACE_IN
+ //int len = strlen((const char*)data);
+ if (SS_DEBUG_INIT) {
+ printf("buffer[1], SS_SYSEX_INIT_DATA_VERSION=%d\n", *(data+1));
+ }
+ const byte* ptr = data+2;
+ for (int ch=0; ch<SS_NR_OF_CHANNELS; ch++) {
+ channels[ch].volume_ctrlval = (byte) *(ptr);
+
+ if (SS_DEBUG_INIT) {
+ printf("Channel %d:\n", ch);
+ printf("buffer[%d] - channels[ch].volume_ctrlval = \t%d\n", ptr-data, *ptr);
+ printf("buffer[%d] - channels[ch].pan = \t\t%d\n", ptr-data+1, *(ptr+1));
+ printf("buffer[%d] - channels[ch].noteoff_ignore = \t%d\n", ptr-data+2, *(ptr+2));
+ printf("buffer[%d] - channels[ch].channel_on = \t%d\n", ptr-data+3, *(ptr+3));
+ }
+ updateVolume(ch, *(ptr));
+ guiUpdateVolume(ch, *(ptr));
+
+ channels[ch].pan = *(ptr+1);
+ updateBalance(ch, *(ptr+1));
+ guiUpdateBalance(ch, *(ptr+1));
+
+ channels[ch].noteoff_ignore = *(ptr+2);
+ guiUpdateNoff(ch, *(ptr+2));
+
+ channels[ch].channel_on = *(ptr+3);
+ guiUpdateChoff(ch, *(ptr+3));
+
+ ptr+=4;
+
+ for (int i=0; i<4; i++) {
+ channels[ch].sendfxlevel[i] = (float) (*(ptr)/127.0);
+ guiUpdateSendFxLevel(ch, i, *(ptr));
+ ptr++;
+ }
+
+ bool hasSample = *(ptr);
+ ptr++;
+
+ channels[ch].sample = 0;
+ channels[ch].playoffset = 0;
+ SWITCH_CHAN_STATE(ch, SS_CHANNEL_INACTIVE);
+ if (SS_DEBUG_INIT) {
+ printf("parseInitData: channel %d, volume: %f pan: %d bfL %f bfR %f chON %d s1: %f s2: %f s3: %f s4: %f\n",
+ ch,
+ channels[ch].volume,
+ channels[ch].pan,
+ channels[ch].balanceFactorL,
+ channels[ch].balanceFactorR,
+ channels[ch].channel_on,
+ channels[ch].sendfxlevel[0],
+ channels[ch].sendfxlevel[1],
+ channels[ch].sendfxlevel[2],
+ channels[ch].sendfxlevel[3]
+ );
+ }
+ if (hasSample) {
+ std::string filenametmp = (const char*) ptr;
+ ptr+= strlen(filenametmp.c_str()) + 1;
+ //printf("We should load %s\n", filenametmp.c_str());
+ loadSample(ch, filenametmp.c_str());
+ }
+ }
+ //Master vol:
+ master_vol_ctrlval = *(ptr);
+ master_vol = (double) master_vol_ctrlval / SS_MASTER_VOLUME_QUOT;
+ guiUpdateMasterVol(master_vol_ctrlval);
+ if (SS_DEBUG_INIT) {
+ printf("Master vol: %d\n", master_vol_ctrlval);
+ }
+ ptr++;
+
+ // Effects:
+ if (*(ptr) != SS_SYSEX_INIT_DATA_VERSION) {
+ fprintf(stderr, "Error loading init data - control byte not found. Skipping...\n");
+ SS_TRACE_OUT
+ return;
+ }
+ ptr++;
+
+ for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
+ int labelnamelen = *(ptr);
+
+ if (labelnamelen != SS_NO_PLUGIN) {
+ ptr++;
+ std::string labelnametmp = (const char*) ptr;
+ ptr+= labelnamelen;
+
+ //int libnamelen = *(ptr);
+ ptr++;
+ std::string libnametmp = (const char*) ptr;
+ ptr+= strlen(libnametmp.c_str()) + 1;
+
+
+ initSendEffect(i, libnametmp.c_str(), labelnametmp.c_str());
+ //initSendEffect(0, "cmt", "freeverb3");
+
+ byte params = *(ptr);
+ byte retgain = *(ptr+1);
+ ptr+=2;
+
+ sendEffects[i].nrofparameters = params;
+
+ sendEffects[i].retgain_ctrlval = retgain;
+ sendEffects[i].retgain = retgain;
+ sendEffects[i].retgain = (double) retgain/ 75.0;
+ MidiEvent ev(0, 0, ME_CONTROLLER, SS_PLUGIN_RETURNLEVEL_CONTROLLER(i), retgain);
+ gui->writeEvent(ev);
+
+ for (int j=0; j<params; j++) {
+ setFxParameter(i, j, sendEffects[i].plugin->convertGuiControlValue(j, *(ptr)));
+ ptr++;
+ }
+ }
+ else {
+ ptr++;
+ }
+ }
+
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SimpleSynth::loadSample(int chno, const char* filename)
+ */
+bool SimpleSynth::loadSample(int chno, const char* filename)
+ {
+ SS_TRACE_IN
+ SS_Channel* ch = &channels[chno];
+
+ // Thread stuff:
+ SS_SampleLoader* loader = new SS_SampleLoader;
+ loader->channel = ch;
+ loader->filename = std::string(filename);
+ loader->ch_no = chno;
+ if (SS_DEBUG) {
+ printf("Loader filename is: %s\n", filename);
+ }
+ pthread_t sampleThread;
+ pthread_attr_t* attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t));
+ pthread_attr_init(attributes);
+ pthread_attr_setdetachstate(attributes, PTHREAD_CREATE_DETACHED);
+ if (pthread_create(&sampleThread, attributes, ::loadSampleThread, (void*) loader)) {
+ perror("creating thread failed:");
+ pthread_attr_destroy(attributes);
+ delete loader;
+ return false;
+ }
+
+ pthread_attr_destroy(attributes);
+ SS_TRACE_OUT
+ return true;
+ }
+
+/*!
+ \fn loadSampleThread(void* p)
+ \brief Since process needs to respond withing a certain time, loading of samples need to be done in a separate thread
+ */
+static void* loadSampleThread(void* p)
+ {
+ SS_TRACE_IN
+ pthread_mutex_lock(&SS_LoaderMutex);
+
+ // Crit section:
+ SS_State prevState = synth_state;
+ SWITCH_SYNTH_STATE(SS_LOADING_SAMPLE);
+ SS_SampleLoader* loader = (SS_SampleLoader*) p;
+ SS_Channel* ch = loader->channel;
+ int ch_no = loader->ch_no;
+
+ if (ch->sample) {
+ delete[] ch->sample->data;
+ delete ch->sample;
+ }
+ ch->sample = new SS_Sample;
+ SS_Sample* smp = ch->sample;
+
+ SNDFILE* sf;
+ const char* filename = loader->filename.c_str();
+ SF_INFO sfi;
+
+ if (SS_DEBUG)
+ printf("loadSampleThread: filename = %s\n", filename);
+
+ sf = sf_open(filename, SFM_READ, &sfi);
+ if (sf == 0) {
+ fprintf(stderr,"Error opening file: %s\n", filename);
+ SWITCH_SYNTH_STATE(prevState);
+ simplesynth_ptr->guiSendSampleLoaded(false, loader->ch_no, filename);
+ delete ch->sample; ch->sample = 0;
+ delete loader;
+ pthread_mutex_unlock(&SS_LoaderMutex);
+ SS_TRACE_OUT
+ pthread_exit(0);
+ }
+
+ //Print some info:
+ if (SS_DEBUG) {
+ printf("Sample info:\n");
+ printf("Frames: \t%ld\n", (long) sfi.frames);
+ printf("Channels: \t%d\n", sfi.channels);
+ printf("Samplerate: \t%d\n", sfi.samplerate);
+ }
+
+ //
+ // Allocate and read the thingie
+ //
+
+ // If current samplerate is the same as MusE's:
+ if (SS_samplerate == sfi.samplerate) {
+ smp->data = new float[sfi.channels * sfi.frames];
+ sf_count_t n = sf_readf_float(sf, smp->data, sfi.frames);
+ smp->frames = sfi.frames;
+ smp->samples = (n * sfi.channels);
+ smp->channels = sfi.channels;
+ if (SS_DEBUG) {
+ printf("%ld frames read\n", (long) n);
+ }
+ }
+ else // otherwise, resample:
+ {
+ smp->channels = sfi.channels;
+ // Get new nr of frames:
+ double srcratio = (double) SS_samplerate/ (double) sfi.samplerate;
+ smp->frames = (long) floor(((double) sfi.frames * srcratio));
+ smp->frames = (sfi.channels == 1 ? smp->frames * 2 : smp->frames ); // Double nr of new frames if mono->stereo
+ smp->samples = smp->frames * smp->channels;
+
+ if (SS_DEBUG) {
+ printf("Resampling from %ld frames to %ld frames - srcration: %lf\n", sfi.frames, smp->frames, srcratio);
+ printf("Nr of new samples: %ld\n", smp->samples);
+ }
+
+ // Read to temporary:
+ float temp[sfi.frames * sfi.channels];
+ int frames_read = sf_readf_float(sf, temp, sfi.frames);
+ if (frames_read != sfi.frames) {
+ fprintf(stderr,"Error reading sample %s\n", filename);
+ simplesynth_ptr->guiSendSampleLoaded(false, loader->ch_no, filename);
+ sf_close(sf);
+ SWITCH_SYNTH_STATE(prevState);
+ delete ch->sample; ch->sample = 0;
+ delete loader;
+ pthread_mutex_unlock(&SS_LoaderMutex);
+ pthread_exit(0);
+ SS_TRACE_OUT
+ }
+
+ // Allocate mem for the new one
+ smp->data = new float[smp->frames * smp->channels];
+ memset(smp->data, 0, sizeof(float)* smp->frames * smp->channels);
+
+ // libsamplerate & co (secret rabbits in the code!)
+ SRC_DATA srcdata;
+ srcdata.data_in = temp;
+ srcdata.data_out = smp->data;
+ srcdata.input_frames = sfi.frames;
+ srcdata.output_frames = smp->frames;
+ srcdata.src_ratio = (double) SS_samplerate / (double) sfi.samplerate;
+
+ if (SS_DEBUG) {
+ printf("Converting sample....\n");
+ }
+
+ if (src_simple(&srcdata, SRC_SINC_BEST_QUALITY, sfi.channels)) {
+ SS_ERROR("Error when resampling, ignoring current sample");
+ //TODO: deallocate and stuff
+ }
+ else if (SS_DEBUG) {
+ printf("Sample converted. %ld input frames used, %ld output frames generated\n",
+ srcdata.input_frames_used,
+ srcdata.output_frames_gen);
+ }
+ }
+ //Just close the dam thing
+ sf_close(sf);
+ SWITCH_SYNTH_STATE(prevState);
+ ch->sample->filename = loader->filename;
+ simplesynth_ptr->guiSendSampleLoaded(true, ch_no, filename);
+ delete loader;
+ pthread_mutex_unlock(&SS_LoaderMutex);
+ SS_TRACE_OUT
+ pthread_exit(0);
+ }
+
+
+static Mess* instantiate(int sr, QWidget*, const char* name)
+ {
+ printf("SimpleSynth sampleRate %d\n", sr);
+ SimpleSynth* synth = new SimpleSynth(sr);
+ if (!synth->init(name)) {
+ delete synth;
+ synth = 0;
+ }
+ return synth;
+ }
+
+
+/*!
+ \fn SimpleSynth::updateBalance(int pan)
+ */
+void SimpleSynth::updateBalance(int ch, int val)
+ {
+ SS_TRACE_IN
+ channels[ch].pan = val;
+
+ // Balance:
+ channels[ch].balanceFactorL = 1.0;
+ channels[ch].balanceFactorR = 1.0;
+ double offset = 0;
+ int dev = val - 64;
+ offset = (double) dev / 64.0;
+ if (offset < 0) {
+ channels[ch].balanceFactorR = 1.0 + offset;
+ }
+ else {
+ channels[ch].balanceFactorL = 1.0 - offset;
+ }
+
+ if (SS_DEBUG_MIDI)
+ printf("balanceFactorL %f balanceFactorR %f\n", channels[ch].balanceFactorL, channels[ch].balanceFactorR);
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::updateVolume(int invol_ctrlval)
+ */
+void SimpleSynth::updateVolume(int ch, int invol_ctrlval)
+ {
+ SS_TRACE_IN
+ channels[ch].volume = (double)invol_ctrlval/ (double) SS_CHANNEL_VOLUME_QUOT;
+ channels[ch].volume_ctrlval = invol_ctrlval;
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::guiUpdateBalance(int ch, int bal)
+ */
+void SimpleSynth::guiUpdateBalance(int ch, int bal)
+ {
+ SS_TRACE_IN
+ MidiEvent ev(0, ch, ME_CONTROLLER, SS_CHANNEL_PAN_CONTROLLER(ch), bal);
+ gui->writeEvent(ev);
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::guiUpdateVolume(int ch, int val)
+ */
+void SimpleSynth::guiUpdateVolume(int ch, int val)
+ {
+ SS_TRACE_IN
+ MidiEvent ev(0, 0, ME_CONTROLLER, SS_CHANNEL_VOLUME_CONTROLLER(ch), val);
+ gui->writeEvent(ev);
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::guiUpdateNoff(bool b)
+ */
+void SimpleSynth::guiUpdateNoff(int ch, bool b)
+ {
+ SS_TRACE_IN
+ MidiEvent ev(0, 0, ME_CONTROLLER, SS_CHANNEL_NOFF_CONTROLLER(ch), b);
+ gui->writeEvent(ev);
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::guiUpdateChoff(int ch, bool b)
+ */
+void SimpleSynth::guiUpdateChoff(int ch, bool b)
+ {
+ SS_TRACE_IN
+ MidiEvent ev(0, 0, ME_CONTROLLER, SS_CHANNEL_ONOFF_CONTROLLER(ch), b);
+ gui->writeEvent(ev);
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::guiUpdateMasterVol(int val)
+ */
+void SimpleSynth::guiUpdateMasterVol(int val)
+ {
+ SS_TRACE_IN
+ MidiEvent ev(0, 0, ME_CONTROLLER, SS_MASTER_CTRL_VOLUME, val);
+ gui->writeEvent(ev);
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SimpleSynth::guiUpdateSendFxLevel(int fxid, int level)
+ */
+void SimpleSynth::guiUpdateSendFxLevel(int channel, int fxid, int level)
+ {
+ SS_TRACE_IN
+ MidiEvent ev(0, 0, ME_CONTROLLER, SS_CHANNEL_SENDFX_CONTROLLER(channel, fxid), level);
+ gui->writeEvent(ev);
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::guiSendSampleLoaded(int ch, const char* filename)
+ */
+void SimpleSynth::guiSendSampleLoaded(bool success, int ch, const char* filename)
+ {
+ SS_TRACE_IN
+ int len = strlen(filename) + 3; //2 + filenamelen + 1;
+ byte out[len];
+
+ if (success) {
+ out[0] = SS_SYSEX_LOAD_SAMPLE_OK;
+ }
+ else {
+ out[0] = SS_SYSEX_LOAD_SAMPLE_ERROR;
+ }
+ out[1] = ch;
+ memcpy(out+2, filename, strlen(filename)+1);
+ MidiEvent ev(0, ME_SYSEX, out, len);
+ gui->writeEvent(ev);
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::guiSendError(const char* errorstring)
+ */
+void SimpleSynth::guiSendError(const char* errorstring)
+ {
+ SS_TRACE_IN
+ byte out[strlen(errorstring)+2];
+ out[0] = SS_SYSEX_ERRORMSG;
+ memcpy(out+1, errorstring, strlen(errorstring) +1);
+ SS_TRACE_OUT
+ }
+
+extern "C"
+ {
+ static MESS descriptor = {
+ "SimpleSynth",
+ "Mathias Lundgren (lunar_shuttle@users.sf.net)",
+ "0.1", //Version string
+ MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
+ instantiate,
+ };
+ const MESS* mess_descriptor() { return &descriptor; }
+ }
+
+
+/*!
+ \fn SimpleSynth::initSendEffect(int sendeffectid, QString lib, QString name)
+ */
+bool SimpleSynth::initSendEffect(int id, QString lib, QString name)
+ {
+ SS_TRACE_IN
+ bool success = false;
+ if (sendEffects[id].plugin) {
+ //Cleanup if one was already there:
+ cleanupPlugin(id);
+ }
+ sendEffects[id].plugin = (LadspaPlugin*) plugins.find(lib, name);
+ LadspaPlugin* plugin = sendEffects[id].plugin;
+ if (plugin) { //We found one
+
+ sendEffects[id].inputs = plugin->inports();
+ sendEffects[id].outputs = plugin->outports();
+
+ if (plugin->instantiate()) {
+ SS_DBG2("Plugin instantiated", name.toLatin1().data());
+ SS_DBG_I("Parameters", plugin->parameter());
+ SS_DBG_I("No of inputs", plugin->inports());
+ SS_DBG_I("No of outputs",plugin->outports());
+ SS_DBG_I("Inplace-capable", plugin->inPlaceCapable());
+
+ // Connect inputs/outputs:
+ // If single output/input, only use first channel in sendFxLineOut/sendFxReturn
+ SS_DBG("Connecting ports...");
+ plugin->connectInport(0, sendFxLineOut[id][0]);
+ if (plugin->inports() == 2)
+ plugin->connectInport(1, sendFxLineOut[id][1]);
+ else if (plugin->inports() > 2) {
+ fprintf(stderr, "Plugin has more than 2 inputs, not supported\n");
+ }
+
+ plugin->connectOutport(0, sendFxReturn[id][0]);
+ if (plugin->outports() == 2)
+ plugin->connectOutport(1, sendFxReturn[id][1]);
+ else if (plugin->outports() > 2) {
+ fprintf(stderr, "Plugin has more than 2 outputs, not supported\n");
+ }
+ SS_DBG("Ports connected");
+ if (plugin->start()) {
+ sendEffects[id].state = SS_SENDFX_ON;
+ success = true;
+
+ int n = plugin->parameter();
+ sendEffects[id].nrofparameters = n;
+
+ // This is not nice, but freeverb doesn't want to play until some values are set:
+ if (name == "freeverb3") {
+ setFxParameter(id, 2, 0.5);
+ setFxParameter(id, 3, 0.5);
+ setFxParameter(id, 4, 0.5);
+ guiUpdateFxParameter(id, 2, 0.5);
+ guiUpdateFxParameter(id, 3, 0.5);
+ guiUpdateFxParameter(id, 4, 0.5);
+ }
+ }
+ //TODO: cleanup if failed
+ }
+ }
+ //Notify gui
+ int len = 3;
+ byte out[len];
+ out[0] = SS_SYSEX_LOAD_SENDEFFECT_OK;
+ out[1] = id;
+ int j=0;
+ for (iPlugin i = plugins.begin(); i!=plugins.end(); i++, j++) {
+ if ((*i)->lib() == plugin->lib() && (*i)->label() == plugin->label()) {
+ out[2] = j;
+ MidiEvent ev(0, ME_SYSEX, out, len);
+ gui->writeEvent(ev);
+ }
+ }
+
+ if (!success) {
+ QString errorString = "Error loading plugin \"" + plugin->label() + "\"";
+ guiSendError(errorString.toLatin1().data());
+ }
+ return success;
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::setSendFxLevel(int channel, int effectid, double val)
+ */
+void SimpleSynth::setSendFxLevel(int channel, int effectid, double val)
+ {
+ SS_TRACE_IN
+ channels[channel].sendfxlevel[effectid] = val;
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::cleanupPlugin(int id)
+ */
+void SimpleSynth::cleanupPlugin(int id)
+ {
+ SS_TRACE_IN
+ LadspaPlugin* plugin = sendEffects[id].plugin;
+ plugin->stop();
+ SS_DBG2("Stopped fx", plugin->label().toLatin1().data());
+ sendEffects[id].nrofparameters = 0;
+
+ byte d[2];
+ d[0] = SS_SYSEX_CLEAR_SENDEFFECT_OK;
+ d[1] = id;
+ MidiEvent ev(0, ME_SYSEX, d, 2);
+ gui->writeEvent(ev);
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynth::setFxParameter(int fxid, int param, float val)
+ \brief Set fx-parameter on plugin and notify gui
+ */
+void SimpleSynth::setFxParameter(int fxid, int param, float val)
+ {
+ SS_TRACE_IN
+ LadspaPlugin* plugin = sendEffects[fxid].plugin;
+ if (SS_DEBUG_LADSPA) {
+ printf("Setting fx parameter: %f\n", val);
+ }
+ plugin->setParam(param, val);
+ //sendEffects[fxid].parameter[param] = val;
+ //guiUpdateFxParameter(fxid, param, val);
+ SS_TRACE_OUT
+ }
+
+
+
+/*!
+ \fn SimpleSynth::guiUpdateFxParameter(int fxid, int param, float val)
+ \brief Notify gui of changed fx-parameter
+ */
+void SimpleSynth::guiUpdateFxParameter(int fxid, int param, float val)
+ {
+ SS_TRACE_IN
+ LadspaPlugin* plugin = sendEffects[fxid].plugin;
+ float min, max;
+ plugin->range(param, &min, &max);
+ //offset:
+ val-= min;
+
+ int intval = plugin->getGuiControlValue(param);
+ /*if (plugin->isLog(param)) {
+ intval = SS_map_logdomain2pluginparam(logf(val/(max - min) + min));
+ }
+ else if (plugin->isBool(param)) {
+ intval = (int) val;
+ }
+ else {
+ float scale = SS_PLUGIN_PARAM_MAX / (max - min);
+ intval = (int) ((val - min) * scale);
+ }*/
+ if (SS_DEBUG_MIDI) {
+ printf("Updating gui, fx parameter. fxid=%d, param=%d val=%d\n", fxid, param, intval);
+ }
+
+ byte d[4];
+ d[0] = SS_SYSEX_SET_PLUGIN_PARAMETER_OK;
+ d[1] = fxid;
+ d[2] = param;
+ d[3] = intval;
+ MidiEvent ev(0, ME_SYSEX, d, 4);
+ gui->writeEvent(ev);
+ SS_TRACE_OUT
+ }
+
+
diff --git a/muse/synti/simpledrums/simpledrums.h b/muse/synti/simpledrums/simpledrums.h
new file mode 100644
index 00000000..f27b908a
--- /dev/null
+++ b/muse/synti/simpledrums/simpledrums.h
@@ -0,0 +1,171 @@
+//
+// C++ Interface: simplesynth
+//
+// Description:
+//
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef SIMPLESYNTH_H
+#define SIMPLESYNTH_H
+
+#include <sndfile.h>
+#include "libsynti/mess.h"
+#include "common.h"
+#include "libsynti/mpevent.h"
+#include "simpledrumsgui.h"
+#include "ssplugin.h"
+
+#define SS_NO_SAMPLE 0
+#define SS_NO_PLUGIN 0
+
+#define SS_PROCESS_BUFFER_SIZE 4096 //TODO: Add initialization method for nr of frames in each process from MusE - if nr of frames > than this, this will fail
+#define SS_SENDFX_BUFFER_SIZE SS_PROCESS_BUFFER_SIZE
+
+enum SS_ChannelState
+ {
+ SS_CHANNEL_INACTIVE=0,
+ SS_SAMPLE_PLAYING,
+ };
+
+enum SS_State
+ {
+ SS_INITIALIZING=0,
+ SS_LOADING_SAMPLE,
+ SS_CLEARING_SAMPLE,
+ SS_RUNNING,
+ };
+
+enum SS_SendFXState
+ {
+ SS_SENDFX_OFF=0,
+ SS_SENDFX_ON
+ };
+
+struct SS_SendFx
+ {
+ SS_SendFXState state;
+ LadspaPlugin* plugin;
+ int inputs;
+ int outputs;
+ int retgain_ctrlval;
+ double retgain;
+ int nrofparameters;
+ };
+
+struct SS_Sample
+ {
+ float* data;
+ int samplerate;
+ int bits;
+ std::string filename;
+ long samples;
+ long frames;
+ int channels;
+ SF_INFO sfinfo;
+ };
+
+struct SS_Channel
+ {
+ SS_ChannelState state;
+ const char* name;
+ SS_Sample* sample;
+ int playoffset;
+ bool noteoff_ignore;
+
+ double volume;
+ int volume_ctrlval;
+
+ double cur_velo;
+ double gain_factor;
+
+ int pan;
+ double balanceFactorL;
+ double balanceFactorR;
+
+ bool channel_on;
+
+ //Send fx:
+ double sendfxlevel[SS_NR_OF_SENDEFFECTS];
+ };
+
+struct SS_Controller
+ {
+ std::string name;
+ int num;
+ int min, max;
+ };
+
+struct SS_SampleLoader
+ {
+ SS_Channel* channel;
+ std::string filename;
+ int ch_no;
+ };
+
+class SimpleSynth : public Mess
+ {
+ public:
+ SimpleSynth(int);
+
+ virtual ~SimpleSynth();
+
+ virtual bool guiVisible() const;
+ virtual bool hasGui() const;
+ virtual bool playNote(int arg1, int arg2, int arg3);
+ virtual bool processEvent(const MidiEvent& arg1);
+ virtual bool setController(int arg1, int arg2, int arg3);
+ virtual bool sysex(int arg1, const unsigned char* arg2);
+ virtual const char* getPatchName(int arg1, int arg2, int arg3) const;
+ virtual const MidiPatch* getPatchInfo(int arg1, const MidiPatch* arg2) const;
+ virtual int getControllerInfo(int arg1, const char** arg2, int* arg3, int* arg4, int* arg5) const;
+ virtual void process(float** data, int offset, int len);
+ virtual void showGui(bool arg1);
+ virtual void getInitData(int*, const unsigned char**) const;
+ bool init(const char* name);
+ void guiSendSampleLoaded(bool success, int ch, const char* filename);
+ void guiSendError(const char* errorstring);
+
+ static const char* synth_state_descr[];
+ static const char* channel_state_descr[];
+
+private:
+ SimpleSynthGui* gui;
+
+ SS_Channel channels[SS_NR_OF_CHANNELS];
+ SS_Controller controllers[SS_NR_OF_CONTROLLERS];
+ bool setController(int channel, int id, int val, bool fromGui);
+ bool loadSample(int ch_no, const char* filename);
+ void parseInitData(const unsigned char* data);
+ void updateVolume(int ch, int in_volume_ctrlval);
+ void updateBalance(int ch, int pan);
+ void guiUpdateBalance(int ch, int bal);
+ void guiUpdateVolume(int ch, int val);
+ void guiUpdateNoff(int ch, bool b);
+ void guiUpdateChoff(int ch, bool b);
+ void guiUpdateMasterVol(int val);
+ void guiUpdateFxParameter(int fxid, int param, float val);
+ void guiUpdateSendFxLevel(int channel, int fxid, int level);
+ bool initSendEffect(int sendeffectid, QString lib, QString name);
+ void setSendFxLevel(int channel, int effectid, double val);
+ void cleanupPlugin(int id);
+ void setFxParameter(int fxid, int param, float val);
+ double master_vol;
+ int master_vol_ctrlval;
+
+ //Send effects:
+ SS_SendFx sendEffects[SS_NR_OF_SENDEFFECTS];
+ float* sendFxLineOut[SS_NR_OF_SENDEFFECTS][2]; //stereo output (fed into LADSPA inputs),sent from the individual channels -> LADSPA fx
+ float* sendFxReturn[SS_NR_OF_SENDEFFECTS][2]; //stereo inputs, from LADSPA plugins, sent from LADSPA -> SS and added to the mix
+ double* processBuffer[2];
+ };
+
+static void* loadSampleThread(void*);
+static pthread_mutex_t SS_LoaderMutex;
+static SS_State synth_state;
+static SimpleSynth* simplesynth_ptr;
+
+#endif
diff --git a/muse/synti/simpledrums/simpledrumsgui.cpp b/muse/synti/simpledrums/simpledrumsgui.cpp
new file mode 100644
index 00000000..ba99dc6c
--- /dev/null
+++ b/muse/synti/simpledrums/simpledrumsgui.cpp
@@ -0,0 +1,763 @@
+//
+// C++ Implementation: testogui
+//
+// Description:
+//
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#include "simpledrumsgui.h"
+#include "libsynti/mpevent.h"
+#include "muse/midi.h"
+#include "ssplugingui.h"
+
+#define SS_VOLUME_MIN_VALUE 0
+#define SS_VOLUME_MAX_VALUE 127
+#define SS_VOLUME_DEFAULT_VALUE 100
+#define SS_MASTERVOL_MAX_VALUE 127
+#define SS_MASTERVOL_DEFAULT_VALUE 100.0/127.0
+#define SS_SENDFX_MIN_VALUE 0
+#define SS_SENDFX_MAX_VALUE 127
+
+//Gui constants:
+#define SS_BTNGRP_WIDTH 50
+#define SS_BTNGRP_HEIGHT 80
+#define SS_ONOFF_WIDTH 16
+#define SS_ONOFF_HEIGHT 21
+#define SS_VOLSLDR_WIDTH (SS_BTNGRP_WIDTH - 8)
+#define SS_VOLSLDR_LENGTH 120
+#define SS_PANSLDR_WIDTH (SS_BTNGRP_WIDTH - 8)
+#define SS_PANSLDR_LENGTH 20
+#define SS_PANSLDR_DEFAULT_VALUE 63
+#define SS_NONOFF_LABEL_WIDTH 30
+#define SS_NONOFF_LABEL_HEIGHT 16
+#define SS_NONOFF_WIDTH SS_ONOFF_WIDTH
+#define SS_NONOFF_HEIGHT SS_ONOFF_HEIGHT
+#define SS_SENDFX_WIDTH ((SS_BTNGRP_WIDTH/2) - 4)
+//#define SS_SENDFX_WIDTH 28
+#define SS_SENDFX_HEIGHT SS_SENDFX_WIDTH
+#define SS_MASTERSLDR_WIDTH (SS_BTNGRP_WIDTH - 8)
+#define SS_MASTERSLDR_HEIGHT (SS_BTNGRP_HEIGHT - 4)
+
+
+// Sample groupbox
+
+#define SS_SAMPLENAME_LABEL_WIDTH 30
+#define SS_SAMPLENAME_LABEL_HEIGHT 21
+#define SS_SAMPLENAME_LABEL_XOFF 4
+
+#define SS_SAMPLE_LOAD_WIDTH 15
+#define SS_SAMPLE_LOAD_HEIGHT 19
+
+#define SS_SAMPLE_CLEAR_WIDTH SS_SAMPLE_LOAD_WIDTH
+#define SS_SAMPLE_CLEAR_HEIGHT SS_SAMPLE_LOAD_HEIGHT
+
+#define SS_SAMPLENAME_LINEEDIT_WIDTH 90
+#define SS_SAMPLENAME_LINEEDIT_HEIGHT 21
+
+#define SS_SAMPLE_INFO_LINE_HEIGHT 22
+#define SS_SAMPLE_INFO_LINE_WIDTH (SS_SAMPLENAME_LINEEDIT_XOFF + SS_SAMPLENAME_LINEEDIT_WIDTH)
+
+#define SS_GUI_WINDOW_WIDTH ((SS_NR_OF_CHANNELS +1) * SS_BTNGRP_XOFF)
+#define SS_MAIN_GROUPBOX_HEIGHT 200
+#define SS_GUI_WINDOW_HEIGHT (SS_BTNGRP_HEIGHT + SS_MAIN_GROUPBOX_HEIGHT)
+#define SS_MAIN_GROUPBOX_WIDTH SS_GUI_WINDOW_WIDTH
+
+SimpleSynthGui* simplesynthgui_ptr;
+
+
+/*!
+ \fn QChannelSlider::QChannelSlider(Qt::Orientation orientation, int ch, QWidget* parent, const char* name)
+ */
+QChannelSlider::QChannelSlider(Qt::Orientation orientation, int ch, QWidget* parent)
+ : QSlider(orientation, parent)
+ {
+ channel = ch;
+ }
+
+
+/*!
+ \fn QChannelSlider::getChannel()
+ */
+int QChannelSlider::getChannel()
+ {
+ return channel;
+ }
+
+
+/*!
+ \fn QChannelSlider::setChannel(int ch)
+ */
+void QChannelSlider::setChannel(int ch)
+ {
+ channel = ch;
+ }
+
+/*!
+ \fn QChannelSlider::setValue(int val)
+ */
+void QChannelSlider::setValue(int val)
+ {
+ val = (val > 127 ? 127 : val);
+ val = (val < 0 ? 0 : val);
+ QSlider::setValue(val);
+ emit valueChanged(channel, val);
+ }
+
+/*!
+ \fn QInvertedChannelSlider::setValue(int val)
+ */
+void QInvertedChannelSlider::setValue(int val)
+ {
+ int inverted = this->maximum() - val;
+ inverted = (inverted > 127 ? 127 : inverted);
+ inverted = (inverted < 0 ? 0 : inverted);
+ QSlider::setValue(val);
+ emit valueChanged(channel, inverted);
+ }
+
+/*!
+ \fn QInvertedSlider::setValue(int val)
+ */
+void QInvertedSlider::setValue(int val)
+ {
+ int inverted = this->maximum() - val;
+ inverted = (inverted > 127 ? 127 : inverted);
+ inverted = (inverted < 0 ? 0 : inverted);
+ emit invertedValueChanged(inverted);
+ QSlider::setValue(val);
+ }
+
+
+/*!
+ \fn QChannelCheckbox::QChannelCheckbox(QWidget* parent, int ch)
+ */
+QChannelCheckbox::QChannelCheckbox(QWidget* parent, int ch)
+ : QCheckBox(parent)
+ {
+ channel = ch;
+ connect(this, SIGNAL(clicked()), SLOT(isClicked()));
+ }
+
+
+/*!
+ \fn QChannelCheckbox::isClicked()
+ */
+void QChannelCheckbox::isClicked()
+ {
+ emit channelState(channel, this->isChecked());
+ }
+
+/*!
+ \fn QChannelButton::QChannelButton(QWidget* parent, const char* text, int ch, const char* name)
+ */
+QChannelButton::QChannelButton(QWidget* parent, const char* text, int ch)
+ : QPushButton(parent), channel (ch)
+ {
+ connect(this, SIGNAL(clicked()), SLOT(isClicked()));
+ setText(text);
+ }
+
+/*!
+ \fn QChannelButton::isClicked()
+ */
+void QChannelButton::isClicked()
+ {
+ emit channelState(channel, this->isChecked());
+ }
+
+/*!
+ \fn QChannelDial()
+ */
+QChannelDial::QChannelDial(QWidget* parent, int ch, int fxid)
+ : QDial(parent)
+ {
+ setTracking(true);
+ channel = ch;
+ sendfxid = fxid;
+ }
+
+/*!
+ \fn QChannelSlider::setValue(int val)
+ */
+void QChannelDial::setValue(int val)
+ {
+ QDial::setValue(val);
+ emit valueChanged(channel, sendfxid, val);
+ }
+
+/*!
+ \fn SimpleSynthGui::SimpleSynthGui()
+ */
+SimpleSynthGui::SimpleSynthGui()
+ {
+ SS_TRACE_IN
+ setupUi(this);
+ simplesynthgui_ptr = this;
+ pluginGui = new SS_PluginGui(this);
+ pluginGui->hide();
+
+ QVBoxLayout* mainLayout = new QVBoxLayout(this); //, 3);
+ QHBoxLayout* channelLayout = new QHBoxLayout;
+ mainLayout->addLayout(channelLayout);
+
+ //this->setFixedWidth(SS_GUI_WINDOW_WIDTH);
+ //this->setFixedHeight(SS_GUI_WINDOW_HEIGHT);
+ for (int i=0; i<SS_NR_OF_CHANNELS; i++) {
+ channelButtonGroups[i] = new QGroupBox(this);
+ channelButtonGroups[i]->setMinimumSize(SS_BTNGRP_WIDTH, SS_BTNGRP_HEIGHT);
+ channelButtonGroups[i]->setTitle(QString::number(i + 1));
+
+ QString name = QString("volumeSlider");
+ name.append(i + 1);
+
+ channelLayout->addWidget(channelButtonGroups[i]);
+
+ QVBoxLayout* inchnlLayout = new QVBoxLayout(channelButtonGroups[i]); //, 2, 0, "channelinternallayout");
+ inchnlLayout->setAlignment(Qt::AlignHCenter);
+
+ onOff[i] = new QChannelCheckbox(channelButtonGroups[i], i);
+ onOff[i]->setMinimumSize(SS_ONOFF_WIDTH, SS_ONOFF_HEIGHT);
+ onOff[i]->setToolTip("Channel " + QString::number(i + 1) + " on/off");
+ inchnlLayout->addWidget(onOff[i]);
+ connect(onOff[i], SIGNAL(channelState(int, bool)), SLOT(channelOnOff(int, bool)));
+
+ volumeSliders[i] = new QInvertedChannelSlider(Qt::Vertical, i, channelButtonGroups[i]);
+ volumeSliders[i]->setMinimum(SS_VOLUME_MIN_VALUE);
+ volumeSliders[i]->setMaximum(SS_VOLUME_MAX_VALUE);
+ volumeSliders[i]->setValue(SS_VOLUME_MAX_VALUE - SS_VOLUME_DEFAULT_VALUE);
+ volumeSliders[i]->setMinimumSize(SS_VOLSLDR_WIDTH, SS_VOLSLDR_LENGTH);
+ volumeSliders[i]->setToolTip("Volume, channel " + QString::number(i + 1));
+ setMinimumSize(SS_VOLSLDR_WIDTH, SS_VOLSLDR_LENGTH);
+ inchnlLayout->addWidget(volumeSliders[i]);
+ connect(volumeSliders[i], SIGNAL(valueChanged(int, int)), SLOT(volumeChanged(int, int)));
+
+ nOffLabel[i] = new QLabel(channelButtonGroups[i]);
+ nOffLabel[i]->setMinimumSize(SS_NONOFF_LABEL_WIDTH, SS_NONOFF_LABEL_HEIGHT);
+ nOffLabel[i]->setText("nOff");
+ inchnlLayout->addWidget(nOffLabel[i]);
+
+ nOffIgnore[i] = new QChannelCheckbox(channelButtonGroups[i], i);
+ nOffIgnore[i]->setMinimumSize(SS_NONOFF_WIDTH, SS_NONOFF_HEIGHT);
+ nOffIgnore[i]->setToolTip("Note off ignore, channel " + QString::number(i + 1));
+ inchnlLayout->addWidget(nOffIgnore[i]);
+ connect(nOffIgnore[i], SIGNAL(channelState(int, bool)),SLOT(channelNoteOffIgnore(int, bool)));
+
+ panSliders[i] = new QChannelSlider(Qt::Horizontal, i, channelButtonGroups[i]);
+ panSliders[i]->setRange(0, 127);
+ panSliders[i]->setValue(SS_PANSLDR_DEFAULT_VALUE);
+ panSliders[i]->setMinimumSize(SS_PANSLDR_WIDTH, SS_PANSLDR_LENGTH);
+ panSliders[i]->setToolTip("Pan, channel " + QString::number(i + 1));
+ inchnlLayout->addWidget(panSliders[i]);
+ connect(panSliders[i], SIGNAL(valueChanged(int, int)), SLOT(panChanged(int, int)));
+
+ QGridLayout* dialGrid = new QGridLayout;
+ inchnlLayout->addLayout(dialGrid);
+ sendFxDial[i][0] = new QChannelDial(channelButtonGroups[i], i, 0);
+ sendFxDial[i][0]->setRange(0, 127);
+ sendFxDial[i][0]->setMaximumSize(SS_SENDFX_WIDTH, SS_SENDFX_HEIGHT);
+ sendFxDial[i][0]->setToolTip("Fx 1 send amount");
+ //inchnlLayout->addWidget(sendFxDial[i][0]);
+ dialGrid->addWidget(sendFxDial[i][0], 0, 0, Qt::AlignCenter | Qt::AlignTop);
+
+ connect(sendFxDial[i][0], SIGNAL(valueChanged(int, int, int)), SLOT(sendFxChanged(int, int, int)));
+
+ sendFxDial[i][1] = new QChannelDial(channelButtonGroups[i], i, 1);
+ sendFxDial[i][1]->setRange(0, 127);
+ //inchnlLayout->add(sendFxDial[i][1]);
+ dialGrid->addWidget(sendFxDial[i][1], 0, 1, Qt::AlignCenter | Qt::AlignTop);
+ sendFxDial[i][1]->setMaximumSize(SS_SENDFX_WIDTH, SS_SENDFX_HEIGHT);
+ sendFxDial[i][1]->setToolTip("Fx 2 send amount");
+
+ connect(sendFxDial[i][1], SIGNAL(valueChanged(int, int, int)), SLOT(sendFxChanged(int, int, int)));
+
+ sendFxDial[i][2] = new QChannelDial(channelButtonGroups[i], i, 2);
+ sendFxDial[i][2]->setRange(0, 127);
+ sendFxDial[i][2]->setMaximumSize(SS_SENDFX_WIDTH, SS_SENDFX_HEIGHT);
+ //inchnlLayout->add(sendFxDial[i][2]);
+ dialGrid->addWidget(sendFxDial[i][2], 1, 0, Qt::AlignCenter | Qt::AlignTop);
+ sendFxDial[i][2]->setToolTip("Fx 3 send amount");
+ connect(sendFxDial[i][2], SIGNAL(valueChanged(int, int, int)), SLOT(sendFxChanged(int, int, int)));
+
+ sendFxDial[i][3] = new QChannelDial(channelButtonGroups[i], i, 3);
+ sendFxDial[i][3]->setRange(0, 127);
+ sendFxDial[i][3]->setMaximumSize(SS_SENDFX_WIDTH, SS_SENDFX_HEIGHT);
+ sendFxDial[i][3]->setToolTip("Fx 4 send amount");
+
+ dialGrid->addWidget(sendFxDial[i][3], 1, 1, Qt::AlignCenter | Qt::AlignTop);
+ connect(sendFxDial[i][3], SIGNAL(valueChanged(int, int, int)), SLOT(sendFxChanged(int, int, int)));
+ inchnlLayout->activate();
+ //channelLayout->activate();
+ }
+
+ //Master buttongroup:
+ masterButtonGroup = new QGroupBox(this);
+ channelLayout->addWidget(masterButtonGroup);
+ QVBoxLayout* mbgLayout = new QVBoxLayout(masterButtonGroup);
+ mbgLayout->setAlignment(Qt::AlignCenter);
+ masterButtonGroup->setMinimumSize(SS_BTNGRP_WIDTH, SS_BTNGRP_HEIGHT);
+ masterSlider = new QInvertedSlider(Qt::Vertical, masterButtonGroup);
+ masterSlider->setToolTip("Master volume");
+ mbgLayout->addWidget(masterSlider);
+ masterSlider->setRange(0, 127);
+ masterSlider->setValue(SS_VOLUME_MAX_VALUE - (int)(SS_MASTERVOL_DEFAULT_VALUE*SS_VOLUME_MAX_VALUE));
+ masterSlider->setMinimumSize(SS_MASTERSLDR_WIDTH, SS_MASTERSLDR_HEIGHT);
+ connect(masterSlider, SIGNAL(invertedValueChanged(int)), SLOT(masterVolChanged(int)));
+
+ //Main groupbox
+ mainGroupBox = new QGroupBox(this);
+ mainLayout->addWidget(mainGroupBox);
+
+ QGridLayout* mgbLayout = new QGridLayout(mainGroupBox); // , 8, 3, 1);
+
+ int i=0;
+
+ for (int c=0; c<2; c++) {
+ for (int r=0; r<SS_NR_OF_CHANNELS/2; r++) {
+ QHBoxLayout* strip = new QHBoxLayout;//(mgbLayout, 5);
+ mgbLayout->addLayout(strip, r, c);
+
+ QLabel* channelLabel = new QLabel(QString("Ch ") + QString::number(i + 1), mainGroupBox);
+ strip->addWidget(channelLabel);
+
+ sampleNameLineEdit[i] = new QLineEdit(mainGroupBox);
+ sampleNameLineEdit[i]->setReadOnly(true);
+ strip->addWidget(sampleNameLineEdit[i]);
+
+ loadSampleButton[i] = new QChannelButton(mainGroupBox, "L", i);
+ loadSampleButton[i]->setMinimumSize(SS_SAMPLE_LOAD_WIDTH, SS_SAMPLE_LOAD_HEIGHT);
+ loadSampleButton[i]->setToolTip("Load sample on channel " + QString::number(i + 1));
+ strip->addWidget(loadSampleButton[i]);
+ connect(loadSampleButton[i], SIGNAL(channelState(int, bool)), SLOT(loadSampleDialogue(int)));
+
+ clearSampleButton[i] = new QChannelButton(mainGroupBox, "C", i);
+ clearSampleButton[i]->setMinimumSize(SS_SAMPLE_CLEAR_WIDTH, SS_SAMPLE_CLEAR_HEIGHT);
+ clearSampleButton[i]->setToolTip("Clear sample on channel " + QString::number(i + 1));
+ strip->addWidget(clearSampleButton[i]);
+ connect(clearSampleButton[i], SIGNAL(channelState(int, bool)), SLOT(clearSample(int)));
+
+ i++;
+ }
+ }
+
+ // Right bottom panel:
+ QGroupBox* rbPanel= new QGroupBox(mainGroupBox);
+ mgbLayout->addWidget(rbPanel, 1, 3, 7, 1, Qt::AlignCenter);
+ QGridLayout* rbLayout = new QGridLayout(rbPanel); // 6, 1, 8, 5);
+
+ openPluginsButton = new QPushButton("&Send Effects");
+ openPluginsButton->setToolTip("Configure LADSPA send effects");
+ connect(openPluginsButton, SIGNAL(clicked()), SLOT(openPluginButtonClicked()));
+ rbLayout->addWidget(openPluginsButton, 2, 1, Qt::AlignLeft | Qt::AlignVCenter);
+ aboutButton = new QPushButton("About SimpleDrums");
+ connect(aboutButton, SIGNAL(clicked()), SLOT(aboutButtonClicked()));
+//TD rbLayout->addRowSpacing(3, 20);
+ rbLayout->addWidget(aboutButton, 4, 1, Qt::AlignLeft | Qt::AlignVCenter);
+
+ lastDir = "";
+ //Connect socketnotifier to fifo
+ QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read);
+ connect(s, SIGNAL(activated(int)), SLOT(readMessage(int)));
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SimpleSynthGui::~SimpleSynthGui()
+ */
+SimpleSynthGui::~SimpleSynthGui()
+ {
+ SS_TRACE_IN
+ simplesynthgui_ptr = 0;
+ delete pluginGui;
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SimpleSynthGui::readMessage(int)
+ */
+void SimpleSynthGui::readMessage(int)
+ {
+ MessGui::readMessage();
+ }
+
+/*!
+ \fn SimpleSynthGui::processEvent(const MidiEvent& ev)
+ */
+void SimpleSynthGui::processEvent(const MidiEvent& ev)
+ {
+ SS_TRACE_IN
+ if (SS_DEBUG_MIDI) {
+ printf("GUI received midi event\n");
+ }
+ if (ev.type() == ME_CONTROLLER) {
+ int id = ev.dataA();
+ int val = ev.dataB();
+
+ // Channel controllers:
+ if (id >= SS_FIRST_CHANNEL_CONTROLLER && id <= SS_LAST_CHANNEL_CONTROLLER ) {
+ // Find out which channel we're dealing with:
+ id-= SS_FIRST_CHANNEL_CONTROLLER;
+ int ch = (id / SS_NR_OF_CHANNEL_CONTROLLERS);
+ id = (id % SS_NR_OF_CHANNEL_CONTROLLERS);
+
+ int fxid = -1;
+
+ if (SS_DEBUG_MIDI) {
+ printf("GUI received midi controller - id: %d val %d channel %d\n", id, val, ch);
+ }
+
+ switch(id) {
+ case SS_CHANNEL_CTRL_VOLUME:
+ volumeSliders[ch]->blockSignals(true);
+ volumeSliders[ch]->setValue(SS_VOLUME_MAX_VALUE - val);
+ volumeSliders[ch]->blockSignals(false);
+ break;
+
+ case SS_CHANNEL_CTRL_PAN:
+ panSliders[ch]->blockSignals(true);
+ panSliders[ch]->setValue(val);
+ panSliders[ch]->blockSignals(false);
+ break;
+
+ case SS_CHANNEL_CTRL_NOFF:
+ nOffIgnore[ch]->blockSignals(true);
+ nOffIgnore[ch]->setChecked(val);
+ nOffIgnore[ch]->blockSignals(false);
+ break;
+
+ case SS_CHANNEL_CTRL_ONOFF:
+ onOff[ch]->blockSignals(true);
+ onOff[ch]->setChecked(val);
+ onOff[ch]->blockSignals(false);
+ break;
+
+ case SS_CHANNEL_SENDFX1:
+ case SS_CHANNEL_SENDFX2:
+ case SS_CHANNEL_SENDFX3:
+ case SS_CHANNEL_SENDFX4:
+ fxid = id - SS_CHANNEL_SENDFX1;
+ if (SS_DEBUG_MIDI) {
+ printf("SimpleSynthGui::processEvent - Channel sendfx, fxid: %d, val: %d\n", fxid, val);
+ }
+ sendFxDial[ch][fxid]->blockSignals(true);
+ sendFxDial[ch][fxid]->setValue(val);
+ sendFxDial[ch][fxid]->blockSignals(false);
+ break;
+
+ default:
+ if (SS_DEBUG_MIDI)
+ printf("SimpleSynthGui::processEvent - unknown controller received: %d\n", id);
+ }
+ }
+ // Master controllers:
+ else if (id >= SS_FIRST_MASTER_CONTROLLER && id <= SS_LAST_MASTER_CONTROLLER) {
+ if (id == SS_MASTER_CTRL_VOLUME) {
+ masterSlider->blockSignals(true);
+ masterSlider->setValue(SS_MASTERVOL_MAX_VALUE - val);
+ masterSlider->blockSignals(false);
+ }
+ }
+ else if (id>= SS_FIRST_PLUGIN_CONTROLLER && id <= SS_LAST_PLUGIN_CONTROLLER) {
+ int fxid = (id - SS_FIRST_PLUGIN_CONTROLLER) / SS_NR_OF_PLUGIN_CONTROLLERS;
+ int cmd = (id - SS_FIRST_PLUGIN_CONTROLLER) % SS_NR_OF_PLUGIN_CONTROLLERS;
+
+ // Plugin return-gain:
+ if (cmd == SS_PLUGIN_RETURN) {
+ if (SS_DEBUG_MIDI)
+ printf("SimpleSynthGui::processEvent - fx retgain received: fxid: %d val: %d\n", fxid, val);
+
+ SS_PluginFront* pf = pluginGui->getPluginFront((unsigned)fxid);
+ pf->setRetGain(val);
+ }
+ }
+ }
+ //
+ // Sysexes:
+ //
+ else if (ev.type() == ME_SYSEX) {
+ byte* data = ev.data();
+ int cmd = *data;
+ switch (cmd) {
+ case SS_SYSEX_LOAD_SAMPLE_OK: {
+ int ch = *(data+1);
+ QString filename = (const char*) (data+2);
+ sampleNameLineEdit[ch]->setText(filename.section('/',-1,-1));
+ if (SS_DEBUG_MIDI) {
+ printf("SimpleSynthGui - sample %s loaded OK on channel: %d\n", filename.toLatin1().data(), ch);
+ }
+ if (!onOff[ch]->isChecked()) {
+ onOff[ch]->blockSignals(true);
+ onOff[ch]->setChecked(true);
+ onOff[ch]->blockSignals(false);
+ channelOnOff(ch, true);
+ }
+ break;
+ }
+
+ case SS_SYSEX_LOAD_SAMPLE_ERROR: {
+ //int ch = *(data+1);
+ const char* filename = (const char*) (data+2);
+ /*QMessageBox* yn = new QMessageBox("Sample not found", "Failed to load sample: " + QString(filename) + "\n" +
+ "Do you want to open file browser and try to locate it elsewhere?",
+ QMessageBox::Warning,
+ QMessageBox::Yes,
+ QMessageBox::No,
+ QMessageBox::NoButton,
+ this);*/
+ /*int res = QMessageBox::warning(this,
+ "SimpleDrums","Failed to load sample: " + QString(filename) + "\n" +
+ "Do you want to open file browser and try to locate it elsewhere?",
+ "&Yes", "&No");
+ */
+ //int res = yn->exec();
+ printf("Error: Sample %s not found! TODO: Fix this\n", filename);
+ //if (res == 0) {
+ // loadSampleDialogue(ch);
+ // }
+ break;
+ }
+
+ case SS_SYSEX_LOAD_SENDEFFECT_OK: {
+ if (SS_DEBUG_MIDI) {
+ printf("SimpleSynthGui - sysex load sendeffect OK on fxid: %d\n", *(data+1));
+ }
+ int fxid = *(data+1);
+ SS_PluginFront* pf = pluginGui->getPluginFront((unsigned)fxid);
+ pf->updatePluginValue(*(data+2));
+ break;
+ }
+
+ case SS_SYSEX_CLEAR_SENDEFFECT_OK: {
+ if (SS_DEBUG_MIDI) {
+ printf("SimpleSynthGui - sysex clear sendeffect OK on fxid: %d\n", *(data+1));
+ }
+ SS_PluginFront* pf = pluginGui->getPluginFront((unsigned)*(data+1));
+ pf->clearPluginDisplay();
+ break;
+ }
+
+ case SS_SYSEX_SET_PLUGIN_PARAMETER_OK: {
+ if (SS_DEBUG_MIDI) {
+ printf("SimpleSynthGui - plugin parameter OK on fxid: %d\n", *(data+1));
+ }
+ SS_PluginFront* pf = pluginGui->getPluginFront((unsigned)*(data+1));
+ int param = *(data+2);
+ int val = *(data+3);
+ pf->blockSignals(true);
+ pf->setParameterValue(param, val);
+ pf->blockSignals(false);
+ break;
+ }
+
+ default:
+ if (SS_DEBUG_MIDI) {
+ printf("SimpleSynthGui::processEvent - unknown sysex cmd received: %d\n", cmd);
+ }
+ break;
+ }
+ }
+ SS_TRACE_OUT
+ }
+
+
+/*!
+ \fn SimpleSynthGui::volumeChanged(int val)
+ */
+void SimpleSynthGui::volumeChanged(int channel, int val)
+ {
+ setChannelVolume(channel, val);
+ }
+
+/*!
+ \fn SimpleSynthGui::panChanged(int channel, int value)
+ */
+void SimpleSynthGui::panChanged(int channel, int value)
+ {
+ sendController(0, SS_CHANNEL_PAN_CONTROLLER(channel), value);
+ }
+
+/*!
+ \fn SimpleSynthGui::channelOnOff(int channel, bool state)
+ */
+void SimpleSynthGui::channelOnOff(int channel, bool state)
+ {
+ sendController(0, SS_CHANNEL_ONOFF_CONTROLLER(channel), state);
+ }
+
+/*!
+ \fn SimpleSynthGui::channelNoteOffIgnore(bool state)
+ */
+void SimpleSynthGui::channelNoteOffIgnore(int channel, bool state)
+ {
+ sendController(0, SS_CHANNEL_NOFF_CONTROLLER(channel), (int) state);
+ }
+
+/*!
+ \fn SimpleSynthGui::sendFxChanged(int ch, int fxid, int val)
+ */
+void SimpleSynthGui::sendFxChanged(int ch, int fxid, int val)
+ {
+ sendController(0, SS_CHANNEL_SENDFX_CONTROLLER(ch, fxid), (int) val);
+ }
+
+/*!
+ \fn SimpleSynthGui::masterVolChanged(int val)
+ */
+void SimpleSynthGui::masterVolChanged(int val)
+ {
+ sendController(0, SS_MASTER_CTRL_VOLUME, val);
+ }
+
+/*!
+ \fn SimpleSynthGui::setChannelVolume(int channel, byte volume)
+ */
+void SimpleSynthGui::setChannelVolume(int channel, int volume)
+ {
+ //volumeSliders[channel]->setValue(SS_VOLUME_MAX_VALUE - volume);
+ sendController(0, SS_CHANNEL_VOLUME_CONTROLLER(channel), (int)volume);
+ }
+
+
+/*!
+ \fn SimpleSynthGui::loadSampleDialogue(int channel)
+ */
+void SimpleSynthGui::loadSampleDialogue(int channel)
+ {
+ QString filename =
+ QFileDialog::getOpenFileName(
+ this,
+ tr("Load sample dialog"),
+ lastDir,
+ QString("*.wav;*.WAV"));
+
+ if (filename != QString::null) {
+ QFileInfo fi(filename);
+ lastDir = fi.path();
+
+ if (SS_DEBUG)
+ printf("lastDir = %s\n", lastDir.toLatin1().data());
+
+ int l = filename.length() + 4;
+ byte d[l];
+
+ d[0] = SS_SYSEX_LOAD_SAMPLE;
+ d[1] = (byte) channel;
+ d[2] = (byte) filename.length();
+ memcpy(d+3, filename.toLatin1().data(), filename.length()+1);
+ sendSysex(d, l);
+ }
+ }
+
+
+
+/*!
+ \fn SimpleSynthGui::clearSample(int ch)
+ */
+void SimpleSynthGui::clearSample(int ch)
+ {
+ if (sampleNameLineEdit[ch]->text().length() > 0) { //OK, we've got a live one here
+ byte d[2];
+ d[0] = SS_SYSEX_CLEAR_SAMPLE;
+ d[1] = (byte) ch;
+ sendSysex(d, 2);
+ sampleNameLineEdit[ch]->setText("");
+ }
+ }
+
+/*!
+ \fn SimpleSynthGui::displayPluginGui()
+ */
+void SimpleSynthGui::displayPluginGui()
+ {
+ pluginGui->show();
+ }
+
+/*!
+ \fn SimpleSynthGui::loadEffectInvoked(int fxid, QString lib, QString label)
+ */
+void SimpleSynthGui::loadEffectInvoked(int fxid, QString lib, QString label)
+ {
+ int l = 4 + lib.length() + label.length();
+ byte d[l];
+ d[0] = SS_SYSEX_LOAD_SENDEFFECT;
+ d[1] = (byte) fxid;
+ memcpy (d+2, lib.toLatin1().data(), lib.length()+1);
+ memcpy (d+3+lib.length(), label.toLatin1().data(), label.length()+1);
+ sendSysex(d, l);
+ }
+
+
+/*!
+ \fn SimpleSynthGui::returnLevelChanged(int fxid, int val)
+ */
+void SimpleSynthGui::returnLevelChanged(int fxid, int val)
+ {
+ sendController(0, SS_PLUGIN_RETURNLEVEL_CONTROLLER(fxid), val);
+ }
+
+
+/*!
+ \fn SimpleSynthGui::toggleEffectOnOff(int fxid, int state)
+ */
+void SimpleSynthGui::toggleEffectOnOff(int fxid, int state)
+ {
+ sendController(0, SS_PLUGIN_ONOFF_CONTROLLER(fxid), state);
+ }
+
+
+/*!
+ \fn SimpleSynthGui::clearPlugin(int fxid)
+ */
+void SimpleSynthGui::clearPlugin(int fxid)
+ {
+ byte d[2];
+ d[0] = SS_SYSEX_CLEAR_SENDEFFECT;
+ d[1] = fxid;
+ sendSysex(d, 2);
+ }
+
+
+/*!
+ \fn SimpleSynthGui::effectParameterChanged(int fxid, int parameter, int val)
+ */
+void SimpleSynthGui::effectParameterChanged(int fxid, int parameter, int val)
+ {
+ //printf("Gui: effectParameterChanged: %d %d %d\n", fxid, parameter, val);
+ int len = 4;
+ byte d[len];
+ d[0] = SS_SYSEX_SET_PLUGIN_PARAMETER;
+ d[1] = (byte) fxid;
+ d[2] = (byte) parameter;
+ d[3] = (byte) val;
+ sendSysex(d, len);
+ }
+
+
+/*!
+ \fn SimpleSynthGui::openPluginButtonClicked()
+ */
+void SimpleSynthGui::openPluginButtonClicked()
+ {
+ if (pluginGui->isVisible())
+ pluginGui->raise();
+ else
+ displayPluginGui();
+ }
+
+
+/*!
+ \fn SimpleSynthGui::aboutButtonClicked()
+ */
+void SimpleSynthGui::aboutButtonClicked()
+ {
+ QString caption = "SimpleDrums ver";
+ caption+= SS_VERSIONSTRING;
+ QString text = caption + "\n\n(C) Copyright 2000-2004 Mathias Lundgren (lunar_shuttle@users.sf.net), Werner Schweer\nPublished under the GNU Public License";
+ QMessageBox* msgBox = new QMessageBox(caption, text, QMessageBox::NoIcon,
+ QMessageBox::Ok, Qt::NoButton, Qt::NoButton, this);
+ msgBox->exec();
+ }
diff --git a/muse/synti/simpledrums/simpledrumsgui.h b/muse/synti/simpledrums/simpledrumsgui.h
new file mode 100644
index 00000000..7291169d
--- /dev/null
+++ b/muse/synti/simpledrums/simpledrumsgui.h
@@ -0,0 +1,199 @@
+//
+// C++ Interface: testogui
+//
+// Description:
+//
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef __MUSE_TESTOGUI_H__
+#define __MUSE_TESTOGUI_H__
+
+#include "libsynti/gui.h"
+#include "simpledrumsguibase.h"
+#include "common.h"
+
+class QButtonGroup;
+class QLabel;
+class SS_PluginGui;
+
+//--------------------------------------
+// QChannelSlider
+//--------------------------------------
+class QChannelSlider: public QSlider
+ {
+ Q_OBJECT
+
+ public:
+ QChannelSlider(Qt::Orientation, int ch, QWidget* paren = 0);
+ int getChannel();
+ void setChannel(int ch);
+
+ public slots:
+ virtual void setValue(int val);
+
+ signals:
+ void valueChanged(int channel, int value);
+
+ protected:
+ int channel;
+ };
+
+//--------------------------------------
+// QInvertedSlider
+//--------------------------------------
+class QInvertedSlider : public QSlider
+ {
+ Q_OBJECT
+ public:
+ QInvertedSlider(Qt::Orientation o, QWidget* parent = 0)
+ : QSlider(o, parent) {}
+
+ public slots:
+ virtual void setValue(int val);
+
+ signals:
+ void invertedValueChanged(int value);
+ };
+
+//--------------------------------------
+// QInvertedChannelSlider
+//--------------------------------------
+class QInvertedChannelSlider : public QChannelSlider
+ {
+ Q_OBJECT
+ public:
+ QInvertedChannelSlider(Qt::Orientation o, int channel, QWidget* parent = 0)
+ : QChannelSlider(o, channel, parent) {};
+
+ public slots:
+ virtual void setValue(int val);
+ };
+
+
+//--------------------------------------
+// QChannelOnOff
+//--------------------------------------
+
+class QChannelCheckbox : public QCheckBox
+ {
+ Q_OBJECT
+ public:
+ QChannelCheckbox(QWidget* parent, int channel);
+
+ private:
+ int channel;
+
+ private slots:
+ void isClicked();
+
+ signals:
+ void channelState(int channel, bool state);
+ };
+
+//--------------------------------------
+// QChannelButton
+//--------------------------------------
+class QChannelButton : public QPushButton
+ {
+ Q_OBJECT
+
+ private:
+ int channel;
+
+ public:
+ QChannelButton(QWidget* parent, const char* text, int ch);
+
+ private slots:
+ void isClicked();
+
+ signals:
+ void channelState(int channel, bool state);
+
+ };
+
+//--------------------------------------
+// QChannelDial
+//--------------------------------------
+
+class QChannelDial : public QDial
+ {
+ Q_OBJECT
+
+ public:
+ QChannelDial(QWidget* parent, int ch, int fxid);
+
+ signals:
+ void valueChanged(int channel, int fxid, int val);
+
+ public slots:
+ virtual void setValue(int val);
+
+ protected:
+ int channel;
+ int sendfxid;
+ };
+
+//--------------------------------------
+// SimpleSynthGui - the Gui
+//--------------------------------------
+class SimpleSynthGui : public QDialog, public Ui::SimpleDrumsGuiBase, public MessGui
+ {
+ Q_OBJECT
+ private:
+ // MESS interface:
+ virtual void processEvent(const MidiEvent& ev);
+ void setChannelVolume(int channel, int volume);
+ void displayPluginGui();
+ QGroupBox* channelButtonGroups[SS_NR_OF_CHANNELS];
+ QGroupBox* masterButtonGroup;
+ QGroupBox* mainGroupBox;
+ QInvertedChannelSlider* volumeSliders[SS_NR_OF_CHANNELS];
+ QChannelSlider* panSliders[SS_NR_OF_CHANNELS];
+ QChannelCheckbox* onOff[SS_NR_OF_CHANNELS];
+ QChannelCheckbox* nOffIgnore[SS_NR_OF_CHANNELS];
+ QChannelButton* loadSampleButton[SS_NR_OF_CHANNELS];
+ QChannelButton* clearSampleButton[SS_NR_OF_CHANNELS];
+ QLabel* nOffLabel[SS_NR_OF_CHANNELS];
+ QLineEdit* sampleNameLineEdit[SS_NR_OF_CHANNELS];
+ QInvertedSlider* masterSlider;
+ QChannelDial* sendFxDial[SS_NR_OF_CHANNELS][SS_NR_OF_SENDEFFECTS];
+
+ QPushButton* openPluginsButton;
+ QPushButton* aboutButton;
+
+ QString lastDir;
+ SS_PluginGui* pluginGui;
+
+ public:
+ SimpleSynthGui();
+ virtual ~SimpleSynthGui();
+
+ public slots:
+ void loadEffectInvoked(int fxid, QString lib, QString label);
+ void returnLevelChanged(int fxid, int val);
+ void toggleEffectOnOff(int fxid, int state);
+ void clearPlugin(int fxid);
+ void effectParameterChanged(int fxid, int parameter, int val);
+
+ private slots:
+ void volumeChanged(int channel, int val);
+ void panChanged(int channel, int value);
+ void channelOnOff(int channel, bool state);
+ void channelNoteOffIgnore(int channel, bool state);
+ void masterVolChanged(int val);
+ void loadSampleDialogue(int channel);
+ void readMessage(int);
+ void clearSample(int ch);
+ void sendFxChanged(int ch, int fxid, int val);
+ void openPluginButtonClicked();
+ void aboutButtonClicked();
+
+ };
+
+extern SimpleSynthGui* simplesynthgui_ptr;
+
+#endif
diff --git a/muse/synti/simpledrums/simpledrumsguibase.ui b/muse/synti/simpledrums/simpledrumsguibase.ui
new file mode 100644
index 00000000..412bfdf6
--- /dev/null
+++ b/muse/synti/simpledrums/simpledrumsguibase.ui
@@ -0,0 +1,23 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>SimpleDrumsGuiBase</class>
+ <widget class="QDialog" name="SimpleDrumsGuiBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>602</width>
+ <height>509</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>DrumSynth 0.1</string>
+ </property>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/synti/simpledrums/ssplugin.cpp b/muse/synti/simpledrums/ssplugin.cpp
new file mode 100644
index 00000000..8bf9a0e9
--- /dev/null
+++ b/muse/synti/simpledrums/ssplugin.cpp
@@ -0,0 +1,455 @@
+//
+// C++ Implementation: plugin
+//
+// Description:
+//
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+// Additions/modifications: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#include <dlfcn.h>
+#include "ssplugin.h"
+#include "common.h"
+
+PluginList plugins;
+
+
+Plugin::Plugin(const QFileInfo* f)
+ : fi(*f)
+ {
+ }
+
+//---------------------------------------------------------
+// loadPluginLib
+//---------------------------------------------------------
+
+static void loadPluginLib(QFileInfo* fi)
+ {
+ SS_TRACE_IN
+ if (SS_DEBUG_LADSPA) {
+ printf("loadPluginLib: %s\n", fi->fileName().toLatin1().data());
+ }
+ void* handle = dlopen(fi->filePath().toAscii().data(), RTLD_NOW);
+ if (handle == 0) {
+ fprintf(stderr, "dlopen(%s) failed: %s\n",
+ fi->filePath().toAscii().data(), dlerror());
+ return;
+ }
+ LADSPA_Descriptor_Function ladspa = (LADSPA_Descriptor_Function)dlsym(handle, "ladspa_descriptor");
+
+ if (!ladspa) {
+ const char *txt = dlerror();
+ if (txt) {
+ fprintf(stderr,
+ "Unable to find ladspa_descriptor() function in plugin "
+ "library file \"%s\": %s.\n"
+ "Are you sure this is a LADSPA plugin file?\n",
+ fi->filePath().toAscii().data(),
+ txt);
+ exit(1);
+ }
+ }
+ const LADSPA_Descriptor* descr;
+ for (int i = 0;; ++i) {
+ descr = ladspa(i);
+ if (descr == NULL)
+ break;
+ plugins.push_back(new LadspaPlugin(fi, ladspa, descr));
+ }
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// loadPluginDir
+//---------------------------------------------------------
+
+static void loadPluginDir(const QString& s)
+ {
+ SS_TRACE_IN
+ QDir pluginDir(s, QString("*.so"), 0, QDir::Files);
+ if (pluginDir.exists()) {
+ QFileInfoList list = pluginDir.entryInfoList();
+ int n = list.size();
+ for (int i = 0; i < n; ++i) {
+ QFileInfo fi = list.at(i);
+ loadPluginLib(&fi);
+ }
+ }
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// initPlugins
+// search for LADSPA plugins
+//---------------------------------------------------------
+
+void SS_initPlugins()
+ {
+ SS_TRACE_IN
+ //loadPluginDir(museGlobalLib + QString("/plugins"));
+
+ char* ladspaPath = getenv("LADSPA_PATH");
+ if (ladspaPath == 0)
+ ladspaPath = "/usr/lib/ladspa:/usr/local/lib/ladspa";
+
+ char* p = ladspaPath;
+ while (*p != '\0') {
+ char* pe = p;
+ while (*pe != ':' && *pe != '\0')
+ pe++;
+
+ int n = pe - p;
+ if (n) {
+ char* buffer = new char[n + 1];
+ strncpy(buffer, p, n);
+ buffer[n] = '\0';
+ loadPluginDir(QString(buffer));
+ delete[] buffer;
+ }
+ p = pe;
+ if (*p == ':')
+ p++;
+ }
+ SS_TRACE_OUT
+ }
+
+
+//---------------------------------------------------------
+// LadspaPlugin
+//---------------------------------------------------------
+
+LadspaPlugin::LadspaPlugin(const QFileInfo* f,
+ const LADSPA_Descriptor_Function ldf,
+ const LADSPA_Descriptor* d)
+ : Plugin(f), ladspa(ldf), plugin(d)
+ {
+ SS_TRACE_IN
+ _inports = 0;
+ _outports = 0;
+ _parameter = 0;
+ handle = 0;
+ active = false;
+ controls = 0;
+ inputs = 0;
+ outputs = 0;
+
+ for (unsigned k = 0; k < plugin->PortCount; ++k) {
+ LADSPA_PortDescriptor pd = d->PortDescriptors[k];
+ static const int CI = LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT;
+ if ((pd & CI) == CI) {
+ ++_parameter;
+ pIdx.push_back(k);
+ }
+ else if (pd & LADSPA_PORT_INPUT) {
+ ++_inports;
+ iIdx.push_back(k);
+ }
+ else if (pd & LADSPA_PORT_OUTPUT) {
+ ++_outports;
+ oIdx.push_back(k);
+ }
+ }
+
+ /*if (SS_DEBUG_LADSPA) {
+ printf("Label: %s\tLib: %s\tPortCount: %d\n", this->label().toLatin1().data(), this->lib().toLatin1().data(), plugin->PortCount);
+ printf("LADSPA_PORT_CONTROL|LADSPA_PORT_INPUT: %d\t", pIdx.size());
+ printf("Input ports: %d\t", iIdx.size());
+ printf("Output ports: %d\n\n", oIdx.size());
+ }*/
+
+ LADSPA_Properties properties = plugin->Properties;
+ _inPlaceCapable = !LADSPA_IS_INPLACE_BROKEN(properties);
+ if (_inports != _outports)
+ _inPlaceCapable = false;
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// ~LadspaPlugin
+//---------------------------------------------------------
+LadspaPlugin::~LadspaPlugin()
+ {
+ SS_TRACE_IN
+ if (active) {
+ stop();
+ }
+ if (handle) {
+ SS_DBG_LADSPA2("Cleaning up ", this->label().toLatin1().data());
+ plugin->cleanup(handle);
+ }
+
+ //Free ports:
+ if (controls)
+ delete controls;
+ if (inputs)
+ delete inputs;
+ if (outputs)
+ delete outputs;
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// instantiate
+//---------------------------------------------------------
+
+bool LadspaPlugin::instantiate()
+ {
+ bool success = false;
+ handle = plugin->instantiate(plugin, SS_samplerate);
+ success = (handle != NULL);
+ if (success)
+ SS_DBG_LADSPA2("Plugin instantiated", label().toLatin1().data());
+ return success;
+ }
+
+//---------------------------------------------------------
+// start
+// activate and connect control ports
+//---------------------------------------------------------
+
+bool LadspaPlugin::start()
+ {
+ SS_TRACE_IN
+ if (handle) {
+ if (plugin->activate) {
+ plugin->activate(handle);
+ SS_DBG_LADSPA("Plugin activated");
+ }
+ active = true;
+ }
+ else {
+ SS_DBG_LADSPA("Error trying to activate plugin - plugin not instantiated!");
+ SS_TRACE_OUT
+ return false;
+ }
+
+ //Connect ports:
+ controls = new Port[_parameter];
+
+ for (int k = 0; k < _parameter; ++k) {
+ double val = defaultValue(k);
+ controls[k].val = val;
+ plugin->connect_port(handle, pIdx[k], &controls[k].val);
+ }
+
+ outputs = new Port[_outports];
+ inputs = new Port[_inports];
+
+ SS_TRACE_OUT
+ return true;
+ }
+
+//---------------------------------------------------------
+// stop
+// deactivate
+//---------------------------------------------------------
+void LadspaPlugin::stop()
+ {
+ SS_TRACE_IN
+ if (handle) {
+ SS_DBG_LADSPA2("Trying to stop plugin", label().toLatin1().data());
+ if (plugin->deactivate) {
+ plugin->deactivate(handle);
+ active = false;
+ }
+ }
+ else
+ SS_DBG_LADSPA("Warning - tried to stop plugin, but plugin was never started...\n");
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// range
+//---------------------------------------------------------
+
+void LadspaPlugin::range(int i, float* min, float* max) const
+ {
+ SS_TRACE_IN
+ i = pIdx[i];
+ LADSPA_PortRangeHint range = plugin->PortRangeHints[i];
+ LADSPA_PortRangeHintDescriptor desc = range.HintDescriptor;
+ if (desc & LADSPA_HINT_TOGGLED) {
+ *min = 0.0;
+ *max = 1.0;
+ return;
+ }
+ float m = 1.0;
+ if (desc & LADSPA_HINT_SAMPLE_RATE)
+ m = (float) SS_samplerate;
+
+ if (desc & LADSPA_HINT_BOUNDED_BELOW)
+ *min = range.LowerBound * m;
+ else
+ *min = 0.0;
+ if (desc & LADSPA_HINT_BOUNDED_ABOVE)
+ *max = range.UpperBound * m;
+ else
+ *max = 1.0;
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// defaultValue
+//---------------------------------------------------------
+
+float LadspaPlugin::defaultValue(int k) const
+ {
+ SS_TRACE_IN
+ k = pIdx[k];
+ LADSPA_PortRangeHint range = plugin->PortRangeHints[k];
+ LADSPA_PortRangeHintDescriptor rh = range.HintDescriptor;
+ double val = 1.0;
+ if (LADSPA_IS_HINT_DEFAULT_MINIMUM(rh))
+ val = range.LowerBound;
+ else if (LADSPA_IS_HINT_DEFAULT_LOW(rh))
+ if (LADSPA_IS_HINT_LOGARITHMIC(range.HintDescriptor))
+ val = exp(fast_log10(range.LowerBound) * .75 +
+ log(range.UpperBound) * .25);
+ else
+ val = range.LowerBound*.75 + range.UpperBound*.25;
+ else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(rh))
+ if (LADSPA_IS_HINT_LOGARITHMIC(range.HintDescriptor))
+ val = exp(log(range.LowerBound) * .5 +
+ log(range.UpperBound) * .5);
+ else
+ val = range.LowerBound*.5 + range.UpperBound*.5;
+ else if (LADSPA_IS_HINT_DEFAULT_HIGH(rh))
+ if (LADSPA_IS_HINT_LOGARITHMIC(range.HintDescriptor))
+ val = exp(log(range.LowerBound) * .25 +
+ log(range.UpperBound) * .75);
+ else
+ val = range.LowerBound*.25 + range.UpperBound*.75;
+ else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(rh))
+ val = range.UpperBound;
+ else if (LADSPA_IS_HINT_DEFAULT_0(rh))
+ val = 0.0;
+ else if (LADSPA_IS_HINT_DEFAULT_1(rh))
+ val = 1.0;
+ else if (LADSPA_IS_HINT_DEFAULT_100(rh))
+ val = 100.0;
+ else if (LADSPA_IS_HINT_DEFAULT_440(rh))
+ val = 440.0;
+ SS_TRACE_OUT
+ return val;
+ }
+
+//---------------------------------------------------------
+// find
+//---------------------------------------------------------
+
+Plugin* PluginList::find(const QString& file, const QString& name)
+ {
+ SS_TRACE_IN
+ for (iPlugin i = begin(); i != end(); ++i) {
+ if ((file == (*i)->lib()) && (name == (*i)->label())) {
+ SS_TRACE_OUT
+ return *i;
+ }
+ }
+ printf("Plugin <%s> not found\n", name.toLatin1().data());
+ SS_TRACE_OUT
+ return 0;
+ }
+
+//---------------------------------------------------------
+// connectInport
+//---------------------------------------------------------
+void LadspaPlugin::connectInport(int k, LADSPA_Data* datalocation)
+ {
+ SS_TRACE_IN
+ plugin->connect_port(handle, iIdx[k], datalocation);
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// connectOutport
+//---------------------------------------------------------
+void LadspaPlugin::connectOutport(int k, LADSPA_Data* datalocation)
+ {
+ SS_TRACE_IN
+ plugin->connect_port(handle, oIdx[k], datalocation);
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+void LadspaPlugin::process(unsigned long frames)
+ {
+ plugin->run(handle, frames);
+ }
+
+//---------------------------------------------------------
+// setParam
+//---------------------------------------------------------
+
+void LadspaPlugin::setParam(int k, float val)
+ {
+ SS_TRACE_IN
+ controls[k].val = val;
+ SS_TRACE_OUT
+ }
+
+//---------------------------------------------------------
+// getGuiControlValue
+// scale control value to gui-slider/checkbox representation
+//---------------------------------------------------------
+
+int LadspaPlugin::getGuiControlValue(int param) const
+ {
+ SS_TRACE_IN
+ float val = getControlValue(param);
+ float min, max;
+ range(param, &min, &max);
+ int intval;
+ if (isLog(param)) {
+ intval = SS_map_logdomain2pluginparam(logf(val/(max - min) + min));
+ }
+ else if (isBool(param)) {
+ intval = (int) val;
+ }
+ else {
+ float scale = SS_PLUGIN_PARAM_MAX / (max - min);
+ intval = (int) ((val - min) * scale);
+ }
+ SS_TRACE_OUT
+ return intval;
+ }
+
+//---------------------------------------------------------
+// convertGuiControlValue
+// scale control value to gui-slider/checkbox representation
+//---------------------------------------------------------
+
+float LadspaPlugin::convertGuiControlValue(int parameter, int val) const
+ {
+ SS_TRACE_IN
+ float floatval = 0;
+ float min, max;
+ range(parameter, &min, &max);
+
+ if (isLog(parameter)) {
+ if (val > 0) {
+ float logged = SS_map_pluginparam2logdomain(val);
+ float e = expf(logged) * (max - min);
+ e+=min;
+ floatval = e;
+ }
+ }
+ else if (isBool(parameter)) {
+ floatval = (float) val;
+ }
+ else if (isInt(parameter)) {
+ float scale = (max - min) / SS_PLUGIN_PARAM_MAX;
+ floatval = (float) round((((float) val) * scale) + min);
+ }
+ else {
+ float scale = (max - min) / SS_PLUGIN_PARAM_MAX;
+ floatval = (((float) val) * scale) + min;
+ }
+ SS_TRACE_OUT
+ return floatval;
+ }
diff --git a/muse/synti/simpledrums/ssplugin.h b/muse/synti/simpledrums/ssplugin.h
new file mode 100644
index 00000000..b9a7fb49
--- /dev/null
+++ b/muse/synti/simpledrums/ssplugin.h
@@ -0,0 +1,171 @@
+//
+// C++ Interface: plugin
+//
+// Description:
+//
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+// Additions/modifications: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef __PLUGIN_H__
+#define __PLUGIN_H__
+
+#include <ladspa.h>
+#include <math.h>
+
+//---------------------------------------------------------
+// Port
+//---------------------------------------------------------
+
+struct Port {
+ float val;
+ };
+
+//---------------------------------------------------------
+// Plugin
+//---------------------------------------------------------
+
+class Plugin
+ {
+ protected:
+ QFileInfo fi;
+
+ public:
+ Plugin(const QFileInfo* f);
+ virtual ~Plugin() {}
+ virtual QString label() const { return QString(); }
+ virtual QString name() const { return QString(); }
+ virtual unsigned long id() const { return 0; }
+ virtual QString maker() const { return QString(); }
+ virtual QString copyright() const { return QString(); }
+ virtual int parameter() const { return 0; }
+ virtual int inports() const { return 0; }
+ virtual int outports() const { return 0; }
+ virtual bool inPlaceCapable() const { return false; }
+
+ virtual bool isLog(int) const { return false; }
+ virtual bool isBool(int) const { return false; }
+ virtual bool isInt(int) const { return false; }
+ virtual float defaultValue(int) const { return 0.0f; }
+ virtual void range(int, float* min, float* max) const {
+ *min = 0.0f;
+ *max = 1.0f;
+ }
+ virtual const char* getParameterName(int /*param*/) const { return ""; }
+ QString lib() const { return fi.baseName(); }
+ QString path() const { return fi.absolutePath(); }
+ };
+
+//---------------------------------------------------------
+// LadspaPlugin
+//---------------------------------------------------------
+
+class LadspaPlugin : public Plugin
+ {
+ LADSPA_Descriptor_Function ladspa;
+ const LADSPA_Descriptor* plugin;
+ LADSPA_Handle handle;
+ bool active;
+
+ Port* controls;
+ Port* inputs;
+ Port* outputs;
+
+ protected:
+ int _parameter;
+ std::vector<int> pIdx; //control port numbers
+
+ int _inports;
+ std::vector<int> iIdx; //input port numbers
+
+ int _outports;
+ std::vector<int> oIdx; //output port numbers
+
+ bool _inPlaceCapable;
+
+ public:
+ LadspaPlugin(const QFileInfo* f, const LADSPA_Descriptor_Function, const LADSPA_Descriptor* d);
+ virtual ~LadspaPlugin();
+ virtual QString label() const { return QString(plugin->Label); }
+ virtual QString name() const { return QString(plugin->Name); }
+ virtual unsigned long id() const { return plugin->UniqueID; }
+ virtual QString maker() const { return QString(plugin->Maker); }
+ virtual QString copyright() const { return QString(plugin->Copyright); }
+ virtual int parameter() const { return _parameter; }
+ virtual int inports() const { return _inports; }
+ virtual int outports() const { return _outports; }
+ virtual bool inPlaceCapable() const { return _inPlaceCapable; }
+ const LADSPA_Descriptor* ladspaDescriptor() const { return plugin; }
+ virtual bool isLog(int k) const {
+ LADSPA_PortRangeHint r = plugin->PortRangeHints[pIdx[k]];
+ return LADSPA_IS_HINT_LOGARITHMIC(r.HintDescriptor);
+ }
+ virtual bool isBool(int k) const {
+ return LADSPA_IS_HINT_TOGGLED(plugin->PortRangeHints[pIdx[k]].HintDescriptor);
+ }
+ virtual bool isInt(int k) const {
+ LADSPA_PortRangeHint r = plugin->PortRangeHints[pIdx[k]];
+ return LADSPA_IS_HINT_INTEGER(r.HintDescriptor);
+ }
+ virtual void range(int i, float*, float*) const;
+ virtual const char* getParameterName(int i) const {
+ return plugin->PortNames[pIdx[i]];
+ }
+ virtual float defaultValue(int) const;
+ virtual float getControlValue(int k) const {
+ return controls[k].val;
+ }
+
+ int getGuiControlValue(int parameter) const;
+ float convertGuiControlValue(int parameter, int val) const;
+
+ bool instantiate();
+ bool start();
+ void stop();
+ void connectInport(int k, LADSPA_Data* datalocation);
+ void connectOutport(int k, LADSPA_Data* datalocation);
+ void process(unsigned long);
+ void setParam(int i, float val);
+
+ };
+
+
+static inline float fast_log2 (float val)
+ {
+ /* don't use reinterpret_cast<> because that prevents this
+ from being used by pure C code (for example, GnomeCanvasItems)
+ */
+ int* const exp_ptr = (int *)(&val);
+ int x = *exp_ptr;
+ const int log_2 = ((x >> 23) & 255) - 128;
+ x &= ~(255 << 23);
+ x += 127 << 23;
+ *exp_ptr = x;
+ val = ((-1.0f/3) * val + 2) * val - 2.0f/3; // (1)
+ return (val + log_2);
+ }
+
+static inline float fast_log10 (const float val)
+ {
+ return fast_log2(val) / 3.312500f;
+ }
+
+//---------------------------------------------------------
+// PluginList
+//---------------------------------------------------------
+
+typedef std::list<Plugin*>::iterator iPlugin;
+
+class PluginList : public std::list<Plugin*> {
+ public:
+ Plugin* find(const QString& file, const QString& name);
+ PluginList() {}
+ };
+
+extern void SS_initPlugins();
+extern PluginList plugins;
+
+#endif
diff --git a/muse/synti/simpledrums/sspluginchooserbase.ui b/muse/synti/simpledrums/sspluginchooserbase.ui
new file mode 100644
index 00000000..63d254df
--- /dev/null
+++ b/muse/synti/simpledrums/sspluginchooserbase.ui
@@ -0,0 +1,106 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>SS_PluginChooserBase</class>
+ <widget class="QDialog" name="SS_PluginChooserBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>777</width>
+ <height>681</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>SimpleDrums - Ladspa Plugin Chooser</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>10</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QTreeWidget" name="effectsListView" >
+ <column>
+ <property name="text" >
+ <string>Name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Label</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Inports</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Outports</string>
+ </property>
+ </column>
+ <column>
+ <property name="text" >
+ <string>Creator</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>301</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton" >
+ <property name="text" >
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="shortcut" >
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton" >
+ <property name="text" >
+ <string>&amp;OK</string>
+ </property>
+ <property name="shortcut" >
+ <string>Alt+O</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse/synti/simpledrums/ssplugingui.cpp b/muse/synti/simpledrums/ssplugingui.cpp
new file mode 100644
index 00000000..ec55b9c3
--- /dev/null
+++ b/muse/synti/simpledrums/ssplugingui.cpp
@@ -0,0 +1,517 @@
+//
+// C++ Implementation: ssplugingui
+//
+// Description:
+//
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "ssplugingui.h"
+#include "ssplugin.h"
+#include "simpledrumsgui.h"
+
+#define SS_PLUGINGUI_XOFF 300
+#define SS_PLUGINGUI_YOFF 300
+#define SS_PLUGINGUI_WIDTH 450
+#define SS_PLUGINGUI_MAX_WIDTH 700
+
+#define SS_PLUGINFRONT_MINWIDTH SS_PLUGINGUI_WIDTH
+#define SS_PLUGINFRONT_MINHEIGHT 70
+#define SS_PLUGINFRONT_MARGIN 9
+#define SS_PLUGINFRONT_INC_PARAM 30
+#define SS_PLUGINFRONT_INC_PARAM_MIN 60
+#define SS_PLUGINGUI_HEIGHT (SS_NR_OF_SENDEFFECTS * SS_PLUGINFRONT_MINHEIGHT)
+
+#define SS_PLUGINCHOOSER_NAMECOL 0
+#define SS_PLUGINCHOOSER_LABELCOL 1
+#define SS_PLUGINCHOOSER_INPORTSCOL 2
+#define SS_PLUGINCHOOSER_OUTPORTSCOL 3
+#define SS_PLUGINCHOOSER_CREATORCOL 4
+
+
+/*!
+ \fn SS_PluginChooser::SS_PluginChooser(QWidget* parent, const char* name = 0)
+ */
+SS_PluginChooser::SS_PluginChooser(QWidget* parent)
+ :QDialog(parent)
+ {
+ SS_TRACE_IN
+ setupUi(this);
+ selectedPlugin = 0;
+
+ for (iPlugin i=plugins.begin(); i !=plugins.end(); i++) {
+ //Support for only 2 or 1 inport/outports
+ if ( ((*i)->outports() == 2 || (*i)->outports() == 1) && ((*i)->inports() == 2 || (*i)->inports() == 1) ) {
+ QTreeWidgetItem* tmpItem = new QTreeWidgetItem(effectsListView);
+ tmpItem->setText(SS_PLUGINCHOOSER_NAMECOL, (*i)->name());
+ tmpItem->setText(SS_PLUGINCHOOSER_LABELCOL, (*i)->label());
+ tmpItem->setText(SS_PLUGINCHOOSER_INPORTSCOL, QString::number((*i)->inports()));
+ tmpItem->setText(SS_PLUGINCHOOSER_OUTPORTSCOL, QString::number((*i)->outports()));
+ tmpItem->setText(SS_PLUGINCHOOSER_CREATORCOL, (*i)->maker());
+ effectsListView->addTopLevelItem(tmpItem);
+ }
+ }
+ connect(okButton, SIGNAL(pressed()), SLOT(okPressed()));
+ connect(cancelButton, SIGNAL(pressed()), SLOT(cancelPressed()));
+ connect(effectsListView, SIGNAL(selectionChanged(QTreeWidgetItem*)), SLOT(selectionChanged(QTreeWidgetItem*)));
+ connect(effectsListView, SIGNAL(doubleClicked(QTreeWidgetItem*)), SLOT(doubleClicked(QTreeWidgetItem*)));
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SS_PluginChooser::selectionChanged(QListViewItem* item)
+ */
+void SS_PluginChooser::selectionChanged(QTreeWidgetItem* item)
+ {
+ SS_TRACE_IN
+ selectedItem = item;
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SS_PluginChooser::okPressed()
+ */
+void SS_PluginChooser::okPressed()
+ {
+ SS_TRACE_IN
+ selectedPlugin = findSelectedPlugin();
+ done(QDialog::Accepted);
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SS_PluginChooser::cancelPressed()
+ */
+void SS_PluginChooser::cancelPressed()
+ {
+ SS_TRACE_IN
+ SS_TRACE_OUT
+ done(QDialog::Rejected);
+ }
+
+/*!
+ \fn SS_PluginChooser::doubleClicked(QListViewItem* item)
+ */
+void SS_PluginChooser::doubleClicked(QTreeWidgetItem* /*item*/)
+ {
+ SS_TRACE_IN
+ selectedPlugin = findSelectedPlugin();
+ SS_TRACE_OUT
+ done(QDialog::Accepted);
+ }
+
+/*!
+ \fn SS_PluginChooser::getSelectedPlugin()
+ */
+LadspaPlugin* SS_PluginChooser::findSelectedPlugin()
+ {
+ SS_TRACE_IN
+ LadspaPlugin* selected = 0;
+ for (iPlugin i=plugins.begin(); i != plugins.end(); i++) {
+ if ((*i)->name() == selectedItem->text(SS_PLUGINCHOOSER_NAMECOL))
+ selected = (LadspaPlugin*) (*i);
+ }
+ SS_TRACE_OUT
+ return selected;
+ }
+
+/*!
+ \fn SS_PluginFront::SS_PluginFront(QWidget* parent, const char* name = 0)
+ */
+SS_PluginFront::SS_PluginFront(QWidget* parent, int in_fxid)
+ : QGroupBox(parent), fxid (in_fxid)
+ {
+ SS_TRACE_IN
+ expanded = false;
+ pluginChooser = 0;
+ plugin = 0;
+ expGroup = 0;
+
+//TD setLineWidth(3);
+ setFlat(false);
+//TD setFrameStyle( Q3Frame::Box | Q3Frame::Raised );
+//TD setFrameShape(QFrame::StyledPanel);
+// setFrameShadow(Qt::Sunken);
+ setFocusPolicy(Qt::NoFocus);
+ setMinimumSize(SS_PLUGINFRONT_MINWIDTH, SS_PLUGINFRONT_MINHEIGHT);
+ setMaximumSize(SS_PLUGINGUI_MAX_WIDTH, SS_PLUGINFRONT_MINHEIGHT);
+
+ QVBoxLayout* bigLayout = new QVBoxLayout(this);
+ bigLayout->setMargin(SS_PLUGINFRONT_MARGIN);
+ bigLayout->setAlignment(Qt::AlignTop);
+//TODO bigLayout->setResizeMode(QLayout::SetNoConstraint);
+
+ layout = new QHBoxLayout;
+ bigLayout->addLayout(layout);
+ layout->setAlignment(Qt::AlignVCenter);
+//TODO layout->setResizeMode(QLayout::SetNoConstraint);
+
+
+ QVBoxLayout* onOffLayout = new QVBoxLayout;
+ layout->addLayout(onOffLayout);
+ onOffLayout->setMargin(SS_PLUGINFRONT_MARGIN);
+ onOff = new QCheckBox(this);
+ onOffLayout->addWidget(new QLabel("On/Off", this));
+ onOffLayout->addWidget(onOff);
+ connect(onOff, SIGNAL(toggled(bool)), SLOT(onOffToggled(bool)));
+
+ pluginName = new QLineEdit(this);
+ pluginName->setReadOnly(true);
+ layout->addWidget(pluginName);
+
+ loadFxButton = new QPushButton("L", this);
+ QRect r = loadFxButton->geometry();
+ loadFxButton->setGeometry(r.x(), r.y(), 20, pluginName->geometry().height());
+ loadFxButton->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
+ loadFxButton->setMinimumSize(20,pluginName->geometry().height());
+ loadFxButton->setMaximumSize(30,pluginName->geometry().height());
+ connect(loadFxButton, SIGNAL(clicked()), SLOT(loadButton()));
+ layout->addWidget(loadFxButton);
+
+ clearFxButton = new QPushButton("C", this);
+ r = clearFxButton->geometry();
+ clearFxButton->setGeometry(r.x(), r.y(), 20, pluginName->geometry().height());
+ clearFxButton->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
+ clearFxButton->setMinimumSize(20,pluginName->geometry().height());
+ clearFxButton->setMaximumSize(30,pluginName->geometry().height());
+ connect(clearFxButton, SIGNAL(clicked()), SLOT(clearButtonPressed()));
+ layout->addWidget(clearFxButton);
+
+ layout->addSpacing(5);
+
+ expandButton = new QPushButton("->", this);
+ r = loadFxButton->geometry();
+ expandButton->setGeometry(r.x(), r.y(), 20, pluginName->geometry().height());
+ expandButton->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
+ expandButton->setMinimumSize(20,pluginName->geometry().height());
+ expandButton->setMaximumSize(30,pluginName->geometry().height());
+ connect(expandButton, SIGNAL(clicked()), SLOT(expandButtonPressed()));
+ layout->addWidget(expandButton);
+
+ layout->addSpacing(5);
+
+ QVBoxLayout* gainSliderLayout = new QVBoxLayout;
+ layout->addLayout(gainSliderLayout);
+ gainSliderLayout->addWidget(new QLabel("Return level", this));
+ gainSliderLayout->setMargin(SS_PLUGINFRONT_MARGIN);
+ outGainSlider = new QSlider(Qt::Horizontal, this);
+ outGainSlider->setMinimumSize(100, pluginName->geometry().height());
+ outGainSlider->setMaximumSize(500, pluginName->geometry().height());
+ loadFxButton->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum));
+ outGainSlider->setRange(0, 127);
+ outGainSlider->setValue(75);
+ connect(outGainSlider, SIGNAL(valueChanged(int)), SLOT(returnSliderMoved(int)));
+ gainSliderLayout->addWidget(outGainSlider);
+ clearPluginDisplay();
+
+ expLayout = new QVBoxLayout; // (bigLayout, 2);
+ bigLayout->addLayout(expLayout);
+
+ clearFxButton->setToolTip(tr("Clear and unload effect"));
+ loadFxButton->setToolTip(tr("Load effect"));
+ expandButton->setToolTip(tr("Toggle display of effect parameters"));
+ onOff->setToolTip(tr("Turn effect on/off"));
+ SS_TRACE_OUT
+ }
+
+SS_PluginFront::~SS_PluginFront()
+ {
+ if (pluginChooser)
+ delete pluginChooser;
+ }
+
+/*!
+ \fn SS_PluginFront::clearPluginDisplay()
+ */
+void SS_PluginFront::clearPluginDisplay()
+ {
+ SS_TRACE_IN
+ pluginName->setText("No plugin loaded");
+ pluginName->setEnabled(false);
+ onOff->setEnabled(false);
+ clearFxButton->setEnabled(false);
+ expandButton->setEnabled(false);
+ outGainSlider->setEnabled(false);
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SS_PluginFront::setPluginName(QString name)
+ */
+void SS_PluginFront::setPluginName(QString name)
+ {
+ pluginName->setText(name);
+ }
+
+
+/*!
+ \fn SS_PluginFront::loadButton()
+ */
+void SS_PluginFront::loadButton()
+ {
+ SS_TRACE_IN
+ if (!pluginChooser)
+ pluginChooser = new SS_PluginChooser(this);
+
+ pluginChooser->exec();
+ if ((pluginChooser->result() == QDialog::Accepted) && pluginChooser->getSelectedPlugin()) {
+ Plugin* p = pluginChooser->getSelectedPlugin();
+ //printf("Selected plugin: %s\n", pluginChooser->getSelectedPlugin()->name().toLatin1().data());
+ emit loadPlugin(fxid, p->lib(), p->label());
+ }
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SS_PluginFront::returnSliderMoved(int val)
+ */
+void SS_PluginFront::returnSliderMoved(int val)
+ {
+ emit returnLevelChanged(fxid, val);
+ }
+
+
+/*!
+ \fn SS_PluginFront::updatePluginValue(unsigned i)
+ */
+void SS_PluginFront::updatePluginValue(unsigned k)
+ {
+ SS_TRACE_IN
+ // If parameters are shown - close them
+ if (expanded) {
+ expandButtonPressed();
+ }
+
+ unsigned j=0;
+ if (k > plugins.size()) {
+ fprintf(stderr, "Internal error, tried to update plugin w range outside of list\n");
+ return;
+ }
+
+ iPlugin i;
+ for (i = plugins.begin(); j != k; i++, j++);
+ plugin = (LadspaPlugin*) *(i);
+ setPluginName(plugin->label());
+ outGainSlider->setEnabled(true);
+ clearFxButton->setEnabled(true);
+ expandButton->setEnabled(true);
+ pluginName->setEnabled(true);
+ onOff->setEnabled(true);
+ onOff->setChecked(true);
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SS_PluginFront::onOffToggled(bool state)
+ */
+void SS_PluginFront::onOffToggled(bool state)
+ {
+ emit fxToggled(fxid, state);
+ }
+
+/*!
+ \fn SS_PluginFront::sizeHint() const
+ */
+QSize SS_PluginFront::sizeHint() const
+ {
+ return QSize(SS_PLUGINFRONT_MINWIDTH, 50);
+ }
+
+/*!
+ \fn SS_PluginFront::sizePolicy() const
+ */
+QSizePolicy SS_PluginFront::sizePolicy() const
+ {
+ return QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ }
+
+
+/*!
+ \fn SS_PluginFront::clearButtonPressed()
+ */
+void SS_PluginFront::clearButtonPressed()
+ {
+ // If parameters are shown - close them
+ if (expanded) {
+ expandButtonPressed();
+ }
+ emit clearPlugin(fxid);
+ }
+
+/*!
+ \fn SS_PluginFront::setRetGain(int val)
+ */
+void SS_PluginFront::setRetGain(int val)
+ {
+ outGainSlider->blockSignals(true);
+ outGainSlider->setValue(val);
+ outGainSlider->blockSignals(false);
+ }
+
+/*!
+ \fn SS_PluginFront::expandButtonPressed()
+ */
+void SS_PluginFront::expandButtonPressed()
+ {
+ SS_TRACE_IN
+ int sizeIncrease = 0;
+ QRect pf = geometry();
+
+ if (!expanded) {
+ plugin->parameter() == 1 ? sizeIncrease = SS_PLUGINFRONT_INC_PARAM_MIN : sizeIncrease = plugin->parameter() * SS_PLUGINFRONT_INC_PARAM;
+ pf.setHeight(pf.height() + sizeIncrease);
+ setMinimumSize(QSize(pf.width(), pf.height()));
+ setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, pf.height()));
+ setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
+ setGeometry(pf);
+ emit sizeChanged(fxid, sizeIncrease);
+
+ expanded = true;
+ expandButton->setText("<-");
+ createPluginParameters();
+ }
+ else {
+//TODO expLayout->remove(expGroup);
+ expGroup->hide();
+ expGroup->deleteLater();
+ paramWidgets.clear();
+ expGroup = 0;
+ plugin->parameter() == 1 ? sizeIncrease = (0-SS_PLUGINFRONT_INC_PARAM_MIN) : sizeIncrease = 0 - (plugin->parameter() * SS_PLUGINFRONT_INC_PARAM);
+ expandButton->setText("->");
+ expanded = false;
+ pf.setHeight(pf.height() + sizeIncrease);
+ pf.setTop(pf.top() + sizeIncrease);
+ pf.setBottom(pf.bottom() + sizeIncrease);
+ setGeometry(pf);
+ adjustSize();
+ layout->activate();
+ setMinimumSize(QSize(pf.width(), pf.height()));
+ setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, pf.height()));
+ setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
+ emit sizeChanged(fxid, sizeIncrease);
+ }
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SS_PluginFront::createPluginParameters()
+ */
+void SS_PluginFront::createPluginParameters()
+ {
+ SS_TRACE_IN
+ expGroup = new QGroupBox(this);
+
+ expGroup->setMinimumSize(QSize(50, 50));
+ expGroup->setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, (plugin->parameter() * SS_PLUGINFRONT_INC_PARAM - SS_PLUGINFRONT_MARGIN)));
+ expGroup->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
+ expLayout->addWidget(expGroup);
+ expGroup->show();
+ QVBoxLayout* expGroupLayout = new QVBoxLayout(expGroup); // , 1);
+ expGroupLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+//TD expGroupLayout->setResizeMode(QLayout::FreeResize);
+ expGroupLayout->setMargin(SS_PLUGINFRONT_MARGIN);
+
+ for (int i=0; i < plugin->parameter(); i++) {
+ QHBoxLayout* paramStrip = new QHBoxLayout; // (expGroupLayout, 3);
+ expGroupLayout->addLayout(paramStrip);
+ paramStrip->setAlignment(Qt::AlignLeft);
+ QLabel* paramName = new QLabel(plugin->getParameterName(i), expGroup);
+ paramName->show();
+ paramName->setMinimumSize(QSize(150, 10));
+ paramName->setMaximumSize(QSize(300, SS_PLUGINFRONT_INC_PARAM));
+ paramName->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding));
+
+ paramStrip->addWidget(paramName);
+
+ if (plugin->isBool(i)) {
+ SS_ParameterCheckBox* paramCheckBox = new SS_ParameterCheckBox(expGroup, plugin, fxid, i);
+ paramCheckBox->setEnabled(true);
+ paramCheckBox->setParamValue((int) plugin->getControlValue(i));
+ paramCheckBox->show();
+ paramStrip->addWidget(paramCheckBox);
+ connect(paramCheckBox, SIGNAL(valueChanged(int, int, int)), SLOT(parameterValueChanged(int, int, int)));
+ }
+ else {
+ SS_ParameterSlider* paramSlider = new SS_ParameterSlider(expGroup, plugin, fxid, i);
+ paramSlider->setEnabled(true);
+ paramSlider->show();
+ paramSlider->setRange(SS_PLUGIN_PARAM_MIN, SS_PLUGIN_PARAM_MAX);
+
+ float max, min;
+ plugin->range(i, &min, &max);
+ //int intval = 0;
+ paramSlider->setParamValue(plugin->getGuiControlValue(i));
+ connect(paramSlider, SIGNAL(valueChanged(int, int, int)), SLOT(parameterValueChanged(int, int, int)));
+ paramStrip->addWidget(paramSlider);
+ }
+ }
+ expLayout->activate();
+ SS_TRACE_OUT
+ }
+
+/*!
+ \fn SS_PluginFront::parameterValueChanged(int fxid, int parameter, int val)
+ */
+void SS_PluginFront::parameterValueChanged(int fxid, int parameter, int val)
+ {
+ emit effectParameterChanged(fxid, parameter, val);
+ }
+
+/*!
+ \fn SS_PluginFront::setParameterValue(int param, float val)
+ */
+void SS_PluginFront::setParameterValue(int param, int val)
+ {
+ SS_TRACE_IN
+ int j=0;
+ for (SS_iParameterWidgetList i=paramWidgets.begin(); i != paramWidgets.end(); i++, j++) {
+ if (j == param) {
+ (*i)->setParamValue(val);
+ }
+ }
+ SS_TRACE_OUT
+ }
+
+SS_PluginGui::SS_PluginGui(QWidget* parent)
+ : QDialog(parent, false)
+ {
+ setWindowTitle("SimpleDrums LADSPA sendeffects");
+ for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
+ pluginFronts[i] = 0;
+ }
+ layout = new QVBoxLayout(this);
+
+ for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) {
+ pluginFronts[i] = new SS_PluginFront(this, i);
+ pluginFronts[i]->update();
+ layout->addWidget(pluginFronts[i]);
+ connect(pluginFronts[i], SIGNAL(loadPlugin(int, QString, QString)), simplesynthgui_ptr, SLOT(loadEffectInvoked(int, QString, QString)));
+ connect(pluginFronts[i], SIGNAL(returnLevelChanged(int, int)), simplesynthgui_ptr, SLOT(returnLevelChanged(int, int)));
+ connect(pluginFronts[i], SIGNAL(fxToggled(int, int)), simplesynthgui_ptr, SLOT(toggleEffectOnOff(int, int)));
+ connect(pluginFronts[i], SIGNAL(clearPlugin(int)), simplesynthgui_ptr, SLOT(clearPlugin(int)));
+ connect(pluginFronts[i], SIGNAL(sizeChanged(int, int)), SLOT(pluginFrontSizeChanged(int, int)));
+ connect(pluginFronts[i], SIGNAL(effectParameterChanged(int, int, int)), simplesynthgui_ptr, SLOT(effectParameterChanged(int, int, int)));
+ }
+ setMinimumSize(QSize(SS_PLUGINGUI_WIDTH, geometry().height()));
+ setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, geometry().height()));
+ }
+
+
+/*!
+ \fn SS_PluginGui::pluginFrontSizeChanged(int fxid, int val)
+ */
+void SS_PluginGui::pluginFrontSizeChanged(int /*fxid*/, int val)
+ {
+ QRect r = geometry();
+ r.setHeight(r.height() + val);
+ setMinimumSize(QSize(SS_PLUGINGUI_WIDTH, r.height()));
+ setMaximumSize(QSize(SS_PLUGINGUI_MAX_WIDTH, r.height()));
+ setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
+ setGeometry(r);
+ adjustSize();
+ }
+
+
diff --git a/muse/synti/simpledrums/ssplugingui.h b/muse/synti/simpledrums/ssplugingui.h
new file mode 100644
index 00000000..2f2159b0
--- /dev/null
+++ b/muse/synti/simpledrums/ssplugingui.h
@@ -0,0 +1,198 @@
+//
+// C++ Interface: ssplugingui
+//
+// Description:
+//
+//
+// Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef __SS_PLUGINGUI_H__
+#define __SS_PLUGINGUI_H__
+
+#include "sspluginchooserbase.h"
+#include "common.h"
+#include "ssplugin.h"
+
+class SS_ParameterWidget
+ {
+ protected:
+ int fxid;
+ int parameter;
+
+ LadspaPlugin* plugin;
+
+ public:
+ SS_ParameterWidget() { }
+ virtual ~SS_ParameterWidget() { }
+ int getFxId() { SS_TRACE_IN SS_TRACE_OUT return fxid; }
+ bool isBool() { SS_TRACE_IN SS_TRACE_OUT return plugin->isBool(parameter); }
+ bool isLog() { SS_TRACE_IN SS_TRACE_OUT return plugin->isLog(parameter); }
+ bool isInt() { SS_TRACE_IN SS_TRACE_OUT return plugin->isInt(parameter); }
+ virtual void setParamValue(int) { printf("Virtual function - should not be called!"); };
+ };
+
+class SS_ParameterCheckBox : public QCheckBox, public SS_ParameterWidget
+ {
+ Q_OBJECT
+
+ public:
+ SS_ParameterCheckBox(QWidget* parent, LadspaPlugin* in_plugin, int in_id, int in_parameter)
+ : QCheckBox(parent) , SS_ParameterWidget()
+ {
+ SS_TRACE_IN
+ plugin = in_plugin;
+ fxid = in_id;
+ parameter = in_parameter;
+ connect(this, SIGNAL(clicked()), SLOT(isClicked()));
+ SS_TRACE_OUT
+ }
+
+ virtual void setParamValue(int val) { SS_TRACE_IN setChecked(val); SS_TRACE_OUT}
+
+ private slots:
+ void isClicked() { SS_TRACE_IN emit valueChanged(fxid, parameter, (int)this->isChecked()); SS_TRACE_OUT}
+
+ signals:
+ void valueChanged(int id, int param, int val);
+ };
+
+class SS_ParameterSlider : public QSlider, public SS_ParameterWidget
+ {
+ Q_OBJECT
+
+ public:
+ SS_ParameterSlider(QWidget* parent, LadspaPlugin* in_plugin, int in_id, int in_parameter)
+ : QSlider(Qt::Horizontal, parent), SS_ParameterWidget()
+ {
+ SS_TRACE_IN
+ plugin = in_plugin;
+ fxid = in_id;
+ parameter = in_parameter;
+ SS_TRACE_OUT
+ }
+
+ virtual void setParamValue(int val) { SS_TRACE_IN setValue(val); SS_TRACE_OUT}
+
+ public slots:
+ virtual void setValue(int val) { SS_TRACE_IN QSlider::setValue(val); emit valueChanged(fxid, parameter, val); SS_TRACE_OUT }
+
+ signals:
+ void valueChanged(int id, int param, int val);
+ };
+
+typedef std::list<SS_ParameterWidget*> SS_ParameterWidgetList;
+typedef std::list<SS_ParameterWidget*>::iterator SS_iParameterWidgetList ;
+
+//-------------------------------
+// SS_PluginChooser
+//-------------------------------
+class SS_PluginChooser : public QDialog, Ui::SS_PluginChooserBase
+{
+ Q_OBJECT
+ private:
+ LadspaPlugin* selectedPlugin;
+ protected:
+
+ public:
+ SS_PluginChooser(QWidget* parent);
+ LadspaPlugin* getSelectedPlugin() { SS_TRACE_IN SS_TRACE_OUT return selectedPlugin; }
+
+ private slots:
+ void okPressed();
+ void cancelPressed();
+ void selectionChanged(QTreeWidgetItem* item);
+ void doubleClicked(QTreeWidgetItem* item);
+
+ private:
+ QTreeWidgetItem* selectedItem;
+ LadspaPlugin* findSelectedPlugin();
+
+};
+
+//-------------------------------
+// SS_PluginGuiFront
+//-------------------------------
+class SS_PluginFront : public QGroupBox
+ {
+ Q_OBJECT
+ private:
+ QHBoxLayout* layout;
+ QVBoxLayout* expLayout;
+ QLineEdit* pluginName;
+ QCheckBox* onOff;
+ QPushButton* loadFxButton;
+ QPushButton* clearFxButton;
+ QPushButton* expandButton;
+ QSlider* outGainSlider;
+ SS_PluginChooser* pluginChooser;
+ LadspaPlugin* plugin;
+ QGroupBox* expGroup;
+
+ int fxid;
+ bool expanded;
+
+ //For effect parameters:
+ SS_ParameterWidgetList paramWidgets;
+
+ protected:
+
+ public:
+ SS_PluginFront(QWidget* parent, int id);
+ void setPluginName(QString name);
+ ~SS_PluginFront();
+ void updatePluginValue(unsigned i);
+ void clearPluginDisplay();
+ void setParameterValue(int param, int val);
+ void setRetGain(int val);
+
+ protected:
+ virtual QSize sizeHint() const;
+ virtual QSizePolicy sizePolicy() const;
+
+ private slots:
+ void loadButton();
+ void returnSliderMoved(int val);
+ void onOffToggled(bool state);
+ void clearButtonPressed();
+ void expandButtonPressed();
+ void parameterValueChanged(int fxid, int parameter, int val);
+
+ signals:
+ void loadPlugin(int fxid, QString lib, QString name);
+ void returnLevelChanged(int fxid, int val);
+ void fxToggled(int fxid, int state);
+ void clearPlugin(int fxid);
+ void sizeChanged(int fxid, int val);
+ void effectParameterChanged(int fxid, int param, int val);
+
+ private:
+ void createPluginParameters();
+ };
+
+
+//-------------------------------
+// SS_PluginGui
+// Main plugin class, dialog
+//-------------------------------
+class SS_PluginGui : public QDialog
+ {
+ Q_OBJECT
+ private:
+ QVBoxLayout* layout;
+ SS_PluginFront* pluginFronts[4];
+
+ public:
+ SS_PluginGui(QWidget* parent);
+ SS_PluginFront* getPluginFront(unsigned i) { SS_TRACE_IN if (i<SS_NR_OF_SENDEFFECTS) SS_TRACE_OUT return pluginFronts[i];}
+ ~SS_PluginGui() {}
+private slots:
+ void pluginFrontSizeChanged(int fxid, int val);
+ };
+
+
+#endif
+
diff --git a/muse/synti/vam/CMakeLists.txt b/muse/synti/vam/CMakeLists.txt
new file mode 100644
index 00000000..4d37bdc9
--- /dev/null
+++ b/muse/synti/vam/CMakeLists.txt
@@ -0,0 +1,42 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2006 by Werner Schweer and others
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#=============================================================================
+
+QT4_WRAP_CPP ( vam_mocs vamgui.h )
+QT4_WRAP_UI ( vam_uis vamgui.ui )
+
+add_library ( vam SHARED
+ vam.cpp
+ vamgui.cpp
+ vamgui.h
+ ${vam_mocs}
+ ${vam_uis}
+ )
+
+# - tell cmake to name target vam.so instead of
+# libvam.so
+# - use precompiled header files
+#
+set_target_properties ( vam
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /lib/muse-1.0pre1/synthi/ vam )
+
diff --git a/muse/synti/vam/COPYING b/muse/synti/vam/COPYING
new file mode 100644
index 00000000..dc63aaca
--- /dev/null
+++ b/muse/synti/vam/COPYING
@@ -0,0 +1,340 @@
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) 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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. 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.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: 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
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This 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 Library General
+Public License instead of this License.
diff --git a/muse/synti/vam/ChangeLog b/muse/synti/vam/ChangeLog
new file mode 100644
index 00000000..1a7e4258
--- /dev/null
+++ b/muse/synti/vam/ChangeLog
@@ -0,0 +1,16 @@
+
+VAM-1.0beta2b (4/02 - 2002)
+ * Fix to prevent clicks on new notes
+ * Gui improvements (Thanks Werner and Bob)
+
+VAM-1.0beta2 (24/01 - 2002)
+ * Fix to make presets save and load correctly
+ * DSP improvements
+ * PW & PWM
+ * Some basic presets
+ * Small fixes
+ * Filter keytracking
+ * Load only preset meant for vam
+
+VAM-1.0beta1 (21/01 - 2002):
+ First release. \ No newline at end of file
diff --git a/muse/synti/vam/README b/muse/synti/vam/README
new file mode 100644
index 00000000..1b1ee269
--- /dev/null
+++ b/muse/synti/vam/README
@@ -0,0 +1,42 @@
+VAM: Virtual Analog for MusE
+
+ by Josef Lindman Hörnlund
+
+
+*** WARNING! VAM has at the time some significant problems
+*** (esp. with the filter). Some parameters should not have
+*** high values ( like the filter resonance, the filter
+*** env mod or dco sustain )
+
+* What's VAM??
+
+ VAM is a soft synth for MusE (http://muse.seh.de) emulating
+ an old monophonic two oscillator analog synthesizer. It has
+ a simple interface and a quite fast synthesis engine.
+
+* Installation
+ MusE version >= 0.5.0 required (I think)
+ ( and everything that MusE requires, like Qt3 )
+
+ Unpack VAM in $MUSESOURCEDIR/synthi and run from vam/ make;
+ make install. VAM won't compile automaticly if you run make
+ from $MUSESOURCEDIR.
+ $MUSESOURCEDIR is the directory you have the MusE source.
+ For optimizing add -march=(your arch) to the compiler arguments
+ in Makefile.
+
+* Using VAM:
+
+ To have fun with VAM MusE really should be started with -R.
+ Otherwise VAM will produce mostly noise, like clicks.
+ If you're familiar with analog or virtual analog synthesizers
+ using VAM souldn't be a problem.
+
+ If you add some cool LADSPA plugins like delay or chorus to VAM's
+ output, you'll get _much_ better sounds, playing without effects
+ is like eating beef without sauce.
+
+* Contact:
+
+ Please mail me at jotsif@linux.nu if you're having any
+ problems, suggestions, bugs, ideas or other comments.
diff --git a/muse/synti/vam/TODO b/muse/synti/vam/TODO
new file mode 100644
index 00000000..370bb521
--- /dev/null
+++ b/muse/synti/vam/TODO
@@ -0,0 +1,3 @@
+
+1. Make bandlimited wavetables!!
+2. Split VAM into a polyphonic and a monophonic synth \ No newline at end of file
diff --git a/muse/synti/vam/vam.cpp b/muse/synti/vam/vam.cpp
new file mode 100644
index 00000000..652599c6
--- /dev/null
+++ b/muse/synti/vam/vam.cpp
@@ -0,0 +1,803 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+//
+// Parts of this file taken from:
+// The analogue oscillator from Steve Harris plugin collection.
+// Werner Schweer's organ softsynth for MusE.
+// The music-dsp source archive.
+//
+// (C) Copyright 2002 Jotsif Lindman Hörnlund (jotsif@linux.nu)
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//=========================================================
+
+#include "libsynti/mess.h"
+#include "muse/midi.h"
+#include "muse/midictrl.h"
+
+#include "vam.h"
+#include "vamgui.h"
+#include "libsynti/mono.h"
+
+// Denormalise floats, only actually needed for PIII and very recent PowerPC
+#define DENORMALISE(fv) (((*(unsigned int*)&(fv))&0x7f800000)==0)?0.0f:(fv)
+
+// A fast, truncating towards 0 modulo function. ANSI C doesn't define
+// which % will do, most truncate towards -inf
+#define MOD(v,m) (v<0?v+m:(v>m?v-m:v))
+
+// Limit values
+#define LIMIT(v,l,u) (v<l?l:(v>u?u:v))
+
+#define PI M_PI
+
+//---------------------------------------------------------
+// Oscillator
+//---------------------------------------------------------
+
+struct Oscillator {
+ float phase;
+ float pitchmod;
+ float detune;
+ float freq;
+ float pwm;
+ float pw;
+ float fm;
+ int waveform;
+ bool on;
+};
+
+struct LPFilter {
+ float out[4];
+ float in[4];
+};
+
+//---------------------------------------------------------
+// Envelope
+//---------------------------------------------------------
+
+struct EnvelopeGenerator {
+ static const int onStates = 2;
+ static const int offStates = 1;
+
+ struct Segment {
+ int ticks;
+ double incr;
+ };
+ Segment segment[onStates + offStates];
+
+ int state;
+ double env;
+ int tick;
+
+ int attack;
+ int decay;
+ float sustain;
+ int release;
+
+ EnvelopeGenerator() {
+ segment[0].ticks = 441;
+ segment[0].incr = 1.0/441.0;
+ segment[1].ticks = 0;
+ segment[1].incr = 0.0;
+ segment[2].ticks = 441;
+ segment[2].incr = -(1.0/441.0);
+ }
+
+ void setSegment(int seg, int ticks, double incr) {
+ segment[seg].ticks = ticks;
+ segment[seg].incr = incr;
+ }
+
+ void keyOn() {
+// env = 0.0;
+ state = 0;
+ if(env) segment[state].incr = (1.0 - env) / segment[state].ticks;
+ else env = 0.0;
+ tick = segment[state].ticks;
+ }
+ void keyOff() {
+ state = onStates;
+ tick = segment[state].ticks;
+ }
+ bool isOff() {
+ return state == (onStates+offStates);
+ }
+ bool step() {
+ if(state >= onStates+offStates)
+ return false;
+ if (tick == 0)
+ return true;
+ env +=segment[state].incr;
+ if(env < 0.0)
+ env = 0.0;
+ --tick;
+ while(tick == 0) {
+ ++state;
+ if(state >= onStates+offStates)
+ return false;
+ if(state == onStates)
+ return true;
+ tick = segment[state].ticks;
+ }
+ return true;
+ }
+};
+
+//---------------------------------------------------------
+// VAM
+//---------------------------------------------------------
+
+class VAM : public MessMono {
+ static int useCount;
+ static const int CB_AMP_SIZE = 961;
+ static const int LIN2EXP_SIZE = 256;
+
+ static double cb2amp_tab[CB_AMP_SIZE];
+ static double cb2amp(double cb);
+
+ static float lin2exp[LIN2EXP_SIZE];
+
+/* Synthvariables */
+ static float *sin_tbl, *tri_tbl, *saw_tbl, *squ_tbl;
+ bool isOn;
+ int pitch, channel;
+ float velocity;
+
+ int idata[NUM_CONTROLLER]; // buffer for init data
+
+ EnvelopeGenerator dco1_env;
+ EnvelopeGenerator dco2_env;
+ EnvelopeGenerator filt_env;
+
+ LPFilter dco1_filter;
+ LPFilter dco2_filter;
+
+ Oscillator dco1;
+ Oscillator dco2;
+ Oscillator lfo;
+
+ bool filt_invert, filt_keytrack;
+
+ double filt_env_mod, filt_res, filt_cutoff, keytrack_cutoff;
+
+ int controller[NUM_CONTROLLER];
+
+ void noteoff(int channel, int pitch);
+
+ virtual void process(float**, int, int);
+ virtual void note(int channel, int pitch, int velo);
+ virtual bool setController(int channel, int ctrl, int val);
+ virtual bool sysex(int, const unsigned char*);
+ void getInitData(int* n, const unsigned char**p);
+
+ void setController(int ctrl, int data);
+
+ float *wave_tbl(int wave);
+ double lowpass_filter(double cutoff, double resonance, double input, LPFilter *f);
+
+ virtual bool guiVisible() const;
+ virtual void showGui(bool);
+ virtual bool hasGui() const { return true; }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int x, int y, int w, int h);
+
+ VAMGui* gui;
+
+ public:
+ VAM(int sr);
+ ~VAM();
+ bool init(const char* name);
+ };
+
+float* VAM::sin_tbl;
+float* VAM::tri_tbl;
+float* VAM::saw_tbl;
+float* VAM::squ_tbl;
+int VAM::useCount = 0;
+double VAM::cb2amp_tab[VAM::CB_AMP_SIZE];
+float VAM::lin2exp[VAM::LIN2EXP_SIZE];
+
+
+//---------------------------------------------------------
+// VAM
+//---------------------------------------------------------
+
+VAM::VAM(int sr)
+ : MessMono()
+ {
+ setSampleRate(sr);
+ gui = 0;
+ }
+
+//---------------------------------------------------------
+// ~VAM
+//---------------------------------------------------------
+
+VAM::~VAM()
+ {
+ --useCount;
+ if (useCount == 0) {
+ delete[] sin_tbl;
+ delete[] tri_tbl;
+ delete[] saw_tbl;
+ delete[] squ_tbl;
+ }
+ }
+
+//---------------------------------------------------------
+// curTime
+//---------------------------------------------------------
+
+double VAM::cb2amp(double cb)
+{
+ if(cb < 0.0)
+ return 1.0;
+ if(cb > 960.0)
+ return 0.0;
+ return cb2amp_tab[int(cb)];
+}
+
+double VAM::lowpass_filter(double cutoff, double resonance, double input, LPFilter *f)
+{
+ double output;
+ cutoff *= 1.16;
+
+ input -= f->out[3] * (resonance * 4.0) * (1.0 - 0.15 * cutoff * cutoff);
+ input *= 0.35013 * cutoff * cutoff * cutoff * cutoff;
+
+ f->out[0] = input + 0.3 * f->in[0] + (1.0 - cutoff) * f->out[0]; // Pole 1
+ f->in[0] = input;
+ f->out[1] = f->out[0] + 0.3 * f->in[1] + (1.0 - cutoff) * f->out[1]; // Pole 2
+ f->in[1] = f->out[0];
+ f->out[2] = f->out[1] + 0.3 * f->in[2] + (1.0 - cutoff) * f->out[2]; // Pole 3
+ f->in[2] = f->out[1];
+ f->out[3] = f->out[2] + 0.3 * f->in[3] + (1.0 - cutoff) * f->out[3]; // Pole 4
+ f->in[3] = f->out[2];
+
+// if(f.out[3] > 1.0) f.out[3] = 1.0;
+
+ output = f->out[3];
+
+
+ return output;
+}
+
+float *VAM::wave_tbl(int wave)
+{
+ if (wave == 0) {
+ return sin_tbl;
+ }
+ else if (wave == 1) {
+ return squ_tbl;
+ }
+ else if (wave == 2) {
+ return saw_tbl;
+ }
+ else if (wave == 3) {
+ return tri_tbl;
+ }
+ return sin_tbl;
+}
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool VAM::init(const char* name)
+ {
+ gui = new VAMGui;
+ gui->setWindowTitle(QString(name));
+ gui->show();
+
+ if (useCount == 0) {
+ int i;
+ float tmp;
+ for(i = 0; i < CB_AMP_SIZE; i++) {
+ cb2amp_tab[i] = pow(10.0, double(i) / -300.0);
+// cb2amp_tab[i] = 1.0 - i/(float)CB_AMP_SIZE;
+ }
+ for(i = 0; i < LIN2EXP_SIZE; i++) {
+ tmp = i/255.0;
+ lin2exp[i] = 1.5 * tmp * tmp * tmp - 0.69 * tmp * tmp + 0.16 * tmp;
+ }
+ int sr = sampleRate();
+ /* Build up denormalised oscilator wavetables, these are sample_rate
+ long, costs more RAM to create them but makes freqency calcs much
+ cheaper, and means that interpolation isn't that neccesary, esp if
+ you use integer frequncies */
+
+ float *tmp_tbl = new float[sr];
+ const int lag = sr/50;
+ sin_tbl = new float[sr];
+ for (i = 0; i < sr; i++) {
+ tmp = sin(i * 2.0 * PI / sr);
+ sin_tbl[i] = DENORMALISE(tmp);
+ }
+ tri_tbl = new float[sr];
+ for (i = 0; i < sr; i++) {
+ tmp = acos(cos(i * 2.0 * PI / sr)) / PI * 2.0 - 1.0;
+ tri_tbl[i] = DENORMALISE(tmp);
+ }
+ squ_tbl = new float[sr];
+ for (i = 0; i < sr/2; i++) {
+ tmp_tbl[i] = -1.0f;
+ }
+ for (i = sr/2; i < sr; i++) {
+ tmp_tbl[i] = +1.0f;
+ }
+ tmp = -1.0f;
+ for (i = (sr/2)-lag; i < (sr/2)+lag; i++) {
+ tmp_tbl[i] = tmp;
+ tmp += 1.0/(lag * 2.0);
+ }
+ for (i = 0; i < sr; i++) {
+ squ_tbl[i] = (tmp_tbl[MOD(i-lag, sr)] +
+ tmp_tbl[MOD(i+lag, sr)]) * 0.5;
+ }
+ saw_tbl = new float[sr];
+ for (i = 0; i < sr; i++) {
+ tmp = ((2.0 * i) - (float)sr) / (float)sr;
+ tmp_tbl[i] = DENORMALISE(tmp);
+ }
+ for (i = 0; i < sr; i++) {
+ saw_tbl[i] = (tmp_tbl[MOD(i-lag, sr)] +
+ tmp_tbl[MOD(i+lag, sr)]) * 0.5;
+ }
+ delete[] tmp_tbl;
+ }
+
+ dco1_filter.out[0] = dco1_filter.out[1] = dco1_filter.out[2] = dco1_filter.out[3] = 0.0;
+ dco1_filter.in[0] = dco1_filter.in[1] = dco1_filter.in[2] = dco1_filter.in[3] = 0.0;
+ dco2_filter.out[0] = dco2_filter.out[1] = dco2_filter.out[2] = dco2_filter.out[3] = 0.0;
+ dco2_filter.in[0] = dco2_filter.in[1] = dco2_filter.in[2] = dco2_filter.in[3] = 0.0;
+
+ ++useCount;
+ dco1.phase = 0.0;
+ dco2.phase = 0.0;
+ lfo.phase = 0.0;
+
+ memset(controller, 0, sizeof(controller));
+
+ int maxval = 128*128-1;
+
+ setController(0, DCO1_PITCHMOD, 8191);
+ setController(0, DCO2_PITCHMOD, 8191);
+ setController(0, DCO1_WAVEFORM, 1);
+ setController(0, DCO2_WAVEFORM, 1);
+ setController(0, DCO1_FM, 0);
+ setController(0, DCO2_FM, 0);
+ setController(0, DCO1_PWM, 0);
+ setController(0, DCO2_PWM, 0);
+ setController(0, DCO1_ATTACK, 0);
+ setController(0, DCO2_ATTACK, 0);
+ setController(0, DCO1_DECAY, 0);
+ setController(0, DCO2_DECAY, 0);
+ setController(0, DCO1_SUSTAIN, maxval - 255);
+ setController(0, DCO2_SUSTAIN, maxval - 255);
+ setController(0, DCO1_RELEASE, 0);
+ setController(0, DCO2_RELEASE, 0);
+ setController(0, LFO_FREQ, 0);
+ setController(0, LFO_WAVEFORM, 0);
+ setController(0, FILT_ENV_MOD, 0);
+ setController(0, FILT_KEYTRACK, 0);
+ setController(0, FILT_RES, 0);
+ setController(0, FILT_ATTACK, 0);
+ setController(0, FILT_DECAY, 0);
+ setController(0, FILT_SUSTAIN, maxval);
+ setController(0, FILT_RELEASE, 3);
+ setController(0, DCO2ON, 0);
+ setController(0, FILT_INVERT, 0);
+ setController(0, FILT_CUTOFF, 15000);
+ setController(0, DCO1_DETUNE, 8191);
+ setController(0, DCO2_DETUNE, 8191);
+ setController(0, DCO1_PW, 0);
+ setController(0, DCO2_PW, 0);
+
+ isOn = false;
+ return false;
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void VAM::process(float** ports, int offset, int sampleCount)
+{
+ //
+ // get and process all pending events from the
+ // synthesizer GUI
+ //
+ while (gui->fifoSize()) {
+ MidiEvent ev = gui->readEvent();
+ if (ev.type() == ME_CONTROLLER) {
+ // process local?
+ setController(ev.dataA() & 0xfff, ev.dataB());
+ sendEvent(ev);
+ }
+ else
+ printf("Organ::process(): unknown event\n");
+ }
+ float* buffer = *ports + offset;
+ if (!isOn)
+ return;
+
+ float sample, osc, lfol, *dco1_tbl, *dco2_tbl, *lfo_tbl, pw;
+ float cutoff;
+ int sr = sampleRate();
+
+ dco1_tbl = wave_tbl(dco1.waveform);
+ dco2_tbl = wave_tbl(dco2.waveform);
+ lfo_tbl = wave_tbl(lfo.waveform);
+
+ cutoff = filt_keytrack ? (dco1.freq /500.0 + filt_cutoff)/2 : filt_cutoff;
+ cutoff = LIMIT(cutoff, 0.0, 1.0);
+
+ for (int i = 0; i < sampleCount; i++) {
+ if(!(dco1_env.step() + dco2_env.step())) {
+ isOn = false;
+ break;
+ }
+ filt_env.step();
+
+ /* DCO 1 */
+ lfol = lfo_tbl[(int)lfo.phase];
+ pw = dco1.pw + dco1.pwm * lfol * 0.5;
+ pw = LIMIT(pw, 0.0, 1.0);
+ if(dco1.phase < sr/2 * ( 1.0 - pw))
+ osc = dco1_tbl[int(dco1.phase / (1.0 - pw))];
+ else
+ osc = dco1_tbl[int(dco1.phase / (1.0 + pw))];
+ lfol = lfo_tbl[(int)lfo.phase];
+ dco1.phase += dco1.freq + dco1.fm * lfol * 1500.0;
+ lfo.phase += lfo.freq * 50.0;
+ if(!filt_invert)
+ sample = lowpass_filter((cb2amp(960.0 * (1.0 - filt_env_mod * filt_env.env))
+ + 1.0 - filt_env_mod) * cutoff,
+ filt_res, osc, &dco1_filter) * cb2amp(960.0 * (1.0 - dco1_env.env));
+ else sample = lowpass_filter((cb2amp(960.0 * (1.0 - filt_env_mod * (1.0 - filt_env.env)))
+ + 1.0 - filt_env_mod) * cutoff,
+ filt_res, osc, &dco1_filter) * cb2amp(960.0 * (1.0 - dco1_env.env));
+ while(dco1.phase > sr) dco1.phase -= sr;
+ while(dco1.phase < 0.0) dco1.phase += sr;
+
+ /* DCO 2 */
+ if(dco2.on) {
+ pw = dco2.pw + dco2.pwm * lfol * 0.5;
+ pw = LIMIT(pw, 0.0, 1.0);
+ if(dco2.phase < sr/2 * (1 - pw))
+ osc = dco2_tbl[int(dco2.phase / (1.0 - pw))];
+ else
+ osc = dco2_tbl[int(dco2.phase / (1.0 + pw))];
+ dco2.phase += dco2.freq + dco2.fm * lfol * 1500.0;
+ if(!filt_invert)
+ sample += lowpass_filter((cb2amp(960.0 * (1.0 - filt_env_mod * filt_env.env)) + 1.0 - filt_env_mod) * cutoff,
+ filt_res, osc, &dco2_filter) * cb2amp(960.0 * (1.0 - dco2_env.env));
+ else sample += lowpass_filter((cb2amp(960.0 * (1.0 - filt_env_mod * (1.0 - filt_env.env))) + 1.0 - filt_env_mod) * cutoff,
+ filt_res, osc, &dco2_filter) * cb2amp(960.0 * (1.0 - dco2_env.env));
+
+ while (dco2.phase > sr) dco2.phase -= sr;
+ while (dco2.phase < 0.0) dco2.phase += sr;
+ }
+ while(lfo.phase > sr) lfo.phase -= sr;
+ while(lfo.phase < 0.0) lfo.phase += sr;
+ sample *= velocity * 0.5;
+ sample = LIMIT(sample, -1.0, 1.0);
+
+// if(sample > 1.0) fprintf(stderr, "oooops %f\n", sample);
+ buffer[i] = sample;
+ }
+}
+
+//---------------------------------------------------------
+// note
+//---------------------------------------------------------
+
+void VAM::note(int chan, int newpitch, int velo)
+{
+ if (velo == 0) {
+ noteoff(chan, newpitch);
+ return;
+ }
+ isOn = true;
+ channel = chan;
+ pitch = newpitch;
+ velocity = velo / 127.0;
+ dco1.freq = 8.176 * exp(float(pitch + dco1.pitchmod + dco1.detune)*log(2.0)/12.0);
+ dco2.freq = 8.176 * exp(float(pitch + dco2.pitchmod + dco2.detune)*log(2.0)/12.0);
+ keytrack_cutoff = 16.0 * dco1.freq / sampleRate();
+ if(keytrack_cutoff > 1.0) keytrack_cutoff = 1.0;
+ dco1_env.setSegment(0, dco1_env.attack, 1.0/dco1_env.attack);
+ dco1_env.setSegment(1, dco1_env.decay, -((1.0-dco1_env.sustain)/dco1_env.decay));
+ dco2_env.setSegment(0, dco2_env.attack, 1.0/dco2_env.attack);
+ dco2_env.setSegment(1, dco2_env.decay, -((1.0-dco2_env.sustain)/dco2_env.decay));
+ filt_env.setSegment(0, filt_env.attack, 1.0/filt_env.attack);
+ filt_env.setSegment(1, filt_env.decay, -((1.0-filt_env.sustain)/filt_env.decay));
+ dco1_env.keyOn();
+ dco2_env.keyOn();
+ filt_env.env = 0.0;
+ filt_env.keyOn();
+// dco1.phase = 0.0;
+// dco2.phase = 0.0;
+// lfo.phase = 0.0;
+}
+
+//---------------------------------------------------------
+// noteoff
+//---------------------------------------------------------
+
+void VAM::noteoff(int chan, int offpitch)
+{
+ if(isOn && (pitch == offpitch) && (channel == chan)) {
+ dco1_env.keyOff();
+ dco2_env.keyOff();
+ filt_env.keyOff();
+ }
+}
+
+//---------------------------------------------------------
+// setController
+//---------------------------------------------------------
+
+bool VAM::setController(int /*channel*/, int ctrl, int data)
+{
+ setController(ctrl & 0xfff, data);
+ MidiEvent ev(0, channel, ME_CONTROLLER, ctrl, data);
+ gui->writeEvent(ev);
+ return false;
+ }
+
+void VAM::setController(int ctrl, int data)
+ {
+// fprintf(stderr, "ctrl: %d data: %d\n", ctrl, data);
+ int maxval = 128*128-1;
+ double normval = double(data) / double(maxval);
+ switch (ctrl) {
+ case DCO1_PITCHMOD:
+ dco1.pitchmod = (data - 8191) / 341.333;
+ break;
+ case DCO1_WAVEFORM:
+ dco1.waveform = data;
+ break;
+ case DCO1_FM:
+ dco1.fm = lin2exp[int(normval * 255.0)];
+ break;
+ case DCO1_PWM:
+ dco1.pwm = normval;
+ break;
+ case DCO1_ATTACK:
+ dco1_env.attack = int(lin2exp[int(normval * 255.0)] * 5.0 * sampleRate()) + 1;
+ break;
+ case DCO1_DECAY:
+ dco1_env.decay = (data * sampleRate() * 5) / maxval + 1;
+ break;
+ case DCO1_SUSTAIN:
+ dco1_env.sustain = normval;
+ break;
+ case DCO1_RELEASE:
+ dco1_env.release = int(lin2exp[int(normval * 255.0)] * 10.0 * sampleRate()) + 1;
+ dco1_env.setSegment(2, dco1_env.release, -(1.0/dco1_env.release));
+ break;
+
+ case DCO2_PITCHMOD:
+ dco2.pitchmod = (data - 8191) / 341.333;
+ break;
+ case DCO2_WAVEFORM:
+ dco2.waveform = data;
+ break;
+ case DCO2_FM:
+ dco2.fm = normval;
+ break;
+ case DCO2_PWM:
+ dco2.pwm = normval;
+ break;
+ case DCO2_ATTACK:
+ dco2_env.attack = int(lin2exp[int(normval * 255.0)] * 5.0 * sampleRate()) + 1;
+ break;
+ case DCO2_DECAY:
+ dco2_env.decay = (data * sampleRate() * 5) / maxval + 1;
+ break;
+ case DCO2_SUSTAIN:
+ dco2_env.sustain = normval;
+ break;
+ case DCO2_RELEASE:
+ dco2_env.release = int(lin2exp[int(normval * 255.0)] * 10.0 * sampleRate()) + 1;
+ dco2_env.setSegment(2, dco2_env.release, -(1.0/dco2_env.release));
+ break;
+ case LFO_FREQ:
+ lfo.freq = lin2exp[int(normval * 255.0)];
+// fprintf(stderr, "%f\n", lfo.freq);
+ break;
+ case LFO_WAVEFORM:
+ lfo.waveform = data;
+ break;
+ case FILT_ENV_MOD:
+ filt_env_mod = 1.0 - lin2exp[int(255.0 - normval * 255.0)];
+ break;
+ case FILT_KEYTRACK:
+ filt_keytrack = data;
+ break;
+ case FILT_RES:
+ filt_res = normval;
+ break;
+ case FILT_ATTACK:
+ filt_env.attack = int(lin2exp[int(normval * 255.0)] * 5.0 * sampleRate());
+ break;
+ case FILT_DECAY:
+ filt_env.decay = (data * sampleRate() * 5) / maxval + 1;
+ break;
+ case FILT_SUSTAIN:
+ filt_env.sustain = normval;
+ break;
+ case FILT_RELEASE:
+ filt_env.release = int(lin2exp[int(normval * 255.0)] * 10.0 * sampleRate()) + 1;
+ filt_env.setSegment(2, filt_env.release, -(1.0/filt_env.release));
+ break;
+ case DCO2ON:
+ dco2.on = data;
+ break;
+ case FILT_INVERT:
+ filt_invert = data;
+ break;
+ case FILT_CUTOFF:
+ filt_cutoff = normval;
+// fprintf(stderr, "%f\n", filt_cutoff);
+ break;
+ case DCO1_DETUNE:
+ dco1.detune = (data - 8191) / 16384.0;
+ break;
+ case DCO2_DETUNE:
+ dco2.detune = (data - 8191) / 16384.0;
+ break;
+ case DCO1_PW:
+ dco1.pw = normval;
+ if(dco1.pw == 1.0) dco1.pw = 0.99;
+
+ break;
+ case DCO2_PW:
+ dco2.pw = normval;
+ if(dco2.pw == 1.0) dco2.pw = 0.99;
+ break;
+ default:
+ printf("VAM: set unknown Ctrl 0x%x to 0x%x\n", ctrl, data);
+ break;
+ }
+ controller[ctrl] = data;
+}
+
+//---------------------------------------------------------
+// parameterRequest
+//---------------------------------------------------------
+
+#if 0
+void VAM::parameterRequest(int ctrl)
+{
+ if(ctrl >= NUM_CONTROLLER) {
+ fprintf(stderr, "VAM: illegal controller %d request\n", ctrl);
+ return;
+ }
+ unsigned char data[] = { 0x7c, 0x2, 0x2, 0x0, 0x0, 0x0 };
+ data[3] = ctrl;
+ data[4] = controller[ctrl] & 0x7f;
+ data[5] = (controller[ctrl] >> 7) & 0x7f;
+ sendSysex(data, sizeof(data));
+}
+#endif
+
+//---------------------------------------------------------
+// getInitData
+//---------------------------------------------------------
+
+void VAM::getInitData(int* n, const unsigned char**p)
+ {
+ int* d = idata;
+ for (int i = 0; i < NUM_CONTROLLER; ++i) {
+ int val = controller[i];
+ *d++ = val;
+ }
+ *n = NUM_CONTROLLER * sizeof(int); // sizeof(idata);
+ *p = (unsigned char*)idata;
+ }
+
+//---------------------------------------------------------
+// sysex
+//---------------------------------------------------------
+
+bool VAM::sysex(int n, const unsigned char* data)
+ {
+ if (n != (NUM_CONTROLLER * sizeof(int))) {
+ printf("Organ: unknown sysex\n");
+ return false;
+ }
+ int* s = (int*) data;
+ for (int i = 0; i < NUM_CONTROLLER; ++i) {
+ int val = *s++;
+ setController(0, i, val);
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// guiVisible
+//---------------------------------------------------------
+
+bool VAM::guiVisible() const
+ {
+ return gui->isVisible();
+ }
+
+//---------------------------------------------------------
+// showGui
+//---------------------------------------------------------
+
+void VAM::showGui(bool val)
+ {
+ gui->setShown(val);
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void VAM::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void VAM::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+class QWidget;
+
+static Mess* instantiate(int sr, QWidget*, const char* name)
+ {
+ VAM* vam = new VAM(sr);
+ if (vam->init(name)) {
+ delete vam;
+ return 0;
+ }
+ return vam;
+ }
+
+extern "C" {
+ static MESS descriptor = {
+ "vam",
+ "vam soft synth",
+ "0.1", // version string
+ MESS_MAJOR_VERSION, MESS_MINOR_VERSION,
+ instantiate,
+ };
+
+ const MESS* mess_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse/synti/vam/vam.h b/muse/synti/vam/vam.h
new file mode 100644
index 00000000..44bfc032
--- /dev/null
+++ b/muse/synti/vam/vam.h
@@ -0,0 +1,37 @@
+// vam.h
+//
+// (C) Copyright 2002 Jotsif Lindman Hörnlund (jotsif@linux.nu)
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+
+
+#ifndef __VAM_H
+#define __VAM_H
+
+enum {
+ DCO1_PITCHMOD, DCO1_WAVEFORM, DCO1_FM, DCO1_PWM,
+ DCO1_ATTACK, DCO1_DECAY, DCO1_SUSTAIN, DCO1_RELEASE,
+ DCO2_PITCHMOD, DCO2_WAVEFORM, DCO2_FM, DCO2_PWM,
+ DCO2_ATTACK, DCO2_DECAY, DCO2_SUSTAIN, DCO2_RELEASE,
+ LFO_FREQ, LFO_WAVEFORM, FILT_ENV_MOD, FILT_KEYTRACK,
+ FILT_RES, FILT_ATTACK, FILT_DECAY, FILT_SUSTAIN,
+ FILT_RELEASE, DCO2ON, FILT_INVERT, FILT_CUTOFF,
+ DCO1_DETUNE, DCO2_DETUNE, DCO1_PW, DCO2_PW
+};
+
+#define NUM_CONTROLLER 32
+
+#endif /* __VAM_H */
diff --git a/muse/synti/vam/vamgui.cpp b/muse/synti/vam/vamgui.cpp
new file mode 100644
index 00000000..75a05f1b
--- /dev/null
+++ b/muse/synti/vam/vamgui.cpp
@@ -0,0 +1,618 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+//
+// vamgui.c
+// This is a simple GUI implemented with QT for
+// vam software synthesizer.
+// (Many) parts of this file was taken from Werner Schweer's GUI
+// for his organ soft synth.
+//
+// (C) Copyright 2002 Jotsif Lindman Hörnlund (jotsif@linux.nu)
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//=========================================================
+
+#include "vamgui.h"
+#include "vam.h"
+
+#include "al/xml.h"
+using AL::Xml;
+
+#include "muse/midi.h"
+#include "muse/midictrl.h"
+
+//---------------------------------------------------------
+// Preset
+//---------------------------------------------------------
+
+struct Preset {
+ QString name;
+ int ctrl[NUM_CONTROLLER];
+ void readConfiguration(QDomNode);
+ void readControl(QDomNode);
+ void writeConfiguration(Xml& xml);
+ };
+
+std::list<Preset> presets;
+typedef std::list<Preset>::iterator iPreset;
+
+QString museProject;
+QString museGlobalShare;
+QString museUser;
+
+QString instanceName;
+//static const char* presetFileTypes[] = {
+// "Presets (*.pre)",
+// 0
+// };
+
+//---------------------------------------------------------
+// readControl
+//---------------------------------------------------------
+
+void Preset::readControl(QDomNode)
+{
+#if 0
+ int idx = 0;
+ int val = 0;
+ for (;;) {
+ Xml::Token token(xml.parse());
+ const QString& tag(xml.s1());
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ xml.unknown("control");
+ break;
+ case Xml::Attribut:
+ if (tag == "idx") {
+ idx = xml.s2().toInt();
+ if (idx >= NUM_CONTROLLER)
+ idx = 0;
+ }
+ else if (tag == "val")
+ val = xml.s2().toInt();
+ break;
+ case Xml::TagEnd:
+ if (tag == "control") {
+ ctrl[idx] = val;
+ return;
+ }
+ default:
+ break;
+ }
+ }
+#endif
+}
+
+//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+void Preset::readConfiguration(QDomNode /*node*/)
+{
+#if 0
+ for (;;) {
+ Xml::Token token(xml.parse());
+ const QString& tag(xml.s1());
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ if (tag == "control")
+ readControl(xml);
+ else
+ xml.unknown("preset");
+ break;
+ case Xml::Attribut:
+ if (tag == "name")
+ name = xml.s2();
+ break;
+ case Xml::TagEnd:
+ if (tag == "preset")
+ return;
+ default:
+ break;
+ }
+ }
+#endif
+}
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+
+void Preset::writeConfiguration(Xml& xml)
+{
+ xml.tag("preset name=\"%s\"", name.toLatin1().data());
+ for (int i = 0; i < NUM_CONTROLLER; ++i) {
+ xml.tagE("control idx=\"%d\" val=\"%d\"", i, ctrl[i]);
+ }
+ xml.etag("preset");
+}
+
+//---------------------------------------------------------
+// VAMGui
+//---------------------------------------------------------
+
+VAMGui::VAMGui()
+// : QWidget(0, "vamgui", Qt::WType_TopLevel),
+ : QWidget(0),
+ MessGui()
+{
+ setupUi(this);
+ QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read);
+ connect(s, SIGNAL(activated(int)), SLOT(readMessage(int)));
+
+ dctrl[DCO1_PITCHMOD] = SynthGuiCtrl(PitchModS, LCDNumber1, SynthGuiCtrl::SLIDER);
+ dctrl[DCO1_WAVEFORM] = SynthGuiCtrl(Waveform, 0, SynthGuiCtrl::COMBOBOX);
+ dctrl[DCO1_FM] = SynthGuiCtrl(FMS, LCDNumber1_2, SynthGuiCtrl::SLIDER);
+ dctrl[DCO1_PWM] = SynthGuiCtrl(PWMS, LCDNumber1_3, SynthGuiCtrl::SLIDER);
+ dctrl[DCO1_ATTACK] = SynthGuiCtrl(AttackS, LCDNumber1_3_2, SynthGuiCtrl::SLIDER);
+ dctrl[DCO1_DECAY] = SynthGuiCtrl(DecayS, LCDNumber1_3_2_2, SynthGuiCtrl::SLIDER);
+ dctrl[DCO1_SUSTAIN] = SynthGuiCtrl(SustainS, LCDNumber1_3_2_3, SynthGuiCtrl::SLIDER);
+ dctrl[DCO1_RELEASE] = SynthGuiCtrl(ReleaseS, LCDNumber1_3_2_4, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2_PITCHMOD] = SynthGuiCtrl(PitchModS2, LCDNumber1_4, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2_WAVEFORM] = SynthGuiCtrl(Waveform2, 0, SynthGuiCtrl::COMBOBOX);
+ dctrl[DCO2_FM] = SynthGuiCtrl(FMS2, LCDNumber1_2_2, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2_PWM] = SynthGuiCtrl(PWMS2, LCDNumber1_3_3, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2_ATTACK] = SynthGuiCtrl(AttackS2, LCDNumber1_3_2_5, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2_DECAY] = SynthGuiCtrl(DecayS2, LCDNumber1_3_2_2_2, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2_SUSTAIN] = SynthGuiCtrl(SustainS2, LCDNumber1_3_2_3_2, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2_RELEASE] = SynthGuiCtrl(ReleaseS2, LCDNumber1_3_2_4_2, SynthGuiCtrl::SLIDER);
+ dctrl[LFO_FREQ] = SynthGuiCtrl(FreqS, LCDNumber1_5, SynthGuiCtrl::SLIDER);
+ dctrl[LFO_WAVEFORM] = SynthGuiCtrl(Waveform2_2, 0, SynthGuiCtrl::COMBOBOX);
+ dctrl[FILT_ENV_MOD] = SynthGuiCtrl(EnvModS, LCDNumber1_5_3, SynthGuiCtrl::SLIDER);
+ dctrl[FILT_KEYTRACK] = SynthGuiCtrl(KeyTrack, 0, SynthGuiCtrl::SWITCH);
+ dctrl[FILT_RES] = SynthGuiCtrl(ResS, LCDNumber1_5_5, SynthGuiCtrl::SLIDER);
+ dctrl[FILT_ATTACK] = SynthGuiCtrl(AttackS3, LCDNumber1_3_2_5_2, SynthGuiCtrl::SLIDER);
+ dctrl[FILT_DECAY] = SynthGuiCtrl(DecayS3, LCDNumber1_3_2_2_2_2, SynthGuiCtrl::SLIDER);
+ dctrl[FILT_SUSTAIN] = SynthGuiCtrl(SustainS3, LCDNumber1_3_2_3_2_2, SynthGuiCtrl::SLIDER);
+ dctrl[FILT_RELEASE] = SynthGuiCtrl(ReleaseS3, LCDNumber1_3_2_4_2_2, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2ON] = SynthGuiCtrl(DCO2On, 0, SynthGuiCtrl::SWITCH);
+ dctrl[FILT_INVERT] = SynthGuiCtrl(FilterInvert, 0, SynthGuiCtrl::SWITCH);
+ dctrl[FILT_CUTOFF] = SynthGuiCtrl(CutoffS, LCDNumber1_5_5_2, SynthGuiCtrl::SLIDER);
+ dctrl[DCO1_DETUNE] = SynthGuiCtrl(DetuneS, LCDNumber1_6, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2_DETUNE] = SynthGuiCtrl(DetuneS2, LCDNumber1_6_2, SynthGuiCtrl::SLIDER);
+ dctrl[DCO1_PW] = SynthGuiCtrl(PWS, LCDNumber1_2_3, SynthGuiCtrl::SLIDER);
+ dctrl[DCO2_PW] = SynthGuiCtrl(PWS2, LCDNumber1_2_4, SynthGuiCtrl::SLIDER);
+
+
+ map = new QSignalMapper(this);
+ for (int i = 0; i < NUM_CONTROLLER; ++i) {
+ map->setMapping(dctrl[i].editor, i);
+ if (dctrl[i].type == SynthGuiCtrl::SLIDER)
+ connect((QSlider*)(dctrl[i].editor), SIGNAL(valueChanged(int)), map, SLOT(map()));
+ else if (dctrl[i].type == SynthGuiCtrl::COMBOBOX)
+ connect((QComboBox*)(dctrl[i].editor), SIGNAL(activated(int)), map, SLOT(map()));
+ else if (dctrl[i].type == SynthGuiCtrl::SWITCH)
+ connect((QCheckBox*)(dctrl[i].editor), SIGNAL(toggled(bool)), map, SLOT(map()));
+ }
+ connect(map, SIGNAL(mapped(int)), this, SLOT(ctrlChanged(int)));
+
+ connect(presetList, SIGNAL(clicked(QListWidgetItem*)),
+ this, SLOT(presetClicked(QListWidgetItem*)));
+ // presetNameEdit
+ connect(presetSet, SIGNAL(clicked()), this, SLOT(setPreset()));
+ connect(savePresets, SIGNAL(clicked()), this, SLOT(savePresetsPressed()));
+ connect(loadPresets, SIGNAL(clicked()), this, SLOT(loadPresetsPressed()));
+ connect(deletePreset, SIGNAL(clicked()), this, SLOT(deletePresetPressed()));
+ connect(savePresetsToFile, SIGNAL(clicked()), this, SLOT(savePresetsToFilePressed()));
+
+ ctrlHi = 0;
+ ctrlLo = 0;
+ dataHi = 0;
+ dataLo = 0;
+ }
+
+//---------------------------------------------------------
+// ctrlChanged
+//---------------------------------------------------------
+
+void VAMGui::ctrlChanged(int idx)
+ {
+ SynthGuiCtrl* ctrl = &dctrl[idx];
+ int val = 0;
+ if (ctrl->type == SynthGuiCtrl::SLIDER) {
+ QSlider* slider = (QSlider*)(ctrl->editor);
+ int max = slider->maximum();
+ val = (slider->value() * 16383 + max/2) / max;
+ }
+ else if (ctrl->type == SynthGuiCtrl::COMBOBOX) {
+ val = ((QComboBox*)(ctrl->editor))->currentIndex();
+ }
+ else if (ctrl->type == SynthGuiCtrl::SWITCH) {
+ val = ((QCheckBox*)(ctrl->editor))->isChecked();
+ }
+ sendController(0, idx + CTRL_RPN14_OFFSET, val);
+ }
+
+//---------------------------------------------------------
+// presetClicked
+//---------------------------------------------------------
+
+void VAMGui::presetClicked(QListWidgetItem* item)
+{
+ if (item == 0)
+ return;
+ presetNameEdit->setText(item->text());
+ Preset* preset = 0;
+ for (iPreset i = presets.begin(); i != presets.end(); ++i) {
+ if (i->name == item->text()) {
+ preset = &*i;
+ break;
+ }
+ }
+ activatePreset(preset);
+}
+
+//---------------------------------------------------------
+// setPreset
+//---------------------------------------------------------
+
+void VAMGui::activatePreset(Preset* preset)
+{
+ if (preset == 0) {
+ fprintf(stderr, "internal error 1\n");
+ exit(-1);
+ }
+ for (unsigned int i = 0; i < sizeof(dctrl)/sizeof(*dctrl); ++i) {
+ setParam(i, preset->ctrl[i]);
+ ctrlChanged(i);
+ }
+}
+
+//---------------------------------------------------------
+// setPreset
+//---------------------------------------------------------
+
+void VAMGui::setPreset()
+{
+ if (presetNameEdit->text().isEmpty())
+ return;
+ for (iPreset i = presets.begin(); i != presets.end(); ++i) {
+ if (i->name == presetNameEdit->text()) {
+ setPreset(&*i);
+ return;
+ }
+ }
+ addNewPreset(presetNameEdit->text());
+}
+
+//---------------------------------------------------------
+// addNewPreset
+//---------------------------------------------------------
+
+void VAMGui::addNewPreset(const QString& name)
+{
+ Preset p;
+ p.name = name;
+ setPreset(&p);
+ presets.push_back(p);
+ presetList->addItem(name);
+}
+
+//---------------------------------------------------------
+// deleteNamedPreset
+//---------------------------------------------------------
+void VAMGui::deleteNamedPreset(const QString& name)
+{
+ QListWidgetItem * item = presetList->findItems(name,Qt::MatchExactly).at(0);
+ if (!item) {
+ fprintf(stderr, "%s: Could not find preset!\n", __FUNCTION__);
+ return;
+ }
+ presetList->clearSelection();
+ delete item;
+// int index = presetList->row(item);
+// presetList->removeItem(index);
+ for (iPreset i = presets.begin(); i != presets.end(); ++i) {
+ if (i->name == name) {
+ presets.erase(i);
+ break;
+ }
+ }
+}
+
+
+//---------------------------------------------------------
+// setPreset
+//---------------------------------------------------------
+
+void VAMGui::setPreset(Preset* preset)
+{
+ for (unsigned int i = 0; i < NUM_CONTROLLER; ++i) {
+ int val = 0;
+ SynthGuiCtrl* ctrl = &dctrl[i];
+ if (ctrl->type == SynthGuiCtrl::SLIDER) {
+ QSlider* slider = (QSlider*)(ctrl->editor);
+ int max = slider->maximum();
+ val = (slider->value() * 16383 + max/2) / max;
+ }
+ else if (ctrl->type == SynthGuiCtrl::COMBOBOX) {
+ val = ((QComboBox*)(ctrl->editor))->currentIndex();
+ }
+ else if (ctrl->type == SynthGuiCtrl::SWITCH) {
+ val = ((QCheckBox*)(ctrl->editor))->isChecked();
+ }
+
+ preset->ctrl[i] = val;
+ }
+ //
+ // send sysex to synti
+ //
+#if 0
+ putchar(0xf0);
+ putchar(0x7c); // mess
+ putchar(0x2); // vam
+ putchar(0x3); // setPreset
+ const char* name = preset->name.toLatin1().data();
+ while (*name)
+ putchar(*name++ & 0x7f);
+ putchar(0);
+ for (int i = 0; i < NUM_CONTROLLER; ++i) {
+ putchar(i);
+ putchar(preset->ctrl[i]);
+ }
+ putchar(0xf7);
+#endif
+}
+
+//---------------------------------------------------------
+// setParam
+// set param in gui
+// val -- midi value 0 - 16383
+//---------------------------------------------------------
+
+void VAMGui::setParam(int param, int val)
+ {
+ if (param >= int(sizeof(dctrl)/sizeof(*dctrl))) {
+ fprintf(stderr, "vam: set unknown parameter 0x%x to 0x%x\n", param, val);
+ return;
+ }
+ SynthGuiCtrl* ctrl = &dctrl[param];
+ ctrl->editor->blockSignals(true);
+ if (ctrl->type == SynthGuiCtrl::SLIDER) {
+ QSlider* slider = (QSlider*)(ctrl->editor);
+ int max = slider->maximum();
+ if(val < 0) val = (val * max + 8191) / 16383 - 1;
+ else val = (val * max + 8191) / 16383;
+
+ slider->setValue(val);
+ if (ctrl->label)
+ ((QLCDNumber*)(ctrl->label))->display(val);
+ }
+ else if (ctrl->type == SynthGuiCtrl::COMBOBOX) {
+ ((QComboBox*)(ctrl->editor))->setCurrentIndex(val);
+ }
+ else if (ctrl->type == SynthGuiCtrl::SWITCH) {
+ ((QCheckBox*)(ctrl->editor))->setChecked(val);
+ }
+ ctrl->editor->blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// sysexReceived
+//---------------------------------------------------------
+
+void VAMGui::sysexReceived(const unsigned char* data, int len)
+{
+ if (len >= 4) {
+ //---------------------------------------------
+ // MusE Soft Synth
+ //---------------------------------------------
+
+ if (data[0] == 0x7c) {
+ if (data[1] == 2) { // vam
+ if (data[2] == 2) { // parameter response
+ if (len != 6) {
+ fprintf(stderr, "vam gui: bad sysEx len\n");
+ return;
+ }
+ int val = data[4] + (data[5]<<7);
+ switch(data[3])
+ {
+ case DCO1_PITCHMOD:
+ case DCO2_PITCHMOD:
+ case DCO1_DETUNE:
+ case DCO2_DETUNE:
+ setParam(data[3], ((val + 1) * 2) - 16383);
+ break;
+ default:
+ setParam(data[3], val);
+ break;
+ }
+ return;
+ }
+ else if (data[2] == 1) { // param request
+ return;
+ }
+ }
+ }
+ }
+ fprintf(stderr, "vam gui: unknown sysex received, len %d:\n", len);
+ for (int i = 0; i < len; ++i)
+ fprintf(stderr, "%02x ", data[i]);
+ fprintf(stderr, "\n");
+}
+
+//---------------------------------------------------------
+// processEvent
+//---------------------------------------------------------
+
+void VAMGui::processEvent(const MidiEvent& ev)
+ {
+ if (ev.type() == ME_CONTROLLER)
+ setParam(ev.dataA() & 0xfff, ev.dataB());
+ else if (ev.type() == ME_SYSEX)
+ sysexReceived(ev.data(), ev.len())
+ ;
+ else
+ printf("VAMGui::illegal event type received\n");
+ }
+
+//---------------------------------------------------------
+// loadPresetsPressed
+//---------------------------------------------------------
+
+void VAMGui::loadPresetsPressed()
+{
+#if 0 // TODO
+ QString iname;
+ QString s(getenv("HOME"));
+ QString fn = getOpenFileName(s, presetFileTypes, this,
+ tr("MusE: Load VAM Presets"), 0);
+ if (fn.isEmpty())
+ return;
+ bool popenFlag;
+ FILE* f = fileOpen(this, fn, QString(".pre"), "r", popenFlag, true);
+ if (f == 0)
+ return;
+ presets.clear();
+ presetList->clear();
+
+ Xml xml(f);
+ int mode = 0;
+ for (;;) {
+ Xml::Token token = xml.parse();
+ QString tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ if (mode == 0 && tag == "muse")
+ mode = 1;
+// else if (mode == 1 && tag == "instrument")
+// mode = 2;
+
+ else if (mode == 2 && tag == "preset") {
+ Preset preset;
+ preset.readConfiguration(xml);
+ presets.push_back(preset);
+ presetList->insertItem(preset.name);
+ }
+ else if(mode != 1)
+ xml.unknown("SynthPreset");
+ break;
+ case Xml::Attribut:
+ if(mode == 1 && tag == "iname") {
+// fprintf(stderr, "%s\n", xml.s2().toLatin1().data());
+ if(xml.s2() != "vam-1.0")
+ return;
+ else mode = 2;
+ }
+ break;
+ case Xml::TagEnd:
+ if (tag == "muse")
+ goto ende;
+ default:
+ break;
+ }
+ }
+ende:
+ if (popenFlag)
+ pclose(f);
+ else
+ fclose(f);
+
+ if (presetFileName) delete presetFileName;
+ presetFileName = new QString(fn);
+ QString dots ("...");
+ fileName->setText(fn.right(32).insert(0, dots));
+
+ if (presets.empty())
+ return;
+ Preset preset = presets.front();
+ activatePreset(&preset);
+#endif
+}
+
+//---------------------------------------------------------
+// doSavePresets
+//---------------------------------------------------------
+void VAMGui::doSavePresets(const QString& /*fn*/, bool /*showWarning*/)
+{
+#if 0
+ bool popenFlag;
+ FILE* f = fileOpen(this, fn, QString(".pre"), "w", popenFlag, false, showWarning);
+ if (f == 0)
+ return;
+ Xml xml(f);
+ xml.header();
+ xml.tag(0, "muse version=\"1.0\"");
+ xml.tag(0, "instrument iname=\"vam-1.0\" /");
+
+ for (iPreset i = presets.begin(); i != presets.end(); ++i)
+ i->writeConfiguration(xml, 1);
+
+ xml.tag(1, "/muse");
+
+ if (popenFlag)
+ pclose(f);
+ else
+ fclose(f);
+#endif
+}
+
+//---------------------------------------------------------
+// savePresetsPressed
+//---------------------------------------------------------
+
+void VAMGui::savePresetsPressed()
+{
+#if 0 // TODO
+ QString s(getenv("MUSE"));
+ QString fn = getSaveFileName(s, presetFileTypes, this,
+ tr("MusE: Save VAM Presets"));
+ if (fn.isEmpty())
+ return;
+ doSavePresets (fn, true);
+#endif
+}
+
+
+//---------------------------------------------------------
+// savePresetsToFilePressed
+//---------------------------------------------------------
+
+void VAMGui::savePresetsToFilePressed()
+{
+ if (!presetFileName) return;
+ doSavePresets (*presetFileName, false);
+}
+
+//---------------------------------------------------------
+// deletePresetPressed
+//---------------------------------------------------------
+
+void VAMGui::deletePresetPressed()
+{
+ deleteNamedPreset (presetList->currentItem()->text());
+}
+
+//---------------------------------------------------------
+// readMessage
+//---------------------------------------------------------
+
+void VAMGui::readMessage(int)
+ {
+ MessGui::readMessage();
+ }
+
diff --git a/muse/synti/vam/vamgui.h b/muse/synti/vam/vamgui.h
new file mode 100644
index 00000000..4ee02681
--- /dev/null
+++ b/muse/synti/vam/vamgui.h
@@ -0,0 +1,77 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// vamgui.h
+//
+// (C) Copyright 2002 Jotsif Lindman Hörnlund (jotsif@linux.nu)
+//
+// 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 2
+// 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, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA or point your web browser to http://www.gnu.org.
+//=========================================================
+
+#ifndef __VAMGUI_H
+#define __VAMGUI_H
+
+#include "ui_vamgui.h"
+#include "vam.h"
+#include "libsynti/gui.h"
+
+class Preset;
+
+//---------------------------------------------------------
+// VAMGui
+//---------------------------------------------------------
+
+class VAMGui : public QWidget, public Ui::VAMGuiBase, public MessGui {
+ QSignalMapper* map;
+ int ctrlHi;
+ int ctrlLo;
+ int dataHi;
+ int dataLo;
+ SynthGuiCtrl dctrl[NUM_CONTROLLER];
+ QString * presetFileName;
+
+ Q_OBJECT
+ void sendControllerChange(int ctrl, int val);
+ void initParameter();
+ void setParam(int, int);
+ void setPreset(Preset* preset);
+ void addNewPreset(const QString&);
+ void deleteNamedPreset(const QString&);
+ void activatePreset(Preset* preset);
+ virtual void processEvent(const MidiEvent&);
+
+ private slots:
+ void ctrlChanged(int idx);
+
+ void presetClicked(QListWidgetItem*);
+ void setPreset();
+ void loadPresetsPressed();
+ void savePresetsPressed();
+ void deletePresetPressed();
+ void doSavePresets(const QString&, bool);
+ void savePresetsToFilePressed();
+ void readMessage(int);
+
+ protected:
+ virtual void sysexReceived(const unsigned char*, int);
+
+ public:
+ VAMGui();
+ };
+
+#endif /* __VAMGUI_H */
+
+
diff --git a/muse/synti/vam/vamgui.ui b/muse/synti/vam/vamgui.ui
new file mode 100644
index 00000000..7b849a58
--- /dev/null
+++ b/muse/synti/vam/vamgui.ui
@@ -0,0 +1,1535 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>VAMGuiBase</class>
+ <widget class="QWidget" name="VAMGuiBase" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>744</width>
+ <height>523</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>Virtual Analogue for MusE</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QGroupBox" name="GroupBox11" >
+ <property name="title" >
+ <string>LFO</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="TextLabel3_5" >
+ <property name="text" >
+ <string>Freq</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="FreqS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLCDNumber" name="LCDNumber1_5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="TextLabel1_2_2" >
+ <property name="text" >
+ <string>Waveform</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="Waveform2_2" >
+ <item>
+ <property name="text" >
+ <string>Sine</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pulse</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Saw</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Triangle</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QGroupBox" name="GroupBox12" >
+ <property name="title" >
+ <string>Filter</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel3_5_3" >
+ <property name="text" >
+ <string>EnvMod</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4" >
+ <widget class="QLabel" name="TextLabel3_3_2_5_2" >
+ <property name="text" >
+ <string>Attack</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4" >
+ <widget class="QLabel" name="TextLabel3_3_2_2_2_2" >
+ <property name="text" >
+ <string>Decay</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4" >
+ <widget class="QLabel" name="TextLabel3_3_2_3_2_2" >
+ <property name="text" >
+ <string>Sustain</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4" >
+ <widget class="QLabel" name="TextLabel3_3_2_4_2_2" >
+ <property name="text" >
+ <string>Release</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_5_3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="6" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_5_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="6" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_2_2_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="6" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_3_2_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="6" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_4_2_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_5_5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="TextLabel1_3" >
+ <property name="text" >
+ <string>Cutoff</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel3_5_5" >
+ <property name="text" >
+ <string>Resonance</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <widget class="QCheckBox" name="FilterInvert" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Invert</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" colspan="2" >
+ <widget class="QCheckBox" name="KeyTrack" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>KeyTrack</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_5_5_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QSlider" name="EnvModS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2" >
+ <widget class="QSlider" name="ResS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2" >
+ <widget class="QSlider" name="CutoffS" >
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickInterval" >
+ <number>25</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5" >
+ <widget class="QSlider" name="AttackS3" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="5" >
+ <widget class="QSlider" name="DecayS3" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="5" >
+ <widget class="QSlider" name="SustainS3" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="5" >
+ <widget class="QSlider" name="ReleaseS3" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QGroupBox" name="GroupBox5_3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>200</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="title" >
+ <string>Presets</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QListWidget" name="presetList" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="fileName" >
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLineEdit" name="presetNameEdit" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="presetSet" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string/>
+ </property>
+ <property name="text" >
+ <string>Set</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="loadPresets" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>load preset list</string>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>image0</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="savePresetsToFile" >
+ <property name="toolTip" >
+ <string>save preset list</string>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>image1</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="savePresets" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip" >
+ <string>save preset list to a new file</string>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>image2</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="deletePreset" >
+ <property name="toolTip" >
+ <string>delete preset</string>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset>image3</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="GroupBox5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>DCO 1</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>Pitch</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QLCDNumber" name="LCDNumber1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="TextLabel1_4" >
+ <property name="text" >
+ <string>Detune</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QLCDNumber" name="LCDNumber1_6" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSlider" name="DetuneS" >
+ <property name="minimum" >
+ <number>-50</number>
+ </property>
+ <property name="maximum" >
+ <number>50</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSlider" name="PitchModS" >
+ <property name="minimumSize" >
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="minimum" >
+ <number>-24</number>
+ </property>
+ <property name="maximum" >
+ <number>24</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="2" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2" >
+ <widget class="QLCDNumber" name="LCDNumber1_3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLabel" name="TextLabel3_3" >
+ <property name="text" >
+ <string>PWM</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0" >
+ <widget class="QLabel" name="TextLabel3_3_2_2" >
+ <property name="text" >
+ <string>Decay</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="2" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="2" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0" >
+ <widget class="QLabel" name="TextLabel3_3_2_3" >
+ <property name="text" >
+ <string>Sustain</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0" >
+ <widget class="QLabel" name="TextLabel3_3_2_4" >
+ <property name="text" >
+ <string>Release</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" >
+ <widget class="QLabel" name="TextLabel3_3_2" >
+ <property name="text" >
+ <string>Attack</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="TextLabel3_2" >
+ <property name="text" >
+ <string>FM</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QLCDNumber" name="LCDNumber1_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="TextLabel3_2_3" >
+ <property name="text" >
+ <string>PW</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2" >
+ <widget class="QLCDNumber" name="LCDNumber1_2_3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSlider" name="FMS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <widget class="QSlider" name="PWS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" >
+ <widget class="QSlider" name="PWMS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1" >
+ <widget class="QSlider" name="AttackS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1" >
+ <widget class="QSlider" name="DecayS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1" >
+ <widget class="QSlider" name="SustainS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="1" >
+ <widget class="QSlider" name="ReleaseS" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>Waveform</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2" >
+ <widget class="QComboBox" name="Waveform" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <item>
+ <property name="text" >
+ <string>Sine</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pulse</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Saw</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Triangle</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QGroupBox" name="GroupBox5_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>DCO 2</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item row="1" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2" >
+ <widget class="QSlider" name="PitchModS2" >
+ <property name="minimumSize" >
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="minimum" >
+ <number>-24</number>
+ </property>
+ <property name="maximum" >
+ <number>24</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="TextLabel3_2_2" >
+ <property name="text" >
+ <string>FM</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_2_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="TextLabel1_4_2" >
+ <property name="text" >
+ <string>Detune</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_6_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="TextLabel3_4" >
+ <property name="text" >
+ <string>Pitch</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2" >
+ <widget class="QSlider" name="DetuneS2" >
+ <property name="minimum" >
+ <number>-50</number>
+ </property>
+ <property name="maximum" >
+ <number>50</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel1_2" >
+ <property name="text" >
+ <string>Waveform</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QComboBox" name="Waveform2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <item>
+ <property name="text" >
+ <string>Sine</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pulse</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Saw</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Triangle</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="9" column="0" >
+ <widget class="QLabel" name="TextLabel3_3_2_4_2" >
+ <property name="text" >
+ <string>Release</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLabel" name="TextLabel3_3_3" >
+ <property name="text" >
+ <string>PWM</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" >
+ <widget class="QLabel" name="TextLabel3_3_2_5" >
+ <property name="text" >
+ <string>Attack</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_3_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_2_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0" >
+ <widget class="QLabel" name="TextLabel3_3_2_2_2" >
+ <property name="text" >
+ <string>Decay</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_2_4_2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_3_3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0" >
+ <widget class="QLabel" name="TextLabel3_3_2_3_2" >
+ <property name="text" >
+ <string>Sustain</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3" >
+ <widget class="QLCDNumber" name="LCDNumber1_2_4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits" >
+ <number>3</number>
+ </property>
+ <property name="segmentStyle" >
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="TextLabel3_2_4" >
+ <property name="text" >
+ <string>PW</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" colspan="2" >
+ <widget class="QCheckBox" name="DCO2On" >
+ <property name="text" >
+ <string>On</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" colspan="2" >
+ <widget class="QSlider" name="FMS2" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" colspan="2" >
+ <widget class="QSlider" name="PWS2" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" colspan="2" >
+ <widget class="QSlider" name="PWMS2" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1" colspan="2" >
+ <widget class="QSlider" name="AttackS2" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1" colspan="2" >
+ <widget class="QSlider" name="DecayS2" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1" colspan="2" >
+ <widget class="QSlider" name="SustainS2" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="1" colspan="2" >
+ <widget class="QSlider" name="ReleaseS2" >
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="maximum" >
+ <number>255</number>
+ </property>
+ <property name="pageStep" >
+ <number>1</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item rowspan="2" row="1" column="2" >
+ <widget class="QLabel" name="TextLabel1_5" >
+ <property name="text" >
+ <string>VAM 1.0beta2
+Virtual Analog for MusE
+Released under GPL.
+Copyright(C) 2002
+Jotsif Lindman Hörnlund
+( jotsif@linux.nu )</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>